[epiphany/mcatanzaro/pdfjs-2.9.359: 2/2] Update to PDF.js 2.10.377




commit 9f8444f591c96476b87acac289a6f7ec8fee5c70
Author: Michael Catanzaro <mcatanzaro redhat com>
Date:   Wed Jun 9 10:03:48 2021 -0500

    Update to PDF.js 2.10.377
    
    This requires exempting ephy-resource:// from CORS, so that pdf.js can
    load its icons. Accordingly, some new smarts are added to the
    ephy-resource:// handler to manually verify that source of requests is
    acceptable, as far as practical. There's no longer any way to prevent
    websites from accessing the error page stuff anymore, but the rest can
    still be restricted.

 meson.build                                        |     2 +-
 third-party/pdfjs/README.epiphany.md               |    10 +-
 third-party/pdfjs/build/pdf.js                     | 10198 ++-
 third-party/pdfjs/build/pdf.sandbox.js             |   309 +
 third-party/pdfjs/build/pdf.worker.js              | 90305 ++++++++++++-------
 third-party/pdfjs/epiphany-pdfjs-changes.patch     |   206 +-
 third-party/pdfjs/pdfjs.gresource.xml              |   596 +-
 third-party/pdfjs/web/debugger.js                  |   339 +-
 .../pdfjs/web/images/findbarButton-next-dark.svg   |     6 -
 .../web/images/findbarButton-previous-dark.svg     |     5 -
 ...ondaryToolbarButton-documentProperties-dark.svg |    16 -
 .../secondaryToolbarButton-firstPage-dark.svg      |     2 -
 .../secondaryToolbarButton-handTool-dark.svg       |     2 -
 .../secondaryToolbarButton-lastPage-dark.svg       |     2 -
 .../secondaryToolbarButton-rotateCcw-dark.svg      |     2 -
 .../secondaryToolbarButton-rotateCw-dark.svg       |     5 -
 ...econdaryToolbarButton-scrollHorizontal-dark.svg |     2 -
 .../secondaryToolbarButton-scrollVertical-dark.svg |     2 -
 .../secondaryToolbarButton-scrollWrapped-dark.svg  |     2 -
 .../secondaryToolbarButton-selectTool-dark.svg     |     5 -
 .../secondaryToolbarButton-spreadEven-dark.svg     |     2 -
 .../secondaryToolbarButton-spreadNone-dark.svg     |     2 -
 .../secondaryToolbarButton-spreadOdd-dark.svg      |     2 -
 .../web/images/toolbarButton-bookmark-dark.svg     |     2 -
 .../images/toolbarButton-currentOutlineItem.svg    |     1 +
 .../web/images/toolbarButton-download-dark.svg     |     5 -
 .../web/images/toolbarButton-menuArrow-dark.svg    |     1 -
 .../web/images/toolbarButton-openFile-dark.svg     |     5 -
 .../web/images/toolbarButton-pageDown-dark.svg     |     8 -
 .../pdfjs/web/images/toolbarButton-pageUp-dark.svg |    13 -
 .../images/toolbarButton-presentationMode-dark.svg |     2 -
 .../pdfjs/web/images/toolbarButton-print-dark.svg  |     5 -
 .../pdfjs/web/images/toolbarButton-search-dark.svg |     5 -
 .../toolbarButton-secondaryToolbarToggle-dark.svg  |     5 -
 .../images/toolbarButton-sidebarToggle-dark.svg    |     5 -
 .../images/toolbarButton-viewAttachments-dark.svg  |     2 -
 .../web/images/toolbarButton-viewLayers-dark.svg   |     1 -
 .../web/images/toolbarButton-viewOutline-dark.svg  |     2 -
 .../images/toolbarButton-viewThumbnail-dark.svg    |     5 -
 .../pdfjs/web/images/toolbarButton-zoomIn-dark.svg |     5 -
 .../web/images/toolbarButton-zoomOut-dark.svg      |     5 -
 .../pdfjs/web/images/treeitem-collapsed-dark.svg   |     2 -
 .../pdfjs/web/images/treeitem-expanded-dark.svg    |     2 -
 third-party/pdfjs/web/locale/ach/viewer.properties |     1 +
 third-party/pdfjs/web/locale/af/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/an/viewer.properties  |    72 +-
 third-party/pdfjs/web/locale/ar/viewer.properties  |    24 +-
 third-party/pdfjs/web/locale/ast/viewer.properties |   137 +-
 third-party/pdfjs/web/locale/az/viewer.properties  |    10 +-
 third-party/pdfjs/web/locale/be/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/bg/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/bn/viewer.properties  |     2 +
 third-party/pdfjs/web/locale/bo/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/br/viewer.properties  |    50 +-
 third-party/pdfjs/web/locale/brx/viewer.properties |     1 +
 third-party/pdfjs/web/locale/bs/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/ca/viewer.properties  |    18 +-
 third-party/pdfjs/web/locale/cak/viewer.properties |    12 +
 third-party/pdfjs/web/locale/ckb/viewer.properties |   140 +-
 third-party/pdfjs/web/locale/cs/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/cy/viewer.properties  |    28 +-
 third-party/pdfjs/web/locale/da/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/de/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/dsb/viewer.properties |    12 +
 third-party/pdfjs/web/locale/el/viewer.properties  |    24 +-
 .../pdfjs/web/locale/en-CA/viewer.properties       |    18 +-
 .../pdfjs/web/locale/en-GB/viewer.properties       |    12 +
 .../pdfjs/web/locale/en-US/viewer.properties       |    12 +-
 third-party/pdfjs/web/locale/eo/viewer.properties  |    12 +
 .../pdfjs/web/locale/es-AR/viewer.properties       |    12 +
 .../pdfjs/web/locale/es-CL/viewer.properties       |    12 +
 .../pdfjs/web/locale/es-ES/viewer.properties       |    12 +
 .../pdfjs/web/locale/es-MX/viewer.properties       |    12 +
 third-party/pdfjs/web/locale/et/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/eu/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/fa/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/ff/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/fi/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/fr/viewer.properties  |    12 +
 .../pdfjs/web/locale/fy-NL/viewer.properties       |    14 +-
 .../pdfjs/web/locale/ga-IE/viewer.properties       |     1 +
 third-party/pdfjs/web/locale/gd/viewer.properties  |    20 +-
 third-party/pdfjs/web/locale/gl/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/gn/viewer.properties  |    12 +
 .../pdfjs/web/locale/gu-IN/viewer.properties       |     1 +
 third-party/pdfjs/web/locale/he/viewer.properties  |    20 +-
 .../pdfjs/web/locale/hi-IN/viewer.properties       |     2 +
 third-party/pdfjs/web/locale/hr/viewer.properties  |    22 +-
 third-party/pdfjs/web/locale/hsb/viewer.properties |    12 +
 third-party/pdfjs/web/locale/hu/viewer.properties  |    12 +
 .../pdfjs/web/locale/hy-AM/viewer.properties       |     2 +
 third-party/pdfjs/web/locale/hye/viewer.properties |    11 +-
 third-party/pdfjs/web/locale/ia/viewer.properties  |    14 +-
 third-party/pdfjs/web/locale/id/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/is/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/it/viewer.properties  |    10 +
 third-party/pdfjs/web/locale/ja/viewer.properties  |    16 +-
 third-party/pdfjs/web/locale/ka/viewer.properties  |    28 +-
 third-party/pdfjs/web/locale/kab/viewer.properties |    16 +-
 third-party/pdfjs/web/locale/kk/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/km/viewer.properties  |    34 +
 third-party/pdfjs/web/locale/kn/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/ko/viewer.properties  |    32 +-
 third-party/pdfjs/web/locale/lij/viewer.properties |     1 +
 third-party/pdfjs/web/locale/lo/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/locale.properties     |     6 +
 third-party/pdfjs/web/locale/lt/viewer.properties  |    24 +-
 third-party/pdfjs/web/locale/ltg/viewer.properties |     1 +
 third-party/pdfjs/web/locale/lv/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/mk/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/mr/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/ms/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/my/viewer.properties  |     1 +
 .../pdfjs/web/locale/nb-NO/viewer.properties       |    12 +
 .../pdfjs/web/locale/ne-NP/viewer.properties       |     1 +
 third-party/pdfjs/web/locale/nl/viewer.properties  |    14 +-
 .../pdfjs/web/locale/nn-NO/viewer.properties       |    12 +
 third-party/pdfjs/web/locale/oc/viewer.properties  |    42 +-
 .../pdfjs/web/locale/pa-IN/viewer.properties       |    18 +-
 third-party/pdfjs/web/locale/pl/viewer.properties  |    12 +
 .../pdfjs/web/locale/pt-BR/viewer.properties       |    42 +-
 .../pdfjs/web/locale/pt-PT/viewer.properties       |    12 +
 third-party/pdfjs/web/locale/rm/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/ro/viewer.properties  |     2 +
 third-party/pdfjs/web/locale/ru/viewer.properties  |    14 +-
 third-party/pdfjs/web/locale/sco/viewer.properties |   259 +
 third-party/pdfjs/web/locale/si/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/sk/viewer.properties  |    18 +-
 third-party/pdfjs/web/locale/sl/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/son/viewer.properties |     1 +
 third-party/pdfjs/web/locale/sq/viewer.properties  |     6 +
 third-party/pdfjs/web/locale/sr/viewer.properties  |    26 +-
 .../pdfjs/web/locale/sv-SE/viewer.properties       |    15 +-
 third-party/pdfjs/web/locale/szl/viewer.properties |    14 +-
 third-party/pdfjs/web/locale/ta/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/te/viewer.properties  |     6 +
 third-party/pdfjs/web/locale/tg/viewer.properties  |   142 +
 third-party/pdfjs/web/locale/th/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/tl/viewer.properties  |   144 +-
 third-party/pdfjs/web/locale/tr/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/uk/viewer.properties  |    14 +-
 third-party/pdfjs/web/locale/ur/viewer.properties  |     7 +
 third-party/pdfjs/web/locale/uz/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/vi/viewer.properties  |    12 +
 third-party/pdfjs/web/locale/wo/viewer.properties  |     1 +
 third-party/pdfjs/web/locale/xh/viewer.properties  |     1 +
 .../pdfjs/web/locale/zh-CN/viewer.properties       |    16 +-
 .../pdfjs/web/locale/zh-TW/viewer.properties       |    14 +-
 .../pdfjs/web/standard_fonts/FoxitDingbats.pfb     |   Bin 0 -> 29513 bytes
 .../pdfjs/web/standard_fonts/FoxitFixed.pfb        |   Bin 0 -> 17597 bytes
 .../pdfjs/web/standard_fonts/FoxitFixedBold.pfb    |   Bin 0 -> 18055 bytes
 .../web/standard_fonts/FoxitFixedBoldItalic.pfb    |   Bin 0 -> 19151 bytes
 .../pdfjs/web/standard_fonts/FoxitFixedItalic.pfb  |   Bin 0 -> 18746 bytes
 third-party/pdfjs/web/standard_fonts/FoxitSans.pfb |   Bin 0 -> 15025 bytes
 .../pdfjs/web/standard_fonts/FoxitSansBold.pfb     |   Bin 0 -> 16344 bytes
 .../web/standard_fonts/FoxitSansBoldItalic.pfb     |   Bin 0 -> 16418 bytes
 .../pdfjs/web/standard_fonts/FoxitSansItalic.pfb   |   Bin 0 -> 16339 bytes
 .../pdfjs/web/standard_fonts/FoxitSerif.pfb        |   Bin 0 -> 19469 bytes
 .../pdfjs/web/standard_fonts/FoxitSerifBold.pfb    |   Bin 0 -> 19395 bytes
 .../web/standard_fonts/FoxitSerifBoldItalic.pfb    |   Bin 0 -> 20733 bytes
 .../pdfjs/web/standard_fonts/FoxitSerifItalic.pfb  |   Bin 0 -> 21227 bytes
 .../pdfjs/web/standard_fonts/FoxitSymbol.pfb       |   Bin 0 -> 16729 bytes
 third-party/pdfjs/web/standard_fonts/LICENSE_FOXIT |    27 +
 .../pdfjs/web/standard_fonts/LICENSE_LIBERATION    |   102 +
 .../web/standard_fonts/LiberationSans-Bold.ttf     |   Bin 0 -> 137052 bytes
 .../standard_fonts/LiberationSans-BoldItalic.ttf   |   Bin 0 -> 135124 bytes
 .../web/standard_fonts/LiberationSans-Italic.ttf   |   Bin 0 -> 162036 bytes
 .../web/standard_fonts/LiberationSans-Regular.ttf  |   Bin 0 -> 139512 bytes
 third-party/pdfjs/web/viewer.css                   |  2791 +-
 third-party/pdfjs/web/viewer.html                  |    61 +-
 third-party/pdfjs/web/viewer.js                    | 10400 ++-
 171 files changed, 72230 insertions(+), 45261 deletions(-)
---
diff --git a/meson.build b/meson.build
index 7b8da1725..08789d894 100644
--- a/meson.build
+++ b/meson.build
@@ -75,7 +75,7 @@ conf.set10('ENABLE_GSB', gsb_api_key != '')
 glib_requirement = '>= 2.67.1'
 gtk_requirement = '>= 3.24.0'
 nettle_requirement = '>= 3.4'
-webkitgtk_requirement = '>= 2.33.1'
+webkitgtk_requirement = '>= 2.33.2'
 
 cairo_dep = dependency('cairo', version: '>= 1.2')
 gcr_dep = dependency('gcr-3', version: '>= 3.5.5')
diff --git a/third-party/pdfjs/README.epiphany.md b/third-party/pdfjs/README.epiphany.md
index 81070302a..70be46998 100644
--- a/third-party/pdfjs/README.epiphany.md
+++ b/third-party/pdfjs/README.epiphany.md
@@ -3,10 +3,12 @@
 This directory contains an official pdf.js release version, distributed at: https://github.com/mozilla/pdf.js
 
 ## Update process
-Grab a new official release (*-dist.zip) distributed at github and extract everything except 
viewer.[html/js/css] and map files into this directory.
-Then recreate the resource xml file with `python ./pdfjs_generate_resource.py`
-
-The additional files within this directory are modified for Epiphany and shouldn't be changed automatically.
+1. Delete existing files except epiphany-pdfjs-changes.patch, pdfjs_generate_resource.py, and 
README.epiphany.md.
+2. Grab a new official release (*-dist.zip) distributed at github and extract everything into this directory.
+3. Delete precompiled .map files (viewer.js.map, pdf.js.map, pdf.worker.js.map, pdf.sandbox.js.map).
+4. Manually merge changes from epiphany-pdfjs-changes.patch into web/viewer.[html/js/css].
+5. Recreate epiphany-pdfjs-changes.patch.
+6. Recreate the resource xml file with `./pdfjs_generate_resource.py`
 
 ## Modifications to viewer.html
 1. In order to circumvent CORS the pdf is downloaded and then embedded into the viewer.html file. Therefore 
the head has an
diff --git a/third-party/pdfjs/build/pdf.js b/third-party/pdfjs/build/pdf.js
index 8d59e6dd9..fde8904fc 100644
--- a/third-party/pdfjs/build/pdf.js
+++ b/third-party/pdfjs/build/pdf.js
@@ -2,7 +2,7 @@
  * @licstart The following is the entire license notice for the
  * Javascript code in this page
  *
- * Copyright 2020 Mozilla Foundation
+ * Copyright 2021 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,552 +30,128 @@
        else
                root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory();
 })(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/       // The module cache
-/******/       var installedModules = {};
-/******/
-/******/       // The require function
-/******/       function __w_pdfjs_require__(moduleId) {
-/******/
-/******/               // Check if module is in cache
-/******/               if(installedModules[moduleId]) {
-/******/                       return installedModules[moduleId].exports;
-/******/               }
-/******/               // Create a new module (and put it into the cache)
-/******/               var module = installedModules[moduleId] = {
-/******/                       i: moduleId,
-/******/                       l: false,
-/******/                       exports: {}
-/******/               };
-/******/
-/******/               // Execute the module function
-/******/               modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
-/******/
-/******/               // Flag the module as loaded
-/******/               module.l = true;
-/******/
-/******/               // Return the exports of the module
-/******/               return module.exports;
-/******/       }
-/******/
-/******/
-/******/       // expose the modules object (__webpack_modules__)
-/******/       __w_pdfjs_require__.m = modules;
-/******/
-/******/       // expose the module cache
-/******/       __w_pdfjs_require__.c = installedModules;
-/******/
-/******/       // define getter function for harmony exports
-/******/       __w_pdfjs_require__.d = function(exports, name, getter) {
-/******/               if(!__w_pdfjs_require__.o(exports, name)) {
-/******/                       Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/               }
-/******/       };
-/******/
-/******/       // define __esModule on exports
-/******/       __w_pdfjs_require__.r = function(exports) {
-/******/               if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/                       Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/               }
-/******/               Object.defineProperty(exports, '__esModule', { value: true });
-/******/       };
-/******/
-/******/       // create a fake namespace object
-/******/       // mode & 1: value is a module id, require it
-/******/       // mode & 2: merge all properties of value into the ns
-/******/       // mode & 4: return value when already ns object
-/******/       // mode & 8|1: behave like require
-/******/       __w_pdfjs_require__.t = function(value, mode) {
-/******/               if(mode & 1) value = __w_pdfjs_require__(value);
-/******/               if(mode & 8) return value;
-/******/               if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/               var ns = Object.create(null);
-/******/               __w_pdfjs_require__.r(ns);
-/******/               Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/               if(mode & 2 && typeof value != 'string') for(var key in value) 
__w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/               return ns;
-/******/       };
-/******/
-/******/       // getDefaultExport function for compatibility with non-harmony modules
-/******/       __w_pdfjs_require__.n = function(module) {
-/******/               var getter = module && module.__esModule ?
-/******/                       function getDefault() { return module['default']; } :
-/******/                       function getModuleExports() { return module; };
-/******/               __w_pdfjs_require__.d(getter, 'a', getter);
-/******/               return getter;
-/******/       };
-/******/
-/******/       // Object.prototype.hasOwnProperty.call
-/******/       __w_pdfjs_require__.o = function(object, property) { return 
Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/       // __webpack_public_path__
-/******/       __w_pdfjs_require__.p = "";
-/******/
-/******/
-/******/       // Load entry module and return exports
-/******/       return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+return /******/ (() => { // webpackBootstrap
+/******/       "use strict";
+/******/       var __webpack_modules__ = ([
+/* 0 */,
+/* 1 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-Object.defineProperty(exports, "addLinkAttributes", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.addLinkAttributes;
-  }
-});
-Object.defineProperty(exports, "getFilenameFromUrl", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.getFilenameFromUrl;
-  }
-});
-Object.defineProperty(exports, "LinkTarget", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.LinkTarget;
-  }
-});
-Object.defineProperty(exports, "loadScript", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.loadScript;
-  }
-});
-Object.defineProperty(exports, "PDFDateString", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.PDFDateString;
-  }
-});
-Object.defineProperty(exports, "RenderingCancelledException", {
-  enumerable: true,
-  get: function () {
-    return _display_utils.RenderingCancelledException;
-  }
-});
-Object.defineProperty(exports, "build", {
-  enumerable: true,
-  get: function () {
-    return _api.build;
-  }
-});
-Object.defineProperty(exports, "getDocument", {
-  enumerable: true,
-  get: function () {
-    return _api.getDocument;
-  }
-});
-Object.defineProperty(exports, "LoopbackPort", {
-  enumerable: true,
-  get: function () {
-    return _api.LoopbackPort;
-  }
-});
-Object.defineProperty(exports, "PDFDataRangeTransport", {
-  enumerable: true,
-  get: function () {
-    return _api.PDFDataRangeTransport;
-  }
-});
-Object.defineProperty(exports, "PDFWorker", {
-  enumerable: true,
-  get: function () {
-    return _api.PDFWorker;
-  }
-});
-Object.defineProperty(exports, "version", {
-  enumerable: true,
-  get: function () {
-    return _api.version;
-  }
-});
-Object.defineProperty(exports, "CMapCompressionType", {
-  enumerable: true,
-  get: function () {
-    return _util.CMapCompressionType;
-  }
-});
-Object.defineProperty(exports, "createObjectURL", {
-  enumerable: true,
-  get: function () {
-    return _util.createObjectURL;
-  }
-});
-Object.defineProperty(exports, "createPromiseCapability", {
-  enumerable: true,
-  get: function () {
-    return _util.createPromiseCapability;
-  }
-});
-Object.defineProperty(exports, "createValidAbsoluteUrl", {
-  enumerable: true,
-  get: function () {
-    return _util.createValidAbsoluteUrl;
-  }
-});
-Object.defineProperty(exports, "InvalidPDFException", {
-  enumerable: true,
-  get: function () {
-    return _util.InvalidPDFException;
-  }
-});
-Object.defineProperty(exports, "MissingPDFException", {
-  enumerable: true,
-  get: function () {
-    return _util.MissingPDFException;
-  }
-});
-Object.defineProperty(exports, "OPS", {
-  enumerable: true,
-  get: function () {
-    return _util.OPS;
-  }
-});
-Object.defineProperty(exports, "PasswordResponses", {
-  enumerable: true,
-  get: function () {
-    return _util.PasswordResponses;
-  }
-});
-Object.defineProperty(exports, "PermissionFlag", {
-  enumerable: true,
-  get: function () {
-    return _util.PermissionFlag;
-  }
-});
-Object.defineProperty(exports, "removeNullCharacters", {
-  enumerable: true,
-  get: function () {
-    return _util.removeNullCharacters;
-  }
-});
-Object.defineProperty(exports, "shadow", {
-  enumerable: true,
-  get: function () {
-    return _util.shadow;
-  }
-});
-Object.defineProperty(exports, "UnexpectedResponseException", {
-  enumerable: true,
-  get: function () {
-    return _util.UnexpectedResponseException;
-  }
-});
-Object.defineProperty(exports, "UNSUPPORTED_FEATURES", {
-  enumerable: true,
-  get: function () {
-    return _util.UNSUPPORTED_FEATURES;
-  }
-});
-Object.defineProperty(exports, "Util", {
-  enumerable: true,
-  get: function () {
-    return _util.Util;
-  }
-});
-Object.defineProperty(exports, "VerbosityLevel", {
-  enumerable: true,
-  get: function () {
-    return _util.VerbosityLevel;
-  }
-});
-Object.defineProperty(exports, "AnnotationLayer", {
-  enumerable: true,
-  get: function () {
-    return _annotation_layer.AnnotationLayer;
-  }
-});
-Object.defineProperty(exports, "apiCompatibilityParams", {
-  enumerable: true,
-  get: function () {
-    return _api_compatibility.apiCompatibilityParams;
-  }
-});
-Object.defineProperty(exports, "GlobalWorkerOptions", {
-  enumerable: true,
-  get: function () {
-    return _worker_options.GlobalWorkerOptions;
-  }
-});
-Object.defineProperty(exports, "renderTextLayer", {
-  enumerable: true,
-  get: function () {
-    return _text_layer.renderTextLayer;
-  }
-});
-Object.defineProperty(exports, "SVGGraphics", {
-  enumerable: true,
-  get: function () {
-    return _svg.SVGGraphics;
-  }
-});
+}));
+exports.addLinkAttributes = addLinkAttributes;
+exports.deprecated = deprecated;
+exports.getFilenameFromUrl = getFilenameFromUrl;
+exports.getPdfFilenameFromUrl = getPdfFilenameFromUrl;
+exports.getXfaPageViewport = getXfaPageViewport;
+exports.isDataScheme = isDataScheme;
+exports.isPdfFile = isPdfFile;
+exports.isValidFetchUrl = isValidFetchUrl;
+exports.loadScript = loadScript;
+exports.StatTimer = exports.RenderingCancelledException = exports.PDFDateString = exports.PageViewport = 
exports.LinkTarget = exports.DOMSVGFactory = exports.DOMStandardFontDataFactory = 
exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = void 0;
 
-var _display_utils = __w_pdfjs_require__(1);
+var _util = __w_pdfjs_require__(2);
 
-var _api = __w_pdfjs_require__(5);
+var _base_factory = __w_pdfjs_require__(5);
 
-var _util = __w_pdfjs_require__(2);
+const DEFAULT_LINK_REL = "noopener noreferrer nofollow";
+exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
+const SVG_NS = "http://www.w3.org/2000/svg";;
 
-var _annotation_layer = __w_pdfjs_require__(19);
+class DOMCanvasFactory extends _base_factory.BaseCanvasFactory {
+  constructor({
+    ownerDocument = globalThis.document
+  } = {}) {
+    super();
+    this._document = ownerDocument;
+  }
 
-var _api_compatibility = __w_pdfjs_require__(9);
+  _createCanvas(width, height) {
+    const canvas = this._document.createElement("canvas");
 
-var _worker_options = __w_pdfjs_require__(12);
+    canvas.width = width;
+    canvas.height = height;
+    return canvas;
+  }
 
-var _text_layer = __w_pdfjs_require__(20);
+}
 
-var _svg = __w_pdfjs_require__(21);
+exports.DOMCanvasFactory = DOMCanvasFactory;
 
-const pdfjsVersion = '2.6.347';
-const pdfjsBuild = '3be9c65f';
-{
-  const {
-    isNodeJS
-  } = __w_pdfjs_require__(4);
+async function fetchData(url, asTypedArray = false) {
+  if (isValidFetchUrl(url, document.baseURI)) {
+    const response = await fetch(url);
 
-  if (isNodeJS) {
-    const PDFNodeStream = __w_pdfjs_require__(22).PDFNodeStream;
+    if (!response.ok) {
+      throw new Error(response.statusText);
+    }
 
-    (0, _api.setPDFNetworkStreamFactory)(params => {
-      return new PDFNodeStream(params);
-    });
-  } else {
-    const PDFNetworkStream = __w_pdfjs_require__(25).PDFNetworkStream;
+    return asTypedArray ? new Uint8Array(await response.arrayBuffer()) : (0, _util.stringToBytes)(await 
response.text());
+  }
 
-    let PDFFetchStream;
+  return new Promise((resolve, reject) => {
+    const request = new XMLHttpRequest();
+    request.open("GET", url, true);
 
-    if ((0, _display_utils.isFetchSupported)()) {
-      PDFFetchStream = __w_pdfjs_require__(26).PDFFetchStream;
+    if (asTypedArray) {
+      request.responseType = "arraybuffer";
     }
 
-    (0, _api.setPDFNetworkStreamFactory)(params => {
-      if (PDFFetchStream && (0, _display_utils.isValidFetchUrl)(params.url)) {
-        return new PDFFetchStream(params);
+    request.onreadystatechange = () => {
+      if (request.readyState !== XMLHttpRequest.DONE) {
+        return;
       }
 
-      return new PDFNetworkStream(params);
-    });
-  }
-}
+      if (request.status === 200 || request.status === 0) {
+        let data;
 
-/***/ }),
-/* 1 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+        if (asTypedArray && request.response) {
+          data = new Uint8Array(request.response);
+        } else if (!asTypedArray && request.responseText) {
+          data = (0, _util.stringToBytes)(request.responseText);
+        }
 
-"use strict";
+        if (data) {
+          resolve(data);
+          return;
+        }
+      }
 
+      reject(new Error(request.statusText));
+    };
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.addLinkAttributes = addLinkAttributes;
-exports.getFilenameFromUrl = getFilenameFromUrl;
-exports.isFetchSupported = isFetchSupported;
-exports.isValidFetchUrl = isValidFetchUrl;
-exports.loadScript = loadScript;
-exports.deprecated = deprecated;
-exports.PDFDateString = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = 
exports.BaseCMapReaderFactory = exports.DOMCanvasFactory = exports.BaseCanvasFactory = 
exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = 
void 0;
+    request.send(null);
+  });
+}
 
-var _util = __w_pdfjs_require__(2);
+class DOMCMapReaderFactory extends _base_factory.BaseCMapReaderFactory {
+  _fetchData(url, compressionType) {
+    return fetchData(url, this.isCompressed).then(data => {
+      return {
+        cMapData: data,
+        compressionType
+      };
+    });
+  }
 
-const DEFAULT_LINK_REL = "noopener noreferrer nofollow";
-exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
-const SVG_NS = "http://www.w3.org/2000/svg";;
+}
 
-class BaseCanvasFactory {
-  constructor() {
-    if (this.constructor === BaseCanvasFactory) {
-      (0, _util.unreachable)("Cannot initialize BaseCanvasFactory.");
-    }
-  }
+exports.DOMCMapReaderFactory = DOMCMapReaderFactory;
 
-  create(width, height) {
-    (0, _util.unreachable)("Abstract method `create` called.");
+class DOMStandardFontDataFactory extends _base_factory.BaseStandardFontDataFactory {
+  _fetchData(url) {
+    return fetchData(url, true);
   }
 
-  reset(canvasAndContext, width, height) {
-    if (!canvasAndContext.canvas) {
-      throw new Error("Canvas is not specified");
-    }
+}
 
-    if (width <= 0 || height <= 0) {
-      throw new Error("Invalid canvas size");
-    }
-
-    canvasAndContext.canvas.width = width;
-    canvasAndContext.canvas.height = height;
-  }
-
-  destroy(canvasAndContext) {
-    if (!canvasAndContext.canvas) {
-      throw new Error("Canvas is not specified");
-    }
-
-    canvasAndContext.canvas.width = 0;
-    canvasAndContext.canvas.height = 0;
-    canvasAndContext.canvas = null;
-    canvasAndContext.context = null;
-  }
-
-}
-
-exports.BaseCanvasFactory = BaseCanvasFactory;
-
-class DOMCanvasFactory extends BaseCanvasFactory {
-  constructor({
-    ownerDocument = globalThis.document
-  } = {}) {
-    super();
-    this._document = ownerDocument;
-  }
-
-  create(width, height) {
-    if (width <= 0 || height <= 0) {
-      throw new Error("Invalid canvas size");
-    }
-
-    const canvas = this._document.createElement("canvas");
-
-    const context = canvas.getContext("2d");
-    canvas.width = width;
-    canvas.height = height;
-    return {
-      canvas,
-      context
-    };
-  }
-
-}
-
-exports.DOMCanvasFactory = DOMCanvasFactory;
-
-class BaseCMapReaderFactory {
-  constructor({
-    baseUrl = null,
-    isCompressed = false
-  }) {
-    if (this.constructor === BaseCMapReaderFactory) {
-      (0, _util.unreachable)("Cannot initialize BaseCMapReaderFactory.");
-    }
-
-    this.baseUrl = baseUrl;
-    this.isCompressed = isCompressed;
-  }
-
-  async fetch({
-    name
-  }) {
-    if (!this.baseUrl) {
-      throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and 
"cMapPacked" API parameters are provided.');
-    }
-
-    if (!name) {
-      throw new Error("CMap name must be specified.");
-    }
-
-    const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : "");
-    const compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : 
_util.CMapCompressionType.NONE;
-    return this._fetchData(url, compressionType).catch(reason => {
-      throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`);
-    });
-  }
-
-  _fetchData(url, compressionType) {
-    (0, _util.unreachable)("Abstract method `_fetchData` called.");
-  }
-
-}
-
-exports.BaseCMapReaderFactory = BaseCMapReaderFactory;
-
-class DOMCMapReaderFactory extends BaseCMapReaderFactory {
-  _fetchData(url, compressionType) {
-    if (isFetchSupported() && isValidFetchUrl(url, document.baseURI)) {
-      return fetch(url).then(async response => {
-        if (!response.ok) {
-          throw new Error(response.statusText);
-        }
-
-        let cMapData;
-
-        if (this.isCompressed) {
-          cMapData = new Uint8Array(await response.arrayBuffer());
-        } else {
-          cMapData = (0, _util.stringToBytes)(await response.text());
-        }
-
-        return {
-          cMapData,
-          compressionType
-        };
-      });
-    }
-
-    return new Promise((resolve, reject) => {
-      const request = new XMLHttpRequest();
-      request.open("GET", url, true);
-
-      if (this.isCompressed) {
-        request.responseType = "arraybuffer";
-      }
-
-      request.onreadystatechange = () => {
-        if (request.readyState !== XMLHttpRequest.DONE) {
-          return;
-        }
-
-        if (request.status === 200 || request.status === 0) {
-          let cMapData;
-
-          if (this.isCompressed && request.response) {
-            cMapData = new Uint8Array(request.response);
-          } else if (!this.isCompressed && request.responseText) {
-            cMapData = (0, _util.stringToBytes)(request.responseText);
-          }
-
-          if (cMapData) {
-            resolve({
-              cMapData,
-              compressionType
-            });
-            return;
-          }
-        }
-
-        reject(new Error(request.statusText));
-      };
-
-      request.send(null);
-    });
-  }
-
-}
-
-exports.DOMCMapReaderFactory = DOMCMapReaderFactory;
-
-class DOMSVGFactory {
-  create(width, height) {
-    (0, _util.assert)(width > 0 && height > 0, "Invalid SVG dimensions");
-    const svg = document.createElementNS(SVG_NS, "svg:svg");
-    svg.setAttribute("version", "1.1");
-    svg.setAttribute("width", width + "px");
-    svg.setAttribute("height", height + "px");
-    svg.setAttribute("preserveAspectRatio", "none");
-    svg.setAttribute("viewBox", "0 0 " + width + " " + height);
-    return svg;
-  }
+exports.DOMStandardFontDataFactory = DOMStandardFontDataFactory;
 
-  createElement(type) {
-    (0, _util.assert)(typeof type === "string", "Invalid SVG element type");
+class DOMSVGFactory extends _base_factory.BaseSVGFactory {
+  _createSVG(type) {
     return document.createElementNS(SVG_NS, type);
   }
 
@@ -600,8 +176,11 @@ class PageViewport {
     const centerX = (viewBox[2] + viewBox[0]) / 2;
     const centerY = (viewBox[3] + viewBox[1]) / 2;
     let rotateA, rotateB, rotateC, rotateD;
-    rotation = rotation % 360;
-    rotation = rotation < 0 ? rotation + 360 : rotation;
+    rotation %= 360;
+
+    if (rotation < 0) {
+      rotation += 360;
+    }
 
     switch (rotation) {
       case 180:
@@ -763,6 +342,21 @@ function addLinkAttributes(link, {
   link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL;
 }
 
+function isDataScheme(url) {
+  const ii = url.length;
+  let i = 0;
+
+  while (i < ii && url[i].trim() === "") {
+    i++;
+  }
+
+  return url.substring(i, i + 5).toLowerCase() === "data:";
+}
+
+function isPdfFile(filename) {
+  return typeof filename === "string" && /\.pdf$/i.test(filename);
+}
+
 function getFilenameFromUrl(url) {
   const anchor = url.indexOf("#");
   const query = url.indexOf("?");
@@ -770,6 +364,34 @@ function getFilenameFromUrl(url) {
   return url.substring(url.lastIndexOf("/", end) + 1, end);
 }
 
+function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") {
+  if (typeof url !== "string") {
+    return defaultFilename;
+  }
+
+  if (isDataScheme(url)) {
+    (0, _util.warn)('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.');
+    return defaultFilename;
+  }
+
+  const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
+  const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
+  const splitURI = reURI.exec(url);
+  let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || 
reFilename.exec(splitURI[3]);
+
+  if (suggestedFilename) {
+    suggestedFilename = suggestedFilename[0];
+
+    if (suggestedFilename.includes("%")) {
+      try {
+        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];
+      } catch (ex) {}
+    }
+  }
+
+  return suggestedFilename || defaultFilename;
+}
+
 class StatTimer {
   constructor() {
     this.started = Object.create(null);
@@ -821,10 +443,6 @@ class StatTimer {
 
 exports.StatTimer = StatTimer;
 
-function isFetchSupported() {
-  return typeof fetch !== "undefined" && typeof Response !== "undefined" && "body" in Response.prototype && 
typeof ReadableStream !== "undefined";
-}
-
 function isValidFetchUrl(url, baseUrl) {
   try {
     const {
@@ -836,11 +454,18 @@ function isValidFetchUrl(url, baseUrl) {
   }
 }
 
-function loadScript(src) {
+function loadScript(src, removeScriptElement = false) {
   return new Promise((resolve, reject) => {
     const script = document.createElement("script");
     script.src = src;
-    script.onload = resolve;
+
+    script.onload = function (evt) {
+      if (removeScriptElement) {
+        script.remove();
+      }
+
+      resolve(evt);
+    };
 
     script.onerror = function () {
       reject(new Error(`Cannot load script at: ${script.src}`));
@@ -904,43 +529,63 @@ class PDFDateString {
 
 exports.PDFDateString = PDFDateString;
 
+function getXfaPageViewport(xfaPage, {
+  scale = 1,
+  rotation = 0
+}) {
+  const {
+    width,
+    height
+  } = xfaPage.attributes.style;
+  const viewBox = [0, 0, parseInt(width), parseInt(height)];
+  return new PageViewport({
+    viewBox,
+    scale,
+    rotation
+  });
+}
+
 /***/ }),
 /* 2 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.arrayByteLength = arrayByteLength;
 exports.arraysToBytes = arraysToBytes;
 exports.assert = assert;
 exports.bytesToString = bytesToString;
+exports.createObjectURL = createObjectURL;
 exports.createPromiseCapability = createPromiseCapability;
+exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
 exports.escapeString = escapeString;
 exports.getModificationDate = getModificationDate;
 exports.getVerbosityLevel = getVerbosityLevel;
 exports.info = info;
 exports.isArrayBuffer = isArrayBuffer;
 exports.isArrayEqual = isArrayEqual;
+exports.isAscii = isAscii;
 exports.isBool = isBool;
 exports.isNum = isNum;
-exports.isString = isString;
 exports.isSameOrigin = isSameOrigin;
-exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
+exports.isString = isString;
+exports.objectFromMap = objectFromMap;
+exports.objectSize = objectSize;
 exports.removeNullCharacters = removeNullCharacters;
 exports.setVerbosityLevel = setVerbosityLevel;
 exports.shadow = shadow;
 exports.string32 = string32;
 exports.stringToBytes = stringToBytes;
 exports.stringToPDFString = stringToPDFString;
+exports.stringToUTF16BEString = stringToUTF16BEString;
 exports.stringToUTF8String = stringToUTF8String;
+exports.unreachable = unreachable;
 exports.utf8StringToString = utf8StringToString;
 exports.warn = warn;
-exports.unreachable = unreachable;
-exports.IsEvalSupportedCached = exports.IsLittleEndianCached = exports.createObjectURL = exports.FormatError 
= exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = 
exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = 
exports.PasswordException = exports.MissingPDFException = exports.InvalidPDFException = 
exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = 
exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = 
exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = 
exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = 
exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = 
exports.BaseException = void 0;
+exports.VerbosityLevel = exports.Util = exports.UNSUPPORTED_FEATURES = exports.UnknownErrorException = 
exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag 
= exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = 
exports.MissingPDFException = exports.IsLittleEndianCached = exports.IsEvalSupportedCached = 
exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = 
exports.FontType = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = 
exports.CMapCompressionType = exports.BaseException = exports.AnnotationType = 
exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = 
exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = 
exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0;
 
 __w_pdfjs_require__(3);
 
@@ -1073,6 +718,36 @@ const AnnotationBorderStyleType = {
   UNDERLINE: 5
 };
 exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
+const AnnotationActionEventType = {
+  E: "Mouse Enter",
+  X: "Mouse Exit",
+  D: "Mouse Down",
+  U: "Mouse Up",
+  Fo: "Focus",
+  Bl: "Blur",
+  PO: "PageOpen",
+  PC: "PageClose",
+  PV: "PageVisible",
+  PI: "PageInvisible",
+  K: "Keystroke",
+  F: "Format",
+  V: "Validate",
+  C: "Calculate"
+};
+exports.AnnotationActionEventType = AnnotationActionEventType;
+const DocumentActionEventType = {
+  WC: "WillClose",
+  WS: "WillSave",
+  DS: "DidSave",
+  WP: "WillPrint",
+  DP: "DidPrint"
+};
+exports.DocumentActionEventType = DocumentActionEventType;
+const PageActionEventType = {
+  O: "PageOpen",
+  C: "PageClose"
+};
+exports.PageActionEventType = PageActionEventType;
 const StreamType = {
   UNKNOWN: "UNKNOWN",
   FLATE: "FLATE",
@@ -1089,6 +764,7 @@ exports.StreamType = StreamType;
 const FontType = {
   UNKNOWN: "UNKNOWN",
   TYPE1: "TYPE1",
+  TYPE1STANDARD: "TYPE1STANDARD",
   TYPE1C: "TYPE1C",
   CIDFONTTYPE0: "CIDFONTTYPE0",
   CIDFONTTYPE0C: "CIDFONTTYPE0C",
@@ -1210,6 +886,7 @@ const UNSUPPORTED_FEATURES = {
   unknown: "unknown",
   forms: "forms",
   javaScript: "javaScript",
+  signatures: "signatures",
   smask: "smask",
   shadingPattern: "shadingPattern",
   font: "font",
@@ -1224,6 +901,7 @@ const UNSUPPORTED_FEATURES = {
   errorOperatorList: "errorOperatorList",
   errorFontToUnicode: "errorFontToUnicode",
   errorFontLoadNative: "errorFontLoadNative",
+  errorFontBuildPath: "errorFontBuildPath",
   errorFontGetPath: "errorFontGetPath",
   errorMarkedContent: "errorMarkedContent"
 };
@@ -1481,6 +1159,20 @@ function string32(value) {
   return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
 }
 
+function objectSize(obj) {
+  return Object.keys(obj).length;
+}
+
+function objectFromMap(map) {
+  const obj = Object.create(null);
+
+  for (const [key, value] of map) {
+    obj[key] = value;
+  }
+
+  return obj;
+}
+
 function isLittleEndian() {
   const buffer8 = new Uint8Array(4);
   buffer8[0] = 1;
@@ -1512,14 +1204,11 @@ const IsEvalSupportedCached = {
 
 };
 exports.IsEvalSupportedCached = IsEvalSupportedCached;
-const rgbBuf = ["rgb(", 0, ",", 0, ",", 0, ")"];
+const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0"));
 
 class Util {
-  static makeCssRgb(r, g, b) {
-    rgbBuf[1] = r;
-    rgbBuf[3] = g;
-    rgbBuf[5] = b;
-    return rgbBuf.join("");
+  static makeHexColor(r, g, b) {
+    return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;
   }
 
   static transform(m1, m2) {
@@ -1563,7 +1252,7 @@ class Util {
     const c = m[2] * transpose[0] + m[3] * transpose[2];
     const d = m[2] * transpose[1] + m[3] * transpose[3];
     const first = (a + d) / 2;
-    const second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;
     const sx = first + second || 1;
     const sy = first - second || 1;
     return [Math.sqrt(sx), Math.sqrt(sy)];
@@ -1616,7 +1305,7 @@ class Util {
 }
 
 exports.Util = Util;
-const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 
0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 
0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
+const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 
0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 
0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac];
 
 function stringToPDFString(str) {
   const length = str.length,
@@ -1641,7 +1330,30 @@ function stringToPDFString(str) {
 }
 
 function escapeString(str) {
-  return str.replace(/([\(\)\\])/g, "\\$1");
+  return str.replace(/([()\\\n\r])/g, match => {
+    if (match === "\n") {
+      return "\\n";
+    } else if (match === "\r") {
+      return "\\r";
+    }
+
+    return `\\${match}`;
+  });
+}
+
+function isAscii(str) {
+  return /^[\x00-\x7F]*$/.test(str);
+}
+
+function stringToUTF16BEString(str) {
+  const buf = ["\xFE\xFF"];
+
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+    buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff));
+  }
+
+  return buf.join("");
 }
 
 function stringToUTF8String(str) {
@@ -1673,13 +1385,17 @@ function isArrayEqual(arr1, arr2) {
     return false;
   }
 
-  return arr1.every(function (element, index) {
-    return element === arr2[index];
-  });
+  for (let i = 0, ii = arr1.length; i < ii; i++) {
+    if (arr1[i] !== arr2[i]) {
+      return false;
+    }
+  }
+
+  return true;
 }
 
-function getModificationDate(date = new Date(Date.now())) {
-  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), 
(date.getUTCDate() + 1).toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), 
date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
+function getModificationDate(date = new Date()) {
+  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), 
date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), 
date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
   return buffer.join("");
 }
 
@@ -1706,40 +1422,34 @@ function createPromiseCapability() {
   return capability;
 }
 
-const createObjectURL = function createObjectURLClosure() {
-  const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-  return function createObjectURL(data, contentType, forceDataSchema = false) {
-    if (!forceDataSchema && URL.createObjectURL) {
-      const blob = new Blob([data], {
-        type: contentType
-      });
-      return URL.createObjectURL(blob);
-    }
-
-    let buffer = `data:${contentType};base64,`;
+function createObjectURL(data, contentType = "", forceDataSchema = false) {
+  if (URL.createObjectURL && !forceDataSchema) {
+    return URL.createObjectURL(new Blob([data], {
+      type: contentType
+    }));
+  }
 
-    for (let i = 0, ii = data.length; i < ii; i += 3) {
-      const b1 = data[i] & 0xff;
-      const b2 = data[i + 1] & 0xff;
-      const b3 = data[i + 2] & 0xff;
-      const d1 = b1 >> 2,
-            d2 = (b1 & 3) << 4 | b2 >> 4;
-      const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;
-      const d4 = i + 2 < ii ? b3 & 0x3f : 64;
-      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
-    }
+  const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+  let buffer = `data:${contentType};base64,`;
 
-    return buffer;
-  };
-}();
+  for (let i = 0, ii = data.length; i < ii; i += 3) {
+    const b1 = data[i] & 0xff;
+    const b2 = data[i + 1] & 0xff;
+    const b3 = data[i + 2] & 0xff;
+    const d1 = b1 >> 2,
+          d2 = (b1 & 3) << 4 | b2 >> 4;
+    const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;
+    const d4 = i + 2 < ii ? b3 & 0x3f : 64;
+    buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+  }
 
-exports.createObjectURL = createObjectURL;
+  return buffer;
+}
 
 /***/ }),
 /* 3 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
 var _is_node = __w_pdfjs_require__(4);
@@ -1748,64 +1458,240 @@ var _is_node = __w_pdfjs_require__(4);
 
 /***/ }),
 /* 4 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.isNodeJS = void 0;
 const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw 
&& !(process.versions.electron && process.type && process.type !== "browser");
 exports.isNodeJS = isNodeJS;
 
 /***/ }),
 /* 5 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.getDocument = getDocument;
-exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;
-exports.build = exports.version = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = 
exports.PDFDataRangeTransport = exports.LoopbackPort = void 0;
+}));
+exports.BaseSVGFactory = exports.BaseStandardFontDataFactory = exports.BaseCMapReaderFactory = 
exports.BaseCanvasFactory = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _display_utils = __w_pdfjs_require__(1);
+class BaseCanvasFactory {
+  constructor() {
+    if (this.constructor === BaseCanvasFactory) {
+      (0, _util.unreachable)("Cannot initialize BaseCanvasFactory.");
+    }
+  }
 
-var _font_loader = __w_pdfjs_require__(6);
+  create(width, height) {
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid canvas size");
+    }
 
-var _node_utils = __w_pdfjs_require__(7);
+    const canvas = this._createCanvas(width, height);
 
-var _annotation_storage = __w_pdfjs_require__(8);
+    return {
+      canvas,
+      context: canvas.getContext("2d")
+    };
+  }
 
-var _api_compatibility = __w_pdfjs_require__(9);
+  reset(canvasAndContext, width, height) {
+    if (!canvasAndContext.canvas) {
+      throw new Error("Canvas is not specified");
+    }
 
-var _canvas = __w_pdfjs_require__(10);
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid canvas size");
+    }
 
-var _worker_options = __w_pdfjs_require__(12);
+    canvasAndContext.canvas.width = width;
+    canvasAndContext.canvas.height = height;
+  }
 
-var _is_node = __w_pdfjs_require__(4);
+  destroy(canvasAndContext) {
+    if (!canvasAndContext.canvas) {
+      throw new Error("Canvas is not specified");
+    }
 
-var _message_handler = __w_pdfjs_require__(13);
+    canvasAndContext.canvas.width = 0;
+    canvasAndContext.canvas.height = 0;
+    canvasAndContext.canvas = null;
+    canvasAndContext.context = null;
+  }
 
-var _metadata = __w_pdfjs_require__(14);
+  _createCanvas(width, height) {
+    (0, _util.unreachable)("Abstract method `_createCanvas` called.");
+  }
+
+}
+
+exports.BaseCanvasFactory = BaseCanvasFactory;
+
+class BaseCMapReaderFactory {
+  constructor({
+    baseUrl = null,
+    isCompressed = false
+  }) {
+    if (this.constructor === BaseCMapReaderFactory) {
+      (0, _util.unreachable)("Cannot initialize BaseCMapReaderFactory.");
+    }
+
+    this.baseUrl = baseUrl;
+    this.isCompressed = isCompressed;
+  }
+
+  async fetch({
+    name
+  }) {
+    if (!this.baseUrl) {
+      throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and 
"cMapPacked" API parameters are provided.');
+    }
+
+    if (!name) {
+      throw new Error("CMap name must be specified.");
+    }
+
+    const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : "");
+    const compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : 
_util.CMapCompressionType.NONE;
+    return this._fetchData(url, compressionType).catch(reason => {
+      throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`);
+    });
+  }
+
+  _fetchData(url, compressionType) {
+    (0, _util.unreachable)("Abstract method `_fetchData` called.");
+  }
+
+}
+
+exports.BaseCMapReaderFactory = BaseCMapReaderFactory;
+
+class BaseStandardFontDataFactory {
+  constructor({
+    baseUrl = null
+  }) {
+    if (this.constructor === BaseStandardFontDataFactory) {
+      (0, _util.unreachable)("Cannot initialize BaseStandardFontDataFactory.");
+    }
+
+    this.baseUrl = baseUrl;
+  }
+
+  async fetch({
+    filename
+  }) {
+    if (!this.baseUrl) {
+      throw new Error('The standard font "baseUrl" parameter must be specified, ensure that ' + 'the 
"standardFontDataUrl" API parameter is provided.');
+    }
+
+    if (!filename) {
+      throw new Error("Font filename must be specified.");
+    }
+
+    const url = `${this.baseUrl}${filename}`;
+    return this._fetchData(url).catch(reason => {
+      throw new Error(`Unable to load font data at: ${url}`);
+    });
+  }
+
+  _fetchData(url) {
+    (0, _util.unreachable)("Abstract method `_fetchData` called.");
+  }
 
-var _optional_content_config = __w_pdfjs_require__(16);
+}
+
+exports.BaseStandardFontDataFactory = BaseStandardFontDataFactory;
+
+class BaseSVGFactory {
+  constructor() {
+    if (this.constructor === BaseSVGFactory) {
+      (0, _util.unreachable)("Cannot initialize BaseSVGFactory.");
+    }
+  }
+
+  create(width, height) {
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid SVG dimensions");
+    }
+
+    const svg = this._createSVG("svg:svg");
+
+    svg.setAttribute("version", "1.1");
+    svg.setAttribute("width", `${width}px`);
+    svg.setAttribute("height", `${height}px`);
+    svg.setAttribute("preserveAspectRatio", "none");
+    svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
+    return svg;
+  }
+
+  createElement(type) {
+    if (typeof type !== "string") {
+      throw new Error("Invalid SVG element type");
+    }
+
+    return this._createSVG(type);
+  }
+
+  _createSVG(type) {
+    (0, _util.unreachable)("Abstract method `_createSVG` called.");
+  }
+
+}
+
+exports.BaseSVGFactory = BaseSVGFactory;
+
+/***/ }),
+/* 6 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getDocument = getDocument;
+exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;
+exports.version = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = 
exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = 
exports.DefaultCMapReaderFactory = exports.DefaultCanvasFactory = exports.build = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _display_utils = __w_pdfjs_require__(1);
+
+var _font_loader = __w_pdfjs_require__(7);
+
+var _node_utils = __w_pdfjs_require__(8);
+
+var _annotation_storage = __w_pdfjs_require__(9);
+
+var _canvas = __w_pdfjs_require__(10);
+
+var _worker_options = __w_pdfjs_require__(12);
+
+var _is_node = __w_pdfjs_require__(4);
 
-var _transport_stream = __w_pdfjs_require__(17);
+var _message_handler = __w_pdfjs_require__(13);
+
+var _metadata = __w_pdfjs_require__(14);
+
+var _optional_content_config = __w_pdfjs_require__(15);
 
-var _webgl = __w_pdfjs_require__(18);
+var _transport_stream = __w_pdfjs_require__(16);
 
 const DEFAULT_RANGE_CHUNK_SIZE = 65536;
 const RENDERING_CANCELLED_TIMEOUT = 100;
 const DefaultCanvasFactory = _is_node.isNodeJS ? _node_utils.NodeCanvasFactory : 
_display_utils.DOMCanvasFactory;
+exports.DefaultCanvasFactory = DefaultCanvasFactory;
 const DefaultCMapReaderFactory = _is_node.isNodeJS ? _node_utils.NodeCMapReaderFactory : 
_display_utils.DOMCMapReaderFactory;
+exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory;
+const DefaultStandardFontDataFactory = _is_node.isNodeJS ? _node_utils.NodeStandardFontDataFactory : 
_display_utils.DOMStandardFontDataFactory;
+exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory;
 let createPDFNetworkStream;
 
 function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
@@ -1816,7 +1702,7 @@ function getDocument(src) {
   const task = new PDFDocumentLoadingTask();
   let source;
 
-  if (typeof src === "string") {
+  if (typeof src === "string" || src instanceof URL) {
     source = {
       url: src
     };
@@ -1830,7 +1716,7 @@ function getDocument(src) {
     };
   } else {
     if (typeof src !== "object") {
-      throw new Error("Invalid parameter in getDocument, " + "need either Uint8Array, string or a parameter 
object");
+      throw new Error("Invalid parameter in getDocument, " + "need either string, URL, Uint8Array, or 
parameter object.");
     }
 
     if (!src.url && !src.data && !src.range) {
@@ -1845,50 +1731,83 @@ function getDocument(src) {
       worker = null;
 
   for (const key in source) {
-    if (key === "url" && typeof window !== "undefined") {
-      params[key] = new URL(source[key], window.location).href;
-      continue;
-    } else if (key === "range") {
-      rangeTransport = source[key];
-      continue;
-    } else if (key === "worker") {
-      worker = source[key];
-      continue;
-    } else if (key === "data" && !(source[key] instanceof Uint8Array)) {
-      const pdfBytes = source[key];
-
-      if (typeof pdfBytes === "string") {
-        params[key] = (0, _util.stringToBytes)(pdfBytes);
-      } else if (typeof pdfBytes === "object" && pdfBytes !== null && !isNaN(pdfBytes.length)) {
-        params[key] = new Uint8Array(pdfBytes);
-      } else if ((0, _util.isArrayBuffer)(pdfBytes)) {
-        params[key] = new Uint8Array(pdfBytes);
-      } else {
-        throw new Error("Invalid PDF binary data: either typed array, " + "string or array-like object is 
expected in the " + "data property.");
-      }
+    const value = source[key];
 
-      continue;
+    switch (key) {
+      case "url":
+        if (typeof window !== "undefined") {
+          try {
+            params[key] = new URL(value, window.location).href;
+            continue;
+          } catch (ex) {
+            (0, _util.warn)(`Cannot create valid URL: "${ex}".`);
+          }
+        } else if (typeof value === "string" || value instanceof URL) {
+          params[key] = value.toString();
+          continue;
+        }
+
+        throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url 
property.");
+
+      case "range":
+        rangeTransport = value;
+        continue;
+
+      case "worker":
+        worker = value;
+        continue;
+
+      case "data":
+        if (_is_node.isNodeJS && typeof Buffer !== "undefined" && value instanceof Buffer) {
+          params[key] = new Uint8Array(value);
+        } else if (value instanceof Uint8Array) {
+          break;
+        } else if (typeof value === "string") {
+          params[key] = (0, _util.stringToBytes)(value);
+        } else if (typeof value === "object" && value !== null && !isNaN(value.length)) {
+          params[key] = new Uint8Array(value);
+        } else if ((0, _util.isArrayBuffer)(value)) {
+          params[key] = new Uint8Array(value);
+        } else {
+          throw new Error("Invalid PDF binary data: either typed array, " + "string, or array-like object is 
expected in the data property.");
+        }
+
+        continue;
     }
 
-    params[key] = source[key];
+    params[key] = value;
   }
 
   params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
   params.CMapReaderFactory = params.CMapReaderFactory || DefaultCMapReaderFactory;
+  params.StandardFontDataFactory = params.StandardFontDataFactory || DefaultStandardFontDataFactory;
   params.ignoreErrors = params.stopAtErrors !== true;
   params.fontExtraProperties = params.fontExtraProperties === true;
   params.pdfBug = params.pdfBug === true;
+  params.enableXfa = params.enableXfa === true;
+
+  if (typeof params.docBaseUrl !== "string" || (0, _display_utils.isDataScheme)(params.docBaseUrl)) {
+    params.docBaseUrl = null;
+  }
 
   if (!Number.isInteger(params.maxImageSize)) {
     params.maxImageSize = -1;
   }
 
+  if (typeof params.useWorkerFetch !== "boolean") {
+    params.useWorkerFetch = params.CMapReaderFactory === _display_utils.DOMCMapReaderFactory && 
params.StandardFontDataFactory === _display_utils.DOMStandardFontDataFactory;
+  }
+
   if (typeof params.isEvalSupported !== "boolean") {
     params.isEvalSupported = true;
   }
 
   if (typeof params.disableFontFace !== "boolean") {
-    params.disableFontFace = _api_compatibility.apiCompatibilityParams.disableFontFace || false;
+    params.disableFontFace = _is_node.isNodeJS;
+  }
+
+  if (typeof params.useSystemFonts !== "boolean") {
+    params.useSystemFonts = !_is_node.isNodeJS && !params.disableFontFace;
   }
 
   if (typeof params.ownerDocument === "undefined") {
@@ -1934,6 +1853,7 @@ function getDocument(src) {
           length: params.length,
           initialData: params.initialData,
           progressiveDone: params.progressiveDone,
+          contentDispositionFilename: params.contentDispositionFilename,
           disableRange: params.disableRange,
           disableStream: params.disableStream
         }, rangeTransport);
@@ -1975,11 +1895,12 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
     source.length = pdfDataRangeTransport.length;
     source.initialData = pdfDataRangeTransport.initialData;
     source.progressiveDone = pdfDataRangeTransport.progressiveDone;
+    source.contentDispositionFilename = pdfDataRangeTransport.contentDispositionFilename;
   }
 
   return worker.messageHandler.sendWithPromise("GetDocRequest", {
     docId,
-    apiVersion: '2.6.347',
+    apiVersion: '2.10.377',
     source: {
       data: source.data,
       url: source.url,
@@ -1994,7 +1915,11 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
     docBaseUrl: source.docBaseUrl,
     ignoreErrors: source.ignoreErrors,
     isEvalSupported: source.isEvalSupported,
-    fontExtraProperties: source.fontExtraProperties
+    fontExtraProperties: source.fontExtraProperties,
+    enableXfa: source.enableXfa,
+    useSystemFonts: source.useSystemFonts,
+    cMapUrl: source.useWorkerFetch ? source.cMapUrl : null,
+    standardFontDataUrl: source.useWorkerFetch ? source.standardFontDataUrl : null
   }).then(function (workerId) {
     if (worker.destroyed) {
       throw new Error("Worker was destroyed");
@@ -2043,10 +1968,11 @@ const PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {
 }();
 
 class PDFDataRangeTransport {
-  constructor(length, initialData, progressiveDone = false) {
+  constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {
     this.length = length;
     this.initialData = initialData;
     this.progressiveDone = progressiveDone;
+    this.contentDispositionFilename = contentDispositionFilename;
     this._rangeListeners = [];
     this._progressListeners = [];
     this._progressiveReadListeners = [];
@@ -2118,18 +2044,33 @@ class PDFDocumentProxy {
   constructor(pdfInfo, transport) {
     this._pdfInfo = pdfInfo;
     this._transport = transport;
+    Object.defineProperty(this, "fingerprint", {
+      get() {
+        (0, _display_utils.deprecated)("`PDFDocumentProxy.fingerprint`, " + "please use 
`PDFDocumentProxy.fingerprints` instead.");
+        return this.fingerprints[0];
+      }
+
+    });
   }
 
   get annotationStorage() {
-    return (0, _util.shadow)(this, "annotationStorage", new _annotation_storage.AnnotationStorage());
+    return this._transport.annotationStorage;
   }
 
   get numPages() {
     return this._pdfInfo.numPages;
   }
 
-  get fingerprint() {
-    return this._pdfInfo.fingerprint;
+  get fingerprints() {
+    return this._pdfInfo.fingerprints;
+  }
+
+  get isPureXfa() {
+    return !!this._transport._htmlForXfa;
+  }
+
+  get allXfaHtml() {
+    return this._transport._htmlForXfa;
   }
 
   getPage(pageNumber) {
@@ -2176,6 +2117,10 @@ class PDFDocumentProxy {
     return this._transport.getJavaScript();
   }
 
+  getJSActions() {
+    return this._transport.getDocJSActions();
+  }
+
   getOutline() {
     return this._transport.getOutline();
   }
@@ -2192,6 +2137,10 @@ class PDFDocumentProxy {
     return this._transport.getMetadata();
   }
 
+  getMarkInfo() {
+    return this._transport.getMarkInfo();
+  }
+
   getData() {
     return this._transport.getData();
   }
@@ -2204,8 +2153,8 @@ class PDFDocumentProxy {
     return this._transport.getStats();
   }
 
-  cleanup() {
-    return this._transport.startCleanup();
+  cleanup(keepLoadedFonts = false) {
+    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);
   }
 
   destroy() {
@@ -2220,8 +2169,24 @@ class PDFDocumentProxy {
     return this._transport.loadingTask;
   }
 
-  saveDocument(annotationStorage) {
-    return this._transport.saveDocument(annotationStorage);
+  saveDocument() {
+    if (this._transport.annotationStorage.size <= 0) {
+      (0, _display_utils.deprecated)("saveDocument called while `annotationStorage` is empty, " + "please 
use the getData-method instead.");
+    }
+
+    return this._transport.saveDocument();
+  }
+
+  getFieldObjects() {
+    return this._transport.getFieldObjects();
+  }
+
+  hasJSActions() {
+    return this._transport.hasJSActions();
+  }
+
+  getCalculationOrderIds() {
+    return this._transport.getCalculationOrderIds();
   }
 
 }
@@ -2284,27 +2249,38 @@ class PDFPageProxy {
   getAnnotations({
     intent = null
   } = {}) {
-    if (!this.annotationsPromise || this.annotationsIntent !== intent) {
-      this.annotationsPromise = this._transport.getAnnotations(this._pageIndex, intent);
-      this.annotationsIntent = intent;
+    const renderingIntent = intent === "display" || intent === "print" ? intent : null;
+
+    if (!this._annotationsPromise || this._annotationsIntent !== renderingIntent) {
+      this._annotationsPromise = this._transport.getAnnotations(this._pageIndex, renderingIntent);
+      this._annotationsIntent = renderingIntent;
     }
 
-    return this.annotationsPromise;
+    return this._annotationsPromise;
+  }
+
+  getJSActions() {
+    return this._jsActionsPromise || (this._jsActionsPromise = 
this._transport.getPageJSActions(this._pageIndex));
+  }
+
+  async getXfa() {
+    return this._transport._htmlForXfa?.children[this._pageIndex] || null;
   }
 
   render({
     canvasContext,
     viewport,
     intent = "display",
-    enableWebGL = false,
     renderInteractiveForms = false,
     transform = null,
     imageLayer = null,
     canvasFactory = null,
     background = null,
-    annotationStorage = null,
+    includeAnnotationStorage = false,
     optionalContentConfigPromise = null
   }) {
+    var _intentState;
+
     if (this._stats) {
       this._stats.time("Overall");
     }
@@ -2332,9 +2308,7 @@ class PDFPageProxy {
     const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({
       ownerDocument: this._ownerDocument
     });
-    const webGLContext = new _webgl.WebGLContext({
-      enable: enableWebGL
-    });
+    const annotationStorage = includeAnnotationStorage ? this._transport.annotationStorage.serializable : 
null;
 
     if (!intentState.displayReadyCapability) {
       intentState.displayReadyCapability = (0, _util.createPromiseCapability)();
@@ -2352,16 +2326,12 @@ class PDFPageProxy {
         pageIndex: this._pageIndex,
         intent: renderingIntent,
         renderInteractiveForms: renderInteractiveForms === true,
-        annotationStorage: annotationStorage && annotationStorage.getAll() || null
+        annotationStorage
       });
     }
 
     const complete = error => {
-      const i = intentState.renderTasks.indexOf(internalRenderTask);
-
-      if (i >= 0) {
-        intentState.renderTasks.splice(i, 1);
-      }
+      intentState.renderTasks.delete(internalRenderTask);
 
       if (this.cleanupAfterRender || renderingIntent === "print") {
         this.pendingCleanup = true;
@@ -2401,16 +2371,10 @@ class PDFPageProxy {
       operatorList: intentState.operatorList,
       pageIndex: this._pageIndex,
       canvasFactory: canvasFactoryInstance,
-      webGLContext,
       useRequestAnimationFrame: renderingIntent !== "print",
       pdfBug: this._pdfBug
     });
-
-    if (!intentState.renderTasks) {
-      intentState.renderTasks = [];
-    }
-
-    intentState.renderTasks.push(internalRenderTask);
+    ((_intentState = intentState).renderTasks || (_intentState.renderTasks = new 
Set())).add(internalRenderTask);
     const renderTask = internalRenderTask.task;
     Promise.all([intentState.displayReadyCapability.promise, 
optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {
       if (this.pendingCleanup) {
@@ -2431,19 +2395,17 @@ class PDFPageProxy {
     return renderTask;
   }
 
-  getOperatorList() {
+  getOperatorList({
+    intent = "display"
+  } = {}) {
     function operatorListChanged() {
       if (intentState.operatorList.lastChunk) {
         intentState.opListReadCapability.resolve(intentState.operatorList);
-        const i = intentState.renderTasks.indexOf(opListTask);
-
-        if (i >= 0) {
-          intentState.renderTasks.splice(i, 1);
-        }
+        intentState.renderTasks.delete(opListTask);
       }
     }
 
-    const renderingIntent = "oplist";
+    const renderingIntent = `oplist-${intent === "print" ? "print" : "display"}`;
 
     let intentState = this._intentStates.get(renderingIntent);
 
@@ -2456,11 +2418,12 @@ class PDFPageProxy {
     let opListTask;
 
     if (!intentState.opListReadCapability) {
+      var _intentState2;
+
       opListTask = Object.create(null);
       opListTask.operatorListChanged = operatorListChanged;
       intentState.opListReadCapability = (0, _util.createPromiseCapability)();
-      intentState.renderTasks = [];
-      intentState.renderTasks.push(opListTask);
+      ((_intentState2 = intentState).renderTasks || (_intentState2.renderTasks = new Set())).add(opListTask);
       intentState.operatorList = {
         fnArray: [],
         argsArray: [],
@@ -2482,13 +2445,15 @@ class PDFPageProxy {
 
   streamTextContent({
     normalizeWhitespace = false,
-    disableCombineTextItems = false
+    disableCombineTextItems = false,
+    includeMarkedContent = false
   } = {}) {
     const TEXT_CONTENT_CHUNK_SIZE = 100;
     return this._transport.messageHandler.sendWithStream("GetTextContent", {
       pageIndex: this._pageIndex,
       normalizeWhitespace: normalizeWhitespace === true,
-      combineTextItems: disableCombineTextItems !== true
+      combineTextItems: disableCombineTextItems !== true,
+      includeMarkedContent: includeMarkedContent === true
     }, {
       highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
 
@@ -2527,6 +2492,10 @@ class PDFPageProxy {
     });
   }
 
+  getStructTree() {
+    return this._structTreePromise || (this._structTreePromise = 
this._transport.getStructTree(this._pageIndex));
+  }
+
   _destroy() {
     this.destroyed = true;
     this._transport.pageCache[this._pageIndex] = null;
@@ -2539,7 +2508,7 @@ class PDFPageProxy {
         force: true
       });
 
-      if (intent === "oplist") {
+      if (intent.startsWith("oplist-")) {
         continue;
       }
 
@@ -2550,7 +2519,9 @@ class PDFPageProxy {
     }
 
     this.objs.clear();
-    this.annotationsPromise = null;
+    this._annotationsPromise = null;
+    this._jsActionsPromise = null;
+    this._structTreePromise = null;
     this.pendingCleanup = false;
     return Promise.all(waitOn);
   }
@@ -2569,7 +2540,7 @@ class PDFPageProxy {
       renderTasks,
       operatorList
     } of this._intentStates.values()) {
-      if (renderTasks.length !== 0 || !operatorList.lastChunk) {
+      if (renderTasks.size > 0 || !operatorList.lastChunk) {
         return false;
       }
     }
@@ -2577,7 +2548,9 @@ class PDFPageProxy {
     this._intentStates.clear();
 
     this.objs.clear();
-    this.annotationsPromise = null;
+    this._annotationsPromise = null;
+    this._jsActionsPromise = null;
+    this._structTreePromise = null;
 
     if (resetStats && this._stats) {
       this._stats = new _display_utils.StatTimer();
@@ -2611,8 +2584,8 @@ class PDFPageProxy {
 
     intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
 
-    for (let i = 0; i < intentState.renderTasks.length; i++) {
-      intentState.renderTasks[i].operatorListChanged();
+    for (const internalRenderTask of intentState.renderTasks) {
+      internalRenderTask.operatorListChanged();
     }
 
     if (operatorListChunk.lastChunk) {
@@ -2658,8 +2631,8 @@ class PDFPageProxy {
         if (intentState.operatorList) {
           intentState.operatorList.lastChunk = true;
 
-          for (let i = 0; i < intentState.renderTasks.length; i++) {
-            intentState.renderTasks[i].operatorListChanged();
+          for (const internalRenderTask of intentState.renderTasks) {
+            internalRenderTask.operatorListChanged();
           }
 
           this._tryCleanup();
@@ -2690,7 +2663,7 @@ class PDFPageProxy {
     }
 
     if (!force) {
-      if (intentState.renderTasks.length !== 0) {
+      if (intentState.renderTasks.size > 0) {
         return;
       }
 
@@ -2708,7 +2681,7 @@ class PDFPageProxy {
       }
     }
 
-    intentState.streamReader.cancel(new _util.AbortException(reason && reason.message));
+    intentState.streamReader.cancel(new _util.AbortException(reason?.message));
     intentState.streamReader = null;
 
     if (this._transport.destroyed) {
@@ -2735,14 +2708,17 @@ class PDFPageProxy {
 exports.PDFPageProxy = PDFPageProxy;
 
 class LoopbackPort {
-  constructor(defer = true) {
+  constructor() {
     this._listeners = [];
-    this._defer = defer;
     this._deferred = Promise.resolve(undefined);
   }
 
   postMessage(obj, transfers) {
     function cloneValue(value) {
+      if (typeof value === "function" || typeof value === "symbol" || value instanceof URL) {
+        throw new Error(`LoopbackPort.postMessage - cannot clone: ${value?.toString()}`);
+      }
+
       if (typeof value !== "object" || value === null) {
         return value;
       }
@@ -2754,9 +2730,7 @@ class LoopbackPort {
       let buffer, result;
 
       if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {
-        const transferable = transfers && transfers.includes(buffer);
-
-        if (transferable) {
+        if (transfers?.includes(buffer)) {
           result = new value.constructor(buffer, value.byteOffset, value.byteLength);
         } else {
           result = new value.constructor(value);
@@ -2766,7 +2740,29 @@ class LoopbackPort {
         return result;
       }
 
-      result = Array.isArray(value) ? [] : {};
+      if (value instanceof Map) {
+        result = new Map();
+        cloned.set(value, result);
+
+        for (const [key, val] of value) {
+          result.set(key, cloneValue(val));
+        }
+
+        return result;
+      }
+
+      if (value instanceof Set) {
+        result = new Set();
+        cloned.set(value, result);
+
+        for (const val of value) {
+          result.add(cloneValue(val));
+        }
+
+        return result;
+      }
+
+      result = Array.isArray(value) ? [] : Object.create(null);
       cloned.set(value, result);
 
       for (const i in value) {
@@ -2781,11 +2777,7 @@ class LoopbackPort {
           continue;
         }
 
-        if (typeof desc.value === "function") {
-          if (value.hasOwnProperty && value.hasOwnProperty(i)) {
-            throw new Error(`LoopbackPort.postMessage - cannot clone: ${value[i]}`);
-          }
-
+        if (typeof desc.value === "function" && !value.hasOwnProperty?.(i)) {
           continue;
         }
 
@@ -2795,25 +2787,15 @@ class LoopbackPort {
       return result;
     }
 
-    if (!this._defer) {
-      this._listeners.forEach(listener => {
-        listener.call(this, {
-          data: obj
-        });
-      });
-
-      return;
-    }
-
     const cloned = new WeakMap();
-    const e = {
+    const event = {
       data: cloneValue(obj)
     };
 
     this._deferred.then(() => {
-      this._listeners.forEach(listener => {
-        listener.call(this, e);
-      });
+      for (const listener of this._listeners) {
+        listener.call(this, event);
+      }
     });
   }
 
@@ -2846,7 +2828,7 @@ const PDFWorker = function PDFWorkerClosure() {
     isWorkerDisabled = true;
     fallbackWorkerSrc = "./pdf.worker.js";
   } else if (typeof document === "object" && "currentScript" in document) {
-    const pdfjsFilePath = document.currentScript && document.currentScript.src;
+    const pdfjsFilePath = document.currentScript?.src;
 
     if (pdfjsFilePath) {
       fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2");
@@ -2873,7 +2855,7 @@ const PDFWorker = function PDFWorkerClosure() {
     let mainWorkerMessageHandler;
 
     try {
-      mainWorkerMessageHandler = globalThis.pdfjsWorker && globalThis.pdfjsWorker.WorkerMessageHandler;
+      mainWorkerMessageHandler = globalThis.pdfjsWorker?.WorkerMessageHandler;
     } catch (ex) {}
 
     return mainWorkerMessageHandler || null;
@@ -3140,13 +3122,21 @@ class WorkerTransport {
     this.fontLoader = new _font_loader.FontLoader({
       docId: loadingTask.docId,
       onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
-      ownerDocument: params.ownerDocument
+      ownerDocument: params.ownerDocument,
+      styleElement: params.styleElement
     });
     this._params = params;
-    this.CMapReaderFactory = new params.CMapReaderFactory({
-      baseUrl: params.cMapUrl,
-      isCompressed: params.cMapPacked
-    });
+
+    if (!params.useWorkerFetch) {
+      this.CMapReaderFactory = new params.CMapReaderFactory({
+        baseUrl: params.cMapUrl,
+        isCompressed: params.cMapPacked
+      });
+      this.StandardFontDataFactory = new params.StandardFontDataFactory({
+        baseUrl: params.standardFontDataUrl
+      });
+    }
+
     this.destroyed = false;
     this.destroyCapability = null;
     this._passwordCapability = null;
@@ -3159,6 +3149,10 @@ class WorkerTransport {
     this.setupMessageHandler();
   }
 
+  get annotationStorage() {
+    return (0, _util.shadow)(this, "annotationStorage", new _annotation_storage.AnnotationStorage());
+  }
+
   destroy() {
     if (this.destroyCapability) {
       return this.destroyCapability.promise;
@@ -3172,17 +3166,26 @@ class WorkerTransport {
     }
 
     const waitOn = [];
-    this.pageCache.forEach(function (page) {
+
+    for (const page of this.pageCache) {
       if (page) {
         waitOn.push(page._destroy());
       }
-    });
+    }
+
     this.pageCache.length = 0;
     this.pagePromises.length = 0;
+
+    if (this.hasOwnProperty("annotationStorage")) {
+      this.annotationStorage.resetModified();
+    }
+
     const terminated = this.messageHandler.sendWithPromise("Terminate", null);
     waitOn.push(terminated);
     Promise.all(waitOn).then(() => {
+      this.commonObjs.clear();
       this.fontLoader.clear();
+      this._hasJSActionsPromise = null;
 
       if (this._networkStream) {
         this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated."));
@@ -3312,6 +3315,8 @@ class WorkerTransport {
       pdfInfo
     }) => {
       this._numPages = pdfInfo.numPages;
+      this._htmlForXfa = pdfInfo.htmlForXfa;
+      delete pdfInfo.htmlForXfa;
 
       loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));
     });
@@ -3411,7 +3416,7 @@ class WorkerTransport {
 
           let fontRegistry = null;
 
-          if (params.pdfBug && globalThis.FontInspector && globalThis.FontInspector.enabled) {
+          if (params.pdfBug && globalThis.FontInspector?.enabled) {
             fontRegistry = {
               registerFont(font, url) {
                 globalThis.FontInspector.fontAdded(font, url);
@@ -3466,12 +3471,16 @@ class WorkerTransport {
           pageProxy.objs.resolve(id, imageData);
           const MAX_IMAGE_SIZE_TO_STORE = 8000000;
 
-          if (imageData && "data" in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
+          if (imageData?.data?.length > MAX_IMAGE_SIZE_TO_STORE) {
             pageProxy.cleanupAfterRender = true;
           }
 
           break;
 
+        case "Pattern":
+          pageProxy.objs.resolve(id, imageData);
+          break;
+
         default:
           throw new Error(`Got unknown object type ${type}`);
       }
@@ -3491,27 +3500,27 @@ class WorkerTransport {
       }
     });
     messageHandler.on("UnsupportedFeature", this._onUnsupportedFeature.bind(this));
-    messageHandler.on("FetchBuiltInCMap", (data, sink) => {
+    messageHandler.on("FetchBuiltInCMap", data => {
       if (this.destroyed) {
-        sink.error(new Error("Worker was destroyed"));
-        return;
+        return Promise.reject(new Error("Worker was destroyed."));
       }
 
-      let fetched = false;
+      if (!this.CMapReaderFactory) {
+        return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` 
parameter."));
+      }
 
-      sink.onPull = () => {
-        if (fetched) {
-          sink.close();
-          return;
-        }
+      return this.CMapReaderFactory.fetch(data);
+    });
+    messageHandler.on("FetchStandardFontData", data => {
+      if (this.destroyed) {
+        return Promise.reject(new Error("Worker was destroyed."));
+      }
 
-        fetched = true;
-        this.CMapReaderFactory.fetch(data).then(function (builtInCMap) {
-          sink.enqueue(builtInCMap, 1, [builtInCMap.cMapData.buffer]);
-        }).catch(function (reason) {
-          sink.error(reason);
-        });
-      };
+      if (!this.StandardFontDataFactory) {
+        return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` 
parameter."));
+      }
+
+      return this.StandardFontDataFactory.fetch(data);
     });
   }
 
@@ -3572,18 +3581,29 @@ class WorkerTransport {
     });
   }
 
-  saveDocument(annotationStorage) {
+  saveDocument() {
     return this.messageHandler.sendWithPromise("SaveDocument", {
+      isPureXfa: !!this._htmlForXfa,
       numPages: this._numPages,
-      annotationStorage: annotationStorage && annotationStorage.getAll() || null,
-      filename: this._fullReader ? this._fullReader.filename : null
+      annotationStorage: this.annotationStorage.serializable,
+      filename: this._fullReader?.filename ?? null
     }).finally(() => {
-      if (annotationStorage) {
-        annotationStorage.resetModified();
-      }
+      this.annotationStorage.resetModified();
     });
   }
 
+  getFieldObjects() {
+    return this.messageHandler.sendWithPromise("GetFieldObjects", null);
+  }
+
+  hasJSActions() {
+    return this._hasJSActionsPromise || (this._hasJSActionsPromise = 
this.messageHandler.sendWithPromise("HasJSActions", null));
+  }
+
+  getCalculationOrderIds() {
+    return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
+  }
+
   getDestinations() {
     return this.messageHandler.sendWithPromise("GetDestinations", null);
   }
@@ -3626,13 +3646,29 @@ class WorkerTransport {
     return this.messageHandler.sendWithPromise("GetJavaScript", null);
   }
 
-  getOutline() {
-    return this.messageHandler.sendWithPromise("GetOutline", null);
+  getDocJSActions() {
+    return this.messageHandler.sendWithPromise("GetDocJSActions", null);
   }
 
-  getOptionalContentConfig() {
-    return this.messageHandler.sendWithPromise("GetOptionalContentConfig", null).then(results => {
-      return new _optional_content_config.OptionalContentConfig(results);
+  getPageJSActions(pageIndex) {
+    return this.messageHandler.sendWithPromise("GetPageJSActions", {
+      pageIndex
+    });
+  }
+
+  getStructTree(pageIndex) {
+    return this.messageHandler.sendWithPromise("GetStructTree", {
+      pageIndex
+    });
+  }
+
+  getOutline() {
+    return this.messageHandler.sendWithPromise("GetOutline", null);
+  }
+
+  getOptionalContentConfig() {
+    return this.messageHandler.sendWithPromise("GetOptionalContentConfig", null).then(results => {
+      return new _optional_content_config.OptionalContentConfig(results);
     });
   }
 
@@ -3645,39 +3681,54 @@ class WorkerTransport {
       return {
         info: results[0],
         metadata: results[1] ? new _metadata.Metadata(results[1]) : null,
-        contentDispositionFilename: this._fullReader ? this._fullReader.filename : null
+        contentDispositionFilename: this._fullReader?.filename ?? null,
+        contentLength: this._fullReader?.contentLength ?? null
       };
     });
   }
 
+  getMarkInfo() {
+    return this.messageHandler.sendWithPromise("GetMarkInfo", null);
+  }
+
   getStats() {
     return this.messageHandler.sendWithPromise("GetStats", null);
   }
 
-  startCleanup() {
-    return this.messageHandler.sendWithPromise("Cleanup", null).then(() => {
-      for (let i = 0, ii = this.pageCache.length; i < ii; i++) {
-        const page = this.pageCache[i];
+  async startCleanup(keepLoadedFonts = false) {
+    await this.messageHandler.sendWithPromise("Cleanup", null);
+
+    if (this.destroyed) {
+      return;
+    }
 
-        if (page) {
-          const cleanupSuccessful = page.cleanup();
+    for (let i = 0, ii = this.pageCache.length; i < ii; i++) {
+      const page = this.pageCache[i];
 
-          if (!cleanupSuccessful) {
-            throw new Error(`startCleanup: Page ${i + 1} is currently rendering.`);
-          }
-        }
+      if (!page) {
+        continue;
       }
 
-      this.commonObjs.clear();
+      const cleanupSuccessful = page.cleanup();
+
+      if (!cleanupSuccessful) {
+        throw new Error(`startCleanup: Page ${i + 1} is currently rendering.`);
+      }
+    }
+
+    this.commonObjs.clear();
+
+    if (!keepLoadedFonts) {
       this.fontLoader.clear();
-    });
+    }
+
+    this._hasJSActionsPromise = null;
   }
 
   get loadingParams() {
     const params = this._params;
     return (0, _util.shadow)(this, "loadingParams", {
-      disableAutoFetch: params.disableAutoFetch,
-      disableFontFace: params.disableFontFace
+      disableAutoFetch: params.disableAutoFetch
     });
   }
 
@@ -3718,7 +3769,7 @@ class PDFObjects {
 
   has(objId) {
     const obj = this._objs[objId];
-    return obj ? obj.resolved : false;
+    return obj?.resolved || false;
   }
 
   resolve(objId, data) {
@@ -3763,7 +3814,6 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
       operatorList,
       pageIndex,
       canvasFactory,
-      webGLContext,
       useRequestAnimationFrame = false,
       pdfBug = false
     }) {
@@ -3775,7 +3825,6 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
       this.operatorList = operatorList;
       this._pageIndex = pageIndex;
       this.canvasFactory = canvasFactory;
-      this.webGLContext = webGLContext;
       this._pdfBug = pdfBug;
       this.running = false;
       this.graphicsReadyCallback = null;
@@ -3784,6 +3833,7 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
       this.cancelled = false;
       this.capability = (0, _util.createPromiseCapability)();
       this.task = new RenderTask(this);
+      this._cancelBound = this.cancel.bind(this);
       this._continueBound = this._continue.bind(this);
       this._scheduleNextBound = this._scheduleNext.bind(this);
       this._nextBound = this._next.bind(this);
@@ -3810,7 +3860,7 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
         canvasInRendering.add(this._canvas);
       }
 
-      if (this._pdfBug && globalThis.StepperManager && globalThis.StepperManager.enabled) {
+      if (this._pdfBug && globalThis.StepperManager?.enabled) {
         this.stepper = globalThis.StepperManager.create(this._pageIndex);
         this.stepper.init(this.operatorList);
         this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
@@ -3823,7 +3873,7 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
         imageLayer,
         background
       } = this.params;
-      this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, 
this.webGLContext, imageLayer, optionalContentConfig);
+      this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, 
imageLayer, optionalContentConfig);
       this.gfx.beginDrawing({
         transform,
         viewport,
@@ -3890,10 +3940,10 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
     _scheduleNext() {
       if (this._useRequestAnimationFrame) {
         window.requestAnimationFrame(() => {
-          this._nextBound().catch(this.cancel.bind(this));
+          this._nextBound().catch(this._cancelBound);
         });
       } else {
-        Promise.resolve().then(this._nextBound).catch(this.cancel.bind(this));
+        Promise.resolve().then(this._nextBound).catch(this._cancelBound);
       }
     }
 
@@ -3924,21 +3974,20 @@ const InternalRenderTask = function InternalRenderTaskClosure() {
   return InternalRenderTask;
 }();
 
-const version = '2.6.347';
+const version = '2.10.377';
 exports.version = version;
-const build = '3be9c65f';
+const build = '156762c48';
 exports.build = build;
 
 /***/ }),
-/* 6 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 7 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.FontLoader = exports.FontFaceObject = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -3947,7 +3996,8 @@ class BaseFontLoader {
   constructor({
     docId,
     onUnsupportedFeature,
-    ownerDocument = globalThis.document
+    ownerDocument = globalThis.document,
+    styleElement = null
   }) {
     if (this.constructor === BaseFontLoader) {
       (0, _util.unreachable)("Cannot initialize BaseFontLoader.");
@@ -3981,9 +4031,10 @@ class BaseFontLoader {
   }
 
   clear() {
-    this.nativeFontFaces.forEach(nativeFontFace => {
+    for (const nativeFontFace of this.nativeFontFaces) {
       this._document.fonts.delete(nativeFontFace);
-    });
+    }
+
     this.nativeFontFaces.length = 0;
 
     if (this.styleElement) {
@@ -4043,8 +4094,8 @@ class BaseFontLoader {
   }
 
   get isFontLoadingAPISupported() {
-    const supported = typeof this._document !== "undefined" && !!this._document.fonts;
-    return (0, _util.shadow)(this, "isFontLoadingAPISupported", supported);
+    const hasFonts = !!this._document?.fonts;
+    return (0, _util.shadow)(this, "isFontLoadingAPISupported", hasFonts);
   }
 
   get isSyncFontLoadingSupported() {
@@ -4082,7 +4133,7 @@ exports.FontLoader = FontLoader;
       } else {
         const m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);
 
-        if (m && m[1] >= 14) {
+        if (m?.[1] >= 14) {
           supported = true;
         }
       }
@@ -4183,8 +4234,8 @@ exports.FontLoader = FontLoader;
       this.insertRule(rule);
       const names = [];
 
-      for (i = 0, ii = fonts.length; i < ii; i++) {
-        names.push(fonts[i].loadedName);
+      for (const font of fonts) {
+        names.push(font.loadedName);
       }
 
       names.push(loadTestFontId);
@@ -4196,11 +4247,11 @@ exports.FontLoader = FontLoader;
       div.style.position = "absolute";
       div.style.top = div.style.left = "0px";
 
-      for (i = 0, ii = names.length; i < ii; ++i) {
+      for (const name of names) {
         const span = this._document.createElement("span");
 
         span.textContent = "Hi";
-        span.style.fontFamily = names[i];
+        span.style.fontFamily = name;
         div.appendChild(span);
       }
 
@@ -4221,7 +4272,7 @@ class FontFaceObject {
     isEvalSupported = true,
     disableFontFace = false,
     ignoreErrors = false,
-    onUnsupportedFeature = null,
+    onUnsupportedFeature,
     fontRegistry = null
   }) {
     this.compiledGlyphs = Object.create(null);
@@ -4242,7 +4293,21 @@ class FontFaceObject {
       return null;
     }
 
-    const nativeFontFace = new FontFace(this.loadedName, this.data, {});
+    let nativeFontFace;
+
+    if (!this.cssFontInfo) {
+      nativeFontFace = new FontFace(this.loadedName, this.data, {});
+    } else {
+      const css = {
+        weight: this.cssFontInfo.fontWeight
+      };
+
+      if (this.cssFontInfo.italicAngle) {
+        css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;
+      }
+
+      nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css);
+    }
 
     if (this.fontRegistry) {
       this.fontRegistry.registerFont(this);
@@ -4256,9 +4321,21 @@ class FontFaceObject {
       return null;
     }
 
-    const data = (0, _util.bytesToString)(new Uint8Array(this.data));
+    const data = (0, _util.bytesToString)(this.data);
     const url = `url(data:${this.mimetype};base64,${btoa(data)});`;
-    const rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`;
+    let rule;
+
+    if (!this.cssFontInfo) {
+      rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`;
+    } else {
+      let css = `font-weight: ${this.cssFontInfo.fontWeight};`;
+
+      if (this.cssFontInfo.italicAngle) {
+        css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;
+      }
+
+      rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`;
+    }
 
     if (this.fontRegistry) {
       this.fontRegistry.registerFont(this, url);
@@ -4272,7 +4349,7 @@ class FontFaceObject {
       return this.compiledGlyphs[character];
     }
 
-    let cmds, current;
+    let cmds;
 
     try {
       cmds = objs.get(this.loadedName + "_path_" + character);
@@ -4281,39 +4358,27 @@ class FontFaceObject {
         throw ex;
       }
 
-      if (this._onUnsupportedFeature) {
-        this._onUnsupportedFeature({
-          featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath
-        });
-      }
+      this._onUnsupportedFeature({
+        featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath
+      });
 
       (0, _util.warn)(`getPathGenerator - ignoring character: "${ex}".`);
       return this.compiledGlyphs[character] = function (c, size) {};
     }
 
     if (this.isEvalSupported && _util.IsEvalSupportedCached.value) {
-      let args,
-          js = "";
-
-      for (let i = 0, ii = cmds.length; i < ii; i++) {
-        current = cmds[i];
-
-        if (current.args !== undefined) {
-          args = current.args.join(",");
-        } else {
-          args = "";
-        }
+      const jsBuf = [];
 
-        js += "c." + current.cmd + "(" + args + ");\n";
+      for (const current of cmds) {
+        const args = current.args !== undefined ? current.args.join(",") : "";
+        jsBuf.push("c.", current.cmd, "(", args, ");\n");
       }
 
-      return this.compiledGlyphs[character] = new Function("c", "size", js);
+      return this.compiledGlyphs[character] = new Function("c", "size", jsBuf.join(""));
     }
 
     return this.compiledGlyphs[character] = function (c, size) {
-      for (let i = 0, ii = cmds.length; i < ii; i++) {
-        current = cmds[i];
-
+      for (const current of cmds) {
         if (current.cmd === "scale") {
           current.args = [size, -size];
         }
@@ -4328,18 +4393,17 @@ class FontFaceObject {
 exports.FontFaceObject = FontFaceObject;
 
 /***/ }),
-/* 7 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 8 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.NodeCMapReaderFactory = exports.NodeCanvasFactory = void 0;
+}));
+exports.NodeStandardFontDataFactory = exports.NodeCMapReaderFactory = exports.NodeCanvasFactory = void 0;
 
-var _display_utils = __w_pdfjs_require__(1);
+var _base_factory = __w_pdfjs_require__(5);
 
 var _is_node = __w_pdfjs_require__(4);
 
@@ -4359,58 +4423,70 @@ let NodeCMapReaderFactory = class {
 
 };
 exports.NodeCMapReaderFactory = NodeCMapReaderFactory;
+let NodeStandardFontDataFactory = class {
+  constructor() {
+    (0, _util.unreachable)("Not implemented: NodeStandardFontDataFactory");
+  }
+
+};
+exports.NodeStandardFontDataFactory = NodeStandardFontDataFactory;
 
 if (_is_node.isNodeJS) {
-  exports.NodeCanvasFactory = NodeCanvasFactory = class extends _display_utils.BaseCanvasFactory {
-    create(width, height) {
-      if (width <= 0 || height <= 0) {
-        throw new Error("Invalid canvas size");
-      }
+  const fetchData = function (url) {
+    return new Promise((resolve, reject) => {
+      const fs = require("fs");
 
+      fs.readFile(url, (error, data) => {
+        if (error || !data) {
+          reject(new Error(error));
+          return;
+        }
+
+        resolve(new Uint8Array(data));
+      });
+    });
+  };
+
+  exports.NodeCanvasFactory = NodeCanvasFactory = class extends _base_factory.BaseCanvasFactory {
+    _createCanvas(width, height) {
       const Canvas = require("canvas");
 
-      const canvas = Canvas.createCanvas(width, height);
-      return {
-        canvas,
-        context: canvas.getContext("2d")
-      };
+      return Canvas.createCanvas(width, height);
     }
 
   };
-  exports.NodeCMapReaderFactory = NodeCMapReaderFactory = class extends _display_utils.BaseCMapReaderFactory 
{
+  exports.NodeCMapReaderFactory = NodeCMapReaderFactory = class extends _base_factory.BaseCMapReaderFactory {
     _fetchData(url, compressionType) {
-      return new Promise((resolve, reject) => {
-        const fs = require("fs");
-
-        fs.readFile(url, (error, data) => {
-          if (error || !data) {
-            reject(new Error(error));
-            return;
-          }
-
-          resolve({
-            cMapData: new Uint8Array(data),
-            compressionType
-          });
-        });
+      return fetchData(url).then(data => {
+        return {
+          cMapData: data,
+          compressionType
+        };
       });
     }
 
   };
+  exports.NodeStandardFontDataFactory = NodeStandardFontDataFactory = class extends 
_base_factory.BaseStandardFontDataFactory {
+    _fetchData(url) {
+      return fetchData(url);
+    }
+
+  };
 }
 
 /***/ }),
-/* 8 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 9 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.AnnotationStorage = void 0;
 
+var _util = __w_pdfjs_require__(2);
+
 class AnnotationStorage {
   constructor() {
     this._storage = new Map();
@@ -4419,30 +4495,37 @@ class AnnotationStorage {
     this.onResetModified = null;
   }
 
-  getOrCreateValue(key, defaultValue) {
-    if (this._storage.has(key)) {
-      return this._storage.get(key);
-    }
-
-    this._storage.set(key, defaultValue);
+  getValue(key, defaultValue) {
+    const obj = this._storage.get(key);
 
-    return defaultValue;
+    return obj !== undefined ? obj : defaultValue;
   }
 
   setValue(key, value) {
-    if (this._storage.get(key) !== value) {
-      this._setModified();
+    const obj = this._storage.get(key);
+
+    let modified = false;
+
+    if (obj !== undefined) {
+      for (const [entry, val] of Object.entries(value)) {
+        if (obj[entry] !== val) {
+          modified = true;
+          obj[entry] = val;
+        }
+      }
+    } else {
+      this._storage.set(key, value);
+
+      modified = true;
     }
 
-    this._storage.set(key, value);
+    if (modified) {
+      this._setModified();
+    }
   }
 
   getAll() {
-    if (this._storage.size === 0) {
-      return null;
-    }
-
-    return Object.fromEntries(this._storage);
+    return this._storage.size > 0 ? (0, _util.objectFromMap)(this._storage) : null;
   }
 
   get size() {
@@ -4469,209 +4552,199 @@ class AnnotationStorage {
     }
   }
 
+  get serializable() {
+    return this._storage.size > 0 ? this._storage : null;
+  }
+
 }
 
 exports.AnnotationStorage = AnnotationStorage;
 
-/***/ }),
-/* 9 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.apiCompatibilityParams = void 0;
-
-var _is_node = __w_pdfjs_require__(4);
-
-const compatibilityParams = Object.create(null);
-{
-  (function checkFontFace() {
-    if (_is_node.isNodeJS) {
-      compatibilityParams.disableFontFace = true;
-    }
-  })();
-}
-const apiCompatibilityParams = Object.freeze(compatibilityParams);
-exports.apiCompatibilityParams = apiCompatibilityParams;
-
 /***/ }),
 /* 10 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.CanvasGraphics = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
 var _pattern_helper = __w_pdfjs_require__(11);
 
-var MIN_FONT_SIZE = 16;
-var MAX_FONT_SIZE = 100;
-var MAX_GROUP_SIZE = 4096;
-var MIN_WIDTH_FACTOR = 0.65;
-var COMPILE_TYPE3_GLYPHS = true;
-var MAX_SIZE_TO_COMPILE = 1000;
-var FULL_CHUNK_HEIGHT = 16;
+const MIN_FONT_SIZE = 16;
+const MAX_FONT_SIZE = 100;
+const MAX_GROUP_SIZE = 4096;
+const COMPILE_TYPE3_GLYPHS = true;
+const MAX_SIZE_TO_COMPILE = 1000;
+const FULL_CHUNK_HEIGHT = 16;
+const LINEWIDTH_SCALE_FACTOR = 1.000001;
 
 function addContextCurrentTransform(ctx) {
-  if (!ctx.mozCurrentTransform) {
-    ctx._originalSave = ctx.save;
-    ctx._originalRestore = ctx.restore;
-    ctx._originalRotate = ctx.rotate;
-    ctx._originalScale = ctx.scale;
-    ctx._originalTranslate = ctx.translate;
-    ctx._originalTransform = ctx.transform;
-    ctx._originalSetTransform = ctx.setTransform;
-    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
-    ctx._transformStack = [];
-    Object.defineProperty(ctx, "mozCurrentTransform", {
-      get: function getCurrentTransform() {
-        return this._transformMatrix;
-      }
-    });
-    Object.defineProperty(ctx, "mozCurrentTransformInverse", {
-      get: function getCurrentTransformInverse() {
-        var m = this._transformMatrix;
-        var a = m[0],
-            b = m[1],
-            c = m[2],
-            d = m[3],
-            e = m[4],
-            f = m[5];
-        var ad_bc = a * d - b * c;
-        var bc_ad = b * c - a * d;
-        return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / 
ad_bc];
+  if (ctx.mozCurrentTransform) {
+    return;
+  }
+
+  ctx._originalSave = ctx.save;
+  ctx._originalRestore = ctx.restore;
+  ctx._originalRotate = ctx.rotate;
+  ctx._originalScale = ctx.scale;
+  ctx._originalTranslate = ctx.translate;
+  ctx._originalTransform = ctx.transform;
+  ctx._originalSetTransform = ctx.setTransform;
+  ctx._originalResetTransform = ctx.resetTransform;
+  ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
+  ctx._transformStack = [];
+
+  try {
+    const desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ctx), "lineWidth");
+    ctx._setLineWidth = desc.set;
+    ctx._getLineWidth = desc.get;
+    Object.defineProperty(ctx, "lineWidth", {
+      set: function setLineWidth(width) {
+        this._setLineWidth(width * LINEWIDTH_SCALE_FACTOR);
+      },
+      get: function getLineWidth() {
+        return this._getLineWidth();
       }
     });
+  } catch (_) {}
 
-    ctx.save = function ctxSave() {
-      var old = this._transformMatrix;
+  Object.defineProperty(ctx, "mozCurrentTransform", {
+    get: function getCurrentTransform() {
+      return this._transformMatrix;
+    }
+  });
+  Object.defineProperty(ctx, "mozCurrentTransformInverse", {
+    get: function getCurrentTransformInverse() {
+      const [a, b, c, d, e, f] = this._transformMatrix;
+      const ad_bc = a * d - b * c;
+      const bc_ad = b * c - a * d;
+      return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc];
+    }
+  });
 
-      this._transformStack.push(old);
+  ctx.save = function ctxSave() {
+    const old = this._transformMatrix;
 
-      this._transformMatrix = old.slice(0, 6);
+    this._transformStack.push(old);
 
-      this._originalSave();
-    };
+    this._transformMatrix = old.slice(0, 6);
 
-    ctx.restore = function ctxRestore() {
-      var prev = this._transformStack.pop();
+    this._originalSave();
+  };
 
-      if (prev) {
-        this._transformMatrix = prev;
+  ctx.restore = function ctxRestore() {
+    const prev = this._transformStack.pop();
 
-        this._originalRestore();
-      }
-    };
+    if (prev) {
+      this._transformMatrix = prev;
 
-    ctx.translate = function ctxTranslate(x, y) {
-      var m = this._transformMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
+      this._originalRestore();
+    }
+  };
 
-      this._originalTranslate(x, y);
-    };
+  ctx.translate = function ctxTranslate(x, y) {
+    const m = this._transformMatrix;
+    m[4] = m[0] * x + m[2] * y + m[4];
+    m[5] = m[1] * x + m[3] * y + m[5];
 
-    ctx.scale = function ctxScale(x, y) {
-      var m = this._transformMatrix;
-      m[0] = m[0] * x;
-      m[1] = m[1] * x;
-      m[2] = m[2] * y;
-      m[3] = m[3] * y;
+    this._originalTranslate(x, y);
+  };
 
-      this._originalScale(x, y);
-    };
+  ctx.scale = function ctxScale(x, y) {
+    const m = this._transformMatrix;
+    m[0] *= x;
+    m[1] *= x;
+    m[2] *= y;
+    m[3] *= y;
 
-    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
-      var m = this._transformMatrix;
-      this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + 
m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];
+    this._originalScale(x, y);
+  };
 
-      ctx._originalTransform(a, b, c, d, e, f);
-    };
+  ctx.transform = function ctxTransform(a, b, c, d, e, f) {
+    const m = this._transformMatrix;
+    this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] 
* d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];
 
-    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
-      this._transformMatrix = [a, b, c, d, e, f];
+    ctx._originalTransform(a, b, c, d, e, f);
+  };
 
-      ctx._originalSetTransform(a, b, c, d, e, f);
-    };
+  ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
+    this._transformMatrix = [a, b, c, d, e, f];
 
-    ctx.rotate = function ctxRotate(angle) {
-      var cosValue = Math.cos(angle);
-      var sinValue = Math.sin(angle);
-      var m = this._transformMatrix;
-      this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * 
-sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];
+    ctx._originalSetTransform(a, b, c, d, e, f);
+  };
 
-      this._originalRotate(angle);
-    };
-  }
+  ctx.resetTransform = function ctxResetTransform() {
+    this._transformMatrix = [1, 0, 0, 1, 0, 0];
+
+    ctx._originalResetTransform();
+  };
+
+  ctx.rotate = function ctxRotate(angle) {
+    const cosValue = Math.cos(angle);
+    const sinValue = Math.sin(angle);
+    const m = this._transformMatrix;
+    this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * 
-sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];
+
+    this._originalRotate(angle);
+  };
 }
 
-var CachedCanvases = function CachedCanvasesClosure() {
-  function CachedCanvases(canvasFactory) {
+class CachedCanvases {
+  constructor(canvasFactory) {
     this.canvasFactory = canvasFactory;
     this.cache = Object.create(null);
   }
 
-  CachedCanvases.prototype = {
-    getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) {
-      var canvasEntry;
+  getCanvas(id, width, height, trackTransform) {
+    let canvasEntry;
 
-      if (this.cache[id] !== undefined) {
-        canvasEntry = this.cache[id];
-        this.canvasFactory.reset(canvasEntry, width, height);
-        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
-      } else {
-        canvasEntry = this.canvasFactory.create(width, height);
-        this.cache[id] = canvasEntry;
-      }
+    if (this.cache[id] !== undefined) {
+      canvasEntry = this.cache[id];
+      this.canvasFactory.reset(canvasEntry, width, height);
+      canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
+    } else {
+      canvasEntry = this.canvasFactory.create(width, height);
+      this.cache[id] = canvasEntry;
+    }
 
-      if (trackTransform) {
-        addContextCurrentTransform(canvasEntry.context);
-      }
+    if (trackTransform) {
+      addContextCurrentTransform(canvasEntry.context);
+    }
 
-      return canvasEntry;
-    },
+    return canvasEntry;
+  }
 
-    clear() {
-      for (var id in this.cache) {
-        var canvasEntry = this.cache[id];
-        this.canvasFactory.destroy(canvasEntry);
-        delete this.cache[id];
-      }
+  clear() {
+    for (const id in this.cache) {
+      const canvasEntry = this.cache[id];
+      this.canvasFactory.destroy(canvasEntry);
+      delete this.cache[id];
     }
+  }
 
-  };
-  return CachedCanvases;
-}();
+}
 
 function compileType3Glyph(imgData) {
-  var POINT_TO_PROCESS_LIMIT = 1000;
-  var width = imgData.width,
-      height = imgData.height;
-  var i,
-      j,
-      j0,
-      width1 = width + 1;
-  var points = new Uint8Array(width1 * (height + 1));
-  var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
-  var lineSize = width + 7 & ~7,
-      data0 = imgData.data;
-  var data = new Uint8Array(lineSize * height),
-      pos = 0,
-      ii;
+  const POINT_TO_PROCESS_LIMIT = 1000;
+  const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
+  const width = imgData.width,
+        height = imgData.height,
+        width1 = width + 1;
+  let i, ii, j, j0;
+  const points = new Uint8Array(width1 * (height + 1));
+  const lineSize = width + 7 & ~7,
+        data0 = imgData.data;
+  const data = new Uint8Array(lineSize * height);
+  let pos = 0;
 
   for (i = 0, ii = data0.length; i < ii; i++) {
-    var mask = 128,
-        elem = data0[i];
+    const elem = data0[i];
+    let mask = 128;
 
     while (mask > 0) {
       data[pos++] = elem & mask ? 0 : 255;
@@ -4679,7 +4752,7 @@ function compileType3Glyph(imgData) {
     }
   }
 
-  var count = 0;
+  let count = 0;
   pos = 0;
 
   if (data[pos] !== 0) {
@@ -4710,7 +4783,7 @@ function compileType3Glyph(imgData) {
       ++count;
     }
 
-    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
+    let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
 
     for (j = 1; j < width; j++) {
       sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);
@@ -4759,12 +4832,12 @@ function compileType3Glyph(imgData) {
     return null;
   }
 
-  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
-  var outlines = [];
+  const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
+  const outlines = [];
 
   for (i = 0; count && i <= height; i++) {
-    var p = i * width1;
-    var end = p + width;
+    let p = i * width1;
+    const end = p + width;
 
     while (p < end && !points[p]) {
       p++;
@@ -4774,19 +4847,18 @@ function compileType3Glyph(imgData) {
       continue;
     }
 
-    var coords = [p % width1, i];
-    var type = points[p],
-        p0 = p,
-        pp;
+    const coords = [p % width1, i];
+    const p0 = p;
+    let type = points[p];
 
     do {
-      var step = steps[type];
+      const step = steps[type];
 
       do {
         p += step;
       } while (!points[p]);
 
-      pp = points[p];
+      const pp = points[p];
 
       if (pp !== 5 && pp !== 10) {
         type = pp;
@@ -4796,8 +4868,7 @@ function compileType3Glyph(imgData) {
         points[p] &= type >> 2 | type << 2;
       }
 
-      coords.push(p % width1);
-      coords.push(p / width1 | 0);
+      coords.push(p % width1, p / width1 | 0);
 
       if (!points[p]) {
         --count;
@@ -4808,14 +4879,14 @@ function compileType3Glyph(imgData) {
     --i;
   }
 
-  var drawOutline = function (c) {
+  const drawOutline = function (c) {
     c.save();
     c.scale(1 / width, -1 / height);
     c.translate(0, -height);
     c.beginPath();
 
     for (let k = 0, kk = outlines.length; k < kk; k++) {
-      var o = outlines[k];
+      const o = outlines[k];
       c.moveTo(o[0], o[1]);
 
       for (let l = 2, ll = o.length; l < ll; l += 2) {
@@ -4831,8 +4902,8 @@ function compileType3Glyph(imgData) {
   return drawOutline;
 }
 
-var CanvasExtraState = function CanvasExtraStateClosure() {
-  function CanvasExtraState() {
+class CanvasExtraState {
+  constructor() {
     this.alphaIsShape = false;
     this.fontSize = 0;
     this.fontSizeScale = 1;
@@ -4860,54 +4931,20 @@ var CanvasExtraState = function CanvasExtraStateClosure() {
     this.transferMaps = null;
   }
 
-  CanvasExtraState.prototype = {
-    clone: function CanvasExtraState_clone() {
-      return Object.create(this);
-    },
-    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-  };
-  return CanvasExtraState;
-}();
+  clone() {
+    return Object.create(this);
+  }
 
-var CanvasGraphics = function CanvasGraphicsClosure() {
-  var EXECUTION_TIME = 15;
-  var EXECUTION_STEPS = 10;
-
-  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, imageLayer, 
optionalContentConfig) {
-    this.ctx = canvasCtx;
-    this.current = new CanvasExtraState();
-    this.stateStack = [];
-    this.pendingClip = null;
-    this.pendingEOFill = false;
-    this.res = null;
-    this.xobjs = null;
-    this.commonObjs = commonObjs;
-    this.objs = objs;
-    this.canvasFactory = canvasFactory;
-    this.webGLContext = webGLContext;
-    this.imageLayer = imageLayer;
-    this.groupStack = [];
-    this.processingType3 = null;
-    this.baseTransform = null;
-    this.baseTransformStack = [];
-    this.groupLevel = 0;
-    this.smaskStack = [];
-    this.smaskCounter = 0;
-    this.tempSMask = null;
-    this.contentVisible = true;
-    this.markedContentStack = [];
-    this.optionalContentConfig = optionalContentConfig;
-    this.cachedCanvases = new CachedCanvases(this.canvasFactory);
+  setCurrentPoint(x, y) {
+    this.x = x;
+    this.y = y;
+  }
 
-    if (canvasCtx) {
-      addContextCurrentTransform(canvasCtx);
-    }
+}
 
-    this._cachedGetSinglePixelWidth = null;
-  }
+const CanvasGraphics = function CanvasGraphicsClosure() {
+  const EXECUTION_TIME = 15;
+  const EXECUTION_STEPS = 10;
 
   function putBinaryImageData(ctx, imgData, transferMaps = null) {
     if (typeof ImageData !== "undefined" && imgData instanceof ImageData) {
@@ -4915,17 +4952,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
       return;
     }
 
-    var height = imgData.height,
-        width = imgData.width;
-    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
-    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
-    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
-    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
-    var srcPos = 0,
+    const height = imgData.height,
+          width = imgData.width;
+    const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+    const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+    const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+    const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+    let srcPos = 0,
         destPos;
-    var src = imgData.data;
-    var dest = chunkImgData.data;
-    var i, j, thisChunkHeight, elemsInThisChunk;
+    const src = imgData.data;
+    const dest = chunkImgData.data;
+    let i, j, thisChunkHeight, elemsInThisChunk;
     let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray;
 
     if (transferMaps) {
@@ -4947,12 +4984,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
     }
 
     if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {
-      var srcLength = src.byteLength;
-      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
-      var dest32DataLength = dest32.length;
-      var fullSrcDiff = width + 7 >> 3;
-      var white = 0xffffffff;
-      var black = _util.IsLittleEndianCached.value ? 0xff000000 : 0x000000ff;
+      const srcLength = src.byteLength;
+      const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
+      const dest32DataLength = dest32.length;
+      const fullSrcDiff = width + 7 >> 3;
+      let white = 0xffffffff;
+      let black = _util.IsLittleEndianCached.value ? 0xff000000 : 0x000000ff;
 
       if (transferMapGray) {
         if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) {
@@ -4965,12 +5002,12 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
         destPos = 0;
 
         for (j = 0; j < thisChunkHeight; j++) {
-          var srcDiff = srcLength - srcPos;
+          const srcDiff = srcLength - srcPos;
           let k = 0;
-          var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;
-          var kEndUnrolled = kEnd & ~7;
-          var mask = 0;
-          var srcByte = 0;
+          const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;
+          const kEndUnrolled = kEnd & ~7;
+          let mask = 0;
+          let srcByte = 0;
 
           for (; k < kEndUnrolled; k += 8) {
             srcByte = src[srcPos++];
@@ -5096,26 +5133,27 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
   }
 
   function putBinaryImageMask(ctx, imgData) {
-    var height = imgData.height,
-        width = imgData.width;
-    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
-    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
-    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
-    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
-    var srcPos = 0;
-    var src = imgData.data;
-    var dest = chunkImgData.data;
-
-    for (var i = 0; i < totalChunks; i++) {
-      var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
-      var destPos = 3;
-
-      for (var j = 0; j < thisChunkHeight; j++) {
-        var mask = 0;
-
-        for (var k = 0; k < width; k++) {
+    const height = imgData.height,
+          width = imgData.width;
+    const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+    const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+    const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+    const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+    let srcPos = 0;
+    const src = imgData.data;
+    const dest = chunkImgData.data;
+
+    for (let i = 0; i < totalChunks; i++) {
+      const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
+      let destPos = 3;
+
+      for (let j = 0; j < thisChunkHeight; j++) {
+        let elem,
+            mask = 0;
+
+        for (let k = 0; k < width; k++) {
           if (!mask) {
-            var elem = src[srcPos++];
+            elem = src[srcPos++];
             mask = 128;
           }
 
@@ -5130,10 +5168,10 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
   }
 
   function copyCtxState(sourceCtx, destCtx) {
-    var properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", 
"lineJoin", "miterLimit", "globalCompositeOperation", "font"];
+    const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", 
"lineJoin", "miterLimit", "globalCompositeOperation", "font"];
 
-    for (var i = 0, ii = properties.length; i < ii; i++) {
-      var property = properties[i];
+    for (let i = 0, ii = properties.length; i < ii; i++) {
+      const property = properties[i];
 
       if (sourceCtx[property] !== undefined) {
         destCtx[property] = sourceCtx[property];
@@ -5165,17 +5203,17 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
   }
 
   function composeSMaskBackdrop(bytes, r0, g0, b0) {
-    var length = bytes.length;
+    const length = bytes.length;
 
-    for (var i = 3; i < length; i += 4) {
-      var alpha = bytes[i];
+    for (let i = 3; i < length; i += 4) {
+      const alpha = bytes[i];
 
       if (alpha === 0) {
         bytes[i - 3] = r0;
         bytes[i - 2] = g0;
         bytes[i - 1] = b0;
       } else if (alpha < 255) {
-        var alpha_ = 255 - alpha;
+        const alpha_ = 255 - alpha;
         bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;
         bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;
         bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;
@@ -5184,30 +5222,30 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
   }
 
   function composeSMaskAlpha(maskData, layerData, transferMap) {
-    var length = maskData.length;
-    var scale = 1 / 255;
+    const length = maskData.length;
+    const scale = 1 / 255;
 
-    for (var i = 3; i < length; i += 4) {
-      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
+    for (let i = 3; i < length; i += 4) {
+      const alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
       layerData[i] = layerData[i] * alpha * scale | 0;
     }
   }
 
   function composeSMaskLuminosity(maskData, layerData, transferMap) {
-    var length = maskData.length;
+    const length = maskData.length;
 
-    for (var i = 3; i < length; i += 4) {
-      var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;
+    for (let i = 3; i < length; i += 4) {
+      const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;
       layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;
     }
   }
 
   function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) {
-    var hasBackdrop = !!backdrop;
-    var r0 = hasBackdrop ? backdrop[0] : 0;
-    var g0 = hasBackdrop ? backdrop[1] : 0;
-    var b0 = hasBackdrop ? backdrop[2] : 0;
-    var composeFn;
+    const hasBackdrop = !!backdrop;
+    const r0 = hasBackdrop ? backdrop[0] : 0;
+    const g0 = hasBackdrop ? backdrop[1] : 0;
+    const b0 = hasBackdrop ? backdrop[2] : 0;
+    let composeFn;
 
     if (subtype === "Luminosity") {
       composeFn = composeSMaskLuminosity;
@@ -5215,13 +5253,13 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
       composeFn = composeSMaskAlpha;
     }
 
-    var PIXELS_TO_PROCESS = 1048576;
-    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
+    const PIXELS_TO_PROCESS = 1048576;
+    const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
 
-    for (var row = 0; row < height; row += chunkSize) {
-      var chunkHeight = Math.min(chunkSize, height - row);
-      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
-      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
+    for (let row = 0; row < height; row += chunkSize) {
+      const chunkHeight = Math.min(chunkSize, height - row);
+      const maskData = maskCtx.getImageData(0, row, width, chunkHeight);
+      const layerData = layerCtx.getImageData(0, row, width, chunkHeight);
 
       if (hasBackdrop) {
         composeSMaskBackdrop(maskData.data, r0, g0, b0);
@@ -5232,50 +5270,68 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
     }
   }
 
-  function composeSMask(ctx, smask, layerCtx, webGLContext) {
-    var mask = smask.canvas;
-    var maskCtx = smask.context;
+  function composeSMask(ctx, smask, layerCtx) {
+    const mask = smask.canvas;
+    const maskCtx = smask.context;
     ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY);
-    var backdrop = smask.backdrop || null;
-
-    if (!smask.transferMap && webGLContext.isEnabled) {
-      const composed = webGLContext.composeSMask({
-        layer: layerCtx.canvas,
-        mask,
-        properties: {
-          subtype: smask.subtype,
-          backdrop
-        }
-      });
-      ctx.setTransform(1, 0, 0, 1, 0, 0);
-      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
-      return;
-    }
-
-    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, 
smask.transferMap);
+    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, smask.backdrop, 
smask.transferMap);
     ctx.drawImage(mask, 0, 0);
   }
 
-  var LINE_CAP_STYLES = ["butt", "round", "square"];
-  var LINE_JOIN_STYLES = ["miter", "round", "bevel"];
-  var NORMAL_CLIP = {};
-  var EO_CLIP = {};
-  CanvasGraphics.prototype = {
+  const LINE_CAP_STYLES = ["butt", "round", "square"];
+  const LINE_JOIN_STYLES = ["miter", "round", "bevel"];
+  const NORMAL_CLIP = {};
+  const EO_CLIP = {};
+
+  class CanvasGraphics {
+    constructor(canvasCtx, commonObjs, objs, canvasFactory, imageLayer, optionalContentConfig) {
+      this.ctx = canvasCtx;
+      this.current = new CanvasExtraState();
+      this.stateStack = [];
+      this.pendingClip = null;
+      this.pendingEOFill = false;
+      this.res = null;
+      this.xobjs = null;
+      this.commonObjs = commonObjs;
+      this.objs = objs;
+      this.canvasFactory = canvasFactory;
+      this.imageLayer = imageLayer;
+      this.groupStack = [];
+      this.processingType3 = null;
+      this.baseTransform = null;
+      this.baseTransformStack = [];
+      this.groupLevel = 0;
+      this.smaskStack = [];
+      this.smaskCounter = 0;
+      this.tempSMask = null;
+      this.contentVisible = true;
+      this.markedContentStack = [];
+      this.optionalContentConfig = optionalContentConfig;
+      this.cachedCanvases = new CachedCanvases(this.canvasFactory);
+      this.cachedPatterns = new Map();
+
+      if (canvasCtx) {
+        addContextCurrentTransform(canvasCtx);
+      }
+
+      this._cachedGetSinglePixelWidth = null;
+    }
+
     beginDrawing({
       transform,
       viewport,
       transparency = false,
       background = null
     }) {
-      var width = this.ctx.canvas.width;
-      var height = this.ctx.canvas.height;
+      const width = this.ctx.canvas.width;
+      const height = this.ctx.canvas.height;
       this.ctx.save();
       this.ctx.fillStyle = background || "rgb(255, 255, 255)";
       this.ctx.fillRect(0, 0, width, height);
       this.ctx.restore();
 
       if (transparency) {
-        var transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height, true);
+        const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height, true);
         this.compositeCtx = this.ctx;
         this.transparentCanvas = transparentCanvas.canvas;
         this.ctx = transparentCanvas.context;
@@ -5292,28 +5348,29 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
 
       this.ctx.transform.apply(this.ctx, viewport.transform);
       this.baseTransform = this.ctx.mozCurrentTransform.slice();
+      this._combinedScaleFactor = Math.hypot(this.baseTransform[0], this.baseTransform[2]);
 
       if (this.imageLayer) {
         this.imageLayer.beginLayout();
       }
-    },
+    }
 
-    executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, 
continueCallback, stepper) {
-      var argsArray = operatorList.argsArray;
-      var fnArray = operatorList.fnArray;
-      var i = executionStartIdx || 0;
-      var argsArrayLen = argsArray.length;
+    executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {
+      const argsArray = operatorList.argsArray;
+      const fnArray = operatorList.fnArray;
+      let i = executionStartIdx || 0;
+      const argsArrayLen = argsArray.length;
 
       if (argsArrayLen === i) {
         return i;
       }
 
-      var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function";
-      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
-      var steps = 0;
-      var commonObjs = this.commonObjs;
-      var objs = this.objs;
-      var fnId;
+      const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function";
+      const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
+      let steps = 0;
+      const commonObjs = this.commonObjs;
+      const objs = this.objs;
+      let fnId;
 
       while (true) {
         if (stepper !== undefined && i === stepper.nextBreakPoint) {
@@ -5351,10 +5408,11 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
           steps = 0;
         }
       }
-    },
-    endDrawing: function CanvasGraphics_endDrawing() {
-      if (this.current.activeSMask !== null) {
-        this.endSMaskGroup();
+    }
+
+    endDrawing() {
+      while (this.stateStack.length || this.current.activeSMask !== null) {
+        this.restore();
       }
 
       this.ctx.restore();
@@ -5369,52 +5427,144 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
       }
 
       this.cachedCanvases.clear();
-      this.webGLContext.clear();
+      this.cachedPatterns.clear();
 
       if (this.imageLayer) {
         this.imageLayer.endLayout();
       }
-    },
-    setLineWidth: function CanvasGraphics_setLineWidth(width) {
-      this.current.lineWidth = width;
-      this.ctx.lineWidth = width;
-    },
-    setLineCap: function CanvasGraphics_setLineCap(style) {
-      this.ctx.lineCap = LINE_CAP_STYLES[style];
-    },
-    setLineJoin: function CanvasGraphics_setLineJoin(style) {
-      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
-    },
-    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
-      this.ctx.miterLimit = limit;
-    },
-    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
-      var ctx = this.ctx;
-
-      if (ctx.setLineDash !== undefined) {
-        ctx.setLineDash(dashArray);
-        ctx.lineDashOffset = dashPhase;
-      }
-    },
+    }
 
-    setRenderingIntent(intent) {},
+    _scaleImage(img, inverseTransform) {
+      const width = img.width;
+      const height = img.height;
+      let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1);
+      let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1);
+      let paintWidth = width,
+          paintHeight = height;
+      let tmpCanvasId = "prescale1";
+      let tmpCanvas, tmpCtx;
 
-    setFlatness(flatness) {},
+      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {
+        let newWidth = paintWidth,
+            newHeight = paintHeight;
 
-    setGState: function CanvasGraphics_setGState(states) {
-      for (var i = 0, ii = states.length; i < ii; i++) {
-        var state = states[i];
-        var key = state[0];
-        var value = state[1];
+        if (widthScale > 2 && paintWidth > 1) {
+          newWidth = Math.ceil(paintWidth / 2);
+          widthScale /= paintWidth / newWidth;
+        }
 
-        switch (key) {
-          case "LW":
-            this.setLineWidth(value);
-            break;
+        if (heightScale > 2 && paintHeight > 1) {
+          newHeight = Math.ceil(paintHeight / 2);
+          heightScale /= paintHeight / newHeight;
+        }
 
-          case "LC":
-            this.setLineCap(value);
-            break;
+        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
+        tmpCtx = tmpCanvas.context;
+        tmpCtx.clearRect(0, 0, newWidth, newHeight);
+        tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);
+        img = tmpCanvas.canvas;
+        paintWidth = newWidth;
+        paintHeight = newHeight;
+        tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1";
+      }
+
+      return {
+        img,
+        paintWidth,
+        paintHeight
+      };
+    }
+
+    _createMaskCanvas(img) {
+      const ctx = this.ctx;
+      const width = img.width,
+            height = img.height;
+      const fillColor = this.current.fillColor;
+      const isPatternFill = this.current.patternFill;
+      const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
+      const maskCtx = maskCanvas.context;
+      putBinaryImageMask(maskCtx, img);
+      const objToCanvas = ctx.mozCurrentTransform;
+
+      let maskToCanvas = _util.Util.transform(objToCanvas, [1 / width, 0, 0, -1 / height, 0, 0]);
+
+      maskToCanvas = _util.Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);
+
+      const cord1 = _util.Util.applyTransform([0, 0], maskToCanvas);
+
+      const cord2 = _util.Util.applyTransform([width, height], maskToCanvas);
+
+      const rect = _util.Util.normalizeRect([cord1[0], cord1[1], cord2[0], cord2[1]]);
+
+      const drawnWidth = Math.ceil(rect[2] - rect[0]);
+      const drawnHeight = Math.ceil(rect[3] - rect[1]);
+      const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight, true);
+      const fillCtx = fillCanvas.context;
+      const offsetX = Math.min(cord1[0], cord2[0]);
+      const offsetY = Math.min(cord1[1], cord2[1]);
+      fillCtx.translate(-offsetX, -offsetY);
+      fillCtx.transform.apply(fillCtx, maskToCanvas);
+
+      const scaled = this._scaleImage(maskCanvas.canvas, fillCtx.mozCurrentTransformInverse);
+
+      fillCtx.drawImage(scaled.img, 0, 0, scaled.img.width, scaled.img.height, 0, 0, width, height);
+      fillCtx.globalCompositeOperation = "source-in";
+
+      const inverse = _util.Util.transform(fillCtx.mozCurrentTransformInverse, [1, 0, 0, 1, -offsetX, 
-offsetY]);
+
+      fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, false) : fillColor;
+      fillCtx.fillRect(0, 0, width, height);
+      return {
+        canvas: fillCanvas.canvas,
+        offsetX: Math.round(offsetX),
+        offsetY: Math.round(offsetY)
+      };
+    }
+
+    setLineWidth(width) {
+      this.current.lineWidth = width;
+      this.ctx.lineWidth = width;
+    }
+
+    setLineCap(style) {
+      this.ctx.lineCap = LINE_CAP_STYLES[style];
+    }
+
+    setLineJoin(style) {
+      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+    }
+
+    setMiterLimit(limit) {
+      this.ctx.miterLimit = limit;
+    }
+
+    setDash(dashArray, dashPhase) {
+      const ctx = this.ctx;
+
+      if (ctx.setLineDash !== undefined) {
+        ctx.setLineDash(dashArray);
+        ctx.lineDashOffset = dashPhase;
+      }
+    }
+
+    setRenderingIntent(intent) {}
+
+    setFlatness(flatness) {}
+
+    setGState(states) {
+      for (let i = 0, ii = states.length; i < ii; i++) {
+        const state = states[i];
+        const key = state[0];
+        const value = state[1];
+
+        switch (key) {
+          case "LW":
+            this.setLineWidth(value);
+            break;
+
+          case "LC":
+            this.setLineCap(value);
+            break;
 
           case "LJ":
             this.setLineJoin(value);
@@ -5475,17 +5625,18 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
             this.current.transferMaps = value;
         }
       }
-    },
-    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
-      var activeSMask = this.current.activeSMask;
-      var drawnWidth = activeSMask.canvas.width;
-      var drawnHeight = activeSMask.canvas.height;
-      var cacheId = "smaskGroupAt" + this.groupLevel;
-      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
-      var currentCtx = this.ctx;
-      var currentTransform = currentCtx.mozCurrentTransform;
+    }
+
+    beginSMaskGroup() {
+      const activeSMask = this.current.activeSMask;
+      const drawnWidth = activeSMask.canvas.width;
+      const drawnHeight = activeSMask.canvas.height;
+      const cacheId = "smaskGroupAt" + this.groupLevel;
+      const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
+      const currentCtx = this.ctx;
+      const currentTransform = currentCtx.mozCurrentTransform;
       this.ctx.save();
-      var groupCtx = scratchCanvas.context;
+      const groupCtx = scratchCanvas.context;
       groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
       groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
       groupCtx.transform.apply(groupCtx, currentTransform);
@@ -5495,2797 +5646,2410 @@ var CanvasGraphics = function CanvasGraphicsClosure() {
       this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]);
       this.groupStack.push(currentCtx);
       this.groupLevel++;
-    },
-    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {
-      var groupCtx = this.ctx;
+    }
+
+    suspendSMaskGroup() {
+      const groupCtx = this.ctx;
       this.groupLevel--;
       this.ctx = this.groupStack.pop();
-      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
+      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
       this.ctx.restore();
       this.ctx.save();
       copyCtxState(groupCtx, this.ctx);
       this.current.resumeSMaskCtx = groupCtx;
 
-      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, 
groupCtx.mozCurrentTransform);
+      const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, 
groupCtx.mozCurrentTransform);
 
       this.ctx.transform.apply(this.ctx, deltaTransform);
       groupCtx.save();
       groupCtx.setTransform(1, 0, 0, 1, 0, 0);
       groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);
       groupCtx.restore();
-    },
-    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {
-      var groupCtx = this.current.resumeSMaskCtx;
-      var currentCtx = this.ctx;
+    }
+
+    resumeSMaskGroup() {
+      const groupCtx = this.current.resumeSMaskCtx;
+      const currentCtx = this.ctx;
       this.ctx = groupCtx;
       this.groupStack.push(currentCtx);
       this.groupLevel++;
-    },
-    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
-      var groupCtx = this.ctx;
-      this.groupLevel--;
-      this.ctx = this.groupStack.pop();
-      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
-      this.ctx.restore();
-      copyCtxState(groupCtx, this.ctx);
-
-      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, 
groupCtx.mozCurrentTransform);
-
-      this.ctx.transform.apply(this.ctx, deltaTransform);
-    },
-    save: function CanvasGraphics_save() {
-      this.ctx.save();
-      var old = this.current;
-      this.stateStack.push(old);
-      this.current = old.clone();
-      this.current.resumeSMaskCtx = null;
-    },
-    restore: function CanvasGraphics_restore() {
-      if (this.current.resumeSMaskCtx) {
-        this.resumeSMaskGroup();
-      }
-
-      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || 
this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {
-        this.endSMaskGroup();
-      }
-
-      if (this.stateStack.length !== 0) {
-        this.current = this.stateStack.pop();
-        this.ctx.restore();
-        this.pendingClip = null;
-        this._cachedGetSinglePixelWidth = null;
-      }
-    },
-    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
-      this.ctx.transform(a, b, c, d, e, f);
-      this._cachedGetSinglePixelWidth = null;
-    },
-    constructPath: function CanvasGraphics_constructPath(ops, args) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var x = current.x,
-          y = current.y;
-
-      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
-        switch (ops[i] | 0) {
-          case _util.OPS.rectangle:
-            x = args[j++];
-            y = args[j++];
-            var width = args[j++];
-            var height = args[j++];
-
-            if (width === 0 && ctx.lineWidth < this.getSinglePixelWidth()) {
-              width = this.getSinglePixelWidth();
-            }
-
-            if (height === 0 && ctx.lineWidth < this.getSinglePixelWidth()) {
-              height = this.getSinglePixelWidth();
-            }
-
-            var xw = x + width;
-            var yh = y + height;
-            ctx.moveTo(x, y);
-            ctx.lineTo(xw, y);
-            ctx.lineTo(xw, yh);
-            ctx.lineTo(x, yh);
-            ctx.lineTo(x, y);
-            ctx.closePath();
-            break;
-
-          case _util.OPS.moveTo:
-            x = args[j++];
-            y = args[j++];
-            ctx.moveTo(x, y);
-            break;
-
-          case _util.OPS.lineTo:
-            x = args[j++];
-            y = args[j++];
-            ctx.lineTo(x, y);
-            break;
-
-          case _util.OPS.curveTo:
-            x = args[j + 4];
-            y = args[j + 5];
-            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);
-            j += 6;
-            break;
-
-          case _util.OPS.curveTo2:
-            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);
-            x = args[j + 2];
-            y = args[j + 3];
-            j += 4;
-            break;
-
-          case _util.OPS.curveTo3:
-            x = args[j + 2];
-            y = args[j + 3];
-            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
-            j += 4;
-            break;
-
-          case _util.OPS.closePath:
-            ctx.closePath();
-            break;
-        }
-      }
-
-      current.setCurrentPoint(x, y);
-    },
-    closePath: function CanvasGraphics_closePath() {
-      this.ctx.closePath();
-    },
-    stroke: function CanvasGraphics_stroke(consumePath) {
-      consumePath = typeof consumePath !== "undefined" ? consumePath : true;
-      var ctx = this.ctx;
-      var strokeColor = this.current.strokeColor;
-      ctx.globalAlpha = this.current.strokeAlpha;
-
-      if (this.contentVisible) {
-        if (strokeColor && strokeColor.hasOwnProperty("type") && strokeColor.type === "Pattern") {
-          ctx.save();
-          const transform = ctx.mozCurrentTransform;
-
-          const scale = _util.Util.singularValueDecompose2dScale(transform)[0];
-
-          ctx.strokeStyle = strokeColor.getPattern(ctx, this);
-          ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth * 
scale);
-          ctx.stroke();
-          ctx.restore();
-        } else {
-          ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
-          ctx.stroke();
-        }
-      }
-
-      if (consumePath) {
-        this.consumePath();
-      }
-
-      ctx.globalAlpha = this.current.fillAlpha;
-    },
-    closeStroke: function CanvasGraphics_closeStroke() {
-      this.closePath();
-      this.stroke();
-    },
-    fill: function CanvasGraphics_fill(consumePath) {
-      consumePath = typeof consumePath !== "undefined" ? consumePath : true;
-      var ctx = this.ctx;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-      var needRestore = false;
-
-      if (isPatternFill) {
-        ctx.save();
-
-        if (this.baseTransform) {
-          ctx.setTransform.apply(ctx, this.baseTransform);
-        }
-
-        ctx.fillStyle = fillColor.getPattern(ctx, this);
-        needRestore = true;
-      }
-
-      if (this.contentVisible) {
-        if (this.pendingEOFill) {
-          ctx.fill("evenodd");
-          this.pendingEOFill = false;
-        } else {
-          ctx.fill();
-        }
-      }
-
-      if (needRestore) {
-        ctx.restore();
-      }
-
-      if (consumePath) {
-        this.consumePath();
-      }
-    },
-    eoFill: function CanvasGraphics_eoFill() {
-      this.pendingEOFill = true;
-      this.fill();
-    },
-    fillStroke: function CanvasGraphics_fillStroke() {
-      this.fill(false);
-      this.stroke(false);
-      this.consumePath();
-    },
-    eoFillStroke: function CanvasGraphics_eoFillStroke() {
-      this.pendingEOFill = true;
-      this.fillStroke();
-    },
-    closeFillStroke: function CanvasGraphics_closeFillStroke() {
-      this.closePath();
-      this.fillStroke();
-    },
-    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
-      this.pendingEOFill = true;
-      this.closePath();
-      this.fillStroke();
-    },
-    endPath: function CanvasGraphics_endPath() {
-      this.consumePath();
-    },
-    clip: function CanvasGraphics_clip() {
-      this.pendingClip = NORMAL_CLIP;
-    },
-    eoClip: function CanvasGraphics_eoClip() {
-      this.pendingClip = EO_CLIP;
-    },
-    beginText: function CanvasGraphics_beginText() {
-      this.current.textMatrix = _util.IDENTITY_MATRIX;
-      this.current.textMatrixScale = 1;
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    endText: function CanvasGraphics_endText() {
-      var paths = this.pendingTextPaths;
-      var ctx = this.ctx;
-
-      if (paths === undefined) {
-        ctx.beginPath();
-        return;
-      }
-
-      ctx.save();
-      ctx.beginPath();
-
-      for (var i = 0; i < paths.length; i++) {
-        var path = paths[i];
-        ctx.setTransform.apply(ctx, path.transform);
-        ctx.translate(path.x, path.y);
-        path.addToPath(ctx, path.fontSize);
-      }
-
-      ctx.restore();
-      ctx.clip();
-      ctx.beginPath();
-      delete this.pendingTextPaths;
-    },
-    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
-      this.current.charSpacing = spacing;
-    },
-    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
-      this.current.wordSpacing = spacing;
-    },
-    setHScale: function CanvasGraphics_setHScale(scale) {
-      this.current.textHScale = scale / 100;
-    },
-    setLeading: function CanvasGraphics_setLeading(leading) {
-      this.current.leading = -leading;
-    },
-    setFont: function CanvasGraphics_setFont(fontRefName, size) {
-      var fontObj = this.commonObjs.get(fontRefName);
-      var current = this.current;
-
-      if (!fontObj) {
-        throw new Error(`Can't find font for ${fontRefName}`);
-      }
-
-      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;
-
-      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
-        (0, _util.warn)("Invalid font matrix for font " + fontRefName);
-      }
-
-      if (size < 0) {
-        size = -size;
-        current.fontDirection = -1;
-      } else {
-        current.fontDirection = 1;
-      }
-
-      this.current.font = fontObj;
-      this.current.fontSize = size;
-
-      if (fontObj.isType3Font) {
-        return;
-      }
-
-      var name = fontObj.loadedName || "sans-serif";
-      let bold = "normal";
-
-      if (fontObj.black) {
-        bold = "900";
-      } else if (fontObj.bold) {
-        bold = "bold";
-      }
-
-      var italic = fontObj.italic ? "italic" : "normal";
-      var typeface = `"${name}", ${fontObj.fallbackName}`;
-      let browserFontSize = size;
-
-      if (size < MIN_FONT_SIZE) {
-        browserFontSize = MIN_FONT_SIZE;
-      } else if (size > MAX_FONT_SIZE) {
-        browserFontSize = MAX_FONT_SIZE;
-      }
-
-      this.current.fontSizeScale = size / browserFontSize;
-      this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;
-    },
-    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
-      this.current.textRenderingMode = mode;
-    },
-    setTextRise: function CanvasGraphics_setTextRise(rise) {
-      this.current.textRise = rise;
-    },
-    moveText: function CanvasGraphics_moveText(x, y) {
-      this.current.x = this.current.lineX += x;
-      this.current.y = this.current.lineY += y;
-    },
-    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
-      this.setLeading(-y);
-      this.moveText(x, y);
-    },
-    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
-      this.current.textMatrix = [a, b, c, d, e, f];
-      this.current.textMatrixScale = Math.sqrt(a * a + b * b);
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    nextLine: function CanvasGraphics_nextLine() {
-      this.moveText(0, this.current.leading);
-    },
-
-    paintChar(character, x, y, patternTransform) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var textRenderingMode = current.textRenderingMode;
-      var fontSize = current.fontSize / current.fontSizeScale;
-      var fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
-      var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
-      const patternFill = current.patternFill && !font.missingFile;
-      var addToPath;
-
-      if (font.disableFontFace || isAddToPathSet || patternFill) {
-        addToPath = font.getPathGenerator(this.commonObjs, character);
-      }
-
-      if (font.disableFontFace || patternFill) {
-        ctx.save();
-        ctx.translate(x, y);
-        ctx.beginPath();
-        addToPath(ctx, fontSize);
-
-        if (patternTransform) {
-          ctx.setTransform.apply(ctx, patternTransform);
-        }
-
-        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
-          ctx.fill();
-        }
-
-        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
-          ctx.stroke();
-        }
-
-        ctx.restore();
-      } else {
-        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
-          ctx.fillText(character, x, y);
-        }
-
-        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
-          ctx.strokeText(character, x, y);
-        }
-      }
-
-      if (isAddToPathSet) {
-        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
-        paths.push({
-          transform: ctx.mozCurrentTransform,
-          x,
-          y,
-          fontSize,
-          addToPath
-        });
-      }
-    },
-
-    get isFontSubpixelAAEnabled() {
-      const {
-        context: ctx
-      } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
-      ctx.scale(1.5, 1);
-      ctx.fillText("I", 0, 10);
-      var data = ctx.getImageData(0, 0, 10, 10).data;
-      var enabled = false;
-
-      for (var i = 3; i < data.length; i += 4) {
-        if (data[i] > 0 && data[i] < 255) {
-          enabled = true;
-          break;
-        }
-      }
+    }
 
-      return (0, _util.shadow)(this, "isFontSubpixelAAEnabled", enabled);
-    },
+    endSMaskGroup() {
+      const groupCtx = this.ctx;
+      this.groupLevel--;
+      this.ctx = this.groupStack.pop();
+      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
+      this.ctx.restore();
+      copyCtxState(groupCtx, this.ctx);
 
-    showText: function CanvasGraphics_showText(glyphs) {
-      var current = this.current;
-      var font = current.font;
+      const deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, 
groupCtx.mozCurrentTransform);
 
-      if (font.isType3Font) {
-        return this.showType3Text(glyphs);
-      }
+      this.ctx.transform.apply(this.ctx, deltaTransform);
+    }
 
-      var fontSize = current.fontSize;
+    save() {
+      this.ctx.save();
+      const old = this.current;
+      this.stateStack.push(old);
+      this.current = old.clone();
+      this.current.resumeSMaskCtx = null;
+    }
 
-      if (fontSize === 0) {
-        return undefined;
+    restore() {
+      if (this.current.resumeSMaskCtx) {
+        this.resumeSMaskGroup();
       }
 
-      var ctx = this.ctx;
-      var fontSizeScale = current.fontSizeScale;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var fontDirection = current.fontDirection;
-      var textHScale = current.textHScale * fontDirection;
-      var glyphsLength = glyphs.length;
-      var vertical = font.vertical;
-      var spacingDir = vertical ? 1 : -1;
-      var defaultVMetrics = font.defaultVMetrics;
-      var widthAdvanceScale = fontSize * current.fontMatrix[0];
-      var simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && 
!font.disableFontFace && !current.patternFill;
-      ctx.save();
-      let patternTransform;
-
-      if (current.patternFill) {
-        ctx.save();
-        const pattern = current.fillColor.getPattern(ctx, this);
-        patternTransform = ctx.mozCurrentTransform;
-        ctx.restore();
-        ctx.fillStyle = pattern;
+      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || 
this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {
+        this.endSMaskGroup();
       }
 
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.translate(current.x, current.y + current.textRise);
-
-      if (fontDirection > 0) {
-        ctx.scale(textHScale, -1);
+      if (this.stateStack.length !== 0) {
+        this.current = this.stateStack.pop();
+        this.ctx.restore();
+        this.pendingClip = null;
+        this._cachedGetSinglePixelWidth = null;
       } else {
-        ctx.scale(textHScale, 1);
+        this.current.activeSMask = null;
       }
+    }
 
-      var lineWidth = current.lineWidth;
-      var scale = current.textMatrixScale;
+    transform(a, b, c, d, e, f) {
+      this.ctx.transform(a, b, c, d, e, f);
+      this._cachedGetSinglePixelWidth = null;
+    }
 
-      if (scale === 0 || lineWidth === 0) {
-        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
+    constructPath(ops, args) {
+      const ctx = this.ctx;
+      const current = this.current;
+      let x = current.x,
+          y = current.y;
 
-        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
-          this._cachedGetSinglePixelWidth = null;
-          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
-        }
-      } else {
-        lineWidth /= scale;
-      }
+      for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {
+        switch (ops[i] | 0) {
+          case _util.OPS.rectangle:
+            x = args[j++];
+            y = args[j++];
+            const width = args[j++];
+            const height = args[j++];
+            const xw = x + width;
+            const yh = y + height;
+            ctx.moveTo(x, y);
 
-      if (fontSizeScale !== 1.0) {
-        ctx.scale(fontSizeScale, fontSizeScale);
-        lineWidth /= fontSizeScale;
-      }
+            if (width === 0 || height === 0) {
+              ctx.lineTo(xw, yh);
+            } else {
+              ctx.lineTo(xw, y);
+              ctx.lineTo(xw, yh);
+              ctx.lineTo(x, yh);
+            }
 
-      ctx.lineWidth = lineWidth;
-      var x = 0,
-          i;
+            ctx.closePath();
+            break;
 
-      for (i = 0; i < glyphsLength; ++i) {
-        var glyph = glyphs[i];
+          case _util.OPS.moveTo:
+            x = args[j++];
+            y = args[j++];
+            ctx.moveTo(x, y);
+            break;
 
-        if ((0, _util.isNum)(glyph)) {
-          x += spacingDir * glyph * fontSize / 1000;
-          continue;
-        }
+          case _util.OPS.lineTo:
+            x = args[j++];
+            y = args[j++];
+            ctx.lineTo(x, y);
+            break;
 
-        var restoreNeeded = false;
-        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
-        var character = glyph.fontChar;
-        var accent = glyph.accent;
-        var scaledX, scaledY, scaledAccentX, scaledAccentY;
-        var width = glyph.width;
+          case _util.OPS.curveTo:
+            x = args[j + 4];
+            y = args[j + 5];
+            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);
+            j += 6;
+            break;
 
-        if (vertical) {
-          var vmetric, vx, vy;
-          vmetric = glyph.vmetric || defaultVMetrics;
-          vx = glyph.vmetric ? vmetric[1] : width * 0.5;
-          vx = -vx * widthAdvanceScale;
-          vy = vmetric[2] * widthAdvanceScale;
-          width = vmetric ? -vmetric[0] : width;
-          scaledX = vx / fontSizeScale;
-          scaledY = (x + vy) / fontSizeScale;
-        } else {
-          scaledX = x / fontSizeScale;
-          scaledY = 0;
-        }
+          case _util.OPS.curveTo2:
+            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);
+            x = args[j + 2];
+            y = args[j + 3];
+            j += 4;
+            break;
 
-        if (font.remeasure && width > 0) {
-          var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;
+          case _util.OPS.curveTo3:
+            x = args[j + 2];
+            y = args[j + 3];
+            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
+            j += 4;
+            break;
 
-          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
-            var characterScaleX = width / measuredWidth;
-            restoreNeeded = true;
-            ctx.save();
-            ctx.scale(characterScaleX, 1);
-            scaledX /= characterScaleX;
-          } else if (width !== measuredWidth) {
-            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;
-          }
+          case _util.OPS.closePath:
+            ctx.closePath();
+            break;
         }
+      }
 
-        if (this.contentVisible && (glyph.isInFont || font.missingFile)) {
-          if (simpleFillText && !accent) {
-            ctx.fillText(character, scaledX, scaledY);
-          } else {
-            this.paintChar(character, scaledX, scaledY, patternTransform);
+      current.setCurrentPoint(x, y);
+    }
 
-            if (accent) {
-              scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;
-              scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;
-              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);
-            }
-          }
-        }
+    closePath() {
+      this.ctx.closePath();
+    }
 
-        var charWidth;
+    stroke(consumePath) {
+      consumePath = typeof consumePath !== "undefined" ? consumePath : true;
+      const ctx = this.ctx;
+      const strokeColor = this.current.strokeColor;
+      ctx.globalAlpha = this.current.strokeAlpha;
 
-        if (vertical) {
-          charWidth = width * widthAdvanceScale - spacing * fontDirection;
+      if (this.contentVisible) {
+        if (typeof strokeColor === "object" && strokeColor?.getPattern) {
+          const lineWidth = this.getSinglePixelWidth();
+          ctx.save();
+          ctx.strokeStyle = strokeColor.getPattern(ctx, this, ctx.mozCurrentTransformInverse);
+          ctx.lineWidth = Math.max(lineWidth, this.current.lineWidth);
+          ctx.stroke();
+          ctx.restore();
         } else {
-          charWidth = width * widthAdvanceScale + spacing * fontDirection;
-        }
+          const lineWidth = this.getSinglePixelWidth();
 
-        x += charWidth;
-
-        if (restoreNeeded) {
-          ctx.restore();
+          if (lineWidth < 0 && -lineWidth >= this.current.lineWidth) {
+            ctx.save();
+            ctx.resetTransform();
+            ctx.lineWidth = Math.round(this._combinedScaleFactor);
+            ctx.stroke();
+            ctx.restore();
+          } else {
+            ctx.lineWidth = Math.max(lineWidth, this.current.lineWidth);
+            ctx.stroke();
+          }
         }
       }
 
-      if (vertical) {
-        current.y -= x;
-      } else {
-        current.x += x * textHScale;
-      }
-
-      ctx.restore();
-    },
-    showType3Text: function CanvasGraphics_showType3Text(glyphs) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-      var fontDirection = current.fontDirection;
-      var spacingDir = font.vertical ? 1 : -1;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var textHScale = current.textHScale * fontDirection;
-      var fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;
-      var glyphsLength = glyphs.length;
-      var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;
-      var i, glyph, width, spacingLength;
-
-      if (isTextInvisible || fontSize === 0) {
-        return;
+      if (consumePath) {
+        this.consumePath();
       }
 
-      this._cachedGetSinglePixelWidth = null;
-      ctx.save();
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.translate(current.x, current.y);
-      ctx.scale(textHScale, fontDirection);
-
-      for (i = 0; i < glyphsLength; ++i) {
-        glyph = glyphs[i];
-
-        if ((0, _util.isNum)(glyph)) {
-          spacingLength = spacingDir * glyph * fontSize / 1000;
-          this.ctx.translate(spacingLength, 0);
-          current.x += spacingLength * textHScale;
-          continue;
-        }
-
-        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
-        var operatorList = font.charProcOperatorList[glyph.operatorListId];
-
-        if (!operatorList) {
-          (0, _util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`);
-          continue;
-        }
-
-        if (this.contentVisible) {
-          this.processingType3 = glyph;
-          this.save();
-          ctx.scale(fontSize, fontSize);
-          ctx.transform.apply(ctx, fontMatrix);
-          this.executeOperatorList(operatorList);
-          this.restore();
-        }
-
-        var transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);
+      ctx.globalAlpha = this.current.fillAlpha;
+    }
 
-        width = transformed[0] * fontSize + spacing;
-        ctx.translate(width, 0);
-        current.x += width * textHScale;
-      }
+    closeStroke() {
+      this.closePath();
+      this.stroke();
+    }
 
-      ctx.restore();
-      this.processingType3 = null;
-    },
-    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},
-    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) 
{
-      this.ctx.rect(llx, lly, urx - llx, ury - lly);
-      this.clip();
-      this.endPath();
-    },
-    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
-      var pattern;
+    fill(consumePath) {
+      consumePath = typeof consumePath !== "undefined" ? consumePath : true;
+      const ctx = this.ctx;
+      const fillColor = this.current.fillColor;
+      const isPatternFill = this.current.patternFill;
+      let needRestore = false;
 
-      if (IR[0] === "TilingPattern") {
-        var color = IR[1];
-        var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();
-        var canvasGraphicsFactory = {
-          createCanvasGraphics: ctx => {
-            return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, 
this.webGLContext);
-          }
-        };
-        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, 
baseTransform);
-      } else {
-        pattern = (0, _pattern_helper.getShadingPatternFromIR)(IR);
+      if (isPatternFill) {
+        ctx.save();
+        ctx.fillStyle = fillColor.getPattern(ctx, this, ctx.mozCurrentTransformInverse);
+        needRestore = true;
       }
 
-      return pattern;
-    },
-    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {
-      this.current.strokeColor = this.getColorN_Pattern(arguments);
-    },
-    setFillColorN: function CanvasGraphics_setFillColorN() {
-      this.current.fillColor = this.getColorN_Pattern(arguments);
-      this.current.patternFill = true;
-    },
-    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
-      var color = _util.Util.makeCssRgb(r, g, b);
-
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
-      var color = _util.Util.makeCssRgb(r, g, b);
-
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-      this.current.patternFill = false;
-    },
-    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
-      if (!this.contentVisible) {
-        return;
+      if (this.contentVisible) {
+        if (this.pendingEOFill) {
+          ctx.fill("evenodd");
+          this.pendingEOFill = false;
+        } else {
+          ctx.fill();
+        }
       }
 
-      var ctx = this.ctx;
-      this.save();
-      var pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR);
-      ctx.fillStyle = pattern.getPattern(ctx, this, true);
-      var inv = ctx.mozCurrentTransformInverse;
+      if (needRestore) {
+        ctx.restore();
+      }
 
-      if (inv) {
-        var canvas = ctx.canvas;
-        var width = canvas.width;
-        var height = canvas.height;
+      if (consumePath) {
+        this.consumePath();
+      }
+    }
 
-        var bl = _util.Util.applyTransform([0, 0], inv);
+    eoFill() {
+      this.pendingEOFill = true;
+      this.fill();
+    }
 
-        var br = _util.Util.applyTransform([0, height], inv);
+    fillStroke() {
+      this.fill(false);
+      this.stroke(false);
+      this.consumePath();
+    }
 
-        var ul = _util.Util.applyTransform([width, 0], inv);
+    eoFillStroke() {
+      this.pendingEOFill = true;
+      this.fillStroke();
+    }
 
-        var ur = _util.Util.applyTransform([width, height], inv);
+    closeFillStroke() {
+      this.closePath();
+      this.fillStroke();
+    }
 
-        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
-        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
-        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
-        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
-        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
-      } else {
-        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
-      }
+    closeEOFillStroke() {
+      this.pendingEOFill = true;
+      this.closePath();
+      this.fillStroke();
+    }
 
-      this.restore();
-    },
-    beginInlineImage: function CanvasGraphics_beginInlineImage() {
-      (0, _util.unreachable)("Should not call beginInlineImage");
-    },
-    beginImageData: function CanvasGraphics_beginImageData() {
-      (0, _util.unreachable)("Should not call beginImageData");
-    },
-    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {
-      if (!this.contentVisible) {
-        return;
-      }
+    endPath() {
+      this.consumePath();
+    }
 
-      this.save();
-      this.baseTransformStack.push(this.baseTransform);
+    clip() {
+      this.pendingClip = NORMAL_CLIP;
+    }
 
-      if (Array.isArray(matrix) && matrix.length === 6) {
-        this.transform.apply(this, matrix);
-      }
+    eoClip() {
+      this.pendingClip = EO_CLIP;
+    }
 
-      this.baseTransform = this.ctx.mozCurrentTransform;
+    beginText() {
+      this.current.textMatrix = _util.IDENTITY_MATRIX;
+      this.current.textMatrixScale = 1;
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    }
 
-      if (bbox) {
-        var width = bbox[2] - bbox[0];
-        var height = bbox[3] - bbox[1];
-        this.ctx.rect(bbox[0], bbox[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-    },
-    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
-      if (!this.contentVisible) {
-        return;
-      }
+    endText() {
+      const paths = this.pendingTextPaths;
+      const ctx = this.ctx;
 
-      this.restore();
-      this.baseTransform = this.baseTransformStack.pop();
-    },
-    beginGroup: function CanvasGraphics_beginGroup(group) {
-      if (!this.contentVisible) {
+      if (paths === undefined) {
+        ctx.beginPath();
         return;
       }
 
-      this.save();
-      var currentCtx = this.ctx;
-
-      if (!group.isolated) {
-        (0, _util.info)("TODO: Support non-isolated groups.");
-      }
+      ctx.save();
+      ctx.beginPath();
 
-      if (group.knockout) {
-        (0, _util.warn)("Knockout groups not supported.");
+      for (let i = 0; i < paths.length; i++) {
+        const path = paths[i];
+        ctx.setTransform.apply(ctx, path.transform);
+        ctx.translate(path.x, path.y);
+        path.addToPath(ctx, path.fontSize);
       }
 
-      var currentTransform = currentCtx.mozCurrentTransform;
+      ctx.restore();
+      ctx.clip();
+      ctx.beginPath();
+      delete this.pendingTextPaths;
+    }
 
-      if (group.matrix) {
-        currentCtx.transform.apply(currentCtx, group.matrix);
-      }
+    setCharSpacing(spacing) {
+      this.current.charSpacing = spacing;
+    }
 
-      if (!group.bbox) {
-        throw new Error("Bounding box is required.");
-      }
+    setWordSpacing(spacing) {
+      this.current.wordSpacing = spacing;
+    }
 
-      var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);
+    setHScale(scale) {
+      this.current.textHScale = scale / 100;
+    }
 
-      var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
-      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
-      var offsetX = Math.floor(bounds[0]);
-      var offsetY = Math.floor(bounds[1]);
-      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
-      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
-      var scaleX = 1,
-          scaleY = 1;
+    setLeading(leading) {
+      this.current.leading = -leading;
+    }
 
-      if (drawnWidth > MAX_GROUP_SIZE) {
-        scaleX = drawnWidth / MAX_GROUP_SIZE;
-        drawnWidth = MAX_GROUP_SIZE;
-      }
+    setFont(fontRefName, size) {
+      const fontObj = this.commonObjs.get(fontRefName);
+      const current = this.current;
 
-      if (drawnHeight > MAX_GROUP_SIZE) {
-        scaleY = drawnHeight / MAX_GROUP_SIZE;
-        drawnHeight = MAX_GROUP_SIZE;
+      if (!fontObj) {
+        throw new Error(`Can't find font for ${fontRefName}`);
       }
 
-      var cacheId = "groupAt" + this.groupLevel;
+      current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX;
 
-      if (group.smask) {
-        cacheId += "_smask_" + this.smaskCounter++ % 2;
+      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
+        (0, _util.warn)("Invalid font matrix for font " + fontRefName);
       }
 
-      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
-      var groupCtx = scratchCanvas.context;
-      groupCtx.scale(1 / scaleX, 1 / scaleY);
-      groupCtx.translate(-offsetX, -offsetY);
-      groupCtx.transform.apply(groupCtx, currentTransform);
-
-      if (group.smask) {
-        this.smaskStack.push({
-          canvas: scratchCanvas.canvas,
-          context: groupCtx,
-          offsetX,
-          offsetY,
-          scaleX,
-          scaleY,
-          subtype: group.smask.subtype,
-          backdrop: group.smask.backdrop,
-          transferMap: group.smask.transferMap || null,
-          startTransformInverse: null
-        });
+      if (size < 0) {
+        size = -size;
+        current.fontDirection = -1;
       } else {
-        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
-        currentCtx.translate(offsetX, offsetY);
-        currentCtx.scale(scaleX, scaleY);
+        current.fontDirection = 1;
       }
 
-      copyCtxState(currentCtx, groupCtx);
-      this.ctx = groupCtx;
-      this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]);
-      this.groupStack.push(currentCtx);
-      this.groupLevel++;
-      this.current.activeSMask = null;
-    },
-    endGroup: function CanvasGraphics_endGroup(group) {
-      if (!this.contentVisible) {
+      this.current.font = fontObj;
+      this.current.fontSize = size;
+
+      if (fontObj.isType3Font) {
         return;
       }
 
-      this.groupLevel--;
-      var groupCtx = this.ctx;
-      this.ctx = this.groupStack.pop();
+      const name = fontObj.loadedName || "sans-serif";
+      let bold = "normal";
 
-      if (this.ctx.imageSmoothingEnabled !== undefined) {
-        this.ctx.imageSmoothingEnabled = false;
-      } else {
-        this.ctx.mozImageSmoothingEnabled = false;
+      if (fontObj.black) {
+        bold = "900";
+      } else if (fontObj.bold) {
+        bold = "bold";
       }
 
-      if (group.smask) {
-        this.tempSMask = this.smaskStack.pop();
-      } else {
-        this.ctx.drawImage(groupCtx.canvas, 0, 0);
+      const italic = fontObj.italic ? "italic" : "normal";
+      const typeface = `"${name}", ${fontObj.fallbackName}`;
+      let browserFontSize = size;
+
+      if (size < MIN_FONT_SIZE) {
+        browserFontSize = MIN_FONT_SIZE;
+      } else if (size > MAX_FONT_SIZE) {
+        browserFontSize = MAX_FONT_SIZE;
       }
 
-      this.restore();
-    },
-    beginAnnotations: function CanvasGraphics_beginAnnotations() {
-      this.save();
+      this.current.fontSizeScale = size / browserFontSize;
+      this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;
+    }
 
-      if (this.baseTransform) {
-        this.ctx.setTransform.apply(this.ctx, this.baseTransform);
-      }
-    },
-    endAnnotations: function CanvasGraphics_endAnnotations() {
-      this.restore();
-    },
-    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {
-      this.save();
-      resetCtxToDefault(this.ctx);
-      this.current = new CanvasExtraState();
+    setTextRenderingMode(mode) {
+      this.current.textRenderingMode = mode;
+    }
 
-      if (Array.isArray(rect) && rect.length === 4) {
-        var width = rect[2] - rect[0];
-        var height = rect[3] - rect[1];
-        this.ctx.rect(rect[0], rect[1], width, height);
-        this.clip();
-        this.endPath();
-      }
+    setTextRise(rise) {
+      this.current.textRise = rise;
+    }
 
-      this.transform.apply(this, transform);
-      this.transform.apply(this, matrix);
-    },
-    endAnnotation: function CanvasGraphics_endAnnotation() {
-      this.restore();
-    },
-    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
-      if (!this.contentVisible) {
-        return;
-      }
+    moveText(x, y) {
+      this.current.x = this.current.lineX += x;
+      this.current.y = this.current.lineY += y;
+    }
 
-      var ctx = this.ctx;
-      var width = img.width,
-          height = img.height;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-      var glyph = this.processingType3;
+    setLeadingMoveText(x, y) {
+      this.setLeading(-y);
+      this.moveText(x, y);
+    }
 
-      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
-        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
-          glyph.compiled = compileType3Glyph({
-            data: img.data,
-            width,
-            height
-          });
-        } else {
-          glyph.compiled = null;
-        }
-      }
+    setTextMatrix(a, b, c, d, e, f) {
+      this.current.textMatrix = [a, b, c, d, e, f];
+      this.current.textMatrixScale = Math.hypot(a, b);
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    }
 
-      if (glyph && glyph.compiled) {
-        glyph.compiled(ctx);
-        return;
-      }
+    nextLine() {
+      this.moveText(0, this.current.leading);
+    }
 
-      var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
-      var maskCtx = maskCanvas.context;
-      maskCtx.save();
-      putBinaryImageMask(maskCtx, img);
-      maskCtx.globalCompositeOperation = "source-in";
-      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
-      maskCtx.fillRect(0, 0, width, height);
-      maskCtx.restore();
-      this.paintInlineImageXObject(maskCanvas.canvas);
-    },
+    paintChar(character, x, y, patternTransform, resetLineWidthToOne) {
+      const ctx = this.ctx;
+      const current = this.current;
+      const font = current.font;
+      const textRenderingMode = current.textRenderingMode;
+      const fontSize = current.fontSize / current.fontSizeScale;
+      const fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
+      const isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
+      const patternFill = current.patternFill && !font.missingFile;
+      let addToPath;
 
-    paintImageMaskXObjectRepeat(imgData, scaleX, skewX = 0, skewY = 0, scaleY, positions) {
-      if (!this.contentVisible) {
-        return;
+      if (font.disableFontFace || isAddToPathSet || patternFill) {
+        addToPath = font.getPathGenerator(this.commonObjs, character);
       }
 
-      var width = imgData.width;
-      var height = imgData.height;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-      var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
-      var maskCtx = maskCanvas.context;
-      maskCtx.save();
-      putBinaryImageMask(maskCtx, imgData);
-      maskCtx.globalCompositeOperation = "source-in";
-      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
-      maskCtx.fillRect(0, 0, width, height);
-      maskCtx.restore();
-      var ctx = this.ctx;
-
-      for (var i = 0, ii = positions.length; i < ii; i += 2) {
+      if (font.disableFontFace || patternFill) {
         ctx.save();
-        ctx.transform(scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]);
-        ctx.scale(1, -1);
-        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
-        ctx.restore();
-      }
-    },
+        ctx.translate(x, y);
+        ctx.beginPath();
+        addToPath(ctx, fontSize);
 
-    paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {
-      if (!this.contentVisible) {
-        return;
-      }
+        if (patternTransform) {
+          ctx.setTransform.apply(ctx, patternTransform);
+        }
 
-      var ctx = this.ctx;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
+        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
+          ctx.fill();
+        }
+
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
+          if (resetLineWidthToOne) {
+            ctx.resetTransform();
+            ctx.lineWidth = Math.round(this._combinedScaleFactor);
+          }
+
+          ctx.stroke();
+        }
 
-      for (var i = 0, ii = images.length; i < ii; i++) {
-        var image = images[i];
-        var width = image.width,
-            height = image.height;
-        var maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
-        var maskCtx = maskCanvas.context;
-        maskCtx.save();
-        putBinaryImageMask(maskCtx, image);
-        maskCtx.globalCompositeOperation = "source-in";
-        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
-        maskCtx.fillRect(0, 0, width, height);
-        maskCtx.restore();
-        ctx.save();
-        ctx.transform.apply(ctx, image.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
         ctx.restore();
+      } else {
+        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
+          ctx.fillText(character, x, y);
+        }
+
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
+          if (resetLineWidthToOne) {
+            ctx.save();
+            ctx.moveTo(x, y);
+            ctx.resetTransform();
+            ctx.lineWidth = Math.round(this._combinedScaleFactor);
+            ctx.strokeText(character, 0, 0);
+            ctx.restore();
+          } else {
+            ctx.strokeText(character, x, y);
+          }
+        }
       }
-    },
-    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
-      if (!this.contentVisible) {
-        return;
+
+      if (isAddToPathSet) {
+        const paths = this.pendingTextPaths || (this.pendingTextPaths = []);
+        paths.push({
+          transform: ctx.mozCurrentTransform,
+          x,
+          y,
+          fontSize,
+          addToPath
+        });
       }
+    }
 
-      const imgData = objId.startsWith("g_") ? this.commonObjs.get(objId) : this.objs.get(objId);
+    get isFontSubpixelAAEnabled() {
+      const {
+        context: ctx
+      } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
+      ctx.scale(1.5, 1);
+      ctx.fillText("I", 0, 10);
+      const data = ctx.getImageData(0, 0, 10, 10).data;
+      let enabled = false;
 
-      if (!imgData) {
-        (0, _util.warn)("Dependent image isn't ready yet");
-        return;
+      for (let i = 3; i < data.length; i += 4) {
+        if (data[i] > 0 && data[i] < 255) {
+          enabled = true;
+          break;
+        }
       }
 
-      this.paintInlineImageXObject(imgData);
-    },
-    paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, 
positions) {
-      if (!this.contentVisible) {
-        return;
-      }
+      return (0, _util.shadow)(this, "isFontSubpixelAAEnabled", enabled);
+    }
 
-      const imgData = objId.startsWith("g_") ? this.commonObjs.get(objId) : this.objs.get(objId);
+    showText(glyphs) {
+      const current = this.current;
+      const font = current.font;
 
-      if (!imgData) {
-        (0, _util.warn)("Dependent image isn't ready yet");
-        return;
+      if (font.isType3Font) {
+        return this.showType3Text(glyphs);
       }
 
-      var width = imgData.width;
-      var height = imgData.height;
-      var map = [];
+      const fontSize = current.fontSize;
 
-      for (var i = 0, ii = positions.length; i < ii; i += 2) {
-        map.push({
-          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],
-          x: 0,
-          y: 0,
-          w: width,
-          h: height
-        });
+      if (fontSize === 0) {
+        return undefined;
       }
 
-      this.paintInlineImageXObjectGroup(imgData, map);
-    },
-    paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {
-      if (!this.contentVisible) {
-        return;
+      const ctx = this.ctx;
+      const fontSizeScale = current.fontSizeScale;
+      const charSpacing = current.charSpacing;
+      const wordSpacing = current.wordSpacing;
+      const fontDirection = current.fontDirection;
+      const textHScale = current.textHScale * fontDirection;
+      const glyphsLength = glyphs.length;
+      const vertical = font.vertical;
+      const spacingDir = vertical ? 1 : -1;
+      const defaultVMetrics = font.defaultVMetrics;
+      const widthAdvanceScale = fontSize * current.fontMatrix[0];
+      const simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && 
!font.disableFontFace && !current.patternFill;
+      ctx.save();
+      let patternTransform;
+
+      if (current.patternFill) {
+        ctx.save();
+        const pattern = current.fillColor.getPattern(ctx, this, ctx.mozCurrentTransformInverse);
+        patternTransform = ctx.mozCurrentTransform;
+        ctx.restore();
+        ctx.fillStyle = pattern;
       }
 
-      var width = imgData.width;
-      var height = imgData.height;
-      var ctx = this.ctx;
-      this.save();
-      ctx.scale(1 / width, -1 / height);
-      var currentTransform = ctx.mozCurrentTransformInverse;
-      var a = currentTransform[0],
-          b = currentTransform[1];
-      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
-      var c = currentTransform[2],
-          d = currentTransform[3];
-      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
-      var imgToPaint, tmpCanvas;
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.translate(current.x, current.y + current.textRise);
 
-      if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) {
-        imgToPaint = imgData;
+      if (fontDirection > 0) {
+        ctx.scale(textHScale, -1);
       } else {
-        tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height);
-        var tmpCtx = tmpCanvas.context;
-        putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
-        imgToPaint = tmpCanvas.canvas;
+        ctx.scale(textHScale, 1);
       }
 
-      var paintWidth = width,
-          paintHeight = height;
-      var tmpCanvasId = "prescale1";
-
-      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {
-        var newWidth = paintWidth,
-            newHeight = paintHeight;
+      let lineWidth = current.lineWidth;
+      let resetLineWidthToOne = false;
+      const scale = current.textMatrixScale;
 
-        if (widthScale > 2 && paintWidth > 1) {
-          newWidth = Math.ceil(paintWidth / 2);
-          widthScale /= paintWidth / newWidth;
-        }
+      if (scale === 0 || lineWidth === 0) {
+        const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
 
-        if (heightScale > 2 && paintHeight > 1) {
-          newHeight = Math.ceil(paintHeight / 2);
-          heightScale /= paintHeight / newHeight;
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === 
_util.TextRenderingMode.FILL_STROKE) {
+          this._cachedGetSinglePixelWidth = null;
+          lineWidth = this.getSinglePixelWidth();
+          resetLineWidthToOne = lineWidth < 0;
         }
+      } else {
+        lineWidth /= scale;
+      }
 
-        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
-        tmpCtx = tmpCanvas.context;
-        tmpCtx.clearRect(0, 0, newWidth, newHeight);
-        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);
-        imgToPaint = tmpCanvas.canvas;
-        paintWidth = newWidth;
-        paintHeight = newHeight;
-        tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1";
+      if (fontSizeScale !== 1.0) {
+        ctx.scale(fontSizeScale, fontSizeScale);
+        lineWidth /= fontSizeScale;
       }
 
-      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height);
+      ctx.lineWidth = lineWidth;
+      let x = 0,
+          i;
 
-      if (this.imageLayer) {
-        var position = this.getCanvasPosition(0, -height);
-        this.imageLayer.appendImage({
-          imgData,
-          left: position[0],
-          top: position[1],
-          width: width / currentTransform[0],
-          height: height / currentTransform[3]
-        });
-      }
+      for (i = 0; i < glyphsLength; ++i) {
+        const glyph = glyphs[i];
 
-      this.restore();
-    },
-    paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
-      if (!this.contentVisible) {
-        return;
-      }
+        if ((0, _util.isNum)(glyph)) {
+          x += spacingDir * glyph * fontSize / 1000;
+          continue;
+        }
 
-      var ctx = this.ctx;
-      var w = imgData.width;
-      var h = imgData.height;
-      var tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h);
-      var tmpCtx = tmpCanvas.context;
-      putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
+        let restoreNeeded = false;
+        const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+        const character = glyph.fontChar;
+        const accent = glyph.accent;
+        let scaledX, scaledY;
+        let width = glyph.width;
 
-      for (var i = 0, ii = map.length; i < ii; i++) {
-        var entry = map[i];
-        ctx.save();
-        ctx.transform.apply(ctx, entry.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);
+        if (vertical) {
+          const vmetric = glyph.vmetric || defaultVMetrics;
+          const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;
+          const vy = vmetric[2] * widthAdvanceScale;
+          width = vmetric ? -vmetric[0] : width;
+          scaledX = vx / fontSizeScale;
+          scaledY = (x + vy) / fontSizeScale;
+        } else {
+          scaledX = x / fontSizeScale;
+          scaledY = 0;
+        }
 
-        if (this.imageLayer) {
-          var position = this.getCanvasPosition(entry.x, entry.y);
-          this.imageLayer.appendImage({
-            imgData,
-            left: position[0],
-            top: position[1],
-            width: w,
-            height: h
-          });
+        if (font.remeasure && width > 0) {
+          const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;
+
+          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
+            const characterScaleX = width / measuredWidth;
+            restoreNeeded = true;
+            ctx.save();
+            ctx.scale(characterScaleX, 1);
+            scaledX /= characterScaleX;
+          } else if (width !== measuredWidth) {
+            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;
+          }
         }
 
-        ctx.restore();
-      }
-    },
-    paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {
-      if (!this.contentVisible) {
-        return;
-      }
+        if (this.contentVisible && (glyph.isInFont || font.missingFile)) {
+          if (simpleFillText && !accent) {
+            ctx.fillText(character, scaledX, scaledY);
+          } else {
+            this.paintChar(character, scaledX, scaledY, patternTransform, resetLineWidthToOne);
 
-      this.ctx.fillRect(0, 0, 1, 1);
-    },
-    markPoint: function CanvasGraphics_markPoint(tag) {},
-    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},
-    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
-      this.markedContentStack.push({
-        visible: true
-      });
-    },
-    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {
-      if (tag === "OC") {
-        this.markedContentStack.push({
-          visible: this.optionalContentConfig.isVisible(properties)
-        });
-      } else {
-        this.markedContentStack.push({
-          visible: true
-        });
-      }
+            if (accent) {
+              const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;
+              const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;
+              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform, 
resetLineWidthToOne);
+            }
+          }
+        }
 
-      this.contentVisible = this.isContentVisible();
-    },
-    endMarkedContent: function CanvasGraphics_endMarkedContent() {
-      this.markedContentStack.pop();
-      this.contentVisible = this.isContentVisible();
-    },
-    beginCompat: function CanvasGraphics_beginCompat() {},
-    endCompat: function CanvasGraphics_endCompat() {},
-    consumePath: function CanvasGraphics_consumePath() {
-      var ctx = this.ctx;
+        let charWidth;
 
-      if (this.pendingClip) {
-        if (this.pendingClip === EO_CLIP) {
-          ctx.clip("evenodd");
+        if (vertical) {
+          charWidth = width * widthAdvanceScale - spacing * fontDirection;
         } else {
-          ctx.clip();
+          charWidth = width * widthAdvanceScale + spacing * fontDirection;
         }
 
-        this.pendingClip = null;
-      }
-
-      ctx.beginPath();
-    },
+        x += charWidth;
 
-    getSinglePixelWidth(scale) {
-      if (this._cachedGetSinglePixelWidth === null) {
-        const inverse = this.ctx.mozCurrentTransformInverse;
-        this._cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * 
inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3]));
+        if (restoreNeeded) {
+          ctx.restore();
+        }
       }
 
-      return this._cachedGetSinglePixelWidth;
-    },
-
-    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
-      var transform = this.ctx.mozCurrentTransform;
-      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + 
transform[5]];
-    },
-    isContentVisible: function CanvasGraphics_isContentVisible() {
-      for (let i = this.markedContentStack.length - 1; i >= 0; i--) {
-        if (!this.markedContentStack[i].visible) {
-          return false;
-        }
+      if (vertical) {
+        current.y -= x;
+      } else {
+        current.x += x * textHScale;
       }
 
-      return true;
+      ctx.restore();
+      return undefined;
     }
-  };
 
-  for (var op in _util.OPS) {
-    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];
-  }
+    showType3Text(glyphs) {
+      const ctx = this.ctx;
+      const current = this.current;
+      const font = current.font;
+      const fontSize = current.fontSize;
+      const fontDirection = current.fontDirection;
+      const spacingDir = font.vertical ? 1 : -1;
+      const charSpacing = current.charSpacing;
+      const wordSpacing = current.wordSpacing;
+      const textHScale = current.textHScale * fontDirection;
+      const fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+      const glyphsLength = glyphs.length;
+      const isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;
+      let i, glyph, width, spacingLength;
 
-  return CanvasGraphics;
-}();
+      if (isTextInvisible || fontSize === 0) {
+        return;
+      }
 
-exports.CanvasGraphics = CanvasGraphics;
+      this._cachedGetSinglePixelWidth = null;
+      ctx.save();
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.translate(current.x, current.y);
+      ctx.scale(textHScale, fontDirection);
 
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+      for (i = 0; i < glyphsLength; ++i) {
+        glyph = glyphs[i];
 
-"use strict";
+        if ((0, _util.isNum)(glyph)) {
+          spacingLength = spacingDir * glyph * fontSize / 1000;
+          this.ctx.translate(spacingLength, 0);
+          current.x += spacingLength * textHScale;
+          continue;
+        }
 
+        const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+        const operatorList = font.charProcOperatorList[glyph.operatorListId];
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getShadingPatternFromIR = getShadingPatternFromIR;
-exports.TilingPattern = void 0;
+        if (!operatorList) {
+          (0, _util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`);
+          continue;
+        }
 
-var _util = __w_pdfjs_require__(2);
+        if (this.contentVisible) {
+          this.processingType3 = glyph;
+          this.save();
+          ctx.scale(fontSize, fontSize);
+          ctx.transform.apply(ctx, fontMatrix);
+          this.executeOperatorList(operatorList);
+          this.restore();
+        }
 
-var ShadingIRs = {};
+        const transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);
 
-function applyBoundingBox(ctx, bbox) {
-  if (!bbox || typeof Path2D === "undefined") {
-    return;
-  }
+        width = transformed[0] * fontSize + spacing;
+        ctx.translate(width, 0);
+        current.x += width * textHScale;
+      }
 
-  const width = bbox[2] - bbox[0];
-  const height = bbox[3] - bbox[1];
-  const region = new Path2D();
-  region.rect(bbox[0], bbox[1], width, height);
-  ctx.clip(region);
-}
+      ctx.restore();
+      this.processingType3 = null;
+    }
 
-ShadingIRs.RadialAxial = {
-  fromIR: function RadialAxial_fromIR(raw) {
-    var type = raw[1];
-    var bbox = raw[2];
-    var colorStops = raw[3];
-    var p0 = raw[4];
-    var p1 = raw[5];
-    var r0 = raw[6];
-    var r1 = raw[7];
-    return {
-      type: "Pattern",
-      getPattern: function RadialAxial_getPattern(ctx) {
-        applyBoundingBox(ctx, bbox);
-        var grad;
+    setCharWidth(xWidth, yWidth) {}
 
-        if (type === "axial") {
-          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
-        } else if (type === "radial") {
-          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
-        }
+    setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {
+      this.ctx.rect(llx, lly, urx - llx, ury - lly);
+      this.clip();
+      this.endPath();
+    }
 
-        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
-          var c = colorStops[i];
-          grad.addColorStop(c[0], c[1]);
-        }
+    getColorN_Pattern(IR) {
+      let pattern;
 
-        return grad;
+      if (IR[0] === "TilingPattern") {
+        const color = IR[1];
+        const baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();
+        const canvasGraphicsFactory = {
+          createCanvasGraphics: ctx => {
+            return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory);
+          }
+        };
+        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, 
baseTransform);
+      } else {
+        pattern = this._getPattern(IR[1]);
       }
-    };
-  }
-};
 
-var createMeshCanvas = function createMeshCanvasClosure() {
-  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
-    var coords = context.coords,
-        colors = context.colors;
-    var bytes = data.data,
-        rowSize = data.width * 4;
-    var tmp;
-
-    if (coords[p1 + 1] > coords[p2 + 1]) {
-      tmp = p1;
-      p1 = p2;
-      p2 = tmp;
-      tmp = c1;
-      c1 = c2;
-      c2 = tmp;
-    }
-
-    if (coords[p2 + 1] > coords[p3 + 1]) {
-      tmp = p2;
-      p2 = p3;
-      p3 = tmp;
-      tmp = c2;
-      c2 = c3;
-      c3 = tmp;
-    }
-
-    if (coords[p1 + 1] > coords[p2 + 1]) {
-      tmp = p1;
-      p1 = p2;
-      p2 = tmp;
-      tmp = c1;
-      c1 = c2;
-      c2 = tmp;
-    }
-
-    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
-    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
-    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
-    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
-    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
-    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
-
-    if (y1 >= y3) {
-      return;
+      return pattern;
     }
 
-    var c1r = colors[c1],
-        c1g = colors[c1 + 1],
-        c1b = colors[c1 + 2];
-    var c2r = colors[c2],
-        c2g = colors[c2 + 1],
-        c2b = colors[c2 + 2];
-    var c3r = colors[c3],
-        c3g = colors[c3 + 1],
-        c3b = colors[c3 + 2];
-    var minY = Math.round(y1),
-        maxY = Math.round(y3);
-    var xa, car, cag, cab;
-    var xb, cbr, cbg, cbb;
+    setStrokeColorN() {
+      this.current.strokeColor = this.getColorN_Pattern(arguments);
+    }
 
-    for (var y = minY; y <= maxY; y++) {
-      if (y < y2) {
-        let k;
+    setFillColorN() {
+      this.current.fillColor = this.getColorN_Pattern(arguments);
+      this.current.patternFill = true;
+    }
 
-        if (y < y1) {
-          k = 0;
-        } else if (y1 === y2) {
-          k = 1;
-        } else {
-          k = (y1 - y) / (y1 - y2);
-        }
+    setStrokeRGBColor(r, g, b) {
+      const color = _util.Util.makeHexColor(r, g, b);
 
-        xa = x1 - (x1 - x2) * k;
-        car = c1r - (c1r - c2r) * k;
-        cag = c1g - (c1g - c2g) * k;
-        cab = c1b - (c1b - c2b) * k;
-      } else {
-        let k;
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    }
 
-        if (y > y3) {
-          k = 1;
-        } else if (y2 === y3) {
-          k = 0;
-        } else {
-          k = (y2 - y) / (y2 - y3);
-        }
+    setFillRGBColor(r, g, b) {
+      const color = _util.Util.makeHexColor(r, g, b);
+
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+      this.current.patternFill = false;
+    }
 
-        xa = x2 - (x2 - x3) * k;
-        car = c2r - (c2r - c3r) * k;
-        cag = c2g - (c2g - c3g) * k;
-        cab = c2b - (c2b - c3b) * k;
+    _getPattern(objId) {
+      if (this.cachedPatterns.has(objId)) {
+        return this.cachedPatterns.get(objId);
       }
 
-      let k;
+      const pattern = (0, _pattern_helper.getShadingPattern)(this.objs.get(objId));
+      this.cachedPatterns.set(objId, pattern);
+      return pattern;
+    }
 
-      if (y < y1) {
-        k = 0;
-      } else if (y > y3) {
-        k = 1;
-      } else {
-        k = (y1 - y) / (y1 - y3);
+    shadingFill(objId) {
+      if (!this.contentVisible) {
+        return;
       }
 
-      xb = x1 - (x1 - x3) * k;
-      cbr = c1r - (c1r - c3r) * k;
-      cbg = c1g - (c1g - c3g) * k;
-      cbb = c1b - (c1b - c3b) * k;
-      var x1_ = Math.round(Math.min(xa, xb));
-      var x2_ = Math.round(Math.max(xa, xb));
-      var j = rowSize * y + x1_ * 4;
+      const ctx = this.ctx;
+      this.save();
 
-      for (var x = x1_; x <= x2_; x++) {
-        k = (xa - x) / (xa - xb);
+      const pattern = this._getPattern(objId);
 
-        if (k < 0) {
-          k = 0;
-        } else if (k > 1) {
-          k = 1;
-        }
+      ctx.fillStyle = pattern.getPattern(ctx, this, ctx.mozCurrentTransformInverse, true);
+      const inv = ctx.mozCurrentTransformInverse;
 
-        bytes[j++] = car - (car - cbr) * k | 0;
-        bytes[j++] = cag - (cag - cbg) * k | 0;
-        bytes[j++] = cab - (cab - cbb) * k | 0;
-        bytes[j++] = 255;
-      }
-    }
-  }
+      if (inv) {
+        const canvas = ctx.canvas;
+        const width = canvas.width;
+        const height = canvas.height;
 
-  function drawFigure(data, figure, context) {
-    var ps = figure.coords;
-    var cs = figure.colors;
-    var i, ii;
+        const bl = _util.Util.applyTransform([0, 0], inv);
 
-    switch (figure.type) {
-      case "lattice":
-        var verticesPerRow = figure.verticesPerRow;
-        var rows = Math.floor(ps.length / verticesPerRow) - 1;
-        var cols = verticesPerRow - 1;
+        const br = _util.Util.applyTransform([0, height], inv);
 
-        for (i = 0; i < rows; i++) {
-          var q = i * verticesPerRow;
+        const ul = _util.Util.applyTransform([width, 0], inv);
 
-          for (var j = 0; j < cols; j++, q++) {
-            drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + 
verticesPerRow]);
-            drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q 
+ verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
-          }
-        }
+        const ur = _util.Util.applyTransform([width, height], inv);
 
-        break;
+        const x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+        const y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+        const x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+        const y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+      } else {
+        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+      }
 
-      case "triangles":
-        for (i = 0, ii = ps.length; i < ii; i += 3) {
-          drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);
-        }
+      this.restore();
+    }
 
-        break;
+    beginInlineImage() {
+      (0, _util.unreachable)("Should not call beginInlineImage");
+    }
 
-      default:
-        throw new Error("illegal figure");
-    }
-  }
-
-  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases, 
webGLContext) {
-    var EXPECTED_SCALE = 1.1;
-    var MAX_PATTERN_SIZE = 3000;
-    var BORDER_SIZE = 2;
-    var offsetX = Math.floor(bounds[0]);
-    var offsetY = Math.floor(bounds[1]);
-    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
-    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
-    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), 
MAX_PATTERN_SIZE);
-    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), 
MAX_PATTERN_SIZE);
-    var scaleX = boundsWidth / width;
-    var scaleY = boundsHeight / height;
-    var context = {
-      coords,
-      colors,
-      offsetX: -offsetX,
-      offsetY: -offsetY,
-      scaleX: 1 / scaleX,
-      scaleY: 1 / scaleY
-    };
-    var paddedWidth = width + BORDER_SIZE * 2;
-    var paddedHeight = height + BORDER_SIZE * 2;
-    var canvas, tmpCanvas, i, ii;
-
-    if (webGLContext.isEnabled) {
-      canvas = webGLContext.drawFigures({
-        width,
-        height,
-        backgroundColor,
-        figures,
-        context
-      });
-      tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false);
-      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);
-      canvas = tmpCanvas.canvas;
-    } else {
-      tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false);
-      var tmpCtx = tmpCanvas.context;
-      var data = tmpCtx.createImageData(width, height);
+    beginImageData() {
+      (0, _util.unreachable)("Should not call beginImageData");
+    }
+
+    paintFormXObjectBegin(matrix, bbox) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-      if (backgroundColor) {
-        var bytes = data.data;
+      this.save();
+      this.baseTransformStack.push(this.baseTransform);
 
-        for (i = 0, ii = bytes.length; i < ii; i += 4) {
-          bytes[i] = backgroundColor[0];
-          bytes[i + 1] = backgroundColor[1];
-          bytes[i + 2] = backgroundColor[2];
-          bytes[i + 3] = 255;
-        }
+      if (Array.isArray(matrix) && matrix.length === 6) {
+        this.transform.apply(this, matrix);
+      }
+
+      this.baseTransform = this.ctx.mozCurrentTransform;
+
+      if (bbox) {
+        const width = bbox[2] - bbox[0];
+        const height = bbox[3] - bbox[1];
+        this.ctx.rect(bbox[0], bbox[1], width, height);
+        this.clip();
+        this.endPath();
       }
+    }
 
-      for (i = 0; i < figures.length; i++) {
-        drawFigure(data, figures[i], context);
+    paintFormXObjectEnd() {
+      if (!this.contentVisible) {
+        return;
       }
 
-      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);
-      canvas = tmpCanvas.canvas;
+      this.restore();
+      this.baseTransform = this.baseTransformStack.pop();
     }
 
-    return {
-      canvas,
-      offsetX: offsetX - BORDER_SIZE * scaleX,
-      offsetY: offsetY - BORDER_SIZE * scaleY,
-      scaleX,
-      scaleY
-    };
-  }
+    beginGroup(group) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-  return createMeshCanvas;
-}();
+      this.save();
+      const currentCtx = this.ctx;
 
-ShadingIRs.Mesh = {
-  fromIR: function Mesh_fromIR(raw) {
-    var coords = raw[2];
-    var colors = raw[3];
-    var figures = raw[4];
-    var bounds = raw[5];
-    var matrix = raw[6];
-    var bbox = raw[7];
-    var background = raw[8];
-    return {
-      type: "Pattern",
-      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
-        applyBoundingBox(ctx, bbox);
-        var scale;
+      if (!group.isolated) {
+        (0, _util.info)("TODO: Support non-isolated groups.");
+      }
 
-        if (shadingFill) {
-          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
-        } else {
-          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);
+      if (group.knockout) {
+        (0, _util.warn)("Knockout groups not supported.");
+      }
 
-          if (matrix) {
-            var matrixScale = _util.Util.singularValueDecompose2dScale(matrix);
+      const currentTransform = currentCtx.mozCurrentTransform;
 
-            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];
-          }
-        }
+      if (group.matrix) {
+        currentCtx.transform.apply(currentCtx, group.matrix);
+      }
 
-        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? 
null : background, owner.cachedCanvases, owner.webGLContext);
+      if (!group.bbox) {
+        throw new Error("Bounding box is required.");
+      }
 
-        if (!shadingFill) {
-          ctx.setTransform.apply(ctx, owner.baseTransform);
+      let bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);
 
-          if (matrix) {
-            ctx.transform.apply(ctx, matrix);
-          }
-        }
+      const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
+      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
+      const offsetX = Math.floor(bounds[0]);
+      const offsetY = Math.floor(bounds[1]);
+      let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
+      let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
+      let scaleX = 1,
+          scaleY = 1;
 
-        ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
-        ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);
-        return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat");
+      if (drawnWidth > MAX_GROUP_SIZE) {
+        scaleX = drawnWidth / MAX_GROUP_SIZE;
+        drawnWidth = MAX_GROUP_SIZE;
       }
-    };
-  }
-};
-ShadingIRs.Dummy = {
-  fromIR: function Dummy_fromIR() {
-    return {
-      type: "Pattern",
-      getPattern: function Dummy_fromIR_getPattern() {
-        return "hotpink";
+
+      if (drawnHeight > MAX_GROUP_SIZE) {
+        scaleY = drawnHeight / MAX_GROUP_SIZE;
+        drawnHeight = MAX_GROUP_SIZE;
       }
-    };
-  }
-};
 
-function getShadingPatternFromIR(raw) {
-  var shadingIR = ShadingIRs[raw[0]];
+      let cacheId = "groupAt" + this.groupLevel;
 
-  if (!shadingIR) {
-    throw new Error(`Unknown IR type: ${raw[0]}`);
-  }
+      if (group.smask) {
+        cacheId += "_smask_" + this.smaskCounter++ % 2;
+      }
 
-  return shadingIR.fromIR(raw);
-}
+      const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
+      const groupCtx = scratchCanvas.context;
+      groupCtx.scale(1 / scaleX, 1 / scaleY);
+      groupCtx.translate(-offsetX, -offsetY);
+      groupCtx.transform.apply(groupCtx, currentTransform);
 
-var TilingPattern = function TilingPatternClosure() {
-  var PaintType = {
-    COLORED: 1,
-    UNCOLORED: 2
-  };
-  var MAX_PATTERN_SIZE = 3000;
+      if (group.smask) {
+        this.smaskStack.push({
+          canvas: scratchCanvas.canvas,
+          context: groupCtx,
+          offsetX,
+          offsetY,
+          scaleX,
+          scaleY,
+          subtype: group.smask.subtype,
+          backdrop: group.smask.backdrop,
+          transferMap: group.smask.transferMap || null,
+          startTransformInverse: null
+        });
+      } else {
+        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
+        currentCtx.translate(offsetX, offsetY);
+        currentCtx.scale(scaleX, scaleY);
+      }
 
-  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
-    this.operatorList = IR[2];
-    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
-    this.bbox = IR[4];
-    this.xstep = IR[5];
-    this.ystep = IR[6];
-    this.paintType = IR[7];
-    this.tilingType = IR[8];
-    this.color = color;
-    this.canvasGraphicsFactory = canvasGraphicsFactory;
-    this.baseTransform = baseTransform;
-    this.type = "Pattern";
-    this.ctx = ctx;
-  }
+      copyCtxState(currentCtx, groupCtx);
+      this.ctx = groupCtx;
+      this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]);
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+      this.current.activeSMask = null;
+    }
 
-  TilingPattern.prototype = {
-    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
-      var operatorList = this.operatorList;
-      var bbox = this.bbox;
-      var xstep = this.xstep;
-      var ystep = this.ystep;
-      var paintType = this.paintType;
-      var tilingType = this.tilingType;
-      var color = this.color;
-      var canvasGraphicsFactory = this.canvasGraphicsFactory;
-      (0, _util.info)("TilingType: " + tilingType);
-      var x0 = bbox[0],
-          y0 = bbox[1],
-          x1 = bbox[2],
-          y1 = bbox[3];
+    endGroup(group) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-      var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);
-
-      var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);
-
-      var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];
-      var dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]);
-      var dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]);
-      var tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true);
-      var tmpCtx = tmpCanvas.context;
-      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
-      graphics.groupLevel = owner.groupLevel;
-      this.setFillAndStrokeStyleToContext(graphics, paintType, color);
-      graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);
-      graphics.transform(1, 0, 0, 1, -x0, -y0);
-      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
-      graphics.executeOperatorList(operatorList);
-      this.ctx.transform(1, 0, 0, 1, x0, y0);
-      this.ctx.scale(1 / dimx.scale, 1 / dimy.scale);
-      return tmpCanvas.canvas;
-    },
-    getSizeAndScale: function TilingPattern_getSizeAndScale(step, realOutputSize, scale) {
-      step = Math.abs(step);
-      var maxSize = Math.max(MAX_PATTERN_SIZE, realOutputSize);
-      var size = Math.ceil(step * scale);
+      this.groupLevel--;
+      const groupCtx = this.ctx;
+      this.ctx = this.groupStack.pop();
 
-      if (size >= maxSize) {
-        size = maxSize;
+      if (this.ctx.imageSmoothingEnabled !== undefined) {
+        this.ctx.imageSmoothingEnabled = false;
       } else {
-        scale = size / step;
+        this.ctx.mozImageSmoothingEnabled = false;
       }
 
-      return {
-        scale,
-        size
-      };
-    },
-    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
-      if (Array.isArray(bbox) && bbox.length === 4) {
-        var bboxWidth = x1 - x0;
-        var bboxHeight = y1 - y0;
-        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
-        graphics.clip();
-        graphics.endPath();
+      if (group.smask) {
+        this.tempSMask = this.smaskStack.pop();
+      } else {
+        this.ctx.drawImage(groupCtx.canvas, 0, 0);
       }
-    },
-    setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(graphics, paintType, color) {
-      const context = graphics.ctx,
-            current = graphics.current;
-
-      switch (paintType) {
-        case PaintType.COLORED:
-          var ctx = this.ctx;
-          context.fillStyle = ctx.fillStyle;
-          context.strokeStyle = ctx.strokeStyle;
-          current.fillColor = ctx.fillStyle;
-          current.strokeColor = ctx.strokeStyle;
-          break;
 
-        case PaintType.UNCOLORED:
-          var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]);
+      this.restore();
+    }
 
-          context.fillStyle = cssColor;
-          context.strokeStyle = cssColor;
-          current.fillColor = cssColor;
-          current.strokeColor = cssColor;
-          break;
+    beginAnnotations() {
+      this.save();
 
-        default:
-          throw new _util.FormatError(`Unsupported paint type: ${paintType}`);
+      if (this.baseTransform) {
+        this.ctx.setTransform.apply(this.ctx, this.baseTransform);
       }
-    },
-    getPattern: function TilingPattern_getPattern(ctx, owner) {
-      ctx = this.ctx;
-      ctx.setTransform.apply(ctx, this.baseTransform);
-      ctx.transform.apply(ctx, this.matrix);
-      var temporaryPatternCanvas = this.createPatternCanvas(owner);
-      return ctx.createPattern(temporaryPatternCanvas, "repeat");
     }
-  };
-  return TilingPattern;
-}();
 
-exports.TilingPattern = TilingPattern;
+    endAnnotations() {
+      this.restore();
+    }
 
-/***/ }),
-/* 12 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    beginAnnotation(id, rect, transform, matrix) {
+      this.save();
+      resetCtxToDefault(this.ctx);
+      this.current = new CanvasExtraState();
 
-"use strict";
+      if (Array.isArray(rect) && rect.length === 4) {
+        const width = rect[2] - rect[0];
+        const height = rect[3] - rect[1];
+        this.ctx.rect(rect[0], rect[1], width, height);
+        this.clip();
+        this.endPath();
+      }
 
+      this.transform.apply(this, transform);
+      this.transform.apply(this, matrix);
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.GlobalWorkerOptions = void 0;
-const GlobalWorkerOptions = Object.create(null);
-exports.GlobalWorkerOptions = GlobalWorkerOptions;
-GlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : 
GlobalWorkerOptions.workerPort;
-GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? "" : 
GlobalWorkerOptions.workerSrc;
+    endAnnotation() {
+      this.restore();
+    }
 
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    paintImageMaskXObject(img) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-"use strict";
+      const ctx = this.ctx;
+      const width = img.width,
+            height = img.height;
+      const glyph = this.processingType3;
 
+      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
+        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
+          glyph.compiled = compileType3Glyph({
+            data: img.data,
+            width,
+            height
+          });
+        } else {
+          glyph.compiled = null;
+        }
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.MessageHandler = void 0;
+      if (glyph?.compiled) {
+        glyph.compiled(ctx);
+        return;
+      }
 
-var _util = __w_pdfjs_require__(2);
+      const mask = this._createMaskCanvas(img);
 
-const CallbackKind = {
-  UNKNOWN: 0,
-  DATA: 1,
-  ERROR: 2
-};
-const StreamKind = {
-  UNKNOWN: 0,
-  CANCEL: 1,
-  CANCEL_COMPLETE: 2,
-  CLOSE: 3,
-  ENQUEUE: 4,
-  ERROR: 5,
-  PULL: 6,
-  PULL_COMPLETE: 7,
-  START_COMPLETE: 8
-};
+      const maskCanvas = mask.canvas;
+      ctx.save();
+      ctx.setTransform(1, 0, 0, 1, 0, 0);
+      ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);
+      ctx.restore();
+    }
 
-function wrapReason(reason) {
-  if (typeof reason !== "object" || reason === null) {
-    return reason;
-  }
+    paintImageMaskXObjectRepeat(imgData, scaleX, skewX = 0, skewY = 0, scaleY, positions) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-  switch (reason.name) {
-    case "AbortException":
-      return new _util.AbortException(reason.message);
+      const ctx = this.ctx;
+      ctx.save();
+      const currentTransform = ctx.mozCurrentTransform;
+      ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);
 
-    case "MissingPDFException":
-      return new _util.MissingPDFException(reason.message);
+      const mask = this._createMaskCanvas(imgData);
 
-    case "UnexpectedResponseException":
-      return new _util.UnexpectedResponseException(reason.message, reason.status);
+      ctx.setTransform(1, 0, 0, 1, 0, 0);
 
-    case "UnknownErrorException":
-      return new _util.UnknownErrorException(reason.message, reason.details);
+      for (let i = 0, ii = positions.length; i < ii; i += 2) {
+        const trans = _util.Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], 
positions[i + 1]]);
 
-    default:
-      return new _util.UnknownErrorException(reason.message, reason.toString());
-  }
-}
+        const [x, y] = _util.Util.applyTransform([0, 0], trans);
 
-class MessageHandler {
-  constructor(sourceName, targetName, comObj) {
-    this.sourceName = sourceName;
-    this.targetName = targetName;
-    this.comObj = comObj;
-    this.callbackId = 1;
-    this.streamId = 1;
-    this.postMessageTransfers = true;
-    this.streamSinks = Object.create(null);
-    this.streamControllers = Object.create(null);
-    this.callbackCapabilities = Object.create(null);
-    this.actionHandler = Object.create(null);
+        ctx.drawImage(mask.canvas, x, y);
+      }
 
-    this._onComObjOnMessage = event => {
-      const data = event.data;
+      ctx.restore();
+    }
 
-      if (data.targetName !== this.sourceName) {
+    paintImageMaskXObjectGroup(images) {
+      if (!this.contentVisible) {
         return;
       }
 
-      if (data.stream) {
-        this._processStreamMessage(data);
+      const ctx = this.ctx;
+      const fillColor = this.current.fillColor;
+      const isPatternFill = this.current.patternFill;
+
+      for (let i = 0, ii = images.length; i < ii; i++) {
+        const image = images[i];
+        const width = image.width,
+              height = image.height;
+        const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
+        const maskCtx = maskCanvas.context;
+        maskCtx.save();
+        putBinaryImageMask(maskCtx, image);
+        maskCtx.globalCompositeOperation = "source-in";
+        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, 
ctx.mozCurrentTransformInverse, false) : fillColor;
+        maskCtx.fillRect(0, 0, width, height);
+        maskCtx.restore();
+        ctx.save();
+        ctx.transform.apply(ctx, image.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
+        ctx.restore();
+      }
+    }
 
+    paintImageXObject(objId) {
+      if (!this.contentVisible) {
         return;
       }
 
-      if (data.callback) {
-        const callbackId = data.callbackId;
-        const capability = this.callbackCapabilities[callbackId];
-
-        if (!capability) {
-          throw new Error(`Cannot resolve callback ${callbackId}`);
-        }
+      const imgData = objId.startsWith("g_") ? this.commonObjs.get(objId) : this.objs.get(objId);
 
-        delete this.callbackCapabilities[callbackId];
+      if (!imgData) {
+        (0, _util.warn)("Dependent image isn't ready yet");
+        return;
+      }
 
-        if (data.callback === CallbackKind.DATA) {
-          capability.resolve(data.data);
-        } else if (data.callback === CallbackKind.ERROR) {
-          capability.reject(wrapReason(data.reason));
-        } else {
-          throw new Error("Unexpected callback case");
-        }
+      this.paintInlineImageXObject(imgData);
+    }
 
+    paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {
+      if (!this.contentVisible) {
         return;
       }
 
-      const action = this.actionHandler[data.action];
+      const imgData = objId.startsWith("g_") ? this.commonObjs.get(objId) : this.objs.get(objId);
 
-      if (!action) {
-        throw new Error(`Unknown action from worker: ${data.action}`);
+      if (!imgData) {
+        (0, _util.warn)("Dependent image isn't ready yet");
+        return;
       }
 
-      if (data.callbackId) {
-        const cbSourceName = this.sourceName;
-        const cbTargetName = data.sourceName;
-        new Promise(function (resolve) {
-          resolve(action(data.data));
-        }).then(function (result) {
-          comObj.postMessage({
-            sourceName: cbSourceName,
-            targetName: cbTargetName,
-            callback: CallbackKind.DATA,
-            callbackId: data.callbackId,
-            data: result
-          });
-        }, function (reason) {
-          comObj.postMessage({
-            sourceName: cbSourceName,
-            targetName: cbTargetName,
-            callback: CallbackKind.ERROR,
-            callbackId: data.callbackId,
-            reason: wrapReason(reason)
-          });
+      const width = imgData.width;
+      const height = imgData.height;
+      const map = [];
+
+      for (let i = 0, ii = positions.length; i < ii; i += 2) {
+        map.push({
+          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],
+          x: 0,
+          y: 0,
+          w: width,
+          h: height
         });
-        return;
       }
 
-      if (data.streamId) {
-        this._createStreamSink(data);
+      this.paintInlineImageXObjectGroup(imgData, map);
+    }
 
+    paintInlineImageXObject(imgData) {
+      if (!this.contentVisible) {
         return;
       }
 
-      action(data.data);
-    };
-
-    comObj.addEventListener("message", this._onComObjOnMessage);
-  }
-
-  on(actionName, handler) {
-    const ah = this.actionHandler;
+      const width = imgData.width;
+      const height = imgData.height;
+      const ctx = this.ctx;
+      this.save();
+      ctx.scale(1 / width, -1 / height);
+      let imgToPaint;
 
-    if (ah[actionName]) {
-      throw new Error(`There is already an actionName called "${actionName}"`);
-    }
+      if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) {
+        imgToPaint = imgData;
+      } else {
+        const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height);
+        const tmpCtx = tmpCanvas.context;
+        putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
+        imgToPaint = tmpCanvas.canvas;
+      }
 
-    ah[actionName] = handler;
-  }
+      const scaled = this._scaleImage(imgToPaint, ctx.mozCurrentTransformInverse);
 
-  send(actionName, data, transfers) {
-    this._postMessage({
-      sourceName: this.sourceName,
-      targetName: this.targetName,
-      action: actionName,
-      data
-    }, transfers);
-  }
+      ctx.drawImage(scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height);
 
-  sendWithPromise(actionName, data, transfers) {
-    const callbackId = this.callbackId++;
-    const capability = (0, _util.createPromiseCapability)();
-    this.callbackCapabilities[callbackId] = capability;
+      if (this.imageLayer) {
+        const position = this.getCanvasPosition(0, -height);
+        this.imageLayer.appendImage({
+          imgData,
+          left: position[0],
+          top: position[1],
+          width: width / ctx.mozCurrentTransformInverse[0],
+          height: height / ctx.mozCurrentTransformInverse[3]
+        });
+      }
 
-    try {
-      this._postMessage({
-        sourceName: this.sourceName,
-        targetName: this.targetName,
-        action: actionName,
-        callbackId,
-        data
-      }, transfers);
-    } catch (ex) {
-      capability.reject(ex);
+      this.restore();
     }
 
-    return capability.promise;
-  }
+    paintInlineImageXObjectGroup(imgData, map) {
+      if (!this.contentVisible) {
+        return;
+      }
 
-  sendWithStream(actionName, data, queueingStrategy, transfers) {
-    const streamId = this.streamId++;
-    const sourceName = this.sourceName;
-    const targetName = this.targetName;
-    const comObj = this.comObj;
-    return new ReadableStream({
-      start: controller => {
-        const startCapability = (0, _util.createPromiseCapability)();
-        this.streamControllers[streamId] = {
-          controller,
-          startCall: startCapability,
-          pullCall: null,
-          cancelCall: null,
-          isClosed: false
-        };
+      const ctx = this.ctx;
+      const w = imgData.width;
+      const h = imgData.height;
+      const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h);
+      const tmpCtx = tmpCanvas.context;
+      putBinaryImageData(tmpCtx, imgData, this.current.transferMaps);
 
-        this._postMessage({
-          sourceName,
-          targetName,
-          action: actionName,
-          streamId,
-          data,
-          desiredSize: controller.desiredSize
-        }, transfers);
+      for (let i = 0, ii = map.length; i < ii; i++) {
+        const entry = map[i];
+        ctx.save();
+        ctx.transform.apply(ctx, entry.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);
 
-        return startCapability.promise;
-      },
-      pull: controller => {
-        const pullCapability = (0, _util.createPromiseCapability)();
-        this.streamControllers[streamId].pullCall = pullCapability;
-        comObj.postMessage({
-          sourceName,
-          targetName,
-          stream: StreamKind.PULL,
-          streamId,
-          desiredSize: controller.desiredSize
-        });
-        return pullCapability.promise;
-      },
-      cancel: reason => {
-        (0, _util.assert)(reason instanceof Error, "cancel must have a valid reason");
-        const cancelCapability = (0, _util.createPromiseCapability)();
-        this.streamControllers[streamId].cancelCall = cancelCapability;
-        this.streamControllers[streamId].isClosed = true;
-        comObj.postMessage({
-          sourceName,
-          targetName,
-          stream: StreamKind.CANCEL,
-          streamId,
-          reason: wrapReason(reason)
-        });
-        return cancelCapability.promise;
+        if (this.imageLayer) {
+          const position = this.getCanvasPosition(entry.x, entry.y);
+          this.imageLayer.appendImage({
+            imgData,
+            left: position[0],
+            top: position[1],
+            width: w,
+            height: h
+          });
+        }
+
+        ctx.restore();
       }
-    }, queueingStrategy);
-  }
+    }
 
-  _createStreamSink(data) {
-    const self = this;
-    const action = this.actionHandler[data.action];
-    const streamId = data.streamId;
-    const sourceName = this.sourceName;
-    const targetName = data.sourceName;
-    const comObj = this.comObj;
-    const streamSink = {
-      enqueue(chunk, size = 1, transfers) {
-        if (this.isCancelled) {
-          return;
-        }
+    paintSolidColorImageMask() {
+      if (!this.contentVisible) {
+        return;
+      }
 
-        const lastDesiredSize = this.desiredSize;
-        this.desiredSize -= size;
+      this.ctx.fillRect(0, 0, 1, 1);
+    }
 
-        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
-          this.sinkCapability = (0, _util.createPromiseCapability)();
-          this.ready = this.sinkCapability.promise;
-        }
+    markPoint(tag) {}
 
-        self._postMessage({
-          sourceName,
-          targetName,
-          stream: StreamKind.ENQUEUE,
-          streamId,
-          chunk
-        }, transfers);
-      },
+    markPointProps(tag, properties) {}
 
-      close() {
-        if (this.isCancelled) {
-          return;
-        }
+    beginMarkedContent(tag) {
+      this.markedContentStack.push({
+        visible: true
+      });
+    }
 
-        this.isCancelled = true;
-        comObj.postMessage({
-          sourceName,
-          targetName,
-          stream: StreamKind.CLOSE,
-          streamId
+    beginMarkedContentProps(tag, properties) {
+      if (tag === "OC") {
+        this.markedContentStack.push({
+          visible: this.optionalContentConfig.isVisible(properties)
         });
-        delete self.streamSinks[streamId];
-      },
+      } else {
+        this.markedContentStack.push({
+          visible: true
+        });
+      }
 
-      error(reason) {
-        (0, _util.assert)(reason instanceof Error, "error must have a valid reason");
+      this.contentVisible = this.isContentVisible();
+    }
 
-        if (this.isCancelled) {
-          return;
-        }
+    endMarkedContent() {
+      this.markedContentStack.pop();
+      this.contentVisible = this.isContentVisible();
+    }
 
-        this.isCancelled = true;
-        comObj.postMessage({
-          sourceName,
-          targetName,
-          stream: StreamKind.ERROR,
-          streamId,
-          reason: wrapReason(reason)
-        });
-      },
+    beginCompat() {}
 
-      sinkCapability: (0, _util.createPromiseCapability)(),
-      onPull: null,
-      onCancel: null,
-      isCancelled: false,
-      desiredSize: data.desiredSize,
-      ready: null
-    };
-    streamSink.sinkCapability.resolve();
-    streamSink.ready = streamSink.sinkCapability.promise;
-    this.streamSinks[streamId] = streamSink;
-    new Promise(function (resolve) {
-      resolve(action(data.data, streamSink));
-    }).then(function () {
-      comObj.postMessage({
-        sourceName,
-        targetName,
-        stream: StreamKind.START_COMPLETE,
-        streamId,
-        success: true
-      });
-    }, function (reason) {
-      comObj.postMessage({
-        sourceName,
-        targetName,
-        stream: StreamKind.START_COMPLETE,
-        streamId,
-        reason: wrapReason(reason)
-      });
-    });
-  }
+    endCompat() {}
 
-  _processStreamMessage(data) {
-    const streamId = data.streamId;
-    const sourceName = this.sourceName;
-    const targetName = data.sourceName;
-    const comObj = this.comObj;
+    consumePath() {
+      const ctx = this.ctx;
 
-    switch (data.stream) {
-      case StreamKind.START_COMPLETE:
-        if (data.success) {
-          this.streamControllers[streamId].startCall.resolve();
+      if (this.pendingClip) {
+        if (this.pendingClip === EO_CLIP) {
+          ctx.clip("evenodd");
         } else {
-          this.streamControllers[streamId].startCall.reject(wrapReason(data.reason));
+          ctx.clip();
         }
 
-        break;
+        this.pendingClip = null;
+      }
 
-      case StreamKind.PULL_COMPLETE:
-        if (data.success) {
-          this.streamControllers[streamId].pullCall.resolve();
+      ctx.beginPath();
+    }
+
+    getSinglePixelWidth() {
+      if (this._cachedGetSinglePixelWidth === null) {
+        const m = this.ctx.mozCurrentTransform;
+        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);
+        const sqNorm1 = m[0] ** 2 + m[2] ** 2;
+        const sqNorm2 = m[1] ** 2 + m[3] ** 2;
+        const pixelHeight = Math.sqrt(Math.max(sqNorm1, sqNorm2)) / absDet;
+
+        if (sqNorm1 !== sqNorm2 && this._combinedScaleFactor * pixelHeight > 1) {
+          this._cachedGetSinglePixelWidth = -(this._combinedScaleFactor * pixelHeight);
+        } else if (absDet > Number.EPSILON) {
+          this._cachedGetSinglePixelWidth = pixelHeight;
         } else {
-          this.streamControllers[streamId].pullCall.reject(wrapReason(data.reason));
+          this._cachedGetSinglePixelWidth = 1;
         }
+      }
 
-        break;
+      return this._cachedGetSinglePixelWidth;
+    }
 
-      case StreamKind.PULL:
-        if (!this.streamSinks[streamId]) {
-          comObj.postMessage({
-            sourceName,
-            targetName,
-            stream: StreamKind.PULL_COMPLETE,
-            streamId,
-            success: true
-          });
-          break;
-        }
+    getCanvasPosition(x, y) {
+      const transform = this.ctx.mozCurrentTransform;
+      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + 
transform[5]];
+    }
 
-        if (this.streamSinks[streamId].desiredSize <= 0 && data.desiredSize > 0) {
-          this.streamSinks[streamId].sinkCapability.resolve();
+    isContentVisible() {
+      for (let i = this.markedContentStack.length - 1; i >= 0; i--) {
+        if (!this.markedContentStack[i].visible) {
+          return false;
         }
+      }
 
-        this.streamSinks[streamId].desiredSize = data.desiredSize;
-        const {
-          onPull
-        } = this.streamSinks[data.streamId];
-        new Promise(function (resolve) {
-          resolve(onPull && onPull());
-        }).then(function () {
-          comObj.postMessage({
-            sourceName,
-            targetName,
-            stream: StreamKind.PULL_COMPLETE,
-            streamId,
-            success: true
-          });
-        }, function (reason) {
-          comObj.postMessage({
-            sourceName,
-            targetName,
-            stream: StreamKind.PULL_COMPLETE,
-            streamId,
-            reason: wrapReason(reason)
-          });
-        });
-        break;
+      return true;
+    }
 
-      case StreamKind.ENQUEUE:
-        (0, _util.assert)(this.streamControllers[streamId], "enqueue should have stream controller");
+  }
 
-        if (this.streamControllers[streamId].isClosed) {
-          break;
-        }
+  for (const op in _util.OPS) {
+    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];
+  }
 
-        this.streamControllers[streamId].controller.enqueue(data.chunk);
-        break;
+  return CanvasGraphics;
+}();
 
-      case StreamKind.CLOSE:
-        (0, _util.assert)(this.streamControllers[streamId], "close should have stream controller");
+exports.CanvasGraphics = CanvasGraphics;
 
-        if (this.streamControllers[streamId].isClosed) {
-          break;
-        }
+/***/ }),
+/* 11 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-        this.streamControllers[streamId].isClosed = true;
-        this.streamControllers[streamId].controller.close();
 
-        this._deleteStreamController(streamId);
 
-        break;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getShadingPattern = getShadingPattern;
+exports.TilingPattern = void 0;
 
-      case StreamKind.ERROR:
-        (0, _util.assert)(this.streamControllers[streamId], "error should have stream controller");
-        this.streamControllers[streamId].controller.error(wrapReason(data.reason));
+var _util = __w_pdfjs_require__(2);
 
-        this._deleteStreamController(streamId);
+function applyBoundingBox(ctx, bbox) {
+  if (!bbox || typeof Path2D === "undefined") {
+    return;
+  }
 
-        break;
+  const width = bbox[2] - bbox[0];
+  const height = bbox[3] - bbox[1];
+  const region = new Path2D();
+  region.rect(bbox[0], bbox[1], width, height);
+  ctx.clip(region);
+}
 
-      case StreamKind.CANCEL_COMPLETE:
-        if (data.success) {
-          this.streamControllers[streamId].cancelCall.resolve();
-        } else {
-          this.streamControllers[streamId].cancelCall.reject(wrapReason(data.reason));
-        }
+class BaseShadingPattern {
+  constructor() {
+    if (this.constructor === BaseShadingPattern) {
+      (0, _util.unreachable)("Cannot initialize BaseShadingPattern.");
+    }
+  }
 
-        this._deleteStreamController(streamId);
+  getPattern() {
+    (0, _util.unreachable)("Abstract method `getPattern` called.");
+  }
 
-        break;
+}
 
-      case StreamKind.CANCEL:
-        if (!this.streamSinks[streamId]) {
-          break;
-        }
+class RadialAxialShadingPattern extends BaseShadingPattern {
+  constructor(IR) {
+    super();
+    this._type = IR[1];
+    this._bbox = IR[2];
+    this._colorStops = IR[3];
+    this._p0 = IR[4];
+    this._p1 = IR[5];
+    this._r0 = IR[6];
+    this._r1 = IR[7];
+    this._matrix = IR[8];
+    this._patternCache = null;
+  }
 
-        const {
-          onCancel
-        } = this.streamSinks[data.streamId];
-        new Promise(function (resolve) {
-          resolve(onCancel && onCancel(wrapReason(data.reason)));
-        }).then(function () {
-          comObj.postMessage({
-            sourceName,
-            targetName,
-            stream: StreamKind.CANCEL_COMPLETE,
-            streamId,
-            success: true
-          });
-        }, function (reason) {
-          comObj.postMessage({
-            sourceName,
-            targetName,
-            stream: StreamKind.CANCEL_COMPLETE,
-            streamId,
-            reason: wrapReason(reason)
-          });
-        });
-        this.streamSinks[streamId].sinkCapability.reject(wrapReason(data.reason));
-        this.streamSinks[streamId].isCancelled = true;
-        delete this.streamSinks[streamId];
-        break;
+  _createGradient(ctx) {
+    let grad;
 
-      default:
-        throw new Error("Unexpected stream case");
+    if (this._type === "axial") {
+      grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]);
+    } else if (this._type === "radial") {
+      grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], 
this._r1);
     }
-  }
 
-  async _deleteStreamController(streamId) {
-    await Promise.allSettled([this.streamControllers[streamId].startCall, 
this.streamControllers[streamId].pullCall, this.streamControllers[streamId].cancelCall].map(function 
(capability) {
-      return capability && capability.promise;
-    }));
-    delete this.streamControllers[streamId];
+    for (const colorStop of this._colorStops) {
+      grad.addColorStop(colorStop[0], colorStop[1]);
+    }
+
+    return grad;
   }
 
-  _postMessage(message, transfers) {
-    if (transfers && this.postMessageTransfers) {
-      this.comObj.postMessage(message, transfers);
+  getPattern(ctx, owner, inverse, shadingFill = false) {
+    let pattern;
+
+    if (this._patternCache) {
+      pattern = this._patternCache;
     } else {
-      this.comObj.postMessage(message);
+      if (!shadingFill) {
+        const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", owner.ctx.canvas.width, 
owner.ctx.canvas.height, true);
+        const tmpCtx = tmpCanvas.context;
+        tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
+        tmpCtx.beginPath();
+        tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
+        tmpCtx.setTransform.apply(tmpCtx, owner.baseTransform);
+
+        if (this._matrix) {
+          tmpCtx.transform.apply(tmpCtx, this._matrix);
+        }
+
+        applyBoundingBox(tmpCtx, this._bbox);
+        tmpCtx.fillStyle = this._createGradient(tmpCtx);
+        tmpCtx.fill();
+        pattern = ctx.createPattern(tmpCanvas.canvas, "repeat");
+      } else {
+        applyBoundingBox(ctx, this._bbox);
+        pattern = this._createGradient(ctx);
+      }
+
+      this._patternCache = pattern;
+    }
+
+    if (!shadingFill) {
+      const domMatrix = new DOMMatrix(inverse);
+
+      try {
+        pattern.setTransform(domMatrix);
+      } catch (ex) {
+        (0, _util.warn)(`RadialAxialShadingPattern.getPattern: "${ex?.message}".`);
+      }
     }
+
+    return pattern;
   }
 
-  destroy() {
-    this.comObj.removeEventListener("message", this._onComObjOnMessage);
+}
+
+function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
+  const coords = context.coords,
+        colors = context.colors;
+  const bytes = data.data,
+        rowSize = data.width * 4;
+  let tmp;
+
+  if (coords[p1 + 1] > coords[p2 + 1]) {
+    tmp = p1;
+    p1 = p2;
+    p2 = tmp;
+    tmp = c1;
+    c1 = c2;
+    c2 = tmp;
+  }
+
+  if (coords[p2 + 1] > coords[p3 + 1]) {
+    tmp = p2;
+    p2 = p3;
+    p3 = tmp;
+    tmp = c2;
+    c2 = c3;
+    c3 = tmp;
+  }
+
+  if (coords[p1 + 1] > coords[p2 + 1]) {
+    tmp = p1;
+    p1 = p2;
+    p2 = tmp;
+    tmp = c1;
+    c1 = c2;
+    c2 = tmp;
+  }
+
+  const x1 = (coords[p1] + context.offsetX) * context.scaleX;
+  const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
+  const x2 = (coords[p2] + context.offsetX) * context.scaleX;
+  const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
+  const x3 = (coords[p3] + context.offsetX) * context.scaleX;
+  const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
+
+  if (y1 >= y3) {
+    return;
+  }
+
+  const c1r = colors[c1],
+        c1g = colors[c1 + 1],
+        c1b = colors[c1 + 2];
+  const c2r = colors[c2],
+        c2g = colors[c2 + 1],
+        c2b = colors[c2 + 2];
+  const c3r = colors[c3],
+        c3g = colors[c3 + 1],
+        c3b = colors[c3 + 2];
+  const minY = Math.round(y1),
+        maxY = Math.round(y3);
+  let xa, car, cag, cab;
+  let xb, cbr, cbg, cbb;
+
+  for (let y = minY; y <= maxY; y++) {
+    if (y < y2) {
+      let k;
+
+      if (y < y1) {
+        k = 0;
+      } else {
+        k = (y1 - y) / (y1 - y2);
+      }
+
+      xa = x1 - (x1 - x2) * k;
+      car = c1r - (c1r - c2r) * k;
+      cag = c1g - (c1g - c2g) * k;
+      cab = c1b - (c1b - c2b) * k;
+    } else {
+      let k;
+
+      if (y > y3) {
+        k = 1;
+      } else if (y2 === y3) {
+        k = 0;
+      } else {
+        k = (y2 - y) / (y2 - y3);
+      }
+
+      xa = x2 - (x2 - x3) * k;
+      car = c2r - (c2r - c3r) * k;
+      cag = c2g - (c2g - c3g) * k;
+      cab = c2b - (c2b - c3b) * k;
+    }
+
+    let k;
+
+    if (y < y1) {
+      k = 0;
+    } else if (y > y3) {
+      k = 1;
+    } else {
+      k = (y1 - y) / (y1 - y3);
+    }
+
+    xb = x1 - (x1 - x3) * k;
+    cbr = c1r - (c1r - c3r) * k;
+    cbg = c1g - (c1g - c3g) * k;
+    cbb = c1b - (c1b - c3b) * k;
+    const x1_ = Math.round(Math.min(xa, xb));
+    const x2_ = Math.round(Math.max(xa, xb));
+    let j = rowSize * y + x1_ * 4;
+
+    for (let x = x1_; x <= x2_; x++) {
+      k = (xa - x) / (xa - xb);
+
+      if (k < 0) {
+        k = 0;
+      } else if (k > 1) {
+        k = 1;
+      }
+
+      bytes[j++] = car - (car - cbr) * k | 0;
+      bytes[j++] = cag - (cag - cbg) * k | 0;
+      bytes[j++] = cab - (cab - cbb) * k | 0;
+      bytes[j++] = 255;
+    }
   }
+}
+
+function drawFigure(data, figure, context) {
+  const ps = figure.coords;
+  const cs = figure.colors;
+  let i, ii;
+
+  switch (figure.type) {
+    case "lattice":
+      const verticesPerRow = figure.verticesPerRow;
+      const rows = Math.floor(ps.length / verticesPerRow) - 1;
+      const cols = verticesPerRow - 1;
+
+      for (i = 0; i < rows; i++) {
+        let q = i * verticesPerRow;
+
+        for (let j = 0; j < cols; j++, q++) {
+          drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + 
verticesPerRow]);
+          drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + 
verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
+        }
+      }
+
+      break;
+
+    case "triangles":
+      for (i = 0, ii = ps.length; i < ii; i += 3) {
+        drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);
+      }
+
+      break;
 
+    default:
+      throw new Error("illegal figure");
+  }
 }
 
-exports.MessageHandler = MessageHandler;
+class MeshShadingPattern extends BaseShadingPattern {
+  constructor(IR) {
+    super();
+    this._coords = IR[2];
+    this._colors = IR[3];
+    this._figures = IR[4];
+    this._bounds = IR[5];
+    this._matrix = IR[6];
+    this._bbox = IR[7];
+    this._background = IR[8];
+  }
+
+  _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {
+    const EXPECTED_SCALE = 1.1;
+    const MAX_PATTERN_SIZE = 3000;
+    const BORDER_SIZE = 2;
+    const offsetX = Math.floor(this._bounds[0]);
+    const offsetY = Math.floor(this._bounds[1]);
+    const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;
+    const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;
+    const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), 
MAX_PATTERN_SIZE);
+    const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), 
MAX_PATTERN_SIZE);
+    const scaleX = boundsWidth / width;
+    const scaleY = boundsHeight / height;
+    const context = {
+      coords: this._coords,
+      colors: this._colors,
+      offsetX: -offsetX,
+      offsetY: -offsetY,
+      scaleX: 1 / scaleX,
+      scaleY: 1 / scaleY
+    };
+    const paddedWidth = width + BORDER_SIZE * 2;
+    const paddedHeight = height + BORDER_SIZE * 2;
+    const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false);
+    const tmpCtx = tmpCanvas.context;
+    const data = tmpCtx.createImageData(width, height);
 
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    if (backgroundColor) {
+      const bytes = data.data;
 
-"use strict";
+      for (let i = 0, ii = bytes.length; i < ii; i += 4) {
+        bytes[i] = backgroundColor[0];
+        bytes[i + 1] = backgroundColor[1];
+        bytes[i + 2] = backgroundColor[2];
+        bytes[i + 3] = 255;
+      }
+    }
 
+    for (const figure of this._figures) {
+      drawFigure(data, figure, context);
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Metadata = void 0;
+    tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);
+    const canvas = tmpCanvas.canvas;
+    return {
+      canvas,
+      offsetX: offsetX - BORDER_SIZE * scaleX,
+      offsetY: offsetY - BORDER_SIZE * scaleY,
+      scaleX,
+      scaleY
+    };
+  }
 
-var _util = __w_pdfjs_require__(2);
+  getPattern(ctx, owner, inverse, shadingFill = false) {
+    applyBoundingBox(ctx, this._bbox);
+    let scale;
 
-var _xml_parser = __w_pdfjs_require__(15);
+    if (shadingFill) {
+      scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
+    } else {
+      scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);
 
-class Metadata {
-  constructor(data) {
-    (0, _util.assert)(typeof data === "string", "Metadata: input is not a string");
-    data = this._repair(data);
-    const parser = new _xml_parser.SimpleXMLParser();
-    const xmlDocument = parser.parseFromString(data);
-    this._metadataMap = new Map();
+      if (this._matrix) {
+        const matrixScale = _util.Util.singularValueDecompose2dScale(this._matrix);
 
-    if (xmlDocument) {
-      this._parse(xmlDocument);
+        scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];
+      }
     }
-  }
 
-  _repair(data) {
-    return data.replace(/^[^<]+/, "").replace(/>\\376\\377([^<]+)/g, function (all, codes) {
-      const bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {
-        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
-      }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
-        switch (name) {
-          case "amp":
-            return "&";
+    const temporaryPatternCanvas = this._createMeshCanvas(scale, shadingFill ? null : this._background, 
owner.cachedCanvases);
 
-          case "apos":
-            return "'";
+    if (!shadingFill) {
+      ctx.setTransform.apply(ctx, owner.baseTransform);
 
-          case "gt":
-            return ">";
+      if (this._matrix) {
+        ctx.transform.apply(ctx, this._matrix);
+      }
+    }
 
-          case "lt":
-            return "<";
+    ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
+    ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);
+    return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat");
+  }
 
-          case "quot":
-            return '"';
-        }
+}
 
-        throw new Error(`_repair: ${name} isn't defined.`);
-      });
-      let chars = "";
+class DummyShadingPattern extends BaseShadingPattern {
+  getPattern() {
+    return "hotpink";
+  }
 
-      for (let i = 0, ii = bytes.length; i < ii; i += 2) {
-        const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+}
 
-        if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
-          chars += String.fromCharCode(code);
-        } else {
-          chars += "&#x" + (0x10000 + code).toString(16).substring(1) + ";";
-        }
-      }
+function getShadingPattern(IR) {
+  switch (IR[0]) {
+    case "RadialAxial":
+      return new RadialAxialShadingPattern(IR);
 
-      return ">" + chars;
-    });
+    case "Mesh":
+      return new MeshShadingPattern(IR);
+
+    case "Dummy":
+      return new DummyShadingPattern();
   }
 
-  _parse(xmlDocument) {
-    let rdf = xmlDocument.documentElement;
+  throw new Error(`Unknown IR type: ${IR[0]}`);
+}
 
-    if (rdf.nodeName.toLowerCase() !== "rdf:rdf") {
-      rdf = rdf.firstChild;
+const PaintType = {
+  COLORED: 1,
+  UNCOLORED: 2
+};
 
-      while (rdf && rdf.nodeName.toLowerCase() !== "rdf:rdf") {
-        rdf = rdf.nextSibling;
-      }
-    }
+class TilingPattern {
+  static get MAX_PATTERN_SIZE() {
+    return (0, _util.shadow)(this, "MAX_PATTERN_SIZE", 3000);
+  }
 
-    const nodeName = rdf ? rdf.nodeName.toLowerCase() : null;
+  constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
+    this.operatorList = IR[2];
+    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
+    this.bbox = IR[4];
+    this.xstep = IR[5];
+    this.ystep = IR[6];
+    this.paintType = IR[7];
+    this.tilingType = IR[8];
+    this.color = color;
+    this.ctx = ctx;
+    this.canvasGraphicsFactory = canvasGraphicsFactory;
+    this.baseTransform = baseTransform;
+  }
 
-    if (!rdf || nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) {
-      return;
-    }
+  createPatternCanvas(owner) {
+    const operatorList = this.operatorList;
+    const bbox = this.bbox;
+    const xstep = this.xstep;
+    const ystep = this.ystep;
+    const paintType = this.paintType;
+    const tilingType = this.tilingType;
+    const color = this.color;
+    const canvasGraphicsFactory = this.canvasGraphicsFactory;
+    (0, _util.info)("TilingType: " + tilingType);
+    const x0 = bbox[0],
+          y0 = bbox[1],
+          x1 = bbox[2],
+          y1 = bbox[3];
 
-    const children = rdf.childNodes;
+    const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);
 
-    for (let i = 0, ii = children.length; i < ii; i++) {
-      const desc = children[i];
+    const curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);
 
-      if (desc.nodeName.toLowerCase() !== "rdf:description") {
-        continue;
-      }
+    const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];
+    const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]);
+    const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]);
+    const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true);
+    const tmpCtx = tmpCanvas.context;
+    const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
+    graphics.groupLevel = owner.groupLevel;
+    this.setFillAndStrokeStyleToContext(graphics, paintType, color);
+    let adjustedX0 = x0;
+    let adjustedY0 = y0;
+    let adjustedX1 = x1;
+    let adjustedY1 = y1;
 
-      for (let j = 0, jj = desc.childNodes.length; j < jj; j++) {
-        if (desc.childNodes[j].nodeName.toLowerCase() !== "#text") {
-          const entry = desc.childNodes[j];
-          const name = entry.nodeName.toLowerCase();
+    if (x0 < 0) {
+      adjustedX0 = 0;
+      adjustedX1 += Math.abs(x0);
+    }
 
-          this._metadataMap.set(name, entry.textContent.trim());
-        }
-      }
+    if (y0 < 0) {
+      adjustedY0 = 0;
+      adjustedY1 += Math.abs(y0);
     }
-  }
 
-  get(name) {
-    return this._metadataMap.has(name) ? this._metadataMap.get(name) : null;
+    tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0));
+    graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);
+    this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1);
+    graphics.baseTransform = graphics.ctx.mozCurrentTransform.slice();
+    graphics.executeOperatorList(operatorList);
+    graphics.endDrawing();
+    return {
+      canvas: tmpCanvas.canvas,
+      scaleX: dimx.scale,
+      scaleY: dimy.scale,
+      offsetX: adjustedX0,
+      offsetY: adjustedY0
+    };
   }
 
-  getAll() {
-    return Object.fromEntries(this._metadataMap);
+  getSizeAndScale(step, realOutputSize, scale) {
+    step = Math.abs(step);
+    const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);
+    let size = Math.ceil(step * scale);
+
+    if (size >= maxSize) {
+      size = maxSize;
+    } else {
+      scale = size / step;
+    }
+
+    return {
+      scale,
+      size
+    };
   }
 
-  has(name) {
-    return this._metadataMap.has(name);
+  clipBbox(graphics, x0, y0, x1, y1) {
+    const bboxWidth = x1 - x0;
+    const bboxHeight = y1 - y0;
+    graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
+    graphics.clip();
+    graphics.endPath();
   }
 
-}
+  setFillAndStrokeStyleToContext(graphics, paintType, color) {
+    const context = graphics.ctx,
+          current = graphics.current;
 
-exports.Metadata = Metadata;
+    switch (paintType) {
+      case PaintType.COLORED:
+        const ctx = this.ctx;
+        context.fillStyle = ctx.fillStyle;
+        context.strokeStyle = ctx.strokeStyle;
+        current.fillColor = ctx.fillStyle;
+        current.strokeColor = ctx.strokeStyle;
+        break;
 
-/***/ }),
-/* 15 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+      case PaintType.UNCOLORED:
+        const cssColor = _util.Util.makeHexColor(color[0], color[1], color[2]);
 
-"use strict";
+        context.fillStyle = cssColor;
+        context.strokeStyle = cssColor;
+        current.fillColor = cssColor;
+        current.strokeColor = cssColor;
+        break;
 
+      default:
+        throw new _util.FormatError(`Unsupported paint type: ${paintType}`);
+    }
+  }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.SimpleXMLParser = void 0;
-const XMLParserErrorCode = {
-  NoError: 0,
-  EndOfDocument: -1,
-  UnterminatedCdat: -2,
-  UnterminatedXmlDeclaration: -3,
-  UnterminatedDoctypeDeclaration: -4,
-  UnterminatedComment: -5,
-  MalformedElement: -6,
-  OutOfMemory: -7,
-  UnterminatedAttributeValue: -8,
-  UnterminatedElement: -9,
-  ElementNeverBegun: -10
-};
+  getPattern(ctx, owner, inverse, shadingFill = false) {
+    let matrix = inverse;
 
-function isWhitespace(s, index) {
-  const ch = s[index];
-  return ch === " " || ch === "\n" || ch === "\r" || ch === "\t";
-}
+    if (!shadingFill) {
+      matrix = _util.Util.transform(matrix, owner.baseTransform);
 
-function isWhitespaceString(s) {
-  for (let i = 0, ii = s.length; i < ii; i++) {
-    if (!isWhitespace(s, i)) {
-      return false;
+      if (this.matrix) {
+        matrix = _util.Util.transform(matrix, this.matrix);
+      }
     }
-  }
 
-  return true;
-}
+    const temporaryPatternCanvas = this.createPatternCanvas(owner);
+    let domMatrix = new DOMMatrix(matrix);
+    domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
+    domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY);
+    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat");
 
-class XMLParserBase {
-  _resolveEntities(s) {
-    return s.replace(/&([^;]+);/g, (all, entity) => {
-      if (entity.substring(0, 2) === "#x") {
-        return String.fromCharCode(parseInt(entity.substring(2), 16));
-      } else if (entity.substring(0, 1) === "#") {
-        return String.fromCharCode(parseInt(entity.substring(1), 10));
-      }
+    try {
+      pattern.setTransform(domMatrix);
+    } catch (ex) {
+      (0, _util.warn)(`TilingPattern.getPattern: "${ex?.message}".`);
+    }
 
-      switch (entity) {
-        case "lt":
-          return "<";
+    return pattern;
+  }
 
-        case "gt":
-          return ">";
+}
 
-        case "amp":
-          return "&";
+exports.TilingPattern = TilingPattern;
 
-        case "quot":
-          return '"';
-      }
+/***/ }),
+/* 12 */
+/***/ ((__unused_webpack_module, exports) => {
 
-      return this.onResolveEntity(entity);
-    });
-  }
 
-  _parseContent(s, start) {
-    const attributes = [];
-    let pos = start;
 
-    function skipWs() {
-      while (pos < s.length && isWhitespace(s, pos)) {
-        ++pos;
-      }
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.GlobalWorkerOptions = void 0;
+const GlobalWorkerOptions = Object.create(null);
+exports.GlobalWorkerOptions = GlobalWorkerOptions;
+GlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : 
GlobalWorkerOptions.workerPort;
+GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? "" : 
GlobalWorkerOptions.workerSrc;
 
-    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") {
-      ++pos;
-    }
+/***/ }),
+/* 13 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    const name = s.substring(start, pos);
-    skipWs();
 
-    while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") {
-      skipWs();
-      let attrName = "",
-          attrValue = "";
 
-      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") {
-        attrName += s[pos];
-        ++pos;
-      }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.MessageHandler = void 0;
 
-      skipWs();
+var _util = __w_pdfjs_require__(2);
 
-      if (s[pos] !== "=") {
-        return null;
-      }
+const CallbackKind = {
+  UNKNOWN: 0,
+  DATA: 1,
+  ERROR: 2
+};
+const StreamKind = {
+  UNKNOWN: 0,
+  CANCEL: 1,
+  CANCEL_COMPLETE: 2,
+  CLOSE: 3,
+  ENQUEUE: 4,
+  ERROR: 5,
+  PULL: 6,
+  PULL_COMPLETE: 7,
+  START_COMPLETE: 8
+};
 
-      ++pos;
-      skipWs();
-      const attrEndChar = s[pos];
+function wrapReason(reason) {
+  if (typeof reason !== "object" || reason === null) {
+    return reason;
+  }
 
-      if (attrEndChar !== '"' && attrEndChar !== "'") {
-        return null;
-      }
+  switch (reason.name) {
+    case "AbortException":
+      return new _util.AbortException(reason.message);
 
-      const attrEndIndex = s.indexOf(attrEndChar, ++pos);
+    case "MissingPDFException":
+      return new _util.MissingPDFException(reason.message);
 
-      if (attrEndIndex < 0) {
-        return null;
-      }
+    case "UnexpectedResponseException":
+      return new _util.UnexpectedResponseException(reason.message, reason.status);
 
-      attrValue = s.substring(pos, attrEndIndex);
-      attributes.push({
-        name: attrName,
-        value: this._resolveEntities(attrValue)
-      });
-      pos = attrEndIndex + 1;
-      skipWs();
-    }
+    case "UnknownErrorException":
+      return new _util.UnknownErrorException(reason.message, reason.details);
 
-    return {
-      name,
-      attributes,
-      parsed: pos - start
-    };
+    default:
+      return new _util.UnknownErrorException(reason.message, reason.toString());
   }
+}
 
-  _parseProcessingInstruction(s, start) {
-    let pos = start;
+class MessageHandler {
+  constructor(sourceName, targetName, comObj) {
+    this.sourceName = sourceName;
+    this.targetName = targetName;
+    this.comObj = comObj;
+    this.callbackId = 1;
+    this.streamId = 1;
+    this.postMessageTransfers = true;
+    this.streamSinks = Object.create(null);
+    this.streamControllers = Object.create(null);
+    this.callbackCapabilities = Object.create(null);
+    this.actionHandler = Object.create(null);
 
-    function skipWs() {
-      while (pos < s.length && isWhitespace(s, pos)) {
-        ++pos;
-      }
-    }
+    this._onComObjOnMessage = event => {
+      const data = event.data;
 
-    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") {
-      ++pos;
-    }
+      if (data.targetName !== this.sourceName) {
+        return;
+      }
 
-    const name = s.substring(start, pos);
-    skipWs();
-    const attrStart = pos;
+      if (data.stream) {
+        this._processStreamMessage(data);
 
-    while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) {
-      ++pos;
-    }
+        return;
+      }
 
-    const value = s.substring(attrStart, pos);
-    return {
-      name,
-      value,
-      parsed: pos - start
-    };
-  }
+      if (data.callback) {
+        const callbackId = data.callbackId;
+        const capability = this.callbackCapabilities[callbackId];
 
-  parseXml(s) {
-    let i = 0;
+        if (!capability) {
+          throw new Error(`Cannot resolve callback ${callbackId}`);
+        }
 
-    while (i < s.length) {
-      const ch = s[i];
-      let j = i;
+        delete this.callbackCapabilities[callbackId];
 
-      if (ch === "<") {
-        ++j;
-        const ch2 = s[j];
-        let q;
+        if (data.callback === CallbackKind.DATA) {
+          capability.resolve(data.data);
+        } else if (data.callback === CallbackKind.ERROR) {
+          capability.reject(wrapReason(data.reason));
+        } else {
+          throw new Error("Unexpected callback case");
+        }
 
-        switch (ch2) {
-          case "/":
-            ++j;
-            q = s.indexOf(">", j);
+        return;
+      }
 
-            if (q < 0) {
-              this.onError(XMLParserErrorCode.UnterminatedElement);
-              return;
-            }
+      const action = this.actionHandler[data.action];
 
-            this.onEndElement(s.substring(j, q));
-            j = q + 1;
-            break;
+      if (!action) {
+        throw new Error(`Unknown action from worker: ${data.action}`);
+      }
 
-          case "?":
-            ++j;
+      if (data.callbackId) {
+        const cbSourceName = this.sourceName;
+        const cbTargetName = data.sourceName;
+        new Promise(function (resolve) {
+          resolve(action(data.data));
+        }).then(function (result) {
+          comObj.postMessage({
+            sourceName: cbSourceName,
+            targetName: cbTargetName,
+            callback: CallbackKind.DATA,
+            callbackId: data.callbackId,
+            data: result
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName: cbSourceName,
+            targetName: cbTargetName,
+            callback: CallbackKind.ERROR,
+            callbackId: data.callbackId,
+            reason: wrapReason(reason)
+          });
+        });
+        return;
+      }
 
-            const pi = this._parseProcessingInstruction(s, j);
+      if (data.streamId) {
+        this._createStreamSink(data);
 
-            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") {
-              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
-              return;
-            }
+        return;
+      }
 
-            this.onPi(pi.name, pi.value);
-            j += pi.parsed + 2;
-            break;
+      action(data.data);
+    };
 
-          case "!":
-            if (s.substring(j + 1, j + 3) === "--") {
-              q = s.indexOf("-->", j + 3);
+    comObj.addEventListener("message", this._onComObjOnMessage);
+  }
 
-              if (q < 0) {
-                this.onError(XMLParserErrorCode.UnterminatedComment);
-                return;
-              }
+  on(actionName, handler) {
+    const ah = this.actionHandler;
 
-              this.onComment(s.substring(j + 3, q));
-              j = q + 3;
-            } else if (s.substring(j + 1, j + 8) === "[CDATA[") {
-              q = s.indexOf("]]>", j + 8);
+    if (ah[actionName]) {
+      throw new Error(`There is already an actionName called "${actionName}"`);
+    }
 
-              if (q < 0) {
-                this.onError(XMLParserErrorCode.UnterminatedCdat);
-                return;
-              }
+    ah[actionName] = handler;
+  }
 
-              this.onCdata(s.substring(j + 8, q));
-              j = q + 3;
-            } else if (s.substring(j + 1, j + 8) === "DOCTYPE") {
-              const q2 = s.indexOf("[", j + 8);
-              let complexDoctype = false;
-              q = s.indexOf(">", j + 8);
+  send(actionName, data, transfers) {
+    this._postMessage({
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data
+    }, transfers);
+  }
 
-              if (q < 0) {
-                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
-                return;
-              }
+  sendWithPromise(actionName, data, transfers) {
+    const callbackId = this.callbackId++;
+    const capability = (0, _util.createPromiseCapability)();
+    this.callbackCapabilities[callbackId] = capability;
 
-              if (q2 > 0 && q > q2) {
-                q = s.indexOf("]>", j + 8);
+    try {
+      this._postMessage({
+        sourceName: this.sourceName,
+        targetName: this.targetName,
+        action: actionName,
+        callbackId,
+        data
+      }, transfers);
+    } catch (ex) {
+      capability.reject(ex);
+    }
 
-                if (q < 0) {
-                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
-                  return;
-                }
+    return capability.promise;
+  }
 
-                complexDoctype = true;
-              }
+  sendWithStream(actionName, data, queueingStrategy, transfers) {
+    const streamId = this.streamId++;
+    const sourceName = this.sourceName;
+    const targetName = this.targetName;
+    const comObj = this.comObj;
+    return new ReadableStream({
+      start: controller => {
+        const startCapability = (0, _util.createPromiseCapability)();
+        this.streamControllers[streamId] = {
+          controller,
+          startCall: startCapability,
+          pullCall: null,
+          cancelCall: null,
+          isClosed: false
+        };
 
-              const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
-              this.onDoctype(doctypeContent);
-              j = q + (complexDoctype ? 2 : 1);
-            } else {
-              this.onError(XMLParserErrorCode.MalformedElement);
-              return;
-            }
+        this._postMessage({
+          sourceName,
+          targetName,
+          action: actionName,
+          streamId,
+          data,
+          desiredSize: controller.desiredSize
+        }, transfers);
 
-            break;
+        return startCapability.promise;
+      },
+      pull: controller => {
+        const pullCapability = (0, _util.createPromiseCapability)();
+        this.streamControllers[streamId].pullCall = pullCapability;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.PULL,
+          streamId,
+          desiredSize: controller.desiredSize
+        });
+        return pullCapability.promise;
+      },
+      cancel: reason => {
+        (0, _util.assert)(reason instanceof Error, "cancel must have a valid reason");
+        const cancelCapability = (0, _util.createPromiseCapability)();
+        this.streamControllers[streamId].cancelCall = cancelCapability;
+        this.streamControllers[streamId].isClosed = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CANCEL,
+          streamId,
+          reason: wrapReason(reason)
+        });
+        return cancelCapability.promise;
+      }
+    }, queueingStrategy);
+  }
 
-          default:
-            const content = this._parseContent(s, j);
+  _createStreamSink(data) {
+    const self = this;
+    const action = this.actionHandler[data.action];
+    const streamId = data.streamId;
+    const sourceName = this.sourceName;
+    const targetName = data.sourceName;
+    const comObj = this.comObj;
+    const streamSink = {
+      enqueue(chunk, size = 1, transfers) {
+        if (this.isCancelled) {
+          return;
+        }
 
-            if (content === null) {
-              this.onError(XMLParserErrorCode.MalformedElement);
-              return;
-            }
+        const lastDesiredSize = this.desiredSize;
+        this.desiredSize -= size;
 
-            let isClosed = false;
+        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
+          this.sinkCapability = (0, _util.createPromiseCapability)();
+          this.ready = this.sinkCapability.promise;
+        }
 
-            if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") {
-              isClosed = true;
-            } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") {
-              this.onError(XMLParserErrorCode.UnterminatedElement);
-              return;
-            }
+        self._postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ENQUEUE,
+          streamId,
+          chunk
+        }, transfers);
+      },
 
-            this.onBeginElement(content.name, content.attributes, isClosed);
-            j += content.parsed + (isClosed ? 2 : 1);
-            break;
-        }
-      } else {
-        while (j < s.length && s[j] !== "<") {
-          j++;
+      close() {
+        if (this.isCancelled) {
+          return;
         }
 
-        const text = s.substring(i, j);
-        this.onText(this._resolveEntities(text));
-      }
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CLOSE,
+          streamId
+        });
+        delete self.streamSinks[streamId];
+      },
 
-      i = j;
-    }
-  }
+      error(reason) {
+        (0, _util.assert)(reason instanceof Error, "error must have a valid reason");
 
-  onResolveEntity(name) {
-    return `&${name};`;
-  }
+        if (this.isCancelled) {
+          return;
+        }
 
-  onPi(name, value) {}
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ERROR,
+          streamId,
+          reason: wrapReason(reason)
+        });
+      },
 
-  onComment(text) {}
+      sinkCapability: (0, _util.createPromiseCapability)(),
+      onPull: null,
+      onCancel: null,
+      isCancelled: false,
+      desiredSize: data.desiredSize,
+      ready: null
+    };
+    streamSink.sinkCapability.resolve();
+    streamSink.ready = streamSink.sinkCapability.promise;
+    this.streamSinks[streamId] = streamSink;
+    new Promise(function (resolve) {
+      resolve(action(data.data, streamSink));
+    }).then(function () {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        success: true
+      });
+    }, function (reason) {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        reason: wrapReason(reason)
+      });
+    });
+  }
 
-  onCdata(text) {}
+  _processStreamMessage(data) {
+    const streamId = data.streamId;
+    const sourceName = this.sourceName;
+    const targetName = data.sourceName;
+    const comObj = this.comObj;
 
-  onDoctype(doctypeContent) {}
+    switch (data.stream) {
+      case StreamKind.START_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].startCall.resolve();
+        } else {
+          this.streamControllers[streamId].startCall.reject(wrapReason(data.reason));
+        }
 
-  onText(text) {}
+        break;
 
-  onBeginElement(name, attributes, isEmpty) {}
+      case StreamKind.PULL_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].pullCall.resolve();
+        } else {
+          this.streamControllers[streamId].pullCall.reject(wrapReason(data.reason));
+        }
 
-  onEndElement(name) {}
+        break;
 
-  onError(code) {}
+      case StreamKind.PULL:
+        if (!this.streamSinks[streamId]) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+          break;
+        }
 
-}
+        if (this.streamSinks[streamId].desiredSize <= 0 && data.desiredSize > 0) {
+          this.streamSinks[streamId].sinkCapability.resolve();
+        }
 
-class SimpleDOMNode {
-  constructor(nodeName, nodeValue) {
-    this.nodeName = nodeName;
-    this.nodeValue = nodeValue;
-    Object.defineProperty(this, "parentNode", {
-      value: null,
-      writable: true
-    });
-  }
+        this.streamSinks[streamId].desiredSize = data.desiredSize;
+        const {
+          onPull
+        } = this.streamSinks[data.streamId];
+        new Promise(function (resolve) {
+          resolve(onPull && onPull());
+        }).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        break;
 
-  get firstChild() {
-    return this.childNodes && this.childNodes[0];
-  }
+      case StreamKind.ENQUEUE:
+        (0, _util.assert)(this.streamControllers[streamId], "enqueue should have stream controller");
 
-  get nextSibling() {
-    const childNodes = this.parentNode.childNodes;
+        if (this.streamControllers[streamId].isClosed) {
+          break;
+        }
 
-    if (!childNodes) {
-      return undefined;
-    }
+        this.streamControllers[streamId].controller.enqueue(data.chunk);
+        break;
 
-    const index = childNodes.indexOf(this);
+      case StreamKind.CLOSE:
+        (0, _util.assert)(this.streamControllers[streamId], "close should have stream controller");
 
-    if (index === -1) {
-      return undefined;
-    }
+        if (this.streamControllers[streamId].isClosed) {
+          break;
+        }
 
-    return childNodes[index + 1];
-  }
+        this.streamControllers[streamId].isClosed = true;
+        this.streamControllers[streamId].controller.close();
 
-  get textContent() {
-    if (!this.childNodes) {
-      return this.nodeValue || "";
-    }
+        this._deleteStreamController(streamId);
 
-    return this.childNodes.map(function (child) {
-      return child.textContent;
-    }).join("");
-  }
+        break;
 
-  hasChildNodes() {
-    return this.childNodes && this.childNodes.length > 0;
-  }
+      case StreamKind.ERROR:
+        (0, _util.assert)(this.streamControllers[streamId], "error should have stream controller");
+        this.streamControllers[streamId].controller.error(wrapReason(data.reason));
 
-}
+        this._deleteStreamController(streamId);
 
-class SimpleXMLParser extends XMLParserBase {
-  constructor() {
-    super();
-    this._currentFragment = null;
-    this._stack = null;
-    this._errorCode = XMLParserErrorCode.NoError;
-  }
+        break;
 
-  parseFromString(data) {
-    this._currentFragment = [];
-    this._stack = [];
-    this._errorCode = XMLParserErrorCode.NoError;
-    this.parseXml(data);
+      case StreamKind.CANCEL_COMPLETE:
+        if (data.success) {
+          this.streamControllers[streamId].cancelCall.resolve();
+        } else {
+          this.streamControllers[streamId].cancelCall.reject(wrapReason(data.reason));
+        }
 
-    if (this._errorCode !== XMLParserErrorCode.NoError) {
-      return undefined;
-    }
+        this._deleteStreamController(streamId);
 
-    const [documentElement] = this._currentFragment;
+        break;
 
-    if (!documentElement) {
-      return undefined;
-    }
+      case StreamKind.CANCEL:
+        if (!this.streamSinks[streamId]) {
+          break;
+        }
 
-    return {
-      documentElement
-    };
-  }
+        const {
+          onCancel
+        } = this.streamSinks[data.streamId];
+        new Promise(function (resolve) {
+          resolve(onCancel && onCancel(wrapReason(data.reason)));
+        }).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        this.streamSinks[streamId].sinkCapability.reject(wrapReason(data.reason));
+        this.streamSinks[streamId].isCancelled = true;
+        delete this.streamSinks[streamId];
+        break;
 
-  onResolveEntity(name) {
-    switch (name) {
-      case "apos":
-        return "'";
+      default:
+        throw new Error("Unexpected stream case");
     }
+  }
 
-    return super.onResolveEntity(name);
+  async _deleteStreamController(streamId) {
+    await Promise.allSettled([this.streamControllers[streamId].startCall, 
this.streamControllers[streamId].pullCall, this.streamControllers[streamId].cancelCall].map(function 
(capability) {
+      return capability && capability.promise;
+    }));
+    delete this.streamControllers[streamId];
   }
 
-  onText(text) {
-    if (isWhitespaceString(text)) {
-      return;
+  _postMessage(message, transfers) {
+    if (transfers && this.postMessageTransfers) {
+      this.comObj.postMessage(message, transfers);
+    } else {
+      this.comObj.postMessage(message);
     }
+  }
 
-    const node = new SimpleDOMNode("#text", text);
-
-    this._currentFragment.push(node);
+  destroy() {
+    this.comObj.removeEventListener("message", this._onComObjOnMessage);
   }
 
-  onCdata(text) {
-    const node = new SimpleDOMNode("#text", text);
+}
+
+exports.MessageHandler = MessageHandler;
 
-    this._currentFragment.push(node);
-  }
+/***/ }),
+/* 14 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-  onBeginElement(name, attributes, isEmpty) {
-    const node = new SimpleDOMNode(name);
-    node.childNodes = [];
 
-    this._currentFragment.push(node);
 
-    if (isEmpty) {
-      return;
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Metadata = void 0;
 
-    this._stack.push(this._currentFragment);
+var _util = __w_pdfjs_require__(2);
 
-    this._currentFragment = node.childNodes;
+class Metadata {
+  constructor({
+    parsedData,
+    rawData
+  }) {
+    this._metadataMap = parsedData;
+    this._data = rawData;
   }
 
-  onEndElement(name) {
-    this._currentFragment = this._stack.pop() || [];
-    const lastElement = this._currentFragment[this._currentFragment.length - 1];
+  getRaw() {
+    return this._data;
+  }
 
-    if (!lastElement) {
-      return;
-    }
+  get(name) {
+    return this._metadataMap.get(name) ?? null;
+  }
 
-    for (let i = 0, ii = lastElement.childNodes.length; i < ii; i++) {
-      lastElement.childNodes[i].parentNode = lastElement;
-    }
+  getAll() {
+    return (0, _util.objectFromMap)(this._metadataMap);
   }
 
-  onError(code) {
-    this._errorCode = code;
+  has(name) {
+    return this._metadataMap.has(name);
   }
 
 }
 
-exports.SimpleXMLParser = SimpleXMLParser;
+exports.Metadata = Metadata;
 
 /***/ }),
-/* 16 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 15 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.OptionalContentConfig = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -8333,6 +8097,54 @@ class OptionalContentConfig {
     }
   }
 
+  _evaluateVisibilityExpression(array) {
+    const length = array.length;
+
+    if (length < 2) {
+      return true;
+    }
+
+    const operator = array[0];
+
+    for (let i = 1; i < length; i++) {
+      const element = array[i];
+      let state;
+
+      if (Array.isArray(element)) {
+        state = this._evaluateVisibilityExpression(element);
+      } else if (this._groups.has(element)) {
+        state = this._groups.get(element).visible;
+      } else {
+        (0, _util.warn)(`Optional content group not found: ${element}`);
+        return true;
+      }
+
+      switch (operator) {
+        case "And":
+          if (!state) {
+            return false;
+          }
+
+          break;
+
+        case "Or":
+          if (state) {
+            return true;
+          }
+
+          break;
+
+        case "Not":
+          return !state;
+
+        default:
+          return true;
+      }
+    }
+
+    return operator === "And";
+  }
+
   isVisible(group) {
     if (group.type === "OCG") {
       if (!this._groups.has(group.id)) {
@@ -8343,7 +8155,7 @@ class OptionalContentConfig {
       return this._groups.get(group.id).visible;
     } else if (group.type === "OCMD") {
       if (group.expression) {
-        (0, _util.warn)("Visibility expression not supported yet.");
+        return this._evaluateVisibilityExpression(group.expression);
       }
 
       if (!group.policy || group.policy === "AnyOn") {
@@ -8430,11 +8242,7 @@ class OptionalContentConfig {
   }
 
   getGroups() {
-    if (!this._groups.size) {
-      return null;
-    }
-
-    return Object.fromEntries(this._groups);
+    return this._groups.size > 0 ? (0, _util.objectFromMap)(this._groups) : null;
   }
 
   getGroup(id) {
@@ -8446,27 +8254,29 @@ class OptionalContentConfig {
 exports.OptionalContentConfig = OptionalContentConfig;
 
 /***/ }),
-/* 17 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 16 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFDataTransportStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
+var _display_utils = __w_pdfjs_require__(1);
+
 class PDFDataTransportStream {
   constructor(params, pdfDataRangeTransport) {
     (0, _util.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required 
"pdfDataRangeTransport" argument.');
     this._queuedChunks = [];
     this._progressiveDone = params.progressiveDone || false;
+    this._contentDispositionFilename = params.contentDispositionFilename || null;
     const initialData = params.initialData;
 
-    if (initialData && initialData.length > 0) {
+    if (initialData?.length > 0) {
       const buffer = new Uint8Array(initialData).buffer;
 
       this._queuedChunks.push(buffer);
@@ -8531,14 +8341,14 @@ class PDFDataTransportStream {
   }
 
   get _progressiveDataLength() {
-    return this._fullRequestReader ? this._fullRequestReader._loaded : 0;
+    return this._fullRequestReader?._loaded ?? 0;
   }
 
   _onProgress(evt) {
     if (evt.total === undefined) {
       const firstReader = this._rangeReaders[0];
 
-      if (firstReader && firstReader.onProgress) {
+      if (firstReader?.onProgress) {
         firstReader.onProgress({
           loaded: evt.loaded
         });
@@ -8546,7 +8356,7 @@ class PDFDataTransportStream {
     } else {
       const fullReader = this._fullRequestReader;
 
-      if (fullReader && fullReader.onProgress) {
+      if (fullReader?.onProgress) {
         fullReader.onProgress({
           loaded: evt.loaded,
           total: evt.total
@@ -8575,7 +8385,7 @@ class PDFDataTransportStream {
     (0, _util.assert)(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called 
once.");
     const queuedChunks = this._queuedChunks;
     this._queuedChunks = null;
-    return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone);
+    return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, 
this._contentDispositionFilename);
   }
 
   getRangeReader(begin, end) {
@@ -8597,11 +8407,9 @@ class PDFDataTransportStream {
       this._fullRequestReader.cancel(reason);
     }
 
-    const readers = this._rangeReaders.slice(0);
-
-    readers.forEach(function (rangeReader) {
-      rangeReader.cancel(reason);
-    });
+    for (const reader of this._rangeReaders.slice(0)) {
+      reader.cancel(reason);
+    }
 
     this._pdfDataRangeTransport.abort();
   }
@@ -8611,10 +8419,10 @@ class PDFDataTransportStream {
 exports.PDFDataTransportStream = PDFDataTransportStream;
 
 class PDFDataTransportStreamReader {
-  constructor(stream, queuedChunks, progressiveDone = false) {
+  constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) {
     this._stream = stream;
     this._done = progressiveDone || false;
-    this._filename = null;
+    this._filename = (0, _display_utils.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename 
: null;
     this._queuedChunks = queuedChunks || [];
     this._loaded = 0;
 
@@ -8694,14 +8502,14 @@ class PDFDataTransportStreamReader {
   cancel(reason) {
     this._done = true;
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
+    }
 
-    this._requests = [];
+    this._requests.length = 0;
   }
 
   progressiveDone() {
@@ -8740,14 +8548,14 @@ class PDFDataTransportStreamRangeReader {
         done: false
       });
 
-      this._requests.forEach(function (requestCapability) {
+      for (const requestCapability of this._requests) {
         requestCapability.resolve({
           value: undefined,
           done: true
         });
-      });
+      }
 
-      this._requests = [];
+      this._requests.length = 0;
     }
 
     this._done = true;
@@ -8786,484 +8594,38 @@ class PDFDataTransportStreamRangeReader {
   cancel(reason) {
     this._done = true;
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
-
-    this._requests = [];
-
-    this._stream._removeRangeReader(this);
-  }
-
-}
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.WebGLContext = void 0;
-
-var _util = __w_pdfjs_require__(2);
-
-class WebGLContext {
-  constructor({
-    enable = false
-  }) {
-    this._enabled = enable === true;
-  }
-
-  get isEnabled() {
-    let enabled = this._enabled;
-
-    if (enabled) {
-      enabled = WebGLUtils.tryInitGL();
     }
 
-    return (0, _util.shadow)(this, "isEnabled", enabled);
-  }
-
-  composeSMask({
-    layer,
-    mask,
-    properties
-  }) {
-    return WebGLUtils.composeSMask(layer, mask, properties);
-  }
-
-  drawFigures({
-    width,
-    height,
-    backgroundColor,
-    figures,
-    context
-  }) {
-    return WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);
-  }
+    this._requests.length = 0;
 
-  clear() {
-    WebGLUtils.cleanup();
+    this._stream._removeRangeReader(this);
   }
 
 }
 
-exports.WebGLContext = WebGLContext;
-
-var WebGLUtils = function WebGLUtilsClosure() {
-  function loadShader(gl, code, shaderType) {
-    var shader = gl.createShader(shaderType);
-    gl.shaderSource(shader, code);
-    gl.compileShader(shader);
-    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
-
-    if (!compiled) {
-      var errorMsg = gl.getShaderInfoLog(shader);
-      throw new Error("Error during shader compilation: " + errorMsg);
-    }
-
-    return shader;
-  }
-
-  function createVertexShader(gl, code) {
-    return loadShader(gl, code, gl.VERTEX_SHADER);
-  }
-
-  function createFragmentShader(gl, code) {
-    return loadShader(gl, code, gl.FRAGMENT_SHADER);
-  }
-
-  function createProgram(gl, shaders) {
-    var program = gl.createProgram();
-
-    for (var i = 0, ii = shaders.length; i < ii; ++i) {
-      gl.attachShader(program, shaders[i]);
-    }
-
-    gl.linkProgram(program);
-    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
-
-    if (!linked) {
-      var errorMsg = gl.getProgramInfoLog(program);
-      throw new Error("Error during program linking: " + errorMsg);
-    }
-
-    return program;
-  }
-
-  function createTexture(gl, image, textureId) {
-    gl.activeTexture(textureId);
-    var texture = gl.createTexture();
-    gl.bindTexture(gl.TEXTURE_2D, texture);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
-    return texture;
-  }
-
-  var currentGL, currentCanvas;
-
-  function generateGL() {
-    if (currentGL) {
-      return;
-    }
-
-    currentCanvas = document.createElement("canvas");
-    currentGL = currentCanvas.getContext("webgl", {
-      premultipliedalpha: false
-    });
-  }
-
-  var smaskVertexShaderCode = "\
-  attribute vec2 a_position;                                    \
-  attribute vec2 a_texCoord;                                    \
-                                                                \
-  uniform vec2 u_resolution;                                    \
-                                                                \
-  varying vec2 v_texCoord;                                      \
-                                                                \
-  void main() {                                                 \
-    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
-    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
-                                                                \
-    v_texCoord = a_texCoord;                                    \
-  }                                                             ";
-  var smaskFragmentShaderCode = "\
-  precision mediump float;                                      \
-                                                                \
-  uniform vec4 u_backdrop;                                      \
-  uniform int u_subtype;                                        \
-  uniform sampler2D u_image;                                    \
-  uniform sampler2D u_mask;                                     \
-                                                                \
-  varying vec2 v_texCoord;                                      \
-                                                                \
-  void main() {                                                 \
-    vec4 imageColor = texture2D(u_image, v_texCoord);           \
-    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
-    if (u_backdrop.a > 0.0) {                                   \
-      maskColor.rgb = maskColor.rgb * maskColor.a +             \
-                      u_backdrop.rgb * (1.0 - maskColor.a);     \
-    }                                                           \
-    float lum;                                                  \
-    if (u_subtype == 0) {                                       \
-      lum = maskColor.a;                                        \
-    } else {                                                    \
-      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
-            maskColor.b * 0.11;                                 \
-    }                                                           \
-    imageColor.a *= lum;                                        \
-    imageColor.rgb *= imageColor.a;                             \
-    gl_FragColor = imageColor;                                  \
-  }                                                             ";
-  var smaskCache = null;
-
-  function initSmaskGL() {
-    var canvas, gl;
-    generateGL();
-    canvas = currentCanvas;
-    currentCanvas = null;
-    gl = currentGL;
-    currentGL = null;
-    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
-    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
-    var program = createProgram(gl, [vertexShader, fragmentShader]);
-    gl.useProgram(program);
-    var cache = {};
-    cache.gl = gl;
-    cache.canvas = canvas;
-    cache.resolutionLocation = gl.getUniformLocation(program, "u_resolution");
-    cache.positionLocation = gl.getAttribLocation(program, "a_position");
-    cache.backdropLocation = gl.getUniformLocation(program, "u_backdrop");
-    cache.subtypeLocation = gl.getUniformLocation(program, "u_subtype");
-    var texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
-    var texLayerLocation = gl.getUniformLocation(program, "u_image");
-    var texMaskLocation = gl.getUniformLocation(program, "u_mask");
-    var texCoordBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 
1.0]), gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(texCoordLocation);
-    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
-    gl.uniform1i(texLayerLocation, 0);
-    gl.uniform1i(texMaskLocation, 1);
-    smaskCache = cache;
-  }
-
-  function composeSMask(layer, mask, properties) {
-    var width = layer.width,
-        height = layer.height;
-
-    if (!smaskCache) {
-      initSmaskGL();
-    }
-
-    var cache = smaskCache,
-        canvas = cache.canvas,
-        gl = cache.gl;
-    canvas.width = width;
-    canvas.height = height;
-    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
-    gl.uniform2f(cache.resolutionLocation, width, height);
-
-    if (properties.backdrop) {
-      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], 
properties.backdrop[2], 1);
-    } else {
-      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
-    }
-
-    gl.uniform1i(cache.subtypeLocation, properties.subtype === "Luminosity" ? 1 : 0);
-    var texture = createTexture(gl, layer, gl.TEXTURE0);
-    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
-    var buffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
-    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, 
height]), gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.positionLocation);
-    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
-    gl.clearColor(0, 0, 0, 0);
-    gl.enable(gl.BLEND);
-    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
-    gl.clear(gl.COLOR_BUFFER_BIT);
-    gl.drawArrays(gl.TRIANGLES, 0, 6);
-    gl.flush();
-    gl.deleteTexture(texture);
-    gl.deleteTexture(maskTexture);
-    gl.deleteBuffer(buffer);
-    return canvas;
-  }
-
-  var figuresVertexShaderCode = "\
-  attribute vec2 a_position;                                    \
-  attribute vec3 a_color;                                       \
-                                                                \
-  uniform vec2 u_resolution;                                    \
-  uniform vec2 u_scale;                                         \
-  uniform vec2 u_offset;                                        \
-                                                                \
-  varying vec4 v_color;                                         \
-                                                                \
-  void main() {                                                 \
-    vec2 position = (a_position + u_offset) * u_scale;          \
-    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
-    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
-                                                                \
-    v_color = vec4(a_color / 255.0, 1.0);                       \
-  }                                                             ";
-  var figuresFragmentShaderCode = "\
-  precision mediump float;                                      \
-                                                                \
-  varying vec4 v_color;                                         \
-                                                                \
-  void main() {                                                 \
-    gl_FragColor = v_color;                                     \
-  }                                                             ";
-  var figuresCache = null;
-
-  function initFiguresGL() {
-    var canvas, gl;
-    generateGL();
-    canvas = currentCanvas;
-    currentCanvas = null;
-    gl = currentGL;
-    currentGL = null;
-    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
-    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
-    var program = createProgram(gl, [vertexShader, fragmentShader]);
-    gl.useProgram(program);
-    var cache = {};
-    cache.gl = gl;
-    cache.canvas = canvas;
-    cache.resolutionLocation = gl.getUniformLocation(program, "u_resolution");
-    cache.scaleLocation = gl.getUniformLocation(program, "u_scale");
-    cache.offsetLocation = gl.getUniformLocation(program, "u_offset");
-    cache.positionLocation = gl.getAttribLocation(program, "a_position");
-    cache.colorLocation = gl.getAttribLocation(program, "a_color");
-    figuresCache = cache;
-  }
-
-  function drawFigures(width, height, backgroundColor, figures, context) {
-    if (!figuresCache) {
-      initFiguresGL();
-    }
-
-    var cache = figuresCache,
-        canvas = cache.canvas,
-        gl = cache.gl;
-    canvas.width = width;
-    canvas.height = height;
-    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
-    gl.uniform2f(cache.resolutionLocation, width, height);
-    var count = 0;
-    var i, ii, rows;
-
-    for (i = 0, ii = figures.length; i < ii; i++) {
-      switch (figures[i].type) {
-        case "lattice":
-          rows = figures[i].coords.length / figures[i].verticesPerRow | 0;
-          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
-          break;
-
-        case "triangles":
-          count += figures[i].coords.length;
-          break;
-      }
-    }
-
-    var coords = new Float32Array(count * 2);
-    var colors = new Uint8Array(count * 3);
-    var coordsMap = context.coords,
-        colorsMap = context.colors;
-    var pIndex = 0,
-        cIndex = 0;
-
-    for (i = 0, ii = figures.length; i < ii; i++) {
-      var figure = figures[i],
-          ps = figure.coords,
-          cs = figure.colors;
-
-      switch (figure.type) {
-        case "lattice":
-          var cols = figure.verticesPerRow;
-          rows = ps.length / cols | 0;
-
-          for (var row = 1; row < rows; row++) {
-            var offset = row * cols + 1;
-
-            for (var col = 1; col < cols; col++, offset++) {
-              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
-              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
-              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
-              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
-              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
-              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
-              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
-              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
-              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
-              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
-              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
-              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
-              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
-              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
-              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
-              coords[pIndex + 6] = coords[pIndex + 2];
-              coords[pIndex + 7] = coords[pIndex + 3];
-              coords[pIndex + 8] = coords[pIndex + 4];
-              coords[pIndex + 9] = coords[pIndex + 5];
-              coords[pIndex + 10] = coordsMap[ps[offset]];
-              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
-              colors[cIndex + 9] = colors[cIndex + 3];
-              colors[cIndex + 10] = colors[cIndex + 4];
-              colors[cIndex + 11] = colors[cIndex + 5];
-              colors[cIndex + 12] = colors[cIndex + 6];
-              colors[cIndex + 13] = colors[cIndex + 7];
-              colors[cIndex + 14] = colors[cIndex + 8];
-              colors[cIndex + 15] = colorsMap[cs[offset]];
-              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
-              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
-              pIndex += 12;
-              cIndex += 18;
-            }
-          }
-
-          break;
-
-        case "triangles":
-          for (var j = 0, jj = ps.length; j < jj; j++) {
-            coords[pIndex] = coordsMap[ps[j]];
-            coords[pIndex + 1] = coordsMap[ps[j] + 1];
-            colors[cIndex] = colorsMap[cs[j]];
-            colors[cIndex + 1] = colorsMap[cs[j] + 1];
-            colors[cIndex + 2] = colorsMap[cs[j] + 2];
-            pIndex += 2;
-            cIndex += 3;
-          }
-
-          break;
-      }
-    }
-
-    if (backgroundColor) {
-      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0);
-    } else {
-      gl.clearColor(0, 0, 0, 0);
-    }
-
-    gl.clear(gl.COLOR_BUFFER_BIT);
-    var coordsBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.positionLocation);
-    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
-    var colorsBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.colorLocation);
-    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0);
-    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
-    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
-    gl.drawArrays(gl.TRIANGLES, 0, count);
-    gl.flush();
-    gl.deleteBuffer(coordsBuffer);
-    gl.deleteBuffer(colorsBuffer);
-    return canvas;
-  }
-
-  return {
-    tryInitGL() {
-      try {
-        generateGL();
-        return !!currentGL;
-      } catch (ex) {}
-
-      return false;
-    },
-
-    composeSMask,
-    drawFigures,
-
-    cleanup() {
-      if (smaskCache && smaskCache.canvas) {
-        smaskCache.canvas.width = 0;
-        smaskCache.canvas.height = 0;
-      }
-
-      if (figuresCache && figuresCache.canvas) {
-        figuresCache.canvas.width = 0;
-        figuresCache.canvas.height = 0;
-      }
-
-      smaskCache = null;
-      figuresCache = null;
-    }
-
-  };
-}();
-
 /***/ }),
-/* 19 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 17 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.AnnotationLayer = void 0;
 
 var _display_utils = __w_pdfjs_require__(1);
 
 var _util = __w_pdfjs_require__(2);
 
-var _annotation_storage = __w_pdfjs_require__(8);
+var _annotation_storage = __w_pdfjs_require__(9);
+
+var _scripting_utils = __w_pdfjs_require__(18);
 
 class AnnotationElementFactory {
   static create(parameters) {
@@ -9351,7 +8713,11 @@ class AnnotationElementFactory {
 }
 
 class AnnotationElement {
-  constructor(parameters, isRenderable = false, ignoreBorder = false) {
+  constructor(parameters, {
+    isRenderable = false,
+    ignoreBorder = false,
+    createQuadrilaterals = false
+  } = {}) {
     this.isRenderable = isRenderable;
     this.data = parameters.data;
     this.layer = parameters.layer;
@@ -9363,10 +8729,17 @@ class AnnotationElement {
     this.renderInteractiveForms = parameters.renderInteractiveForms;
     this.svgFactory = parameters.svgFactory;
     this.annotationStorage = parameters.annotationStorage;
+    this.enableScripting = parameters.enableScripting;
+    this.hasJSActions = parameters.hasJSActions;
+    this._mouseState = parameters.mouseState;
 
     if (isRenderable) {
       this.container = this._createContainer(ignoreBorder);
     }
+
+    if (createQuadrilaterals) {
+      this.quadrilaterals = this._createQuadrilaterals(ignoreBorder);
+    }
   }
 
   _createContainer(ignoreBorder = false) {
@@ -9381,14 +8754,14 @@ class AnnotationElement {
     const rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], 
data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);
 
     container.style.transform = `matrix(${viewport.transform.join(",")})`;
-    container.style.transformOrigin = `-${rect[0]}px -${rect[1]}px`;
+    container.style.transformOrigin = `${-rect[0]}px ${-rect[1]}px`;
 
     if (!ignoreBorder && data.borderStyle.width > 0) {
       container.style.borderWidth = `${data.borderStyle.width}px`;
 
       if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {
-        width = width - 2 * data.borderStyle.width;
-        height = height - 2 * data.borderStyle.width;
+        width -= 2 * data.borderStyle.width;
+        height -= 2 * data.borderStyle.width;
       }
 
       const horizontalRadius = data.borderStyle.horizontalCornerRadius;
@@ -9425,7 +8798,7 @@ class AnnotationElement {
       }
 
       if (data.color) {
-        container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, 
data.color[2] | 0);
+        container.style.borderColor = _util.Util.makeHexColor(data.color[0] | 0, data.color[1] | 0, 
data.color[2] | 0);
       } else {
         container.style.borderWidth = 0;
       }
@@ -9438,7 +8811,31 @@ class AnnotationElement {
     return container;
   }
 
-  _createPopup(container, trigger, data) {
+  _createQuadrilaterals(ignoreBorder = false) {
+    if (!this.data.quadPoints) {
+      return null;
+    }
+
+    const quadrilaterals = [];
+    const savedRect = this.data.rect;
+
+    for (const quadPoint of this.data.quadPoints) {
+      this.data.rect = [quadPoint[2].x, quadPoint[2].y, quadPoint[1].x, quadPoint[1].y];
+      quadrilaterals.push(this._createContainer(ignoreBorder));
+    }
+
+    this.data.rect = savedRect;
+    return quadrilaterals;
+  }
+
+  _createPopup(trigger, data) {
+    let container = this.container;
+
+    if (this.quadrilaterals) {
+      trigger = trigger || this.quadrilaterals;
+      container = this.quadrilaterals[0];
+    }
+
     if (!trigger) {
       trigger = document.createElement("div");
       trigger.style.height = container.style.height;
@@ -9460,6 +8857,14 @@ class AnnotationElement {
     container.appendChild(popup);
   }
 
+  _renderQuadrilaterals(className) {
+    for (const quadrilateral of this.quadrilaterals) {
+      quadrilateral.className = className;
+    }
+
+    return this.quadrilaterals;
+  }
+
   render() {
     (0, _util.unreachable)("Abstract method `AnnotationElement.render` called");
   }
@@ -9468,12 +8873,14 @@ class AnnotationElement {
 
 class LinkAnnotationElement extends AnnotationElement {
   constructor(parameters) {
-    const isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action);
-    super(parameters, isRenderable);
+    const isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action || 
parameters.data.isTooltipOnly || parameters.data.actions && (parameters.data.actions.Action || 
parameters.data.actions["Mouse Up"] || parameters.data.actions["Mouse Down"]));
+    super(parameters, {
+      isRenderable,
+      createQuadrilaterals: true
+    });
   }
 
   render() {
-    this.container.className = "linkAnnotation";
     const {
       data,
       linkService
@@ -9489,10 +8896,23 @@ class LinkAnnotationElement extends AnnotationElement {
       });
     } else if (data.action) {
       this._bindNamedAction(link, data.action);
-    } else {
+    } else if (data.dest) {
       this._bindLink(link, data.dest);
+    } else if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse 
Down"]) && this.enableScripting && this.hasJSActions) {
+      this._bindJSAction(link, data);
+    } else {
+      this._bindLink(link, "");
+    }
+
+    if (this.quadrilaterals) {
+      return this._renderQuadrilaterals("linkAnnotation").map((quadrilateral, index) => {
+        const linkElement = index === 0 ? link : link.cloneNode();
+        quadrilateral.appendChild(linkElement);
+        return quadrilateral;
+      });
     }
 
+    this.container.className = "linkAnnotation";
     this.container.appendChild(link);
     return this.container;
   }
@@ -9502,13 +8922,13 @@ class LinkAnnotationElement extends AnnotationElement {
 
     link.onclick = () => {
       if (destination) {
-        this.linkService.navigateTo(destination);
+        this.linkService.goToDestination(destination);
       }
 
       return false;
     };
 
-    if (destination) {
+    if (destination || destination === "") {
       link.className = "internalLink";
     }
   }
@@ -9524,12 +8944,40 @@ class LinkAnnotationElement extends AnnotationElement {
     link.className = "internalLink";
   }
 
+  _bindJSAction(link, data) {
+    link.href = this.linkService.getAnchorUrl("");
+    const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
+
+    for (const name of Object.keys(data.actions)) {
+      const jsName = map.get(name);
+
+      if (!jsName) {
+        continue;
+      }
+
+      link[jsName] = () => {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: data.id,
+            name
+          }
+        });
+        return false;
+      };
+    }
+
+    link.className = "internalLink";
+  }
+
 }
 
 class TextAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable);
+    super(parameters, {
+      isRenderable
+    });
   }
 
   render() {
@@ -9545,7 +8993,7 @@ class TextAnnotationElement extends AnnotationElement {
     });
 
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, image, this.data);
+      this._createPopup(image, this.data);
     }
 
     this.container.appendChild(image);
@@ -9556,26 +9004,171 @@ class TextAnnotationElement extends AnnotationElement {
 
 class WidgetAnnotationElement extends AnnotationElement {
   render() {
+    if (this.data.alternativeText) {
+      this.container.title = this.data.alternativeText;
+    }
+
     return this.container;
   }
 
+  _getKeyModifier(event) {
+    return navigator.platform.includes("Win") && event.ctrlKey || navigator.platform.includes("Mac") && 
event.metaKey;
+  }
+
+  _setEventListener(element, baseName, eventName, valueGetter) {
+    if (baseName.includes("mouse")) {
+      element.addEventListener(baseName, event => {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: this.data.id,
+            name: eventName,
+            value: valueGetter(event),
+            shift: event.shiftKey,
+            modifier: this._getKeyModifier(event)
+          }
+        });
+      });
+    } else {
+      element.addEventListener(baseName, event => {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: this.data.id,
+            name: eventName,
+            value: event.target.checked
+          }
+        });
+      });
+    }
+  }
+
+  _setEventListeners(element, names, getter) {
+    for (const [baseName, eventName] of names) {
+      if (eventName === "Action" || this.data.actions?.[eventName]) {
+        this._setEventListener(element, baseName, eventName, getter);
+      }
+    }
+  }
+
+  _dispatchEventFromSandbox(actions, jsEvent) {
+    const setColor = (jsName, styleName, event) => {
+      const color = event.detail[jsName];
+      event.target.style[styleName] = _scripting_utils.ColorConverters[`${color[0]}_HTML`](color.slice(1));
+    };
+
+    const commonActions = {
+      display: event => {
+        const hidden = event.detail.display % 2 === 1;
+        event.target.style.visibility = hidden ? "hidden" : "visible";
+        this.annotationStorage.setValue(this.data.id, {
+          hidden,
+          print: event.detail.display === 0 || event.detail.display === 3
+        });
+      },
+      print: event => {
+        this.annotationStorage.setValue(this.data.id, {
+          print: event.detail.print
+        });
+      },
+      hidden: event => {
+        event.target.style.visibility = event.detail.hidden ? "hidden" : "visible";
+        this.annotationStorage.setValue(this.data.id, {
+          hidden: event.detail.hidden
+        });
+      },
+      focus: event => {
+        setTimeout(() => event.target.focus({
+          preventScroll: false
+        }), 0);
+      },
+      userName: event => {
+        event.target.title = event.detail.userName;
+      },
+      readonly: event => {
+        if (event.detail.readonly) {
+          event.target.setAttribute("readonly", "");
+        } else {
+          event.target.removeAttribute("readonly");
+        }
+      },
+      required: event => {
+        if (event.detail.required) {
+          event.target.setAttribute("required", "");
+        } else {
+          event.target.removeAttribute("required");
+        }
+      },
+      bgColor: event => {
+        setColor("bgColor", "backgroundColor", event);
+      },
+      fillColor: event => {
+        setColor("fillColor", "backgroundColor", event);
+      },
+      fgColor: event => {
+        setColor("fgColor", "color", event);
+      },
+      textColor: event => {
+        setColor("textColor", "color", event);
+      },
+      borderColor: event => {
+        setColor("borderColor", "borderColor", event);
+      },
+      strokeColor: event => {
+        setColor("strokeColor", "borderColor", event);
+      }
+    };
+
+    for (const name of Object.keys(jsEvent.detail)) {
+      const action = actions[name] || commonActions[name];
+
+      if (action) {
+        action(jsEvent);
+      }
+    }
+  }
+
 }
 
 class TextWidgetAnnotationElement extends WidgetAnnotationElement {
   constructor(parameters) {
     const isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && 
!!parameters.data.fieldValue;
-    super(parameters, isRenderable);
+    super(parameters, {
+      isRenderable
+    });
+  }
+
+  setPropertyOnSiblings(base, key, value, keyInStorage) {
+    const storage = this.annotationStorage;
+
+    for (const element of document.getElementsByName(base.name)) {
+      if (element !== base) {
+        element[key] = value;
+        const data = Object.create(null);
+        data[keyInStorage] = value;
+        storage.setValue(element.getAttribute("id"), data);
+      }
+    }
   }
 
   render() {
-    const TEXT_ALIGNMENT = ["left", "center", "right"];
     const storage = this.annotationStorage;
     const id = this.data.id;
     this.container.className = "textWidgetAnnotation";
     let element = null;
 
     if (this.renderInteractiveForms) {
-      const textContent = storage.getOrCreateValue(id, this.data.fieldValue);
+      const storedData = storage.getValue(id, {
+        value: this.data.fieldValue,
+        valueAsString: this.data.fieldValue
+      });
+      const textContent = storedData.valueAsString || storedData.value || "";
+      const elementData = {
+        userValue: null,
+        formattedValue: null,
+        beforeInputSelectionRange: null,
+        beforeInputValue: null
+      };
 
       if (this.data.multiLine) {
         element = document.createElement("textarea");
@@ -9586,9 +9179,162 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
         element.setAttribute("value", textContent);
       }
 
-      element.addEventListener("input", function (event) {
-        storage.setValue(id, event.target.value);
+      elementData.userValue = textContent;
+      element.setAttribute("id", id);
+      element.addEventListener("input", event => {
+        storage.setValue(id, {
+          value: event.target.value
+        });
+        this.setPropertyOnSiblings(element, "value", event.target.value, "value");
       });
+
+      let blurListener = event => {
+        if (elementData.formattedValue) {
+          event.target.value = elementData.formattedValue;
+        }
+
+        event.target.scrollLeft = 0;
+        elementData.beforeInputSelectionRange = null;
+      };
+
+      if (this.enableScripting && this.hasJSActions) {
+        element.addEventListener("focus", event => {
+          if (elementData.userValue) {
+            event.target.value = elementData.userValue;
+          }
+        });
+        element.addEventListener("updatefromsandbox", jsEvent => {
+          const actions = {
+            value(event) {
+              elementData.userValue = event.detail.value || "";
+              storage.setValue(id, {
+                value: elementData.userValue.toString()
+              });
+
+              if (!elementData.formattedValue) {
+                event.target.value = elementData.userValue;
+              }
+            },
+
+            valueAsString(event) {
+              elementData.formattedValue = event.detail.valueAsString || "";
+
+              if (event.target !== document.activeElement) {
+                event.target.value = elementData.formattedValue;
+              }
+
+              storage.setValue(id, {
+                formattedValue: elementData.formattedValue
+              });
+            },
+
+            selRange(event) {
+              const [selStart, selEnd] = event.detail.selRange;
+
+              if (selStart >= 0 && selEnd < event.target.value.length) {
+                event.target.setSelectionRange(selStart, selEnd);
+              }
+            }
+
+          };
+
+          this._dispatchEventFromSandbox(actions, jsEvent);
+        });
+        element.addEventListener("keydown", event => {
+          elementData.beforeInputValue = event.target.value;
+          let commitKey = -1;
+
+          if (event.key === "Escape") {
+            commitKey = 0;
+          } else if (event.key === "Enter") {
+            commitKey = 2;
+          } else if (event.key === "Tab") {
+            commitKey = 3;
+          }
+
+          if (commitKey === -1) {
+            return;
+          }
+
+          elementData.userValue = event.target.value;
+          this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+            source: this,
+            detail: {
+              id,
+              name: "Keystroke",
+              value: event.target.value,
+              willCommit: true,
+              commitKey,
+              selStart: event.target.selectionStart,
+              selEnd: event.target.selectionEnd
+            }
+          });
+        });
+        const _blurListener = blurListener;
+        blurListener = null;
+        element.addEventListener("blur", event => {
+          if (this._mouseState.isDown) {
+            elementData.userValue = event.target.value;
+            this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+              source: this,
+              detail: {
+                id,
+                name: "Keystroke",
+                value: event.target.value,
+                willCommit: true,
+                commitKey: 1,
+                selStart: event.target.selectionStart,
+                selEnd: event.target.selectionEnd
+              }
+            });
+          }
+
+          _blurListener(event);
+        });
+        element.addEventListener("mousedown", event => {
+          elementData.beforeInputValue = event.target.value;
+          elementData.beforeInputSelectionRange = null;
+        });
+        element.addEventListener("keyup", event => {
+          if (event.target.selectionStart === event.target.selectionEnd) {
+            elementData.beforeInputSelectionRange = null;
+          }
+        });
+        element.addEventListener("select", event => {
+          elementData.beforeInputSelectionRange = [event.target.selectionStart, event.target.selectionEnd];
+        });
+
+        if (this.data.actions?.Keystroke) {
+          element.addEventListener("input", event => {
+            let selStart = -1;
+            let selEnd = -1;
+
+            if (elementData.beforeInputSelectionRange) {
+              [selStart, selEnd] = elementData.beforeInputSelectionRange;
+            }
+
+            this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+              source: this,
+              detail: {
+                id,
+                name: "Keystroke",
+                value: elementData.beforeInputValue,
+                change: event.data,
+                willCommit: false,
+                selStart,
+                selEnd
+              }
+            });
+          });
+        }
+
+        this._setEventListeners(element, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], 
["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => 
event.target.value);
+      }
+
+      if (blurListener) {
+        element.addEventListener("blur", blurListener);
+      }
+
       element.disabled = this.data.readOnly;
       element.name = this.data.fieldName;
 
@@ -9607,59 +9353,57 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
       element.textContent = this.data.fieldValue;
       element.style.verticalAlign = "middle";
       element.style.display = "table-cell";
-      let font = null;
-
-      if (this.data.fontRefName && this.page.commonObjs.has(this.data.fontRefName)) {
-        font = this.page.commonObjs.get(this.data.fontRefName);
-      }
-
-      this._setTextStyle(element, font);
     }
 
-    if (this.data.textAlignment !== null) {
-      element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
-    }
+    this._setTextStyle(element);
 
     this.container.appendChild(element);
     return this.container;
   }
 
-  _setTextStyle(element, font) {
+  _setTextStyle(element) {
+    const TEXT_ALIGNMENT = ["left", "center", "right"];
+    const {
+      fontSize,
+      fontColor
+    } = this.data.defaultAppearanceData;
     const style = element.style;
-    style.fontSize = `${this.data.fontSize}px`;
-    style.direction = this.data.fontDirection < 0 ? "rtl" : "ltr";
 
-    if (!font) {
-      return;
+    if (fontSize) {
+      style.fontSize = `${fontSize}px`;
     }
 
-    let bold = "normal";
+    style.color = _util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]);
 
-    if (font.black) {
-      bold = "900";
-    } else if (font.bold) {
-      bold = "bold";
+    if (this.data.textAlignment !== null) {
+      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
     }
-
-    style.fontWeight = bold;
-    style.fontStyle = font.italic ? "italic" : "normal";
-    const fontFamily = font.loadedName ? `"${font.loadedName}", ` : "";
-    const fallbackName = font.fallbackName || "Helvetica, sans-serif";
-    style.fontFamily = fontFamily + fallbackName;
   }
 
 }
 
 class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
   constructor(parameters) {
-    super(parameters, parameters.renderInteractiveForms);
+    super(parameters, {
+      isRenderable: parameters.renderInteractiveForms
+    });
   }
 
   render() {
     const storage = this.annotationStorage;
     const data = this.data;
     const id = data.id;
-    const value = storage.getOrCreateValue(id, data.fieldValue && data.fieldValue !== "Off");
+    let value = storage.getValue(id, {
+      value: data.fieldValue && (data.exportValue && data.exportValue === data.fieldValue || 
!data.exportValue && data.fieldValue !== "Off")
+    }).value;
+
+    if (typeof value === "string") {
+      value = value !== "Off";
+      storage.setValue(id, {
+        value
+      });
+    }
+
     this.container.className = "buttonWidgetAnnotation checkBox";
     const element = document.createElement("input");
     element.disabled = data.readOnly;
@@ -9670,9 +9414,42 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
       element.setAttribute("checked", true);
     }
 
+    element.setAttribute("id", id);
     element.addEventListener("change", function (event) {
-      storage.setValue(id, event.target.checked);
+      const name = event.target.name;
+
+      for (const checkbox of document.getElementsByName(name)) {
+        if (checkbox !== event.target) {
+          checkbox.checked = false;
+          storage.setValue(checkbox.parentNode.getAttribute("data-annotation-id"), {
+            value: false
+          });
+        }
+      }
+
+      storage.setValue(id, {
+        value: event.target.checked
+      });
     });
+
+    if (this.enableScripting && this.hasJSActions) {
+      element.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value(event) {
+            event.target.checked = event.detail.value !== "Off";
+            storage.setValue(id, {
+              value: event.target.checked
+            });
+          }
+
+        };
+
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+
+      this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], 
["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], 
["mouseup", "Mouse Up"]], event => event.target.checked);
+    }
+
     this.container.appendChild(element);
     return this.container;
   }
@@ -9681,7 +9458,9 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
 
 class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
   constructor(parameters) {
-    super(parameters, parameters.renderInteractiveForms);
+    super(parameters, {
+      isRenderable: parameters.renderInteractiveForms
+    });
   }
 
   render() {
@@ -9689,7 +9468,17 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
     const storage = this.annotationStorage;
     const data = this.data;
     const id = data.id;
-    const value = storage.getOrCreateValue(id, data.fieldValue === data.buttonValue);
+    let value = storage.getValue(id, {
+      value: data.fieldValue === data.buttonValue
+    }).value;
+
+    if (typeof value === "string") {
+      value = value !== data.buttonValue;
+      storage.setValue(id, {
+        value
+      });
+    }
+
     const element = document.createElement("input");
     element.disabled = data.readOnly;
     element.type = "radio";
@@ -9699,17 +9488,49 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
       element.setAttribute("checked", true);
     }
 
+    element.setAttribute("id", id);
     element.addEventListener("change", function (event) {
-      const name = event.target.name;
+      const {
+        target
+      } = event;
 
-      for (const radio of document.getElementsByName(name)) {
-        if (radio !== event.target) {
-          storage.setValue(radio.parentNode.getAttribute("data-annotation-id"), false);
+      for (const radio of document.getElementsByName(target.name)) {
+        if (radio !== target) {
+          storage.setValue(radio.getAttribute("id"), {
+            value: false
+          });
         }
       }
 
-      storage.setValue(id, event.target.checked);
+      storage.setValue(id, {
+        value: target.checked
+      });
     });
+
+    if (this.enableScripting && this.hasJSActions) {
+      const pdfButtonValue = data.buttonValue;
+      element.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value(event) {
+            const checked = pdfButtonValue === event.detail.value;
+
+            for (const radio of document.getElementsByName(event.target.name)) {
+              const radioId = radio.getAttribute("id");
+              radio.checked = radioId === id && checked;
+              storage.setValue(radioId, {
+                value: radio.checked
+              });
+            }
+          }
+
+        };
+
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+
+      this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], 
["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], 
["mouseup", "Mouse Up"]], event => event.target.checked);
+    }
+
     this.container.appendChild(element);
     return this.container;
   }
@@ -9720,6 +9541,11 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement {
   render() {
     const container = super.render();
     container.className = "buttonWidgetAnnotation pushButton";
+
+    if (this.data.alternativeText) {
+      container.title = this.data.alternativeText;
+    }
+
     return container;
   }
 
@@ -9727,43 +9553,208 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement {
 
 class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
   constructor(parameters) {
-    super(parameters, parameters.renderInteractiveForms);
+    super(parameters, {
+      isRenderable: parameters.renderInteractiveForms
+    });
   }
 
   render() {
     this.container.className = "choiceWidgetAnnotation";
     const storage = this.annotationStorage;
     const id = this.data.id;
-    storage.getOrCreateValue(id, this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null);
+    storage.getValue(id, {
+      value: this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : undefined
+    });
     const selectElement = document.createElement("select");
     selectElement.disabled = this.data.readOnly;
     selectElement.name = this.data.fieldName;
+    selectElement.setAttribute("id", id);
+
+    if (!this.data.combo) {
+      selectElement.size = this.data.options.length;
+
+      if (this.data.multiSelect) {
+        selectElement.multiple = true;
+      }
+    }
+
+    for (const option of this.data.options) {
+      const optionElement = document.createElement("option");
+      optionElement.textContent = option.displayValue;
+      optionElement.value = option.exportValue;
+
+      if (this.data.fieldValue.includes(option.exportValue)) {
+        optionElement.setAttribute("selected", true);
+      }
+
+      selectElement.appendChild(optionElement);
+    }
+
+    const getValue = (event, isExport) => {
+      const name = isExport ? "value" : "textContent";
+      const options = event.target.options;
+
+      if (!event.target.multiple) {
+        return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];
+      }
+
+      return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]);
+    };
+
+    const getItems = event => {
+      const options = event.target.options;
+      return Array.prototype.map.call(options, option => {
+        return {
+          displayValue: option.textContent,
+          exportValue: option.value
+        };
+      });
+    };
+
+    if (this.enableScripting && this.hasJSActions) {
+      selectElement.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value(event) {
+            const options = selectElement.options;
+            const value = event.detail.value;
+            const values = new Set(Array.isArray(value) ? value : [value]);
+            Array.prototype.forEach.call(options, option => {
+              option.selected = values.has(option.value);
+            });
+            storage.setValue(id, {
+              value: getValue(event, true)
+            });
+          },
+
+          multipleSelection(event) {
+            selectElement.multiple = true;
+          },
+
+          remove(event) {
+            const options = selectElement.options;
+            const index = event.detail.remove;
+            options[index].selected = false;
+            selectElement.remove(index);
+
+            if (options.length > 0) {
+              const i = Array.prototype.findIndex.call(options, option => option.selected);
+
+              if (i === -1) {
+                options[0].selected = true;
+              }
+            }
+
+            storage.setValue(id, {
+              value: getValue(event, true),
+              items: getItems(event)
+            });
+          },
+
+          clear(event) {
+            while (selectElement.length !== 0) {
+              selectElement.remove(0);
+            }
+
+            storage.setValue(id, {
+              value: null,
+              items: []
+            });
+          },
+
+          insert(event) {
+            const {
+              index,
+              displayValue,
+              exportValue
+            } = event.detail.insert;
+            const optionElement = document.createElement("option");
+            optionElement.textContent = displayValue;
+            optionElement.value = exportValue;
+            selectElement.insertBefore(optionElement, selectElement.children[index]);
+            storage.setValue(id, {
+              value: getValue(event, true),
+              items: getItems(event)
+            });
+          },
+
+          items(event) {
+            const {
+              items
+            } = event.detail;
+
+            while (selectElement.length !== 0) {
+              selectElement.remove(0);
+            }
 
-    if (!this.data.combo) {
-      selectElement.size = this.data.options.length;
+            for (const item of items) {
+              const {
+                displayValue,
+                exportValue
+              } = item;
+              const optionElement = document.createElement("option");
+              optionElement.textContent = displayValue;
+              optionElement.value = exportValue;
+              selectElement.appendChild(optionElement);
+            }
 
-      if (this.data.multiSelect) {
-        selectElement.multiple = true;
-      }
-    }
+            if (selectElement.options.length > 0) {
+              selectElement.options[0].selected = true;
+            }
 
-    for (const option of this.data.options) {
-      const optionElement = document.createElement("option");
-      optionElement.textContent = option.displayValue;
-      optionElement.value = option.exportValue;
+            storage.setValue(id, {
+              value: getValue(event, true),
+              items: getItems(event)
+            });
+          },
 
-      if (this.data.fieldValue.includes(option.exportValue)) {
-        optionElement.setAttribute("selected", true);
-      }
+          indices(event) {
+            const indices = new Set(event.detail.indices);
+            const options = event.target.options;
+            Array.prototype.forEach.call(options, (option, i) => {
+              option.selected = indices.has(i);
+            });
+            storage.setValue(id, {
+              value: getValue(event, true)
+            });
+          },
 
-      selectElement.appendChild(optionElement);
+          editable(event) {
+            event.target.disabled = !event.detail.editable;
+          }
+
+        };
+
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+      selectElement.addEventListener("input", event => {
+        const exportValue = getValue(event, true);
+        const value = getValue(event, false);
+        storage.setValue(id, {
+          value: exportValue
+        });
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id,
+            name: "Keystroke",
+            value,
+            changeEx: exportValue,
+            willCommit: true,
+            commitKey: 1,
+            keyDown: false
+          }
+        });
+      });
+
+      this._setEventListeners(selectElement, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse 
Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", 
"Action"]], event => event.target.checked);
+    } else {
+      selectElement.addEventListener("input", function (event) {
+        storage.setValue(id, {
+          value: getValue(event)
+        });
+      });
     }
 
-    selectElement.addEventListener("input", function (event) {
-      const options = event.target.options;
-      const value = options[options.selectedIndex].value;
-      storage.setValue(id, value);
-    });
     this.container.appendChild(selectElement);
     return this.container;
   }
@@ -9773,7 +9764,9 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
 class PopupAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable);
+    super(parameters, {
+      isRenderable
+    });
   }
 
   render() {
@@ -9785,24 +9778,29 @@ class PopupAnnotationElement extends AnnotationElement {
     }
 
     const selector = `[data-annotation-id="${this.data.parentId}"]`;
-    const parentElement = this.layer.querySelector(selector);
+    const parentElements = this.layer.querySelectorAll(selector);
 
-    if (!parentElement) {
+    if (parentElements.length === 0) {
       return this.container;
     }
 
     const popup = new PopupElement({
       container: this.container,
-      trigger: parentElement,
+      trigger: Array.from(parentElements),
       color: this.data.color,
       title: this.data.title,
       modificationDate: this.data.modificationDate,
       contents: this.data.contents
     });
-    const parentLeft = parseFloat(parentElement.style.left);
-    const parentWidth = parseFloat(parentElement.style.width);
-    this.container.style.transformOrigin = `-${parentLeft + parentWidth}px -${parentElement.style.top}`;
-    this.container.style.left = `${parentLeft + parentWidth}px`;
+    const page = this.page;
+
+    const rect = _util.Util.normalizeRect([this.data.parentRect[0], page.view[3] - this.data.parentRect[1] + 
page.view[1], this.data.parentRect[2], page.view[3] - this.data.parentRect[3] + page.view[1]]);
+
+    const popupLeft = rect[0] + this.data.parentRect[2] - this.data.parentRect[0];
+    const popupTop = rect[1];
+    this.container.style.transformOrigin = `${-popupLeft}px ${-popupTop}px`;
+    this.container.style.left = `${popupLeft}px`;
+    this.container.style.top = `${popupTop}px`;
     this.container.appendChild(popup.render());
     return this.container;
   }
@@ -9826,7 +9824,7 @@ class PopupElement {
     const wrapper = document.createElement("div");
     wrapper.className = "popupWrapper";
     this.hideElement = this.hideWrapper ? wrapper : this.container;
-    this.hideElement.setAttribute("hidden", true);
+    this.hideElement.hidden = true;
     const popup = document.createElement("div");
     popup.className = "popup";
     const color = this.color;
@@ -9835,7 +9833,7 @@ class PopupElement {
       const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];
       const g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];
       const b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];
-      popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0);
+      popup.style.backgroundColor = _util.Util.makeHexColor(r | 0, g | 0, b | 0);
     }
 
     const title = document.createElement("h1");
@@ -9858,9 +9856,17 @@ class PopupElement {
     const contents = this._formatContents(this.contents);
 
     popup.appendChild(contents);
-    this.trigger.addEventListener("click", this._toggle.bind(this));
-    this.trigger.addEventListener("mouseover", this._show.bind(this, false));
-    this.trigger.addEventListener("mouseout", this._hide.bind(this, false));
+
+    if (!Array.isArray(this.trigger)) {
+      this.trigger = [this.trigger];
+    }
+
+    for (const element of this.trigger) {
+      element.addEventListener("click", this._toggle.bind(this));
+      element.addEventListener("mouseover", this._show.bind(this, false));
+      element.addEventListener("mouseout", this._hide.bind(this, false));
+    }
+
     popup.addEventListener("click", this._hide.bind(this, true));
     wrapper.appendChild(popup);
     return wrapper;
@@ -9895,8 +9901,8 @@ class PopupElement {
       this.pinned = true;
     }
 
-    if (this.hideElement.hasAttribute("hidden")) {
-      this.hideElement.removeAttribute("hidden");
+    if (this.hideElement.hidden) {
+      this.hideElement.hidden = false;
       this.container.style.zIndex += 1;
     }
   }
@@ -9906,8 +9912,8 @@ class PopupElement {
       this.pinned = false;
     }
 
-    if (!this.hideElement.hasAttribute("hidden") && !this.pinned) {
-      this.hideElement.setAttribute("hidden", true);
+    if (!this.hideElement.hidden && !this.pinned) {
+      this.hideElement.hidden = true;
       this.container.style.zIndex -= 1;
     }
   }
@@ -9917,14 +9923,17 @@ class PopupElement {
 class FreeTextAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
     this.container.className = "freeTextAnnotation";
 
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
     }
 
     return this.container;
@@ -9935,7 +9944,10 @@ class FreeTextAnnotationElement extends AnnotationElement {
 class LineAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
@@ -9954,7 +9966,7 @@ class LineAnnotationElement extends AnnotationElement {
     svg.appendChild(line);
     this.container.append(svg);
 
-    this._createPopup(this.container, line, data);
+    this._createPopup(line, data);
 
     return this.container;
   }
@@ -9964,7 +9976,10 @@ class LineAnnotationElement extends AnnotationElement {
 class SquareAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
@@ -9985,7 +10000,7 @@ class SquareAnnotationElement extends AnnotationElement {
     svg.appendChild(square);
     this.container.append(svg);
 
-    this._createPopup(this.container, square, data);
+    this._createPopup(square, data);
 
     return this.container;
   }
@@ -9995,7 +10010,10 @@ class SquareAnnotationElement extends AnnotationElement {
 class CircleAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
@@ -10016,7 +10034,7 @@ class CircleAnnotationElement extends AnnotationElement {
     svg.appendChild(circle);
     this.container.append(svg);
 
-    this._createPopup(this.container, circle, data);
+    this._createPopup(circle, data);
 
     return this.container;
   }
@@ -10026,7 +10044,10 @@ class CircleAnnotationElement extends AnnotationElement {
 class PolylineAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
     this.containerClassName = "polylineAnnotation";
     this.svgElementName = "svg:polyline";
   }
@@ -10054,7 +10075,7 @@ class PolylineAnnotationElement extends AnnotationElement {
     svg.appendChild(polyline);
     this.container.append(svg);
 
-    this._createPopup(this.container, polyline, data);
+    this._createPopup(polyline, data);
 
     return this.container;
   }
@@ -10073,14 +10094,17 @@ class PolygonAnnotationElement extends PolylineAnnotationElement {
 class CaretAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
     this.container.className = "caretAnnotation";
 
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
     }
 
     return this.container;
@@ -10091,7 +10115,10 @@ class CaretAnnotationElement extends AnnotationElement {
 class InkAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
     this.containerClassName = "inkAnnotation";
     this.svgElementName = "svg:polyline";
   }
@@ -10119,7 +10146,7 @@ class InkAnnotationElement extends AnnotationElement {
       polyline.setAttribute("stroke", "transparent");
       polyline.setAttribute("fill", "none");
 
-      this._createPopup(this.container, polyline, data);
+      this._createPopup(polyline, data);
 
       svg.appendChild(polyline);
     }
@@ -10133,16 +10160,23 @@ class InkAnnotationElement extends AnnotationElement {
 class HighlightAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
   }
 
   render() {
-    this.container.className = "highlightAnnotation";
-
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
+    }
+
+    if (this.quadrilaterals) {
+      return this._renderQuadrilaterals("highlightAnnotation");
     }
 
+    this.container.className = "highlightAnnotation";
     return this.container;
   }
 
@@ -10151,16 +10185,23 @@ class HighlightAnnotationElement extends AnnotationElement {
 class UnderlineAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
   }
 
   render() {
-    this.container.className = "underlineAnnotation";
-
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
+    }
+
+    if (this.quadrilaterals) {
+      return this._renderQuadrilaterals("underlineAnnotation");
     }
 
+    this.container.className = "underlineAnnotation";
     return this.container;
   }
 
@@ -10169,16 +10210,23 @@ class UnderlineAnnotationElement extends AnnotationElement {
 class SquigglyAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
   }
 
   render() {
-    this.container.className = "squigglyAnnotation";
-
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
+    }
+
+    if (this.quadrilaterals) {
+      return this._renderQuadrilaterals("squigglyAnnotation");
     }
 
+    this.container.className = "squigglyAnnotation";
     return this.container;
   }
 
@@ -10187,16 +10235,23 @@ class SquigglyAnnotationElement extends AnnotationElement {
 class StrikeOutAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
   }
 
   render() {
-    this.container.className = "strikeoutAnnotation";
-
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
+    }
+
+    if (this.quadrilaterals) {
+      return this._renderQuadrilaterals("strikeoutAnnotation");
     }
 
+    this.container.className = "strikeoutAnnotation";
     return this.container;
   }
 
@@ -10205,14 +10260,17 @@ class StrikeOutAnnotationElement extends AnnotationElement {
 class StampAnnotationElement extends AnnotationElement {
   constructor(parameters) {
     const isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
-    super(parameters, isRenderable, true);
+    super(parameters, {
+      isRenderable,
+      ignoreBorder: true
+    });
   }
 
   render() {
     this.container.className = "stampAnnotation";
 
     if (!this.data.hasPopup) {
-      this._createPopup(this.container, null, this.data);
+      this._createPopup(null, this.data);
     }
 
     return this.container;
@@ -10222,22 +10280,21 @@ class StampAnnotationElement extends AnnotationElement {
 
 class FileAttachmentAnnotationElement extends AnnotationElement {
   constructor(parameters) {
-    super(parameters, true);
+    super(parameters, {
+      isRenderable: true
+    });
     const {
       filename,
       content
     } = this.data.file;
     this.filename = (0, _display_utils.getFilenameFromUrl)(filename);
     this.content = content;
-
-    if (this.linkService.eventBus) {
-      this.linkService.eventBus.dispatch("fileattachmentannotation", {
-        source: this,
-        id: (0, _util.stringToPDFString)(filename),
-        filename,
-        content
-      });
-    }
+    this.linkService.eventBus?.dispatch("fileattachmentannotation", {
+      source: this,
+      id: (0, _util.stringToPDFString)(filename),
+      filename,
+      content
+    });
   }
 
   render() {
@@ -10248,7 +10305,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement {
     trigger.addEventListener("dblclick", this._download.bind(this));
 
     if (!this.data.hasPopup && (this.data.title || this.data.contents)) {
-      this._createPopup(this.container, trigger, this.data);
+      this._createPopup(trigger, this.data);
     }
 
     this.container.appendChild(trigger);
@@ -10256,12 +10313,7 @@ class FileAttachmentAnnotationElement extends AnnotationElement {
   }
 
   _download() {
-    if (!this.downloadManager) {
-      (0, _util.warn)("Download cannot be started due to unavailable download manager");
-      return;
-    }
-
-    this.downloadManager.downloadData(this.content, this.filename, "");
+    this.downloadManager?.openOrDownloadData(this.container, this.content, this.filename);
   }
 
 }
@@ -10297,27 +10349,52 @@ class AnnotationLayer {
         linkService: parameters.linkService,
         downloadManager: parameters.downloadManager,
         imageResourcesPath: parameters.imageResourcesPath || "",
-        renderInteractiveForms: typeof parameters.renderInteractiveForms === "boolean" ? 
parameters.renderInteractiveForms : true,
+        renderInteractiveForms: parameters.renderInteractiveForms !== false,
         svgFactory: new _display_utils.DOMSVGFactory(),
-        annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage()
+        annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage(),
+        enableScripting: parameters.enableScripting,
+        hasJSActions: parameters.hasJSActions,
+        mouseState: parameters.mouseState || {
+          isDown: false
+        }
       });
 
       if (element.isRenderable) {
-        parameters.div.appendChild(element.render());
+        const rendered = element.render();
+
+        if (data.hidden) {
+          rendered.style.visibility = "hidden";
+        }
+
+        if (Array.isArray(rendered)) {
+          for (const renderedElement of rendered) {
+            parameters.div.appendChild(renderedElement);
+          }
+        } else {
+          if (element instanceof PopupAnnotationElement) {
+            parameters.div.prepend(rendered);
+          } else {
+            parameters.div.appendChild(rendered);
+          }
+        }
       }
     }
   }
 
   static update(parameters) {
+    const transform = `matrix(${parameters.viewport.transform.join(",")})`;
+
     for (const data of parameters.annotations) {
-      const element = parameters.div.querySelector(`[data-annotation-id="${data.id}"]`);
+      const elements = parameters.div.querySelectorAll(`[data-annotation-id="${data.id}"]`);
 
-      if (element) {
-        element.style.transform = `matrix(${parameters.viewport.transform.join(",")})`;
+      if (elements) {
+        for (const element of elements) {
+          element.style.transform = transform;
+        }
       }
     }
 
-    parameters.div.removeAttribute("hidden");
+    parameters.div.hidden = false;
   }
 
 }
@@ -10325,442 +10402,561 @@ class AnnotationLayer {
 exports.AnnotationLayer = AnnotationLayer;
 
 /***/ }),
-/* 20 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 18 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.renderTextLayer = void 0;
+}));
+exports.ColorConverters = void 0;
 
-var _util = __w_pdfjs_require__(2);
+function makeColorComp(n) {
+  return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0");
+}
 
-var renderTextLayer = function renderTextLayerClosure() {
-  var MAX_TEXT_DIVS_TO_RENDER = 100000;
-  var NonWhitespaceRegexp = /\S/;
-
-  function isAllWhitespace(str) {
-    return !NonWhitespaceRegexp.test(str);
-  }
-
-  function appendText(task, geom, styles) {
-    var textDiv = document.createElement("span");
-    var textDivProperties = {
-      angle: 0,
-      canvasWidth: 0,
-      isWhitespace: false,
-      originalTransform: null,
-      paddingBottom: 0,
-      paddingLeft: 0,
-      paddingRight: 0,
-      paddingTop: 0,
-      scale: 1
-    };
+class ColorConverters {
+  static CMYK_G([c, y, m, k]) {
+    return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];
+  }
 
-    task._textDivs.push(textDiv);
+  static G_CMYK([g]) {
+    return ["CMYK", 0, 0, 0, 1 - g];
+  }
 
-    if (isAllWhitespace(geom.str)) {
-      textDivProperties.isWhitespace = true;
+  static G_RGB([g]) {
+    return ["RGB", g, g, g];
+  }
 
-      task._textDivProperties.set(textDiv, textDivProperties);
+  static G_HTML([g]) {
+    const G = makeColorComp(g);
+    return `#${G}${G}${G}`;
+  }
 
-      return;
-    }
+  static RGB_G([r, g, b]) {
+    return ["G", 0.3 * r + 0.59 * g + 0.11 * b];
+  }
 
-    var tx = _util.Util.transform(task._viewport.transform, geom.transform);
+  static RGB_HTML([r, g, b]) {
+    const R = makeColorComp(r);
+    const G = makeColorComp(g);
+    const B = makeColorComp(b);
+    return `#${R}${G}${B}`;
+  }
 
-    var angle = Math.atan2(tx[1], tx[0]);
-    var style = styles[geom.fontName];
+  static T_HTML() {
+    return "#00000000";
+  }
 
-    if (style.vertical) {
-      angle += Math.PI / 2;
-    }
+  static CMYK_RGB([c, y, m, k]) {
+    return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];
+  }
 
-    var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);
-    var fontAscent = fontHeight;
+  static CMYK_HTML(components) {
+    return this.RGB_HTML(this.CMYK_RGB(components));
+  }
 
-    if (style.ascent) {
-      fontAscent = style.ascent * fontAscent;
-    } else if (style.descent) {
-      fontAscent = (1 + style.descent) * fontAscent;
-    }
+  static RGB_CMYK([r, g, b]) {
+    const c = 1 - r;
+    const m = 1 - g;
+    const y = 1 - b;
+    const k = Math.min(c, m, y);
+    return ["CMYK", c, m, y, k];
+  }
 
-    let left, top;
+}
 
-    if (angle === 0) {
-      left = tx[4];
-      top = tx[5] - fontAscent;
-    } else {
-      left = tx[4] + fontAscent * Math.sin(angle);
-      top = tx[5] - fontAscent * Math.cos(angle);
-    }
+exports.ColorConverters = ColorConverters;
 
-    textDiv.style.left = `${left}px`;
-    textDiv.style.top = `${top}px`;
-    textDiv.style.fontSize = `${fontHeight}px`;
-    textDiv.style.fontFamily = style.fontFamily;
-    textDiv.textContent = geom.str;
+/***/ }),
+/* 19 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    if (task._fontInspectorEnabled) {
-      textDiv.dataset.fontName = geom.fontName;
-    }
 
-    if (angle !== 0) {
-      textDivProperties.angle = angle * (180 / Math.PI);
-    }
 
-    let shouldScaleText = false;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.renderTextLayer = renderTextLayer;
 
-    if (geom.str.length > 1) {
-      shouldScaleText = true;
-    } else if (geom.transform[0] !== geom.transform[3]) {
-      const absScaleX = Math.abs(geom.transform[0]),
-            absScaleY = Math.abs(geom.transform[3]);
+var _util = __w_pdfjs_require__(2);
 
-      if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {
-        shouldScaleText = true;
-      }
-    }
+const MAX_TEXT_DIVS_TO_RENDER = 100000;
+const DEFAULT_FONT_SIZE = 30;
+const DEFAULT_FONT_ASCENT = 0.8;
+const ascentCache = new Map();
+const AllWhitespaceRegexp = /^\s+$/g;
 
-    if (shouldScaleText) {
-      if (style.vertical) {
-        textDivProperties.canvasWidth = geom.height * task._viewport.scale;
-      } else {
-        textDivProperties.canvasWidth = geom.width * task._viewport.scale;
-      }
+function getAscent(fontFamily, ctx) {
+  const cachedAscent = ascentCache.get(fontFamily);
+
+  if (cachedAscent) {
+    return cachedAscent;
+  }
+
+  ctx.save();
+  ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`;
+  const metrics = ctx.measureText("");
+  let ascent = metrics.fontBoundingBoxAscent;
+  let descent = Math.abs(metrics.fontBoundingBoxDescent);
+
+  if (ascent) {
+    ctx.restore();
+    const ratio = ascent / (ascent + descent);
+    ascentCache.set(fontFamily, ratio);
+    return ratio;
+  }
+
+  ctx.strokeStyle = "red";
+  ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);
+  ctx.strokeText("g", 0, 0);
+  let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;
+  descent = 0;
+
+  for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {
+    if (pixels[i] > 0) {
+      descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);
+      break;
     }
+  }
 
-    task._textDivProperties.set(textDiv, textDivProperties);
+  ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);
+  ctx.strokeText("A", 0, DEFAULT_FONT_SIZE);
+  pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;
+  ascent = 0;
 
-    if (task._textContentStream) {
-      task._layoutText(textDiv);
+  for (let i = 0, ii = pixels.length; i < ii; i += 4) {
+    if (pixels[i] > 0) {
+      ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);
+      break;
     }
+  }
 
-    if (task._enhanceTextSelection) {
-      var angleCos = 1,
-          angleSin = 0;
+  ctx.restore();
 
-      if (angle !== 0) {
-        angleCos = Math.cos(angle);
-        angleSin = Math.sin(angle);
-      }
+  if (ascent) {
+    const ratio = ascent / (ascent + descent);
+    ascentCache.set(fontFamily, ratio);
+    return ratio;
+  }
 
-      var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;
-      var divHeight = fontHeight;
-      var m, b;
+  ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT);
+  return DEFAULT_FONT_ASCENT;
+}
 
-      if (angle !== 0) {
-        m = [angleCos, angleSin, -angleSin, angleCos, left, top];
-        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);
-      } else {
-        b = [left, top, left + divWidth, top + divHeight];
-      }
+function appendText(task, geom, styles, ctx) {
+  const textDiv = document.createElement("span");
+  const textDivProperties = {
+    angle: 0,
+    canvasWidth: 0,
+    hasText: geom.str !== "",
+    hasEOL: geom.hasEOL,
+    originalTransform: null,
+    paddingBottom: 0,
+    paddingLeft: 0,
+    paddingRight: 0,
+    paddingTop: 0,
+    scale: 1
+  };
 
-      task._bounds.push({
-        left: b[0],
-        top: b[1],
-        right: b[2],
-        bottom: b[3],
-        div: textDiv,
-        size: [divWidth, divHeight],
-        m
-      });
+  task._textDivs.push(textDiv);
+
+  const tx = _util.Util.transform(task._viewport.transform, geom.transform);
+
+  let angle = Math.atan2(tx[1], tx[0]);
+  const style = styles[geom.fontName];
+
+  if (style.vertical) {
+    angle += Math.PI / 2;
+  }
+
+  const fontHeight = Math.hypot(tx[2], tx[3]);
+  const fontAscent = fontHeight * getAscent(style.fontFamily, ctx);
+  let left, top;
+
+  if (angle === 0) {
+    left = tx[4];
+    top = tx[5] - fontAscent;
+  } else {
+    left = tx[4] + fontAscent * Math.sin(angle);
+    top = tx[5] - fontAscent * Math.cos(angle);
+  }
+
+  textDiv.style.left = `${left}px`;
+  textDiv.style.top = `${top}px`;
+  textDiv.style.fontSize = `${fontHeight}px`;
+  textDiv.style.fontFamily = style.fontFamily;
+  textDiv.setAttribute("role", "presentation");
+  textDiv.textContent = geom.str;
+  textDiv.dir = geom.dir;
+
+  if (task._fontInspectorEnabled) {
+    textDiv.dataset.fontName = geom.fontName;
+  }
+
+  if (angle !== 0) {
+    textDivProperties.angle = angle * (180 / Math.PI);
+  }
+
+  let shouldScaleText = false;
+
+  if (geom.str.length > 1 || task._enhanceTextSelection && AllWhitespaceRegexp.test(geom.str)) {
+    shouldScaleText = true;
+  } else if (geom.transform[0] !== geom.transform[3]) {
+    const absScaleX = Math.abs(geom.transform[0]),
+          absScaleY = Math.abs(geom.transform[3]);
+
+    if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {
+      shouldScaleText = true;
     }
   }
 
-  function render(task) {
-    if (task._canceled) {
-      return;
+  if (shouldScaleText) {
+    if (style.vertical) {
+      textDivProperties.canvasWidth = geom.height * task._viewport.scale;
+    } else {
+      textDivProperties.canvasWidth = geom.width * task._viewport.scale;
     }
+  }
 
-    var textDivs = task._textDivs;
-    var capability = task._capability;
-    var textDivsLength = textDivs.length;
+  task._textDivProperties.set(textDiv, textDivProperties);
 
-    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
-      task._renderingDone = true;
-      capability.resolve();
-      return;
+  if (task._textContentStream) {
+    task._layoutText(textDiv);
+  }
+
+  if (task._enhanceTextSelection && textDivProperties.hasText) {
+    let angleCos = 1,
+        angleSin = 0;
+
+    if (angle !== 0) {
+      angleCos = Math.cos(angle);
+      angleSin = Math.sin(angle);
     }
 
-    if (!task._textContentStream) {
-      for (var i = 0; i < textDivsLength; i++) {
-        task._layoutText(textDivs[i]);
-      }
+    const divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;
+    const divHeight = fontHeight;
+    let m, b;
+
+    if (angle !== 0) {
+      m = [angleCos, angleSin, -angleSin, angleCos, left, top];
+      b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);
+    } else {
+      b = [left, top, left + divWidth, top + divHeight];
     }
 
+    task._bounds.push({
+      left: b[0],
+      top: b[1],
+      right: b[2],
+      bottom: b[3],
+      div: textDiv,
+      size: [divWidth, divHeight],
+      m
+    });
+  }
+}
+
+function render(task) {
+  if (task._canceled) {
+    return;
+  }
+
+  const textDivs = task._textDivs;
+  const capability = task._capability;
+  const textDivsLength = textDivs.length;
+
+  if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
     task._renderingDone = true;
     capability.resolve();
+    return;
+  }
+
+  if (!task._textContentStream) {
+    for (let i = 0; i < textDivsLength; i++) {
+      task._layoutText(textDivs[i]);
+    }
   }
 
-  function findPositiveMin(ts, offset, count) {
-    let result = 0;
+  task._renderingDone = true;
+  capability.resolve();
+}
 
-    for (let i = 0; i < count; i++) {
-      const t = ts[offset++];
+function findPositiveMin(ts, offset, count) {
+  let result = 0;
 
-      if (t > 0) {
-        result = result ? Math.min(t, result) : t;
-      }
-    }
+  for (let i = 0; i < count; i++) {
+    const t = ts[offset++];
 
-    return result;
+    if (t > 0) {
+      result = result ? Math.min(t, result) : t;
+    }
   }
 
-  function expand(task) {
-    var bounds = task._bounds;
-    var viewport = task._viewport;
-    var expanded = expandBounds(viewport.width, viewport.height, bounds);
+  return result;
+}
+
+function expand(task) {
+  const bounds = task._bounds;
+  const viewport = task._viewport;
+  const expanded = expandBounds(viewport.width, viewport.height, bounds);
 
-    for (var i = 0; i < expanded.length; i++) {
-      var div = bounds[i].div;
+  for (let i = 0; i < expanded.length; i++) {
+    const div = bounds[i].div;
 
-      var divProperties = task._textDivProperties.get(div);
+    const divProperties = task._textDivProperties.get(div);
 
-      if (divProperties.angle === 0) {
-        divProperties.paddingLeft = bounds[i].left - expanded[i].left;
-        divProperties.paddingTop = bounds[i].top - expanded[i].top;
-        divProperties.paddingRight = expanded[i].right - bounds[i].right;
-        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;
+    if (divProperties.angle === 0) {
+      divProperties.paddingLeft = bounds[i].left - expanded[i].left;
+      divProperties.paddingTop = bounds[i].top - expanded[i].top;
+      divProperties.paddingRight = expanded[i].right - bounds[i].right;
+      divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;
 
-        task._textDivProperties.set(div, divProperties);
+      task._textDivProperties.set(div, divProperties);
 
-        continue;
-      }
+      continue;
+    }
 
-      var e = expanded[i],
+    const e = expanded[i],
           b = bounds[i];
-      var m = b.m,
+    const m = b.m,
           c = m[0],
           s = m[1];
-      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];
-      var ts = new Float64Array(64);
-      points.forEach(function (p, j) {
-        var t = _util.Util.applyTransform(p, m);
-
-        ts[j + 0] = c && (e.left - t[0]) / c;
-        ts[j + 4] = s && (e.top - t[1]) / s;
-        ts[j + 8] = c && (e.right - t[0]) / c;
-        ts[j + 12] = s && (e.bottom - t[1]) / s;
-        ts[j + 16] = s && (e.left - t[0]) / -s;
-        ts[j + 20] = c && (e.top - t[1]) / c;
-        ts[j + 24] = s && (e.right - t[0]) / -s;
-        ts[j + 28] = c && (e.bottom - t[1]) / c;
-        ts[j + 32] = c && (e.left - t[0]) / -c;
-        ts[j + 36] = s && (e.top - t[1]) / -s;
-        ts[j + 40] = c && (e.right - t[0]) / -c;
-        ts[j + 44] = s && (e.bottom - t[1]) / -s;
-        ts[j + 48] = s && (e.left - t[0]) / s;
-        ts[j + 52] = c && (e.top - t[1]) / -c;
-        ts[j + 56] = s && (e.right - t[0]) / s;
-        ts[j + 60] = c && (e.bottom - t[1]) / -c;
-      });
-      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));
-      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;
-      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;
-      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;
-      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;
-
-      task._textDivProperties.set(div, divProperties);
-    }
+    const points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];
+    const ts = new Float64Array(64);
+
+    for (let j = 0, jj = points.length; j < jj; j++) {
+      const t = _util.Util.applyTransform(points[j], m);
+
+      ts[j + 0] = c && (e.left - t[0]) / c;
+      ts[j + 4] = s && (e.top - t[1]) / s;
+      ts[j + 8] = c && (e.right - t[0]) / c;
+      ts[j + 12] = s && (e.bottom - t[1]) / s;
+      ts[j + 16] = s && (e.left - t[0]) / -s;
+      ts[j + 20] = c && (e.top - t[1]) / c;
+      ts[j + 24] = s && (e.right - t[0]) / -s;
+      ts[j + 28] = c && (e.bottom - t[1]) / c;
+      ts[j + 32] = c && (e.left - t[0]) / -c;
+      ts[j + 36] = s && (e.top - t[1]) / -s;
+      ts[j + 40] = c && (e.right - t[0]) / -c;
+      ts[j + 44] = s && (e.bottom - t[1]) / -s;
+      ts[j + 48] = s && (e.left - t[0]) / s;
+      ts[j + 52] = c && (e.top - t[1]) / -c;
+      ts[j + 56] = s && (e.right - t[0]) / s;
+      ts[j + 60] = c && (e.bottom - t[1]) / -c;
+    }
+
+    const boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));
+    divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;
+    divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;
+    divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;
+    divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;
+
+    task._textDivProperties.set(div, divProperties);
+  }
+}
+
+function expandBounds(width, height, boxes) {
+  const bounds = boxes.map(function (box, i) {
+    return {
+      x1: box.left,
+      y1: box.top,
+      x2: box.right,
+      y2: box.bottom,
+      index: i,
+      x1New: undefined,
+      x2New: undefined
+    };
+  });
+  expandBoundsLTR(width, bounds);
+  const expanded = new Array(boxes.length);
+
+  for (const b of bounds) {
+    const i = b.index;
+    expanded[i] = {
+      left: b.x1New,
+      top: 0,
+      right: b.x2New,
+      bottom: 0
+    };
   }
 
-  function expandBounds(width, height, boxes) {
-    var bounds = boxes.map(function (box, i) {
-      return {
-        x1: box.left,
-        y1: box.top,
-        x2: box.right,
-        y2: box.bottom,
-        index: i,
-        x1New: undefined,
-        x2New: undefined
-      };
-    });
-    expandBoundsLTR(width, bounds);
-    var expanded = new Array(boxes.length);
-    bounds.forEach(function (b) {
-      var i = b.index;
-      expanded[i] = {
-        left: b.x1New,
-        top: 0,
-        right: b.x2New,
-        bottom: 0
-      };
-    });
-    boxes.map(function (box, i) {
-      var e = expanded[i],
+  boxes.map(function (box, i) {
+    const e = expanded[i],
           b = bounds[i];
-      b.x1 = box.top;
-      b.y1 = width - e.right;
-      b.x2 = box.bottom;
-      b.y2 = width - e.left;
-      b.index = i;
-      b.x1New = undefined;
-      b.x2New = undefined;
-    });
-    expandBoundsLTR(height, bounds);
-    bounds.forEach(function (b) {
-      var i = b.index;
-      expanded[i].top = b.x1New;
-      expanded[i].bottom = b.x2New;
-    });
-    return expanded;
+    b.x1 = box.top;
+    b.y1 = width - e.right;
+    b.x2 = box.bottom;
+    b.y2 = width - e.left;
+    b.index = i;
+    b.x1New = undefined;
+    b.x2New = undefined;
+  });
+  expandBoundsLTR(height, bounds);
+
+  for (const b of bounds) {
+    const i = b.index;
+    expanded[i].top = b.x1New;
+    expanded[i].bottom = b.x2New;
   }
 
-  function expandBoundsLTR(width, bounds) {
-    bounds.sort(function (a, b) {
-      return a.x1 - b.x1 || a.index - b.index;
-    });
-    var fakeBoundary = {
-      x1: -Infinity,
-      y1: -Infinity,
-      x2: 0,
-      y2: Infinity,
-      index: -1,
-      x1New: 0,
-      x2New: 0
-    };
-    var horizon = [{
-      start: -Infinity,
-      end: Infinity,
-      boundary: fakeBoundary
-    }];
-    bounds.forEach(function (boundary) {
-      var i = 0;
-
-      while (i < horizon.length && horizon[i].end <= boundary.y1) {
-        i++;
-      }
+  return expanded;
+}
 
-      var j = horizon.length - 1;
+function expandBoundsLTR(width, bounds) {
+  bounds.sort(function (a, b) {
+    return a.x1 - b.x1 || a.index - b.index;
+  });
+  const fakeBoundary = {
+    x1: -Infinity,
+    y1: -Infinity,
+    x2: 0,
+    y2: Infinity,
+    index: -1,
+    x1New: 0,
+    x2New: 0
+  };
+  const horizon = [{
+    start: -Infinity,
+    end: Infinity,
+    boundary: fakeBoundary
+  }];
 
-      while (j >= 0 && horizon[j].start >= boundary.y2) {
-        j--;
-      }
+  for (const boundary of bounds) {
+    let i = 0;
 
-      var horizonPart, affectedBoundary;
-      var q,
-          k,
-          maxXNew = -Infinity;
+    while (i < horizon.length && horizon[i].end <= boundary.y1) {
+      i++;
+    }
 
-      for (q = i; q <= j; q++) {
-        horizonPart = horizon[q];
-        affectedBoundary = horizonPart.boundary;
-        var xNew;
+    let j = horizon.length - 1;
 
-        if (affectedBoundary.x2 > boundary.x1) {
-          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;
-        } else if (affectedBoundary.x2New === undefined) {
-          xNew = (affectedBoundary.x2 + boundary.x1) / 2;
-        } else {
-          xNew = affectedBoundary.x2New;
-        }
+    while (j >= 0 && horizon[j].start >= boundary.y2) {
+      j--;
+    }
 
-        if (xNew > maxXNew) {
-          maxXNew = xNew;
-        }
-      }
+    let horizonPart, affectedBoundary;
+    let q,
+        k,
+        maxXNew = -Infinity;
 
-      boundary.x1New = maxXNew;
+    for (q = i; q <= j; q++) {
+      horizonPart = horizon[q];
+      affectedBoundary = horizonPart.boundary;
+      let xNew;
 
-      for (q = i; q <= j; q++) {
-        horizonPart = horizon[q];
-        affectedBoundary = horizonPart.boundary;
+      if (affectedBoundary.x2 > boundary.x1) {
+        xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;
+      } else if (affectedBoundary.x2New === undefined) {
+        xNew = (affectedBoundary.x2 + boundary.x1) / 2;
+      } else {
+        xNew = affectedBoundary.x2New;
+      }
 
-        if (affectedBoundary.x2New === undefined) {
-          if (affectedBoundary.x2 > boundary.x1) {
-            if (affectedBoundary.index > boundary.index) {
-              affectedBoundary.x2New = affectedBoundary.x2;
-            }
-          } else {
-            affectedBoundary.x2New = maxXNew;
-          }
-        } else if (affectedBoundary.x2New > maxXNew) {
-          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);
-        }
+      if (xNew > maxXNew) {
+        maxXNew = xNew;
       }
+    }
 
-      var changedHorizon = [],
-          lastBoundary = null;
+    boundary.x1New = maxXNew;
 
-      for (q = i; q <= j; q++) {
-        horizonPart = horizon[q];
-        affectedBoundary = horizonPart.boundary;
-        var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;
+    for (q = i; q <= j; q++) {
+      horizonPart = horizon[q];
+      affectedBoundary = horizonPart.boundary;
 
-        if (lastBoundary === useBoundary) {
-          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;
+      if (affectedBoundary.x2New === undefined) {
+        if (affectedBoundary.x2 > boundary.x1) {
+          if (affectedBoundary.index > boundary.index) {
+            affectedBoundary.x2New = affectedBoundary.x2;
+          }
         } else {
-          changedHorizon.push({
-            start: horizonPart.start,
-            end: horizonPart.end,
-            boundary: useBoundary
-          });
-          lastBoundary = useBoundary;
+          affectedBoundary.x2New = maxXNew;
         }
+      } else if (affectedBoundary.x2New > maxXNew) {
+        affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);
       }
+    }
 
-      if (horizon[i].start < boundary.y1) {
-        changedHorizon[0].start = boundary.y1;
-        changedHorizon.unshift({
-          start: horizon[i].start,
-          end: boundary.y1,
-          boundary: horizon[i].boundary
-        });
-      }
+    const changedHorizon = [];
+    let lastBoundary = null;
 
-      if (boundary.y2 < horizon[j].end) {
-        changedHorizon[changedHorizon.length - 1].end = boundary.y2;
+    for (q = i; q <= j; q++) {
+      horizonPart = horizon[q];
+      affectedBoundary = horizonPart.boundary;
+      const useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;
+
+      if (lastBoundary === useBoundary) {
+        changedHorizon[changedHorizon.length - 1].end = horizonPart.end;
+      } else {
         changedHorizon.push({
-          start: boundary.y2,
-          end: horizon[j].end,
-          boundary: horizon[j].boundary
+          start: horizonPart.start,
+          end: horizonPart.end,
+          boundary: useBoundary
         });
+        lastBoundary = useBoundary;
       }
+    }
 
-      for (q = i; q <= j; q++) {
-        horizonPart = horizon[q];
-        affectedBoundary = horizonPart.boundary;
+    if (horizon[i].start < boundary.y1) {
+      changedHorizon[0].start = boundary.y1;
+      changedHorizon.unshift({
+        start: horizon[i].start,
+        end: boundary.y1,
+        boundary: horizon[i].boundary
+      });
+    }
 
-        if (affectedBoundary.x2New !== undefined) {
-          continue;
-        }
+    if (boundary.y2 < horizon[j].end) {
+      changedHorizon[changedHorizon.length - 1].end = boundary.y2;
+      changedHorizon.push({
+        start: boundary.y2,
+        end: horizon[j].end,
+        boundary: horizon[j].boundary
+      });
+    }
 
-        var used = false;
+    for (q = i; q <= j; q++) {
+      horizonPart = horizon[q];
+      affectedBoundary = horizonPart.boundary;
 
-        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {
-          used = horizon[k].boundary === affectedBoundary;
-        }
+      if (affectedBoundary.x2New !== undefined) {
+        continue;
+      }
 
-        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {
-          used = horizon[k].boundary === affectedBoundary;
-        }
+      let used = false;
 
-        for (k = 0; !used && k < changedHorizon.length; k++) {
-          used = changedHorizon[k].boundary === affectedBoundary;
-        }
+      for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {
+        used = horizon[k].boundary === affectedBoundary;
+      }
 
-        if (!used) {
-          affectedBoundary.x2New = maxXNew;
-        }
+      for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {
+        used = horizon[k].boundary === affectedBoundary;
       }
 
-      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));
-    });
-    horizon.forEach(function (horizonPart) {
-      var affectedBoundary = horizonPart.boundary;
+      for (k = 0; !used && k < changedHorizon.length; k++) {
+        used = changedHorizon[k].boundary === affectedBoundary;
+      }
 
-      if (affectedBoundary.x2New === undefined) {
-        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);
+      if (!used) {
+        affectedBoundary.x2New = maxXNew;
       }
-    });
+    }
+
+    Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));
+  }
+
+  for (const horizonPart of horizon) {
+    const affectedBoundary = horizonPart.boundary;
+
+    if (affectedBoundary.x2New === undefined) {
+      affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);
+    }
   }
+}
 
-  function TextLayerRenderTask({
+class TextLayerRenderTask {
+  constructor({
     textContent,
     textContentStream,
     container,
@@ -10777,7 +10973,7 @@ var renderTextLayer = function renderTextLayerClosure() {
     this._textDivs = textDivs || [];
     this._textContentItemsStr = textContentItemsStr || [];
     this._enhanceTextSelection = !!enhanceTextSelection;
-    this._fontInspectorEnabled = !!(globalThis.FontInspector && globalThis.FontInspector.enabled);
+    this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled;
     this._reader = null;
     this._layoutTextLastFontSize = null;
     this._layoutTextLastFontFamily = null;
@@ -10798,240 +10994,258 @@ var renderTextLayer = function renderTextLayerClosure() {
     }).catch(() => {});
   }
 
-  TextLayerRenderTask.prototype = {
-    get promise() {
-      return this._capability.promise;
-    },
+  get promise() {
+    return this._capability.promise;
+  }
 
-    cancel: function TextLayer_cancel() {
-      this._canceled = true;
+  cancel() {
+    this._canceled = true;
 
-      if (this._reader) {
-        this._reader.cancel(new _util.AbortException("TextLayer task cancelled."));
+    if (this._reader) {
+      this._reader.cancel(new _util.AbortException("TextLayer task cancelled."));
 
-        this._reader = null;
-      }
+      this._reader = null;
+    }
 
-      if (this._renderTimer !== null) {
-        clearTimeout(this._renderTimer);
-        this._renderTimer = null;
-      }
+    if (this._renderTimer !== null) {
+      clearTimeout(this._renderTimer);
+      this._renderTimer = null;
+    }
 
-      this._capability.reject(new Error("TextLayer task cancelled."));
-    },
+    this._capability.reject(new Error("TextLayer task cancelled."));
+  }
 
-    _processItems(items, styleCache) {
-      for (let i = 0, len = items.length; i < len; i++) {
-        this._textContentItemsStr.push(items[i].str);
+  _processItems(items, styleCache) {
+    for (let i = 0, len = items.length; i < len; i++) {
+      if (items[i].str === undefined) {
+        if (items[i].type === "beginMarkedContentProps" || items[i].type === "beginMarkedContent") {
+          const parent = this._container;
+          this._container = document.createElement("span");
 
-        appendText(this, items[i], styleCache);
-      }
-    },
+          this._container.classList.add("markedContent");
 
-    _layoutText(textDiv) {
-      const textDivProperties = this._textDivProperties.get(textDiv);
+          if (items[i].id !== null) {
+            this._container.setAttribute("id", `${items[i].id}`);
+          }
 
-      if (textDivProperties.isWhitespace) {
-        return;
+          parent.appendChild(this._container);
+        } else if (items[i].type === "endMarkedContent") {
+          this._container = this._container.parentNode;
+        }
+
+        continue;
       }
 
-      let transform = "";
+      this._textContentItemsStr.push(items[i].str);
 
-      if (textDivProperties.canvasWidth !== 0) {
-        const {
-          fontSize,
-          fontFamily
-        } = textDiv.style;
+      appendText(this, items[i], styleCache, this._layoutTextCtx);
+    }
+  }
 
-        if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
-          this._layoutTextCtx.font = `${fontSize} ${fontFamily}`;
-          this._layoutTextLastFontSize = fontSize;
-          this._layoutTextLastFontFamily = fontFamily;
-        }
+  _layoutText(textDiv) {
+    const textDivProperties = this._textDivProperties.get(textDiv);
 
-        const {
-          width
-        } = this._layoutTextCtx.measureText(textDiv.textContent);
+    let transform = "";
 
-        if (width > 0) {
-          textDivProperties.scale = textDivProperties.canvasWidth / width;
-          transform = `scaleX(${textDivProperties.scale})`;
-        }
+    if (textDivProperties.canvasWidth !== 0 && textDivProperties.hasText) {
+      const {
+        fontSize,
+        fontFamily
+      } = textDiv.style;
+
+      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
+        this._layoutTextCtx.font = `${fontSize} ${fontFamily}`;
+        this._layoutTextLastFontSize = fontSize;
+        this._layoutTextLastFontFamily = fontFamily;
       }
 
-      if (textDivProperties.angle !== 0) {
-        transform = `rotate(${textDivProperties.angle}deg) ${transform}`;
+      const {
+        width
+      } = this._layoutTextCtx.measureText(textDiv.textContent);
+
+      if (width > 0) {
+        textDivProperties.scale = textDivProperties.canvasWidth / width;
+        transform = `scaleX(${textDivProperties.scale})`;
       }
+    }
 
-      if (transform.length > 0) {
-        if (this._enhanceTextSelection) {
-          textDivProperties.originalTransform = transform;
-        }
+    if (textDivProperties.angle !== 0) {
+      transform = `rotate(${textDivProperties.angle}deg) ${transform}`;
+    }
 
-        textDiv.style.transform = transform;
+    if (transform.length > 0) {
+      if (this._enhanceTextSelection) {
+        textDivProperties.originalTransform = transform;
       }
 
-      this._textDivProperties.set(textDiv, textDivProperties);
+      textDiv.style.transform = transform;
+    }
 
+    if (textDivProperties.hasText) {
       this._container.appendChild(textDiv);
-    },
+    }
 
-    _render: function TextLayer_render(timeout) {
-      const capability = (0, _util.createPromiseCapability)();
-      let styleCache = Object.create(null);
+    if (textDivProperties.hasEOL) {
+      const br = document.createElement("br");
+      br.setAttribute("role", "presentation");
 
-      const canvas = this._document.createElement("canvas");
+      this._container.appendChild(br);
+    }
+  }
 
-      canvas.mozOpaque = true;
-      this._layoutTextCtx = canvas.getContext("2d", {
-        alpha: false
-      });
+  _render(timeout = 0) {
+    const capability = (0, _util.createPromiseCapability)();
+    let styleCache = Object.create(null);
 
-      if (this._textContent) {
-        const textItems = this._textContent.items;
-        const textStyles = this._textContent.styles;
+    const canvas = this._document.createElement("canvas");
 
-        this._processItems(textItems, textStyles);
+    canvas.height = canvas.width = DEFAULT_FONT_SIZE;
+    canvas.mozOpaque = true;
+    this._layoutTextCtx = canvas.getContext("2d", {
+      alpha: false
+    });
 
-        capability.resolve();
-      } else if (this._textContentStream) {
-        const pump = () => {
-          this._reader.read().then(({
-            value,
-            done
-          }) => {
-            if (done) {
-              capability.resolve();
-              return;
-            }
+    if (this._textContent) {
+      const textItems = this._textContent.items;
+      const textStyles = this._textContent.styles;
 
-            Object.assign(styleCache, value.styles);
+      this._processItems(textItems, textStyles);
 
-            this._processItems(value.items, styleCache);
+      capability.resolve();
+    } else if (this._textContentStream) {
+      const pump = () => {
+        this._reader.read().then(({
+          value,
+          done
+        }) => {
+          if (done) {
+            capability.resolve();
+            return;
+          }
 
-            pump();
-          }, capability.reject);
-        };
+          Object.assign(styleCache, value.styles);
 
-        this._reader = this._textContentStream.getReader();
-        pump();
-      } else {
-        throw new Error('Neither "textContent" nor "textContentStream"' + " parameters specified.");
-      }
+          this._processItems(value.items, styleCache);
 
-      capability.promise.then(() => {
-        styleCache = null;
+          pump();
+        }, capability.reject);
+      };
 
-        if (!timeout) {
-          render(this);
-        } else {
-          this._renderTimer = setTimeout(() => {
-            render(this);
-            this._renderTimer = null;
-          }, timeout);
-        }
-      }, this._capability.reject);
-    },
-    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {
-      if (!this._enhanceTextSelection || !this._renderingDone) {
-        return;
-      }
+      this._reader = this._textContentStream.getReader();
+      pump();
+    } else {
+      throw new Error('Neither "textContent" nor "textContentStream"' + " parameters specified.");
+    }
 
-      if (this._bounds !== null) {
-        expand(this);
-        this._bounds = null;
+    capability.promise.then(() => {
+      styleCache = null;
+
+      if (!timeout) {
+        render(this);
+      } else {
+        this._renderTimer = setTimeout(() => {
+          render(this);
+          this._renderTimer = null;
+        }, timeout);
       }
+    }, this._capability.reject);
+  }
 
-      const transformBuf = [],
-            paddingBuf = [];
+  expandTextDivs(expandDivs = false) {
+    if (!this._enhanceTextSelection || !this._renderingDone) {
+      return;
+    }
 
-      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
-        const div = this._textDivs[i];
+    if (this._bounds !== null) {
+      expand(this);
+      this._bounds = null;
+    }
 
-        const divProps = this._textDivProperties.get(div);
+    const transformBuf = [],
+          paddingBuf = [];
 
-        if (divProps.isWhitespace) {
-          continue;
-        }
+    for (let i = 0, ii = this._textDivs.length; i < ii; i++) {
+      const div = this._textDivs[i];
 
-        if (expandDivs) {
-          transformBuf.length = 0;
-          paddingBuf.length = 0;
+      const divProps = this._textDivProperties.get(div);
 
-          if (divProps.originalTransform) {
-            transformBuf.push(divProps.originalTransform);
-          }
+      if (!divProps.hasText) {
+        continue;
+      }
 
-          if (divProps.paddingTop > 0) {
-            paddingBuf.push(`${divProps.paddingTop}px`);
-            transformBuf.push(`translateY(${-divProps.paddingTop}px)`);
-          } else {
-            paddingBuf.push(0);
-          }
+      if (expandDivs) {
+        transformBuf.length = 0;
+        paddingBuf.length = 0;
 
-          if (divProps.paddingRight > 0) {
-            paddingBuf.push(`${divProps.paddingRight / divProps.scale}px`);
-          } else {
-            paddingBuf.push(0);
-          }
+        if (divProps.originalTransform) {
+          transformBuf.push(divProps.originalTransform);
+        }
 
-          if (divProps.paddingBottom > 0) {
-            paddingBuf.push(`${divProps.paddingBottom}px`);
-          } else {
-            paddingBuf.push(0);
-          }
+        if (divProps.paddingTop > 0) {
+          paddingBuf.push(`${divProps.paddingTop}px`);
+          transformBuf.push(`translateY(${-divProps.paddingTop}px)`);
+        } else {
+          paddingBuf.push(0);
+        }
 
-          if (divProps.paddingLeft > 0) {
-            paddingBuf.push(`${divProps.paddingLeft / divProps.scale}px`);
-            transformBuf.push(`translateX(${-divProps.paddingLeft / divProps.scale}px)`);
-          } else {
-            paddingBuf.push(0);
-          }
+        if (divProps.paddingRight > 0) {
+          paddingBuf.push(`${divProps.paddingRight / divProps.scale}px`);
+        } else {
+          paddingBuf.push(0);
+        }
 
-          div.style.padding = paddingBuf.join(" ");
+        if (divProps.paddingBottom > 0) {
+          paddingBuf.push(`${divProps.paddingBottom}px`);
+        } else {
+          paddingBuf.push(0);
+        }
 
-          if (transformBuf.length) {
-            div.style.transform = transformBuf.join(" ");
-          }
+        if (divProps.paddingLeft > 0) {
+          paddingBuf.push(`${divProps.paddingLeft / divProps.scale}px`);
+          transformBuf.push(`translateX(${-divProps.paddingLeft / divProps.scale}px)`);
         } else {
-          div.style.padding = null;
-          div.style.transform = divProps.originalTransform;
+          paddingBuf.push(0);
         }
+
+        div.style.padding = paddingBuf.join(" ");
+
+        if (transformBuf.length) {
+          div.style.transform = transformBuf.join(" ");
+        }
+      } else {
+        div.style.padding = null;
+        div.style.transform = divProps.originalTransform;
       }
     }
-  };
-
-  function renderTextLayer(renderParameters) {
-    var task = new TextLayerRenderTask({
-      textContent: renderParameters.textContent,
-      textContentStream: renderParameters.textContentStream,
-      container: renderParameters.container,
-      viewport: renderParameters.viewport,
-      textDivs: renderParameters.textDivs,
-      textContentItemsStr: renderParameters.textContentItemsStr,
-      enhanceTextSelection: renderParameters.enhanceTextSelection
-    });
+  }
 
-    task._render(renderParameters.timeout);
+}
 
-    return task;
-  }
+function renderTextLayer(renderParameters) {
+  const task = new TextLayerRenderTask({
+    textContent: renderParameters.textContent,
+    textContentStream: renderParameters.textContentStream,
+    container: renderParameters.container,
+    viewport: renderParameters.viewport,
+    textDivs: renderParameters.textDivs,
+    textContentItemsStr: renderParameters.textContentItemsStr,
+    enhanceTextSelection: renderParameters.enhanceTextSelection
+  });
 
-  return renderTextLayer;
-}();
+  task._render(renderParameters.timeout);
 
-exports.renderTextLayer = renderTextLayer;
+  return task;
+}
 
 /***/ }),
-/* 21 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 20 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.SVGGraphics = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -11040,10 +11254,12 @@ var _display_utils = __w_pdfjs_require__(1);
 
 var _is_node = __w_pdfjs_require__(4);
 
-let SVGGraphics = function () {
-  throw new Error("Not implemented: SVGGraphics");
-};
+let SVGGraphics = class {
+  constructor() {
+    (0, _util.unreachable)("Not implemented: SVGGraphics");
+  }
 
+};
 exports.SVGGraphics = SVGGraphics;
 {
   const SVG_DEFAULTS = {
@@ -11373,7 +11589,7 @@ exports.SVGGraphics = SVGGraphics;
   let clipCount = 0;
   let maskCount = 0;
   let shadingCount = 0;
-  exports.SVGGraphics = SVGGraphics = class SVGGraphics {
+  exports.SVGGraphics = SVGGraphics = class {
     constructor(commonObjs, objs, forceDataSchema = false) {
       this.svgFactory = new _display_utils.DOMSVGFactory();
       this.current = new SVGExtraState();
@@ -11700,7 +11916,7 @@ exports.SVGGraphics = SVGGraphics;
     setTextMatrix(a, b, c, d, e, f) {
       const current = this.current;
       current.textMatrix = current.lineMatrix = [a, b, c, d, e, f];
-      current.textMatrixScale = Math.sqrt(a * a + b * b);
+      current.textMatrixScale = Math.hypot(a, b);
       current.x = current.lineX = 0;
       current.y = current.lineY = 0;
       current.xcoords = [];
@@ -11901,7 +12117,7 @@ exports.SVGGraphics = SVGGraphics;
         this.embeddedFonts[fontObj.loadedName] = fontObj;
       }
 
-      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;
+      current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX;
       let bold = "normal";
 
       if (fontObj.black) {
@@ -11932,7 +12148,7 @@ exports.SVGGraphics = SVGGraphics;
     endText() {
       const current = this.current;
 
-      if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement && 
current.txtElement.hasChildNodes()) {
+      if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && 
current.txtElement?.hasChildNodes()) {
         current.element = current.txtElement;
         this.clip("nonzero");
         this.endPath();
@@ -11962,7 +12178,7 @@ exports.SVGGraphics = SVGGraphics;
     }
 
     setStrokeRGBColor(r, g, b) {
-      this.current.strokeColor = _util.Util.makeCssRgb(r, g, b);
+      this.current.strokeColor = _util.Util.makeHexColor(r, g, b);
     }
 
     setFillAlpha(fillAlpha) {
@@ -11970,7 +12186,7 @@ exports.SVGGraphics = SVGGraphics;
     }
 
     setFillRGBColor(r, g, b) {
-      this.current.fillColor = _util.Util.makeCssRgb(r, g, b);
+      this.current.fillColor = _util.Util.makeHexColor(r, g, b);
       this.current.tspan = this.svgFactory.createElement("svg:tspan");
       this.current.xcoords = [];
       this.current.ycoords = [];
@@ -12034,9 +12250,7 @@ exports.SVGGraphics = SVGGraphics;
       const paintType = args[7];
       const tilingId = `shading${shadingCount++}`;
 
-      const [tx0, ty0] = _util.Util.applyTransform([x0, y0], matrix);
-
-      const [tx1, ty1] = _util.Util.applyTransform([x1, y1], matrix);
+      const [tx0, ty0, tx1, ty1] = _util.Util.normalizeRect([..._util.Util.applyTransform([x0, y0], matrix), 
..._util.Util.applyTransform([x1, y1], matrix)]);
 
       const [xscale, yscale] = _util.Util.singularValueDecompose2dScale(matrix);
 
@@ -12058,7 +12272,7 @@ exports.SVGGraphics = SVGGraphics;
       this.transformMatrix = matrix;
 
       if (paintType === 2) {
-        const cssColor = _util.Util.makeCssRgb(...color);
+        const cssColor = _util.Util.makeHexColor(...color);
 
         this.current.fillColor = cssColor;
         this.current.strokeColor = cssColor;
@@ -12246,9 +12460,11 @@ exports.SVGGraphics = SVGGraphics;
 
       if (current.activeClipUrl) {
         current.clipGroup = null;
-        this.extraStack.forEach(function (prev) {
+
+        for (const prev of this.extraStack) {
           prev.clipGroup = null;
-        });
+        }
+
         clipPath.setAttributeNS(null, "clip-path", current.activeClipUrl);
       }
 
@@ -12519,45 +12735,239 @@ exports.SVGGraphics = SVGGraphics;
       return svg;
     }
 
-    _ensureClipGroup() {
-      if (!this.current.clipGroup) {
-        const clipGroup = this.svgFactory.createElement("svg:g");
-        clipGroup.setAttributeNS(null, "clip-path", this.current.activeClipUrl);
-        this.svg.appendChild(clipGroup);
-        this.current.clipGroup = clipGroup;
+    _ensureClipGroup() {
+      if (!this.current.clipGroup) {
+        const clipGroup = this.svgFactory.createElement("svg:g");
+        clipGroup.setAttributeNS(null, "clip-path", this.current.activeClipUrl);
+        this.svg.appendChild(clipGroup);
+        this.current.clipGroup = clipGroup;
+      }
+
+      return this.current.clipGroup;
+    }
+
+    _ensureTransformGroup() {
+      if (!this.tgrp) {
+        this.tgrp = this.svgFactory.createElement("svg:g");
+        this.tgrp.setAttributeNS(null, "transform", pm(this.transformMatrix));
+
+        if (this.current.activeClipUrl) {
+          this._ensureClipGroup().appendChild(this.tgrp);
+        } else {
+          this.svg.appendChild(this.tgrp);
+        }
+      }
+
+      return this.tgrp;
+    }
+
+  };
+}
+
+/***/ }),
+/* 21 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XfaLayer = void 0;
+
+class XfaLayer {
+  static setupStorage(html, id, element, storage, intent) {
+    const storedData = storage.getValue(id, {
+      value: null
+    });
+
+    switch (element.name) {
+      case "textarea":
+        if (storedData.value !== null) {
+          html.textContent = storedData.value;
+        }
+
+        if (intent === "print") {
+          break;
+        }
+
+        html.addEventListener("input", event => {
+          storage.setValue(id, {
+            value: event.target.value
+          });
+        });
+        break;
+
+      case "input":
+        if (element.attributes.type === "radio" || element.attributes.type === "checkbox") {
+          if (storedData.value === element.attributes.xfaOn) {
+            html.setAttribute("checked", true);
+          }
+
+          if (intent === "print") {
+            break;
+          }
+
+          html.addEventListener("change", event => {
+            storage.setValue(id, {
+              value: event.target.getAttribute("xfaOn")
+            });
+          });
+        } else {
+          if (storedData.value !== null) {
+            html.setAttribute("value", storedData.value);
+          }
+
+          if (intent === "print") {
+            break;
+          }
+
+          html.addEventListener("input", event => {
+            storage.setValue(id, {
+              value: event.target.value
+            });
+          });
+        }
+
+        break;
+
+      case "select":
+        if (storedData.value !== null) {
+          for (const option of element.children) {
+            if (option.attributes.value === storedData.value) {
+              option.attributes.selected = true;
+            }
+          }
+        }
+
+        html.addEventListener("input", event => {
+          const options = event.target.options;
+          const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value;
+          storage.setValue(id, {
+            value
+          });
+        });
+        break;
+    }
+  }
+
+  static setAttributes(html, element, storage, intent) {
+    const {
+      attributes
+    } = element;
+
+    if (attributes.type === "radio") {
+      attributes.name = `${attributes.name}-${intent}`;
+    }
+
+    for (const [key, value] of Object.entries(attributes)) {
+      if (value === null || value === undefined || key === "dataId") {
+        continue;
+      }
+
+      if (key !== "style") {
+        if (key === "textContent") {
+          html.textContent = value;
+        } else if (key === "class") {
+          html.setAttribute(key, value.join(" "));
+        } else {
+          html.setAttribute(key, value);
+        }
+      } else {
+        Object.assign(html.style, value);
+      }
+    }
+
+    if (storage && attributes.dataId) {
+      this.setupStorage(html, attributes.dataId, element, storage);
+    }
+  }
+
+  static render(parameters) {
+    const storage = parameters.annotationStorage;
+    const root = parameters.xfa;
+    const intent = parameters.intent || "display";
+    const rootHtml = document.createElement(root.name);
+
+    if (root.attributes) {
+      this.setAttributes(rootHtml, root);
+    }
+
+    const stack = [[root, -1, rootHtml]];
+    const rootDiv = parameters.div;
+    rootDiv.appendChild(rootHtml);
+    const transform = `matrix(${parameters.viewport.transform.join(",")})`;
+    rootDiv.style.transform = transform;
+    rootDiv.setAttribute("class", "xfaLayer xfaFont");
+
+    while (stack.length > 0) {
+      const [parent, i, html] = stack[stack.length - 1];
+
+      if (i + 1 === parent.children.length) {
+        stack.pop();
+        continue;
+      }
+
+      const child = parent.children[++stack[stack.length - 1][1]];
+
+      if (child === null) {
+        continue;
+      }
+
+      const {
+        name
+      } = child;
+
+      if (name === "#text") {
+        html.appendChild(document.createTextNode(child.value));
+        continue;
       }
 
-      return this.current.clipGroup;
-    }
+      let childHtml;
 
-    _ensureTransformGroup() {
-      if (!this.tgrp) {
-        this.tgrp = this.svgFactory.createElement("svg:g");
-        this.tgrp.setAttributeNS(null, "transform", pm(this.transformMatrix));
+      if (child?.attributes?.xmlns) {
+        childHtml = document.createElementNS(child.attributes.xmlns, name);
+      } else {
+        childHtml = document.createElement(name);
+      }
 
-        if (this.current.activeClipUrl) {
-          this._ensureClipGroup().appendChild(this.tgrp);
-        } else {
-          this.svg.appendChild(this.tgrp);
-        }
+      html.appendChild(childHtml);
+
+      if (child.attributes) {
+        this.setAttributes(childHtml, child, storage, intent);
       }
 
-      return this.tgrp;
+      if (child.children && child.children.length > 0) {
+        stack.push([child, -1, childHtml]);
+      } else if (child.value) {
+        childHtml.appendChild(document.createTextNode(child.value));
+      }
     }
 
-  };
+    for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) {
+      el.setAttribute("readOnly", true);
+    }
+  }
+
+  static update(parameters) {
+    const transform = `matrix(${parameters.viewport.transform.join(",")})`;
+    parameters.div.style.transform = transform;
+    parameters.div.hidden = false;
+  }
+
 }
 
+exports.XfaLayer = XfaLayer;
+
 /***/ }),
 /* 22 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFNodeStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -12606,7 +13016,7 @@ class PDFNodeStream {
   }
 
   get _progressiveDataLength() {
-    return this._fullRequestReader ? this._fullRequestReader._loaded : 0;
+    return this._fullRequestReader?._loaded ?? 0;
   }
 
   getFullReader() {
@@ -12632,11 +13042,9 @@ class PDFNodeStream {
       this._fullRequestReader.cancel(reason);
     }
 
-    const readers = this._rangeRequestReaders.slice(0);
-
-    readers.forEach(function (reader) {
+    for (const reader of this._rangeRequestReaders.slice(0)) {
       reader.cancel(reason);
-    });
+    }
   }
 
 }
@@ -13019,14 +13427,13 @@ class PDFNodeStreamFsRangeReader extends BaseRangeReader {
 
 /***/ }),
 /* 23 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.createResponseStatusError = createResponseStatusError;
 exports.extractFilenameFromHeader = extractFilenameFromHeader;
 exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities;
@@ -13036,6 +13443,8 @@ var _util = __w_pdfjs_require__(2);
 
 var _content_disposition = __w_pdfjs_require__(24);
 
+var _display_utils = __w_pdfjs_require__(1);
+
 function validateRangeRequestCapabilities({
   getResponseHeader,
   isHttp,
@@ -13089,7 +13498,7 @@ function extractFilenameFromHeader(getResponseHeader) {
       } catch (ex) {}
     }
 
-    if (/\.pdf$/i.test(filename)) {
+    if ((0, _display_utils.isPdfFile)(filename)) {
       return filename;
     }
   }
@@ -13102,7 +13511,7 @@ function createResponseStatusError(status, url) {
     return new _util.MissingPDFException('Missing PDF "' + url + '".');
   }
 
-  return new _util.UnexpectedResponseException("Unexpected server response (" + status + ') while retrieving 
PDF "' + url + '".', status);
+  return new _util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF 
"${url}".`, status);
 }
 
 function validateResponseStatus(status) {
@@ -13111,16 +13520,17 @@ function validateResponseStatus(status) {
 
 /***/ }),
 /* 24 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader;
 
+var _util = __w_pdfjs_require__(2);
+
 function getFilenameFromContentDispositionHeader(contentDisposition) {
   let needsEncodingFixup = true;
   let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition);
@@ -13164,10 +13574,8 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
         const decoder = new TextDecoder(encoding, {
           fatal: true
         });
-        const bytes = Array.from(value, function (ch) {
-          return ch.charCodeAt(0) & 0xff;
-        });
-        value = decoder.decode(new Uint8Array(bytes));
+        const buffer = (0, _util.stringToBytes)(value);
+        value = decoder.decode(buffer);
         needsEncodingFixup = false;
       } catch (e) {
         if (/^utf-?8$/i.test(encoding)) {
@@ -13299,14 +13707,13 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
 
 /***/ }),
 /* 25 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFNetworkStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -13535,11 +13942,9 @@ class PDFNetworkStream {
       this._fullRequestReader.cancel(reason);
     }
 
-    const readers = this._rangeRequestReaders.slice(0);
-
-    readers.forEach(function (reader) {
+    for (const reader of this._rangeRequestReaders.slice(0)) {
       reader.cancel(reason);
-    });
+    }
   }
 
 }
@@ -13629,14 +14034,14 @@ class PDFNetworkStreamFullRequestReader {
       return;
     }
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
+    }
 
-    this._requests = [];
+    this._requests.length = 0;
   }
 
   _onError(status) {
@@ -13646,12 +14051,12 @@ class PDFNetworkStreamFullRequestReader {
 
     this._headersReceivedCapability.reject(exception);
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.reject(exception);
-    });
+    }
 
-    this._requests = [];
-    this._cachedChunks = [];
+    this._requests.length = 0;
+    this._cachedChunks.length = 0;
   }
 
   _onProgress(data) {
@@ -13716,14 +14121,14 @@ class PDFNetworkStreamFullRequestReader {
 
     this._headersReceivedCapability.reject(reason);
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
+    }
 
-    this._requests = [];
+    this._requests.length = 0;
 
     if (this._manager.isPendingRequest(this._fullRequestId)) {
       this._manager.abortRequest(this._fullRequestId);
@@ -13771,14 +14176,14 @@ class PDFNetworkStreamRangeRequestReader {
 
     this._done = true;
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
+    }
 
-    this._requests = [];
+    this._requests.length = 0;
 
     this._close();
   }
@@ -13822,14 +14227,14 @@ class PDFNetworkStreamRangeRequestReader {
   cancel(reason) {
     this._done = true;
 
-    this._requests.forEach(function (requestCapability) {
+    for (const requestCapability of this._requests) {
       requestCapability.resolve({
         value: undefined,
         done: true
       });
-    });
+    }
 
-    this._requests = [];
+    this._requests.length = 0;
 
     if (this._manager.isPendingRequest(this._requestId)) {
       this._manager.abortRequest(this._requestId);
@@ -13842,14 +14247,13 @@ class PDFNetworkStreamRangeRequestReader {
 
 /***/ }),
 /* 26 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFFetchStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -13862,7 +14266,7 @@ function createFetchOptions(headers, withCredentials, abortController) {
   return {
     method: "GET",
     headers,
-    signal: abortController && abortController.signal,
+    signal: abortController?.signal,
     mode: "cors",
     credentials: withCredentials ? "include" : "same-origin",
     redirect: "follow"
@@ -13895,7 +14299,7 @@ class PDFFetchStream {
   }
 
   get _progressiveDataLength() {
-    return this._fullRequestReader ? this._fullRequestReader._loaded : 0;
+    return this._fullRequestReader?._loaded ?? 0;
   }
 
   getFullReader() {
@@ -13921,11 +14325,9 @@ class PDFFetchStream {
       this._fullRequestReader.cancel(reason);
     }
 
-    const readers = this._rangeRequestReaders.slice(0);
-
-    readers.forEach(function (reader) {
+    for (const reader of this._rangeRequestReaders.slice(0)) {
       reader.cancel(reason);
-    });
+    }
   }
 
 }
@@ -14080,7 +14482,7 @@ class PDFFetchStreamRangeReader {
 
       this._reader = response.body.getReader();
     }).catch(reason => {
-      if (reason && reason.name === "AbortError") {
+      if (reason?.name === "AbortError") {
         return;
       }
 
@@ -14135,6 +14537,304 @@ class PDFFetchStreamRangeReader {
 }
 
 /***/ })
-/******/ ]);
+/******/       ]);
+/************************************************************************/
+/******/       // The module cache
+/******/       var __webpack_module_cache__ = {};
+/******/       
+/******/       // The require function
+/******/       function __w_pdfjs_require__(moduleId) {
+/******/               // Check if module is in cache
+/******/               var cachedModule = __webpack_module_cache__[moduleId];
+/******/               if (cachedModule !== undefined) {
+/******/                       return cachedModule.exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = __webpack_module_cache__[moduleId] = {
+/******/                       // no module.id needed
+/******/                       // no module.loaded needed
+/******/                       exports: {}
+/******/               };
+/******/       
+/******/               // Execute the module function
+/******/               __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);
+/******/       
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/       
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the 
chunk.
+(() => {
+var exports = __webpack_exports__;
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+Object.defineProperty(exports, "addLinkAttributes", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.addLinkAttributes;
+  }
+}));
+Object.defineProperty(exports, "getFilenameFromUrl", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.getFilenameFromUrl;
+  }
+}));
+Object.defineProperty(exports, "getPdfFilenameFromUrl", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.getPdfFilenameFromUrl;
+  }
+}));
+Object.defineProperty(exports, "getXfaPageViewport", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.getXfaPageViewport;
+  }
+}));
+Object.defineProperty(exports, "isPdfFile", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.isPdfFile;
+  }
+}));
+Object.defineProperty(exports, "LinkTarget", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.LinkTarget;
+  }
+}));
+Object.defineProperty(exports, "loadScript", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.loadScript;
+  }
+}));
+Object.defineProperty(exports, "PDFDateString", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.PDFDateString;
+  }
+}));
+Object.defineProperty(exports, "RenderingCancelledException", ({
+  enumerable: true,
+  get: function () {
+    return _display_utils.RenderingCancelledException;
+  }
+}));
+Object.defineProperty(exports, "build", ({
+  enumerable: true,
+  get: function () {
+    return _api.build;
+  }
+}));
+Object.defineProperty(exports, "getDocument", ({
+  enumerable: true,
+  get: function () {
+    return _api.getDocument;
+  }
+}));
+Object.defineProperty(exports, "LoopbackPort", ({
+  enumerable: true,
+  get: function () {
+    return _api.LoopbackPort;
+  }
+}));
+Object.defineProperty(exports, "PDFDataRangeTransport", ({
+  enumerable: true,
+  get: function () {
+    return _api.PDFDataRangeTransport;
+  }
+}));
+Object.defineProperty(exports, "PDFWorker", ({
+  enumerable: true,
+  get: function () {
+    return _api.PDFWorker;
+  }
+}));
+Object.defineProperty(exports, "version", ({
+  enumerable: true,
+  get: function () {
+    return _api.version;
+  }
+}));
+Object.defineProperty(exports, "CMapCompressionType", ({
+  enumerable: true,
+  get: function () {
+    return _util.CMapCompressionType;
+  }
+}));
+Object.defineProperty(exports, "createObjectURL", ({
+  enumerable: true,
+  get: function () {
+    return _util.createObjectURL;
+  }
+}));
+Object.defineProperty(exports, "createPromiseCapability", ({
+  enumerable: true,
+  get: function () {
+    return _util.createPromiseCapability;
+  }
+}));
+Object.defineProperty(exports, "createValidAbsoluteUrl", ({
+  enumerable: true,
+  get: function () {
+    return _util.createValidAbsoluteUrl;
+  }
+}));
+Object.defineProperty(exports, "InvalidPDFException", ({
+  enumerable: true,
+  get: function () {
+    return _util.InvalidPDFException;
+  }
+}));
+Object.defineProperty(exports, "MissingPDFException", ({
+  enumerable: true,
+  get: function () {
+    return _util.MissingPDFException;
+  }
+}));
+Object.defineProperty(exports, "OPS", ({
+  enumerable: true,
+  get: function () {
+    return _util.OPS;
+  }
+}));
+Object.defineProperty(exports, "PasswordResponses", ({
+  enumerable: true,
+  get: function () {
+    return _util.PasswordResponses;
+  }
+}));
+Object.defineProperty(exports, "PermissionFlag", ({
+  enumerable: true,
+  get: function () {
+    return _util.PermissionFlag;
+  }
+}));
+Object.defineProperty(exports, "removeNullCharacters", ({
+  enumerable: true,
+  get: function () {
+    return _util.removeNullCharacters;
+  }
+}));
+Object.defineProperty(exports, "shadow", ({
+  enumerable: true,
+  get: function () {
+    return _util.shadow;
+  }
+}));
+Object.defineProperty(exports, "UnexpectedResponseException", ({
+  enumerable: true,
+  get: function () {
+    return _util.UnexpectedResponseException;
+  }
+}));
+Object.defineProperty(exports, "UNSUPPORTED_FEATURES", ({
+  enumerable: true,
+  get: function () {
+    return _util.UNSUPPORTED_FEATURES;
+  }
+}));
+Object.defineProperty(exports, "Util", ({
+  enumerable: true,
+  get: function () {
+    return _util.Util;
+  }
+}));
+Object.defineProperty(exports, "VerbosityLevel", ({
+  enumerable: true,
+  get: function () {
+    return _util.VerbosityLevel;
+  }
+}));
+Object.defineProperty(exports, "AnnotationLayer", ({
+  enumerable: true,
+  get: function () {
+    return _annotation_layer.AnnotationLayer;
+  }
+}));
+Object.defineProperty(exports, "GlobalWorkerOptions", ({
+  enumerable: true,
+  get: function () {
+    return _worker_options.GlobalWorkerOptions;
+  }
+}));
+Object.defineProperty(exports, "renderTextLayer", ({
+  enumerable: true,
+  get: function () {
+    return _text_layer.renderTextLayer;
+  }
+}));
+Object.defineProperty(exports, "SVGGraphics", ({
+  enumerable: true,
+  get: function () {
+    return _svg.SVGGraphics;
+  }
+}));
+Object.defineProperty(exports, "XfaLayer", ({
+  enumerable: true,
+  get: function () {
+    return _xfa_layer.XfaLayer;
+  }
+}));
+
+var _display_utils = __w_pdfjs_require__(1);
+
+var _api = __w_pdfjs_require__(6);
+
+var _util = __w_pdfjs_require__(2);
+
+var _annotation_layer = __w_pdfjs_require__(17);
+
+var _worker_options = __w_pdfjs_require__(12);
+
+var _is_node = __w_pdfjs_require__(4);
+
+var _text_layer = __w_pdfjs_require__(19);
+
+var _svg = __w_pdfjs_require__(20);
+
+var _xfa_layer = __w_pdfjs_require__(21);
+
+const pdfjsVersion = '2.10.377';
+const pdfjsBuild = '156762c48';
+{
+  if (_is_node.isNodeJS) {
+    const {
+      PDFNodeStream
+    } = __w_pdfjs_require__(22);
+
+    (0, _api.setPDFNetworkStreamFactory)(params => {
+      return new PDFNodeStream(params);
+    });
+  } else {
+    const {
+      PDFNetworkStream
+    } = __w_pdfjs_require__(25);
+
+    const {
+      PDFFetchStream
+    } = __w_pdfjs_require__(26);
+
+    (0, _api.setPDFNetworkStreamFactory)(params => {
+      if ((0, _display_utils.isValidFetchUrl)(params.url)) {
+        return new PDFFetchStream(params);
+      }
+
+      return new PDFNetworkStream(params);
+    });
+  }
+}
+})();
+
+/******/       return __webpack_exports__;
+/******/ })()
+;
 });
 //# sourceMappingURL=pdf.js.map
\ No newline at end of file
diff --git a/third-party/pdfjs/build/pdf.sandbox.js b/third-party/pdfjs/build/pdf.sandbox.js
new file mode 100644
index 000000000..9f778c348
--- /dev/null
+++ b/third-party/pdfjs/build/pdf.sandbox.js
@@ -0,0 +1,309 @@
+/**
+ * @licstart The following is the entire license notice for the
+ * Javascript code in this page
+ *
+ * Copyright 2021 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @licend The above is the entire license notice for the
+ * Javascript code in this page
+ */
+
+(function webpackUniversalModuleDefinition(root, factory) {
+       if(typeof exports === 'object' && typeof module === 'object')
+               module.exports = factory();
+       else if(typeof define === 'function' && define.amd)
+               define("pdfjs-dist/build/pdf.sandbox", [], factory);
+       else if(typeof exports === 'object')
+               exports["pdfjs-dist/build/pdf.sandbox"] = factory();
+       else
+               root["pdfjs-dist/build/pdf.sandbox"] = root.pdfjsSandbox = factory();
+})(this, function() {
+return /******/ (() => { // webpackBootstrap
+/******/       "use strict";
+/******/       var __webpack_modules__ = ([
+/* 0 */,
+/* 1 */
+/***/ ((__unused_webpack_module, exports) => {
+
+Object.defineProperty(exports, "__esModule", ({value:true}));exports.default=void 0;var 
Module=function(){var _scriptDir=typeof 
document!=='undefined'&&document.currentScript?document.currentScript.src:undefined;return 
function(Module){Module=Module||{};var b;b||(b=typeof Module!=='undefined'?Module:{});var h,n;b.ready=new 
Promise(function(a,c){h=a;n=c;});var q={},r;for(r in b)b.hasOwnProperty(r)&&(q[r]=b[r]);var 
t="";"undefined"!==typeof 
document&&document.currentScript&&(t=document.currentScript.src);_scriptDir&&(t=_scriptDir);0!==t.indexOf("blob:")?t=t.substr(0,t.lastIndexOf("/")+1):t="";var
 aa=b.print||console.log.bind(console),u=b.printErr||console.warn.bind(console);for(r in 
q)q.hasOwnProperty(r)&&(b[r]=q[r]);q=null;var v;b.wasmBinary&&(v=b.wasmBinary);var 
noExitRuntime=b.noExitRuntime||!0;"object"!==typeof WebAssembly&&w("no native wasm support detected");var 
x,z=!1;function A(a){var c=b["_"+a];c||w("Assertion failed: Cannot call unknown function "+(a+", make sure it 
is expor
 ted"));return c;}function B(a,c,d,e){var f={string:function(l){var p=0;if(null!==l&&void 0!==l&&0!==l){var 
U=(l.length<<2)+1;p=C(U);D(l,E,p,U);}return p;},array:function(l){var p=C(l.length);F.set(l,p);return 
p;}},g=A(a),k=[];a=0;if(e)for(var m=0;m<e.length;m++){var 
y=f[d[m]];y?(0===a&&(a=G()),k[m]=y(e[m])):k[m]=e[m];}d=g.apply(null,k);d=function(l){return"string"===c?H(l):"boolean"===c?!!l:l;}(d);0!==a&&I(a);return
 d;}var J="undefined"!==typeof TextDecoder?new TextDecoder("utf8"):void 0;function K(a,c,d){var 
e=c+d;for(d=c;a[d]&&!(d>=e);)++d;if(16<d-c&&a.subarray&&J)return J.decode(a.subarray(c,d));for(e="";c<d;){var 
f=a[c++];if(f&128){var g=a[c++]&63;if(192==(f&224))e+=String.fromCharCode((f&31)<<6|g);else{var 
k=a[c++]&63;f=224==(f&240)?(f&15)<<12|g<<6|k:(f&7)<<18|g<<12|k<<6|a[c++]&63;65536>f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023));}}else
 e+=String.fromCharCode(f);}return e;}function H(a){return a?K(E,a,void 0):"";}function D(a,c,d,e){i
 f(0<e){e=d+e-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=g){var 
k=a.charCodeAt(++f);g=65536+((g&1023)<<10)|k&1023;}if(127>=g){if(d>=e)break;c[d++]=g;}else{if(2047>=g){if(d+1>=e)break;c[d++]=192|g>>6;}else{if(65535>=g){if(d+2>=e)break;c[d++]=224|g>>12;}else{if(d+3>=e)break;c[d++]=240|g>>18;c[d++]=128|g>>12&63;}c[d++]=128|g>>6&63;}c[d++]=128|g&63;}}c[d]=0;}}function
 L(a){for(var c=0,d=0;d<a.length;++d){var 
e=a.charCodeAt(d);55296<=e&&57343>=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++c:c=2047>=e?c+2:65535>=e?c+3:c+4;}return
 c;}function ba(a){var c=L(a)+1,d=M(c);d&&D(a,F,d,c);return d;}var ca,F,E,N;function da(){var 
a=x.buffer;ca=a;b.HEAP8=F=new Int8Array(a);b.HEAP16=new Int16Array(a);b.HEAP32=N=new 
Int32Array(a);b.HEAPU8=E=new Uint8Array(a);b.HEAPU16=new Uint16Array(a);b.HEAPU32=new 
Uint32Array(a);b.HEAPF32=new Float32Array(a);b.HEAPF64=new Float64Array(a);}var 
O,ea=[],fa=[],ha=[],ia=[];function ja(){var a=b.preRun.shift();ea.unshift(a);}var
  P=0,Q=null,R=null;b.preloadedImages={};b.preloadedAudios={};function 
w(a){if(b.onAbort)b.onAbort(a);u(a);z=!0;a=new WebAssembly.RuntimeError("abort("+a+"). Build with -s 
ASSERTIONS=1 for more info.");n(a);throw a;}function S(a){return 
String.prototype.startsWith?a.startsWith("data:application/octet-stream;base64,"):0===a.indexOf("data:application/octet-stream;base64,");}var
 
T="data:application/octet-stream;base64,AGFzbQEAAAABxQZsYAR/fn9/AX5gA39/fwF/YAJ/fwF/YAJ/fwBgAX8Bf2AFf35/f38BfmADf39/AGABfAF8YAF/AGACf34BfmACf34AYAR/f39/AX9gAn9/AX5gAn9+AX9gA39/fgF/YAN/fn8BfmABfgF/YAN/fn8AYAZ/fn9/f38BfmADf35/AX9gBX9/f39/AX9gBn9+fn9/fwF+YAN/fn4BfmAEf39+fwF/YAN/f38BfmAEf39/fwBgBn9/f39/fwF/YAR/f39/AX5gA39+fgF/YAF/AX5gBX9+fn5+AGABfgF+YAJ8fAF8YAABf2AFf35/fn8Bf2AHf35/fn5+fwF/YAV/fn5/fwF+YAAAYAV/f39/fwBgA39+fgBgBH9+fn8AYAd/f39/f39/AX9gBn9+f35+fwF/YAV/fn5+fwF/YAV/fn5/fwBgAn5/AGAJf39/f39/f39/AX9gBH9+f38Bf2AEf35+fwF/YAJ+fwF/YAZ/f39/f38BfmAHf35/f39/fwF+YAR/fn9+AX5gBH9+fn8BfmAHf39/f39/fwBgA39/fgBgBH9/fn8AYAR
 
/fn9/AGAIf39/f39/f38Bf2AEf39/fgF/YAR/fn9+AX9gBH9+fn4Bf2AGf3x/f39/AX9gA35/fwF/YAR/fn5+AX5gAn5+AX5gAnx/AXxgA3x8fwF8YAZ/f39/f38AYAN/f3wAYAV/fn9/fwBgBH9+f34AYAJ/fABgB3x/f39/f38AYAp/f39/f39/f39/AX9gB39/f35+fn8Bf2AFf39+f38Bf2AEf39+fgF/YAV/f35+fwF/YAZ/f35+f38Bf2AGf39+fn5+AX9gBX9+f39/AX9gBn9+f39/fwF/YAV/fn5+fgF/YAZ/fn5+fn8Bf2AEf3x/fwF/YAN+fn4Bf2AEfn5+fgF/YAJ8fwF/YAJ8fAF/YAABfmABfAF+YAV/f39/fwF+YAd/f39/f39+AX5gBX9/f39+AX5gBH9/f34BfmADf39+AX5gBH9/fn8BfmAFf39+fn4BfmAFf35/fn8BfmAHf35+fn9/fwF+YAh/fn5+fn9+fgF+YAN/fnwBfmAFf3x/f38BfmABfwF8YAF+AXxgAn9/AXxgAn5+AXwCPQoBYQFhABkBYQFiACUBYQFjAAIBYQFkAAsBYQFlAAQBYQFmAAMBYQFnAAEBYQFoAAIBYQFpAAgBYQFqABkD2AjWCAoQAx8DBBADYwYGWwMCAyIDAQMDNwMQESQBOQoQBAgJAQkNAgICAwweBgQkAx0DDQ0CBh0JMQ4GAQQIBAgOPGkCAQMDHQgPAgkLEAsBCxwOBAMEAwwBBAkWTAYGBg0TAwIDDz0IAQgMKCYBIwETDwQeAgEUUAQLAwQQFwYBAQIwLQINDRA9FB0KBAIIDQQEExsQIgkWDS0MBi4EAQhECwMrNQ4EABMCEAELJ0gGDQECOgQGYQINDw4ODg4GCAJCMgYCAidHXhQTNhoIBBQBFgIOEwQvMAErA2QBAjIBAgYIASI2AggIAgQWAwQPEAQNAwQJARkYBFcBLAIGA0oCBBQpXQUNPwMOAwEO
 
HAI8Ig0JATACAQMIBAQDMQcEBBoCCAYmCRYGFAEEAgYBBAMBDgUvA0kCAgQMYFwFRgEWGQhnKxcPAxQGBgIBAgEYKAsHIEMHAgILAQQCBAIGDQAyBBgbCwECCwYLAQQDBAEEAQIDAUE4Dh8AVA8ZBANVBAwIAxYDag0kDBgaD1IGBAEBBiQFDwMNAwsCAk4BAgIMMRA5CwMBCC0HBwIEBAIEAQEGCwQBBDoCBgMJFAEDAAIDAQsCLgEIAQICAhQNAQsCCwsCGR8QUTcDEwMQBAQTAgQWDggaGRQDAgYRA09TNRgQGgcJTWIAQBsCHR0NFgECDSonCw4VAA4/CwMEAgEESxcJDRAEGAkDBg8XAgIDAgMBHl8IBikUBAdYBwIlAgICGQQIBAsEAgECBAECKSkCAVkADw8BAQ0JBAEAAGUfCQUABSIcGgAaAQMEAy4UAQMCAgECCgEQAwIEAQIBCAIMFAQEBAEBH0EFZi84JQMJAwMKBgYBDjQJCwgMAAMfAQYVCRAcIAUMEAgDDwULGQECCBEMBQBaDgMDAygFBQUmAhszDAICJAIBBAICAwYBAggrHBMMF0ADDg4GCQsCAQ0OFyEMCBwcJgEQAwQYARgEAQICAgEDAAUEBggEJx4gAwJrHlZoHSgeBAEZBEICBEMgRQcAAwQaAgAzAAAGBgYGBgYGBgYGBQUAAAEMAAEMAQwBDAEMAQwBDAEMBQUBAAAAJQAABQAACQUAAA8JAAUPEgAACQAAAAAAAAAAAAAAAAcAAAcHBRIFBQAAAAUFBQAAAAAABQUFBQAAAAAAAAAAAAAAAAAABQAAAAAAAAAABQUFAAAAAAMABQAFAQAAAAAFAAAFAAUFAAkJAAAAAAUFFgkAAAAAAAAAAAUAAAAFBQAAAAUABQAAAgAAAAAAAAUAAAASBRIFAAASBRISEgAAABgRChEKCgoRChISBQUPBQUFBQUSACo0EyMTOxcRCgAAEgkAAAAAAAAAA
 
A8JCQAjExcTEhgjARsbGwEDEQoRCgoKEQoRCgoKEQoRChEKEQoKEQoRCgYYFRUVFQEDAwMVFRUVAAQIIQ8BBwcAACEhIQEPAAM+BQEHBwcHBwcHByAHBwcHBwcHBxUHAwQHAXAB9wL3AgUHAQGAAoCAAgYJAX8BQfCzxAILB08QAWsCAAFsALMEAW0A3wgBbgCCBQFvAL0HAXAAiwcBcQC2BgFyAKECAXMA6QEBdAEAAXUAxAgBdgDDCAF3AMIIAXgAuwgBeQC6CAF6ALkICfMFAQBBAQv2ApUErwiuCK0IrAizCLIIsQjAB9wErQeTB4UH6wbmAr8GtQbIBKEGkAaPBo4GjQbdCIgGygjHCMEIwAjsBbgItwi2CLUItAjrBYQEqwiwCIkImwWICOYB3wfWB6oIiwiRBekH0gfRB9AHzgfKB8gHkAeyBqkIqAinCKYIpQinBaQIowiiCKEIoAifCJ4InQicCJsImgiZCJgIlwiWCPEDlQjxA5QIkwiSCJEIigiGCIUIhAiHCKUFkAiPCPMH8gfxB/AH7wfuB+0H7AfrB94H3QfcB/ED2wenBdoH2QfYB9cHjgiNCIwIgwiCCIEIgAj/B/4H/Qf8B/sH+gf5B/gH9wf2B/UH9AfqB+gH5wfmB+UH5AfjB+IH4QfgB9UH1AfTB4wCzwfNB8wHywfJB8cHqQXGB8UHxAfDB/4EwgfBB78HqgW+B7wHuwe6B7kHuAe3B7YHtQeyBbQHswfYBLIHsQewB9YErweuB6wH1wSrB6oHqQeoB6cHpgelB6QHoweiB5oDoQegB58HngedB5wHmweaB5kHmAeXB5YH/QOVB5QHsQWzBZIHkQePB44HjQeMB4oHiQeIB4cH0gTRBIYHhAeDB4IHgQeAB/8G/gb9BvwG+wb6BvkG+Ab3BvYG9Qb0BvMG8gbxBvAG7wbuBu0G7AbqBukG6AbnBuYG5QbkBuMG4gbhBuAG3wbeBt0G3AbbBtoG2Q
 
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
 
IMIAMoAgQiA0F/RgRAIAAgBDYCFAwJCyADIARGDQgMCQsgBCAFai8AACEEIAggA0EIaiICNgIMIAMoAgQiA0F/RgRAIAAgBDYCFAwICyADIARGDQcMCAsgACAEIAVqKAAANgIYDAYLIAAgBCAFaiIDKAAANgIYIAAgAy8ABDYCHAwFCyAAIAQgBWooAAA2AiAMBAsgACAEIAVqIgMoAAA2AiAgACADLQAENgIcDAMLIAAgBCAFaiIDKAAANgIgIAAgAy8ABDYCHAwCCyAAIAQgBWoiAygAADYCICAAIAMoAAQ2AhggACADLQAINgIcDAELCyAAIAk2AgwgACABNgIIQQEhDQsgCEEQaiQAIA0LCwAgACABQQAQoAQLvwEDAn8BfgF8QX8hAgJAAkACQAJAAkACQCABQiCIpyIDQQdqDg4CBAQEBAQDAAEBAQQEBQQLIAGnQQBHDwsgAacPCyABpykCBCEEIAAgARAKIARC/////weDQgBSDwsgAactAAUhAiAAIAEQCiACQX9zQYABcUEHdg8LIANBC2pBEk8EQCABEEkiBb1C////////////AINCgYCAgICAgPj/AFQgBUQAAAAAAAAAAGJxDwsgACABEApBASECCyACCxkAIAAoAhAgARDnASIBRQRAIAAQxgELIAELPwEBfyMAQRBrIgIkAAJ/IAEgACgCEEcEQCACIAE2AgAgAEH91gAgAhATQX8MAQsgABAPCyEAIAJBEGokACAACyEAIAAoAgRBf0wEQCAAIAFBAXRqLwEQDwsgACABai0AEAsoAQF/IwBBEGsiAiQAIAIgATsBDiAAIAJBDmpBAhCHARogAkEQaiQACwsAIAAgAUEBEOMFC5oLAgV/D34jAEHgAGsiBSQAIAJCIIYgAUIgiIQhDyAEQi+GIANCEYiEIQwgBEL///////8/gyINQg+GIANCMYiEIRAgAiAEhUKAgICAgICAgIB/gyEKIAJC///////
 
/P4MiC0IgiCERIA1CEYghEiAEQjCIp0H//wFxIQcCQAJ/IAJCMIinQf//AXEiCUEBa0H9/wFNBEBBACAHQQFrQf7/AUkNARoLIAFQIAJC////////////AIMiDkKAgICAgIDA//8AVCAOQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQoMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhCiADIQEMAgsgASAOQoCAgICAgMD//wCFhFAEQCACIAOEUARAQoCAgICAgOD//wAhCkIAIQEMAwsgCkKAgICAgIDA//8AhCEKQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAIAEgDoQhAkIAIQEgAlAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgDoRQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIA5C////////P1gEQCAFQdAAaiABIAsgASALIAtQIgYbeSAGQQZ0rXynIgZBD2sQciAFKQNYIgtCIIYgBSkDUCIBQiCIhCEPIAtCIIghEUEQIAZrIQYLIAYgAkL///////8/Vg0AGiAFQUBrIAMgDSADIA0gDVAiCBt5IAhBBnStfKciCEEPaxByIAUpA0giAkIPhiAFKQNAIgNCMYiEIRAgAkIvhiADQhGIhCEMIAJCEYghEiAGIAhrQRBqCyEGIAxC/////w+DIgIgAUL/////D4MiAX4iEyADQg+GQoCA/v8PgyIDIA9C/////w+DIg5+fCIEQiCGIg0gASADfnwiDCANVK0gAiAOfiIVIAMgC0L/////D4MiC358IhQgEEL/////D4MiDSABfnwiECAEIBNUrUIghiAEQiCIhHwiEyACIAt+IhYgAyARQoCABIQiD358IgMgDSAOfnwiESABIBJC/////weDQoCAgIAI
 
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
 
KAIMIQUgAUGAATYCCCABIAFBEGo2AgwgAUEQaiEGAn8DQCABKAIIQQZrIQgCQANAIAQgBmogAjoAACAEQQFqIQQgBSwAACICQQBIDQEgAkH/AXEiAkEDdkEccUHg3wFqKAIAIAJ2QQFxRQ0BIAVBAWohBSAEIAhJDQALQQAgACgCACABQQxqIAFBCGogAUEQahCOBQ0CGiABKAIMIQYMAQsLIAAoAgAgBiAEEKwDCyECIAEoAgwiBCABQRBqRwRAIAAoAgAgBBAYCyADIAU2AgwgAUGQAWokACACRQ0CIABBg382AhAgAEIANwIkIAAgAjYCIAsgACADKAIMNgI4QQAMAwsgAUECaiEBA0AgAyABNgIMA0ACQAJAIAEtAAAiAgRAIAJBCmsOBAYBAQYBCyABIAAoAjxPDQUMAQsgAkEYdEEYdUF/Sg0AIAFBBiADQQxqEF8iAkF+cUGowABGBEAgAygCDCEBDAULIAMoAgwhASACQX9HDQELCyABQQFqIQEMAAsACwsgB0GofzYCAEF/CyEAIANBEGokACAACxEAIAAgASABIAIgA0ECEIwEC6wBAgJ/An4CfyACRQRAQoCAgIAwIQZBAAwBCyAAKAIQIgMpA4ABIQYgA0KAgICAIDcDgAFBfwshA0F/IQQCQCAAIAFBBiABQQAQEiIFEAsNAAJAIAUQEA0AIAUQJg0AIAAgBSABQQBBABA1IQECfyADIAINABpBfyABEAsNABogAyABECANABogABAoQX8LIQQgACABEAoMAQsgAyEECyACBEAgACAGEJIBCyAECwwAIAAgASAAIAFIGwsdACAAQoCAgIBwWgR/IACnLQAFQQR2QQFxBUEACwuuAQEBfyMAQRBrIgMkAAJAAkAgAhBcBEAgASACEHk2AgBBASECDAELIAAoAhAiACgCLCACTQ0BAn8CQCAAKAI4IAJBAnRqKAIAIgApAgRCgICAgICAgIBAg0KAgICAgICAg
 
MAAUg0AIANBDGogABDoBUUNAEEBIAMoAgwiAEF/Rw0BGgtBACEAQQALIQIgASAANgIACyADQRBqJAAgAg8LQcovQaENQb8YQcI/EAAAC0UAIAAoAhAgASACEOYBIgEgAkVyRQRAIAAQxgEgAQ8LIAMEQCADQQAgACgCECABEKMEIgAgAmsiAiAAIAJJGzYCAAsgAQtpAQN+IAAgAkIgiCIDIAFCIIgiBH4gAkL/////D4MiAiABQv////8PgyIBfiIFQiCIIAIgBH58IgJCIIh8IAEgA34gAkL/////D4N8IgFCIIh8NwMIIAAgBUL/////D4MgAUIghoQ3AwAL+QECA34CfyMAQRBrIgUkAAJ+IAG9IgNC////////////AIMiAkKAgICAgICACH1C/////////+//AFgEQCACQjyGIQQgAkIEiEKAgICAgICAgDx8DAELIAJCgICAgICAgPj/AFoEQCADQjyGIQQgA0IEiEKAgICAgIDA//8AhAwBCyACUARAQgAMAQsgBSACQgAgA6dnQSBqIAJCIIinZyACQoCAgIAQVBsiBkExahByIAUpAwAhBCAFKQMIQoCAgICAgMAAhUGM+AAgBmutQjCGhAshAiAAIAQ3AwAgACACIANCgICAgICAgICAf4OENwMIIAVBEGokAAsqAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAkHuAkEAEK0EGiADQRBqJAALDQAgAEEAIAFBABChBAsbACAAIAFB/wFxEA4gACgCBCEBIAAgAhAcIAELlwwBB38jAEEgayICJAACQAJAAkACQAJAAn8gACgCECIDQYN/RwRAQQAgA0FXRw0BGiAAKAJAIgMtAGxBAXFFBEAgAEHjhgFBABATDAMLIAMoAmRFBEAgAEH+hgFBABATDAMLQX8hBSAAEA8NBQJ/AkACQAJAIAAoAhAiA0Epaw4EAgEBAgALIANB3QBGIANBOmtBAklyIANB/QBGcg
 
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
 
BqIAEQhgEFQcE8CzYCACAAQas8IAIQzwIgAkHQAGokAAvIogEDIH8FfgJ8IwBB4ABrIgchECAHJAAgACgCECEXQoCAgIDgACEoAkAgABB/DQACfwJ/AkACQAJAAkACQCABQv////9vWARAIAZBBHFFDQEgAaciCCIKKAI8IQcgCCgCGCIZKAIkIRMgGSgCICIRKAIwIQYgES8BKiEJIApBADYCPCAIIBcoAowBNgIQIAgoAiAhFSAIKAIwIQwgCCgCJCESIBcgCEEQaiIUNgKMASAVIRggDCEKIBIgCUEDdGoiGyAIKAIMRQ0GGgwECyABpyIZLwEGIghBDUYNAiAXKAJEIAhBGGxqKAIQIgcNAQsgAEGPxABBABAUDAYLIAAgASACIAQgBSAGIAcRFQAhKAwFCyAZKAIgIhEvAS4hDCARLwEqIRUgES8BKCEIIBAgES0AEDYCWCAQIAE3AzggECAENgJUIBBByABqEG4gGSgCJCETIAcgCEEAIAZBAXZBAXEgBCAISHIbIgYgDCAVampBA3RBD2pB8P//AXFrIhgkACAFIRUgBkUNASAEIBEvASgQsAEiB0EAIAdBAEobIQcDQCAHIBJGBEAgByARLwEoIgggByAISxshDANAIAcgDEcEQCAYIAdBA3RqQoCAgIAwNwMAIAdBAWohBwwBCwsgECAINgJUIBghFQwDBSAYIBJBA3QiCGogBSAIaikDABANNwMAIBJBAWohEgwBCwALAAtBAQwCCyAQIBU2AkAgECAYIAZBA3RqIhI2AkQgES8BKiEIQQAhBwNAIAcgCEcEQCASIAdBA3RqQoCAgIAwNwMAIAdBAWohBwwBCwsgESgCFCEMIBAgFygCjAE2AjAgFyAQQTBqNgKMASARKAIwIQYgEEEwaiEUIBIgCEEDdGoiBwshG0EACyEIA0ACQAJAAkACQCAIRQRAIBJBCGohHCASQRBqIR0gEkEYaiEeIBVBCGohHyAVQRB
 
qISAgFUEYaiEhIBtBGGohIyACQiCIpyIkQX5xISUgEEEwaiEmIBBBIGohIiAHIQgCQANAAkAgDEEBaiEKQgAhKEKAgICAMCEBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAwtAAAiDkEBaw7zAdQBACQIkQEJCgsMDQ4PEBESExQXFRYYGRobICEiIxwfHR4oJiYpKSor2AHjASwtLi/XATAxMjM0NTY3ODg5OTqeAaEBPDs9jgGPAZABkgGTAZQBnAGdAaABnwGiAZUBlgGXAZgBmQGjAaQBpQGaAZoBmwGbAT4/QEFCQ2tsbXFyc3Rub3B1fHt4f4ABgQHIAckBygHLAcsBywHLAcsBywF2dnZ3ggGEAYYBgwGFAYgBhwGJAYoBiwGMAdcB1QHWAdYB4gGuAa0BsAGvAbEBsQGzAbIBpwG0AY0B
 
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
 
CwsgACABKQPAASACECEgACABKQPIASACECEgACABKQOwASACECEgACABKQO4ASACECEgACABKQOoASACECFBACEDA0AgA0EIRgRAQQAhAwNAIAAoAkAgA0oEQCAAIAEoAiggA0EDdGopAwAgAhAhIANBAWohAwwBCwsgACABKQOYASACECEgACABKQOgASACECEgACABKQNQIAIQISAAIAEpA0AgAhAhIAAgASkDSCACECEgACABKQM4IAIQISAAIAEpAzAgAhAhIAEoAiQiAQRAIAAgASACEQMACwUgACABIANBA3RqKQNYIAIQISADQQFqIQMMAQsLCw8LQbM5QaENQY4sQcg5EAAAC4kCAgF+An8jAEEwayIEJABBoRkhBUKAgICA4AAhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABEFRBCGoOEAUGCQkJCQoEAAECAwkJCwgJCyAEIAE+AgAgBEEQakEgQZ4ZIAQQVRogBEEQaiEFDAkLIABBA0ECIAGnGxAxIQMMCQsgAEEBEDEhAwwICyAAQcUAEDEhAwwHCyAAIAFBABCbAyIBEAsEQCABIQMMBwsgACABIAIQoAQhAyAAIAEQCgwGCyACRQ0BCyABEA0hAwwECyAAQbUZQQAQFAwDCyAAIAEQSUEKQQBBABDJAiEDDAILQdUZIQULIAAgBRBxIQMLIARBMGokACADC6YEAQl/AkACQAJAIAJCgICAgHCDQoCAgICQf1IEQCAAIAIQKyICEAtFDQEMAgsgAhANIQILIAKnIgooAgQiBUH/////B3EhBgJAIAVBAE4EQCAKQRBqIQVBACEDA0AgBCAGRkUEQCADIAQgBWotAABBB3ZqIQMgBEEBaiEEDAELCyADRQRAIAFFDQQgASAGNgIAIAUPCyAAIAMgBmpBABD8ASIHRQ0CQQAhAyAHQRBqIgshBANAIAMgBkYNAgJ/IAMgBWosAAAiCEEATgRAIAQgCDoAA
 
CAEQQFqDAELIAQgCEE/cUGAAXI6AAEgBCAIQcABcUEGdkHAAXI6AAAgBEECagshBCADQQFqIQMMAAsACyAAIAZBA2xBABD8ASIHRQ0BQQAhBSAHQRBqIgshBANAIAUiCCAGTg0BIAhBAWohBSAKIAhBAXRqLwEQIglB/wBNBEAgBCAJOgAAIARBAWohBAUCQCADIAUgBk5yIAlBgPgDcUGAsANHcg0AIAogBUEBdGovARAiDEGA+ANxQYC4A0cNACAJQQp0QYD4P3EgDEH/B3FyQYCABGohCSAIQQJqIQULIAQgCRDjAiAEaiEECwwACwALIARBADoAACAHIAQgB2tBEGtB/////wdxrSAHKQIEQoCAgIB4g4Q3AgQgACACEAogAQRAIAEgBygCBEH/////B3E2AgALIAsPCyABRQRAQQAPC0EAIQUgAUEANgIACyAFCyUCAX8BfiAAIAEQMSIDEAtFBEAgACADELcBIQIgACADEAoLIAILDAAgASAAKAIMEQQACz0BAX8gASABKAIAIgJBAWs2AgAgAkEBTARAIAEpAgRCgICAgICAgIDAAFoEQCAAIAEQqwMPCyAAIAEQHwsLVQECfyMAQRBrIgIkACAAKAIQIQACfwJAIAJBDGogARDoBUUNACACKAIMIgNBAEgNACAAIAEQpAQgAxCTAQwBCyAAIAFBARDUAgshASACQRBqJAAgAQtcAQN/IABB4AFqIQQgACgC5AEhAwNAIAQgAyICRwRAIAIoAgQhAwJAAkACQCABDgMCAAEECyACLABMDQMMAQsgAikCTEIghkI4h6cNAgsgACACQQhrEOoFDAELCwu8AQEDfwJAIAEgAigCECIDBH8gAwVBACEDIAIQ8AUNASACKAIQCyACKAIUIgVrSwRAIAIgACABIAIoAiQRAQAPCwJ/IAIsAEtBf0oEQCABIQMDQCABIAMiBEUNAhogACAEQQFrIgNqLQAAQQpHDQALIAIgAC
 
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
 
+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
 
CIp0H//wFxIgetQjCGhCIJEIACQQBMBEAgASAKIAMgCRCAAgRAIAEhBAwCCyAFQfAAaiABIAJCAEIAEDIgBSkDeCECIAUpA3AhBAwBCyAGBH4gAQUgBUHgAGogASAKQgBCgICAgICAwLvAABAyIAUpA2giCkIwiKdB+ABrIQYgBSkDYAshBCAHRQRAIAVB0ABqIAMgCUIAQoCAgICAgMC7wAAQMiAFKQNYIglCMIinQfgAayEHIAUpA1AhAwsgCUL///////8/g0KAgICAgIDAAIQhCSAKQv///////z+DQoCAgICAgMAAhCEKIAYgB0oEQANAAn4gCiAJfSADIARWrX0iC0IAWQRAIAsgBCADfSIEhFAEQCAFQSBqIAEgAkIAQgAQMiAFKQMoIQIgBSkDICEEDAULIAtCAYYgBEI/iIQMAQsgCkIBhiAEQj+IhAshCiAEQgGGIQQgBkEBayIGIAdKDQALIAchBgsCQCAKIAl9IAMgBFatfSIJQgBTBEAgCiEJDAELIAkgBCADfSIEhEIAUg0AIAVBMGogASACQgBCABAyIAUpAzghAiAFKQMwIQQMAQsgCUL///////8/WARAA0AgBEI/iCEBIAZBAWshBiAEQgGGIQQgASAJQgGGhCIJQoCAgICAgMAAVA0ACwsgCEGAgAJxIQcgBkEATARAIAVBQGsgBCAJQv///////z+DIAZB+ABqIAdyrUIwhoRCAEKAgICAgIDAwz8QMiAFKQNIIQIgBSkDQCEEDAELIAlC////////P4MgBiAHcq1CMIaEIQILIAAgBDcDACAAIAI3AwggBUGAAWokAAuhBAIEfgJ/AkAgAb0iBEIBhiIDUCAEQv///////////wCDQoCAgICAgID4/wBWckUEQCAAvSIFQjSIp0H/D3EiBkH/D0cNAQsgACABoiIAIACjDwsCfgJAIAMgBUIBhiICVARAIARCNIinQf8PcSEHIAZFBEAgBUIMhiI
 
CQgBTBEBBACEGDAMLQX8hBgNAIAJCAYYiAkIAUw0DIAZBAWshBgwACwALIAVC/////////weDQoCAgICAgIAIhAwCCyAARAAAAAAAAAAAoiAAIAIgA1EbDwsgBUEBIAZrrYYLIQICfgJAIAdFBEAgBEIMhiIDQgBTBEBBACEHDAILQX8hBwNAIANCAYYiA0IAUw0CIAdBAWshBwwACwALIARC/////////weDQoCAgICAgIAIhAwBCyAEQQEgB2uthgshBCAGIAdKBEADQAJAIAIgBH0iA0IAUw0AIAMiAkIAUg0AIABEAAAAAAAAAACiDwsgAkIBhiECIAZBAWsiBiAHSg0ACyAHIQYLAkAgAiAEfSIDQgBTDQAgAyICQgBSDQAgAEQAAAAAAAAAAKIPCwJAIAJC/////////wdWBEAgAiEDDAELA0AgBkEBayEGIAJCgICAgICAgARUIQcgAkIBhiIDIQIgBw0ACwsgBUKAgICAgICAgIB/gyECIAZBAU4EfiADQoCAgICAgIAIfSAGrUI0hoQFIANBASAGa62ICyAChL8LiwwBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQNxRQ0BIAAoAgAiAiABaiEBAkAgACACayIAQfinBCgCAEcEQCACQf8BTQRAIAAoAggiBCACQQN2IgJBA3RBjKgEakYaIAAoAgwiAyAERw0CQeSnBEHkpwQoAgBBfiACd3E2AgAMAwsgACgCGCEGAkAgACAAKAIMIgNHBEAgACgCCCICQfSnBCgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAAQRRqIgIoAgAiBA0AIABBEGoiAigCACIEDQBBACEDDAELA0AgAiEHIAQiA0EUaiICKAIAIgQNACADQRBqIQIgAygCECIEDQALIAdBADYCAAsgBkUNAgJAIAAgACgCHCIEQQJ0QZSqBGoiAigCAEYEQCACIAM2AgAgAw0BQeinBEHopwQo
 
AgBBfiAEd3E2AgAMBAsgBkEQQRQgBigCECAARhtqIAM2AgAgA0UNAwsgAyAGNgIYIAAoAhAiAgRAIAMgAjYCECACIAM2AhgLIAAoAhQiAkUNAiADIAI2AhQgAiADNgIYDAILIAUoAgQiAkEDcUEDRw0BQeynBCABNgIAIAUgAkF+cTYCBCAAIAFBAXI2AgQgBSABNgIADwsgBCADNgIMIAMgBDYCCAsCQCAFKAIEIgJBAnFFBEAgBUH8pwQoAgBGBEBB/KcEIAA2AgBB8KcEQfCnBCgCACABaiIBNgIAIAAgAUEBcjYCBCAAQfinBCgCAEcNA0HspwRBADYCAEH4pwRBADYCAA8LIAVB+KcEKAIARgRAQfinBCAANgIAQeynBEHspwQoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwsgAkF4cSABaiEBAkAgAkH/AU0EQCAFKAIIIgQgAkEDdiICQQN0QYyoBGpGGiAEIAUoAgwiA0YEQEHkpwRB5KcEKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgNHBEAgBSgCCCICQfSnBCgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAFQRRqIgQoAgAiAg0AIAVBEGoiBCgCACICDQBBACEDDAELA0AgBCEHIAIiA0EUaiIEKAIAIgINACADQRBqIQQgAygCECICDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCIEQQJ0QZSqBGoiAigCAEYEQCACIAM2AgAgAw0BQeinBEHopwQoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAM2AgAgA0UNAQsgAyAGNgIYIAUoAhAiAgRAIAMgAjYCECACIAM2AhgLIAUoAhQiAkUNACADIAI2AhQgAiADNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABB+KcEKAIARw0BQeynBCABN
 
gIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUEDdiICQQN0QYyoBGohAQJ/QeSnBCgCACIDQQEgAnQiAnFFBEBB5KcEIAIgA3I2AgAgAQwBCyABKAIICyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCA8LQR8hAiAAQgA3AhAgAUH///8HTQRAIAFBCHYiAiACQYD+P2pBEHZBCHEiBHQiAiACQYDgH2pBEHZBBHEiA3QiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAEciACcmsiAkEBdCABIAJBFWp2QQFxckEcaiECCyAAIAI2AhwgAkECdEGUqgRqIQcCQAJAQeinBCgCACIEQQEgAnQiA3FFBEBB6KcEIAMgBHI2AgAgByAANgIAIAAgBzYCGAwBCyABQQBBGSACQQF2ayACQR9GG3QhAiAHKAIAIQMDQCADIgQoAgRBeHEgAUYNAiACQR12IQMgAkEBdCECIAQgA0EEcWoiB0EQaigCACIDDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC58IAQt/IABFBEAgARChAg8LIAFBQE8EQEGEpwRBMDYCAEEADwsCf0EQIAFBC2pBeHEgAUELSRshBiAAQQhrIgUoAgQiCUF4cSEEAkAgCUEDcUUEQEEAIAZBgAJJDQIaIAZBBGogBE0EQCAFIQIgBCAGa0HEqwQoAgBBAXRNDQILQQAMAgsgBCAFaiEHAkAgBCAGTwRAIAQgBmsiA0EQSQ0BIAUgCUEBcSAGckECcjYCBCAFIAZqIgIgA0EDcjYCBCAHIAcoAgRBAXI2AgQgAiADEPQFDAELIAdB/KcEKAIARgRAQfCnBCgCACAEaiIEIAZNDQIgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAyAEIA
 
ZrIgJBAXI2AgRB8KcEIAI2AgBB/KcEIAM2AgAMAQsgB0H4pwQoAgBGBEBB7KcEKAIAIARqIgMgBkkNAgJAIAMgBmsiAkEQTwRAIAUgCUEBcSAGckECcjYCBCAFIAZqIgQgAkEBcjYCBCADIAVqIgMgAjYCACADIAMoAgRBfnE2AgQMAQsgBSAJQQFxIANyQQJyNgIEIAMgBWoiAiACKAIEQQFyNgIEQQAhAkEAIQQLQfinBCAENgIAQeynBCACNgIADAELIAcoAgQiA0ECcQ0BIANBeHEgBGoiCiAGSQ0BIAogBmshDAJAIANB/wFNBEAgBygCCCIEIANBA3YiAkEDdEGMqARqRhogBCAHKAIMIgNGBEBB5KcEQeSnBCgCAEF+IAJ3cTYCAAwCCyAEIAM2AgwgAyAENgIIDAELIAcoAhghCwJAIAcgBygCDCIIRwRAIAcoAggiAkH0pwQoAgBJGiACIAg2AgwgCCACNgIIDAELAkAgB0EUaiIEKAIAIgINACAHQRBqIgQoAgAiAg0AQQAhCAwBCwNAIAQhAyACIghBFGoiBCgCACICDQAgCEEQaiEEIAgoAhAiAg0ACyADQQA2AgALIAtFDQACQCAHIAcoAhwiA0ECdEGUqgRqIgIoAgBGBEAgAiAINgIAIAgNAUHopwRB6KcEKAIAQX4gA3dxNgIADAILIAtBEEEUIAsoAhAgB0YbaiAINgIAIAhFDQELIAggCzYCGCAHKAIQIgIEQCAIIAI2AhAgAiAINgIYCyAHKAIUIgJFDQAgCCACNgIUIAIgCDYCGAsgDEEPTQRAIAUgCUEBcSAKckECcjYCBCAFIApqIgIgAigCBEEBcjYCBAwBCyAFIAlBAXEgBnJBAnI2AgQgBSAGaiIDIAxBA3I2AgQgBSAKaiICIAIoAgRBAXI2AgQgAyAMEPQFCyAFIQILIAILIgIEQCACQQhqDwsgARChAiIFRQRAQQAPCyAFIABBfEF4IAB
 
BBGsoAgAiAkEDcRsgAkF4cWoiAiABIAEgAksbECMaIAAQ6QEgBQvYAwICfgJ/IwBBIGsiBCQAAkAgAUL///////////8AgyIDQoCAgICAgMCAPH0gA0KAgICAgIDA/8MAfVQEQCABQgSGIABCPIiEIQMgAEL//////////w+DIgBCgYCAgICAgIAIWgRAIANCgYCAgICAgIDAAHwhAgwCCyADQoCAgICAgICAQH0hAiAAQoCAgICAgICACIVCAFINASACIANCAYN8IQIMAQsgAFAgA0KAgICAgIDA//8AVCADQoCAgICAgMD//wBRG0UEQCABQgSGIABCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiADQv///////7//wwBWDQBCACECIANCMIinIgVBkfcASQ0AIARBEGogACABQv///////z+DQoCAgICAgMAAhCICIAVBgfcAaxByIAQgACACQYH4ACAFaxDWAiAEKQMIQgSGIAQpAwAiAEI8iIQhAiAEKQMQIAQpAxiEQgBSrSAAQv//////////D4OEIgBCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyAAQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIARBIGokACACIAFCgICAgICAgICAf4OEvwuCEQIFfwt+IwBBwAFrIgUkACAEQv///////z+DIRIgAkL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhESAEQjCIp0H//wFxIQcCQAJAAkAgAkIwiKdB//8BcSIJQQFrQf3/AU0EQCAHQQFrQf7/AUkNAQsgAVAgAkL///////////8AgyIKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhEQwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKA
 
gICAgIAghCERIAMhAQwCCyABIApCgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhEQwDCyARQoCAgICAgMD//wCEIRFCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgCoRQDQIgAiADhFAEQCARQoCAgICAgMD//wCEIRFCACEBDAILIApC////////P1gEQCAFQbABaiABIAwgASAMIAxQIgYbeSAGQQZ0rXynIgZBD2sQckEQIAZrIQYgBSkDuAEhDCAFKQOwASEBCyACQv///////z9WDQAgBUGgAWogAyASIAMgEiASUCIIG3kgCEEGdK18pyIIQQ9rEHIgBiAIakEQayEGIAUpA6gBIRIgBSkDoAEhAwsgBUGQAWogEkKAgICAgIDAAIQiFEIPhiADQjGIhCICQoTJ+c6/5ryC9QAgAn0iBBC0ASAFQYABakIAIAUpA5gBfSAEELQBIAVB8ABqIAUpA4gBQgGGIAUpA4ABQj+IhCIEIAIQtAEgBUHgAGogBEIAIAUpA3h9ELQBIAVB0ABqIAUpA2hCAYYgBSkDYEI/iIQiBCACELQBIAVBQGsgBEIAIAUpA1h9ELQBIAVBMGogBSkDSEIBhiAFKQNAQj+IhCIEIAIQtAEgBUEgaiAEQgAgBSkDOH0QtAEgBUEQaiAFKQMoQgGGIAUpAyBCP4iEIgQgAhC0ASAFIARCACAFKQMYfRC0ASAGIAkgB2tqIQYCfkIAIAUpAwhCAYYgBSkDAEI/iIRCAX0iCkL/////D4MiBCACQiCIIgt+Ig4gCkIgiCIKIAJC/////w+DIg9+fCICQiCIIAIgDlStQiCGhCAKIAt+fCACQiCGIgsgBCAPfnwiAiALVK0gAiACIAQgA0IRiEL/////D4MiDn4iDyAKIANCD4ZCgID+/w+DIg1+fCILQiCGIhAgBCANfnwgEFStI
 
AogDn4gCyAPVK1CIIYgC0IgiIR8fHwiAlatfHwgAkIAUq18fSILQv////8PgyIOIAR+Ig8gCiAOfiINIAQgC0IgiCIQfnwiC0IghnwiDiAPVK0gCiAQfiALIA1UrUIghiALQiCIhHx8IA5CACACfSICQiCIIgsgBH4iDyACQv////8PgyINIAp+fCICQiCGIhAgBCANfnwgEFStIAogC34gAiAPVK1CIIYgAkIgiIR8fHwiAiAOVK18IAJCAn0iDyACVK18QgF9IgtC/////w+DIgIgDEIChiABQj6IhEL/////D4MiBH4iDiABQh6IQv////8PgyIKIAtCIIgiC358Ig0gDlStIA0gDSAPQiCIIg4gDEIeiEL//+//D4NCgIAQhCIMfnwiDVatfCALIAx+fCACIAx+IhMgBCALfnwiECATVK1CIIYgEEIgiIR8IA0gDSAQQiCGfCINVq18IA0gDSAKIA5+IhMgD0L/////D4MiDyAEfnwiECATVK0gECAQIAIgAUIChkL8////D4MiE358IhBWrXx8Ig1WrXwgDSALIBN+IgsgDCAPfnwiDCAEIA5+fCIEIAIgCn58IgJCIIggAiAEVK0gCyAMVq0gBCAMVK18fEIghoR8IgQgDVStfCAEIAQgECAOIBN+IgwgCiAPfnwiCkIgiCAKIAxUrUIghoR8IgogEFStIAogAkIghnwgClStfHwiBFatfCICQv////////8AWARAIAFCMYYgBEIgiCIBIANC/////w+DIgp+Ig0gBEL/////D4MiDCADQiCIIgt+fCIOQiCGIhAgCiAMfnwiDyAQVK19IA9CAFKtfSACQv////8PgyAKfiAMIBJC/////w+DfnwgASALfnwgDSAOVq1CIIYgDkIgiIR8IAQgFEIgiH4gAyACQiCIfnwgAiALfnwgASASfnxCIIZ8fSESIAZBAWshBkIAIA99DAELIARCIYghDCABQjCGIAJCP4YgBE
 
IBiIQiBEL/////D4MiASADQiCIIgp+Ig8gDCACQh+GhCINQv////8PgyIQIANC/////w+DIgx+fCILQiCGIhMgASAMfnwiDiATVK19IA5CAFKtfSAEIBRCIIh+IAMgAkIhiH58IAJCAYgiAiAKfnwgDSASfnxCIIYgCiAQfiACQv////8PgyAMfnwgASASQv////8Pg358IAsgD1StQiCGIAtCIIiEfHx9IRJCACAOfQshASAGQYCAAU4EQCARQoCAgICAgMD//wCEIRFCACEBDAELIAZB//8AaiEHIAZBgYB/TARAAkAgBw0AIAQgAUIBhiADViASQgGGIAFCP4iEIgEgFFYgASAUURutfCIBIARUrSACQv///////z+DfCICQoCAgICAgMAAg1ANACACIBGEIREMAgtCACEBDAELIAQgAUIBhiADWiASQgGGIAFCP4iEIgEgFFogASAUURutfCIBIARUrSACQv///////z+DfCAHrUIwhnwgEYQhEQsgACABNwMAIAAgETcDCCAFQcABaiQADwsgAEIANwMAIABCgICAgICA4P//ACARIAIgA4RQGzcDCCAFQcABaiQAC8QBAgF/An5BfyEDAkAgAEIAUiABQv///////////wCDIgRCgICAgICAwP//AFYgBEKAgICAgIDA//8AURsNAEEAIAJC////////////AIMiBUKAgICAgIDA//8AViAFQoCAgICAgMD//wBRGw0AIAAgBCAFhIRQBEBBAA8LIAEgAoNCAFkEQEEAIAEgAlMgASACURsNASAAIAEgAoWEQgBSDwsgAEIAUiABIAJVIAEgAlEbDQAgACABIAKFhEIAUiEDCyADC9wyAxV/B34BfCMAQRBrIhEkACMAQaABayIOJAAgDkEQakEAQZABEEsaIA5BfzYCXCAOIAA2AjwgDkF/NgIYIA4gADYCFCAOQRBqEKoEIA5BEGohAiMAQTBrIg0kAEHgowQoAgA
 
hEEHUowQoAgAhDwNAAn8gAigCBCIAIAIoAmhJBEAgAiAAQQFqNgIEIAAtAAAMAQsgAhBaCyIFEP0FDQALQQEhAAJAAkAgBUEraw4DAAEAAQtBf0EBIAVBLUYbIQAgAigCBCIEIAIoAmhJBEAgAiAEQQFqNgIEIAQtAAAhBQwBCyACEFohBQsCQAJAAkADQCAGQYmjBGosAAAgBUEgckYEQAJAIAZBBksNACACKAIEIgQgAigCaEkEQCACIARBAWo2AgQgBC0AACEFDAELIAIQWiEFCyAGQQFqIgZBCEcNAQwCCwsgBkEDRwRAIAZBCEYNASAGQQRJDQIgBkEIRg0BCyACKAJoIgQEQCACIAIoAgRBAWs2AgQLIAZBBEkNAANAIAQEQCACIAIoAgRBAWs2AgQLIAZBAWsiBkEDSw0ACwsjAEEQayICJAACfiAAskMAAIB/lLwiBEH/////B3EiAEGAgIAEa0H////3B00EQCAArUIZhkKAgICAgICAwD98DAELIAStQhmGQoCAgICAgMD//wCEIABBgICA/AdPDQAaQgAgAEUNABogAiAArUIAIABnIgBB0QBqEHIgAikDACEWIAIpAwhCgICAgICAwACFQYn/ACAAa61CMIaECyEXIA0gFjcDACANIBcgBEGAgICAeHGtQiCGhDcDCCACQRBqJAAgDSkDCCEWIA0pAwAhFwwBCwJAAkACQCAGDQBBACEGA0AgBkGSowRqLAAAIAVBIHJHDQECQCAGQQFLDQAgAigCBCIEIAIoAmhJBEAgAiAEQQFqNgIEIAQtAAAhBQwBCyACEFohBQsgBkEBaiIGQQNHDQALDAELAkACQCAGDgQAAQECAQsCQCAFQTBHDQACfyACKAIEIgQgAigCaEkEQCACIARBAWo2AgQgBC0AAAwBCyACEFoLQV9xQdgARgRAIwBBsANrIgMkAAJ/IAIoAgQiBCACKAJoSQRAIAIgBEEBajYCBCAELQAA
 
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
 
DQEgBUKuj4XXx8LrowFTDQALCyACQQpJBEADQAJ/IAAoAgQiASAAKAJoSQRAIAAgAUEBajYCBCABLQAADAELIAAQWgtBMGtBCkkNAAsLIAAoAmgEQCAAIAAoAgRBAWs2AgQLQgAgBX0gBSAEGyEFDAELQoCAgICAgICAgH8hBSAAKAJoRQ0AIAAgACgCBEEBazYCBEKAgICAgICAgIB/DwsgBQu/AgEBfyMAQdAAayIEJAACQCADQYCAAU4EQCAEQSBqIAEgAkIAQoCAgICAgID//wAQMiAEKQMoIQIgBCkDICEBIANB//8BSARAIANB//8AayEDDAILIARBEGogASACQgBCgICAgICAgP//ABAyIANB/f8CIANB/f8CSBtB/v8BayEDIAQpAxghAiAEKQMQIQEMAQsgA0GBgH9KDQAgBEFAayABIAJCAEKAgICAgIDAABAyIAQpA0ghAiAEKQNAIQEgA0GDgH5KBEAgA0H+/wBqIQMMAQsgBEEwaiABIAJCAEKAgICAgIDAABAyIANBhoB9IANBhoB9ShtB/P8BaiEDIAQpAzghAiAEKQMwIQELIAQgASACQgAgA0H//wBqrUIwhhAyIAAgBCkDCDcDCCAAIAQpAwA3AwAgBEHQAGokAAs1ACAAIAE3AwAgACACQv///////z+DIARCMIinQYCAAnEgAkIwiKdB//8BcXKtQjCGhDcDCAsQACAAQSBGIABBCWtBBUlyC9gBAQR/IAAoAlQhAwJAIAAoAhQgACgCHCIFayIGBEAgACAFNgIUIAAgBSAGEP4FIAZJDQELAkAgAygCEEHhAEcEQCADKAIAIQQMAQsgAyADKAIEIgQ2AgALIAMoAgwgBGogASADKAIIIARrIgEgAiABIAJJGyIEECMaIAMgAygCACAEaiIBNgIAIAEgAygCBE0NACADIAE2AgQgAygCCCICIAFLBEAgAygCDCABakEAOgAAIAQPCyAALQAAQQRxR
 
SACRXINACACIAMoAgxqQQFrQQA6AAALIAQLuwIAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4KAAECAwQFBgcICQoLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAiADEQMACwtQAQN/AkAgACgCACwAABBFRQRADAELA0AgACgCACICLAAAIQMgACACQQFqNgIAIAEgA2pBMGshASACLAABEEVFDQEgAUEKbCEBDAALAAsgAQt/AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARCBBiEAIAEoAgBBQGoLNgIAIAAPCyABIAJB/gdrNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALC5sCACAARQRAQQAPCwJ/AkAgAAR/IAFB/wBNDQECQEGcpQQoAgAoAgBFBEAgAUGAf3FBgL8DRg0DDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMBAsgAUGAsANPQQAgAUGAQHFBgMADRxtFBEAgACABQT9xQYABcjoAAiAAIAFBDHZB4AFyOgAAIAAgAUEGdkE/cUGAAXI6AAFBAwwECyABQYCABGtB//8/TQRAIAAgAUE/cU
 
GAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBAwECwtBhKcEQRk2AgBBfwVBAQsMAQsgACABOgAAQQELC24BAX8gAARAIAAoAkxBf0wEQCAAEK4EDwsgABCuBA8LQeimBCgCAARAQeimBCgCABCDBiEBC0HQpwQoAgAiAARAA0AgACgCTBogACgCFCAAKAIcSwRAIAAQrgQgAXIhAQsgACgCOCIADQALCyABC6wDAwN8An8BfiAAvSIIQoCAgICA/////wCDQoGAgIDwhOXyP1QiB0UEQEQYLURU+yHpPyAAIACaIAhCf1UiBhuhRAdcFDMmpoE8IAEgAZogBhuhoCEAIAhCP4inIQZEAAAAAAAAAAAhAQsgACAAIAAgAKIiA6IiBERjVVVVVVXVP6IgASADIAEgBCADIAOiIgEgASABIAEgAURzU2Dby3XzvqJEppI3oIh+FD+gokQBZfLy2ERDP6CiRCgDVskibW0/oKJEN9YGhPRklj+gokR6/hARERHBP6AgAyABIAEgASABIAFE1Hq/dHAq+z6iROmn8DIPuBI/oKJEaBCNGvcmMD+gokQVg+D+yNtXP6CiRJOEbunjJoI/oKJE/kGzG7qhqz+goqCioKKgoCIDoCEBIAdFBEBBASACQQF0a7ciBCAAIAMgASABoiABIASgo6GgIgAgAKChIgCaIAAgBhsPCyACBHxEAAAAAAAA8L8gAaMiBCABvUKAgICAcIO/IgUgBL1CgICAgHCDvyIBokQAAAAAAADwP6AgAyAFIAChoSABoqCiIAGgBSABCwvLDwMIfAh/An5EAAAAAAAA8D8hAgJAAkACQCABvSISQiCIpyILQf////8HcSIKIBKnIg5yRQ0AIAC9IhNCIIinIQ0gE6ciEUVBACANQYCAwP8DRhsNACANQf////8HcSIMQYCAwP8HSyAMQYCAwP8HRiARQQB
 
HcXIgCkGAgMD/B0tyRUEAIA5FIApBgIDA/wdHchtFBEAgACABoA8LAkACQAJ/AkAgDUF/Sg0AQQIgCkH///+ZBEsNARogCkGAgMD/A0kNACAKQRR2IQ8gCkGAgICKBE8EQEEAIA5BswggD2siEHYiDyAQdCAORw0CGkECIA9BAXFrDAILIA4NAyAKQZMIIA9rIg52Ig8gDnQgCkcNAkECIA9BAXFrIRAMAgtBAAshECAODQELIApBgIDA/wdGBEAgDEGAgMD/A2sgEXJFDQIgDEGAgMD/A08EQCABRAAAAAAAAAAAIAtBf0obDwtEAAAAAAAAAAAgAZogC0F/ShsPCyAKQYCAwP8DRgRAIAtBf0oEQCAADwtEAAAAAAAA8D8gAKMPCyALQYCAgIAERgRAIAAgAKIPCyALQYCAgP8DRyANQQBIcg0AIACfDwsgAJkhAiANQf////8DcUGAgMD/A0dBACAMGyARckUEQEQAAAAAAADwPyACoyACIAtBAEgbIQIgDUF/Sg0BIBAgDEGAgMD/A2tyRQRAIAIgAqEiACAAow8LIAKaIAIgEEEBRhsPC0QAAAAAAADwPyEDAkAgDUF/Sg0AAkACQCAQDgIAAQILIAAgAKEiACAAow8LRAAAAAAAAPC/IQMLAnwgCkGBgICPBE8EQCAKQYGAwJ8ETwRAIAxB//+//wNNBEBEAAAAAAAA8H9EAAAAAAAAAAAgC0EASBsPC0QAAAAAAADwf0QAAAAAAAAAACALQQBKGw8LIAxB/v+//wNNBEAgA0ScdQCIPOQ3fqJEnHUAiDzkN36iIANEWfP4wh9upQGiRFnz+MIfbqUBoiALQQBIGw8LIAxBgYDA/wNPBEAgA0ScdQCIPOQ3fqJEnHUAiDzkN36iIANEWfP4wh9upQGiRFnz+MIfbqUBoiALQQBKGw8LIAJEAAAAAAAA8L+gIgBEAAAAYEcV9z+iIgIgAERE3134C65UPqIgACAAokQA
 
AAAAAADgPyAAIABEAAAAAAAA0L+iRFVVVVVVVdU/oKKhokT+gitlRxX3v6KgIgWgvUKAgICAcIO/IgAgAqEMAQsgAkQAAAAAAABAQ6IiACACIAxBgIDAAEkiChshAiAAvUIgiKcgDCAKGyIMQf//P3EiDUGAgMD/A3IhCyAMQRR1Qcx3QYF4IAobaiEMQQAhCgJAIA1Bj7EOSQ0AIA1B+uwuSQRAQQEhCgwBCyALQYCAQGohCyAMQQFqIQwLIApBA3QiDUHAnQRqKwMAIgcgAr1C/////w+DIAutQiCGhL8iBSANQaCdBGorAwAiBKEiBkQAAAAAAADwPyAEIAWgoyIIoiICvUKAgICAcIO/IgAgACAAoiIJRAAAAAAAAAhAoCACIACgIAggBiAAIAtBAXVBgICAgAJyIApBEnRqQYCAIGqtQiCGvyIGoqEgACAFIAYgBKGhoqGiIgWiIAIgAqIiACAAoiAAIAAgACAAIABE705FSih+yj+iRGXbyZNKhs0/oKJEAUEdqWB00T+gokRNJo9RVVXVP6CiRP+rb9u2bds/oKJEAzMzMzMz4z+goqAiBKC9QoCAgIBwg78iAKIiBiAFIACiIAIgBCAARAAAAAAAAAjAoCAJoaGioCICoL1CgICAgHCDvyIARAAAAOAJx+4/oiIEIA1BsJ0EaisDACACIAAgBqGhRP0DOtwJx+4/oiAARPUBWxTgLz6+oqCgIgWgoCAMtyICoL1CgICAgHCDvyIAIAKhIAehIAShCyEEIAAgEkKAgICAcIO/IgeiIgIgBSAEoSABoiABIAehIACioCIAoCIBvSISpyEKAkAgEkIgiKciC0GAgMCEBE4EQCALQYCAwIQEayAKcg0DIABE/oIrZUcVlzygIAEgAqFkRQ0BDAMLIAtBgPj//wdxQYCYw4QESQ0AIAtBgOi8+wNqIApyDQMgACABIAKhZUUNAAwDC0EAIQogAwJ8IAtB/////wdxIgxBg
 
YCA/wNPBH5BAEGAgMAAIAxBFHZB/gdrdiALaiIMQf//P3FBgIDAAHJBkwggDEEUdkH/D3EiDWt2IgprIAogC0EASBshCiAAIAJBgIBAIA1B/wdrdSAMca1CIIa/oSICoL0FIBILQoCAgIBwg78iAUQAAAAAQy7mP6IiAyAAIAEgAqGhRO85+v5CLuY/oiABRDlsqAxhXCC+oqAiAqAiACAAIAAgACAAoiIBIAEgASABIAFE0KS+cmk3Zj6iRPFr0sVBvbu+oKJELN4lr2pWET+gokSTvb4WbMFmv6CiRD5VVVVVVcU/oKKhIgGiIAFEAAAAAAAAAMCgoyACIAAgA6GhIgEgACABoqChoUQAAAAAAADwP6AiAL0iEkIgiKcgCkEUdGoiC0H//z9MBEAgACAKEMgBDAELIBJC/////w+DIAutQiCGhL8LoiECCyACDwsgA0ScdQCIPOQ3fqJEnHUAiDzkN36iDwsgA0RZ8/jCH26lAaJEWfP4wh9upQGiC0UBAnwgACACIAKiIgQ5AwAgASACIAJEAAAAAgAAoEGiIgMgAiADoaAiAqEiAyADoiACIAKiIAShIAIgAqAgA6KgoDkDAAslACAARIvdGhVmIJbAoBCxBEQAAAAAAADAf6JEAAAAAAAAwH+iC58BAQJ+AkAgAykDACIEQoCAgIBwWgRAIAMpAwgiBUL/////b1YNAQsgABAoQoCAgIDgAA8LIABCgICAgCBBKRBQIgEQC0UEQCAAQRgQLSICRQRAIAAgARAKQoCAgIDgAA8LIAIgBBANIgQ3AwAgAiAFEA03AwggACAEEDohACACQQA6ABEgAiAAOgAQIAEgAhCKASABIAQQsQEQrgMLIAELyAEBAX8CQAJAIAAgAXNBA3ENACABQQNxBEADQCAAIAEtAAAiAjoAACACRQ0DIABBAWohACABQQFqIgFBA3ENAAsLIAEoAgAiAkF/cyACQYGChAhrcUGAgYKEeHENAA
 
NAIAAgAjYCACABKAIEIQIgAEEEaiEAIAFBBGohASACQYGChAhrIAJBf3NxQYCBgoR4cUUNAAsLIAAgAS0AACICOgAAIAJFDQADQCAAIAEtAAEiAjoAASAAQQFqIQAgAUEBaiEBIAINAAsLCzEBAn8CfyAAEENBAWohAQNAQQAgAUUNARogACABQQFrIgFqIgItAABBL0cNAAsgAgsLyAYBBX9BASEHIAJBAXRBkN0Cai8BACECIAVFBEAgACACNgIAQQEPCyACQYDoAmohBkESIQkCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFQQFrDiIAAAAAAAAAAQECAgICAgQDAwMDAwMFBQUFBQUFBQYHCAkJCwtBACECIAVBACAFQQBKGyEEIAYgASADayAFbEEBdGohAQNAIAIgBEYEQCAFDwsgACACQQJ0aiABIAJBAXRqLwAAIgM2AgAgAkEBaiECIAMNAAsMCwtBACECIAVBB2siCEEAIAhBAEobIQUgCCABIANrbCEHIAQgCGxBAXQhAQNAIAIgBUYNCiAGIAdBAnYgAWpqLQAAIAdBAXQiA0EGcXZBEHRBgIAMcSADIAZqLwAAciIDRQ0LIAAgAkECdGogAzYCACACQQFqIQIgB0EBaiEHDAALAAtBACECIAVBCWsiCEEAIAhBAEobIQQgBiAIIAEgA2tsaiEBA0AgAiAERg0JIAAgAkECdGogASACai0AABCyAyIDNgIAIAJBAWohAiADDQALDAkLIAVBAXEgBUEQa0EBdiICQQBHaiEKIAJBAmohBwsgASADayEBQQAhAgNAIAIgB0YEQCAHDwUgACACQQJ0aiAGIAJBAXRqLwAAIAFBACACIApGG2o2AgAgAkEBaiECDAELAAsACyAFQRVrIQkLQQAhAiAJQQAgCUEAShshBCAJIAEgA2tsIAZqQQJqIQEgBi8AACEDA0AgAiAERgRAIAkPBSAAIAJBAnRqQSAgASA
 
Cai0AACIFIANqIAVB/wFGGzYCACACQQFqIQIMAQsACwALIAAgBiABIANrQQNsaiIBLwAAIgI2AgAgAkUNAyAAIAEtAAIQsgM2AgQMAgsgACAGLwAANgIAIAAgBi8AAjYCCCAAIAEgA2tBAXQgBmovAAQ2AgRBAw8LIAEgA2shAiAAAn8gBUEhRgRAIAYgAkF+cWoiAUEBaiEHIAEtAAAQsgMMAQsgBiACQQF2QQNsaiIBQQJqIQcgAS8AAAsiAUEgQSBBASABQZAIa0EgSRsgAUGAAkkbaiABIAJBAXEbNgIAIAAgBy0AABCyAzYCBAtBAiEICyAIDwtBAAsjAQF/IAEgACgCQEkEfyAAKAJEIAFBGGxqKAIAQQBHBUEACwvpAgEFfiADKQMIIQggACADKQMAIgUQgwQiA0EATgRAAkAgARAQRQ0AIAAQggQhASADRQ0AIAgQEEUNACAAIAVBPCAFQQAQEiIGEAsEQCAGDwsgACAGIAEQWCECIAAgBhAKIAJFDQAgBRANDwsCQAJAAkACQCAAIAVBABDbASICBEAgAjUCAEKAgICAkH+EEA0hBCAIEBBFDQEgAjUCBEKAgICAkH+EEA0hBgwDCwJAAkAgAwRAQoCAgIAwIQcgACAFQewAIAVBABASIgQQCw0GIAgQEEUNASAAIAVB7QAgBUEAEBIiBxALRQ0CDAYLIAUQDSEECyAIEA0hBwsgBBAQBEAgAEEvEDEhBAwCCyAAIAQQKyEGIAAgBBAKIAYiBBALDQMMAQsgACAIECsiBxALDQILIAAgBCAHEIQEIgYQCw0BIAAgBxAKCyAAIAEgBCAGEMsFDwsgACAEEAogACAHEAoLQoCAgIDgAAviDQIIfwF+IwBB0ABrIggkACAAIAggAiADIAQQtAUjAEEQayIDJAAgAyAIKAI4IgI2AgwCQCACLQAAQSNHDQAgAi0AAUEhRw0AIAMgAkECaiICNgIMA0ACQAJAAkAgAiAI
 
KAI8Tw0AAkAgAi0AACIHQQprDgQBAAABAAsgB0EYdEEYdUF/Sg0CIAJBBiADQQxqEF8iB0F+cUGowABHDQEgAygCDCECCyAIIAI2AjgMAwsgAygCDCECIAdBf0cNAQsgAyACQQFqIgI2AgwMAAsACyADQRBqJAACQAJAAkACQAJAAkACQAJAIAVBA3EiB0ECRgRAIAAoAhAoAowBIgxFDQIgDCkDCCIPQv////9vWA0DIA+nIgIvAQYQ9wFFDQQgAigCJCENIAIoAiAiAy0AECEJQQAhAgwBCyAFQQN2IQkgB0EBRwRAIAlBA3EhCUEAIQNBACECDAELQoCAgIDgACEPIAAgBBDHASICRQ0HAn8gAEHwABBqIgNFBEAgACACEBFBAAwBCyADQoCAgIAwNwNoIANCgICAgDA3A2AgA0KAgICAMDcDSCADQoCAgIAwNwNAIAMgAjYCBCADQQE2AgAgA0EIaiAAQeABahBMIAMLIgJFDQcgCUECcUEBciEJQQAhAwsgAEEAQQFBACAEQQEQ+AMiBEUNAyAIIAQ2AkAgBCAHQQJHIgs2AkwgBCAHNgIkIAQgBUEGdkEBcTYCaAJ/IAtFBEAgBCADLwARQQZ2QQFxNgJQIAQgAy8AEUEHdkEBcTYCVCAEIAMtABJBAXE2AlggAy8AEUEJdkEBcQwBCyAEQQA2AlggBEIANwJQQQELIQcgBCAJOgBuIAQgBzYCXCAAQdAAEBcaIARB0AA2AnACQAJAIAMEQEEAIQsgAygCPCEHIAMvASohCSADLwEoIQogBEEANgLAAiAEQQA2AsgCIAQgByAJIApqaiIHNgLEAgJAIAdFDQAgBCAAIAdBA3QQLSIHNgLIAiAHRQRAQX8hCwwBCwNAIAZBAE4EQCADKAIgIAYgAy8BKGpBBHRqIgcoAgRBAU4EQCAEIAQoAsACIglBAWo2AsACIAAgBCgCyAIgCUEDdGogByAGENoDCyAHKAIIIQYMA
 
QsLQQAhBwJAIAZBfkYEQANAIAcgAy8BKk8NAgJAIAMoAiAgByADLwEoakEEdGoiBigCBA0AIAYQ+QRFDQAgBCAEKALAAiIJQQFqNgLAAiAAIAQoAsgCIAlBA3RqIAYgBxDaAwsgB0EBaiEHDAALAAsDQCADLwEoIAdNBEBBACEHA0AgByADLwEqTw0DAkAgAygCICAHIAMvAShqQQR0aiIGKAIEDQAgBigCAEHRAEYNACAEIAQoAsACIglBAWo2AsACIAAgBCgCyAIgCUEDdGogBiAHENoDCyAHQQFqIQcMAAsABSAEIAQoAsACIgZBAWo2AsACIAMoAiAhCSAEKALIAiAGQQN0aiIGIAc7AQIgBkEDOgAAIAYgACAJIAdBBHRqKAIAEBc2AgQgB0EBaiEHDAELAAsAC0EAIQYDQCAGIAMoAjxODQEgAygCJCEJIAQgBCgCwAIiB0EBajYCwAIgBCgCyAIgB0EDdGoiByAHLQAAIgpB/gFxOgAAIAcgCSAGQQN0aiIJLQAAQQJxIApB/AFxciIKOgAAIAcgCkH6AXEgCS0AAEEEcXIiCjoAACAHIApB9gFxIAktAABBCHFyIgo6AAAgCS0AACEOIAcgBjsBAiAHIApBDnEgDkHwAXFyOgAAIAcgACAJKAIEEBc2AgQgBkEBaiEGDAALAAsgCw0BCyAEIAI2ApQDIAggAkU2AkggCCACQQBHNgJEIAgQggEaIAQgBCgCvAE2AvABIAgoAkAhA0F/IQYCQCAIEA8NACAIEPgEDQAgAyADKAIkQQJPBH8gAy0AbkF/c0EBcQVBAQs2AiggCCgCREUEQCADIAgoAgAgA0HRABBWIgc2AqQBIAdBAEgNAQsDQCAIKAIQQap/RwRAIAgQ9wRFDQEMAgsLAkAgCCgCREUEQCAIQdgAEAwgCCADLwGkARAWIAhBKBAMDAELIAhBKRAMC0EAIQYLIAZFDQELIAggCEEQahCPAiAAIAQQiw
 
MMBAsgACAEEKgFIg8QCw0DIAIEQCACIA83A0ggACACEIYEQQBIDQUgAq1CgICAgFCEEA0hDwsgBUEgcQ0GIAAgDyABIA0gDBC7BSEPDAYLQeD4AEGhDUG9hgJB6/gAEAAAC0H9+ABBoQ1BvoYCQev4ABAAAAtBrfkAQaENQcCGAkHr+AAQAAALIAJFDQELIAAgAhDqBQtCgICAgOAAIQ8LIAhB0ABqJAAgDwvEBAMCfgZ/AXwjAEHQAGsiBiQAAkAgBgJ8AkACQAJAAkACQEEAIAIgARAQIgobIgIOAgABAgsQqwW5DAQLAkAgAykDACIEQoCAgIBwVA0AIASnIgIvAQZBCkcNACACKQMgIgUQjgFFDQAgACAGQUBrIAUQRw0CDAMLIAYgACAEQQIQmwMiBDcDACAEEJsBBEAgAEKAgICAMEEBIAYQqgUhBSAAIAQQCiAFEAsNAiAAIAZBQGsgBRBZRQ0DDAILIAAgBkFAayAEEFlFDQIMAQsgBkEAQTgQSyIHQoCAgICAgID4PzcDECACQQcgAkEHSBsiCUEAIAlBAEobIQIDQAJARAAAAAAAAPh/IAIgCEcEfyAAIAdByABqIAMgCEEDdCILaikDABBHDQMgBysDSCIMvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUg0BIAgFIAILIAlHDQQaIAdBARCMAwwECyAHIAtqIAydOQMAAkAgCA0AIAcrAwAiDEQAAAAAAAAAAGZFIAxEAAAAAAAAWUBjRXINACAHIAxEAAAAAACwnUCgOQMACyAIQQFqIQgMAAsAC0KAgICA4AAhAQwCCyAGKwNAEPkDCyIMOQNAAkAgACABQQoQbCIEEAtFBEAgACAEAn4gDL0CfyAMmUQAAAAAAADgQWMEQCAMqgwBC0GAgICAeAsiAre9UQRAIAKtDAELIAwQFQsQzQEgCg0BCyAEIQEMAQsgACAEQQBBAEETEKkFIQEgACAEEAoLIAZB0AB
 
qJAAgAQsWACAAIAApA8ABIAMpAwBBA0F/EJkDCzsBAX8DQCACBEAgAC0AACEDIAAgAS0AADoAACABIAM6AAAgAUEBaiEBIABBAWohACACQQFrIQIMAQsLCxoAIAAtAAAhAiAAIAEtAAA6AAAgASACOgAAC0IBAX8gAkEBdiECA0AgAgRAIAAvAQAhAyAAIAEvAQA7AQAgASADOwEAIAFBAmohASAAQQJqIQAgAkEBayECDAELCwsaACAALwEAIQIgACABLwEAOwEAIAEgAjsBAAtCAQF/IAJBAnYhAgNAIAIEQCAAKAIAIQMgACABKAIANgIAIAEgAzYCACABQQRqIQEgAEEEaiEAIAJBAWshAgwBCwsLGgAgACgCACECIAAgASgCADYCACABIAI2AgALQgEBfiACQQN2IQIDQCACBEAgACkDACEDIAAgASkDADcDACABIAM3AwAgAUEIaiEBIABBCGohACACQQFrIQIMAQsLCxwBAX4gACkDACEDIAAgASkDADcDACABIAM3AwALWgECfiACQQR2IQIDQCACBEAgACkDACEDIAAgASkDADcDACAAKQMIIQQgACABKQMINwMIIAEgBDcDCCABIAM3AwAgAUEQaiEBIABBEGohACACQQFrIQIMAQsLCzQBAn4gACkDACEDIAAgASkDADcDACAAKQMIIQQgACABKQMINwMIIAEgBDcDCCABIAM3AwALmwMCA38CfiMAQSBrIgUkAEKAgICA4AAhCAJAIAAgAUEeEGgiB0UNACAAIAVBEGogAykDABDBAQ0AIAMpAwghASAFQQA2AhwCfgJAIARBG0wEQCAAIAVBHGogARDEAQ0DDAELIAAgBUEIaiABEEcNAiAEQRxGBEAgBSAFKwMItjgCHAwBCyAFKQMIDAELQgALIQFBASEGIAJBA04EQCAAIAMpAxAQ+AFBAXMhBgsgBygCDCgCICICLQAEBEAgABBwDAELIAc1AhQgBSkD
 
ECIJQQEgBEGZHmotAAB0rHxUBEAgAEGg2wEQaQwBCyAJpyACKAIIIAcoAhBqaiEAAkACQAJAAkACQAJAIARBFmsOCAQEAAABAQECAwsgBSgCHCEDIAYEQCAFIANB//8DcRDkAyIDNgIcCyAAIANB//8DcRCEAwwECyAFKAIcIQMgBgRAIAUgAxCDAyIDNgIcCyAAIAMQWwwDCyAAIAYEfiABEJMFBSABCzcAAAwCCxABAAsgACAFKAIcOgAAC0KAgICAMCEICyAFQSBqJAAgCAunAwIBfgN/IwBBEGsiByQAQoCAgIDgACEFAkAgACABQR4QaCIIRQ0AIAAgB0EIaiADKQMAEMEBDQBBASEGIAJBAk4EQCAAIAMpAwgQ+AFBAXMhBgsgCCgCDCgCICICLQAEBEAgABBwDAELIAg1AhQgBykDCCIBQQEgBEGZHmotAAB0rHxUBEAgAEGg2wEQaQwBCyABpyACKAIIIAgoAhBqaiEAAkACQAJAAkACQAJAAkACQAJAIARBFmsOCAgAAQIDBAUGBwsgADEAACEFDAgLIAAvAAAhACAGBH8gABDkAwUgAAtBEHRBEHWtIQUMBwsgAC8AACEAIAYEfyAAEOQDBSAAC60hBQwGCyAAKAAAIQAgBgR/IAAQgwMFIAALrSEFDAULIAAoAAAhAAJ/IAYEQCAAEIMDIQALIABBAE4LBEAgAK0hBQwFCyAAuBAVIQUMBAsgACgAACEAIAYEfyAAEIMDBSAAC767EBUhBQwDCyAAKQAAIQEgBgR+IAEQkwUFIAELvxAVIQUMAgsQAQALIAAwAABC/////w+DIQULIAdBEGokACAFC4ABAQN/IwBBEGsiBSQAIAUgAq03AwgCQCAAIAFBASAFQQhqEMUDIgEQCw0AIAJBACACQQBKGyECA0AgAiAERg0BIAAgASAEIAMgBEEDdGopAwAQDRCWAiEGIARBAWohBCAGQX9KDQALIAAgARAKQoCAg
 
IDgACEBCyAFQRBqJAAgAQumBQIJfgJ/IwBBMGsiDSQAIAMpAwAhBUKAgICAMCEGIA1CgICAgDA3AxhBASEOAkACQAJAAkACfiACQQJIBEBCgICAgDAhCkKAgICAMAwBCwJAIAMpAwgiChAQDQAgACAKEGcNAkEAIQ4gAkEDSA0AIAMpAxAMAQtCgICAgDALIQsgACAFQcMBIAVBABASIgQQCw0AAkAgBBAQRQRAIAAgBBAKIAAQTiIHEAsEQEKAgICAMCEJQoCAgIAwIQQMBAsgDSAFEA03AxAgACANQRBqQQhyQQAQlwMhAiANKQMYIQkgDSkDECEEIAINA0IAIQUDQCAAIAQgCSANQQRqEKsBIggQC0UEQCANKAIEBEAgBCEIDAQLIAAgByAFIAgQbSECIAVCAXwhBSACQQBODQELCyAEEBANBCAAIARBARCvARoMAwtCgICAgDAhCUKAgICAMCEIQoCAgIAwIQQgACAFECkiBxALDQMLIAAgDUEIaiAHEEBBAEgEQCAIIQQMAgsgDQJ+IA0pAwgiBEKAgICACHxC/////w9YBEAgBEL/////D4MMAQsgBLkQFQsiBTcDICAAIAFBASANQSBqEMUDIQYgACAFEAoCQCAGEAsNAEIAIQUgBEIAIARCAFUbIQwDQCAFIAxRBEAgCCEEDAYLIAAgByAFEGIiBBALDQECQCAOBEAgBCEBDAELIA0gBDcDICANIAVC/////w+DNwMoIAAgCiALQQIgDUEgahAiIQEgACAEEAogARALDQILIAAgBiAFIAEQjwEhAiAFQgF8IQUgAkEATg0ACwsgCCEEDAILQoCAgIAwIQlCgICAgDAhBEKAgICAMCEHCwsgACAGEApCgICAgOAAIQYLIAAgBxAKIAAgBBAKIAAgCRAKIA1BMGokACAGCw8AIAArAwAgASsDABDHBAsJACABKwMAEBULVgEBfyABEBBFBEAgAEHJzABBABAUQoCAgI
 
DgAA8LAn4CQCACRQ0AIAMpAwAiARAQDQBCgICAgOAAIAAgARArIgEQCw0BGiABpyEECyAAIARBAxD2AwsLEQAgACoCALsgASoCALsQxwQLCgAgASoCALsQFQsXACABKAIAIgEgACgCACIASSAAIAFJawsYACABKAIAIgBBAE4EQCAArQ8LIAC4EBULFwAgASgCACIBIAAoAgAiAEggACABSGsLBwAgATUCAAsNACAALwEAIAEvAQBrCwcAIAEzAQALDQAgAC4BACABLgEAawsOACABMgEAQv////8PgwsNACAALQAAIAEtAABrCwcAIAExAAALDQAgACwAACABLAAAawsOACABMAAAQv////8PgwvhCQQEfwF8AX4BfSMAQRBrIgYkAEKAgICA4AAhCgJAIAAgARCWASIIQQBIDQBBfyEFAkACQAJAIAhFDQBBASEHAkACQCAEQQFGBEBBfyEHIAYgCEEBazYCDCACQQJIDQEgACAGIAMpAwgQRw0GIAYrAwAiCb1C////////////AINCgYCAgICAgPj/AFoEQCAGQQA2AgwMAgsgCUQAAAAAAAAAAGYEQCAJIAYoAgy3Y0UNAiAGAn8gCZlEAAAAAAAA4EFjBEAgCaoMAQtBgICAgHgLNgIMDAILIAkgCLegIglEAAAAAAAAAABjDQUgBgJ/IAmZRAAAAAAAAOBBYwRAIAmqDAELQYCAgIB4CzYCDAwBCyAGQQA2AgwgAkECSARAIAghAgwCCyAAIAZBDGogAykDCCAIIgIgAhBjDQUMAQtBfyECCyABpyIAEJgBBEAgBEF/Rw0DQQBBfyADKQMAEBAbIQUMAgsCfyADKQMAIgEQVCIDQQdHBEAgAw0CIAYgAUIghkIghyIKuSIJOQMAQQEMAQsgBiABEEkiCTkDACAJAn4gCZlEAAAAAAAA4ENjBEAgCbAMAQtCgICAgICAgICAfwsiCrlhCyEDAkACQAJAAkACQAJAAkA
 
CQAJAAkACQAJAIAAvAQZBFWsOCQEAAQMEBgcJCgwLIANFDQsgCkKAAXxCgAJUDQEMCwsgA0UgCkL/AVZyDQoLIAAoAiQhACAKpyEDIARBAUYEQCADQf//A3EhAyAGKAIMIQUDQCACIAVGDQogAyAAIAVqLQAARg0LIAYgBSAHaiIFNgIMDAALAAsgACAGKAIMIgJqIANB//8DcSAIIAJrEIECIgJFDQkgAiAAayEFDAkLIANFDQggCkKAgAJ8QoCABFQNAQwICyADRSAKQv//A1ZyDQcLIAAoAiQhACAGKAIMIQUgCqdB//8DcSEDA0AgAiAFRg0GIAAgBUEBdGovAQAgA0YNByAGIAUgB2oiBTYCDAwACwALIANFDQUgCkKAgICACHxCgICAgBBUDQEMBQsgA0UgCkL/////D1ZyDQQLIAAoAiQhACAKpyEDIAYoAgwhBQNAIAIgBUYNAyAAIAVBAnRqKAIAIANGDQQgBiAFIAdqIgU2AgwMAAsACyAJvUL///////////8Ag0KBgICAgICA+P8AWgRAIARBf0cNBSAAKAIkIQAgBigCDCEFA0AgAiAFRg0DIAAgBUECdGoqAgC8Qf////8HcUGAgID8B0sNBCAGIAUgB2oiBTYCDAwACwALIAkgCbYiC7tiDQIgACgCJCEAIAYoAgwhBQNAIAIgBUYNAiAAIAVBAnRqKgIAIAtbDQMgBiAFIAdqIgU2AgwMAAsACyAAKAIkIQAgCb1C////////////AINCgYCAgICAgPj/AFoEQCAEQX9HDQQgBigCDCEFA0AgAiAFRg0CIAAgBUEDdGorAwC9Qv///////////wCDQoCAgICAgID4/wBWDQMgBiAFIAdqIgU2AgwMAAsACyAGKAIMIQUDQCACIAVGDQEgACAFQQN0aisDACAJYQ0CIAYgBSAHaiIFNgIMDAALAAtBfyEFCyAEQX9GDQAgBa0hCgwCCyAFQX9zQR92rUKA
 
gICAEIQhCgwBC0L/////DyEKCyAGQRBqJAAgCgu4AgIEfwN+IwBBIGsiBSQAQoCAgIDgACELAkAgACABEJYBIghBAEgNAEEsIQdCgICAgDAhCgJAIAJBAUggBHINACADKQMAIgkQEA0AIAAgCRArIgoQCw0BQX8hByAKpyIGKAIEQQFHDQAgBi0AECEHCyAAIAVBCGpBABBCGiAIQQAgCEEAShshA0EAIQICQANAIAIgA0cEQAJAIAJFDQAgB0EATgRAIAVBCGogBxA7RQ0BDAQLIAVBCGogBkEAIAYoAgRB/////wdxEFcNAwsCQCAAIAEgAhB4IgkQJg0AIAkQEA0AIAkQCw0DIAVBCGogBAR+IAAgCRDVBAUgCQsQjQENAwsgAkEBaiECDAELCyAAIAoQCiAFQQhqEDchCwwBCyAFQQhqEEQgACAKEAoLIAVBIGokACALC6sCAwN/AX4BfCMAQSBrIgMkACACKAIERQRAIAEoAgAhBSADIAIoAgAiASACKAIcIAAoAgAiACACKAIgbGogAigCGBEMADcDECADIAEgAigCHCAFIAIoAiBsaiACKAIYEQwANwMYAkAgASACKQMQQoCAgIAwQQIgA0EQahAiIgYQCwRAIAJBATYCBAwBCwJAAn8gBkL/////D1gEQCAGpyIEQR91IARBAEpqDAELIAEgA0EIaiAGEFlBAEgNASADKwMIIgdEAAAAAAAAAABkIAdEAAAAAAAAAABjawsiBEUEQCAAIAVLIAAgBUlrIQQLIAEgAikDCBDlAkF/Sg0BIAJBATYCBAwBCyACQQE2AgQLIAEgAykDEBAKIAEgAykDGBAKCyADQSBqJAAgBAvhBAIGfwJ+IwBBMGsiAiQAIAIgATcDECACIAA2AgggAkEANgIMIAIgAykDACIKNwMYQoCAgIDgACELAkACQCAAIAEQlgEiBEEASA0AIAoQECIFRQRAIAAgChBnDQELAkAgBEECSA0AI
 
AGnIgMvAQZBFWsiBkH//wNxQQlPDQIgAiAGQRB0QRB1QQJ0IgdBvNwBaigCADYCIEEBIAMvAQZBmR5qLQAAIgl0IQggAygCJCEGIAVFBEAgACAEQQJ0EC0iBUUNAkEAIQMDQCADIARGRQRAIAUgA0ECdGogAzYCACADQQFqIQMMAQsLIAIgCDYCKCACIAY2AiQgBSAEQQRBOSACQQhqEKsCAkAgAigCDEUEQCAAIAQgCXQiAxAtIgcNAQsgACAFEBgMAwsgByAGIAMQIyEHQQAhAwJAAkACQAJAAkAgCEEBaw4IAAEIAggICAMICwNAIAMgBEYNBCADIAZqIAcgBSADQQJ0aigCAGotAAA6AAAgA0EBaiEDDAALAAsDQCADIARGDQMgBiADQQF0aiAHIAUgA0ECdGooAgBBAXRqLwEAOwEAIANBAWohAwwACwALA0AgAyAERg0CIAYgA0ECdCIIaiAHIAUgCGooAgBBAnRqKAIANgIAIANBAWohAwwACwALA0AgAyAERg0BIAYgA0EDdGogByAFIANBAnRqKAIAQQN0aikDADcDACADQQFqIQMMAAsACyAAIAcQGCAAIAUQGAwBCyAGIAQgCCAHQeDcAWooAgAgAkEIahCrAiACKAIMDQELIAEQDSELCyACQTBqJAAgCw8LEAEAC/ABAgJ/A34jAEEwayICJABCgICAgOAAIQcCQCAAIAFBABCZASIFRQ0AIAAgAkEMaiADKQMAIAUoAigiBCAEEGMNACACIAQ2AgggAykDCCIGEBAEfyAEBSAAIAJBCGogBiAEIAQQYw0BIAIoAggLIAIoAgwiA2tBABBKIQQgACABQQAQyQQiBhALDQAgBS8BBiEFIAAgBhAKIAAgAUEAEMoEIggQCw0AIAIgCDcDGCACIAE3AxAgAiAErTcDKCACIAanIAMgBUGZHmotAAB0aq03AyAgAEEEIAJBEGoQ6QIhByAAIAgQCgsgAkEwaiQAIA
 
cLQAEBfiAAIAMpAwAQ+AFBAEetQoCAgIAQhCEEIAEQEARAIAQPCyAAIAFBBhBsIgEQC0UEQCAAIAEgBBDNAQsgAQvgJgMOfwx+AnwjAEHQAWsiByQAQfCmBCgCAARAAn9BgAgQoQIiDCECQYAIIQFBpAhBKxCxAyEFAkACQEGFowRBpAgsAAAQsQNFBEBBhKcEQRw2AgAMAQsgAkEBckUEQEGEpwRBMDYCAAwBCwJAAn9BAEGsCUGsESACGyIARQ0AGiAArSIOpyIDIABBAXJBgIAESQ0AGkF/IAMgDkIgiKcbCyIDEKECIgBFDQAgAEEEay0AAEEDcUUNACAAQQAgAxBLGgsgAA0BC0EADAELIABB/wE6AEsgAEF/NgI8IABBgAg2AjAgAEGACDYCmAEgACAAQZABajYCVCAAIABBrAFqNgIsIAAgAiAAQawJaiACGyICNgKcASAAQaQILAAANgKgASAFRQRAIABBCEEEQaQILQAAQfIARhs2AgALAkBBpAgtAAAiBUHyAEcEQCAFQeEARw0BIAAgAkEAQYAIEIECIgEgAmtBgAggARsiATYCkAELIAAgATYClAELIABB8AI2AiggAEHxAjYCJCAAQfICNgIgIABB8wI2AgxBjKcEKAIARQRAIABBfzYCTAsgAEHQpwQoAgA2AjhB0KcEKAIAIgEEQCABIAA2AjQLQdCnBCAANgIAIAALIQJB8KYEKAIAIQkjAEFAaiIAJAAgAEEAQcAAEEshBSAHQQBB0AEQSyIAIAk1AhA3AxggACAJNQIUNwMAIAk1AhghDiAAQgI3AyAgACAONwMIIAAgCSgCQEEDdEHgAWqtNwMQIAlBzABqIQEgCUHIAGohCgNAIAogASgCACIGRwRAIAYoAhAhASAAIAApAyBCAnw3AyAgACAAKQMQIAkoAkBBA3RB+AFqrXw3AxAgACAAKQPAASAGMwEIfDcDwAEgACAAKQPIASAGNAIMfDcDyAE
 
gBkEUayEDAkAgAUUNACABLQAQDQAgASgCGCEEIAAgACkDaEIBfDcDaCAAIAApA3AgBEEBaiABKAIcEOQBrXw3A3ALIANB5AFqIQEgA0HgAWohCwNAIAsgASgCACIERwRAIAAgACkDICIQQgF8Ig83AyAgACAAKQMQQvAAfCIONwMQIAQoAggEQCAAIBBCAnwiDzcDICAAIA4gBCgCDEEDdK18Ig43AxALAkAgBCgCFEUNACAAIA9CAXw3AyAgACAOIAQoAhgiA0EUbK18NwMQQQAhAQNAIAEgA04NAQJAIAQoAhQgAUEUbGoiCCgCCA0AIAgoAgRFDQAgACAAKQMgQgF8NwMgIAgoAgQpAxggBRCgASAEKAIYIQMLIAFBAWohAQwACwALIAQoAiAEQCAAIAApAyBCAXw3AyAgACAAKQMQIAQoAiRBAnStfDcDEAsgBCgCLARAIAAgACkDIEIBfDcDICAAIAApAxAgBCgCMEEMbK18NwMQCyAEKQM4IAUQoAEgBCkDQCAFEKABIARBBGohAQwBCwsgBkEEaiEBDAELCyAJQdQAaiEBIAlB0ABqIQsDQCALIAEoAgAiBEcEQCAEQQhrIQYCQAJAAkAgBEEEay0AAEEPcQ4CAQACC0EAIQECf0HAACAGKAIgRQ0AGiAGLwEqIAYvAShqQQR0QUBrCyEDIAYoAjQEQCAGKAI4IghBA3QhCgNAIAEgCEgEQCAGKAI0IAFBA3RqKQMAIAUQoAEgAUEBaiEBIAYoAjghCAwBCwsgAyAKaiEDCyAGKAIkBEAgBigCPEEDdCADaiEDCwJAIAYvABEiCEGAIHENACAGKAIURQ0AIAUgBSkDKCAGNAIYfDcDKCAGLwARIQgLQQAhAQJAIAhBgAhxRQ0AAn8gA0EYaiAGKAJURQ0AGkEBIQEgAyAGKAJIakEZagshAyAGKAJMIgZFDQAgBSAFKQMwQgF8NwMwIAUgBSkDOCAGrHw3AzggAUEB
 
aiEBCyAFIAUrAyAgA7egOQMgIAUgBSkDGEIBfDcDGCAFIAUrAwAgAbegOQMADAELIAQoAgghCCAAIAApA0hCAXw3A0gCQCAEKAIMRQ0AIAAgACkDIEIBfDcDICAAIAApA2AgCCgCHEEDdK18NwNgIAAgACkDWCAIKAIgIgOsfDcDWEEAIQogCBAnIQEDQCADIApMDQECQCABKAIERQ0AIAEoAgBB/////wNLDQAgBCgCDCAKQQN0aikDACAFEKABIAgoAiAhAwsgCkEBaiEKIAFBCGohAQwACwALIAgtABBFBEAgCCgCGCEBIAAgACkDaEIBfDcDaCAAIAApA3AgAUEBaiAIKAIcEOQBrXw3A3ALAkACQAJAAkACQAJAAkACQAJAAkAgBi8BBkECaw4TAAkBAQEBAAkBCQIDBAUJBwYICAkLIAAgACkDqAFCAXw3A6gBIAYtAAVBCHFFDQkgACAAKQOwAUIBfDcDsAEgBCgCHEUNCSAAIAApAyBCAXw3AyAgACAAKQMQIAQoAiBBA3StfDcDECAAIAApA7gBIAQ1AiB8NwO4AUEAIQEDQCABIAQoAiBPDQogBCgCHCABQQN0aikDACAFEKABIAFBAWohAQwACwALIAQpAxggBRCgAQwICyAAIAApA6ABQgF8NwOgAQwHCyAEKAIcIgpFDQYgBCgCGCEIIAAgACkDIEIBfDcDICAAIAApA4ABIAgoAjwiA0ECdK18NwOAAUEAIQEDQCABIANODQcCQCAKIAFBAnRqKAIAIgZFDQAgAAJ+RAAAAAAAAPA/IAYoAgC3IhqjIAApAyC5oCIbmUQAAAAAAADgQ2MEQCAbsAwBC0KAgICAgICAgIB/CzcDICAAAn5EAAAAAAAAQEAgGqMgACkDgAG5oCIamUQAAAAAAADgQ2MEQCAasAwBC0KAgICAgICAgIB/CzcDgAEgBigCECINIAZBGGpHDQAgDSkDACAFEKABIAgoAjwhAwsgA
 
UEBaiEBDAALAAsgBCgCGCEDQQAhAQNAIAMoAhAiBiABSgRAIAMgAUEDdGopAxggBRCgASABQQFqIQEMAQsLIAAgACkDIEIBfDcDICAAIAApAxAgBkEDdEEYaq18NwMQDAULIAQoAhgiA0UNBEEAIQEDQCADLQAFIgYgAUsEQCADIAFBA3RqKQMIIAUQoAEgAUEBaiEBDAELCyAAIAApAyBCAXw3AyAgACAAKQMQIAatQgOGfEIIfDcDEAwECyAEKAIYIAUQngQgBCgCHCAFEJ4EDAMLIAQoAhgiAUUNAiABKQMAIAUQoAEgACAAKQMgQgF8NwMgIAAgACkDEEIYfDcDEAwCCyAEKAIYIgFFDQEgACAAKQMgIg5CAXw3AyAgACAAKQMQQhx8Ig83AxAgASgCCEUNASAAIA5CAnw3AyAgACAPIAE0AgB8NwMQDAELIAQoAhhFDQAgACAAKQMgQgF8NwMgCyAEQQRqIQEMAQsLIAAgACkDUCAAKQNIIg9CMH58IhA3A1AgACAAKQMQIAkoAswBIgFBAnStfCIRNwMQQQAhAyABQQAgAUEAShshBCAAKQMgIQ4DQCADIARHBEAgCSgC1AEgA0ECdGohAQNAIAEoAgAiAQRAIAEoAhghBiAAIAApA2hCAXw3A2ggACAAKQNwIAZBAWogASgCHBDkAa18NwNwIAFBKGohAQwBCwsgA0EBaiEDDAELCyAAIA5CA3wiEjcDICAAIAkoAigiBKw3AyggACAJKAIsIgMgCSgCJGpBAnStIg43AzBBACEBIANBACADQQBKGyEDA0AgASADRwRAIAkoAjggAUECdGooAgAiBhDjA0UEQCAAIA4gBigCBCIGQf////8HcSAGQR92IgZ0IAZrQRFqrXwiDjcDMAsgAUEBaiEBDAELCyAAAn4gBSsDCBCvAyIamUQAAAAAAADgQ2MEQCAasAwBC0KAgICAgICAgIB/CyITNwM4IAACfiAFKwMQEK
 
8DIhqZRAAAAAAAAOBDYwRAIBqwDAELQoCAgICAgICAgH8LIhQ3A0AgACAFKQMYIhU3A3ggAAJ+IAUrAyAQrwMiGplEAAAAAAAA4ENjBEAgGrAMAQtCgICAgICAgICAfwsiFjcDgAEgACAFKQMoIhc3A4gBIAAgBSkDMCIYNwOQASAAIAUpAzgiGTcDmAEgBSsDACEaIAAgACkDcCAAKQNgIBkgFyAQIBF8IBR8IBZ8fHwgDnx8fDcDECAAAn4gGhCvAyAEt6AgE7mgIA+5oCAAKQNouaAgFbmgIBi5oCASuaAiGplEAAAAAAAA4ENjBEAgGrAMAQtCgICAgICAgICAfws3AyAgBUFAayQAQfCmBCgCACEFQQAhAUEAIQMjAEGwBmsiACQAIAAgBzQCCDcDmAQgAEEgNgKQBCACQaQOIABBkARqEKIBIAUEQANAIAFBBUcEQCAFIAFBA3QiCUH0DmooAgAiBBDnASIGBEAgBCAFIAYQowQiCE0EQCAAIAQ2AoAEIAAgCCAEazYChAQgACAJQfAOaigCADYCiAQgAkHRDyAAQYAEahCiAUEBIQMLIAUgBhAfCyABQQFqIQEMAQsLIANFBEBB4w9BISACEO4FCyAAQeAEakEAQdABEEsaIAVB1ABqIQEgBUHQAGohAwNAIAMgASgCACIBRwRAIAFBBGstAABBD3FFBEAgAEHgBGogAUECay8BACIEQTMgBEEzSRtBAnRqIgQgBCgCAEEBajYCAAsgAUEEaiEBDAELC0GFEEESIAIQ7gUgACgC4AQiAQRAIABBqRA2AvgDIABBADYC9AMgACABNgLwAyACQZgQIABB8ANqEKIBC0EBIQEDQCABQTNHBEAgAEHgBGogAUECdGooAgAiAwRAIAAgBSAAQaAEaiABQQxsQbQIaigCABDdBTYC6AMgACABNgLkAyAAIAM2AuADIAJBmBAgAEHgA2oQogELIAFBAWohAQwBCwsgACgCrAY
 
iAQRAIABBrhA2AtgDIABBADYC1AMgACABNgLQAyACQZgQIABB0ANqEKIBCwJAIAIoAkxBAEgEQAJAIAIsAEtBCkYNACACKAIUIgEgAigCEE8NACACIAFBAWo2AhQgAUEKOgAADAILIAIQ7wUMAQsCQAJAIAIsAEtBCkYNACACKAIUIgEgAigCEE8NACACIAFBAWo2AhQgAUEKOgAADAELIAIQ7wULCwsgAEHQEDYCyAMgAEHKEDYCxAMgAEHFEDYCwAMgAkG2ECAAQcADahCiASAHKQMYIg5QRQRAIAAgBykDACIPNwOwAyAAIA43A6gDIAAgD7kgDrmjOQO4AyAAQfsQNgKgAyACQdUQIABBoANqELYBIAcpAyAhDiAHKQMAIRAgBykDECEPIABBCDYCiAMgACAPNwOAAyAAIBAgD325IA65ozkDkAMgACAONwP4AiAAQcMRNgLwAiACQYwRIABB8AJqELYBCyAHKQMoIg5QRQRAIAAgBykDMCIPNwPgAiAAIA43A9gCIAAgD7kgDrmjOQPoAiAAQfQRNgLQAiACQc8RIABB0AJqELYBCyAHKQM4Ig5QRQRAIAAgBykDQCIPNwPAAiAAIA43A7gCIAAgD7kgDrmjOQPIAiAAQaESNgKwAiACQfoRIABBsAJqELYBCyAHKQNIIg5QRQRAIAAgBykDUCIPNwOgAiAAIA43A5gCIAAgD7kgDrmjOQOoAiAAQdASNgKQAiACQakSIABBkAJqELYBIAcpA1ghDiAHKQNIIQ8gACAHKQNgNwOAAiAAIA65IA+5ozkDiAIgACAONwP4ASAAQdgSNgLwASACQakSIABB8AFqELYBIAcpA2ghDiAAIAcpA3AiDzcD4AEgACAPuSAOuaM5A+gBIAAgDjcD2AEgAEGLEzYC0AEgAkHlEiAAQdABahC2AQsCQCAHKQN4Ig5QDQAgACAHKQOAATcDwAEgACAONwO4ASAAQacTNgKwASACQZQT
 
IABBsAFqEKIBIAcpA3ghDiAAIAcpA4gBIg83A6ABIAAgD7kgDrmjOQOoASAAIA43A5gBIABB4xM2ApABIAJBuhMgAEGQAWoQtgEgBykDkAEiDlANACAAIAcpA5gBIg83A4ABIAAgDjcDeCAAIA+5IA65ozkDiAEgAEHuEzYCcCACQboTIABB8ABqELYBCyAHKQOgASIOUEUEQCAAIA43A2ggAEGFFDYCYCACQfgTIABB4ABqEKIBCwJAIAcpA6gBIg5QDQAgACAONwNYIABBkRQ2AlAgAkH4EyAAQdAAahCiASAHKQOwASIOUA0AIAAgDjcDSCAAQZgUNgJAIAJB+BMgAEFAaxCiASAHKQOwASEPIAAgBykDuAEiDkIDhjcDMCAAIA65IA+5ozkDOCAAIA43AyggAEHRFDYCICACQaYUIABBIGoQtgELIAcpA8ABIg5QRQRAIAAgBykDyAE3AxAgACAONwMIIABB3BQ2AgAgAkGUEyAAEKIBCyAAQbAGaiQAIAIoAkxBAE4hBSACKAIAQQFxIgNFBEAgAigCNCIABEAgACACKAI4NgI4CyACKAI4IgEEQCABIAA2AjQLIAJB0KcEKAIARgRAQdCnBCABNgIACwsgAhCDBhogAiACKAIMEQQAGiACKAJgIgAEQCAAEOkBCwJAIANFBEAgAhDpAQwBCyAFRQ0ACyAMEAggDBDpAQsgB0HQAWokAAuGAwIEfwR+IwBBIGsiAiQAQoCAgIAwIQgCQAJAIAAgARCWASIEQQBIDQAgACACQQxqIAMpAwAgBCAEEGMNACACIAQ2AgggAykDCCIJEBAEfyAEBSAAIAJBCGogCSAEIAQQYw0BIAIoAggLIAIoAgwiBWtBABBKIQMgACABQQAQmQEiBEUNACAELwEGIQcgAiADrTcDGCACIAE3AxAgAEECIAJBEGoQ6QIiCBALDQAgA0EBSA0BIAAgARDlAg0AIAAgCBDlAg0AAkAgACAIQ
 
QAQmQEiBkUNACAELwEGIAYvAQZHDQAgBhCSBCADSQ0AIAQQkgQgAyAFakkNACAGKAIkIAQoAiQgBSAHQZkeai0AACIAdGogAyAAdBAjGgwCCyADQQAgA0EAShutIQpCACEJA0AgCSAKUQ0CIAAgASAFIAmnaq0QngEiCxALDQEgACAIIAkgC0GAgAEQ4AEhAyAJQgF8IQkgA0F/Sg0ACwsgACAIEApCgICAgOAAIQgLIAJBIGokACAIC8wCAQF+IAAgARCWASICQQBIBEBCgICAgOAADwsCQCACRQ0AAkACQAJAAkACQCABpyIALwEGQZkeai0AAA4EAAECAwQLIAAoAiQiACACaiECA0AgACACQQFrIgJPDQUgAC0AACEDIAAgAi0AADoAACACIAM6AAAgAEEBaiEADAALAAsgACgCJCIAIAJBAXRqIQIDQCAAIAJBAmsiAk8NBCAALwEAIQMgACACLwEAOwEAIAIgAzsBACAAQQJqIQAMAAsACyAAKAIkIgAgAkECdGohAgNAIAAgAkEEayICTw0DIAAoAgAhAyAAIAIoAgA2AgAgAiADNgIAIABBBGohAAwACwALIAAoAiQiACACQQN0aiECA0AgACACQQhrIgJPDQIgACkDACEEIAAgAikDADcDACACIAQ3AwAgAEEIaiEADAALAAsQAQALIAEQDQv2AQIGfgJ/IwBBIGsiCyQAQoCAgIAwIQYCQAJAIAAgARCWASIMQQBIDQAgACADKQMAIggQZw0AQoCAgIAwIQcgAkECTgRAIAMpAwghBwsgDEEAIAxBAEobrSEJA0AgBSAJUgRAIAAgASAFEJ4BIgYQCw0CIAsgATcDECALIAU3AwggCyAGNwMAIAAgCCAHQQMgCxAiIgoQCw0CIAAgChAsBEAgBEUEQCAGIQUMBQsgACAGEAoMBAUgACAGEAogBUIBfCEFDAILAAsLQv////8PQoCAgIAwIAQbIQUMAQsgACAGEA
 
pCgICAgOAAIQULIAtBIGokACAFC7QEAgR/A34jAEEQayIEJABCgICAgOAAIQkCQCAAIAEQlgEiBkEASA0AAn4gAaciBS8BBiIHQRVGBEAgACAEIAMpAwAQDRDVBQ0CIAQ0AgAMAQsgB0EbTQRAIAAgBCADKQMAEMQBDQIgBDUCAAwBCyAAIAQgAykDABBHDQEgBS8BBkEcRgRAIAQrAwC2vK0MAQsgBCkDAAshCCAEQQA2AgACQCACQQFMBEAgBCAGNgIMDAELIAAgBCADKQMIIAYgBhBjDQEgBCAGNgIMIAJBA0gNACADKQMQIgoQEA0AIAAgBEEMaiAKIAYgBhBjDQELIAUQmAEEQCAAEHAMAQsCQAJAAkACQAJAAkACQAJAAkAgBS8BBkGZHmotAAAOBAABAgMECyAEKAIMIgIgBCgCACIATA0HIAUoAiQgAGogCKcgAiAAaxBLGgwHCyAEKAIAIgAgBCgCDCICIAAgAkobIQIgCKchAwNAIAAgAkYNBCAFKAIkIABBAXRqIAM7AQAgAEEBaiEADAALAAsgBCgCACIAIAQoAgwiAiAAIAJKGyECIAinIQMDQCAAIAJGDQQgBSgCJCAAQQJ0aiADNgIAIABBAWohAAwACwALIAQoAgAiACAEKAIMIgIgACACShshAgNAIAAgAkYNBCAFKAIkIABBA3RqIAg3AwAgAEEBaiEADAALAAsQAQALIAQgAjYCAAwCCyAEIAI2AgAMAQsgBCACNgIACyABEA0hCQsgBEEQaiQAIAkL7wECA38CfiMAQRBrIgUkAEKAgICA4AAhBwJAIAAgARCWASIEQQBIDQAgACAFQQxqIAMpAwAgBCAEEGMNACAAIAVBCGogAykDCCAEIAQQYw0AIAUgBDYCBAJ/IAQgAkEDSA0AGiAEIAMpAxAiCBAQDQAaIAAgBUEEaiAIIAQgBBBjDQEgBSgCBAsgBSgCCCIGayAEIAUoAgwiA2sQsAEiAkE
 
BTgRAIAGnIgQQmAEEQCAAEHAMAgsgBCgCJCIAIAMgBC8BBkGZHmotAAAiA3RqIAAgBiADdGogAiADdBDoAQsgARANIQcLIAVBEGokACAHC0oCAX4Bf0KAgICAMCECAkAgAUKAgICAcFQNACABpy8BBiIDQRVrQf//A3FBCEsNACAAIAAoAhAoAkQgA0EYbGooAgQQMSECCyACCywBAX5CgICAgOAAIQUgACABEOUCBH5CgICAgOAABSAAIAEgAiADIAQQmwULC6ADAgR+Bn8gAykDACEFIAJBAk4EfiADKQMIBUKAgICAMAshBCMAQRBrIgIkAEKAgICA4AAhB0KAgICAMCEGAkAgACABQQAQmQEiA0UNACAAIAIgBBCOBA0AAkACQAJAAkAgAikDACIEQgBTDQAgAxCYAQ0DIAAgBRApIgYQCw0EIAanIggvAQZBFWtB//8DcUEITQRAIAgoAiAiCigCDCgCICILLQAEDQQgAy8BBiEJIAMoAiAiDCgCDCgCICENIAIgCDUCKCIFNwMIIAQgAzUCKCAFfVUNASAILwEGIAlHDQIgBCAJQZkeajEAACIBhqcgDSgCCCAMKAIQamogCygCCCAKKAIQaiAFIAGGpxDoAQwDCyAAIAJBCGogBhBADQQgBCADNQIoIAIpAwgiBX1XDQELIABBvcMAEGkMAwsgBKchCEEAIQMDQCAFIAOtVw0BIAAgBiADEHgiBBALDQMgAyAIaiEJIANBAWohAyAAIAEgCSAEEJYCQX9KDQALDAILQoCAgIAwIQcMAQsgABBwCyAAIAYQCiACQRBqJAAgBwtHAQF+AkACQCACRQRADAELIAAgAykDABDQBSIEEAsNAQsgARAQDQAgACABQQQQbCIBEAtFBEAgACABIAQQzQELIAEhBAsgBAtKAgF/AX5CgICAgOAAIQQgACABIAIQmQEiAwR+IAMQmAEEQCACRQRAQgAPCyAAEHBCgICAgOAADwsg
 
AygCIDUCFAVCgICAgOAACwseACAAIAFBABCZASIARQRAQoCAgIDgAA8LIAA1AigLPQEBfkKAgICAECEBIAMpAwAiBEKAgICAcFoEfiAEpy8BBkEVa0H//wNxQQpJrUKAgICAEIQFQoCAgIAQCwuQAwIFfgF/IwBBIGsiAiQAQoCAgIDgACEIAkAgACABIAQQaCIKRQ0AIAotAAQEQCAAEHAMAQsgACACQRhqIAMpAwBCACAKNAIAIgUgBRB+DQAgAiAFNwMQIAMpAwgiBhAQBH4gBQUgACACQRBqIAZCACAFIAUQfg0BIAIpAxALIAIpAxgiCX0Q1AQhByAAIAFCgICAgDAQ8gEiBhALBEAgBiEIDAELAkAgBhAQBEAgAEKAgICAMCAHIAQQ9QMhBQwBCyACIAdCgICAgAh8Qv////8PWAR+IAdC/////w+DBSAHuRAVCzcDCCAAIAZBASACQQhqEK4BIQUgACAGEAogACACKQMIEAoLAkAgBRALDQACQCAAIAUgBBBoIgNFDQAgACAFIAEQWARAIABBoNEBQQAQFAwBCwJAIAMtAAQNACADNAIAIAdTBEAgAEHB0QFBABAUDAILIAotAAQNACADKAIIIAooAgggCadqIAenECMaDAILIAAQcAsgACAFEAoMAQsgBSEICyACQSBqJAAgCAsuACAAIAEgAhBoIgBFBEBCgICAgOAADwsgACgCACIAQQBOBEAgAK0PCyAAuBAVC/YCAQF+IAFBKBA/IQIgBEEBNgIAAkACQCACRQRAIABB0M8BQQAQFAwBCwJAAkACQAJAAkACQAJAAkAgAigCAEEBaw4EAgIHAQALIAVFDQIgACACEMADC0KAgICAMCEBIAVBAWsOAgMEBwsgAykDABANIQECQCAFQQJHDQBBASEDIAIoAgBBAUcNACAAIAEQkgEMAgsgAigCRCIDIAWtNwMAIANBCGsgATcDACACIANBCGo2AkQLQQAhAwsgA
 
kEDNgIAIAIgAzYCFCAAIAJBCGoQwAIhASACQQE2AgAgARALBEAgACACEMADIAEPCyACKAJEQQhrIgMpAwAhBiADQoCAgIAwNwMAIAFC/////w9YBEAgAadBAkYEQCACQQI2AgAgBEECNgIAIAYPCyAEQQA2AgAgBg8LIAAgARAKIAAgAhDAAyAGDwsgAykDABANDwsgACADKQMAEA0QkgEMAQsgAEHgzwFBABAUC0KAgICA4AAhAQsgAQtmAQF+IAMpAwAiARD3A0UEQCAAQeTJAEEAEBRCgICAgOAADwtCgICAgDAhBCABpykCBEKAgICAgICAgECDQoCAgICAgICAgH9RBH4gAUL/////D4NCgICAgJB/hBANBUKAgICAMAsLLwEBfkKAgICA4AAhASAAIAMpAwAQKyIEEAsEfkKAgICA4AAFIAAgBKdBAhD2AwsLSQIBfgF/IAAgARDBAyIBEAsEQCABDwtCgICAgDAhAiABpyIDKAIEQYCAgIB4RwRAIAAgACgCECADENMCEDEhAgsgACABEAogAgsJACAAIAEQwQMLTgEBfiMAQRBrIgIkACACIAAgARDBAyIBNwMIAkAgARALBEAgASEEDAELIABCgICAgDBBASACQQhqEMgEIQQgACABEAoLIAJBEGokACAECy0AQoCAgIDgACAAIAMpAwAgAykDCEEAEJsCIgBBAEetQoCAgIAQhCAAQQBIGwuGAQEDfiADKQMAIgEhBCACQQROBEAgAykDGCEECyABQv////9vWARAIAAQKEKAgICA4AAPCyADKQMQIQZCgICAgOAAIQUCQCAAIAMpAwgQOSICRQ0AIAAgASACIAYQDSAEQQAQiAQhAyAAIAIQESADQQBIDQAgA0EAR61CgICAgBCEIQULIAULKgAgAykDACIBQv////9vWARAIAAQKEKAgICA4AAPCyAAIAFBA0EAEP8CC2MBAX4gAykDACIEQv////9vWARAIA
 
AQKEKAgICA4AAPC0KAgICA4AAhAQJAIAAgAykDCBA5IgJFDQAgACAEIAIQdyEDIAAgAhARIANBAEgNACADQQBHrUKAgICAEIQhAQsgAQtjAQJ+AkACQCADKQMAIgFC/////29YBEAgABAoDAELIAMpAwghBSABIQQgAkEDTgRAIAMpAxAhBAsgACAFEDkiAg0BC0KAgICA4AAPCyAAIAEgAiAEQQAQEiEBIAAgAhARIAELZgEBfiADKQMAIgRC/////29YBEAgABAoQoCAgIDgAA8LQoCAgIDgACEBAkAgACADKQMIEDkiAkUNACAAIAQgAkEAEN0BIQMgACACEBEgA0EASA0AIANBAEetQoCAgIAQhCEBCyABC4sBAgF/An4jAEEQayIEJAAgAykDCCEFIAMpAwAiBiEBAkACQAJAAkAgAkEDSA0AIAMpAxAiARCxAQ0AIABBycwAQQAQFAwBCyAAIARBDGogBRCLBCICDQELQoCAgIDgACEBDAELIAAgBiABIAQoAgwiAyACEI4DIQEgACACIAMQmAMLIARBEGokACABCxwAIAAgAykDAEEAIAJBAWsQSiADQQhqQQIQmgMLQwAjAEEQayICJAACfkKAgICA4AAgACACQQxqIAMpAwAQxAENABpCICACKAIMIgBFDQAaIABnrQshASACQRBqJAAgAQtQACMAQRBrIgIkAEKAgICA4AAhAQJAIAAgAkEMaiADKQMAEJMCDQAgACACQQhqIAMpAwgQkwINACACKAIIIAIoAgxsrSEBCyACQRBqJAAgAQsGACAAtrsLUwACfCAAIAApA9ABIgFCDIggAYUiAUIZhiABhSIBQhuIIAGFIgE3A9ABIAFCnbqz+5SS/aIlfkIMiEKAgICAgICA+D+Ev0QAAAAAAADwv6ALEBUL9QMDA3wFfwN+IwBBEGsiCCQAIAhCADcDCAJAAkAgAkEBSA0AQoCAgIDgACEBIAAgCEEIaiADKQM
 
AEEcNAUEBIQkgCCsDCCEEIAJBAUcEQANAIAIgCUYNAiAAIAggAyAJQQN0aikDABBHDQMgCUEBaiEJIAgrAwAhBSMAQSBrIgckACAEvUL///////////8AgyINIAW9Qv///////////wCDIgwgDCANVhsiDr8hBAJAIA5CNIinIgpB/w9GDQAgDSAMIAwgDVQbIgy/IQUCQCAOUA0AIAxCNIinIgtB/w9GDQAgCyAKa0HBAE4EQCAFIASgIQQMAgsCfCALQf4LTwRAIAREAAAAAAAAMBSiIQQgBUQAAAAAAAAwFKIhBUQAAAAAAACwawwBC0QAAAAAAADwPyAKQbwESw0AGiAERAAAAAAAALBroiEEIAVEAAAAAAAAsGuiIQVEAAAAAAAAMBQLIQYgB0EYaiAHQRBqIAUQhgYgB0EIaiAHIAQQhgYgBiAHKwMAIAcrAxCgIAcrAwigIAcrAxign6IhBAwBCyAFIQQLIAdBIGokAAwACwALIASZIQQLIAS9An8gBJlEAAAAAAAA4EFjBEAgBKoMAQtBgICAgHgLIgC3vVEEQCAArSEBDAELIAQQFSEBCyAIQRBqJAAgAQtbAQF/AkAgAL1C////////////AINCgICAgICAgPj/AFYgAEQAAAAAAAAAAGFyDQAgAEQAAAAAAAAAAGMhAUQAAAAAAADwvyEAIAENAEQAAAAAAADwPyEACyAAC4MBAgJ+AX8gAL0iAUI0iKdB/w9xIgNB/gdNBEAgAUKAgICAgICAgIB/gyECIANB/gdHIAFCgICAgICAgPC/f1FyRQRAIAJCgICAgICAgPg/hL8PCyACvw8LIANBsghNBHwgAUI/hyABfEIBQbMIIANrrYYiAUIBiHxCACABfYO/BSAACwvjBAICfAV/IwBBEGsiCCQAAn4gAkUEQEQAAAAAAADw/0QAAAAAAADwfyAEGxAVDAELAnwgAykDACIBQv////8PWARAIAJBASACQQFK
 
GyELIAGnIQlBASEHA0AgByALRwRAIAm3IAMgB0EDdGopAwAiAUKAgICAEFoNAxogAachCgJ/IAQEQCAJIAoQSgwBCyAJIAoQsAELIQkgB0EBaiEHDAELCyAJrQwCC0KAgICA4AAgACAIQQhqIAEQRw0BGkEBIQcgCCsDCAshBSAHIAIgAiAHSBshAgNAIAIgB0cEQEKAgICA4AAgACAIIAMgB0EDdGopAwAQRw0CGgJAIAW9Qv///////////wCDQoCAgICAgID4/wBWDQAgCCsDACIGvUL///////////8Ag0KAgICAgICA+P8AVgRAIAYhBQwBCyAEBEAgBb1C////////////AINCgICAgICAgPj/AFgEfCAFIAUgBqUgBr1C////////////AINCgICAgICAgPj/AFYbBSAGCyAGvSAFvYO/IAVEAAAAAAAAAABiIAZEAAAAAAAAAABichshBQwBCyAFvUL///////////8Ag0KAgICAgICA+P8AWAR8IAUgBSAGpCAGvUL///////////8Ag0KAgICAgICA+P8AVhsFIAYLIAa9IAW9hL8gBUQAAAAAAAAAAGIgBkQAAAAAAAAAAGJyGyEFCyAHQQFqIQcMAQsLIAW9An8gBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIgC3vVEEQCAArQwBCyAFEBULIQEgCEEQaiQAIAEL0AEBAn8jAEEQayICJAACfiAAIAFBJhBoIgNFBEAgBEEANgIAQoCAgIDgAAwBCwJAIAMpAwAiARAQRQRAIAIgAygCDCIFNgIMIAUgAaciBigCBEH/////B3FJDQEgACABEAogA0KAgICAMDcDAAsgBEEBNgIAQoCAgIAwDAELIAYgAkEMahDZASEHIAMgAigCDDYCDCAEQQA2AgAgB0H//wNNBEAgACAHQf//A3EQpgMMAQsgACAGIAVBAXRqQRBqQQIQnAQLIQEgAkEQaiQAIAEL2
 
QICAn8CfiMAQSBrIgIkAEKAgICA4AAhBwJAIAAgARBhIgEQCw0AIAAgAkEIakEHEEIaIAJBCGpBPBA7GiACQQhqIARBA3QiBUHAwgFqKAIAIgYQiwEaQZ49IAR2QQFxRQRAIAJBCGpBIBA7GiACQQhqIAVBxMIBaigCABCLARogAkEIakHBwwEQiwEaIAAgAykDABBhIggQCwRAIAAgARAKIAJBCGoQRAwCCyAIpyEDQQAhBANAIAQgAygCBEH/////B3FPRQRAAkAgAyAEEC8iBUEiRgRAIAJBCGpBxMMBEIsBGgwBCyACQQhqIAUQlAEaCyAEQQFqIQQMAQsLIAAgCBAKIAJBCGpBIhA7GgsgAkEIakE+EDsaIAJBCGogARCNARogAkEIakHLwwEQiwEaIAJBCGogBhCLARogAkEIakE+EDsaIAJBCGoQNyEHCyACQSBqJAAgBwu1BAEIfyMAQTBrIgIkAAJAIAAgARBhIgEQCw0AIAGnIgcoAgRB/////wdxIgNFDQACQCAAIAJBGGogAxBCDQBBACEDIAJBADYCFANAAkAgBygCBEH/////B3EgA0oEQEEAIQMCfwJAIARFIAcgAkEUahDZASILQaMHR3INACACKAIUQQFrIQojAEEQayIIJAAgCCAKNgIMA0ACf0EAIAgoAgwiBUEBSA0AGiAFQQFrIQYCQAJAIAcoAgRBf0wEQCAHIAZBAXRqLwEQIglBgPgDcUGAuANHIAVBAkhyDQEgByAFQQJrIgVBAXRqLwEQIgxBgNAAakH//wNxQYAISw0BIAlB/wdxQYCABHIgDEH/B3FBCnRqIQkMAgsgBiAHai0AECEJCyAGIQULIAggBTYCDCAJCyIGELoEDQALAkAgBhC8BEUEQEEAIQYMAQtBASEGIAggCkEBaiIFNgIMA0AgBSAHKAIEQf////8HcU4NASAHIAhBDGoQ2QEiBRC6BARAIAgoAgwhBQwBCwsgBRC8BE
 
UhBgsgCEEQaiQAIAZFDQAgAkHCBzYCCEEBDAELIAJBCGogCyAEELcDCyIGQQAgBkEAShshBgNAIAMgBkYNAiADQQJ0IQUgA0EBaiEDIAJBGGogBSACQQhqaigCABC+AUUNAAsMAwsgACABEAogAkEYahA3IQEMAwsgAigCFCEDDAALAAsgACABEAogAkEYahBEQoCAgIDgACEBCyACQTBqJAAgAQtaAQF+QoCAgIDgACEEIAAgARBhIgEQCwR+QoCAgIDgAAUgACADKQMAECsiBBALBEAgACABEApCgICAgOAADwsgAacgBKcQlQIhAiAAIAEQCiAAIAQQCiACrQsLCQAgACABEI0FC18AAn4CQCABQiCIpyICQX9HBEAgAkF5Rw0BIAEQDQwCCyABpyICLwEGQQVHDQAgAikDICIBQoCAgIBwg0KAgICAkH9SDQAgARANDAELIABBwNMAQQAQFEKAgICA4AALC6ABAgF/AX4gACABEGEiARALBEAgAQ8LIAGnIgUoAgRB/////wdxIQJBACEDAkAgBEEBcUUNAANAIAIgA0YEQCACIQMMAgsgBSADEC8Q4gJFDQEgA0EBaiEDDAALAAsCQCAEQQJxRQRAIAIhBAwBCwNAIAIiBCADTA0BIAUgBEEBayICEC8Q4gINAAsLIAAgBSADIAQQmgEhBiAAIAEQCiAGC5oDAgZ/A34jAEEgayIFJABCgICAgOAAIQwCQCAAIAEQYSIBEAsNAAJAAkAgACAFQQRqIAMpAwAQwgENACAFKAIEIgcgAaciCSgCBEH/////B3EiCEwNAUEgIQpCgICAgDAhCwJAIAJBAkgNACADKQMIIg0QEA0AIAAgDRArIgsQCw0BAkACQCALpyIGKAIEQf////8HcQ4CAAECCyAAIAsQCgwDCyAGQQAQLyEKQQAhBgsgB0GAgICABE4EQCAAQfQNQQAQQQwBCyAAIAVBCGogBxBCRQRAIAUgByAIayI
 
DNgIEAkAgBARAIAVBCGogCUEAIAgQVw0BCwJAIAYEQANAIANBAUgNAiAFQQhqIAZBACADIAYoAgRB/////wdxELABIgIQVw0DIAUgAyACayIDNgIEDAALAAsgBUEIaiAKIAMQywQNAQsgBEUEQCAFQQhqIAlBACAIEFcNAQsgACALEAogACABEAogBUEIahA3IQwMBAsgBUEIahBECyAAIAsQCgsgACABEAoMAQsgASEMCyAFQSBqJAAgDAv3BAIEfgV/IwBB0ABrIgIkACADKQMIIQggAykDACEFAkACQAJAIAEQEEUEQCABECZFDQELIABBk84AQQAQFAwBCwJAIAUQEA0AIAUQJg0AIAQEQCAAIAUQzQRBAEgNAgtCgICAgOAAIQYgACAFQcYBIAVBABASIgcQCw0CIAcQEA0AIAcQJg0AIAIgCDcDKCACIAE3AyAgACAHIAVBAiACQSBqEDUhBgwCCyAAIAJBCGpBABBCGkKAgICAMCEHAkAgACABECsiBhALBEBCgICAgDAhBQwBCyAAIAUQKyIFEAsNACAAIAgQOiINRQRAIAAgCBArIgcQCw0BCyAGpyEKIAWnIgwpAgQhAQNAAkACQCABQv////8Hg1AEQEEAIQMgC0UNASAJIAooAgRB/////wdxTg0CIAlBAWohAwwBCyAKIAwgCRDMBCIDQX9KDQAgCw0BIAJBCGoQRCAAIAUQCiAAIAcQCgwFCyACIAU3AyACfiANBEAgAiAGNwMwIAIgA603AyggACAAIAhCgICAgDBBAyACQSBqECIQPgwBCyACIAc3A0ggAkKAgICAMDcDQCACQoCAgIAwNwM4IAIgBjcDKCACIAOtNwMwIAAgAkEgahCQBQsiARALDQIgAkEIaiAKIAkgAxBXGiACQQhqIAEQjQEaIAwpAgQiAadB/////wdxIANqIQlBASELIAQNAQsLIAJBCGogCiAJIAooAgRB/////wdxEFcaIAAg
 
BRAKIAAgBxAKIAAgBhAKIAJBCGoQNyEGDAILIAJBCGoQRCAAIAUQCiAAIAcQCiAAIAYQCgtCgICAgOAAIQYLIAJB0ABqJAAgBguDAgIDfwF+IwBBIGsiAiQAAkACQCAAIAEQYSIBEAsNACAAIAIgAykDABCOBA0AIAIpAwAiB0KAgICACFoEQCAAQaTCARBpDAELIAenIgNBAUYNASABpyIFKQIEpyIGQf////8HcSIERQ0BIAcgBK1+QoCAgIAEWQRAIABB9A1BABBBDAELIAAgAkEIaiADIARsIAZBH3YQqgMNAAJAIARBAUcEQANAIANBAUgNAiACQQhqIAVBACAEEFcaIANBAWshAwwACwALIAJBCGogBUEAEC8gAxDLBBoLIAAgARAKIAJBCGoQNyEBDAELIAAgARAKQoCAgIDgACEBCyACQSBqJAAgAQulAQICfwJ+IwBBEGsiAiQAAkAgACABEGEiARALBEAgASEGDAELQoCAgIDgACEGAkAgACACQQxqIAMpAwAgAaciBSgCBEH/////B3EiBCAEEGMNACACIAQ2AgggAykDCCIHEBBFBEAgACACQQhqIAcgBCAEEGMNASACKAIIIQQLIAAgBSACKAIMIgMgBCADEEoQmgEhBgsgACABEAoLIAJBEGokACAGC6cBAgN/An4jAEEQayICJAACQCAAIAEQYSIBEAsEQCABIQcMAQtCgICAgOAAIQcCQCAAIAJBDGogAykDACABpyIGKAIEQf////8HcSIEIAQQYw0AIAIgBCACKAIMIgVrIgQ2AgggACAGIAUgAykDCCIIEBAEfyAEBSAAIAJBCGogCCAEQQAQYw0BIAIoAggLIAVqEJoBIQcLIAAgARAKCyACQRBqJAAgBwu6AQICfwJ+IwBBEGsiAiQAAkAgACABEGEiARALBEAgASEGDAELQoCAgIDgACEGAkAgACACQQxqIAMpAwAgAaciBSgCBEH/////B3FBA
 
BBjDQAgAiAFKAIEQf////8HcSIENgIIIAMpAwgiBxAQRQRAIAAgAkEIaiAHIARBABBjDQEgAigCCCEECyAAIAUgAigCDCIDIAQgAyAESCIFGyAEIAMgBRsQmgEhBgsgACABEAoLIAJBEGokACAGC5gEAgl+A38jAEEQayINJAAgAykDCCEHIAMpAwAhBAJAAkACQCABEBBFBEAgARAmRQ0BCyAAQZPOAEEAEBQMAQsCQCAEEBAiAg0AIAQQJg0AQoCAgIDgACEFIAAgBEHIASAEQQAQEiIIEAsNAiAIEBANACAIECYNACANIAc3AwggDSABNwMAIAAgCCAEQQIgDRA1IQUMAgtCgICAgDAhCQJAIAAgARArIgwQCwRAQoCAgIAwIQUMAQsgABBOIgUQCw0AAkAgBxAQBEAgDUF/NgIADAELIAAgDSAHEMQBQQBIDQELIAynIg4pAgQhASAAIAQQKyIJEAsNAAJAIA0oAgAiA0UNACABp0H/////B3EhDyAAIA4CfwJAIAINACAJpyICKQIEQv////8HgyEKAkAgDwRAIAFC/////weDIAp9IApQrSIEfSEHIAOtIQgDQCAEIAt8IgEgB1UNAiAOIAIgAacQzAQiA0EASA0CIAAgDiALpyADEJoBIgEQCw0GIAAgBSAGIAFBABCqAUEASA0GIAogA6x8IQsgBkIBfCIGIAhSDQALDAQLIApQRQ0BDAMLIAZC/////w+DIQYgC6cMAQtBAAsgDxCaASIBEAsNASAAIAUgBiABQQAQqgFBAEgNAQsgACAMEAogACAJEAoMAgsgACAFEAogACAMEAogACAJEAoLQoCAgIDgACEFCyANQRBqJAAgBQvTAgEDfiMAQTBrIgIkACACIAE3AyggAykDACEFAkACQCABEBBFBEAgARAmRQ0BCyAAQZPOAEEAEBRCgICAgOAAIQcMAQsCQCAFEBANACAFECYNAEKAgICA4AAhByAAIAUgBC
 
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
 
QQAQNQshBCAAIAEQCgsgBAvWAgICfwR+IwBBIGsiBSQAAn4CQCAAIAUgACABECkiCRBADQBBLCEGQoCAgIAwIQgCQCACQQFIIARyRQRAQQAhAiADKQMAIgEQEA0BIAAgARArIggQCw0CQX8hBiAIpyICKAIEQQFHDQEgAi0AECEGDAELQQAhAgsgACAFQQhqQQAQQhpCACEBIAUpAwAiB0IAIAdCAFUbIQoCQANAIAEgClIEQAJAIAFQDQAgBkEATgRAIAVBCGogBhA7GgwBCyAFQQhqIAJBACACKAIEQf////8HcRBXGgsgACAJIAGnEHgiBxALDQICQCAHECYNACAHEBANACAFQQhqIAQEfiAAIAcQ1QQFIAcLEI0BDQMLIAFCAXwhAQwBCwsgACAIEAogACAJEAogBUEIahA3DAILIAVBCGoQRCAAIAgQCgsgACAJEApCgICAgOAACyEBIAVBIGokACABC/MBAgF/An4jAEEgayIEJAACfgJAAkACQCAAIARBEGogACABECkiBRBADQAgBCkDECIGQgFTDQEgBCAGQgF9IgE3AwggAkECTgRAIAAgBEEIaiADKQMIQn8gASAGEH4NASAEKQMIIQELA0AgAUIAUw0CIAAgBSABIARBGGoQiQEiAkEASA0BIAIEQCAAIAMpAwAQDSAEKQMYQQAQ3gENBAsgAUIBfSEBDAALAAsgACAFEApCgICAgOAADAILQn8hAQsgACAFEAogAUL/////D4MgAUKAgICACHxC/////w9YDQAaIAG5EBULIQEgBEEgaiQAIAEL9QICAX8EfiMAQSBrIgQkAAJ+AkACQCAAIARBEGogACABECkiBxBADQBCfyEGIAQpAxAiCEIBUw0BIARCADcDCCACQQJOBEAgACAEQQhqIAMpAwhCACAIIAgQfg0BCwJAIAcgBEEEaiAEEI4CRQRAIAQpAwghAQwBCyAEKQMIIgUgBDUCACIBIAEgBVMbI
 
QEgBCgCBCECA0AgASAFUgRAIAAgAykDABANIAIgBadBA3RqKQMAEA1BABDeAQRAIAUhBgwFBSAFQgF8IQUMAgsACwsgBCABNwMICyABIAggASAIVRshBQNAIAEgBVENAiAAIAcgASAEQRhqEIkBIgJBAEgNAQJAIAJFDQAgACADKQMAEA0gBCkDGEEAEN4BRQ0AIAEhBgwDCyABQgF8IQEMAAsACyAAIAcQCkKAgICA4AAMAQsgACAHEAogBkL/////D4MgBkKAgICACHxC/////w9YDQAaIAa5EBULIQEgBEEgaiQAIAEL3AICCH4BfyMAQTBrIg0kAEKAgICAMCEGAkACQCAAIA1BCGogACABECkiBxBABEBCgICAgDAhBQwBC0KAgICAMCEFIAAgAykDACIKEGcNAEKAgICAMCEJIAJBAk4EQCADKQMIIQkLIA0pAwgiBUIAIAVCAFUbIQsDQCAIIAtSBEACfiAIIgVCgICAgAhaBEAgCLkQFSEFCyAFCxALDQIgACAHIAUQngEiBhALDQIgDSABNwMgIA0gBTcDGCANIAY3AxAgACAKIAlBAyANQRBqECIiDBALDQIgACAMECwEQCAEBEAgACAGEAogACAHEAoMBQsgACAFEAogACAHEAogBiEFDAQFIAAgBhAKIAAgBRAKIAhCAXwhCAwCCwALCyAAIAcQCkL/////D0KAgICAMCAEGyEFDAELIAAgBRAKIAAgBhAKIAAgBxAKQoCAgIDgACEFCyANQTBqJAAgBQv1AQIBfwJ+IwBBIGsiBCQAAkACQCAAIARBGGogACABECkiBhBADQAgBEIANwMQAkAgAkEBTARAIAQgBCkDGCIFNwMIDAELIAQpAxghBSADKQMIIgEQEEUEQCAAIARBEGogAUIAIAUgBRB+DQILIAQgBTcDCCACQQNIDQAgAykDECIBEBANACAAIARBCGogAUIAIAUgBRB+DQEgBCkDCCEFCyAEKQ
 
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
 
IgEQCw0CIAAgBCABQoCAgIAwQQEQxgUNAiAAIAEQCgsgAkEBaiECDAALAAsgACAEEAogACABEApCgICAgOAAIQQLIAQLGwAgACADKQMAIAMpAwgQWEEAR61CgICAgBCEC5sCAgN+A38jAEEgayICJABCgICAgOAAIQQgACADKQMAECkiBRALRQRAQoCAgIAwIQECfgJAIAAgAkEcaiACQRhqIAWnQQMQkAENACAAED0iARALDQAgAigCHCEHIAIoAhghCEEAIQMDQCADIAhHBEAgACAHIANBA3RqIgkoAgQQXiIGEAsNAiACIAY3AwggAiAFNwMAIABCgICAgDBBAiACQQAQ2AQhBCAAIAYQCiAEEAsNAiAEEBBFBEAgACABIAkoAgQgBEGHgAEQGUF/TA0DCyADQQFqIQMMAQsLIAAgByAIEGQgAQwBCyAAIAIoAhwgAigCGBBkIAAgBRAKIAEhBUKAgICA4AALIQQgACAFEAoLIAJBIGokACAEC20AAn4CQCADKQMAIgFC/////29YBEAgBEUNASAAEChCgICAgOAADwtCgICAgOAAIAAgARCZBCICQQBIDQEaIAQEQCACQQBHrUKAgICAEIQPCyACDQAgAEGrnAFBABAUQoCAgIDgAA8LIAEQDQsLTwACQAJAIAMpAwAiAUL/////b1gEQCAERQRAQoCAgIAQDwsgABAoDAELIAAgARCfASIAQQBODQELQoCAgIDgAA8LIABBAEetQoCAgIAQhAsQACAAIAMpAwBBAkEAEP8CCxAAIAAgAykDAEEBQQAQ/wILLQEBfkKAgICA4AAhASAAIAMpAwAiBCADKQMIENoEBH5CgICAgOAABSAEEA0LC30BAn4gAykDACIBQv////9vWARAIAAQKEKAgICA4AAPCyADKQMQIQZCgICAgOAAIQUCQCAAIAMpAwgQOSICRQ0AIAAgASACIAYgBEVBDnQQ2QQhAyAAIAIQESADQQBID
 
QAgBARAIANBAEetQoCAgIAQhA8LIAEQDSEFCyAFCycAIAAgAykDACIBIAMpAwhBARCbAkEASARAQoCAgIDgAA8LIAEQDQs4ACADKQMAIgFCIIinIgJBf0YgBEVBACACQX5xQQJHG3JFBEAgABAoQoCAgIDgAA8LIAAgARD7AQtiAQF+AkAgAykDACIBECANACABECYNACAAQcChAUEAEBRCgICAgOAADwsCQCAAIAEQUiIBEAtFBEAgAykDCCIEEBANASAAIAEgBBDaBEUNASAAIAEQCgtCgICAgOAADwsgAQu4AQECfiABECBFBEAgABAoQoCAgIDgAA8LQoCAgIDgACEFAn4gACABQTYgAUEAEBIiBBAQBEAgAEGOARAxDAELIAAgBBA+CyIEEAsEfkKAgICA4AAFAn4gACABQTMgAUEAEBIiARAQBEAgAEEvEDEMAQsgACABED4LIgEQCwRAIAAgBBAKQoCAgIDgAA8LAkAgBBD2AQ0AIAEQ9gENACAAQb4VIARBkJwBEL0BIQQLIAAgBCABEMYCCwtpAgF/AX5B8KYEKAIABEAQggULQfCmBBDXBSICNgIAIAIQ4AQhAkGApwQgATYCAEH0pgQgAjYCACACIAAgABBDQY0IELYFIgMgARCnAwRAQfSmBCgCACADEApBAA8LQfimBCADNwMAQQELvgICA38BfCMAQdAAayIEJAAgBEEQakEAQTgQSxogBEKAgICAgICA+D83AyBCgICAgMB+IQECQCACRQ0AIAJBByACQQdIGyICQQAgAkEAShshAgNAIAIgBUcEQCAAIARBCGogAyAFQQN0IgZqKQMAEEcEQEKAgICA4AAhAQwDCyAEKwMIIge9QoCAgICAgID4/wCDQoCAgICAgID4/wBRDQIgBEEQaiAGaiAHnTkDAAJAIAUNACAEKwMQIgdEAAAAAAAAAABmRSAHRAAAAAAAAFlAY0VyDQAgBCAHRAAAAAAAsJ1AoD
 
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
 
BqIAYgBSASpxBXGiACQcgAaiAPEIwBGiARpykCBEL/////B4MgEnynIQULIARBAWohBAwBCwsgAkHIAGogBiAFIAYoAgRB/////wdxEFcaIAJByABqEDchFAwCC0KAgICAMCEPQoCAgIAwIRBCgICAgDAhEQsgAkHIAGoQRAsgAkEQahCPBSAAIBcQCiAAIBEQCiAAIBAQCiAAIA8QCiAAIBMQCiAAIBUQCgsgAkGQAWokACAUC5IBACMAQSBrIgIkAAJ+AkAgARAgRQRAIAAQKAwBCyAAIAJBCGpBABBCGiACQQhqQS8QOxoCQCACQQhqIAAgAUHsACABQQAQEhCNAQ0AIAJBCGpBLxA7GiACQQhqIAAgAUHtACABQQAQEhCNAQ0AIAJBCGoQNwwCCyACQQhqEEQLQoCAgIDgAAshASACQSBqJAAgAQs/AQF+QoCAgIDgACEEIAAgASADKQMAENgBIgEQCwR+QoCAgIDgAAUgARAmIQIgACABEAogAkWtQoCAgIAQhAsLgAIBA34CQCAAIAFBARDbASICRQ0AIAMpAwghBgJAAkAgACADKQMAIgRBABDbASIDBEAgBhAQRQRAIABB99IAQQAQFEKAgICA4AAPCyADNQIAQoCAgICQf4QQDSEEIAM1AgRCgICAgJB/hBANIQUMAQtCgICAgDAhBQJ+IAQQEARAIABBLxAxDAELIAAgBBArCyIEEAsNASAAIAQgBhCEBCIFEAsNAQsgACACNQIAQoCAgICQf4QQCiAAIAI1AgRCgICAgJB/hBAKIAIgBT4CBCACIAQ+AgAgACABQdUAQgAQSEEASA0BIAEQDQ8LIAAgBBAKIAAgBRAKC0KAgICA4AALawEBfyABQv////9vWARAIAAQKEKAgICA4AAPCwJ+IAAgAUEAENsBIgNFBEBCgICAgDAgACABIAAoAigpA5ABEFgNARogAEESEJwDQoCAgIDgAA8LIAIgAygCBC0AEHF
 
BAEetQoCAgIAQhAsLxwMBB38jAEEgayIFJAACQAJAAkACQAJAIAFC/////29YBEAgABAoDAELIAAgASAAKAIoKQOQARBYDQIgACABQQEQ2wEiAg0BC0KAgICA4AAhAQwDCyACKAIAIgcpAgSnIgJB/////wdxIgMNAQsgAEHQ0gAQcSEBDAELIAAgBUEIaiADIAJBH3YQqgMaIAcoAgRB/////wdxIQhBACEAA0ACQAJAIAAgCEgEQCAAQQFqIQJBfyEGAkACfwJAAkACQAJAAkACQAJAIAcgABAvIgNB2wBrDgMDAQIACyACIQACQCADQQprDgQECwsFAAsgA0EvRw0HIARFDQVBASEEQS8hAwwHC0HcACEDIAIgCE4NBiAAQQJqIQAgByACEC8hBgwJC0EAIQRB3QAhAwwFC0HbACEDIAQgAiAITnINBiAAQQJqIAIgByACEC9B3QBGIgIbIQBB3QBBfyACGyEGQQEhBAwHC0HuAAwCC0HyAAwBC0EAIQRBLwshBkHcACEDCyACIQAMAgsgBUEIahA3IQEMAwsgAiEAQQEhBAsgBUEIaiADEJQBGiAGQQBIDQAgBUEIaiAGEJQBGgwACwALIAVBIGokACABC9gCAgN/AX4jAEEQayIEJAACQCABQv////9vWARAIAAQKEKAgICA4AAhBQwBC0KAgICA4AAhBSAAIAAgAUHuACABQQAQEhAsIgJBAEgNACACBH8gBEHnADoACCAEQQlqBSAEQQhqCyECIAAgACABQZ/PABDMAhAsIgNBAEgNACADBEAgAkHpADoAACACQQFqIQILIAAgACABQarPABDMAhAsIgNBAEgNACADBEAgAkHtADoAACACQQFqIQILIAAgACABQbTPABDMAhAsIgNBAEgNACADBEAgAkHzADoAACACQQFqIQILIAAgACABQe8AIAFBABASECwiA0EASA0AIAMEQCACQfUAOgAAIAJBAWohAgsgACAA
 
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
 
CyACRQRAIAAgACgCAEEBazYCACAAIAAoAgRBCGs2AgQgARDpAQwDC0EAIAAoAgggACgCBCACakkNARogASACEPUFDwsgACACEKUFCw8LQQALJgAgAQRAIAAgACgCAEEBazYCACAAIAAoAgRBCGs2AgQgARDpAQsLKAEBfwJAIAGnKAIgIgNFDQAgAygCAEEERg0AIAAgA0EIaiACEPADCwscAQF/IAFBKBA/IgIEQCAAIAIQ7gMgACACEB8LCyUBAX8gAacoAiAiAwRAIAAgAykDACACECEgACADKQMIIAIQIQsLJwEBfyABpygCICICBEAgACACKQMAECUgACACKQMIECUgACACEB8LCx4BAX8gAacoAiAiAgRAIAAgAikDABAlIAAgAhAfCwtDAQJ/IAGnKAIgIgIEQAJAIAIpAwAiARDeBUUNACACKAIMIgNFDQAgACADEPIDIAIpAwAhAQsgACABECUgACACEB8LC1gBA38CQCABpygCICIERQ0AIARBCGohAyAEQQRqIQUDQCADKAIAIgMgBUYNASAEKAIARQRAIAAgAykDECACECELIAAgAykDGCACECEgA0EEaiEDDAALAAsLgQEBBX8gAacoAiAiAwRAIANBBGohBSADKAIIIQIDQCACIAVHBEAgAigCBCEGIAJBEGshBCACQQxrKAIARQRAAkAgAygCAARAIAQQpgUMAQsgACACKQMQECULIAAgAikDGBAlCyAAIAQQHyAGIQIMAQsLIAAgAygCEBAfIAAgAxAfCwshAQF/IAGnKAIgIgMEQCAAIAM1AgxCgICAgHCEIAIQIQsLQAEBfyABpygCICICBEAgACACNQIMQoCAgIBwhCIBEN4FBH4gAhBGIAI1AgxCgICAgHCEBSABCxAlIAAgAhAfCwtbAQJ/IAGnKAIgIgIEQAJAAkAgAi0ABUUNACAAKAK8ASIDRQ0AIAAoAsQBIAIoAgggAxEDAAwBCyACKAIYI
 
gNFDQAgACACKAIUIAIoAgggAxEGAAsgACACEB8LCykBAX8gACABpyICNQIkQoCAgICQf4QQJSAAIAI1AiBCgICAgJB/hBAlCxEAIAAgAacoAiApAwAgAhAhCxkBAX8gACABpygCICICKQMAECUgACACEB8LQQEDfwJAIAFBDxA/IgRFDQAgBEEIaiEFA0AgAyAELQAFTw0BIAAgBSADQQN0aikDACACECEgA0EBaiEDDAALAAsLQwEDfyABQQ8QPyIDBEAgA0EIaiEEA0AgAiADLQAFT0UEQCAAIAQgAkEDdGopAwAQJSACQQFqIQIMAQsLIAAgAxAfCwtJAQJ/IAAgAacoAiAiBCkDACACECEgACAEKQMIIAIQIQNAIAMgBCgCEE5FBEAgACAEIANBA3RqKQMYIAIQISADQQFqIQMMAQsLC0kBAn8gACABpygCICICKQMAECUgACACKQMIECUDQCADIAIoAhBORQRAIAAgAiADQQN0aikDGBAlIANBAWohAwwBCwsgACACEB8LjgEBBH8gAaciAygCJCEFIAMoAiAhBCADKAIoIgMEQCAAIAOtQoCAgIBwhCACECELIAQEQAJAIAVFDQBBACEDA0AgAyAEKAI8Tg0BAkAgBSADQQJ0aigCACIGRQ0AIAYtAAVBAXFFDQAgACAGIAIRAwALIANBAWohAwwACwALIAAgBK1CgICAgGCEIAIQIQsLcwEDfyABpyICKAIoIgMEQCAAIAOtQoCAgIBwhBAlCyACKAIgIgMEQCACKAIkIgQEQEEAIQIDQCACIAMoAjxORQRAIAAgBCACQQJ0aigCABD5ASACQQFqIQIMAQsLIAAgBBAfCyAAIAOtQoCAgIBghBAlCwsSACABpygCICIABEAgABCtAwsLDgAgACABpykDICACECELGQAgACABpyIAKQMgECUgAEKAgICAMDcDIAs1AQJ/IAGnIQQDQCADIAQoAihPRQRAIAAgBCgCJC
 
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
 
b3BlcnR5ICclcycgb2YgdW5kZWZpbmVkAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiBudWxsAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiB1bmRlZmluZWQAcC0+Y2xhc3NfaWQgPT0gSlNfQ0xBU1NfQVJSQVkASlNfU2V0UHJvcGVydHlJbnRlcm5hbABwcm9wID09IEpTX0FUT01fbGVuZ3RoAG91dC1vZi1ib3VuZCBudW1lcmljIGluZGV4AG5vdCBhbiBvYmplY3QAb2JqZWN0IGlzIG5vdCBleHRlbnNpYmxlAHBycyAhPSBOVUxMAEpTX0RlZmluZVByb3BlcnR5AHByb3BlcnR5IGlzIG5vdCBjb25maWd1cmFibGUAbm9uIGludGVnZXIgaW5kZXggaW4gdHlwZWQgYXJyYXkAbmVnYXRpdmUgaW5kZXggaW4gdHlwZWQgYXJyYXkAb3V0LW9mLWJvdW5kIGluZGV4IGluIHR5cGVkIGFycmF5AGludmFsaWQgZGVzY3JpcHRvciBmbGFncwBjb3VsZCBub3QgZGVsZXRlIHByb3BlcnR5AGludmFsaWQgYXJyYXkgaW5kZXgAJWQAW2Z1bmN0aW9uIGJ5dGVjb2RlXQBjYW5ub3QgY29udmVydCBzeW1ib2wgdG8gc3RyaW5nAFt1bnN1cHBvcnRlZCB0eXBlXQBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX0dMT0JBTCB8fCBldmFsX3R5cGUgPT0gSlNfRVZBTF9UWVBFX01PRFVMRQBKU19FdmFsVGhpcwBSZWdFeHAAdW5leHBlY3RlZCBkYXRhIGF0IHRoZSBlbmQAICAgICAgICAgIAAAAIwAAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABQcm94eQBBoBsL0wHALgAAkC8AAFAwAACwMAAAADEAAFAxAAAMCwUEA
 
gIAALIAAABnAAAAaAAAALMAAABpAAAAagAAALQAAABpAAAAagAAALUAAABAAAAAQQAAALYAAABrAAAAbAAAALcAAABrAAAAbAAAAC8AAABtAAAAbgAAALgAAABAAAAAQQAAALkAAABvAAAAcAAAAFByb21pc2UAQXN5bmNGdW5jdGlvbgBBc3luY0dlbmVyYXRvckZ1bmN0aW9uAERhdGUAT2JqZWN0AEZ1bmN0aW9uAEVycm9yAEGAHQslJlMAADBTAAA7UwAASlMAAFZTAABgUwAAaVMAAHdTAABBcnJheQBBsB0LhTFjb3B5V2l0aGluAGVudHJpZXMAZmlsbABmaW5kAGZpbmRJbmRleABmbGF0AGZsYXRNYXAAaW5jbHVkZXMAa2V5cwB2YWx1ZXMAAE51bWJlcgBCb29sZWFuAFN0cmluZwBTeW1ib2wAR2VuZXJhdG9yRnVuY3Rpb24AZXZhbAAAAAABAQICAgNBcnJheUJ1ZmZlcgBTaGFyZWRBcnJheUJ1ZmZlcgBUeXBlZEFycmF5AEJZVEVTX1BFUl9FTEVNRU5UAERhdGFWaWV3AG1yMSAhPSBOVUxMAGRlbGV0ZV93ZWFrX3JlZgBtci0+ZW1wdHkAbWFwX2RlY3JlZl9yZWNvcmQAc2YtPmN1cl9zcCAhPSBOVUxMAGFzeW5jX2Z1bmNfZnJlZQBzaXplICE9IDAAanNfZGVmX21hbGxvYwAAAG51bGwAZmFsc2UAdHJ1ZQBpZgBlbHNlAHJldHVybgB2YXIAdGhpcwBkZWxldGUAdm9pZAB0eXBlb2YAbmV3AGluAGluc3RhbmNlb2YAZG8Ad2hpbGUAZm9yAGJyZWFrAGNvbnRpbnVlAHN3aXRjaABjYXNlAGRlZmF1bHQAdGhyb3cAdHJ5AGNhdGNoAGZpbmFsbHkAZnVuY3Rpb24AZGVidWdnZXIAd2l0aABjbGFzcwBjb25zdABlbnVtAGV4cG9ydA
 
BleHRlbmRzAGltcG9ydABzdXBlcgBpbXBsZW1lbnRzAGludGVyZmFjZQBsZXQAcGFja2FnZQBwcml2YXRlAHByb3RlY3RlZABwdWJsaWMAc3RhdGljAHlpZWxkAGF3YWl0AABsZW5ndGgAZmlsZU5hbWUAbGluZU51bWJlcgBtZXNzYWdlAGVycm9ycwBzdGFjawBuYW1lAHRvU3RyaW5nAHRvTG9jYWxlU3RyaW5nAHZhbHVlT2YAZXZhbABwcm90b3R5cGUAY29uc3RydWN0b3IAY29uZmlndXJhYmxlAHdyaXRhYmxlAGVudW1lcmFibGUAdmFsdWUAZ2V0AHNldABvZgBfX3Byb3RvX18AdW5kZWZpbmVkAG51bWJlcgBib29sZWFuAHN0cmluZwBvYmplY3QAc3ltYm9sAGludGVnZXIAdW5rbm93bgBhcmd1bWVudHMAY2FsbGVlAGNhbGxlcgA8ZXZhbD4APHJldD4APHZhcj4APGFyZ192YXI+ADx3aXRoPgBsYXN0SW5kZXgAdGFyZ2V0AGluZGV4AGlucHV0AGRlZmluZVByb3BlcnRpZXMAYXBwbHkAam9pbgBjb25jYXQAc3BsaXQAY29uc3RydWN0AGdldFByb3RvdHlwZU9mAHNldFByb3RvdHlwZU9mAGlzRXh0ZW5zaWJsZQBwcmV2ZW50RXh0ZW5zaW9ucwBoYXMAZGVsZXRlUHJvcGVydHkAZGVmaW5lUHJvcGVydHkAZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yAG93bktleXMAYWRkAGRvbmUAbmV4dAB2YWx1ZXMAc291cmNlAGZsYWdzAGdsb2JhbAB1bmljb2RlAHJhdwBuZXcudGFyZ2V0AHRoaXMuYWN0aXZlX2Z1bmMAPGhvbWVfb2JqZWN0PgA8Y29tcHV0ZWRfZmllbGQ+ADxzdGF0aWNfY29tcHV0ZWRfZmllbGQ+ADxjbGFzc19maWV
 
sZHNfaW5pdD4APGJyYW5kPgAjY29uc3RydWN0b3IAYXMAZnJvbQBtZXRhACpkZWZhdWx0KgAqAE1vZHVsZQB0aGVuAHJlc29sdmUAcmVqZWN0AHByb21pc2UAcHJveHkAcmV2b2tlAGFzeW5jAGV4ZWMAZ3JvdXBzAHN0YXR1cwByZWFzb24AZ2xvYmFsVGhpcwB0b0pTT04AT2JqZWN0AEFycmF5AEVycm9yAE51bWJlcgBTdHJpbmcAQm9vbGVhbgBTeW1ib2wAQXJndW1lbnRzAE1hdGgASlNPTgBEYXRlAEZ1bmN0aW9uAEdlbmVyYXRvckZ1bmN0aW9uAEZvckluSXRlcmF0b3IAUmVnRXhwAEFycmF5QnVmZmVyAFNoYXJlZEFycmF5QnVmZmVyAFVpbnQ4Q2xhbXBlZEFycmF5AEludDhBcnJheQBVaW50OEFycmF5AEludDE2QXJyYXkAVWludDE2QXJyYXkASW50MzJBcnJheQBVaW50MzJBcnJheQBGbG9hdDMyQXJyYXkARmxvYXQ2NEFycmF5AERhdGFWaWV3AE1hcABTZXQAV2Vha01hcABXZWFrU2V0AE1hcCBJdGVyYXRvcgBTZXQgSXRlcmF0b3IAQXJyYXkgSXRlcmF0b3IAU3RyaW5nIEl0ZXJhdG9yAFJlZ0V4cCBTdHJpbmcgSXRlcmF0b3IAR2VuZXJhdG9yAFByb3h5AFByb21pc2UAUHJvbWlzZVJlc29sdmVGdW5jdGlvbgBQcm9taXNlUmVqZWN0RnVuY3Rpb24AQXN5bmNGdW5jdGlvbgBBc3luY0Z1bmN0aW9uUmVzb2x2ZQBBc3luY0Z1bmN0aW9uUmVqZWN0AEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24AQXN5bmNHZW5lcmF0b3IARXZhbEVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAU3ludGF4RXJyb3IAVHlwZUVycm9y
 
AFVSSUVycm9yAEludGVybmFsRXJyb3IAPGJyYW5kPgBTeW1ib2wudG9QcmltaXRpdmUAU3ltYm9sLml0ZXJhdG9yAFN5bWJvbC5tYXRjaABTeW1ib2wubWF0Y2hBbGwAU3ltYm9sLnJlcGxhY2UAU3ltYm9sLnNlYXJjaABTeW1ib2wuc3BsaXQAU3ltYm9sLnRvU3RyaW5nVGFnAFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUAU3ltYm9sLmhhc0luc3RhbmNlAFN5bWJvbC5zcGVjaWVzAFN5bWJvbC51bnNjb3BhYmxlcwBTeW1ib2wuYXN5bmNJdGVyYXRvcgAAKG5ld19oYXNoX3NpemUgJiAobmV3X2hhc2hfc2l6ZSAtIDEpKSA9PSAwAEpTX1Jlc2l6ZUF0b21IYXNoAGF0b20gPCBydC0+YXRvbV9zaXplAF9fSlNfQXRvbVRvVmFsdWUAc2gtPmhlYWRlci5yZWZfY291bnQgPT0gMABqc19mcmVlX3NoYXBlMABpICE9IDAASlNfRnJlZUF0b21TdHJ1Y3QAcnQtPmF0b21fY291bnQgPj0gMABwLT5yZWZfY291bnQgPT0gMABmcmVlX3plcm9fcmVmY291bnQAcy0+aXNfd2VhawByZXNldF93ZWFrX3JlZgAhbXItPmVtcHR5AAEAAAAFAAEUBQABFQUAARUFAAEXBQABFwEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQUDAAEKAQEAAAECAQABAwIAAQECAAECAwABAgQAAQMGAAECAwABAwQAAQQFAAEDAwABBAQAAQUFAAECAgABBAQAAQMDAAEDAwABBAQAAQUFAAMCAQ0DAQENAwEADQMCAQ0DAgANAwABDQMDAQoBAQAAAQAAAAEBAgABAAAAAQICAAECAAABAQAAAQEAAAYAABgFAQEPAwIBCgECAQABAQEAAQEBAAUAARcFAAEXBQABFwUBA
 
BcFAQAXBQIAFwECAwABAwAABgAAGAYAABgGAQAYBQEBFwUBAhcFAgAXAQIBAAEDAAABAwEAAQIBAAECAgABAwAAAQMBAAEEAAAFAgEXBQEBFwECAgABAgEAAQICAAEDAgABAwIAAgMDBQYCARgCAwEFBgICGAYDAxgDAAEQAwEAEAMBARADAAERAwEAEQMBAREDAAESAwEAEgMBARIDAAAQAwABEAMBABADAQAQAwABEgMBABIDAQASAwAAEAUBABYFAQAWBQAAFgUAARYFAAAWAQEAAAEBAQABAQEAAQICAAoBABoKAgEaCgEAGgoBABoKAQAaCgEAGgcAAhkHAAIZBwACGQUAAhcBAQEAAQEDAAEBAwABAQMAAgMFBQEBAQABAQIAAQMAAAEEBAABBAQAAgQFBQEAAAABAQIAAQECAAEBAgABAQEAAQEBAAEBAQABAQEAAQEBAAEBAgABAQIAAgAABwIAAAcCAQAHAQEBAAEBAQABAQEAAQIBAAUAARcBAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQIBAAECAQABAgEAAQEBAAEAAAADAAAKAwAACgUAABYHAAEZBwABGQcBABkHAAEZCwACGwcAAhkHAAIZBwEBGQcBAhkHAQEZBQEBEwUAABMBAAEBAQABAQEAAQEBAAEBAQABAQEAAQEBAAEBAQABAQEAAQECAAEGAwABCwIAAQgCAAEIAQABAAIAAQcCAQAHAgEBBwEAAQIBAAECAQABAgEAAQIBAQACAQEAAgEBAAIBAQACAQEBAgEBAQIBAQECAQEBAgEAAQMBAAEDAQABAwEAAQMBAQADAQEAAwEBAAMBAQADAQEBAwEBAQMBAQEDAQEBAwEAAQQBAAEEAQABBAEAAQQBAQAEAQEABAEBAAQBAQAEAQEBBAEBAQQBAQ
 
EEAQEBBAEBAQACAQAJAgEACQIAAAkDAAAMAQEBDgEBAQ4BAQEOAQEBDgEBAQABAQEAAQEBAAEBAQBwLT5tYXJrID09IDAAZ2NfZGVjcmVmAHZhcl9yZWYtPmlzX2RldGFjaGVkAG1hcmtfY2hpbGRyZW4AcC0+cmVmX2NvdW50ID4gMABnY19kZWNyZWZfY2hpbGQAZ2Nfc2NhbgBwLT5nY19vYmpfdHlwZSA9PSBKU19HQ19PQkpfVFlQRV9KU19PQkpFQ1QgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfRlVOQ1RJT05fQllURUNPREUAZ2NfZnJlZV9jeWNsZXMASlNfQXRvbUdldFN0clJUADxudWxsPgAhYXRvbV9pc19mcmVlKHApAGNpcmN1bGFyIHByb3RvdHlwZSBjaGFpbgBwcm94eTogYmFkIHByb3RvdHlwZQBwcm94eTogaW5jb25zaXN0ZW50IHByb3RvdHlwZQByZXZva2VkIHByb3h5AG9wZXJhbmQgJ3Byb3RvdHlwZScgcHJvcGVydHkgaXMgbm90IGFuIG9iamVjdABpbnRlcnJ1cHRlZAAlcyBpcyBub3QgaW5pdGlhbGl6ZWQAbGV4aWNhbCB2YXJpYWJsZQAAAHEAAAByAAAAcwAAAENvdWxkIG5vdCBmaW5kIGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnAGNpcmN1bGFyIHJlZmVyZW5jZSB3aGVuIGxvb2tpbmcgZm9yIGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnAGV4cG9ydCAnJXMnIGluIG1vZHVsZSAnJXMnIGlzIGFtYmlndW91cwAocHItPnUuaW5pdC5yZWFsbV9hbmRfaWQgJiAzKSA9PSAwAEpTX0RlZmluZUF1dG9Jbml0UHJvcGVydHkAJyVzJyBpcyBub3QgZGVmaW5lZABudW1faW5kZXggPT0
 
gbnVtX2tleXNfY291bnQASlNfR2V0T3duUHJvcGVydHlOYW1lc0ludGVybmFsAHN0cl9pbmRleCA9PSBudW1fa2V5c19jb3VudCArIHN0cl9rZXlzX2NvdW50AHN5bV9pbmRleCA9PSBhdG9tX2NvdW50AEpTX0F0b21Jc0FycmF5SW5kZXgAYXRvbTFfaXNfaW50ZWdlciAmJiBhdG9tMl9pc19pbnRlZ2VyAG51bV9rZXlzX2NtcABqc19nZXRfYXRvbV9pbmRleABub3QgY29uZmlndXJhYmxlAG5vIHNldHRlciBmb3IgcHJvcGVydHkAJyVzJyBpcyByZWFkLW9ubHkAcC0+c2hhcGUtPmhlYWRlci5yZWZfY291bnQgPT0gMQBhZGRfcHJvcGVydHkAJWxsZABjYW5ub3QgY3JlYXRlIG51bWVyaWMgaW5kZXggaW4gdHlwZWQgYXJyYXkAdmFyX3JlZi0+aGVhZGVyLnJlZl9jb3VudCA+IDAAZnJlZV92YXJfcmVmAEpTX0F0b21Jc051bWVyaWNJbmRleDEAAG4AZgBpAG4AaQB0AHkAbmZpbml0eQAhc2gtPmlzX2hhc2hlZABjb21wYWN0X3Byb3BlcnRpZXMAbmV3X3NpemUgPD0gc2gtPnByb3Bfc2l6ZQBqID09IChzaC0+cHJvcF9jb3VudCAtIHNoLT5kZWxldGVkX3Byb3BfY291bnQpACVzIG9iamVjdCBleHBlY3RlZABjYW5ub3QgY29udmVydCBzeW1ib2wgdG8gbnVtYmVyAHRvUHJpbWl0aXZlAEluZmluaXR5AGludmFsaWQgYXJyYXkgbGVuZ3RoAE5hTgAlLipmAG4gPCBidWZfc2l6ZQBqc19mY3Z0MQAlKy4qZQBtdXN0IGJlIGNhbGxlZCB3aXRoIG5ldwBub3QgYSBmdW5jdGlvbgBkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIG11
 
c3QgcmV0dXJuIGFuIG9iamVjdCBvciB1bmRlZmluZWQAY2xhc3MgY29uc3RydWN0b3JzIG11c3QgYmUgaW52b2tlZCB3aXRoICduZXcnAHVuc3VwcG9ydGVkIHJlZmVyZW5jZSB0byAnc3VwZXInAGl0ZXJhdG9yIGRvZXMgbm90IGhhdmUgYSB0aHJvdyBtZXRob2QAaW52YWxpZCB0aHJvdyB2YXIgdHlwZSAlZAAndGhpcycgY2FuIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZQBpbnZhbGlkIHJldCB2YWx1ZQBpdGVyYXRvciBtdXN0IHJldHVybiBhbiBvYmplY3QAaXRlcmF0b3JfY2xvc2VfcmV0dXJuAHZhbHVlIGhhcyBubyBwcm9wZXJ0eQBpbnZhbGlkIG9wY29kZTogcGM9JXUgb3Bjb2RlPTB4JTAyeAAADQAQAC0AMQBpbXBvcnQubWV0YSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29udGV4dABleHBlY3RpbmcgPGJyYW5kPiBwcml2YXRlIGZpZWxkAGludmFsaWQgYnJhbmQgb24gb2JqZWN0AHJlZGVjbGFyYXRpb24gb2YgJyVzJwA8aW5wdXQ+AG5vdCBhIG9iamVjdAB0b28gbWFueSBhcmd1bWVudHMAc3RyaW5nIGV4cGVjdGVkAG5vIGZ1bmN0aW9uIGZpbGVuYW1lIGZvciBpbXBvcnQoKQBjYW5ub3QgZGVmaW5lIHZhcmlhYmxlICclcycAdmFsdWUgaXMgbm90IGl0ZXJhYmxlACFfX0pTX0F0b21Jc1RhZ2dlZEludChkZXNjcikASlNfTmV3U3ltYm9sRnJvbUF0b20AZGVzY3IgPCBydC0+YXRvbV9zaXplAG5vdCBhIHN5bWJvbABwcml2YXRlIGNsYXNzIGZpZWxkICclcycgZG9lcyBub3QgZXhpc3QAcHJpdmF0ZSBjbGFzc
 
yBmaWVsZCAnJXMnIGFscmVhZHkgZXhpc3RzAFsAXQBnZXQgAHNldCAAcGFyZW50IGNsYXNzIG11c3QgYmUgY29uc3RydWN0b3IAcGFyZW50IHByb3RvdHlwZSBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsAGItPmZ1bmNfa2luZCA9PSBKU19GVU5DX05PUk1BTABqc19vcF9kZWZpbmVfY2xhc3MAcmVjZWl2ZXIgaXMgbm90IGFuIG9iamVjdABzZXR0ZXIgaXMgZm9yYmlkZGVuAGludmFsaWQgaW5kZXggZm9yIGFwcGVuZABudWxsIG9yIHVuZGVmaW5lZCBhcmUgZm9yYmlkZGVuAGludmFsaWQgJ2luJyBvcGVyYW5kAG5vdCBhIGNvbnN0cnVjdG9yACAgICBhdCAlcwA6JWQAPGFub255bW91cz4AICglcwAgKG5hdGl2ZSkAZHVwbGljYXRlIGV4cG9ydGVkIG5hbWUgJyVzJwBjb3VsZCBub3QgbG9hZCBtb2R1bGUgJyVzJwAuAC4uAGJ5dGVjb2RlIGZ1bmN0aW9uIGV4cGVjdGVkAGV2YWwgaXMgbm90IHN1cHBvcnRlZABjaXJjdWxhciByZWZlcmVuY2UAZ2V0ICVzAHNldCAlcwBjYW5ub3QgY29udmVydCB0byBvYmplY3QAbm9ybWFsaXplAEHAzgAL9QEsJwAAAwAAAAAAAAB0AAAAYmFkIG5vcm1hbGl6YXRpb24gZm9ybQBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncwAlcwBmbGFncwBzb3VyY2UAZ2xvYmFsAGlnbm9yZUNhc2UAbXVsdGlsaW5lAGRvdEFsbAB1bmljb2RlAHN0aWNreQBleGVjAGNvbXBpbGUAdGVzdAB0b1N0cmluZwBbU3ltYm9sLnJlcGxhY2VdAFtTeW1ib2wubWF0Y2hdAFtTeW1ib2wubWF0Y2hBbG
 
xdAFtTeW1ib2wuc2VhcmNoXQBbU3ltYm9sLnNwbGl0XQBBwNAAC+ADiycAAAEBAAB1AAAAAAAAAJEnAAABAQAAdgAAAAAAAACYJwAAAQIBAHcAAAAAAAAAnycAAAECAgB3AAAAAAAAAKonAAABAgQAdwAAAAAAAAC0JwAAAQIIAHcAAAAAAAAAuycAAAECEAB3AAAAAAAAAMMnAAABAiAAdwAAAAAAAADKJwAAAwAAAAEAAAAwAAAAzycAAAMAAAACAAAAeAAAANcnAAADAAAAAQAAAHkAAADcJwAAAwAAAAAAAAB6AAAA5ScAAAMAAAACAAAAewAAAPYnAAADAAAAAQAAAHwAAAAFKAAAAwAAAAEAAAB9AAAAFygAAAMAAAABAAAAfgAAACcoAAADAAAAAgAAAH8AAAAoPzopAG91dCBvZiBtZW1vcnkgaW4gcmVnZXhwIGV4ZWN1dGlvbgBmbGFncyBtdXN0IGJlIHVuZGVmaW5lZABSZWdFeHAgZXhlYyBtZXRob2QgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwAbm90IGEgc3RyaW5nAHkAW1N5bWJvbC5zcGVjaWVzXQDPKQAAAQEAAIAAAAAAAAAAbmV4dABbU3ltYm9sLnRvU3RyaW5nVGFnXQBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAEGw1AAL1wrwKQAAAwAAAAAMAACBAAAA9SkAAAEDAAAKKgAAAAAAAHVuZXhwZWN0ZWQgZW5kIG9mIGNvbW1lbnQAdW5leHBlY3RlZCBjaGFyYWN0ZXIAaW52YWxpZCBjaGFyYWN0ZXIgaW4gYSBKU09OIHN0cmluZwBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZQBtYWxmb3JtZWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsAGludmFsaWQ
 
gVVRGLTggc2VxdWVuY2UAdW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nAGV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lAHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0AHVuZXhwZWN0ZWQgdG9rZW46ICclLipzJwBleHBlY3RpbmcgJyVjJwAgAFx1JTA0eABBcnJheSBsb28gbG9uZwBKU09OAAAAAAAAAACkKwAAAwgAANArAAADAAAAcGFyc2UAc3RyaW5naWZ5AMArAAADAAAAAgAAAIIAAADGKwAAAwAAAAMAAACDAAAA9SkAAAEDAACkKwAAAAAAAHByb3h5OiBpbmNvbnNpc3RlbnQgaXNFeHRlbnNpYmxlAHByb3h5OiBpbmNvbnNpc3RlbnQgcHJldmVudEV4dGVuc2lvbnMAcHJveHk6IGluY29uc2lzdGVudCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAaW52YWxpZCBnZXR0ZXIAaW52YWxpZCBzZXR0ZXIAY2Fubm90IGhhdmUgc2V0dGVyL2dldHRlciBhbmQgdmFsdWUgb3Igd3JpdGFibGUAcHJveHk6IHByb3BlcnRpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHN5bWJvbHMAcHJveHk6IGR1cGxpY2F0ZSBwcm9wZXJ0eQBwcm94eTogdGFyZ2V0IHByb3BlcnR5IG11c3QgYmUgcHJlc2VudCBpbiBwcm94eSBvd25LZXlzAHByb3h5OiBwcm9wZXJ0eSBub3QgcHJlc2VudCBpbiB0YXJnZXQgd2VyZSByZXR1cm5lZCBieSBub24gZXh0ZW5zaWJsZSBwcm94eQBwcm94eTogaW5jb25zaXN0ZW50IGRlbGV0ZVByb3BlcnR5AHByb3h5OiBkZWZpbmVQcm9wZXJ0eSBleGNlcHRpb24AcHJveHk6IGluY29uc2lzdGVudCBkZWZpbmVQcm9wZXJ0eQBwcm94
 
eTogaW5jb25zaXN0ZW50IGhhcwBwcm94eTogaW5jb25zaXN0ZW50IGdldABwcm94eTogaW5jb25zaXN0ZW50IHNldABwcm94eTogY2Fubm90IHNldCBwcm9wZXJ0eQByZXZvY2FibGUAVi4AAAMAAAACAAAAhAAAAHNldABnZXQAaGFzAGRlbGV0ZQBjbGVhcgBzaXplAGZvckVhY2gAdmFsdWVzAGtleXMAZW50cmllcwBbU3ltYm9sLml0ZXJhdG9yXQBNYXAAcC4AAAMAAAACAQAAhQAAAHQuAAADAAAAAQEAAIYAAAB4LgAAAwAAAAEBAACHAAAAfC4AAAMAAAABAQAAiAAAAIMuAAADAAAAAAEAAIkAAACJLgAAAQIAAIoAAAAAAAAAji4AAAMAAAABAQAAiwAAAJYuAAADAAQAAAEAAIwAAACdLgAAAwAAAAABAACMAAAAoi4AAAMACAAAAQAAjAAAAKouAAADCQAAoi4AAP/////1KQAAAQMAALwuAAAAAAAAYWRkAFNldABBkN8AC7cBgC8AAAMAAQABAQAAhQAAAHguAAADAAEAAQEAAIcAAAB8LgAAAwABAAEBAACIAAAAgy4AAAMAAQAAAQAAiQAAAIkuAAABAgEAigAAAAAAAACOLgAAAwABAAEBAACLAAAAli4AAAMAAQAAAQAAjAAAAJ0uAAADCQAAli4AAP////+qLgAAAwkAAJYuAAD/////oi4AAAMACQAAAQAAjAAAAPUpAAABAwAAhC8AAAAAAABXZWFrTWFwAEHQ4AALV3AuAAADAAIAAgEAAIUAAAB0LgAAAwACAAEBAACGAAAAeC4AAAMAAgABAQAAhwAAAHwuAAADAAIAAQEAAIgAAAD1KQAAAQMAAEAwAAAAAAAAV2Vha1NldABBsOEAC4IDgC8AAAMAAwABAQAAhQAAAHguAAADAAMAAQEAAIcAAAB8LgAAAwADAAEBAACIAAAA9SkAAAEDA
 
ACgMAAAAAAAAE1hcCBJdGVyYXRvcgAAAADwKQAAAwAAAAAMAACNAAAA9SkAAAEDAADwMAAAAAAAAHMgIT0gTlVMTABqc19tYXBfaXRlcmF0b3JfbmV4dABTZXQgSXRlcmF0b3IAAAAAAPApAAADAAEAAAwAAI0AAAD1KQAAAQMAAD8xAAAAAAAAc2V0L2FkZCBpcyBub3QgYSBmdW5jdGlvbgAAAAAAAADPKQAAAQEAAIAAAAAAAAAAcmVzb2x2aW5nIGZ1bmN0aW9uIGFscmVhZHkgc2V0AHByb21pc2Ugc2VsZiByZXNvbHV0aW9uAGFyZ2MgPT0gNQBwcm9taXNlX3JlYWN0aW9uX2pvYgBhcmdjID09IDMAanNfcHJvbWlzZV9yZXNvbHZlX3RoZW5hYmxlX2pvYgB0aGVuAGNhdGNoAGZpbmFsbHkAQcDkAAtmIDIAAAMAAAACAAAAjgAAACUyAAADAAAAAQAAAI8AAAArMgAAAwAAAAEAAACQAAAA9SkAAAEDAAAsDgAAAAAAAHJlc29sdmUAcmVqZWN0AGFsbABhbGxTZXR0bGVkAGFueQByYWNlAEGw5QAL1gGAMgAAAwAAAAEBAACRAAAAiDIAAAMAAQABAQAAkQAAAI8yAAADAAAAAQEAAJIAAACTMgAAAwABAAEBAACSAAAAnjIAAAMAAgABAQAAkgAAAKIyAAADAAAAAQAAAJMAAADPKQAAAQEAAIAAAAAAAAAAcmVqZWN0ZWQAZnVsZmlsbGVkAGFzeW5jIABmdW5jdGlvbgAgYW5vbnltb3VzKAAKKSB7CgAKfSkAAAAAAAAAAPUpAAABAwAANA4AAAAAAABbU3ltYm9sLmFzeW5jSXRlcmF0b3JdAEGQ5wALkwhwMwAAAwAAAAAAAACUAAAAcmV0dXJuAHRocm93AAAAAPApAAADAAAAAQEAAJUAAACgMwAAAwABAAEBAACVAAAApzMAAAMAAgABAQAAlQ
 
AAAG5vdCBhbiBBc3luYy1mcm9tLVN5bmMgSXRlcmF0b3IAQXN5bmNHZW5lcmF0b3IAAPApAAADAAAAAQEAAJYAAACgMwAAAwABAAEBAACWAAAApzMAAAMAAgABAQAAlgAAAPUpAAABAwAAADQAAAAAAABub3QgYW4gQXN5bmNHZW5lcmF0b3Igb2JqZWN0AEpTX0lzVW5kZWZpbmVkKGZ1bmNfcmV0KQBqc19hc3luY19nZW5lcmF0b3JfcmVzdW1lX25leHQAcy0+c3RhdGUgPT0gSlNfQVNZTkNfR0VORVJBVE9SX1NUQVRFX0FXQUlUSU5HX1JFVFVSTiB8fCBzLT5zdGF0ZSA9PSBKU19BU1lOQ19HRU5FUkFUT1JfU1RBVEVfQ09NUExFVEVEAGpzX2FzeW5jX2dlbmVyYXRvcl9yZXNvbHZlX2Z1bmN0aW9uAHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9FWEVDVVRJTkcAAPUpAAABAwAAQg4AAAAAAAB2YWx1ZU9mAFtTeW1ib2wudG9QcmltaXRpdmVdAHRvVVRDU3RyaW5nAHRvR01UU3RyaW5nAHRvSVNPU3RyaW5nAHRvRGF0ZVN0cmluZwB0b1RpbWVTdHJpbmcAdG9Mb2NhbGVTdHJpbmcAdG9Mb2NhbGVEYXRlU3RyaW5nAHRvTG9jYWxlVGltZVN0cmluZwBnZXRUaW1lem9uZU9mZnNldABnZXRUaW1lAGdldFllYXIAZ2V0RnVsbFllYXIAZ2V0VVRDRnVsbFllYXIAZ2V0TW9udGgAZ2V0VVRDTW9udGgAZ2V0RGF0ZQBnZXRVVENEYXRlAGdldEhvdXJzAGdldFVUQ0hvdXJzAGdldE1pbnV0ZXMAZ2V0VVRDTWludXRlcwBnZXRTZWNvbmRzAGdldFVUQ1NlY29uZHMAZ2V0TWlsbGlzZWNvbmRzAGdldFVUQ01pbGxpc2V
 
jb25kcwBnZXREYXkAZ2V0VVRDRGF5AHNldFRpbWUAc2V0TWlsbGlzZWNvbmRzAHNldFVUQ01pbGxpc2Vjb25kcwBzZXRTZWNvbmRzAHNldFVUQ1NlY29uZHMAc2V0TWludXRlcwBzZXRVVENNaW51dGVzAHNldEhvdXJzAHNldFVUQ0hvdXJzAHNldERhdGUAc2V0VVRDRGF0ZQBzZXRNb250aABzZXRVVENNb250aABzZXRZZWFyAHNldEZ1bGxZZWFyAHNldFVUQ0Z1bGxZZWFyAHRvSlNPTgBBsO8AC7YGcDUAAAMAAAAAAAAAlwAAANwnAAADABMAAAEAAJgAAAB4NQAAAwAAAAEAAACZAAAAjTUAAAMAAwAAAQAAmAAAAJk1AAADCQAAjTUAAP////+lNQAAAwAjAAABAACYAAAAsTUAAAMAEQAAAQAAmAAAAL41AAADABIAAAEAAJgAAADLNQAAAwAzAAABAACYAAAA2jUAAAMAMQAAAQAAmAAAAO01AAADADIAAAEAAJgAAAAANgAAAwAAAAAAAACaAAAAEjYAAAMAAAAAAAAAlwAAABo2AAADAAEBAAEAAJsAAAAiNgAAAwABAAABAACbAAAALjYAAAMAAAAAAQAAmwAAAD02AAADABEAAAEAAJsAAABGNgAAAwAQAAABAACbAAAAUjYAAAMAIQAAAQAAmwAAAFo2AAADACAAAAEAAJsAAABlNgAAAwAxAAABAACbAAAAbjYAAAMAMAAAAQAAmwAAAHo2AAADAEEAAAEAAJsAAACFNgAAAwBAAAABAACbAAAAkzYAAAMAUQAAAQAAmwAAAJ42AAADAFAAAAEAAJsAAACsNgAAAwBhAAABAACbAAAAvDYAAAMAYAAAAQAAmwAAAM82AAADAHEAAAEAAJsAAADWNgAAAwBwAAABAACbAAAA4DYAAAMAAAABAAAAnAAAAOg2AAADAHEGAQEAAJ0AAAD4NgAAAwBwBgEB
 
AACdAAAACzcAAAMAcQUCAQAAnQAAABY3AAADAHAFAgEAAJ0AAAAkNwAAAwBxBAMBAACdAAAALzcAAAMAcAQDAQAAnQAAAD03AAADAHEDBAEAAJ0AAABGNwAAAwBwAwQBAACdAAAAUjcAAAMAMQIBAQAAnQAAAFo3AAADADACAQEAAJ0AAABlNwAAAwAxAQIBAACdAAAAbjcAAAMAMAECAQAAnQAAAHo3AAADAAAAAQAAAJ4AAACCNwAAAwAxAAMBAACdAAAAjjcAAAMAMAADAQAAnQAAAJ03AAADAAAAAQAAAJ8AAABub3QgYSBEYXRlIG9iamVjdABEYXRlIHZhbHVlIGlzIE5hTgBJbnZhbGlkIERhdGUAJS4zcywgJTAyZCAlLjNzICUwKmQgAEHw9QALFVN1bk1vblR1ZVdlZFRodUZyaVNhdABBkPYAC6IBSmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjACUuM3MgJS4zcyAlMDJkICUwKmQAJTA0ZAAlKzA3ZAAtJTAyZC0lMDJkVAAlMDJkLyUwMmQvJTAqZAAlMDJkOiUwMmQ6JTAyZCBHTVQAJTAyZCUwMmQAJTAyZDolMDJkOiUwMmQuJTAzZFoAJTAyZDolMDJkOiUwMmQgJWNNAEHA9wALZB8AAAAcAAAAHwAAAB4AAAAfAAAAHgAAAB8AAAAfAAAAHgAAAB8AAAAeAAAAHwAAAGludmFsaWQgaGludABvYmplY3QgbmVlZHMgdG9JU09TdHJpbmcgbWV0aG9kAG5vdwBVVEMAQbD4AAugLB08AAADAAAAAAAAAKAAAADAKwAAAwAAAAEAAAChAAAAITwAAAMAAAAHAAAAogAAAHNmICE9IE5VTEwAX19KU19FdmFsSW50ZXJuYWwASlNfVkFMVUVfR0VUX1RBRyhzZi0+Y3VyX2Z1bmMpID09IEpTX1RBR19PQkpFQ1QAanNfY2xhc3Nfa
 
GFzX2J5dGVjb2RlKHAtPmNsYXNzX2lkKQBpbnZhbGlkIGZpcnN0IGNoYXJhY3RlciBvZiBwcml2YXRlIG5hbWUAb2N0YWwgbGl0ZXJhbHMgYXJlIGRlcHJlY2F0ZWQgaW4gc3RyaWN0IG1vZGUAaW52YWxpZCBudW1iZXIgbGl0ZXJhbAAlLipzAHVzZSBzdHJpY3QAdXNlIHN0cmlwAHRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcwBmdW5jdGlvbiBuYW1lIGV4cGVjdGVkAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyIGluIG1vZHVsZSBjb2RlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyAG1pc3NpbmcgZm9ybWFsIHBhcmFtZXRlcgBpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGdldHRlciBvciBzZXR0ZXIAJyVzJyBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAaW52YWxpZCByZWRlZmluaXRpb24gb2YgbGV4aWNhbCBpZGVudGlmaWVyAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIHBhcmFtZXRlciBuYW1lAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGEgdmFyaWFibGUAdW5leHBlY3RlZCBlbmQgb2YgcmVnZXhwAHVuZXhwZWN0ZWQgbGluZSB0ZXJtaW5hdG9yIGluIHJlZ2V4cAB1bmV4cGVjdGVkIGVsbGlwc2lzIHRva2VuAGFzc2lnbm1lbnQgcmVzdCBwcm9wZXJ0eSBtdXN0IGJlIGxhc3QAaW52YWxpZCBkZXN0cnVjdHVyaW5nIHRhcmdldABtaXNzaW5nIGJpbmRpbmcgcGF0dGVybi4uLgByZXN0IGVsZW1lbnQgY2Fubm90IGhhdmUgYSBkZWZhdWx0IHZhbH
 
VlAHJlc3QgZWxlbWVudCBtdXN0IGJlIHRoZSBsYXN0IG9uZQBpbnZhbGlkIGFzc2lnbm1lbnQgc3ludGF4AHRvbyBjb21wbGljYXRlZCBkZXN0cnVjdHVyaW5nIGV4cHJlc3Npb24AUmVnRXhwIGFyZSBub3Qgc3VwcG9ydGVkACdhcmd1bWVudHMnIGlkZW50aWZpZXIgaXMgbm90IGFsbG93ZWQgaW4gY2xhc3MgZmllbGQgaW5pdGlhbGl6ZXIAZXhwZWN0aW5nIHRhcmdldABuZXcudGFyZ2V0IG9ubHkgYWxsb3dlZCB3aXRoaW4gZnVuY3Rpb25zAHN1cGVyKCkgaXMgb25seSB2YWxpZCBpbiBhIGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IAJ3N1cGVyJyBpcyBvbmx5IHZhbGlkIGluIGEgbWV0aG9kAGludmFsaWQgdXNlIG9mICdzdXBlcicAbWV0YSBleHBlY3RlZABpbXBvcnQubWV0YSBvbmx5IHZhbGlkIGluIG1vZHVsZSBjb2RlAGludmFsaWQgdXNlIG9mICdpbXBvcnQoKScAdW5leHBlY3RlZCB0b2tlbiBpbiBleHByZXNzaW9uOiAnJS4qcycAdGVtcGxhdGUgbGl0ZXJhbCBjYW5ub3QgYXBwZWFyIGluIGFuIG9wdGlvbmFsIGNoYWluAFRvbyBtYW55IGNhbGwgYXJndW1lbnRzAHByaXZhdGUgY2xhc3MgZmllbGQgZm9yYmlkZGVuIGFmdGVyIHN1cGVyAGV4cGVjdGluZyBmaWVsZCBuYW1lAGV4cGVjdGVkICd9JyBhZnRlciB0ZW1wbGF0ZSBleHByZXNzaW9uAGNsYXNzIHN0YXRlbWVudCByZXF1aXJlcyBhIG5hbWUAaW52YWxpZCBtZXRob2QgbmFtZQBpbnZhbGlkIGZpZWxkIG5hbWUAcHJvcGVydHkgY29uc3RydWN0b3I
 
gYXBwZWFycyBtb3JlIHRoYW4gb25jZQBwcml2YXRlIGNsYXNzIGZpZWxkIGlzIGFscmVhZHkgZGVmaW5lZAA8c2V0PgBmZC0+Ynl0ZV9jb2RlLmJ1ZltkZWZpbmVfY2xhc3NfcG9zXSA9PSBPUF9kZWZpbmVfY2xhc3MAc2V0X29iamVjdF9uYW1lX2NvbXB1dGVkACgpe3N1cGVyKC4uLmFyZ3VtZW50cyk7fQAoKXt9AGR1cGxpY2F0ZSBfX3Byb3RvX18gcHJvcGVydHkgbmFtZQB1bmV4cGVjdGVkICd5aWVsZCcga2V5d29yZAB5aWVsZCBpbiBkZWZhdWx0IGV4cHJlc3Npb24AmpucnZ6goaKtrq+fY2Fubm90IG1peCA/PyB3aXRoICYmIG9yIHx8AHVuZXhwZWN0ZWQgJ2F3YWl0JyBrZXl3b3JkAGF3YWl0IGluIGRlZmF1bHQgZXhwcmVzc2lvbgB1bnBhcmVudGhlc2l6ZWQgdW5hcnkgZXhwcmVzc2lvbiBjYW4ndCBhcHBlYXIgb24gdGhlIGxlZnQtaGFuZCBzaWRlIG9mICcqKicAY2Fubm90IGRlbGV0ZSBhIGRpcmVjdCByZWZlcmVuY2UgaW4gc3RyaWN0IG1vZGUAY2Fubm90IGRlbGV0ZSBhIHByaXZhdGUgY2xhc3MgZmllbGQAaW52YWxpZCBsdmFsdWUgaW4gc3RyaWN0IG1vZGUAaW52YWxpZCBmb3IgaW4vb2YgbGVmdCBoYW5kLXNpZGUAaW52YWxpZCBpbmNyZW1lbnQvZGVjcmVtZW50IG9wZXJhbmQAaW52YWxpZCBhc3NpZ25tZW50IGxlZnQtaGFuZCBzaWRlAGxhYmVsID49IDAgJiYgbGFiZWwgPCBzLT5sYWJlbF9jb3VudAB1cGRhdGVfbGFiZWwAbHMtPnJlZl9jb3VudCA+PSAwAGludmFsaWQgcHJvcGVydHkgbmFtZQBk
 
dXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dAB5aWVsZCBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAaW52YWxpZCB2YXJpYWJsZSBuYW1lIGluIHN0cmljdCBtb2RlAGludmFsaWQgbGV4aWNhbCB2YXJpYWJsZSBuYW1lAHNwZWNpYWwgPT0gUFVUX0xWQUxVRV9OT0tFRVAgfHwgc3BlY2lhbCA9PSBQVVRfTFZBTFVFX05PS0VFUF9ERVBUSABwdXRfbHZhbHVlAHNldF9vYmplY3RfbmFtZQAidXNlIHN0cmljdCIgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gd2l0aCBkZWZhdWx0IG9yIGRlc3RydWN0dXJpbmcgcGFyYW1ldGVyAGludmFsaWQgZnVuY3Rpb24gbmFtZSBpbiBzdHJpY3QgY29kZQBpbnZhbGlkIGFyZ3VtZW50IG5hbWUgaW4gc3RyaWN0IGNvZGUAZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABpZGVudGlmaWVyIGV4cGVjdGVkAGludmFsaWQgZXhwb3J0IHN5bnRheABmcm9tIGNsYXVzZSBleHBlY3RlZAAnbGV0JyBpcyBub3QgYSB2YWxpZCBsZXhpY2FsIGlkZW50aWZpZXIAbWlzc2luZyBpbml0aWFsaXplciBmb3IgY29uc3QgdmFyaWFibGUAdmFyaWFibGUgbmFtZSBleHBlY3RlZABleHBlY3RpbmcgJ2FzJwBpbnZhbGlkIGltcG9ydCBiaW5kaW5nAGR1cGxpY2F0ZSBpbXBvcnQgYmluZGluZwB0b28gbWFueSBjbG9zdXJlIHZhcmlhYmxlcwBkdXBsaWNhdGUgbGFiZWwgbmFtZQByZXR1cm4gbm90IGluIGEgZnVuY3Rpb
 
24AbGluZSB0ZXJtaW5hdG9yIG5vdCBhbGxvd2VkIGFmdGVyIHRocm93AGxleGljYWwgZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAZm9yIGF3YWl0IGlzIG9ubHkgdmFsaWQgaW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9ucwBkdXBsaWNhdGUgZGVmYXVsdABpbnZhbGlkIHN3aXRjaCBzdGF0ZW1lbnQAZXhwZWN0aW5nIGNhdGNoIG9yIGZpbmFsbHkAaW52YWxpZCBrZXl3b3JkOiB3aXRoAGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGNsYXNzIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0ACdmb3IgYXdhaXQnIGxvb3Agc2hvdWxkIGJlIHVzZWQgd2l0aCAnb2YnAGEgZGVjbGFyYXRpb24gaW4gdGhlIGhlYWQgb2YgYSBmb3ItJXMgbG9vcCBjYW4ndCBoYXZlIGFuIGluaXRpYWxpemVyAG9mAGluAGV4cGVjdGVkICdvZicgb3IgJ2luJyBpbiBmb3IgY29udHJvbCBleHByZXNzaW9uAGNvbnRpbnVlIG11c3QgYmUgaW5zaWRlIGxvb3AAYnJlYWsgbXVzdCBiZSBpbnNpZGUgbG9vcCBvciBzd2l0Y2gAYnJlYWsvY29udGludWUgbGFiZWwgbm90IGZvdW5kAHVuc3VwcG9ydGVkIGtleXdvcmQ6ICVzAGNwb29sX2lkeCA+PSAwAGpzX2NyZWF0ZV9mdW5jdGlvbgBzLT5pc19ldmFsIHx8IHMtPmNsb3N1cmVfdmFyX2NvdW50ID09IDAAYWRkX2V2YWxfdmFyaWFibGVzAG
 
V4cG9ydGVkIHZhcmlhYmxlICclcycgZG9lcyBub3QgZXhpc3QAcmVzb2x2ZV92YXJpYWJsZXMAbGFiMSA+PSAwICYmIGxhYjEgPCBzLT5sYWJlbF9jb3VudABiY19idWZbcG9zXSA9PSBPUF9sYWJlbABvcHRpbWl6ZV9zY29wZV9tYWtlX3JlZgBvcHRpbWl6ZV9zY29wZV9tYWtlX2dsb2JhbF9yZWYAdmFyX2tpbmQgIT0gSlNfVkFSX05PUk1BTAByZXNvbHZlX3Njb3BlX3ByaXZhdGVfZmllbGQAdmFyX2tpbmQgPT0gSlNfVkFSX1BSSVZBVEVfU0VUVEVSAHVuZGVmaW5lZCBwcml2YXRlIGZpZWxkICclcycAcy0+bGFiZWxfc2xvdHNbbGFiZWxdLmZpcnN0X3JlbG9jID09IE5VTEwAc2tpcF9kZWFkX2NvZGUAcmVzb2x2ZV9sYWJlbHMAbHMtPmFkZHIgPT0gLTEAZGlmZiA9PSAoaW50MTZfdClkaWZmAGRpZmYgPT0gKGludDhfdClkaWZmAGxhYmVsX3Nsb3RzW2ldLmZpcnN0X3JlbG9jID09IE5VTEwAZmluZF9qdW1wX3RhcmdldABpbnZhbGlkIG9wY29kZSAob3A9JWQsIHBjPSVkKQBieXRlY29kZSBidWZmZXIgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgdW5kZXJmbG93IChvcD0lZCwgcGM9JWQpAHN0YWNrIG92ZXJmbG93IChvcD0lZCwgcGM9JWQpAHVuY29uc2lzdGVudCBzdGFjayBzaXplOiAlZCAlZCAocGM9JWQpAG5hbWUAbWVzc2FnZQAAAADcJwAAAwAAAAAAAACjAAAA0E0AAAMDAABuDgAAAAAAANVNAAADAwAAvgoAAAAAAAA6IABpbnZhbGlkIHByb3BlcnR5IGFjY2VzcwBwcm94eSBwcmV2ZW50RXh0ZW5
 
zaW9ucyBoYW5kbGVyIHJldHVybmVkIGZhbHNlAGNyZWF0ZQBnZXRQcm90b3R5cGVPZgBzZXRQcm90b3R5cGVPZgBkZWZpbmVQcm9wZXJ0eQBkZWZpbmVQcm9wZXJ0aWVzAGdldE93blByb3BlcnR5TmFtZXMAZ2V0T3duUHJvcGVydHlTeW1ib2xzAGlzRXh0ZW5zaWJsZQBwcmV2ZW50RXh0ZW5zaW9ucwBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycwBpcwBhc3NpZ24Ac2VhbABmcmVlemUAaXNTZWFsZWQAaXNGcm96ZW4AX19nZXRDbGFzcwBmcm9tRW50cmllcwAAAAAAAABaTgAAAwAAAAIAAACkAAAAYU4AAAMAAAABAQAApQAAAHBOAAADAAAAAgAAAKYAAAB/TgAAAwAAAAMBAACnAAAAjk4AAAMAAAACAAAAqAAAAJ9OAAADAAAAAQAAAKkAAACzTgAAAwAAAAEAAACqAAAAnS4AAAMAAAABAQAAqwAAAJYuAAADAAEAAQEAAKsAAACiLgAAAwACAAEBAACrAAAAyU4AAAMAAAABAQAArAAAANZOAAADAAAAAQEAAK0AAADoTgAAAwAAAAIBAACuAAAAAU8AAAMAAAABAAAArwAAABtPAAADAAAAAgAAALAAAAAeTwAAAwAAAAIAAACxAAAAJU8AAAMAAAABAQAAsgAAACpPAAADAAEAAQEAALIAAAAxTwAAAwAAAAEBAACzAAAAOk8AAAMAAQABAQAAswAAAENPAAADAAAAAQAAALQAAABOTwAAAwAAAAEAAAC1AAAAbm90IGEgcHJvdG90eXBlAGhhc093blByb3BlcnR5AGlzUHJvdG90eXBlT2YAcHJvcGVydHlJc0VudW1lcmFibGUAX19wcm90b19fAF9fZGVmaW5lR2V0dGVyX18AX19kZWZpbmVTZXR0
 
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
 
2QAwgdsAQALcAEAC3gAAgd8AUAPiAFCD4wBQA+UAQJDmAACB7gBAEu8AtAH4AFCD+ABAAvoAMAH7ADCB+wBAKPwAMAEQAUASEQExAR0BQIIdATCBHgExAR8BAYIfAUCCIAEwgSEBMAEiATCBIgFACiMBAQEoAQGBKAEBASkBAIEpAQABKgEAAisBAIEsAQCBLQEBAS4BAAEwAQGBMAEAgTEBAYEyAQEBMwEAATQBAIE0AQEBNQEBgTUBAQE2AQCBNwEBgTgBAAE5AQCBOgEBgT4BAAFAAQEBQQEAgUEBAYFDAQABRAEAgUQBAAJFAQABRgEAAUkBAYFOAQEBTwFzgaIBQAS4AUACuwEAg70BMIG/ATABwwEwA8QBMAHGATACxwHQAcgBMJHIATCJ0QEAAdYBAIPWAdMB2AEAkdgBcwHhAQCJ4QEAAeYBAILmATCB5wFzAegBc4HoAXOB6gFzAesBAIHrAUAY7AFzAfgBc4H4AQAB+QEAgfkBoAH6AXOB+gFAgvsBMIH8AUAC/QEwg/4BMBAAAjAgCAIAIBgCABAoAkAiMAJANkUCMAFgAkCOYAIAgWcCQGBoAjCmmAIAprACtYHDAjEmUAgxgWMIMYFmCAAraAgAg34IEVDQCRAG+AkgBvwJdAFADnSBQA50AUEOdIFBDnQBQg50gUIOdAFDDoCBQw6AAUQOMCtIDjCDXg4BgbwOAYG+DgEBxw5AfgAPQBg/D7UBSw+2gUsPtgFMD7aBTA+3AU0PgIFNDzABTw9AYFAPAAiADzAIhA8ABogPMAaMDwAIkA8wCJQPAAiYDzAInA8ABqAPMAakD7ABqA8AgagP0wGpDwCBqQ/TAaoPAIGqD9MBqw8AgasPMIGsDzCBrQ8wga4PMIGvDwAIsA8wCLQPAAK4DwAEuQ8AArsPAQK8DwECvQ8BAr4PtwjAD2cIxA+4CMgPaAjMD7gI0A9oCNQPAALYD7kB2Q+xgdkPuQHaD7EB2w/Xg
 
dsPMALcDzAC3Q9hAd4PcwHfD7kB4Q+ygeEPugHiD7IB4w/YgeMPMATkD2IB5g8AAugP0AHpD9CB6Q+wAesP0IHrDzAC7A8wAu0PAQLwD9MB8Q/TgfEPugHyDwGB8g+wAfMP04HzDzAC9A8wAvUPMQH2D7oB+Q+ygfkPuwH6D7IB+w/ZgfsPMAL8DzAC/Q9iAf4PoAGTEKABlRCggZUQMQGZEAEBpxAxELAQARC4EECCwRAxGlsSARpoEjEvABYBLxgWQAIwFjABMRYwgTEWMAEyFgCBMhYAATMWQIYzFjCBNhYwATcWMIE3FjABOBZAAjkWQII6FjACPxZAZEAWQIR1FkACeRYAJoAWAIGTFgCBlhZALiBTQBxAU0AOkVNAPplTQIS8UzCBvlNACr9TQILFUzCBxlNABMhTAQHKU0AUy1MwAdVTMIHVUzAB1lMwgdZTMAHXUzAB2FMwgdhTMAHZUzGB2VNADNpTQALhUzEB4lMwgeJTMAHjU0CE41NAgvpTAYGpVSBQuFWyAYB9soGAfbIBgX3agYF92gGCfbOBgn2zAYN9u4GJfbsBin27gYp9vAGLfbuBi30xmpB/AZqgfzEoAIIBKBSCMSRYggEkbIIxM0CGATNghjEgUIwBIGCMMSAgtwEgMLcxIoD0ASKR9ABB8PIBC+MDAQCcBgdNAwQQAI8LAAARAAgAU0pRAFIAUwA6VFUAV1k/XVwARmFjQmQAZgBoAGoAbABuAABAAAAAABoAkwAAIDUAJwAhACQiKgATa20AJiQnFBYYGxw+Hj8fOT0iIUEeQCUlJiggKkksQy5LMEwyREKZAACVj31+g4QSgIJ2dxJ7o3x4eYqSmKaghQCaoZN1M5UAjgB0mZiXlgAAngCcAKGgFS4vMLS1TqqpEhQeISIiKjQ1pqc2H0oAAJcBWtodNgUAxMPGxcjHysnMy8TVRdZC10bYztDS1NrZ7vb+DgcPgJ8AIYCj7QDAQMZg59vmmc
 
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
 
iJQaGNRdWG7DSJUpWJbAUFQO8AQdCMAgujEvoGAIQJAPAKAHAMAPQNAEoQIBoYIHQbIN0gAAyoAFqqIBr/AK0OATgSIcEVIeUZIaodIYzRQUrhIfABDgAAAABBZGxhbSxBZGxtAEFob20sQWhvbQBBbmF0b2xpYW5fSGllcm9nbHlwaHMsSGx1dwBBcmFiaWMsQXJhYgBBcm1lbmlhbixBcm1uAEF2ZXN0YW4sQXZzdABCYWxpbmVzZSxCYWxpAEJhbXVtLEJhbXUAQmFzc2FfVmFoLEJhc3MAQmF0YWssQmF0awBCZW5nYWxpLEJlbmcAQmhhaWtzdWtpLEJoa3MAQm9wb21vZm8sQm9wbwBCcmFobWksQnJhaABCcmFpbGxlLEJyYWkAQnVnaW5lc2UsQnVnaQBCdWhpZCxCdWhkAENhbmFkaWFuX0Fib3JpZ2luYWwsQ2FucwBDYXJpYW4sQ2FyaQBDYXVjYXNpYW5fQWxiYW5pYW4sQWdoYgBDaGFrbWEsQ2FrbQBDaGFtLENoYW0AQ2hlcm9rZWUsQ2hlcgBDaG9yYXNtaWFuLENocnMAQ29tbW9uLFp5eXkAQ29wdGljLENvcHQsUWFhYwBDdW5laWZvcm0sWHN1eABDeXByaW90LENwcnQAQ3lyaWxsaWMsQ3lybABEZXNlcmV0LERzcnQARGV2YW5hZ2FyaSxEZXZhAERpdmVzX0FrdXJ1LERpYWsARG9ncmEsRG9ncgBEdXBsb3lhbixEdXBsAEVneXB0aWFuX0hpZXJvZ2x5cGhzLEVneXAARWxiYXNhbixFbGJhAEVseW1haWMsRWx5bQBFdGhpb3BpYyxFdGhpAEdlb3JnaWFuLEdlb3IAR2xhZ29saXRpYyxHbGFnAEdvdGhpYyxHb3RoAEdyYW50aGEsR3JhbgBHcmVlayxHcmVrAEd1amFyYXRpLEd1anIAR3VuamFsYV9Hb25kaSxHb25nAEd1cm11a2h
 
pLEd1cnUASGFuLEhhbmkASGFuZ3VsLEhhbmcASGFuaWZpX1JvaGluZ3lhLFJvaGcASGFudW5vbyxIYW5vAEhhdHJhbixIYXRyAEhlYnJldyxIZWJyAEhpcmFnYW5hLEhpcmEASW1wZXJpYWxfQXJhbWFpYyxBcm1pAEluaGVyaXRlZCxaaW5oLFFhYWkASW5zY3JpcHRpb25hbF9QYWhsYXZpLFBobGkASW5zY3JpcHRpb25hbF9QYXJ0aGlhbixQcnRpAEphdmFuZXNlLEphdmEAS2FpdGhpLEt0aGkAS2FubmFkYSxLbmRhAEthdGFrYW5hLEthbmEAS2F5YWhfTGksS2FsaQBLaGFyb3NodGhpLEtoYXIAS2htZXIsS2htcgBLaG9qa2ksS2hvagBLaGl0YW5fU21hbGxfU2NyaXB0LEtpdHMAS2h1ZGF3YWRpLFNpbmQATGFvLExhb28ATGF0aW4sTGF0bgBMZXBjaGEsTGVwYwBMaW1idSxMaW1iAExpbmVhcl9BLExpbmEATGluZWFyX0IsTGluYgBMaXN1LExpc3UATHljaWFuLEx5Y2kATHlkaWFuLEx5ZGkATWFrYXNhcixNYWthAE1haGFqYW5pLE1haGoATWFsYXlhbGFtLE1seW0ATWFuZGFpYyxNYW5kAE1hbmljaGFlYW4sTWFuaQBNYXJjaGVuLE1hcmMATWFzYXJhbV9Hb25kaSxHb25tAE1lZGVmYWlkcmluLE1lZGYATWVldGVpX01heWVrLE10ZWkATWVuZGVfS2lrYWt1aSxNZW5kAE1lcm9pdGljX0N1cnNpdmUsTWVyYwBNZXJvaXRpY19IaWVyb2dseXBocyxNZXJvAE1pYW8sUGxyZABNb2RpLE1vZGkATW9uZ29saWFuLE1vbmcATXJvLE1yb28ATXVsdGFuaSxNdWx0AE15YW5tYXIsTXltcgBOYWJhdGFlYW4sTmJhdABOYW5kaW5hZ2Fy
 
aSxOYW5kAE5ld19UYWlfTHVlLFRhbHUATmV3YSxOZXdhAE5rbyxOa29vAE51c2h1LE5zaHUATnlpYWtlbmdfUHVhY2h1ZV9IbW9uZyxIbW5wAE9naGFtLE9nYW0AT2xfQ2hpa2ksT2xjawBPbGRfSHVuZ2FyaWFuLEh1bmcAT2xkX0l0YWxpYyxJdGFsAE9sZF9Ob3J0aF9BcmFiaWFuLE5hcmIAT2xkX1Blcm1pYyxQZXJtAE9sZF9QZXJzaWFuLFhwZW8AT2xkX1NvZ2RpYW4sU29nbwBPbGRfU291dGhfQXJhYmlhbixTYXJiAE9sZF9UdXJraWMsT3JraABPcml5YSxPcnlhAE9zYWdlLE9zZ2UAT3NtYW55YSxPc21hAFBhaGF3aF9IbW9uZyxIbW5nAFBhbG15cmVuZSxQYWxtAFBhdV9DaW5fSGF1LFBhdWMAUGhhZ3NfUGEsUGhhZwBQaG9lbmljaWFuLFBobngAUHNhbHRlcl9QYWhsYXZpLFBobHAAUmVqYW5nLFJqbmcAUnVuaWMsUnVucgBTYW1hcml0YW4sU2FtcgBTYXVyYXNodHJhLFNhdXIAU2hhcmFkYSxTaHJkAFNoYXZpYW4sU2hhdwBTaWRkaGFtLFNpZGQAU2lnbldyaXRpbmcsU2dudwBTaW5oYWxhLFNpbmgAU29nZGlhbixTb2dkAFNvcmFfU29tcGVuZyxTb3JhAFNveW9tYm8sU295bwBTdW5kYW5lc2UsU3VuZABTeWxvdGlfTmFncmksU3lsbwBTeXJpYWMsU3lyYwBUYWdhbG9nLFRnbGcAVGFnYmFud2EsVGFnYgBUYWlfTGUsVGFsZQBUYWlfVGhhbSxMYW5hAFRhaV9WaWV0LFRhdnQAVGFrcmksVGFrcgBUYW1pbCxUYW1sAFRhbmd1dCxUYW5nAFRlbHVndSxUZWx1AFRoYWFuYSxUaGFhAFRoYWksVGhhaQBUaWJldGFuLFRpY
 
nQAVGlmaW5hZ2gsVGZuZwBUaXJodXRhLFRpcmgAVWdhcml0aWMsVWdhcgBWYWksVmFpaQBXYW5jaG8sV2NobwBXYXJhbmdfQ2l0aSxXYXJhAFllemlkaSxZZXppAFlpLFlpaWkAWmFuYWJhemFyX1NxdWFyZSxaYW5iAEGAnwILsRTAGZlFhRmZRa4ZgEWOGYBFhBmWRYAZnkWAGeFgRaYZhEWEGYENkxngDzeDK4AZgisBgyuAGYArA4ArgBmAK4AZgisAgCsAkysAviuNGo8r4CQdgTfgSB0ApQUBsQUBggUAtjQHmjQDhTQKhASAGYUEgBmNBIAZgAQAgASAGZ8EgBmJBIo3mQSAN+ALBIAZoQSNhwC7hwGCh68EsZENumMBgmOtewGOewCbUAGAUACKhzSUBACRBAqOBIAZnATQH4M3jh+BGZkfgwsAhwsBgQsBlQsAhgsAgAsCgwsBiAsBgQsBgwsHgAsDgQsAhAsBmAsBgi4AhS4DgS4BlS4Ahi4AgS4AgS4AgS4BgC4AhC4DgS4Bgi4CgC4Ggy4AgC4GkC4JgiwAiCwAgiwAlSwAhiwAgSwAhCwBiSwAgiwAgiwBgCwOgywBiywGhiwAgnAAh3ABgXABlXAAhnAAgXAAhHABiHABgXABgnAGgnADgXAAhHABkXAJgY4AhY4Cgo4Ag44CgY4AgI4AgY4CgY4Cgo4Ci44DhI4Cgo4Ag44BgI4FgI4NlI4EjJAAgpAAlpAAj5ACh5AAgpAAg5AGgZAAgpAEg5ABiZAGiJCMPACCPACWPACJPACEPAGIPACCPACDPAaBPAaAPACDPAGJPACBPAyMTwCCTwCyTwCCTwCFTwOPTwGZTwCCgQCRgQKXgQCIgQCAgQGGgQKAgQOFgQCAgQCHgQWJgQGCgQu5kgOAGZuSJIFEAIBEAIREAJdEAIBEAJZEAYREAIBEAIVEAYlEAYNEH8eTAKOTA6aTAKOTAI6TAIaTgxmBkyTgP1
 
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
 
R0ZXJfTnVtYmVyAE5vLE90aGVyX051bWJlcgBTbSxNYXRoX1N5bWJvbABTYyxDdXJyZW5jeV9TeW1ib2wAU2ssTW9kaWZpZXJfU3ltYm9sAFNvLE90aGVyX1N5bWJvbABQYyxDb25uZWN0b3JfUHVuY3R1YXRpb24AUGQsRGFzaF9QdW5jdHVhdGlvbgBQcyxPcGVuX1B1bmN0dWF0aW9uAFBlLENsb3NlX1B1bmN0dWF0aW9uAFBpLEluaXRpYWxfUHVuY3R1YXRpb24AUGYsRmluYWxfUHVuY3R1YXRpb24AUG8sT3RoZXJfUHVuY3R1YXRpb24AWnMsU3BhY2VfU2VwYXJhdG9yAFpsLExpbmVfU2VwYXJhdG9yAFpwLFBhcmFncmFwaF9TZXBhcmF0b3IAQ2MsQ29udHJvbCxjbnRybABDZixGb3JtYXQAQ3MsU3Vycm9nYXRlAENvLFByaXZhdGVfVXNlAExDLENhc2VkX0xldHRlcgBMLExldHRlcgBNLE1hcmssQ29tYmluaW5nX01hcmsATixOdW1iZXIAUyxTeW1ib2wAUCxQdW5jdHVhdGlvbixwdW5jdABaLFNlcGFyYXRvcgBDLE90aGVyAEGAvwILsAgOAAAAPgAAAMABAAAADgAAAPAAAAAAfwAAAIADAQAAPEFTQ0lJX0hleF9EaWdpdCxBSGV4AEJpZGlfQ29udHJvbCxCaWRpX0MARGFzaABEZXByZWNhdGVkLERlcABEaWFjcml0aWMsRGlhAEV4dGVuZGVyLEV4dABIZXhfRGlnaXQsSGV4AElEU19CaW5hcnlfT3BlcmF0b3IsSURTQgBJRFNfVHJpbmFyeV9PcGVyYXRvcixJRFNUAElkZW9ncmFwaGljLElkZW8ASm9pbl9Db250cm9sLEpvaW5fQwBMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbixMT0UATm9uY2hhcmFjdGVyX0NvZGVfUG9pbnQ
 
sTkNoYXIAUGF0dGVybl9TeW50YXgsUGF0X1N5bgBQYXR0ZXJuX1doaXRlX1NwYWNlLFBhdF9XUwBRdW90YXRpb25fTWFyayxRTWFyawBSYWRpY2FsAFJlZ2lvbmFsX0luZGljYXRvcixSSQBTZW50ZW5jZV9UZXJtaW5hbCxTVGVybQBTb2Z0X0RvdHRlZCxTRABUZXJtaW5hbF9QdW5jdHVhdGlvbixUZXJtAFVuaWZpZWRfSWRlb2dyYXBoLFVJZGVvAFZhcmlhdGlvbl9TZWxlY3RvcixWUwBXaGl0ZV9TcGFjZSxzcGFjZQBCaWRpX01pcnJvcmVkLEJpZGlfTQBFbW9qaQBFbW9qaV9Db21wb25lbnQsRUNvbXAARW1vamlfTW9kaWZpZXIsRU1vZABFbW9qaV9Nb2RpZmllcl9CYXNlLEVCYXNlAEVtb2ppX1ByZXNlbnRhdGlvbixFUHJlcwBFeHRlbmRlZF9QaWN0b2dyYXBoaWMsRXh0UGljdABEZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50LERJAElEX1N0YXJ0LElEUwBDYXNlX0lnbm9yYWJsZSxDSQBBU0NJSQBBbHBoYWJldGljLEFscGhhAEFueQBBc3NpZ25lZABDYXNlZABDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCxDV0NGAENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkLENXQ00AQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQsQ1dMAENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQsQ1dLQ0YAQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQsQ1dUAENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkLENXVQBHcmFwaGVtZV9CYXNlLEdyX0Jhc2UAR3JhcGhlbWVfRXh0ZW5kLEdyX0V4dABJRF9Db250aW51ZSxJREMATG93ZXJjYXNlLExvd2VyAE1h
 
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
 
zQLRAtUC5wLtAvEC9QL5Av0CBQMJAw0DEwMXAxsDIwMnAysDLwM1Az0DQQNJA00DUQMLD1cDWwNfA2MDZwNrA28DcwN5A30DgQOFA4kDjQORA5UDmQOdA6ED3BClA8kDzQPZA90D4QPvA/EDPQRPBJkE8AQCBUoFZAVsBXAFcwWaBfoF/gUHBgsGFAYYBh4GIgYoBo4GlAaYBp4GogarBqwD8watA/YGrgP5Bq8D/AbMA/8GzQMCB84DBQcJBw0HEQeGAzIHNQe5AzcHOweIA1MHiQNWB5ADaweKA3cHsAOJB44DmQefB6MHjAO4B48Duwe0AL4HwAfCBxAgywcuAM0HzwcgANIH1gfbB98H5AfqB/AHIAD2BxIiAQgFCAcIHQglCCcIQwAtCDAIkAE2CDkITgBFCEcITAhOCFEIWgCpA1oAUwhXCGAIaQBiCGUIbwh0CHoIfgiiCEkApAimCKkIVgCrCK0IsAi0CFgAtgi4CLsIwAjCCMUIdgDHCMkIzAjQCHgA0gjUCNcI2wjeCOQI5wjwCPMI9gj5CAIJBgkLCQ8JFAkXCRoJIwksCTsJPglBCUQJRwlKCVYJXAlgCWIJZAloCWoJcAl4CXwJgAmGCYkJjwmRCTAAkwmZCZwJngmhCaQJYS3Na5+fpgmxCbwJxwmVCqEKFQsgACcLMQuNC6ELpQupC60LsQu1C7kLvQvBC8ULIQw1DDkMPQxBDEUMSQxNDFEMVQxZDG8McQxzDKAMvAzcDOQM7Az0DPwMBA0MDRQNIg0uDXoNgg2FDYkNjQ2dDbENtQ28DcINxg0oDiwOMA4yDjYOPA4+DkEOQw5GDncOew6JDo4OlA6cDqMOqQ60Dr4Oxg7KDs8O2Q7dDuQO7A7zDvgOBA8KDxUPGw8iDygPMw89D0UPTA9RD1cPXg9jD2kPcA92D30Pgg+JD40Png+kD6kPrQ+4D74PyQ/QD9YP2g/hD+UP7w/6DwAQBBAJEA8QExAaE
 
B8QIxApEC8QMhA2EDkQPxBFEFkQYRB5EHwQgBCVEKEQsRDDEMsQzxDaEN4Q6hDyEPQQABEFERERQRFJEU0RUxFXEVoRbhFxEXURexF9EYERhBGMEZIRlhGcEaIRqBGrEW+nrxGzEY0CuxENEgsTCRSNFJIUUBVpFW8VdRV7FYcVkxUrAJ4VthW6Fb4VwhXGFcoV3hXiFUYWXxaFFosWSRdPF1QXdBd0GHoYDhnQGXQafBqaGp8asxq9GsMa1xrcGuIa8BogGy0bNRs5G08bxhvYG9ob3BtkMR0cHxwhHCMcJRwnHEUcUxxYHGEcahx8HIUcihyqHMUcxxzJHMsczRzPHNEc0xzzHPUc9xz5HPscAh0EHQYdCB0XHRkdGx0dHR8dIR0jHSUdJx0pHSsdLR0vHTEdMx03HfQDOR0HIjsdAiI9HUUd9ANHHQciSR0CIksdUx30A1UdByJXHQIiWR1hHfQDYx0HImUdAiJnHW8d9ANxHQcicx0CInUdfx2BHYMdhR2HHYkdjx2sHS0GtB3AHSwG0B1AHkweXx5xHoQehh6KHpAelh6YHpwenh6mHqkeqx6xHrMetTC5HhEfJx8rHy0fMh9/H5AfkSChIKcgoSG/IgBBgOgCC9JHIIgghDIzIIEgpzFvMdA0MdAyM9A0QYBBgUGCQYNBiEGKAABDp0WARYFFgkWISYBJgUmCSYgAAE6DT4BPgU+CT4NPiAAAAABVgFWBVYJViFmBAAAAAGGAYYFhgmGDYYhhigAAY6dlgGWBZYJliGmAaYFpgmmIAABug2+Ab4Fvgm+Db4gAAAAAdYB1gXWCdYh5gQAAeYhBhEGGQahDgUOCQ4dDjESMRYRFhkWHRahFjEeCR4ZHh0enSIJJg0mESYZJqEmHSUppakqCS6dMgUynTIxMAABrIGtOgU6nToy8Am5PhE+GT4tSgVKnUoxTgVOCU6dTjFSnVIxVg1WEVYZVilWLVahXglmCWYhagVqHWo
 
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";if(!S(T)){var
 ka=T;T=b.locateFile?b.locateFile(ka,t):t+ka;}function la(){var a=T;try{if(a==T&&v)return new 
Uint8Array(v);if(S(a))try{var c=ma(a.slice(37)),d=new 
Uint8Array(c.length);for(a=0;a<c.length;++a)d[a]=c.charCodeAt(a);var e=d;}catch(g){throw Error("Converting 
base64 string to bytes failed.");}else e=void 0;var f=e;if(f)return f;throw"both async and sync fetching of 
the wasm failed";}catch(g){w(g);}}function na(){return v||"function"!==typeof 
fetch?Promise.resolve().then(function(){return 
la();}):fetch(T,{credentials:"same-origin"}).then(function(a){if(!a.ok)throw"failed to load wasm binary file 
at '"+T+"'";return a.arrayBuff
 er();}).catch(function(){return la();});}function V(a){for(;0<a.length;){var 
c=a.shift();if("function"==typeof c)c(b);else{var d=c.B;"number"===typeof d?void 
0===c.A?O.get(d)():O.get(d)(c.A):d(void 0===c.A?null:c.A);}}}function W(a){var 
c=L(a)+1,d=M(c);D(a,E,d,c);return d;}function oa(){}var pa=[null,[],[]];function qa(){function 
a(k){return(k=k.toTimeString().match(/\(([A-Za-z ]+)\)$/))?k[1]:"GMT";}if(!ra){ra=!0;var c=new 
Date().getFullYear(),d=new Date(c,0,1),e=new Date(c,6,1);c=d.getTimezoneOffset();var 
f=e.getTimezoneOffset(),g=Math.max(c,f);N[sa()>>2]=60*g;N[ta()>>2]=Number(c!=f);d=a(d);e=a(e);d=ba(d);e=ba(e);f<c?(N[X()>>2]=d,N[X()+4>>2]=e):(N[X()>>2]=e,N[X()+4>>2]=d);}}var
 ra;oa=(a,c,d)=>{a=H(a);c=null!==c?JSON.parse(H(c)):[];try{const e=b.externalCall(a,c);return 
e?W(e):null;}catch(e){return b.HEAPU8[d]=1,W(e.message);}};var ma="function"===typeof 
atob?atob:function(a){var c="",d=0;a=a.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var 
e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
 wxyz0123456789+/=".indexOf(a.charAt(d++));var 
f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));var 
g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));var 
k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(d++));e=e<<2|f>>4;f=(f&15)<<4|g>>2;var
 
m=(g&3)<<6|k;c+=String.fromCharCode(e);64!==g&&(c+=String.fromCharCode(f));64!==k&&(c+=String.fromCharCode(m));}while(d<a.length);return
 c;},ua={a:function(a,c,d,e){w("Assertion failed: "+H(a)+", at: "+[c?H(c):"unknown 
filename",d,e?H(e):"unknown function"]);},b:function(){w();},g:oa,f:function(a,c){a=H(a);let 
d;try{d=window.JSON.parse(a);}catch(e){d=a;}0!==c?window.alert(a):window.console.log("DUMP",d);},e:function(a){var
 c=E.length;a>>>=0;if(2147483648<a)return!1;for(var d=1;4>=d;d*=2){var 
e=c*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(a,e);0<e%65536&&(e+=65536-e%65536);a:{try{x.grow(Math.min(2147483648,e)-ca.byteLengt
 h+65535>>>16);da();var f=1;break a;}catch(g){}f=void 
0;}if(f)return!0;}return!1;},d:function(a,c,d,e){for(var f=0,g=0;g<d;g++){for(var 
k=N[c+8*g>>2],m=N[c+(8*g+4)>>2],y=0;y<m;y++){var 
l=E[k+y],p=pa[a];0===l||10===l?((1===a?aa:u)(K(p,0)),p.length=0):p.push(l);}f+=m;}N[e>>2]=f;return 
0;},c:function(a){var c=Date.now();N[a>>2]=c/1E3|0;N[a+4>>2]=c%1E3*1E3|0;return 
0;},h:function(a,c){qa();a=new 
Date(1E3*N[a>>2]);N[c>>2]=a.getSeconds();N[c+4>>2]=a.getMinutes();N[c+8>>2]=a.getHours();N[c+12>>2]=a.getDate();N[c+16>>2]=a.getMonth();N[c+20>>2]=a.getFullYear()-1900;N[c+24>>2]=a.getDay();var
 d=new 
Date(a.getFullYear(),0,1);N[c+28>>2]=(a.getTime()-d.getTime())/864E5|0;N[c+36>>2]=-(60*a.getTimezoneOffset());var
 e=new 
Date(a.getFullYear(),6,1).getTimezoneOffset();d=d.getTimezoneOffset();a=(e!=d&&a.getTimezoneOffset()==Math.min(d,e))|0;N[c+32>>2]=a;a=N[X()+(a?4:0)>>2];N[c+40>>2]=a;return
 c;},i:function(a){a=H(a);window.console.log(a);},j:function(a,c,d,e){a=H(a);c=H(c);d=H(d);d=`Quickjs -- 
${a}: $
 {c}\n${d}`;0!==e?window.alert(d):window.console.error(d);}};(function(){function 
a(f){b.asm=f.exports;x=b.asm.k;da();O=b.asm.t;fa.unshift(b.asm.l);P--;b.monitorRunDependencies&&b.monitorRunDependencies(P);0==P&&(null!==Q&&(clearInterval(Q),Q=null),R&&(f=R,R=null,f()));}function
 c(f){a(f.instance);}function d(f){return na().then(function(g){return 
WebAssembly.instantiate(g,e);}).then(f,function(g){u("failed to asynchronously prepare wasm: 
"+g);w(g);});}var 
e={a:ua};P++;b.monitorRunDependencies&&b.monitorRunDependencies(P);if(b.instantiateWasm)try{return 
b.instantiateWasm(e,a);}catch(f){return u("Module.instantiateWasm callback failed with error: 
"+f),!1;}(function(){return v||"function"!==typeof 
WebAssembly.instantiateStreaming||S(T)||"function"!==typeof 
fetch?d(c):fetch(T,{credentials:"same-origin"}).then(function(f){return 
WebAssembly.instantiateStreaming(f,e).then(c,function(g){u("wasm streaming compile failed: "+g);u("falling 
back to ArrayBuffer instantiation");return d(c);});});
 
})().catch(n);return{};})();b.___wasm_call_ctors=function(){return(b.___wasm_call_ctors=b.asm.l).apply(null,arguments);};b._evalInSandbox=function(){return(b._evalInSandbox=b.asm.m).apply(null,arguments);};b._nukeSandbox=function(){return(b._nukeSandbox=b.asm.n).apply(null,arguments);};b._init=function(){return(b._init=b.asm.o).apply(null,arguments);};b._commFun=function(){return(b._commFun=b.asm.p).apply(null,arguments);};b._dumpMemoryUse=function(){return(b._dumpMemoryUse=b.asm.q).apply(null,arguments);};var
 
M=b._malloc=function(){return(M=b._malloc=b.asm.r).apply(null,arguments);};b._free=function(){return(b._free=b.asm.s).apply(null,arguments);};var
 
X=b.__get_tzname=function(){return(X=b.__get_tzname=b.asm.u).apply(null,arguments);},ta=b.__get_daylight=function(){return(ta=b.__get_daylight=b.asm.v).apply(null,arguments);},sa=b.__get_timezone=function(){return(sa=b.__get_timezone=b.asm.w).apply(null,arguments);},G=b.stackSave=function(){return(G=b.stackSave=b.asm.x).apply(null,ar
 
guments);},I=b.stackRestore=function(){return(I=b.stackRestore=b.asm.y).apply(null,arguments);},C=b.stackAlloc=function(){return(C=b.stackAlloc=b.asm.z).apply(null,arguments);};b.ccall=B;b.cwrap=function(a,c,d,e){d=d||[];var
 f=d.every(function(g){return"number"===g;});return"string"!==c&&f&&!e?A(a):function(){return 
B(a,c,d,arguments,e);};};b.stringToNewUTF8=W;var Y;R=function va(){Y||Z();Y||(R=va);};function Z(){function 
a(){if(!Y&&(Y=!0,b.calledRun=!0,!z)){V(fa);V(ha);h(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for("function"==typeof
 b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var 
c=b.postRun.shift();ia.unshift(c);}V(ia);}}if(!(0<P)){if(b.preRun)for("function"==typeof 
b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)ja();V(ea);0<P||(b.setStatus?(b.setStatus("Running..."),setTimeout(function(){setTimeout(function(){b.setStatus("");},1);a();},1)):a());}}b.run=Z;if(b.preInit)for("function"==typeof
 b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.lengt
 h;)b.preInit.pop()();Z();return Module.ready;};}();var _default=Module;exports.default=_default;
+
+/***/ }),
+/* 2 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+class SandboxSupportBase {
+  constructor(win) {
+    this.win = win;
+    this.timeoutIds = new Map();
+    this.commFun = null;
+  }
+
+  destroy() {
+    this.commFunc = null;
+    this.timeoutIds.forEach(([_, id]) => this.win.clearTimeout(id));
+    this.timeoutIds = null;
+  }
+
+  exportValueToSandbox(val) {
+    throw new Error("Not implemented");
+  }
+
+  importValueFromSandbox(val) {
+    throw new Error("Not implemented");
+  }
+
+  createErrorForSandbox(errorMessage) {
+    throw new Error("Not implemented");
+  }
+
+  callSandboxFunction(name, args) {
+    try {
+      args = this.exportValueToSandbox(args);
+      this.commFun(name, args);
+    } catch (e) {
+      this.win.console.error(e);
+    }
+  }
+
+  createSandboxExternals() {
+    const externals = {
+      setTimeout: (callbackId, nMilliseconds) => {
+        if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") {
+          return;
+        }
+
+        const id = this.win.setTimeout(() => {
+          this.timeoutIds.delete(callbackId);
+          this.callSandboxFunction("timeoutCb", {
+            callbackId,
+            interval: false
+          });
+        }, nMilliseconds);
+        this.timeoutIds.set(callbackId, id);
+      },
+      clearTimeout: id => {
+        this.win.clearTimeout(this.timeoutIds.get(id));
+        this.timeoutIds.delete(id);
+      },
+      setInterval: (callbackId, nMilliseconds) => {
+        if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") {
+          return;
+        }
+
+        const id = this.win.setInterval(() => {
+          this.callSandboxFunction("timeoutCb", {
+            callbackId,
+            interval: true
+          });
+        }, nMilliseconds);
+        this.timeoutIds.set(callbackId, id);
+      },
+      clearInterval: id => {
+        this.win.clearInterval(this.timeoutIds.get(id));
+        this.timeoutIds.delete(id);
+      },
+      alert: cMsg => {
+        if (typeof cMsg !== "string") {
+          return;
+        }
+
+        this.win.alert(cMsg);
+      },
+      confirm: cMsg => {
+        if (typeof cMsg !== "string") {
+          return false;
+        }
+
+        return this.win.confirm(cMsg);
+      },
+      prompt: (cQuestion, cDefault) => {
+        if (typeof cQuestion !== "string" || typeof cDefault !== "string") {
+          return null;
+        }
+
+        return this.win.prompt(cQuestion, cDefault);
+      },
+      parseURL: cUrl => {
+        const url = new this.win.URL(cUrl);
+        const props = ["hash", "host", "hostname", "href", "origin", "password", "pathname", "port", 
"protocol", "search", "searchParams", "username"];
+        return Object.fromEntries(props.map(name => [name, url[name].toString()]));
+      },
+      send: data => {
+        if (!data) {
+          return;
+        }
+
+        const event = new this.win.CustomEvent("updatefromsandbox", {
+          detail: this.importValueFromSandbox(data)
+        });
+        this.win.dispatchEvent(event);
+      }
+    };
+    Object.setPrototypeOf(externals, null);
+    return (name, args) => {
+      try {
+        const result = externals[name](...args);
+        return this.exportValueToSandbox(result);
+      } catch (error) {
+        throw this.createErrorForSandbox(error?.toString() ?? "");
+      }
+    };
+  }
+
+}
+
+{
+  exports.SandboxSupportBase = SandboxSupportBase;
+}
+
+/***/ })
+/******/       ]);
+/************************************************************************/
+/******/       // The module cache
+/******/       var __webpack_module_cache__ = {};
+/******/       
+/******/       // The require function
+/******/       function __w_pdfjs_require__(moduleId) {
+/******/               // Check if module is in cache
+/******/               var cachedModule = __webpack_module_cache__[moduleId];
+/******/               if (cachedModule !== undefined) {
+/******/                       return cachedModule.exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = __webpack_module_cache__[moduleId] = {
+/******/                       // no module.id needed
+/******/                       // no module.loaded needed
+/******/                       exports: {}
+/******/               };
+/******/       
+/******/               // Execute the module function
+/******/               __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);
+/******/       
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/       
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the 
chunk.
+(() => {
+var exports = __webpack_exports__;
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.QuickJSSandbox = QuickJSSandbox;
+
+var _quickjsEval = _interopRequireDefault(__w_pdfjs_require__(1));
+
+var _pdfSandboxExternal = __w_pdfjs_require__(2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+const pdfjsVersion = '2.10.377';
+const pdfjsBuild = '156762c48';
+
+class SandboxSupport extends _pdfSandboxExternal.SandboxSupportBase {
+  exportValueToSandbox(val) {
+    return JSON.stringify(val);
+  }
+
+  importValueFromSandbox(val) {
+    return val;
+  }
+
+  createErrorForSandbox(errorMessage) {
+    return new Error(errorMessage);
+  }
+
+}
+
+class Sandbox {
+  constructor(win, module) {
+    this.support = new SandboxSupport(win, this);
+    module.externalCall = this.support.createSandboxExternals();
+    this._module = module;
+    this._alertOnError = 0;
+  }
+
+  create(data) {
+    const code = ['(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 
\'object\' && typeof module === \'object\')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 
\'function\' && define.amd)\n\t\tdefine("pdfjs-dist/build/pdf.scripting", [], factory);\n\telse if(typeof 
exports === \'object\')\n\t\texports["pdfjs-dist/build/pdf.scripting"] = 
factory();\n\telse\n\t\troot.pdfjsScripting = factory();\n})(this, function() {\nreturn /******/ (() => { // 
webpackBootstrap\n/******/ \t"use strict";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ 
((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, 
"__esModule", ({\n  value: true\n}));\nexports.initSandbox = initSandbox;\n\nvar _constants = 
__w_pdfjs_require__(2);\n\nvar _field = __w_pdfjs_require__(3);\n\nvar _aform = 
__w_pdfjs_require__(8);\n\nvar _app = __w_pdfjs_require__(9);\n\nvar _color = __w_pdfjs_require__(5);\n\nvar 
_conso
 le = __w_pdfjs_require__(13);\n\nvar _doc = __w_pdfjs_require__(14);\n\nvar _proxy = 
__w_pdfjs_require__(16);\n\nvar _util = __w_pdfjs_require__(17);\n\nfunction initSandbox(params) {\n  delete 
globalThis.pdfjsScripting;\n  const externalCall = globalThis.callExternalFunction;\n  delete 
globalThis.callExternalFunction;\n\n  const globalEval = code => globalThis.eval(code);\n\n  const send = 
data => externalCall("send", [data]);\n\n  const proxyHandler = new _proxy.ProxyHandler();\n  const {\n    
data\n  } = params;\n  const doc = new _doc.Doc({\n    send,\n    globalEval,\n    ...data.docInfo\n  });\n  
const _document = {\n    obj: doc,\n    wrapped: new Proxy(doc, proxyHandler)\n  };\n  const app = new 
_app.App({\n    send,\n    globalEval,\n    externalCall,\n    _document,\n    calculationOrder: 
data.calculationOrder,\n    proxyHandler,\n    ...data.appInfo\n  });\n  const util = new _util.Util({\n    
externalCall\n  });\n  const appObjects = app._objects;\n\n  if (data.objects) 
 {\n    const annotations = [];\n\n    for (const [name, objs] of Object.entries(data.objects)) {\n      
annotations.length = 0;\n      let container = null;\n\n      for (const obj of objs) {\n        if (obj.type 
!== "") {\n          annotations.push(obj);\n        } else {\n          container = obj;\n        }\n      
}\n\n      let obj = container;\n\n      if (annotations.length > 0) {\n        obj = annotations[0];\n       
 obj.send = send;\n      }\n\n      obj.globalEval = globalEval;\n      obj.doc = _document;\n      
obj.fieldPath = name;\n      obj.appObjects = appObjects;\n      let field;\n\n      switch (obj.type) {\n    
    case "radiobutton":\n          {\n            const otherButtons = annotations.slice(1);\n            
field = new _field.RadioButtonField(otherButtons, obj);\n            break;\n          }\n\n        case 
"checkbox":\n          {\n            const otherButtons = annotations.slice(1);\n            field = new 
_field.CheckboxField(otherButtons, obj
 );\n            break;\n          }\n\n        case "text":\n          if (annotations.length <= 1) {\n      
      field = new _field.Field(obj);\n            break;\n          }\n\n          obj.siblings = 
annotations.map(x => x.id).slice(1);\n          field = new _field.Field(obj);\n          break;\n\n        
default:\n          field = new _field.Field(obj);\n      }\n\n      const wrapped = new Proxy(field, 
proxyHandler);\n\n      doc._addField(name, wrapped);\n\n      const _object = {\n        obj: field,\n       
 wrapped\n      };\n\n      for (const object of objs) {\n        appObjects[object.id] = _object;\n      
}\n\n      if (container) {\n        appObjects[container.id] = _object;\n      }\n    }\n  }\n\n  const 
color = new _color.Color();\n  globalThis.event = null;\n  globalThis.global = Object.create(null);\n  
globalThis.app = new Proxy(app, proxyHandler);\n  globalThis.color = new Proxy(color, proxyHandler);\n  
globalThis.console = new Proxy(new _console.Console(
 {\n    send\n  }), proxyHandler);\n  globalThis.util = new Proxy(util, proxyHandler);\n  globalThis.border = 
_constants.Border;\n  globalThis.cursor = _constants.Cursor;\n  globalThis.display = _constants.Display;\n  
globalThis.font = _constants.Font;\n  globalThis.highlight = _constants.Highlight;\n  globalThis.position = 
_constants.Position;\n  globalThis.scaleHow = _constants.ScaleHow;\n  globalThis.scaleWhen = 
_constants.ScaleWhen;\n  globalThis.style = _constants.Style;\n  globalThis.trans = _constants.Trans;\n  
globalThis.zoomtype = _constants.ZoomType;\n  globalThis.ADBE = {\n    Reader_Value_Asked: true,\n    
Viewer_Value_Asked: true\n  };\n  const aform = new _aform.AForm(doc, app, util, color);\n\n  for (const name 
of Object.getOwnPropertyNames(_aform.AForm.prototype)) {\n    if (name !== "constructor" && 
!name.startsWith("_")) {\n      globalThis[name] = aform[name].bind(aform);\n    }\n  }\n\n  for (const 
[name, value] of Object.entries(_constants.GlobalConstants)) {\n  
   Object.defineProperty(globalThis, name, {\n      value,\n      writable: false\n    });\n  }\n\n  
Object.defineProperties(globalThis, {\n    ColorConvert: {\n      value: color.convert.bind(color),\n      
writable: true\n    },\n    ColorEqual: {\n      value: color.equal.bind(color),\n      writable: true\n    
}\n  });\n  const properties = Object.create(null);\n\n  for (const name of 
Object.getOwnPropertyNames(_doc.Doc.prototype)) {\n    if (name === "constructor" || name.startsWith("_")) 
{\n      continue;\n    }\n\n    const descriptor = Object.getOwnPropertyDescriptor(_doc.Doc.prototype, 
name);\n\n    if (descriptor.get) {\n      properties[name] = {\n        get: descriptor.get.bind(doc),\n     
   set: descriptor.set.bind(doc)\n      };\n    } else {\n      properties[name] = {\n        value: 
_doc.Doc.prototype[name].bind(doc)\n      };\n    }\n  }\n\n  Object.defineProperties(globalThis, 
properties);\n  const functions = {\n    dispatchEvent: app._dispatchEvent.bind(app),\
 n    timeoutCb: app._evalCallback.bind(app)\n  };\n  return (name, args) => {\n    try {\n      
functions[name](args);\n    } catch (error) {\n      const value = `${error.toString()}\\n${error.stack}`;\n  
    send({\n        command: "error",\n        value\n      });\n    }\n  };\n}\n\n/***/ }),\n/* 2 */\n/***/ 
((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: 
true\n}));\nexports.ZoomType = exports.Trans = exports.Style = exports.ScaleWhen = exports.ScaleHow = 
exports.Position = exports.Highlight = exports.GlobalConstants = exports.Font = exports.Display = 
exports.Cursor = exports.Border = void 0;\nconst Border = Object.freeze({\n  s: "solid",\n  d: "dashed",\n  
b: "beveled",\n  i: "inset",\n  u: "underline"\n});\nexports.Border = Border;\nconst Cursor = 
Object.freeze({\n  visible: 0,\n  hidden: 1,\n  delay: 2\n});\nexports.Cursor = Cursor;\nconst Display = 
Object.freeze({\n  visible: 0,\n  hidden: 1,\n  noPrint: 2,\n  noView
 : 3\n});\nexports.Display = Display;\nconst Font = Object.freeze({\n  Times: "Times-Roman",\n  TimesB: 
"Times-Bold",\n  TimesI: "Times-Italic",\n  TimesBI: "Times-BoldItalic",\n  Helv: "Helvetica",\n  HelvB: 
"Helvetica-Bold",\n  HelvI: "Helvetica-Oblique",\n  HelvBI: "Helvetica-BoldOblique",\n  Cour: "Courier",\n  
CourB: "Courier-Bold",\n  CourI: "Courier-Oblique",\n  CourBI: "Courier-BoldOblique",\n  Symbol: "Symbol",\n  
ZapfD: "ZapfDingbats",\n  KaGo: "HeiseiKakuGo-W5-UniJIS-UCS2-H",\n  KaMi: 
"HeiseiMin-W3-UniJIS-UCS2-H"\n});\nexports.Font = Font;\nconst Highlight = Object.freeze({\n  n: "none",\n  
i: "invert",\n  p: "push",\n  o: "outline"\n});\nexports.Highlight = Highlight;\nconst Position = 
Object.freeze({\n  textOnly: 0,\n  iconOnly: 1,\n  iconTextV: 2,\n  textIconV: 3,\n  iconTextH: 4,\n  
textIconH: 5,\n  overlay: 6\n});\nexports.Position = Position;\nconst ScaleHow = Object.freeze({\n  
proportional: 0,\n  anamorphic: 1\n});\nexports.ScaleHow = ScaleHow;\nconst ScaleWhen = O
 bject.freeze({\n  always: 0,\n  never: 1,\n  tooBig: 2,\n  tooSmall: 3\n});\nexports.ScaleWhen = 
ScaleWhen;\nconst Style = Object.freeze({\n  ch: "check",\n  cr: "cross",\n  di: "diamond",\n  ci: 
"circle",\n  st: "star",\n  sq: "square"\n});\nexports.Style = Style;\nconst Trans = Object.freeze({\n  
blindsH: "BlindsHorizontal",\n  blindsV: "BlindsVertical",\n  boxI: "BoxIn",\n  boxO: "BoxOut",\n  dissolve: 
"Dissolve",\n  glitterD: "GlitterDown",\n  glitterR: "GlitterRight",\n  glitterRD: "GlitterRightDown",\n  
random: "Random",\n  replace: "Replace",\n  splitHI: "SplitHorizontalIn",\n  splitHO: "SplitHorizontalOut",\n 
 splitVI: "SplitVerticalIn",\n  splitVO: "SplitVerticalOut",\n  wipeD: "WipeDown",\n  wipeL: "WipeLeft",\n  
wipeR: "WipeRight",\n  wipeU: "WipeUp"\n});\nexports.Trans = Trans;\nconst ZoomType = Object.freeze({\n  
none: "NoVary",\n  fitP: "FitPage",\n  fitW: "FitWidth",\n  fitH: "FitHeight",\n  fitV: "FitVisibleWidth",\n  
pref: "Preferred",\n  refW: "ReflowWidth"\n});\ne
 xports.ZoomType = ZoomType;\nconst GlobalConstants = Object.freeze({\n  IDS_GREATER_THAN: "Invalid value: 
must be greater than or equal to % s.",\n  IDS_GT_AND_LT: "Invalid value: must be greater than or equal to % 
s " + "and less than or equal to % s.",\n  IDS_LESS_THAN: "Invalid value: must be less than or equal to % 
s.",\n  IDS_INVALID_MONTH: "** Invalid **",\n  IDS_INVALID_DATE: "Invalid date / time: please ensure that the 
date / time exists.Field",\n  IDS_INVALID_DATE2: " should match format ",\n  IDS_INVALID_VALUE: "The value 
entered does not match the format of the field",\n  IDS_AM: "am",\n  IDS_PM: "pm",\n  IDS_MONTH_INFO: 
"January[1] February[2] March[3] April[4] May[5] " + "June[6] July[7] August[8] September[9] October[10] " + 
"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] " + "Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] 
Nov[11] Dec[12]",\n  IDS_STARTUP_CONSOLE_MSG: "** ^ _ ^ **",\n  RE_NUMBER_ENTRY_DOT_SEP: 
["[+-]?\\\\d*\\\\.?\\\\d*"],\n  RE_NUMBER_COMMIT_DOT_SE
 P: ["[+-]?\\\\d+(\\\\.\\\\d+)?", "[+-]?\\\\.\\\\d+", "[+-]?\\\\d+\\\\."],\n  RE_NUMBER_ENTRY_COMMA_SEP: 
["[+-]?\\\\d*,?\\\\d*"],\n  RE_NUMBER_COMMIT_COMMA_SEP: ["[+-]?\\\\d+([.,]\\\\d+)?", "[+-]?[.,]\\\\d+", 
"[+-]?\\\\d+[.,]"],\n  RE_ZIP_ENTRY: ["\\\\d{0,5}"],\n  RE_ZIP_COMMIT: ["\\\\d{5}"],\n  RE_ZIP4_ENTRY: 
["\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}"],\n  RE_ZIP4_COMMIT: ["\\\\d{5}(\\\\.|[- ])?\\\\d{4}"],\n  
RE_PHONE_ENTRY: ["\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\(\\\\d{0,3}", 
"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\(\\\\d{0,3}(\\\\.|[- 
])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", "\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}", 
"011(\\\\.|[- \\\\d])*"],\n  RE_PHONE_COMMIT: ["\\\\d{3}(\\\\.|[- ])?\\\\d{4}", "\\\\d{3}(\\\\.|[- 
])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}", "\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}", 
"011(\\\\.|[- \\\\d])*"],\n  RE_SSN_ENTRY: ["\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d
 {0,4}"],\n  RE_SSN_COMMIT: ["\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- 
])?\\\\d{4}"]\n});\nexports.GlobalConstants = GlobalConstants;\n\n/***/ }),\n/* 3 */\n/***/ 
((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, 
"__esModule", ({\n  value: true\n}));\nexports.RadioButtonField = exports.Field = exports.CheckboxField = 
void 0;\n\nvar _common = __w_pdfjs_require__(4);\n\nvar _color = __w_pdfjs_require__(5);\n\nvar _pdf_object = 
__w_pdfjs_require__(7);\n\nclass Field extends _pdf_object.PDFObject {\n  constructor(data) {\n    
super(data);\n    this.alignment = data.alignment || "left";\n    this.borderStyle = data.borderStyle || 
"";\n    this.buttonAlignX = data.buttonAlignX || 50;\n    this.buttonAlignY = data.buttonAlignY || 50;\n    
this.buttonFitBounds = data.buttonFitBounds;\n    this.buttonPosition = data.buttonPosition;\n    
this.buttonScaleHow = data.buttonScaleHow;\n    this.ButtonScaleWhen = data.buttonScaleWhen;\n    this.calcOrd
 erIndex = data.calcOrderIndex;\n    this.charLimit = data.charLimit;\n    this.comb = data.comb;\n    
this.commitOnSelChange = data.commitOnSelChange;\n    this.currentValueIndices = data.currentValueIndices;\n  
  this.defaultStyle = data.defaultStyle;\n    this.defaultValue = data.defaultValue;\n    this.doNotScroll = 
data.doNotScroll;\n    this.doNotSpellCheck = data.doNotSpellCheck;\n    this.delay = data.delay;\n    
this.display = data.display;\n    this.doc = data.doc.wrapped;\n    this.editable = data.editable;\n    
this.exportValues = data.exportValues;\n    this.fileSelect = data.fileSelect;\n    this.hidden = 
data.hidden;\n    this.highlight = data.highlight;\n    this.lineWidth = data.lineWidth;\n    this.multiline 
= data.multiline;\n    this.multipleSelection = !!data.multipleSelection;\n    this.name = data.name;\n    
this.password = data.password;\n    this.print = data.print;\n    this.radiosInUnison = 
data.radiosInUnison;\n    this.readonly = data.readonly;\n    this.
 rect = data.rect;\n    this.required = data.required;\n    this.richText = data.richText;\n    
this.richValue = data.richValue;\n    this.rotation = data.rotation;\n    this.style = data.style;\n    
this.submitName = data.submitName;\n    this.textFont = data.textFont;\n    this.textSize = data.textSize;\n  
  this.type = data.type;\n    this.userName = data.userName;\n    this._actions = (0, 
_common.createActionsMap)(data.actions);\n    this._browseForFileToSubmit = data.browseForFileToSubmit || 
null;\n    this._buttonCaption = null;\n    this._buttonIcon = null;\n    this._children = null;\n    
this._currentValueIndices = data.currentValueIndices || 0;\n    this._document = data.doc;\n    
this._fieldPath = data.fieldPath;\n    this._fillColor = data.fillColor || ["T"];\n    this._isChoice = 
Array.isArray(data.items);\n    this._items = data.items || [];\n    this._page = data.page || 0;\n    
this._strokeColor = data.strokeColor || ["G", 0];\n    this._textColor = data.textColor || 
 ["G", 0];\n    this._value = data.value || "";\n    this._kidIds = data.kidIds || null;\n    this._fieldType 
= (0, _common.getFieldType)(this._actions);\n    this._siblings = data.siblings || null;\n    
this._globalEval = data.globalEval;\n    this._appObjects = data.appObjects;\n    this.valueAsString = 
data.valueAsString || this._value;\n  }\n\n  get currentValueIndices() {\n    if (!this._isChoice) {\n      
return 0;\n    }\n\n    return this._currentValueIndices;\n  }\n\n  set currentValueIndices(indices) {\n    
if (!this._isChoice) {\n      return;\n    }\n\n    if (!Array.isArray(indices)) {\n      indices = 
[indices];\n    }\n\n    if (!indices.every(i => typeof i === "number" && Number.isInteger(i) && i >= 0 && i 
< this.numItems)) {\n      return;\n    }\n\n    indices.sort();\n\n    if (this.multipleSelection) {\n      
this._currentValueIndices = indices;\n      this._value = [];\n      indices.forEach(i => {\n        
this._value.push(this._items[i].displayValue);\n      })
 ;\n    } else {\n      if (indices.length > 0) {\n        indices = indices.splice(1, indices.length - 1);\n 
       this._currentValueIndices = indices[0];\n        this._value = 
this._items[this._currentValueIndices];\n      }\n    }\n\n    this._send({\n      id: this._id,\n      
indices\n    });\n  }\n\n  get fillColor() {\n    return this._fillColor;\n  }\n\n  set fillColor(color) {\n  
  if (_color.Color._isValidColor(color)) {\n      this._fillColor = color;\n    }\n  }\n\n  get bgColor() {\n 
   return this.fillColor;\n  }\n\n  set bgColor(color) {\n    this.fillColor = color;\n  }\n\n  get 
numItems() {\n    if (!this._isChoice) {\n      throw new Error("Not a choice widget");\n    }\n\n    return 
this._items.length;\n  }\n\n  set numItems(_) {\n    throw new Error("field.numItems is read-only");\n  }\n\n 
 get strokeColor() {\n    return this._strokeColor;\n  }\n\n  set strokeColor(color) {\n    if 
(_color.Color._isValidColor(color)) {\n      this._strokeColor = color;\n    }\n
   }\n\n  get borderColor() {\n    return this.strokeColor;\n  }\n\n  set borderColor(color) {\n    
this.strokeColor = color;\n  }\n\n  get page() {\n    return this._page;\n  }\n\n  set page(_) {\n    throw 
new Error("field.page is read-only");\n  }\n\n  get textColor() {\n    return this._textColor;\n  }\n\n  set 
textColor(color) {\n    if (_color.Color._isValidColor(color)) {\n      this._textColor = color;\n    }\n  
}\n\n  get fgColor() {\n    return this.textColor;\n  }\n\n  set fgColor(color) {\n    this.textColor = 
color;\n  }\n\n  get value() {\n    return this._value;\n  }\n\n  set value(value) {\n    if (value === "") 
{\n      this._value = "";\n    } else if (typeof value === "string") {\n      switch (this._fieldType) {\n   
     case _common.FieldType.number:\n        case _common.FieldType.percent:\n          value = 
parseFloat(value);\n\n          if (!isNaN(value)) {\n            this._value = value;\n          }\n\n       
   break;\n\n        default:\n          this.
 _value = value;\n      }\n    } else {\n      this._value = value;\n    }\n\n    if (this._isChoice) {\n     
 if (this.multipleSelection) {\n        const values = new Set(value);\n        
this._currentValueIndices.length = 0;\n\n        this._items.forEach(({\n          displayValue\n        }, 
i) => {\n          if (values.has(displayValue)) {\n            this._currentValueIndices.push(i);\n          
}\n        });\n      } else {\n        this._currentValueIndices = this._items.findIndex(({\n          
displayValue\n        }) => value === displayValue);\n      }\n    }\n  }\n\n  get valueAsString() {\n    if 
(this._valueAsString === undefined) {\n      this._valueAsString = this._value ? this._value.toString() : 
"";\n    }\n\n    return this._valueAsString;\n  }\n\n  set valueAsString(val) {\n    this._valueAsString = 
val ? val.toString() : "";\n  }\n\n  browseForFileToSubmit() {\n    if (this._browseForFileToSubmit) {\n      
this._browseForFileToSubmit();\n    }\n  }\n\n  butto
 nGetCaption(nFace = 0) {\n    if (this._buttonCaption) {\n      return this._buttonCaption[nFace];\n    
}\n\n    return "";\n  }\n\n  buttonGetIcon(nFace = 0) {\n    if (this._buttonIcon) {\n      return 
this._buttonIcon[nFace];\n    }\n\n    return null;\n  }\n\n  buttonImportIcon(cPath = null, nPave = 0) 
{}\n\n  buttonSetCaption(cCaption, nFace = 0) {\n    if (!this._buttonCaption) {\n      this._buttonCaption = 
["", "", ""];\n    }\n\n    this._buttonCaption[nFace] = cCaption;\n  }\n\n  buttonSetIcon(oIcon, nFace = 0) 
{\n    if (!this._buttonIcon) {\n      this._buttonIcon = [null, null, null];\n    }\n\n    
this._buttonIcon[nFace] = oIcon;\n  }\n\n  checkThisBox(nWidget, bCheckIt = true) {}\n\n  clearItems() {\n    
if (!this._isChoice) {\n      throw new Error("Not a choice widget");\n    }\n\n    this._items = [];\n\n    
this._send({\n      id: this._id,\n      clear: null\n    });\n  }\n\n  deleteItemAt(nIdx = null) {\n    if 
(!this._isChoice) {\n      throw new Error("Not a c
 hoice widget");\n    }\n\n    if (!this.numItems) {\n      return;\n    }\n\n    if (nIdx === null) {\n      
nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n 
     nIdx = nIdx || 0;\n    }\n\n    if (nIdx < 0 || nIdx >= this.numItems) {\n      nIdx = this.numItems - 
1;\n    }\n\n    this._items.splice(nIdx, 1);\n\n    if (Array.isArray(this._currentValueIndices)) {\n      
let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n\n      if (index !== -1) {\n        if 
(this._currentValueIndices[index] === nIdx) {\n          this._currentValueIndices.splice(index, 1);\n        
}\n\n        for (const ii = this._currentValueIndices.length; index < ii; index++) {\n          
--this._currentValueIndices[index];\n        }\n      }\n    } else {\n      if (this._currentValueIndices 
=== nIdx) {\n        this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n      } else if 
(this._currentValueIndices > nIdx) {\n        --
 this._currentValueIndices;\n      }\n    }\n\n    this._send({\n      id: this._id,\n      remove: nIdx\n    
});\n  }\n\n  getItemAt(nIdx = -1, bExportValue = false) {\n    if (!this._isChoice) {\n      throw new 
Error("Not a choice widget");\n    }\n\n    if (nIdx < 0 || nIdx >= this.numItems) {\n      nIdx = 
this.numItems - 1;\n    }\n\n    const item = this._items[nIdx];\n    return bExportValue ? item.exportValue 
: item.displayValue;\n  }\n\n  getArray() {\n    if (this._kidIds) {\n      return this._kidIds.map(id => 
this._appObjects[id].wrapped);\n    }\n\n    if (this._children === null) {\n      this._children = 
this._document.obj._getChildren(this._fieldPath);\n    }\n\n    return this._children;\n  }\n\n  getLock() 
{\n    return undefined;\n  }\n\n  isBoxChecked(nWidget) {\n    return false;\n  }\n\n  
isDefaultChecked(nWidget) {\n    return false;\n  }\n\n  insertItemAt(cName, cExport = undefined, nIdx = 0) 
{\n    if (!this._isChoice) {\n      throw new Error("Not a choice 
 widget");\n    }\n\n    if (!cName) {\n      return;\n    }\n\n    if (nIdx < 0 || nIdx > this.numItems) {\n 
     nIdx = this.numItems;\n    }\n\n    if (this._items.some(({\n      displayValue\n    }) => displayValue 
=== cName)) {\n      return;\n    }\n\n    if (cExport === undefined) {\n      cExport = cName;\n    }\n\n    
const data = {\n      displayValue: cName,\n      exportValue: cExport\n    };\n\n    
this._items.splice(nIdx, 0, data);\n\n    if (Array.isArray(this._currentValueIndices)) {\n      let index = 
this._currentValueIndices.findIndex(i => i >= nIdx);\n\n      if (index !== -1) {\n        for (const ii = 
this._currentValueIndices.length; index < ii; index++) {\n          ++this._currentValueIndices[index];\n     
   }\n      }\n    } else if (this._currentValueIndices >= nIdx) {\n      ++this._currentValueIndices;\n    
}\n\n    this._send({\n      id: this._id,\n      insert: {\n        index: nIdx,\n        ...data\n      }\n 
   });\n  }\n\n  setAction(cTrigger, cS
 cript) {\n    if (typeof cTrigger !== "string" || typeof cScript !== "string") {\n      return;\n    }\n\n   
 if (!(cTrigger in this._actions)) {\n      this._actions[cTrigger] = [];\n    }\n\n    
this._actions[cTrigger].push(cScript);\n  }\n\n  setFocus() {\n    this._send({\n      id: this._id,\n      
focus: true\n    });\n  }\n\n  setItems(oArray) {\n    if (!this._isChoice) {\n      throw new Error("Not a 
choice widget");\n    }\n\n    this._items.length = 0;\n\n    for (const element of oArray) {\n      let 
displayValue, exportValue;\n\n      if (Array.isArray(element)) {\n        displayValue = 
element[0]?.toString() || "";\n        exportValue = element[1]?.toString() || "";\n      } else {\n        
displayValue = exportValue = element?.toString() || "";\n      }\n\n      this._items.push({\n        
displayValue,\n        exportValue\n      });\n    }\n\n    this._currentValueIndices = 0;\n\n    
this._send({\n      id: this._id,\n      items: this._items\n    });\n  }\n\n  se
 tLock() {}\n\n  signatureGetModifications() {}\n\n  signatureGetSeedValue() {}\n\n  signatureInfo() {}\n\n  
signatureSetSeedValue() {}\n\n  signatureSign() {}\n\n  signatureValidate() {}\n\n  _isButton() {\n    return 
false;\n  }\n\n  _runActions(event) {\n    const eventName = event.name;\n\n    if 
(!this._actions.has(eventName)) {\n      return false;\n    }\n\n    const actions = 
this._actions.get(eventName);\n\n    try {\n      for (const action of actions) {\n        
this._globalEval(action);\n      }\n    } catch (error) {\n      event.rc = false;\n      throw error;\n    
}\n\n    return true;\n  }\n\n}\n\nexports.Field = Field;\n\nclass RadioButtonField extends Field {\n  
constructor(otherButtons, data) {\n    super(data);\n    this.exportValues = [this.exportValues];\n    
this._radioIds = [this._id];\n    this._radioActions = [this._actions];\n\n    for (const radioData of 
otherButtons) {\n      this.exportValues.push(radioData.exportValues);\n\n      this._radioIds.push(rad
 ioData.id);\n\n      this._radioActions.push((0, _common.createActionsMap)(radioData.actions));\n\n      if 
(this._value === radioData.exportValues) {\n        this._id = radioData.id;\n      }\n    }\n  }\n\n  get 
value() {\n    return this._value;\n  }\n\n  set value(value) {\n    if (value === null || value === 
undefined) {\n      this._value = "";\n    }\n\n    const i = this.exportValues.indexOf(value);\n\n    if (0 
<= i && i < this._radioIds.length) {\n      this._id = this._radioIds[i];\n      this._value = value;\n    } 
else if (value === "Off" && this._radioIds.length === 2) {\n      const nextI = (1 + 
this._radioIds.indexOf(this._id)) % 2;\n      this._id = this._radioIds[nextI];\n      this._value = 
this.exportValues[nextI];\n    }\n  }\n\n  checkThisBox(nWidget, bCheckIt = true) {\n    if (nWidget < 0 || 
nWidget >= this._radioIds.length || !bCheckIt) {\n      return;\n    }\n\n    this._id = 
this._radioIds[nWidget];\n    this._value = this.exportValues[nWidget];\n\n    t
 his._send({\n      id: this._id,\n      value: this._value\n    });\n  }\n\n  isBoxChecked(nWidget) {\n    
return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n  }\n\n  
isDefaultChecked(nWidget) {\n    return nWidget >= 0 && nWidget < this.exportValues.length && 
this.defaultValue === this.exportValues[nWidget];\n  }\n\n  _getExportValue(state) {\n    const i = 
this._radioIds.indexOf(this._id);\n\n    return this.exportValues[i];\n  }\n\n  _runActions(event) {\n    
const i = this._radioIds.indexOf(this._id);\n\n    this._actions = this._radioActions[i];\n    return 
super._runActions(event);\n  }\n\n  _isButton() {\n    return true;\n  }\n\n}\n\nexports.RadioButtonField = 
RadioButtonField;\n\nclass CheckboxField extends RadioButtonField {\n  get value() {\n    return 
this._value;\n  }\n\n  set value(value) {\n    if (!value || value === "Off") {\n      this._value = "Off";\n 
   } else {\n      super.value = value;\n    }\n  }\n\n  _getExport
 Value(state) {\n    return state ? super._getExportValue(state) : "Off";\n  }\n\n  isBoxChecked(nWidget) {\n 
   if (this._value === "Off") {\n      return false;\n    }\n\n    return super.isBoxChecked(nWidget);\n  
}\n\n  isDefaultChecked(nWidget) {\n    if (this.defaultValue === "Off") {\n      return this._value === 
"Off";\n    }\n\n    return super.isDefaultChecked(nWidget);\n  }\n\n  checkThisBox(nWidget, bCheckIt = true) 
{\n    if (nWidget < 0 || nWidget >= this._radioIds.length) {\n      return;\n    }\n\n    this._id = 
this._radioIds[nWidget];\n    this._value = bCheckIt ? this.exportValues[nWidget] : "Off";\n\n    
this._send({\n      id: this._id,\n      value: this._value\n    });\n  }\n\n}\n\nexports.CheckboxField = 
CheckboxField;\n\n/***/ }),\n/* 4 */\n/***/ ((__unused_webpack_module, exports) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.createActionsMap = 
createActionsMap;\nexports.getFieldType = getFieldType;\nexports.FieldTy
 pe = void 0;\nconst FieldType = {\n  none: 0,\n  number: 1,\n  percent: 2,\n  date: 3,\n  time: 
4\n};\nexports.FieldType = FieldType;\n\nfunction createActionsMap(actions) {\n  const actionsMap = new 
Map();\n\n  if (actions) {\n    for (const [eventType, actionsForEvent] of Object.entries(actions)) {\n      
actionsMap.set(eventType, actionsForEvent);\n    }\n  }\n\n  return actionsMap;\n}\n\nfunction 
getFieldType(actions) {\n  let format = actions.get("Format");\n\n  if (!format) {\n    return 
FieldType.none;\n  }\n\n  format = format[0];\n  format = format.trim();\n\n  if 
(format.startsWith("AFNumber_")) {\n    return FieldType.number;\n  }\n\n  if 
(format.startsWith("AFPercent_")) {\n    return FieldType.percent;\n  }\n\n  if 
(format.startsWith("AFDate_")) {\n    return FieldType.date;\n  }\n\n  if (format.startsWith("AFTime__")) {\n 
   return FieldType.time;\n  }\n\n  return FieldType.none;\n}\n\n/***/ }),\n/* 5 */\n/***/ 
((__unused_webpack_module, exports, __w_pdfjs_require__) =
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.Color = void 
0;\n\nvar _scripting_utils = __w_pdfjs_require__(6);\n\nvar _pdf_object = __w_pdfjs_require__(7);\n\nclass 
Color extends _pdf_object.PDFObject {\n  constructor() {\n    super({});\n    this.transparent = ["T"];\n  
  this.black = ["G", 0];\n    this.white = ["G", 1];\n    this.red = ["RGB", 1, 0, 0];\n    this.green = 
["RGB", 0, 1, 0];\n    this.blue = ["RGB", 0, 0, 1];\n    this.cyan = ["CMYK", 1, 0, 0, 0];\n    
this.magenta = ["CMYK", 0, 1, 0, 0];\n    this.yellow = ["CMYK", 0, 0, 1, 0];\n    this.dkGray = ["G", 
0.25];\n    this.gray = ["G", 0.5];\n    this.ltGray = ["G", 0.75];\n  }\n\n  static 
_isValidSpace(cColorSpace) {\n    return typeof cColorSpace === "string" && (cColorSpace === "T" || 
cColorSpace === "G" || cColorSpace === "RGB" || cColorSpace === "CMYK");\n  }\n\n  static 
_isValidColor(colorArray) {\n    if (!Array.isArray(colorArray) || colorArray.length === 0) {\n      
 return false;\n    }\n\n    const space = colorArray[0];\n\n    if (!Color._isValidSpace(space)) {\n      
return false;\n    }\n\n    switch (space) {\n      case "T":\n        if (colorArray.length !== 1) {\n       
   return false;\n        }\n\n        break;\n\n      case "G":\n        if (colorArray.length !== 2) {\n    
      return false;\n        }\n\n        break;\n\n      case "RGB":\n        if (colorArray.length !== 4) 
{\n          return false;\n        }\n\n        break;\n\n      case "CMYK":\n        if (colorArray.length 
!== 5) {\n          return false;\n        }\n\n        break;\n\n      default:\n        return false;\n    
}\n\n    return colorArray.slice(1).every(c => typeof c === "number" && c >= 0 && c <= 1);\n  }\n\n  static 
_getCorrectColor(colorArray) {\n    return Color._isValidColor(colorArray) ? colorArray : ["G", 0];\n  }\n\n  
convert(colorArray, cColorSpace) {\n    if (!Color._isValidSpace(cColorSpace)) {\n      return this.black;\n  
  }\n\n    if (cC
 olorSpace === "T") {\n      return ["T"];\n    }\n\n    colorArray = Color._getCorrectColor(colorArray);\n\n 
   if (colorArray[0] === cColorSpace) {\n      return colorArray;\n    }\n\n    if (colorArray[0] === "T") 
{\n      return this.convert(this.black, cColorSpace);\n    }\n\n    return 
_scripting_utils.ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n  }\n\n  
equal(colorArray1, colorArray2) {\n    colorArray1 = Color._getCorrectColor(colorArray1);\n    colorArray2 = 
Color._getCorrectColor(colorArray2);\n\n    if (colorArray1[0] === "T" || colorArray2[0] === "T") {\n      
return colorArray1[0] === "T" && colorArray2[0] === "T";\n    }\n\n    if (colorArray1[0] !== colorArray2[0]) 
{\n      colorArray2 = this.convert(colorArray2, colorArray1[0]);\n    }\n\n    return 
colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n  }\n\n}\n\nexports.Color = Color;\n\n/***/ 
}),\n/* 6 */\n/***/ ((__unused_webpack_module, exports) => {\n\n\n\nObject.definePr
 operty(exports, "__esModule", ({\n  value: true\n}));\nexports.ColorConverters = void 0;\n\nfunction 
makeColorComp(n) {\n  return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, 
"0");\n}\n\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return ["G", 1 - Math.min(1, 0.3 * 
c + 0.59 * m + 0.11 * y + k)];\n  }\n\n  static G_CMYK([g]) {\n    return ["CMYK", 0, 0, 0, 1 - g];\n  }\n\n  
static G_RGB([g]) {\n    return ["RGB", g, g, g];\n  }\n\n  static G_HTML([g]) {\n    const G = 
makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n\n  static RGB_G([r, g, b]) {\n    return ["G", 0.3 * r 
+ 0.59 * g + 0.11 * b];\n  }\n\n  static RGB_HTML([r, g, b]) {\n    const R = makeColorComp(r);\n    const G 
= makeColorComp(g);\n    const B = makeColorComp(b);\n    return `#${R}${G}${B}`;\n  }\n\n  static T_HTML() 
{\n    return "#00000000";\n  }\n\n  static CMYK_RGB([c, y, m, k]) {\n    return ["RGB", 1 - Math.min(1, c + 
k), 1 - Math.min(1, m + k), 1 - Math.min(1, y 
 + k)];\n  }\n\n  static CMYK_HTML(components) {\n    return this.RGB_HTML(this.CMYK_RGB(components));\n  
}\n\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    
const k = Math.min(c, m, y);\n    return ["CMYK", c, m, y, k];\n  }\n\n}\n\nexports.ColorConverters = 
ColorConverters;\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, exports) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.PDFObject = void 
0;\n\nclass PDFObject {\n  constructor(data) {\n    this._expandos = Object.create(null);\n    this._send = 
data.send || null;\n    this._id = data.id || null;\n  }\n\n}\n\nexports.PDFObject = PDFObject;\n\n/***/ 
}),\n/* 8 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.AForm = void 0;\n\nvar 
_constants = __w_pdfjs_require__(2);\n\nclass AForm {\n  constructor(document, app, util, c
 olor) {\n    this._document = document;\n    this._app = app;\n    this._util = util;\n    this._color = 
color;\n    this._dateFormats = ["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", 
"yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"];\n    
this._timeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"];\n    this._emailRegex = new 
RegExp("^[a-zA-Z0-9.!#$%&\'*+\\\\/=?^_`{|}~-]+" + "@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?" + 
"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$");\n  }\n\n  _mkTargetName(event) {\n    return 
event.target ? `[ ${event.target.name} ]` : "";\n  }\n\n  _parseDate(cFormat, cDate) {\n    const ddate = 
Date.parse(cDate);\n\n    if (isNaN(ddate)) {\n      try {\n        return this._util.scand(cFormat, 
cDate);\n      } catch (error) {\n        return null;\n      }\n    } else {\n      return new 
Date(ddate);\n    }\n  }\n\n  AFMergeChange(event = globalThis.event) {\n    
 if (event.willCommit) {\n      return event.value.toString();\n    }\n\n    return 
this._app._eventDispatcher.mergeChange(event);\n  }\n\n  AFParseDateEx(cString, cOrder) {\n    return 
this._parseDate(cOrder, cString);\n  }\n\n  AFExtractNums(str) {\n    if (typeof str === "number") {\n      
return [str];\n    }\n\n    if (!str || typeof str !== "string") {\n      return null;\n    }\n\n    const 
first = str.charAt(0);\n\n    if (first === "." || first === ",") {\n      str = `0${str}`;\n    }\n\n    
const numbers = str.match(/([0-9]+)/g);\n\n    if (numbers.length === 0) {\n      return null;\n    }\n\n    
return numbers;\n  }\n\n  AFMakeNumber(str) {\n    if (typeof str === "number") {\n      return str;\n    
}\n\n    if (typeof str !== "string") {\n      return null;\n    }\n\n    str = str.trim().replace(",", 
".");\n    const number = parseFloat(str);\n\n    if (isNaN(number) || !isFinite(number)) {\n      return 
null;\n    }\n\n    return number;\n  }\n\n  AFMakeArrayFromList(s
 tring) {\n    if (typeof string === "string") {\n      return string.split(/, ?/g);\n    }\n\n    return 
string;\n  }\n\n  AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n    
const event = globalThis.event;\n\n    if (!event.value) {\n      return;\n    }\n\n    let value = 
this.AFMakeNumber(event.value);\n\n    if (value === null) {\n      event.value = "";\n      return;\n    
}\n\n    const sign = Math.sign(value);\n    const buf = [];\n    let hasParen = false;\n\n    if (sign === 
-1 && bCurrencyPrepend && negStyle === 0) {\n      buf.push("-");\n    }\n\n    if ((negStyle === 2 || 
negStyle === 3) && sign === -1) {\n      buf.push("(");\n      hasParen = true;\n    }\n\n    if 
(bCurrencyPrepend) {\n      buf.push(strCurrency);\n    }\n\n    sepStyle = Math.min(Math.max(0, 
Math.floor(sepStyle)), 4);\n    buf.push("%,", sepStyle, ".", nDec.toString(), "f");\n\n    if 
(!bCurrencyPrepend) {\n      buf.push(strCurrency);\n    }\n\n    if (hasPare
 n) {\n      buf.push(")");\n    }\n\n    if (negStyle === 1 || negStyle === 3) {\n      
event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n    }\n\n    if ((negStyle !== 0 
|| bCurrencyPrepend) && sign === -1) {\n      value = -value;\n    }\n\n    const formatStr = buf.join("");\n 
   event.value = this._util.printf(formatStr, value);\n  }\n\n  AFNumber_Keystroke(nDec, sepStyle, negStyle, 
currStyle, strCurrency, bCurrencyPrepend) {\n    const event = globalThis.event;\n    let value = 
this.AFMergeChange(event);\n\n    if (!value) {\n      return;\n    }\n\n    value = value.trim();\n    let 
pattern;\n\n    if (sepStyle > 1) {\n      pattern = event.willCommit ? /^[+-]?([0-9]+(,[0-9]*)?|,[0-9]+)$/ : 
/^[+-]?[0-9]*,?[0-9]*$/;\n    } else {\n      pattern = event.willCommit ? 
/^[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)$/ : /^[+-]?[0-9]*\\.?[0-9]*$/;\n    }\n\n    if (!pattern.test(value)) 
{\n      if (event.willCommit) {\n        const err = `${_constants.GlobalConstan
 ts.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n\n        this._app.alert(err);\n      }\n\n      
event.rc = false;\n    }\n\n    if (event.willCommit && sepStyle > 1) {\n      event.value = 
parseFloat(value.replace(",", "."));\n    }\n  }\n\n  AFPercent_Format(nDec, sepStyle, percentPrepend = 
false) {\n    if (typeof nDec !== "number") {\n      return;\n    }\n\n    if (typeof sepStyle !== "number") 
{\n      return;\n    }\n\n    if (nDec < 0) {\n      throw new Error("Invalid nDec value in 
AFPercent_Format");\n    }\n\n    const event = globalThis.event;\n\n    if (nDec > 512) {\n      event.value 
= "%";\n      return;\n    }\n\n    nDec = Math.floor(nDec);\n    sepStyle = Math.min(Math.max(0, 
Math.floor(sepStyle)), 4);\n    let value = this.AFMakeNumber(event.value);\n\n    if (value === null) {\n    
  event.value = "%";\n      return;\n    }\n\n    const formatStr = `%,${sepStyle}.${nDec}f`;\n    value = 
this._util.printf(formatStr, value * 100);\n\n    if (percentPrepend)
  {\n      event.value = `%${value}`;\n    } else {\n      event.value = `${value}%`;\n    }\n  }\n\n  
AFPercent_Keystroke(nDec, sepStyle) {\n    this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, "", true);\n  }\n\n  
AFDate_FormatEx(cFormat) {\n    const event = globalThis.event;\n    const value = event.value;\n\n    if 
(!value) {\n      return;\n    }\n\n    const date = this._parseDate(cFormat, value);\n\n    if (date !== 
null) {\n      event.value = this._util.printd(cFormat, date);\n    }\n  }\n\n  AFDate_Format(pdf) {\n    if 
(pdf >= 0 && pdf < this._dateFormats.length) {\n      this.AFDate_FormatEx(this._dateFormats[pdf]);\n    }\n  
}\n\n  AFDate_KeystrokeEx(cFormat) {\n    const event = globalThis.event;\n\n    if (!event.willCommit) {\n   
   return;\n    }\n\n    const value = this.AFMergeChange(event);\n\n    if (!value) {\n      return;\n    
}\n\n    if (this._parseDate(cFormat, value) === null) {\n      const invalid = 
_constants.GlobalConstants.IDS_INVALID_DATE;\n      const
  invalid2 = _constants.GlobalConstants.IDS_INVALID_DATE2;\n      const err = `${invalid} 
${this._mkTargetName(event)}${invalid2}${cFormat}`;\n\n      this._app.alert(err);\n\n      event.rc = 
false;\n    }\n  }\n\n  AFDate_Keystroke(pdf) {\n    if (pdf >= 0 && pdf < this._dateFormats.length) {\n      
this.AFDate_KeystrokeEx(this._dateFormats[pdf]);\n    }\n  }\n\n  AFRange_Validate(bGreaterThan, 
nGreaterThan, bLessThan, nLessThan) {\n    const event = globalThis.event;\n\n    if (!event.value) {\n      
return;\n    }\n\n    const value = this.AFMakeNumber(event.value);\n\n    if (value === null) {\n      
return;\n    }\n\n    bGreaterThan = !!bGreaterThan;\n    bLessThan = !!bLessThan;\n\n    if (bGreaterThan) 
{\n      nGreaterThan = this.AFMakeNumber(nGreaterThan);\n\n      if (nGreaterThan === null) {\n        
return;\n      }\n    }\n\n    if (bLessThan) {\n      nLessThan = this.AFMakeNumber(nLessThan);\n\n      if 
(nLessThan === null) {\n        return;\n      }\n    }\n\n    l
 et err = "";\n\n    if (bGreaterThan && bLessThan) {\n      if (value < nGreaterThan || value > nLessThan) 
{\n        err = this._util.printf(_constants.GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n      
}\n    } else if (bGreaterThan) {\n      if (value < nGreaterThan) {\n        err = 
this._util.printf(_constants.GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n      }\n    } else if (value 
nLessThan) {\n      err = this._util.printf(_constants.GlobalConstants.IDS_LESS_THAN, nLessThan);\n    
}\n\n    if (err) {\n      this._app.alert(err);\n\n      event.rc = false;\n    }\n  }\n\n  
AFSimple(cFunction, nValue1, nValue2) {\n    const value1 = this.AFMakeNumber(nValue1);\n\n    if (value1 === 
null) {\n      throw new Error("Invalid nValue1 in AFSimple");\n    }\n\n    const value2 = 
this.AFMakeNumber(nValue2);\n\n    if (value2 === null) {\n      throw new Error("Invalid nValue2 in 
AFSimple");\n    }\n\n    switch (cFunction) {\n      case "AVG":\n        return (val
 ue1 + value2) / 2;\n\n      case "SUM":\n        return value1 + value2;\n\n      case "PRD":\n        
return value1 * value2;\n\n      case "MIN":\n        return Math.min(value1, value2);\n\n      case "MAX":\n 
       return Math.max(value1, value2);\n    }\n\n    throw new Error("Invalid cFunction in AFSimple");\n  
}\n\n  AFSimple_Calculate(cFunction, cFields) {\n    const actions = {\n      AVG: args => args.reduce((acc, 
value) => acc + value, 0) / args.length,\n      SUM: args => args.reduce((acc, value) => acc + value, 0),\n   
   PRD: args => args.reduce((acc, value) => acc * value, 1),\n      MIN: args => args.reduce((acc, value) => 
Math.min(acc, value), Number.MAX_VALUE),\n      MAX: args => args.reduce((acc, value) => Math.max(acc, 
value), Number.MIN_VALUE)\n    };\n\n    if (!(cFunction in actions)) {\n      throw new TypeError("Invalid 
function in AFSimple_Calculate");\n    }\n\n    const event = globalThis.event;\n    const values = [];\n\n   
 for (const cField of cField
 s) {\n      const field = this._document.getField(cField);\n\n      const number = 
this.AFMakeNumber(field.value);\n\n      if (number !== null) {\n        values.push(number);\n      }\n    
}\n\n    if (values.length === 0) {\n      event.value = cFunction === "PRD" ? 1 : 0;\n      return;\n    
}\n\n    const res = actions[cFunction](values);\n    event.value = Math.round(1e6 * res) / 1e6;\n  }\n\n  
AFSpecial_Format(psf) {\n    const event = globalThis.event;\n\n    if (!event.value) {\n      return;\n    
}\n\n    psf = this.AFMakeNumber(psf);\n\n    if (psf === null) {\n      throw new Error("Invalid psf in 
AFSpecial_Format");\n    }\n\n    let formatStr = "";\n\n    switch (psf) {\n      case 0:\n        formatStr 
= "99999";\n        break;\n\n      case 1:\n        formatStr = "99999-9999";\n        break;\n\n      case 
2:\n        if (this._util.printx("9999999999", event.value).length >= 10) {\n          formatStr = "(999) 
999-9999";\n        } else {\n          formatStr = "9
 99-9999";\n        }\n\n        break;\n\n      case 3:\n        formatStr = "999-99-9999";\n        
break;\n\n      default:\n        throw new Error("Invalid psf in AFSpecial_Format");\n    }\n\n    
event.value = this._util.printx(formatStr, event.value);\n  }\n\n  AFSpecial_KeystrokeEx(cMask) {\n    if 
(!cMask) {\n      return;\n    }\n\n    const event = globalThis.event;\n    const value = 
this.AFMergeChange(event);\n    const checkers = new Map([["9", char => char >= "0" && char <= "9"], ["A", 
char => "a" <= char && char <= "z" || "A" <= char && char <= "Z"], ["O", char => "a" <= char && char <= "z" 
|| "A" <= char && char <= "Z" || "0" <= char && char <= "9"], ["X", char => true]]);\n\n    function 
_checkValidity(_value, _cMask) {\n      for (let i = 0, ii = value.length; i < ii; i++) {\n        const mask 
= _cMask.charAt(i);\n\n        const char = _value.charAt(i);\n\n        const checker = 
checkers.get(mask);\n\n        if (checker) {\n          if (!checker(char)) {\n    
         return false;\n          }\n        } else if (mask !== char) {\n          return false;\n        
}\n      }\n\n      return true;\n    }\n\n    if (!value) {\n      return;\n    }\n\n    const err = 
`${_constants.GlobalConstants.IDS_INVALID_VALUE} = "${cMask}"`;\n\n    if (value.length > cMask.length) {\n   
   this._app.alert(err);\n\n      event.rc = false;\n      return;\n    }\n\n    if (event.willCommit) {\n    
  if (value.length < cMask.length) {\n        this._app.alert(err);\n\n        event.rc = false;\n        
return;\n      }\n\n      if (!_checkValidity(value, cMask)) {\n        this._app.alert(err);\n\n        
event.rc = false;\n        return;\n      }\n\n      event.value += cMask.substring(value.length);\n      
return;\n    }\n\n    if (value.length < cMask.length) {\n      cMask = cMask.substring(0, value.length);\n   
 }\n\n    if (!_checkValidity(value, cMask)) {\n      this._app.alert(err);\n\n      event.rc = false;\n    
}\n  }\n\n  AFSpecial_Keystroke(ps
 f) {\n    const event = globalThis.event;\n\n    if (!event.value) {\n      return;\n    }\n\n    psf = 
this.AFMakeNumber(psf);\n\n    if (psf === null) {\n      throw new Error("Invalid psf in 
AFSpecial_Keystroke");\n    }\n\n    let formatStr;\n\n    switch (psf) {\n      case 0:\n        formatStr = 
"99999";\n        break;\n\n      case 1:\n        formatStr = "99999-9999";\n        break;\n\n      case 
2:\n        const finalLen = event.value.length + event.change.length + event.selStart - event.selEnd;\n\n    
    if (finalLen >= 8) {\n          formatStr = "(999) 999-9999";\n        } else {\n          formatStr = 
"999-9999";\n        }\n\n        break;\n\n      case 3:\n        formatStr = "999-99-9999";\n        
break;\n\n      default:\n        throw new Error("Invalid psf in AFSpecial_Keystroke");\n    }\n\n    
this.AFSpecial_KeystrokeEx(formatStr);\n  }\n\n  AFTime_FormatEx(cFormat) {\n    
this.AFDate_FormatEx(cFormat);\n  }\n\n  AFTime_Format(pdf) {\n    if (pdf >= 0 &&
  pdf < this._timeFormats.length) {\n      this.AFDate_FormatEx(this._timeFormats[pdf]);\n    }\n  }\n\n  
AFTime_KeystrokeEx(cFormat) {\n    this.AFDate_KeystrokeEx(cFormat);\n  }\n\n  AFTime_Keystroke(pdf) {\n    
if (pdf >= 0 && pdf < this._timeFormats.length) {\n      this.AFDate_KeystrokeEx(this._timeFormats[pdf]);\n   
 }\n  }\n\n  eMailValidate(str) {\n    return this._emailRegex.test(str);\n  }\n\n}\n\nexports.AForm = 
AForm;\n\n/***/ }),\n/* 9 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.App = void 0;\n\nvar 
_color = __w_pdfjs_require__(5);\n\nvar _event = __w_pdfjs_require__(10);\n\nvar _fullscreen = 
__w_pdfjs_require__(11);\n\nvar _pdf_object = __w_pdfjs_require__(7);\n\nvar _thermometer = 
__w_pdfjs_require__(12);\n\nconst VIEWER_TYPE = "PDF.js";\nconst VIEWER_VARIATION = "Full";\nconst 
VIEWER_VERSION = "10.0";\nconst FORMS_VERSION = undefined;\n\nclass App extends _
 pdf_object.PDFObject {\n  constructor(data) {\n    super(data);\n    this._constants = null;\n    
this._focusRect = true;\n    this._fs = null;\n    this._language = App._getLanguage(data.language);\n    
this._openInPlace = false;\n    this._platform = App._getPlatform(data.platform);\n    this._runtimeHighlight 
= false;\n    this._runtimeHighlightColor = ["T"];\n    this._thermometer = null;\n    this._toolbar = 
false;\n    this._document = data._document;\n    this._proxyHandler = data.proxyHandler;\n    this._objects 
= Object.create(null);\n    this._eventDispatcher = new _event.EventDispatcher(this._document, 
data.calculationOrder, this._objects);\n    this._timeoutIds = new WeakMap();\n\n    if (typeof 
FinalizationRegistry !== "undefined") {\n      this._timeoutIdsRegistry = new 
FinalizationRegistry(this._cleanTimeout.bind(this));\n    } else {\n      this._timeoutIdsRegistry = null;\n  
  }\n\n    this._timeoutCallbackIds = new Map();\n    this._timeoutCallbackId = 0;\n    this
 ._globalEval = data.globalEval;\n    this._externalCall = data.externalCall;\n    this._document = 
data._document;\n  }\n\n  _dispatchEvent(pdfEvent) {\n    this._eventDispatcher.dispatch(pdfEvent);\n  }\n\n  
_registerTimeoutCallback(cExpr) {\n    const id = this._timeoutCallbackId++;\n\n    
this._timeoutCallbackIds.set(id, cExpr);\n\n    return id;\n  }\n\n  _unregisterTimeoutCallback(id) {\n    
this._timeoutCallbackIds.delete(id);\n  }\n\n  _evalCallback({\n    callbackId,\n    interval\n  }) {\n    
const expr = this._timeoutCallbackIds.get(callbackId);\n\n    if (!interval) {\n      
this._unregisterTimeoutCallback(callbackId);\n    }\n\n    if (expr) {\n      this._globalEval(expr);\n    
}\n  }\n\n  _registerTimeout(callbackId, interval) {\n    const timeout = Object.create(null);\n    const id 
= {\n      callbackId,\n      interval\n    };\n\n    this._timeoutIds.set(timeout, id);\n\n    if 
(this._timeoutIdsRegistry) {\n      this._timeoutIdsRegistry.register(timeout, id);\n    
 }\n\n    return timeout;\n  }\n\n  _unregisterTimeout(timeout) {\n    if (this._timeoutIdsRegistry) {\n      
this._timeoutIdsRegistry.unregister(timeout);\n    }\n\n    const data = this._timeoutIds.get(timeout);\n\n   
 if (!data) {\n      return;\n    }\n\n    this._timeoutIds.delete(timeout);\n\n    
this._cleanTimeout(data);\n  }\n\n  _cleanTimeout({\n    callbackId,\n    interval\n  }) {\n    
this._unregisterTimeoutCallback(callbackId);\n\n    if (interval) {\n      
this._externalCall("clearInterval", [callbackId]);\n    } else {\n      this._externalCall("clearTimeout", 
[callbackId]);\n    }\n  }\n\n  static _getPlatform(platform) {\n    if (typeof platform === "string") {\n    
  platform = platform.toLowerCase();\n\n      if (platform.includes("win")) {\n        return "WIN";\n      } 
else if (platform.includes("mac")) {\n        return "MAC";\n      }\n    }\n\n    return "UNIX";\n  }\n\n  
static _getLanguage(language) {\n    const [main, sub] = language.toLowerCase().split(/[
 -_]/);\n\n    switch (main) {\n      case "zh":\n        if (sub === "cn" || sub === "sg") {\n          
return "CHS";\n        }\n\n        return "CHT";\n\n      case "da":\n        return "DAN";\n\n      case 
"de":\n        return "DEU";\n\n      case "es":\n        return "ESP";\n\n      case "fr":\n        return 
"FRA";\n\n      case "it":\n        return "ITA";\n\n      case "ko":\n        return "KOR";\n\n      case 
"ja":\n        return "JPN";\n\n      case "nl":\n        return "NLD";\n\n      case "no":\n        return 
"NOR";\n\n      case "pt":\n        if (sub === "br") {\n          return "PTB";\n        }\n\n        return 
"ENU";\n\n      case "fi":\n        return "SUO";\n\n      case "SV":\n        return "SVE";\n\n      
default:\n        return "ENU";\n    }\n  }\n\n  get activeDocs() {\n    return [this._document.wrapped];\n  
}\n\n  set activeDocs(_) {\n    throw new Error("app.activeDocs is read-only");\n  }\n\n  get calculate() {\n 
   return this._document.obj.cal
 culate;\n  }\n\n  set calculate(calculate) {\n    this._document.obj.calculate = calculate;\n  }\n\n  get 
constants() {\n    if (!this._constants) {\n      this._constants = Object.freeze({\n        align: 
Object.freeze({\n          left: 0,\n          center: 1,\n          right: 2,\n          top: 3,\n          
bottom: 4\n        })\n      });\n    }\n\n    return this._constants;\n  }\n\n  set constants(_) {\n    
throw new Error("app.constants is read-only");\n  }\n\n  get focusRect() {\n    return this._focusRect;\n  
}\n\n  set focusRect(val) {\n    this._focusRect = val;\n  }\n\n  get formsVersion() {\n    return 
FORMS_VERSION;\n  }\n\n  set formsVersion(_) {\n    throw new Error("app.formsVersion is read-only");\n  
}\n\n  get fromPDFConverters() {\n    return [];\n  }\n\n  set fromPDFConverters(_) {\n    throw new 
Error("app.fromPDFConverters is read-only");\n  }\n\n  get fs() {\n    if (this._fs === null) {\n      
this._fs = new Proxy(new _fullscreen.FullScreen({\n        sen
 d: this._send\n      }), this._proxyHandler);\n    }\n\n    return this._fs;\n  }\n\n  set fs(_) {\n    
throw new Error("app.fs is read-only");\n  }\n\n  get language() {\n    return this._language;\n  }\n\n  set 
language(_) {\n    throw new Error("app.language is read-only");\n  }\n\n  get media() {\n    return 
undefined;\n  }\n\n  set media(_) {\n    throw new Error("app.media is read-only");\n  }\n\n  get monitors() 
{\n    return [];\n  }\n\n  set monitors(_) {\n    throw new Error("app.monitors is read-only");\n  }\n\n  
get numPlugins() {\n    return 0;\n  }\n\n  set numPlugins(_) {\n    throw new Error("app.numPlugins is 
read-only");\n  }\n\n  get openInPlace() {\n    return this._openInPlace;\n  }\n\n  set openInPlace(val) {\n  
  this._openInPlace = val;\n  }\n\n  get platform() {\n    return this._platform;\n  }\n\n  set platform(_) 
{\n    throw new Error("app.platform is read-only");\n  }\n\n  get plugins() {\n    return [];\n  }\n\n  set 
plugins(_) {\n    throw new Error("a
 pp.plugins is read-only");\n  }\n\n  get printColorProfiles() {\n    return [];\n  }\n\n  set 
printColorProfiles(_) {\n    throw new Error("app.printColorProfiles is read-only");\n  }\n\n  get 
printerNames() {\n    return [];\n  }\n\n  set printerNames(_) {\n    throw new Error("app.printerNames is 
read-only");\n  }\n\n  get runtimeHighlight() {\n    return this._runtimeHighlight;\n  }\n\n  set 
runtimeHighlight(val) {\n    this._runtimeHighlight = val;\n  }\n\n  get runtimeHighlightColor() {\n    
return this._runtimeHighlightColor;\n  }\n\n  set runtimeHighlightColor(val) {\n    if 
(_color.Color._isValidColor(val)) {\n      this._runtimeHighlightColor = val;\n    }\n  }\n\n  get 
thermometer() {\n    if (this._thermometer === null) {\n      this._thermometer = new Proxy(new 
_thermometer.Thermometer({\n        send: this._send\n      }), this._proxyHandler);\n    }\n\n    return 
this._thermometer;\n  }\n\n  set thermometer(_) {\n    throw new Error("app.thermometer is read-only");\n  
 }\n\n  get toolbar() {\n    return this._toolbar;\n  }\n\n  set toolbar(val) {\n    this._toolbar = val;\n  
}\n\n  get toolbarHorizontal() {\n    return this.toolbar;\n  }\n\n  set toolbarHorizontal(value) {\n    
this.toolbar = value;\n  }\n\n  get toolbarVertical() {\n    return this.toolbar;\n  }\n\n  set 
toolbarVertical(value) {\n    this.toolbar = value;\n  }\n\n  get viewerType() {\n    return VIEWER_TYPE;\n  
}\n\n  set viewerType(_) {\n    throw new Error("app.viewerType is read-only");\n  }\n\n  get 
viewerVariation() {\n    return VIEWER_VARIATION;\n  }\n\n  set viewerVariation(_) {\n    throw new 
Error("app.viewerVariation is read-only");\n  }\n\n  get viewerVersion() {\n    return VIEWER_VERSION;\n  
}\n\n  set viewerVersion(_) {\n    throw new Error("app.viewerVersion is read-only");\n  }\n\n  addMenuItem() 
{}\n\n  addSubMenu() {}\n\n  addToolButton() {}\n\n  alert(cMsg, nIcon = 0, nType = 0, cTitle = "PDF.js", 
oDoc = null, oCheckbox = null) {\n    if (typeof cMsg === "obje
 ct") {\n      nType = cMsg.nType;\n      cMsg = cMsg.cMsg;\n    }\n\n    cMsg = (cMsg || "").toString();\n   
 nType = typeof nType !== "number" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n\n    if (nType >= 
2) {\n      return this._externalCall("confirm", [cMsg]) ? 4 : 3;\n    }\n\n    this._externalCall("alert", 
[cMsg]);\n\n    return 1;\n  }\n\n  beep() {}\n\n  beginPriv() {}\n\n  browseForDoc() {}\n\n  
clearInterval(oInterval) {\n    this._unregisterTimeout(oInterval);\n  }\n\n  clearTimeOut(oTime) {\n    
this._unregisterTimeout(oTime);\n  }\n\n  endPriv() {}\n\n  execDialog() {}\n\n  execMenuItem() {}\n\n  
getNthPlugInName() {}\n\n  getPath() {}\n\n  goBack() {}\n\n  goForward() {}\n\n  hideMenuItem() {}\n\n  
hideToolbarButton() {}\n\n  launchURL() {}\n\n  listMenuItems() {}\n\n  listToolbarButtons() {}\n\n  
loadPolicyFile() {}\n\n  mailGetAddrs() {}\n\n  mailMsg() {}\n\n  newDoc() {}\n\n  newCollection() {}\n\n  
newFDF() {}\n\n  openDoc() {}\n\n  openFDF() {}\n\n  p
 opUpMenu() {}\n\n  popUpMenuEx() {}\n\n  removeToolButton() {}\n\n  response(cQuestion, cTitle = "", 
cDefault = "", bPassword = "", cLabel = "") {\n    if (typeof cQuestion === "object") {\n      cDefault = 
cQuestion.cDefault;\n      cQuestion = cQuestion.cQuestion;\n    }\n\n    cQuestion = (cQuestion || 
"").toString();\n    cDefault = (cDefault || "").toString();\n    return this._externalCall("prompt", 
[cQuestion, cDefault || ""]);\n  }\n\n  setInterval(cExpr, nMilliseconds = 0) {\n    if (typeof cExpr === 
"object") {\n      nMilliseconds = cExpr.nMilliseconds || 0;\n      cExpr = cExpr.cExpr;\n    }\n\n    if 
(typeof cExpr !== "string") {\n      throw new TypeError("First argument of app.setInterval must be a 
string");\n    }\n\n    if (typeof nMilliseconds !== "number") {\n      throw new TypeError("Second argument 
of app.setInterval must be a number");\n    }\n\n    const callbackId = 
this._registerTimeoutCallback(cExpr);\n\n    this._externalCall("setInterval", [callbackId, n
 Milliseconds]);\n\n    return this._registerTimeout(callbackId, true);\n  }\n\n  setTimeOut(cExpr, 
nMilliseconds = 0) {\n    if (typeof cExpr === "object") {\n      nMilliseconds = cExpr.nMilliseconds || 0;\n 
     cExpr = cExpr.cExpr;\n    }\n\n    if (typeof cExpr !== "string") {\n      throw new TypeError("First 
argument of app.setTimeOut must be a string");\n    }\n\n    if (typeof nMilliseconds !== "number") {\n      
throw new TypeError("Second argument of app.setTimeOut must be a number");\n    }\n\n    const callbackId = 
this._registerTimeoutCallback(cExpr);\n\n    this._externalCall("setTimeout", [callbackId, 
nMilliseconds]);\n\n    return this._registerTimeout(callbackId, false);\n  }\n\n  trustedFunction() {}\n\n  
trustPropagatorFunction() {}\n\n}\n\nexports.App = App;\n\n/***/ }),\n/* 10 */\n/***/ 
((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: 
true\n}));\nexports.EventDispatcher = exports.Event = void 0;\n\nclass E
 vent {\n  constructor(data) {\n    this.change = data.change || "";\n    this.changeEx = data.changeEx || 
null;\n    this.commitKey = data.commitKey || 0;\n    this.fieldFull = data.fieldFull || false;\n    
this.keyDown = data.keyDown || false;\n    this.modifier = data.modifier || false;\n    this.name = 
data.name;\n    this.rc = true;\n    this.richChange = data.richChange || [];\n    this.richChangeEx = 
data.richChangeEx || [];\n    this.richValue = data.richValue || [];\n    this.selEnd = data.selEnd || -1;\n  
  this.selStart = data.selStart || -1;\n    this.shift = data.shift || false;\n    this.source = data.source 
|| null;\n    this.target = data.target || null;\n    this.targetName = "";\n    this.type = "Field";\n    
this.value = data.value || "";\n    this.willCommit = data.willCommit || false;\n  }\n\n}\n\nexports.Event = 
Event;\n\nclass EventDispatcher {\n  constructor(document, calculationOrder, objects) {\n    this._document = 
document;\n    this._calculationOrder = ca
 lculationOrder;\n    this._objects = objects;\n    this._document.obj._eventDispatcher = this;\n  }\n\n  
mergeChange(event) {\n    let value = event.value;\n\n    if (typeof value !== "string") {\n      value = 
value.toString();\n    }\n\n    const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : 
"";\n    const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : 
"";\n    return `${prefix}${event.change}${postfix}`;\n  }\n\n  dispatch(baseEvent) {\n    const id = 
baseEvent.id;\n\n    if (!(id in this._objects)) {\n      let event;\n\n      if (id === "doc" || id === 
"page") {\n        event = globalThis.event = new Event(baseEvent);\n        event.source = event.target = 
this._document.wrapped;\n        event.name = baseEvent.name;\n      }\n\n      if (id === "doc") {\n        
this._document.obj._dispatchDocEvent(event.name);\n      } else if (id === "page") {\n        
this._document.obj._dispatchPageEvent(event.name, base
 Event.actions, baseEvent.pageNumber);\n      }\n\n      return;\n    }\n\n    const name = baseEvent.name;\n 
   const source = this._objects[id];\n    const event = globalThis.event = new Event(baseEvent);\n    let 
savedChange;\n\n    if (source.obj._isButton()) {\n      source.obj._id = id;\n      event.value = 
source.obj._getExportValue(event.value);\n\n      if (name === "Action") {\n        source.obj._value = 
event.value;\n      }\n    }\n\n    switch (name) {\n      case "Keystroke":\n        savedChange = {\n       
   value: event.value,\n          change: event.change,\n          selStart: event.selStart,\n          
selEnd: event.selEnd\n        };\n        break;\n\n      case "Blur":\n      case "Focus":\n        
Object.defineProperty(event, "value", {\n          configurable: false,\n          writable: false,\n         
 enumerable: true,\n          value: event.value\n        });\n        break;\n\n      case "Validate":\n     
   this.runValidation(source, event);\n     
    return;\n\n      case "Action":\n        this.runActions(source, source, event, name);\n\n        if 
(this._document.obj.calculate) {\n          this.runCalculate(source, event);\n        }\n\n        return;\n 
   }\n\n    this.runActions(source, source, event, name);\n\n    if (name === "Keystroke") {\n      if 
(event.rc) {\n        if (event.willCommit) {\n          this.runValidation(source, event);\n        } else 
if (event.change !== savedChange.change || event.selStart !== savedChange.selStart || event.selEnd !== 
savedChange.selEnd) {\n          source.wrapped.value = this.mergeChange(event);\n        }\n      } else if 
(!event.willCommit) {\n        source.obj._send({\n          id: source.obj._id,\n          value: 
savedChange.value,\n          selRange: [savedChange.selStart, savedChange.selEnd]\n        });\n      }\n    
}\n  }\n\n  runValidation(source, event) {\n    const hasRan = this.runActions(source, source, event, 
"Validate");\n\n    if (event.rc) {\n      if (ha
 sRan) {\n        source.wrapped.value = event.value;\n        source.wrapped.valueAsString = event.value;\n  
    } else {\n        source.obj.value = event.value;\n        source.obj.valueAsString = event.value;\n      
}\n\n      if (this._document.obj.calculate) {\n        this.runCalculate(source, event);\n      }\n\n      
event.value = source.obj.value;\n      this.runActions(source, source, event, "Format");\n      
source.wrapped.valueAsString = event.value;\n    }\n  }\n\n  runActions(source, target, event, eventName) {\n 
   event.source = source.wrapped;\n    event.target = target.wrapped;\n    event.name = eventName;\n    
event.targetName = target.obj.name;\n    event.rc = true;\n    return target.obj._runActions(event);\n  }\n\n 
 calculateNow() {\n    if (!this._calculationOrder) {\n      return;\n    }\n\n    const first = 
this._calculationOrder[0];\n    const source = this._objects[first];\n    globalThis.event = new Event({});\n 
   this.runCalculate(source, globalThis.eve
 nt);\n  }\n\n  runCalculate(source, event) {\n    if (!this._calculationOrder) {\n      return;\n    }\n\n   
 for (const targetId of this._calculationOrder) {\n      if (!(targetId in this._objects)) {\n        
continue;\n      }\n\n      if (!this._document.obj.calculate) {\n        continue;\n      }\n\n      
event.value = null;\n      const target = this._objects[targetId];\n      this.runActions(source, target, 
event, "Calculate");\n\n      if (!event.rc) {\n        continue;\n      }\n\n      if (event.value !== null) 
{\n        target.wrapped.value = event.value;\n      }\n\n      event.value = target.obj.value;\n      
this.runActions(target, target, event, "Validate");\n\n      if (!event.rc) {\n        continue;\n      }\n\n 
     event.value = target.obj.value;\n      this.runActions(target, target, event, "Format");\n\n      if 
(event.value !== null) {\n        target.wrapped.valueAsString = event.value;\n      }\n    }\n  
}\n\n}\n\nexports.EventDispatcher = EventDispatcher
 ;\n\n/***/ }),\n/* 11 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.FullScreen = void 
0;\n\nvar _constants = __w_pdfjs_require__(2);\n\nvar _pdf_object = __w_pdfjs_require__(7);\n\nclass 
FullScreen extends _pdf_object.PDFObject {\n  constructor(data) {\n    super(data);\n    
this._backgroundColor = [];\n    this._clickAdvances = true;\n    this._cursor = _constants.Cursor.hidden;\n  
  this._defaultTransition = "";\n    this._escapeExits = true;\n    this._isFullScreen = true;\n    
this._loop = false;\n    this._timeDelay = 3600;\n    this._usePageTiming = false;\n    this._useTimer = 
false;\n  }\n\n  get backgroundColor() {\n    return this._backgroundColor;\n  }\n\n  set backgroundColor(_) 
{}\n\n  get clickAdvances() {\n    return this._clickAdvances;\n  }\n\n  set clickAdvances(_) {}\n\n  get 
cursor() {\n    return this._cursor;\n  }\n\n  set cursor(_) {}\n\n  get default
 Transition() {\n    return this._defaultTransition;\n  }\n\n  set defaultTransition(_) {}\n\n  get 
escapeExits() {\n    return this._escapeExits;\n  }\n\n  set escapeExits(_) {}\n\n  get isFullScreen() {\n    
return this._isFullScreen;\n  }\n\n  set isFullScreen(_) {}\n\n  get loop() {\n    return this._loop;\n  
}\n\n  set loop(_) {}\n\n  get timeDelay() {\n    return this._timeDelay;\n  }\n\n  set timeDelay(_) {}\n\n  
get transitions() {\n    return ["Replace", "WipeRight", "WipeLeft", "WipeDown", "WipeUp", 
"SplitHorizontalIn", "SplitHorizontalOut", "SplitVerticalIn", "SplitVerticalOut", "BlindsHorizontal", 
"BlindsVertical", "BoxIn", "BoxOut", "GlitterRight", "GlitterDown", "GlitterRightDown", "Dissolve", 
"Random"];\n  }\n\n  set transitions(_) {\n    throw new Error("fullscreen.transitions is read-only");\n  
}\n\n  get usePageTiming() {\n    return this._usePageTiming;\n  }\n\n  set usePageTiming(_) {}\n\n  get 
useTimer() {\n    return this._useTimer;\n  }\n\n  set useTimer(_) {}\
 n\n}\n\nexports.FullScreen = FullScreen;\n\n/***/ }),\n/* 12 */\n/***/ ((__unused_webpack_module, exports, 
__w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: 
true\n}));\nexports.Thermometer = void 0;\n\nvar _pdf_object = __w_pdfjs_require__(7);\n\nclass Thermometer 
extends _pdf_object.PDFObject {\n  constructor(data) {\n    super(data);\n    this._cancelled = false;\n    
this._duration = 100;\n    this._text = "";\n    this._value = 0;\n  }\n\n  get cancelled() {\n    return 
this._cancelled;\n  }\n\n  set cancelled(_) {\n    throw new Error("thermometer.cancelled is read-only");\n  
}\n\n  get duration() {\n    return this._duration;\n  }\n\n  set duration(val) {\n    this._duration = 
val;\n  }\n\n  get text() {\n    return this._text;\n  }\n\n  set text(val) {\n    this._text = val;\n  }\n\n 
 get value() {\n    return this._value;\n  }\n\n  set value(val) {\n    this._value = val;\n  }\n\n  begin() 
{}\n\n  end() {}\n\n}\n\nexports.Thermometer 
 = Thermometer;\n\n/***/ }),\n/* 13 */\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => 
{\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: true\n}));\nexports.Console = void 
0;\n\nvar _pdf_object = __w_pdfjs_require__(7);\n\nclass Console extends _pdf_object.PDFObject {\n  clear() 
{\n    this._send({\n      id: "clear"\n    });\n  }\n\n  hide() {}\n\n  println(msg) {\n    if (typeof msg 
=== "string") {\n      this._send({\n        command: "println",\n        value: "PDF.js Console:: " + msg\n  
    });\n    }\n  }\n\n  show() {}\n\n}\n\nexports.Console = Console;\n\n/***/ }),\n/* 14 */\n/***/ 
((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, 
"__esModule", ({\n  value: true\n}));\nexports.Doc = void 0;\n\nvar _common = __w_pdfjs_require__(4);\n\nvar 
_pdf_object = __w_pdfjs_require__(7);\n\nvar _print_params = __w_pdfjs_require__(15);\n\nvar _constants = 
__w_pdfjs_require__(2);\n\nclass InfoProxyHandler
  {\n  static get(obj, prop) {\n    return obj[prop.toLowerCase()];\n  }\n\n  static set(obj, prop, value) 
{\n    throw new Error(`doc.info.${prop} is read-only`);\n  }\n\n}\n\nclass Doc extends _pdf_object.PDFObject 
{\n  constructor(data) {\n    super(data);\n    this._expandos = globalThis;\n    this._baseURL = 
data.baseURL || "";\n    this._calculate = true;\n    this._delay = false;\n    this._dirty = false;\n    
this._disclosed = false;\n    this._media = undefined;\n    this._metadata = data.metadata || "";\n    
this._noautocomplete = undefined;\n    this._nocache = undefined;\n    this._spellDictionaryOrder = [];\n    
this._spellLanguageOrder = [];\n    this._printParams = null;\n    this._fields = new Map();\n    
this._fieldNames = [];\n    this._event = null;\n    this._author = data.Author || "";\n    this._creator = 
data.Creator || "";\n    this._creationDate = this._getDate(data.CreationDate) || null;\n    this._docID = 
data.docID || ["", ""];\n    this._documentFileName 
 = data.filename || "";\n    this._filesize = data.filesize || 0;\n    this._keywords = data.Keywords || 
"";\n    this._layout = data.layout || "";\n    this._modDate = this._getDate(data.ModDate) || null;\n    
this._numFields = 0;\n    this._numPages = data.numPages || 1;\n    this._pageNum = data.pageNum || 0;\n    
this._producer = data.Producer || "";\n    this._subject = data.Subject || "";\n    this._title = data.Title 
|| "";\n    this._URL = data.URL || "";\n    this._info = new Proxy({\n      title: this._title,\n      
author: this._author,\n      authors: data.authors || [this._author],\n      subject: this._subject,\n      
keywords: this._keywords,\n      creator: this._creator,\n      producer: this._producer,\n      
creationdate: this._creationDate,\n      moddate: this._modDate,\n      trapped: data.Trapped || "Unknown"\n  
  }, InfoProxyHandler);\n    this._zoomType = _constants.ZoomType.none;\n    this._zoom = data.zoom || 100;\n 
   this._actions = (0, _common.createActi
 onsMap)(data.actions);\n    this._globalEval = data.globalEval;\n    this._pageActions = new Map();\n  }\n\n 
 _dispatchDocEvent(name) {\n    if (name === "Open") {\n      const dontRun = new Set(["WillClose", 
"WillSave", "DidSave", "WillPrint", "DidPrint", "OpenAction"]);\n\n      for (const actionName of 
this._actions.keys()) {\n        if (!dontRun.has(actionName)) {\n          this._runActions(actionName);\n   
     }\n      }\n\n      this._runActions("OpenAction");\n    } else {\n      this._runActions(name);\n    
}\n  }\n\n  _dispatchPageEvent(name, actions, pageNumber) {\n    if (name === "PageOpen") {\n      if 
(!this._pageActions.has(pageNumber)) {\n        this._pageActions.set(pageNumber, (0, 
_common.createActionsMap)(actions));\n      }\n\n      this._pageNum = pageNumber - 1;\n    }\n\n    actions 
= this._pageActions.get(pageNumber)?.get(name);\n\n    if (actions) {\n      for (const action of actions) 
{\n        this._globalEval(action);\n      }\n    }\n  }\n\n  _runAc
 tions(name) {\n    const actions = this._actions.get(name);\n\n    if (actions) {\n      for (const action 
of actions) {\n        this._globalEval(action);\n      }\n    }\n  }\n\n  _addField(name, field) {\n    
this._fields.set(name, field);\n\n    this._fieldNames.push(name);\n\n    this._numFields++;\n  }\n\n  
_getDate(date) {\n    if (!date || date.length < 15 || !date.startsWith("D:")) {\n      return date;\n    
}\n\n    date = date.substring(2);\n    const year = date.substring(0, 4);\n    const month = 
date.substring(4, 6);\n    const day = date.substring(6, 8);\n    const hour = date.substring(8, 10);\n    
const minute = date.substring(10, 12);\n    const o = date.charAt(12);\n    let second, offsetPos;\n\n    if 
(o === "Z" || o === "+" || o === "-") {\n      second = "00";\n      offsetPos = 12;\n    } else {\n      
second = date.substring(12, 14);\n      offsetPos = 14;\n    }\n\n    const offset = 
date.substring(offsetPos).replaceAll("\'", "");\n    return new Date(`${yea
 r}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n  }\n\n  get author() {\n    return 
this._author;\n  }\n\n  set author(_) {\n    throw new Error("doc.author is read-only");\n  }\n\n  get 
baseURL() {\n    return this._baseURL;\n  }\n\n  set baseURL(baseURL) {\n    this._baseURL = baseURL;\n  
}\n\n  get bookmarkRoot() {\n    return undefined;\n  }\n\n  set bookmarkRoot(_) {\n    throw new 
Error("doc.bookmarkRoot is read-only");\n  }\n\n  get calculate() {\n    return this._calculate;\n  }\n\n  
set calculate(calculate) {\n    this._calculate = calculate;\n  }\n\n  get creator() {\n    return 
this._creator;\n  }\n\n  set creator(_) {\n    throw new Error("doc.creator is read-only");\n  }\n\n  get 
dataObjects() {\n    return [];\n  }\n\n  set dataObjects(_) {\n    throw new Error("doc.dataObjects is 
read-only");\n  }\n\n  get delay() {\n    return this._delay;\n  }\n\n  set delay(delay) {\n    this._delay = 
delay;\n  }\n\n  get dirty() {\n    return this._dirty;\n  }\n\n  set
  dirty(dirty) {\n    this._dirty = dirty;\n  }\n\n  get disclosed() {\n    return this._disclosed;\n  }\n\n  
set disclosed(disclosed) {\n    this._disclosed = disclosed;\n  }\n\n  get docID() {\n    return 
this._docID;\n  }\n\n  set docID(_) {\n    throw new Error("doc.docID is read-only");\n  }\n\n  get 
documentFileName() {\n    return this._documentFileName;\n  }\n\n  set documentFileName(_) {\n    throw new 
Error("doc.documentFileName is read-only");\n  }\n\n  get dynamicXFAForm() {\n    return false;\n  }\n\n  set 
dynamicXFAForm(_) {\n    throw new Error("doc.dynamicXFAForm is read-only");\n  }\n\n  get external() {\n    
return true;\n  }\n\n  set external(_) {\n    throw new Error("doc.external is read-only");\n  }\n\n  get 
filesize() {\n    return this._filesize;\n  }\n\n  set filesize(_) {\n    throw new Error("doc.filesize is 
read-only");\n  }\n\n  get hidden() {\n    return false;\n  }\n\n  set hidden(_) {\n    throw new 
Error("doc.hidden is read-only");\n  }\n\n  get hostC
 ontainer() {\n    return undefined;\n  }\n\n  set hostContainer(_) {\n    throw new Error("doc.hostContainer 
is read-only");\n  }\n\n  get icons() {\n    return undefined;\n  }\n\n  set icons(_) {\n    throw new 
Error("doc.icons is read-only");\n  }\n\n  get info() {\n    return this._info;\n  }\n\n  set info(_) {\n    
throw new Error("doc.info is read-only");\n  }\n\n  get innerAppWindowRect() {\n    return [0, 0, 0, 0];\n  
}\n\n  set innerAppWindowRect(_) {\n    throw new Error("doc.innerAppWindowRect is read-only");\n  }\n\n  get 
innerDocWindowRect() {\n    return [0, 0, 0, 0];\n  }\n\n  set innerDocWindowRect(_) {\n    throw new 
Error("doc.innerDocWindowRect is read-only");\n  }\n\n  get isModal() {\n    return false;\n  }\n\n  set 
isModal(_) {\n    throw new Error("doc.isModal is read-only");\n  }\n\n  get keywords() {\n    return 
this._keywords;\n  }\n\n  set keywords(_) {\n    throw new Error("doc.keywords is read-only");\n  }\n\n  get 
layout() {\n    return this._layout;\n  
 }\n\n  set layout(value) {\n    if (typeof value !== "string") {\n      return;\n    }\n\n    if (value !== 
"SinglePage" && value !== "OneColumn" && value !== "TwoColumnLeft" && value !== "TwoPageLeft" && value !== 
"TwoColumnRight" && value !== "TwoPageRight") {\n      value = "SinglePage";\n    }\n\n    this._send({\n     
 command: "layout",\n      value\n    });\n\n    this._layout = value;\n  }\n\n  get media() {\n    return 
this._media;\n  }\n\n  set media(media) {\n    this._media = media;\n  }\n\n  get metadata() {\n    return 
this._metadata;\n  }\n\n  set metadata(metadata) {\n    this._metadata = metadata;\n  }\n\n  get modDate() 
{\n    return this._modDate;\n  }\n\n  set modDate(_) {\n    throw new Error("doc.modDate is read-only");\n  
}\n\n  get mouseX() {\n    return 0;\n  }\n\n  set mouseX(_) {\n    throw new Error("doc.mouseX is 
read-only");\n  }\n\n  get mouseY() {\n    return 0;\n  }\n\n  set mouseY(_) {\n    throw new 
Error("doc.mouseY is read-only");\n  }\n\n  get n
 oautocomplete() {\n    return this._noautocomplete;\n  }\n\n  set noautocomplete(noautocomplete) {\n    
this._noautocomplete = noautocomplete;\n  }\n\n  get nocache() {\n    return this._nocache;\n  }\n\n  set 
nocache(nocache) {\n    this._nocache = nocache;\n  }\n\n  get numFields() {\n    return this._numFields;\n  
}\n\n  set numFields(_) {\n    throw new Error("doc.numFields is read-only");\n  }\n\n  get numPages() {\n    
return this._numPages;\n  }\n\n  set numPages(_) {\n    throw new Error("doc.numPages is read-only");\n  
}\n\n  get numTemplates() {\n    return 0;\n  }\n\n  set numTemplates(_) {\n    throw new 
Error("doc.numTemplates is read-only");\n  }\n\n  get outerAppWindowRect() {\n    return [0, 0, 0, 0];\n  
}\n\n  set outerAppWindowRect(_) {\n    throw new Error("doc.outerAppWindowRect is read-only");\n  }\n\n  get 
outerDocWindowRect() {\n    return [0, 0, 0, 0];\n  }\n\n  set outerDocWindowRect(_) {\n    throw new 
Error("doc.outerDocWindowRect is read-only");\n  }\n\n 
  get pageNum() {\n    return this._pageNum;\n  }\n\n  set pageNum(value) {\n    if (typeof value !== 
"number" || value < 0 || value >= this._numPages) {\n      return;\n    }\n\n    this._send({\n      command: 
"page-num",\n      value\n    });\n\n    this._pageNum = value;\n  }\n\n  get pageWindowRect() {\n    return 
[0, 0, 0, 0];\n  }\n\n  set pageWindowRect(_) {\n    throw new Error("doc.pageWindowRect is read-only");\n  
}\n\n  get path() {\n    return "";\n  }\n\n  set path(_) {\n    throw new Error("doc.path is read-only");\n  
}\n\n  get permStatusReady() {\n    return true;\n  }\n\n  set permStatusReady(_) {\n    throw new 
Error("doc.permStatusReady is read-only");\n  }\n\n  get producer() {\n    return this._producer;\n  }\n\n  
set producer(_) {\n    throw new Error("doc.producer is read-only");\n  }\n\n  get requiresFullSave() {\n    
return false;\n  }\n\n  set requiresFullSave(_) {\n    throw new Error("doc.requiresFullSave is 
read-only");\n  }\n\n  get securityHandler() {\
 n    return null;\n  }\n\n  set securityHandler(_) {\n    throw new Error("doc.securityHandler is 
read-only");\n  }\n\n  get selectedAnnots() {\n    return [];\n  }\n\n  set selectedAnnots(_) {\n    throw 
new Error("doc.selectedAnnots is read-only");\n  }\n\n  get sounds() {\n    return [];\n  }\n\n  set 
sounds(_) {\n    throw new Error("doc.sounds is read-only");\n  }\n\n  get spellDictionaryOrder() {\n    
return this._spellDictionaryOrder;\n  }\n\n  set spellDictionaryOrder(spellDictionaryOrder) {\n    
this._spellDictionaryOrder = spellDictionaryOrder;\n  }\n\n  get spellLanguageOrder() {\n    return 
this._spellLanguageOrder;\n  }\n\n  set spellLanguageOrder(spellLanguageOrder) {\n    
this._spellLanguageOrder = spellLanguageOrder;\n  }\n\n  get subject() {\n    return this._subject;\n  }\n\n  
set subject(_) {\n    throw new Error("doc.subject is read-only");\n  }\n\n  get templates() {\n    return 
[];\n  }\n\n  set templates(_) {\n    throw new Error("doc.templates is read-only");
 \n  }\n\n  get title() {\n    return this._title;\n  }\n\n  set title(_) {\n    throw new Error("doc.title 
is read-only");\n  }\n\n  get URL() {\n    return this._URL;\n  }\n\n  set URL(_) {\n    throw new 
Error("doc.URL is read-only");\n  }\n\n  get viewState() {\n    return undefined;\n  }\n\n  set viewState(_) 
{\n    throw new Error("doc.viewState is read-only");\n  }\n\n  get xfa() {\n    return this._xfa;\n  }\n\n  
set xfa(_) {\n    throw new Error("doc.xfa is read-only");\n  }\n\n  get XFAForeground() {\n    return 
false;\n  }\n\n  set XFAForeground(_) {\n    throw new Error("doc.XFAForeground is read-only");\n  }\n\n  get 
zoomType() {\n    return this._zoomType;\n  }\n\n  set zoomType(type) {\n    if (typeof type !== "string") 
{\n      return;\n    }\n\n    switch (type) {\n      case _constants.ZoomType.none:\n        this._send({\n  
        command: "zoom",\n          value: 1\n        });\n\n        break;\n\n      case 
_constants.ZoomType.fitP:\n        this._send({\n    
       command: "zoom",\n          value: "page-fit"\n        });\n\n        break;\n\n      case 
_constants.ZoomType.fitW:\n        this._send({\n          command: "zoom",\n          value: "page-width"\n  
      });\n\n        break;\n\n      case _constants.ZoomType.fitH:\n        this._send({\n          command: 
"zoom",\n          value: "page-height"\n        });\n\n        break;\n\n      case 
_constants.ZoomType.fitV:\n        this._send({\n          command: "zoom",\n          value: "auto"\n        
});\n\n        break;\n\n      case _constants.ZoomType.pref:\n      case _constants.ZoomType.refW:\n        
break;\n\n      default:\n        return;\n    }\n\n    this._zoomType = type;\n  }\n\n  get zoom() {\n    
return this._zoom;\n  }\n\n  set zoom(value) {\n    if (typeof value !== "number" || value < 8.33 || value > 
6400) {\n      return;\n    }\n\n    this._send({\n      command: "zoom",\n      value: value / 100\n    
});\n  }\n\n  addAnnot() {}\n\n  addField() {}\n\n  add
 Icon() {}\n\n  addLink() {}\n\n  addRecipientListCryptFilter() {}\n\n  addRequirement() {}\n\n  addScript() 
{}\n\n  addThumbnails() {}\n\n  addWatermarkFromFile() {}\n\n  addWatermarkFromText() {}\n\n  addWeblinks() 
{}\n\n  bringToFront() {}\n\n  calculateNow() {\n    this._eventDispatcher.calculateNow();\n  }\n\n  
closeDoc() {}\n\n  colorConvertPage() {}\n\n  createDataObject() {}\n\n  createTemplate() {}\n\n  
deletePages() {}\n\n  deleteSound() {}\n\n  embedDocAsDataObject() {}\n\n  embedOutputIntent() {}\n\n  
encryptForRecipients() {}\n\n  encryptUsingPolicy() {}\n\n  exportAsFDF() {}\n\n  exportAsFDFStr() {}\n\n  
exportAsText() {}\n\n  exportAsXFDF() {}\n\n  exportAsXFDFStr() {}\n\n  exportDataObject() {}\n\n  
exportXFAData() {}\n\n  extractPages() {}\n\n  flattenPages() {}\n\n  getAnnot() {}\n\n  getAnnots() {}\n\n  
getAnnot3D() {}\n\n  getAnnots3D() {}\n\n  getColorConvertAction() {}\n\n  getDataObject() {}\n\n  
getDataObjectContents() {}\n\n  getField(cName) {\n    if (typeof
  cName === "object") {\n      cName = cName.cName;\n    }\n\n    if (typeof cName !== "string") {\n      
throw new TypeError("Invalid field name: must be a string");\n    }\n\n    const searchedField = 
this._fields.get(cName);\n\n    if (searchedField) {\n      return searchedField;\n    }\n\n    const parts = 
cName.split("#");\n    let childIndex = NaN;\n\n    if (parts.length === 2) {\n      childIndex = 
Math.floor(parseFloat(parts[1]));\n      cName = parts[0];\n    }\n\n    for (const [name, field] of 
this._fields.entries()) {\n      if (name.endsWith(cName)) {\n        if (!isNaN(childIndex)) {\n          
const children = this._getChildren(name);\n\n          if (childIndex < 0 || childIndex >= children.length) 
{\n            childIndex = 0;\n          }\n\n          if (childIndex < children.length) {\n            
this._fields.set(cName, children[childIndex]);\n\n            return children[childIndex];\n          }\n     
   }\n\n        this._fields.set(cName, field);\n\n    
     return field;\n      }\n    }\n\n    return null;\n  }\n\n  _getChildren(fieldName) {\n    const len = 
fieldName.length;\n    const children = [];\n    const pattern = /^\\.[^.]+$/;\n\n    for (const [name, 
field] of this._fields.entries()) {\n      if (name.startsWith(fieldName)) {\n        const finalPart = 
name.slice(len);\n\n        if (finalPart.match(pattern)) {\n          children.push(field);\n        }\n     
 }\n    }\n\n    return children;\n  }\n\n  getIcon() {}\n\n  getLegalWarnings() {}\n\n  getLinks() {}\n\n  
getNthFieldName(nIndex) {\n    if (typeof nIndex === "object") {\n      nIndex = nIndex.nIndex;\n    }\n\n    
if (typeof nIndex !== "number") {\n      throw new TypeError("Invalid field index: must be a number");\n    
}\n\n    if (0 <= nIndex && nIndex < this.numFields) {\n      return this._fieldNames[Math.trunc(nIndex)];\n  
  }\n\n    return null;\n  }\n\n  getNthTemplate() {\n    return null;\n  }\n\n  getOCGs() {}\n\n  
getOCGOrder() {}\n\n  getPageBox() {}
 \n\n  getPageLabel() {}\n\n  getPageNthWord() {}\n\n  getPageNthWordQuads() {}\n\n  getPageNumWords() {}\n\n 
 getPageRotation() {}\n\n  getPageTransition() {}\n\n  getPrintParams() {\n    if (!this._printParams) {\n    
  this._printParams = new _print_params.PrintParams({\n        lastPage: this._numPages - 1\n      });\n    
}\n\n    return this._printParams;\n  }\n\n  getSound() {}\n\n  getTemplate() {}\n\n  getURL() {}\n\n  
gotoNamedDest() {}\n\n  importAnFDF() {}\n\n  importAnXFDF() {}\n\n  importDataObject() {}\n\n  importIcon() 
{}\n\n  importSound() {}\n\n  importTextData() {}\n\n  importXFAData() {}\n\n  insertPages() {}\n\n  
mailDoc() {}\n\n  mailForm() {}\n\n  movePage() {}\n\n  newPage() {}\n\n  openDataObject() {}\n\n  print(bUI 
= true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = 
false, bAnnotations = true, printParams = null) {\n    if (typeof bUI === "object") {\n      nStart = 
bUI.nStart;\n      nEnd = bUI.nEnd;\n     
  bSilent = bUI.bSilent;\n      bShrinkToFit = bUI.bShrinkToFit;\n      bPrintAsImage = bUI.bPrintAsImage;\n  
    bReverse = bUI.bReverse;\n      bAnnotations = bUI.bAnnotations;\n      printParams = bUI.printParams;\n  
    bUI = bUI.bUI;\n    }\n\n    if (printParams) {\n      nStart = printParams.firstPage;\n      nEnd = 
printParams.lastPage;\n    }\n\n    if (typeof nStart === "number") {\n      nStart = Math.max(0, 
Math.trunc(nStart));\n    } else {\n      nStart = 0;\n    }\n\n    if (typeof nEnd === "number") {\n      
nEnd = Math.max(0, Math.trunc(nEnd));\n    } else {\n      nEnd = -1;\n    }\n\n    this._send({\n      
command: "print",\n      start: nStart,\n      end: nEnd\n    });\n  }\n\n  removeDataObject() {}\n\n  
removeField() {}\n\n  removeIcon() {}\n\n  removeLinks() {}\n\n  removeRequirement() {}\n\n  removeScript() 
{}\n\n  removeTemplate() {}\n\n  removeThumbnails() {}\n\n  removeWeblinks() {}\n\n  replacePages() {}\n\n  
resetForm(aFields = null) {\n    if (aFields 
 && !Array.isArray(aFields) && typeof aFields === "object") {\n      aFields = aFields.aFields;\n    }\n\n    
let mustCalculate = false;\n\n    if (aFields) {\n      for (const fieldName of aFields) {\n        if 
(!fieldName) {\n          continue;\n        }\n\n        const field = this.getField(fieldName);\n\n        
if (!field) {\n          continue;\n        }\n\n        field.value = field.defaultValue;\n        
field.valueAsString = field.value;\n        mustCalculate = true;\n      }\n    } else {\n      mustCalculate 
= this._fields.size !== 0;\n\n      for (const field of this._fields.values()) {\n        field.value = 
field.defaultValue;\n        field.valueAsString = field.value;\n      }\n    }\n\n    if (mustCalculate) {\n 
     this.calculateNow();\n    }\n  }\n\n  saveAs() {}\n\n  scroll() {}\n\n  selectPageNthWord() {}\n\n  
setAction() {}\n\n  setDataObjectContents() {}\n\n  setOCGOrder() {}\n\n  setPageAction() {}\n\n  
setPageBoxes() {}\n\n  setPageLabels() {}\n\n  se
 tPageRotations() {}\n\n  setPageTabOrder() {}\n\n  setPageTransitions() {}\n\n  spawnPageFromTemplate() 
{}\n\n  submitForm() {}\n\n  syncAnnotScan() {}\n\n}\n\nexports.Doc = Doc;\n\n/***/ }),\n/* 15 */\n/***/ 
((__unused_webpack_module, exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: 
true\n}));\nexports.PrintParams = void 0;\n\nclass PrintParams {\n  constructor(data) {\n    this.binaryOk = 
true;\n    this.bitmapDPI = 150;\n    this.booklet = {\n      binding: 0,\n      duplexMode: 0,\n      
subsetFrom: 0,\n      subsetTo: -1\n    };\n    this.colorOverride = 0;\n    this.colorProfile = "";\n    
this.constants = Object.freeze({\n      bookletBindings: Object.freeze({\n        Left: 0,\n        Right: 
1,\n        LeftTall: 2,\n        RightTall: 3\n      }),\n      bookletDuplexMode: Object.freeze({\n        
BothSides: 0,\n        FrontSideOnly: 1,\n        BasicSideOnly: 2\n      }),\n      colorOverrides: 
Object.freeze({\n        auto: 0,\n        gray
 : 1,\n        mono: 2\n      }),\n      fontPolicies: Object.freeze({\n        everyPage: 0,\n        
jobStart: 1,\n        pageRange: 2\n      }),\n      handling: Object.freeze({\n        none: 0,\n        
fit: 1,\n        shrink: 2,\n        tileAll: 3,\n        tileLarge: 4,\n        nUp: 5,\n        booklet: 
6\n      }),\n      interactionLevel: Object.freeze({\n        automatic: 0,\n        full: 1,\n        
silent: 2\n      }),\n      nUpPageOrders: Object.freeze({\n        Horizontal: 0,\n        
HorizontalReversed: 1,\n        Vertical: 2\n      }),\n      printContents: Object.freeze({\n        doc: 
0,\n        docAndComments: 1,\n        formFieldsOnly: 2\n      }),\n      flagValues: Object.freeze({\n     
   applyOverPrint: 1,\n        applySoftProofSettings: 1 << 1,\n        applyWorkingColorSpaces: 1 << 2,\n    
    emitHalftones: 1 << 3,\n        emitPostScriptXObjects: 1 << 4,\n        emitFormsAsPSForms: 1 << 5,\n    
    maxJP2KRes: 1 << 6,\n        setPageSize: 1 <
 < 7,\n        suppressBG: 1 << 8,\n        suppressCenter: 1 << 9,\n        suppressCJKFontSubst: 1 << 10,\n 
       suppressCropClip: 1 << 1,\n        suppressRotate: 1 << 12,\n        suppressTransfer: 1 << 13,\n      
  suppressUCR: 1 << 14,\n        useTrapAnnots: 1 << 15,\n        usePrintersMarks: 1 << 16\n      }),\n      
rasterFlagValues: Object.freeze({\n        textToOutline: 1,\n        strokesToOutline: 1 << 1,\n        
allowComplexClip: 1 << 2,\n        preserveOverprint: 1 << 3\n      }),\n      subsets: Object.freeze({\n     
   all: 0,\n        even: 1,\n        odd: 2\n      }),\n      tileMarks: Object.freeze({\n        none: 0,\n 
       west: 1,\n        east: 2\n      }),\n      usages: Object.freeze({\n        auto: 0,\n        use: 
1,\n        noUse: 2\n      })\n    });\n    this.downloadFarEastFonts = false;\n    this.fileName = "";\n    
this.firstPage = 0;\n    this.flags = 0;\n    this.fontPolicy = 0;\n    this.gradientDPI = 150;\n    
this.interactive = 1;\n  
   this.lastPage = data.lastPage;\n    this.npUpAutoRotate = false;\n    this.npUpNumPagesH = 2;\n    
this.npUpNumPagesV = 2;\n    this.npUpPageBorder = false;\n    this.npUpPageOrder = 0;\n    this.pageHandling 
= 0;\n    this.pageSubset = 0;\n    this.printAsImage = false;\n    this.printContent = 0;\n    
this.printerName = "";\n    this.psLevel = 0;\n    this.rasterFlags = 0;\n    this.reversePages = false;\n    
this.tileLabel = false;\n    this.tileMark = 0;\n    this.tileOverlap = 0;\n    this.tileScale = 1.0;\n    
this.transparencyLevel = 75;\n    this.usePrinterCRD = 0;\n    this.useT1Conversion = 0;\n  
}\n\n}\n\nexports.PrintParams = PrintParams;\n\n/***/ }),\n/* 16 */\n/***/ ((__unused_webpack_module, 
exports) => {\n\n\n\nObject.defineProperty(exports, "__esModule", ({\n  value: 
true\n}));\nexports.ProxyHandler = void 0;\n\nclass ProxyHandler {\n  constructor() {\n    this.nosend = new 
Set(["delay"]);\n  }\n\n  get(obj, prop) {\n    if (prop in obj._expandos) {\n      const v
 al = obj._expandos[prop];\n\n      if (typeof val === "function") {\n        return val.bind(obj);\n      
}\n\n      return val;\n    }\n\n    if (typeof prop === "string" && !prop.startsWith("_") && prop in obj) 
{\n      const val = obj[prop];\n\n      if (typeof val === "function") {\n        return val.bind(obj);\n    
  }\n\n      return val;\n    }\n\n    return undefined;\n  }\n\n  set(obj, prop, value) {\n    if 
(obj._kidIds) {\n      obj._kidIds.forEach(id => {\n        obj._appObjects[id].wrapped[prop] = value;\n      
});\n    }\n\n    if (typeof prop === "string" && !prop.startsWith("_") && prop in obj) {\n      const old = 
obj[prop];\n      obj[prop] = value;\n\n      if (!this.nosend.has(prop) && obj._send && obj._id !== null && 
typeof old !== "function") {\n        const data = {\n          id: obj._id\n        };\n        data[prop] = 
obj[prop];\n\n        if (!obj._siblings) {\n          obj._send(data);\n        } else {\n          
data.siblings = obj._siblings;\n\n  
         obj._send(data);\n        }\n      }\n    } else {\n      obj._expandos[prop] = value;\n    }\n\n    
return true;\n  }\n\n  has(obj, prop) {\n    return prop in obj._expandos || typeof prop === "string" && 
!prop.startsWith("_") && prop in obj;\n  }\n\n  getPrototypeOf(obj) {\n    return null;\n  }\n\n  
setPrototypeOf(obj, proto) {\n    return false;\n  }\n\n  isExtensible(obj) {\n    return true;\n  }\n\n  
preventExtensions(obj) {\n    return false;\n  }\n\n  getOwnPropertyDescriptor(obj, prop) {\n    if (prop in 
obj._expandos) {\n      return {\n        configurable: true,\n        enumerable: true,\n        value: 
obj._expandos[prop]\n      };\n    }\n\n    if (typeof prop === "string" && !prop.startsWith("_") && prop in 
obj) {\n      return {\n        configurable: true,\n        enumerable: true,\n        value: obj[prop]\n    
  };\n    }\n\n    return undefined;\n  }\n\n  defineProperty(obj, key, descriptor) {\n    
Object.defineProperty(obj._expandos, key, descriptor);\
 n    return true;\n  }\n\n  deleteProperty(obj, prop) {\n    if (prop in obj._expandos) {\n      delete 
obj._expandos[prop];\n    }\n  }\n\n  ownKeys(obj) {\n    const fromExpandos = 
Reflect.ownKeys(obj._expandos);\n    const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith("_"));\n  
  return fromExpandos.concat(fromObj);\n  }\n\n}\n\nexports.ProxyHandler = ProxyHandler;\n\n/***/ }),\n/* 17 
*/\n/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {\n\n\n\nObject.defineProperty(exports, 
"__esModule", ({\n  value: true\n}));\nexports.Util = void 0;\n\nvar _pdf_object = 
__w_pdfjs_require__(7);\n\nclass Util extends _pdf_object.PDFObject {\n  constructor(data) {\n    
super(data);\n    this._scandCache = new Map();\n    this._months = ["January", "February", "March", "April", 
"May", "June", "July", "August", "September", "October", "November", "December"];\n    this._days = 
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];\n    this.MILL
 ISECONDS_IN_DAY = 86400000;\n    this.MILLISECONDS_IN_WEEK = 604800000;\n    this._externalCall = 
data.externalCall;\n  }\n\n  printf(...args) {\n    if (args.length === 0) {\n      throw new Error("Invalid 
number of params in printf");\n    }\n\n    if (typeof args[0] !== "string") {\n      throw new 
TypeError("First argument of printf must be a string");\n    }\n\n    const pattern = /%(,[0-4])?([+ 
0#]+)?([0-9]+)?(\\.[0-9]+)?(.)/g;\n    const PLUS = 1;\n    const SPACE = 2;\n    const ZERO = 4;\n    const 
HASH = 8;\n    let i = 0;\n    return args[0].replace(pattern, function (match, nDecSep, cFlags, nWidth, 
nPrecision, cConvChar) {\n      if (cConvChar !== "d" && cConvChar !== "f" && cConvChar !== "s" && cConvChar 
!== "x") {\n        const buf = ["%"];\n\n        for (const str of [nDecSep, cFlags, nWidth, nPrecision, 
cConvChar]) {\n          if (str) {\n            buf.push(str);\n          }\n        }\n\n        return 
buf.join("");\n      }\n\n      i++;\n\n      if (i === ar
 gs.length) {\n        throw new Error("Not enough arguments in printf");\n      }\n\n      const arg = 
args[i];\n\n      if (cConvChar === "s") {\n        return arg.toString();\n      }\n\n      let flags = 
0;\n\n      if (cFlags) {\n        for (const flag of cFlags) {\n          switch (flag) {\n            case 
"+":\n              flags |= PLUS;\n              break;\n\n            case " ":\n              flags |= 
SPACE;\n              break;\n\n            case "0":\n              flags |= ZERO;\n              break;\n\n 
           case "#":\n              flags |= HASH;\n              break;\n          }\n        }\n      }\n\n 
     cFlags = flags;\n\n      if (nWidth) {\n        nWidth = parseInt(nWidth);\n      }\n\n      let intPart 
= Math.trunc(arg);\n\n      if (cConvChar === "x") {\n        let hex = 
Math.abs(intPart).toString(16).toUpperCase();\n\n        if (nWidth !== undefined) {\n          hex = 
hex.padStart(nWidth, cFlags & ZERO ? "0" : " ");\n        }\n\n       
  if (cFlags & HASH) {\n          hex = `0x${hex}`;\n        }\n\n        return hex;\n      }\n\n      if 
(nPrecision) {\n        nPrecision = parseInt(nPrecision.substring(1));\n      }\n\n      nDecSep = nDecSep ? 
nDecSep.substring(1) : "0";\n      const separators = {\n        0: [",", "."],\n        1: ["", "."],\n      
  2: [".", ","],\n        3: ["", ","],\n        4: ["\'", "."]\n      };\n      const [thousandSep, 
decimalSep] = separators[nDecSep];\n      let decPart = "";\n\n      if (cConvChar === "f") {\n        if 
(nPrecision !== undefined) {\n          decPart = Math.abs(arg - intPart).toFixed(nPrecision);\n        } 
else {\n          decPart = Math.abs(arg - intPart).toString();\n        }\n\n        if (decPart.length > 2) 
{\n          decPart = `${decimalSep}${decPart.substring(2)}`;\n        } else if (cFlags & HASH) {\n         
 decPart = ".";\n        } else {\n          decPart = "";\n        }\n      }\n\n      let sign = "";\n\n    
  if (intPart < 0) {\n      
   sign = "-";\n        intPart = -intPart;\n      } else if (cFlags & PLUS) {\n        sign = "+";\n      } 
else if (cFlags & SPACE) {\n        sign = " ";\n      }\n\n      if (thousandSep && intPart >= 1000) {\n     
   const buf = [];\n\n        while (true) {\n          buf.push((intPart % 1000).toString().padStart(3, 
"0"));\n          intPart = Math.trunc(intPart / 1000);\n\n          if (intPart < 1000) {\n            
buf.push(intPart.toString());\n            break;\n          }\n        }\n\n        intPart = 
buf.reverse().join(thousandSep);\n      } else {\n        intPart = intPart.toString();\n      }\n\n      let 
n = `${intPart}${decPart}`;\n\n      if (nWidth !== undefined) {\n        n = n.padStart(nWidth - 
sign.length, cFlags & ZERO ? "0" : " ");\n      }\n\n      return `${sign}${n}`;\n    });\n  }\n\n  
iconStreamFromIcon() {}\n\n  printd(cFormat, oDate) {\n    switch (cFormat) {\n      case 0:\n        return 
this.printd("D:yyyymmddHHMMss", oDate);\n\n      case 1:\n
         return this.printd("yyyy.mm.dd HH:MM:ss", oDate);\n\n      case 2:\n        return 
this.printd("m/d/yy h:MM:ss tt", oDate);\n    }\n\n    const handlers = {\n      mmmm: data => {\n        
return this._months[data.month];\n      },\n      mmm: data => {\n        return 
this._months[data.month].substring(0, 3);\n      },\n      mm: data => {\n        return (data.month + 
1).toString().padStart(2, "0");\n      },\n      m: data => {\n        return (data.month + 1).toString();\n  
    },\n      dddd: data => {\n        return this._days[data.dayOfWeek];\n      },\n      ddd: data => {\n   
     return this._days[data.dayOfWeek].substring(0, 3);\n      },\n      dd: data => {\n        return 
data.day.toString().padStart(2, "0");\n      },\n      d: data => {\n        return data.day.toString();\n    
  },\n      yyyy: data => {\n        return data.year.toString();\n      },\n      yy: data => {\n        
return (data.year % 100).toString().padStart(2, "0");\n      },\n      HH: da
 ta => {\n        return data.hours.toString().padStart(2, "0");\n      },\n      H: data => {\n        
return data.hours.toString();\n      },\n      hh: data => {\n        return (1 + (data.hours + 11) % 
12).toString().padStart(2, "0");\n      },\n      h: data => {\n        return (1 + (data.hours + 11) % 
12).toString();\n      },\n      MM: data => {\n        return data.minutes.toString().padStart(2, "0");\n    
  },\n      M: data => {\n        return data.minutes.toString();\n      },\n      ss: data => {\n        
return data.seconds.toString().padStart(2, "0");\n      },\n      s: data => {\n        return 
data.seconds.toString();\n      },\n      tt: data => {\n        return data.hours < 12 ? "am" : "pm";\n      
},\n      t: data => {\n        return data.hours < 12 ? "a" : "p";\n      }\n    };\n    const data = {\n    
  year: oDate.getFullYear(),\n      month: oDate.getMonth(),\n      day: oDate.getDate(),\n      dayOfWeek: 
oDate.getDay(),\n      hours: oDate.getHours(),\n
       minutes: oDate.getMinutes(),\n      seconds: oDate.getSeconds()\n    };\n    const patterns = 
/(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n    return 
cFormat.replace(patterns, function (match, pattern) {\n      if (pattern in handlers) {\n        return 
handlers[pattern](data);\n      }\n\n      return pattern.charCodeAt(1);\n    });\n  }\n\n  printx(cFormat, 
cSource) {\n    const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n    const buf = [];\n 
   let i = 0;\n    const ii = cSource.length;\n    let currCase = handlers[0];\n    let escaped = false;\n\n  
  for (const command of cFormat) {\n      if (escaped) {\n        buf.push(command);\n        escaped = 
false;\n        continue;\n      }\n\n      if (i >= ii) {\n        break;\n      }\n\n      switch (command) 
{\n        case "?":\n          buf.push(currCase(cSource.charAt(i++)));\n          break;\n\n        case 
"X":\n          while (i < ii) {\n            const char = 
 cSource.charAt(i++);\n\n            if ("a" <= char && char <= "z" || "A" <= char && char <= "Z" || "0" <= 
char && char <= "9") {\n              buf.push(currCase(char));\n              break;\n            }\n        
  }\n\n          break;\n\n        case "A":\n          while (i < ii) {\n            const char = 
cSource.charAt(i++);\n\n            if ("a" <= char && char <= "z" || "A" <= char && char <= "Z") {\n         
     buf.push(currCase(char));\n              break;\n            }\n          }\n\n          break;\n\n      
  case "9":\n          while (i < ii) {\n            const char = cSource.charAt(i++);\n\n            if ("0" 
<= char && char <= "9") {\n              buf.push(char);\n              break;\n            }\n          
}\n\n          break;\n\n        case "*":\n          while (i < ii) {\n            
buf.push(currCase(cSource.charAt(i++)));\n          }\n\n          break;\n\n        case "\\\\":\n          
escaped = true;\n          break;\n\n        case ">"
 :\n          currCase = handlers[1];\n          break;\n\n        case "<":\n          currCase = 
handlers[2];\n          break;\n\n        case "=":\n          currCase = handlers[0];\n          break;\n\n  
      default:\n          buf.push(command);\n      }\n    }\n\n    return buf.join("");\n  }\n\n  
scand(cFormat, cDate) {\n    if (cDate === "") {\n      return new Date();\n    }\n\n    switch (cFormat) {\n 
     case 0:\n        return this.scand("D:yyyymmddHHMMss", cDate);\n\n      case 1:\n        return 
this.scand("yyyy.mm.dd HH:MM:ss", cDate);\n\n      case 2:\n        return this.scand("m/d/yy h:MM:ss tt", 
cDate);\n    }\n\n    if (!this._scandCache.has(cFormat)) {\n      const months = this._months;\n      const 
days = this._days;\n      const handlers = {\n        mmmm: {\n          pattern: `(${months.join("|")})`,\n  
        action: (value, data) => {\n            data.month = months.indexOf(value);\n          }\n        
},\n        mmm: {\n          pattern: `(${mont
 hs.map(month => month.substring(0, 3)).join("|")})`,\n          action: (value, data) => {\n            
data.month = months.findIndex(month => month.substring(0, 3) === value);\n          }\n        },\n        
mm: {\n          pattern: `([0-9]{2})`,\n          action: (value, data) => {\n            data.month = 
parseInt(value) - 1;\n          }\n        },\n        m: {\n          pattern: `([0-9]{1,2})`,\n          
action: (value, data) => {\n            data.month = parseInt(value) - 1;\n          }\n        },\n        
dddd: {\n          pattern: `(${days.join("|")})`,\n          action: (value, data) => {\n            
data.day = days.indexOf(value);\n          }\n        },\n        ddd: {\n          pattern: `(${days.map(day 
=> day.substring(0, 3)).join("|")})`,\n          action: (value, data) => {\n            data.day = 
days.findIndex(day => day.substring(0, 3) === value);\n          }\n        },\n        dd: {\n          
pattern: "([0-9]{2})",\n          action: (value, 
 data) => {\n            data.day = parseInt(value);\n          }\n        },\n        d: {\n          
pattern: "([0-9]{1,2})",\n          action: (value, data) => {\n            data.day = parseInt(value);\n     
     }\n        },\n        yyyy: {\n          pattern: "([0-9]{4})",\n          action: (value, data) => {\n 
           data.year = parseInt(value);\n          }\n        },\n        yy: {\n          pattern: 
"([0-9]{2})",\n          action: (value, data) => {\n            data.year = 2000 + parseInt(value);\n        
  }\n        },\n        HH: {\n          pattern: "([0-9]{2})",\n          action: (value, data) => {\n      
      data.hours = parseInt(value);\n          }\n        },\n        H: {\n          pattern: 
"([0-9]{1,2})",\n          action: (value, data) => {\n            data.hours = parseInt(value);\n          
}\n        },\n        hh: {\n          pattern: "([0-9]{2})",\n          action: (value, data) => {\n        
    data.hours = parseInt(value);\n       
    }\n        },\n        h: {\n          pattern: "([0-9]{1,2})",\n          action: (value, data) => {\n   
         data.hours = parseInt(value);\n          }\n        },\n        MM: {\n          pattern: 
"([0-9]{2})",\n          action: (value, data) => {\n            data.minutes = parseInt(value);\n          
}\n        },\n        M: {\n          pattern: "([0-9]{1,2})",\n          action: (value, data) => {\n       
     data.minutes = parseInt(value);\n          }\n        },\n        ss: {\n          pattern: 
"([0-9]{2})",\n          action: (value, data) => {\n            data.seconds = parseInt(value);\n          
}\n        },\n        s: {\n          pattern: "([0-9]{1,2})",\n          action: (value, data) => {\n       
     data.seconds = parseInt(value);\n          }\n        },\n        tt: {\n          pattern: 
"([aApP][mM])",\n          action: (value, data) => {\n            const char = value.charAt(0);\n            
data.am = char === "a" || char === "A";\n        
   }\n        },\n        t: {\n          pattern: "([aApP])",\n          action: (value, data) => {\n        
    data.am = value === "a" || value === "A";\n          }\n        }\n      };\n      const escapedFormat = 
cFormat.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, "\\\\$&");\n      const patterns = 
/(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n      const actions = [];\n      const re 
= escapedFormat.replace(patterns, function (match, patternElement) {\n        const {\n          pattern,\n   
       action\n        } = handlers[patternElement];\n        actions.push(action);\n        return 
pattern;\n      });\n\n      this._scandCache.set(cFormat, [re, actions]);\n    }\n\n    const [re, actions] 
= this._scandCache.get(cFormat);\n\n    const matches = new RegExp(re, "g").exec(cDate);\n\n    if (!matches 
|| matches.length !== actions.length + 1) {\n      return null;\n    }\n\n    const data = {\n      year: 
0,\n      month: 0,\n      day: 0,\n      hours: 0,\n  
     minutes: 0,\n      seconds: 0,\n      am: null\n    };\n    actions.forEach((action, i) => 
action(matches[i + 1], data));\n\n    if (data.am !== null) {\n      data.hours = data.hours % 12 + (data.am 
? 0 : 12);\n    }\n\n    return new Date(data.year, data.month, data.day, data.hours, data.minutes, 
data.seconds);\n  }\n\n  spansToXML() {}\n\n  stringFromStream() {}\n\n  xmlToSpans() {}\n\n}\n\nexports.Util 
= Util;\n\n/***/ })\n/******/ 
\t]);\n/************************************************************************/\n/******/ \t// The module 
cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require 
function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/ \t\t// Check if module is in 
cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== 
undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new 
module (and put it into the cache)\n/
 ******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id 
needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ 
\t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, 
module.exports, __w_pdfjs_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the 
module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ 
\t\n/************************************************************************/\nvar __webpack_exports__ = 
{};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the 
chunk.\n(() => {\nvar exports = __webpack_exports__;\n\n\nObject.defineProperty(exports, "__esModule", ({\n  
value: true\n}));\nObject.defineProperty(exports, "initSandbox", ({\n  enumerable: true,\n  get: function () 
{\n    return _initialization.initSandbox;\n  }\n}));\n\nvar _initialization = __w_pdfjs_require__(1)
 ;\n\nconst pdfjsVersion = \'2.10.377\';\nconst pdfjsBuild = \'156762c48\';\n})();\n\n/******/ \treturn 
__webpack_exports__;\n/******/ })()\n;\n});'];
+    code.push("delete dump;");
+    let success = false;
+    let buf = 0;
+
+    try {
+      const sandboxData = JSON.stringify(data);
+      code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`);
+      buf = this._module.stringToNewUTF8(code.join("\n"));
+      success = !!this._module.ccall("init", "number", ["number", "number"], [buf, this._alertOnError]);
+    } catch (error) {
+      console.error(error);
+    } finally {
+      if (buf) {
+        this._module.ccall("free", "number", ["number"], [buf]);
+      }
+    }
+
+    if (success) {
+      this.support.commFun = this._module.cwrap("commFun", null, ["string", "string"]);
+    } else {
+      this.nukeSandbox();
+      throw new Error("Cannot start sandbox");
+    }
+  }
+
+  dispatchEvent(event) {
+    this.support.callSandboxFunction("dispatchEvent", event);
+  }
+
+  dumpMemoryUse() {
+    if (this._module) {
+      this._module.ccall("dumpMemoryUse", null, []);
+    }
+  }
+
+  nukeSandbox() {
+    if (this._module !== null) {
+      this.support.destroy();
+      this.support = null;
+
+      this._module.ccall("nukeSandbox", null, []);
+
+      this._module = null;
+    }
+  }
+
+  evalForTesting(code, key) {
+    throw new Error("Not implemented: evalForTesting");
+  }
+
+}
+
+function QuickJSSandbox() {
+  return (0, _quickjsEval.default)().then(module => {
+    return new Sandbox(window, module);
+  });
+}
+})();
+
+/******/       return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=pdf.sandbox.js.map
\ No newline at end of file
diff --git a/third-party/pdfjs/build/pdf.worker.js b/third-party/pdfjs/build/pdf.worker.js
index 58bdf7c19..f8e32abd7 100644
--- a/third-party/pdfjs/build/pdf.worker.js
+++ b/third-party/pdfjs/build/pdf.worker.js
@@ -2,7 +2,7 @@
  * @licstart The following is the entire license notice for the
  * Javascript code in this page
  *
- * Copyright 2020 Mozilla Foundation
+ * Copyright 2021 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,141 +30,35 @@
        else
                root["pdfjs-dist/build/pdf.worker"] = root.pdfjsWorker = factory();
 })(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/       // The module cache
-/******/       var installedModules = {};
-/******/
-/******/       // The require function
-/******/       function __w_pdfjs_require__(moduleId) {
-/******/
-/******/               // Check if module is in cache
-/******/               if(installedModules[moduleId]) {
-/******/                       return installedModules[moduleId].exports;
-/******/               }
-/******/               // Create a new module (and put it into the cache)
-/******/               var module = installedModules[moduleId] = {
-/******/                       i: moduleId,
-/******/                       l: false,
-/******/                       exports: {}
-/******/               };
-/******/
-/******/               // Execute the module function
-/******/               modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
-/******/
-/******/               // Flag the module as loaded
-/******/               module.l = true;
-/******/
-/******/               // Return the exports of the module
-/******/               return module.exports;
-/******/       }
-/******/
-/******/
-/******/       // expose the modules object (__webpack_modules__)
-/******/       __w_pdfjs_require__.m = modules;
-/******/
-/******/       // expose the module cache
-/******/       __w_pdfjs_require__.c = installedModules;
-/******/
-/******/       // define getter function for harmony exports
-/******/       __w_pdfjs_require__.d = function(exports, name, getter) {
-/******/               if(!__w_pdfjs_require__.o(exports, name)) {
-/******/                       Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/               }
-/******/       };
-/******/
-/******/       // define __esModule on exports
-/******/       __w_pdfjs_require__.r = function(exports) {
-/******/               if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/                       Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/               }
-/******/               Object.defineProperty(exports, '__esModule', { value: true });
-/******/       };
-/******/
-/******/       // create a fake namespace object
-/******/       // mode & 1: value is a module id, require it
-/******/       // mode & 2: merge all properties of value into the ns
-/******/       // mode & 4: return value when already ns object
-/******/       // mode & 8|1: behave like require
-/******/       __w_pdfjs_require__.t = function(value, mode) {
-/******/               if(mode & 1) value = __w_pdfjs_require__(value);
-/******/               if(mode & 8) return value;
-/******/               if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/               var ns = Object.create(null);
-/******/               __w_pdfjs_require__.r(ns);
-/******/               Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/               if(mode & 2 && typeof value != 'string') for(var key in value) 
__w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/               return ns;
-/******/       };
-/******/
-/******/       // getDefaultExport function for compatibility with non-harmony modules
-/******/       __w_pdfjs_require__.n = function(module) {
-/******/               var getter = module && module.__esModule ?
-/******/                       function getDefault() { return module['default']; } :
-/******/                       function getModuleExports() { return module; };
-/******/               __w_pdfjs_require__.d(getter, 'a', getter);
-/******/               return getter;
-/******/       };
-/******/
-/******/       // Object.prototype.hasOwnProperty.call
-/******/       __w_pdfjs_require__.o = function(object, property) { return 
Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/       // __webpack_public_path__
-/******/       __w_pdfjs_require__.p = "";
-/******/
-/******/
-/******/       // Load entry module and return exports
-/******/       return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "WorkerMessageHandler", {
-  enumerable: true,
-  get: function () {
-    return _worker.WorkerMessageHandler;
-  }
-});
-
-var _worker = __w_pdfjs_require__(1);
-
-const pdfjsVersion = '2.6.347';
-const pdfjsBuild = '3be9c65f';
-
-/***/ }),
+return /******/ (() => { // webpackBootstrap
+/******/       "use strict";
+/******/       var __webpack_modules__ = ([
+/* 0 */,
 /* 1 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.WorkerMessageHandler = exports.WorkerTask = void 0;
+}));
+exports.WorkerTask = exports.WorkerMessageHandler = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
 var _primitives = __w_pdfjs_require__(5);
 
-var _pdf_manager = __w_pdfjs_require__(6);
+var _pdf_manager = __w_pdfjs_require__(7);
 
-var _writer = __w_pdfjs_require__(27);
+var _writer = __w_pdfjs_require__(71);
 
 var _is_node = __w_pdfjs_require__(4);
 
-var _message_handler = __w_pdfjs_require__(46);
+var _message_handler = __w_pdfjs_require__(99);
 
-var _worker_stream = __w_pdfjs_require__(47);
+var _worker_stream = __w_pdfjs_require__(100);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
 
 class WorkerTask {
   constructor(name) {
@@ -197,7 +91,7 @@ exports.WorkerTask = WorkerTask;
 
 class WorkerMessageHandler {
   static setup(handler, port) {
-    var testMessageProcessed = false;
+    let testMessageProcessed = false;
     handler.on("test", function wphSetupTest(data) {
       if (testMessageProcessed) {
         return;
@@ -225,13 +119,13 @@ class WorkerMessageHandler {
   }
 
   static createDocumentHandler(docParams, port) {
-    var pdfManager;
-    var terminated = false;
-    var cancelXHRs = null;
-    var WorkerTasks = [];
+    let pdfManager;
+    let terminated = false;
+    let cancelXHRs = null;
+    const WorkerTasks = [];
     const verbosity = (0, _util.getVerbosityLevel)();
     const apiVersion = docParams.apiVersion;
-    const workerVersion = '2.6.347';
+    const workerVersion = '2.10.377';
 
     if (apiVersion !== workerVersion) {
       throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version 
"${workerVersion}".`);
@@ -247,14 +141,14 @@ class WorkerMessageHandler {
       throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + 
enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s.");
     }
 
-    if (typeof ReadableStream === "undefined" || typeof Promise.allSettled === "undefined") {
-      throw new Error("The browser/environment lacks native support for critical " + "functionality used by 
the PDF.js library (e.g. " + "`ReadableStream` and/or `Promise.allSettled`); " + "please use an 
ES5-compatible build instead.");
+    if (typeof ReadableStream === "undefined") {
+      throw new Error("The browser/environment lacks native support for critical " + "functionality used by 
the PDF.js library (e.g. `ReadableStream`); " + "please use a `legacy`-build instead.");
     }
 
-    var docId = docParams.docId;
-    var docBaseUrl = docParams.docBaseUrl;
-    var workerHandlerName = docParams.docId + "_worker";
-    var handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);
+    const docId = docParams.docId;
+    const docBaseUrl = docParams.docBaseUrl;
+    const workerHandlerName = docParams.docId + "_worker";
+    let handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);
     handler.postMessageTransfers = docParams.postMessageTransfers;
 
     function ensureNotTerminated() {
@@ -269,7 +163,7 @@ class WorkerMessageHandler {
 
     function finishWorkerTask(task) {
       task.finish();
-      var i = WorkerTasks.indexOf(task);
+      const i = WorkerTasks.indexOf(task);
       WorkerTasks.splice(i, 1);
     }
 
@@ -282,21 +176,31 @@ class WorkerMessageHandler {
         await pdfManager.ensureDoc("checkFirstPage");
       }
 
-      const [numPages, fingerprint] = await Promise.all([pdfManager.ensureDoc("numPages"), 
pdfManager.ensureDoc("fingerprint")]);
+      const isPureXfa = await pdfManager.ensureDoc("isPureXfa");
+
+      if (isPureXfa) {
+        const task = new WorkerTask("loadXfaFonts");
+        startWorkerTask(task);
+        await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => 
finishWorkerTask(task)), pdfManager.loadXfaImages()]);
+      }
+
+      const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), 
pdfManager.ensureDoc("fingerprints")]);
+      const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null;
       return {
         numPages,
-        fingerprint
+        fingerprints,
+        htmlForXfa
       };
     }
 
-    function getPdfManager(data, evaluatorOptions) {
-      var pdfManagerCapability = (0, _util.createPromiseCapability)();
+    function getPdfManager(data, evaluatorOptions, enableXfa) {
+      const pdfManagerCapability = (0, _util.createPromiseCapability)();
       let newPdfManager;
-      var source = data.source;
+      const source = data.source;
 
       if (source.data) {
         try {
-          newPdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, 
evaluatorOptions, docBaseUrl);
+          newPdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, 
evaluatorOptions, enableXfa, docBaseUrl);
           pdfManagerCapability.resolve(newPdfManager);
         } catch (ex) {
           pdfManagerCapability.reject(ex);
@@ -305,7 +209,7 @@ class WorkerMessageHandler {
         return pdfManagerCapability.promise;
       }
 
-      var pdfStream,
+      let pdfStream,
           cachedChunks = [];
 
       try {
@@ -315,20 +219,20 @@ class WorkerMessageHandler {
         return pdfManagerCapability.promise;
       }
 
-      var fullRequest = pdfStream.getFullReader();
+      const fullRequest = pdfStream.getFullReader();
       fullRequest.headersReady.then(function () {
         if (!fullRequest.isRangeSupported) {
           return;
         }
 
-        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;
+        const disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;
         newPdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {
           msgHandler: handler,
           password: source.password,
           length: fullRequest.contentLength,
           disableAutoFetch,
           rangeChunkSize: source.rangeChunkSize
-        }, evaluatorOptions, docBaseUrl);
+        }, evaluatorOptions, enableXfa, docBaseUrl);
 
         for (let i = 0; i < cachedChunks.length; i++) {
           newPdfManager.sendProgressiveData(cachedChunks[i]);
@@ -341,17 +245,17 @@ class WorkerMessageHandler {
         pdfManagerCapability.reject(reason);
         cancelXHRs = null;
       });
-      var loaded = 0;
+      let loaded = 0;
 
-      var flushChunks = function () {
-        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);
+      const flushChunks = function () {
+        const pdfFile = (0, _util.arraysToBytes)(cachedChunks);
 
         if (source.length && pdfFile.length !== source.length) {
           (0, _util.warn)("reported HTTP length is different from actual");
         }
 
         try {
-          newPdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, 
evaluatorOptions, docBaseUrl);
+          newPdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, 
evaluatorOptions, enableXfa, docBaseUrl);
           pdfManagerCapability.resolve(newPdfManager);
         } catch (ex) {
           pdfManagerCapability.reject(ex);
@@ -360,8 +264,8 @@ class WorkerMessageHandler {
         cachedChunks = [];
       };
 
-      var readPromise = new Promise(function (resolve, reject) {
-        var readChunk = function ({
+      const readPromise = new Promise(function (resolve, reject) {
+        const readChunk = function ({
           value,
           done
         }) {
@@ -424,7 +328,7 @@ class WorkerMessageHandler {
         ensureNotTerminated();
 
         if (ex instanceof _util.PasswordException) {
-          var task = new WorkerTask(`PasswordException: response ${ex.code}`);
+          const task = new WorkerTask(`PasswordException: response ${ex.code}`);
           startWorkerTask(task);
           handler.sendWithPromise("PasswordRequest", ex).then(function ({
             password
@@ -462,14 +366,17 @@ class WorkerMessageHandler {
       }
 
       ensureNotTerminated();
-      var evaluatorOptions = {
+      const evaluatorOptions = {
         maxImageSize: data.maxImageSize,
         disableFontFace: data.disableFontFace,
         ignoreErrors: data.ignoreErrors,
         isEvalSupported: data.isEvalSupported,
-        fontExtraProperties: data.fontExtraProperties
+        fontExtraProperties: data.fontExtraProperties,
+        useSystemFonts: data.useSystemFonts,
+        cMapUrl: data.cMapUrl,
+        standardFontDataUrl: data.standardFontDataUrl
       };
-      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
+      getPdfManager(data, evaluatorOptions, data.enableXfa).then(function (newPdfManager) {
         if (terminated) {
           newPdfManager.terminate(new _util.AbortException("Worker was terminated."));
           throw new Error("Worker was terminated");
@@ -530,6 +437,16 @@ class WorkerMessageHandler {
     handler.on("GetJavaScript", function wphSetupGetJavaScript(data) {
       return pdfManager.ensureCatalog("javaScript");
     });
+    handler.on("GetDocJSActions", function wphSetupGetDocJSActions(data) {
+      return pdfManager.ensureCatalog("jsActions");
+    });
+    handler.on("GetPageJSActions", function ({
+      pageIndex
+    }) {
+      return pdfManager.getPage(pageIndex).then(function (page) {
+        return pdfManager.ensure(page, "jsActions");
+      });
+    });
     handler.on("GetOutline", function wphSetupGetOutline(data) {
       return pdfManager.ensureCatalog("documentOutline");
     });
@@ -542,6 +459,9 @@ class WorkerMessageHandler {
     handler.on("GetMetadata", function wphSetupGetMetadata(data) {
       return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]);
     });
+    handler.on("GetMarkInfo", function wphSetupGetMarkInfo(data) {
+      return pdfManager.ensureCatalog("markInfo");
+    });
     handler.on("GetData", function wphSetupGetData(data) {
       pdfManager.requestLoadedStream();
       return pdfManager.onLoadedStream().then(function (stream) {
@@ -559,69 +479,111 @@ class WorkerMessageHandler {
         return page.getAnnotationsData(intent);
       });
     });
+    handler.on("GetFieldObjects", function (data) {
+      return pdfManager.ensureDoc("fieldObjects");
+    });
+    handler.on("HasJSActions", function (data) {
+      return pdfManager.ensureDoc("hasJSActions");
+    });
+    handler.on("GetCalculationOrderIds", function (data) {
+      return pdfManager.ensureDoc("calculationOrderIds");
+    });
     handler.on("SaveDocument", function ({
+      isPureXfa,
       numPages,
       annotationStorage,
       filename
     }) {
       pdfManager.requestLoadedStream();
-      const promises = [pdfManager.onLoadedStream()];
-      const document = pdfManager.pdfDocument;
+      const promises = [pdfManager.onLoadedStream(), pdfManager.ensureCatalog("acroForm"), 
pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("startXRef")];
 
-      for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
-        promises.push(pdfManager.getPage(pageIndex).then(function (page) {
-          const task = new WorkerTask(`Save: page ${pageIndex}`);
-          return page.save(handler, task, annotationStorage);
-        }));
+      if (isPureXfa) {
+        promises.push(pdfManager.serializeXfaData(annotationStorage));
+      } else {
+        for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
+          promises.push(pdfManager.getPage(pageIndex).then(function (page) {
+            const task = new WorkerTask(`Save: page ${pageIndex}`);
+            return page.save(handler, task, annotationStorage).finally(function () {
+              finishWorkerTask(task);
+            });
+          }));
+        }
       }
 
-      return Promise.all(promises).then(([stream, ...refs]) => {
+      return Promise.all(promises).then(function ([stream, acroForm, xref, startXRef, ...refs]) {
         let newRefs = [];
+        let xfaData = null;
+
+        if (isPureXfa) {
+          xfaData = refs[0];
 
-        for (const ref of refs) {
-          newRefs = ref.filter(x => x !== null).reduce((a, b) => a.concat(b), newRefs);
+          if (!xfaData) {
+            return stream.bytes;
+          }
+        } else {
+          for (const ref of refs) {
+            newRefs = ref.filter(x => x !== null).reduce((a, b) => a.concat(b), newRefs);
+          }
+
+          if (newRefs.length === 0) {
+            return stream.bytes;
+          }
         }
 
-        if (newRefs.length === 0) {
-          return stream.bytes;
+        const xfa = acroForm instanceof _primitives.Dict && acroForm.get("XFA") || [];
+        let xfaDatasets = null;
+
+        if (Array.isArray(xfa)) {
+          for (let i = 0, ii = xfa.length; i < ii; i += 2) {
+            if (xfa[i] === "datasets") {
+              xfaDatasets = xfa[i + 1];
+            }
+          }
+        } else {
+          (0, _util.warn)("Unsupported XFA type.");
         }
 
-        const xref = document.xref;
         let newXrefInfo = Object.create(null);
 
         if (xref.trailer) {
-          const _info = Object.create(null);
-
+          const infoObj = Object.create(null);
           const xrefInfo = xref.trailer.get("Info") || null;
 
-          if (xrefInfo) {
+          if (xrefInfo instanceof _primitives.Dict) {
             xrefInfo.forEach((key, value) => {
               if ((0, _util.isString)(key) && (0, _util.isString)(value)) {
-                _info[key] = (0, _util.stringToPDFString)(value);
+                infoObj[key] = (0, _util.stringToPDFString)(value);
               }
             });
           }
 
           newXrefInfo = {
             rootRef: xref.trailer.getRaw("Root") || null,
-            encrypt: xref.trailer.getRaw("Encrypt") || null,
+            encryptRef: xref.trailer.getRaw("Encrypt") || null,
             newRef: xref.getNewRef(),
             infoRef: xref.trailer.getRaw("Info") || null,
-            info: _info,
-            fileIds: xref.trailer.getRaw("ID") || null,
-            startXRef: document.startXRef,
+            info: infoObj,
+            fileIds: xref.trailer.get("ID") || null,
+            startXRef,
             filename
           };
         }
 
         xref.resetNewRef();
-        return (0, _writer.incrementalUpdate)(stream.bytes, newXrefInfo, newRefs);
+        return (0, _writer.incrementalUpdate)({
+          originalData: stream.bytes,
+          xrefInfo: newXrefInfo,
+          newRefs,
+          xref,
+          datasetsRef: xfaDatasets,
+          xfaData
+        });
       });
     });
     handler.on("GetOperatorList", function wphSetupRenderPage(data, sink) {
-      var pageIndex = data.pageIndex;
+      const pageIndex = data.pageIndex;
       pdfManager.getPage(pageIndex).then(function (page) {
-        var task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);
+        const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);
         startWorkerTask(task);
         const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0;
         page.getOperatorList({
@@ -652,16 +614,16 @@ class WorkerMessageHandler {
           sink.error(reason);
         });
       });
-    }, this);
+    });
     handler.on("GetTextContent", function wphExtractText(data, sink) {
-      var pageIndex = data.pageIndex;
+      const pageIndex = data.pageIndex;
 
       sink.onPull = function (desiredSize) {};
 
       sink.onCancel = function (reason) {};
 
       pdfManager.getPage(pageIndex).then(function (page) {
-        var task = new WorkerTask("GetTextContent: page " + pageIndex);
+        const task = new WorkerTask("GetTextContent: page " + pageIndex);
         startWorkerTask(task);
         const start = verbosity >= _util.VerbosityLevel.INFOS ? Date.now() : 0;
         page.extractTextContent({
@@ -669,6 +631,7 @@ class WorkerMessageHandler {
           task,
           sink,
           normalizeWhitespace: data.normalizeWhitespace,
+          includeMarkedContent: data.includeMarkedContent,
           combineTextItems: data.combineTextItems
         }).then(function () {
           finishWorkerTask(task);
@@ -689,6 +652,11 @@ class WorkerMessageHandler {
         });
       });
     });
+    handler.on("GetStructTree", function wphGetStructTree(data) {
+      return pdfManager.getPage(data.pageIndex).then(function (page) {
+        return pdfManager.ensure(page, "getStructTree");
+      });
+    });
     handler.on("FontFallback", function (data) {
       return pdfManager.fontFallback(data.id, handler);
     });
@@ -712,10 +680,11 @@ class WorkerMessageHandler {
         cancelXHRs(new _util.AbortException("Worker was terminated."));
       }
 
-      WorkerTasks.forEach(function (task) {
+      for (const task of WorkerTasks) {
         waitOn.push(task.finished);
         task.terminate();
-      });
+      }
+
       return Promise.all(waitOn).then(function () {
         handler.destroy();
         handler = null;
@@ -729,7 +698,7 @@ class WorkerMessageHandler {
   }
 
   static initializeFromPort(port) {
-    var handler = new _message_handler.MessageHandler("worker", "main", port);
+    const handler = new _message_handler.MessageHandler("worker", "main", port);
     WorkerMessageHandler.setup(handler, port);
     handler.send("ready", null);
   }
@@ -748,41 +717,45 @@ if (typeof window === "undefined" && !_is_node.isNodeJS && typeof self !== "unde
 
 /***/ }),
 /* 2 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.arrayByteLength = arrayByteLength;
 exports.arraysToBytes = arraysToBytes;
 exports.assert = assert;
 exports.bytesToString = bytesToString;
+exports.createObjectURL = createObjectURL;
 exports.createPromiseCapability = createPromiseCapability;
+exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
 exports.escapeString = escapeString;
 exports.getModificationDate = getModificationDate;
 exports.getVerbosityLevel = getVerbosityLevel;
 exports.info = info;
 exports.isArrayBuffer = isArrayBuffer;
 exports.isArrayEqual = isArrayEqual;
+exports.isAscii = isAscii;
 exports.isBool = isBool;
 exports.isNum = isNum;
-exports.isString = isString;
 exports.isSameOrigin = isSameOrigin;
-exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
+exports.isString = isString;
+exports.objectFromMap = objectFromMap;
+exports.objectSize = objectSize;
 exports.removeNullCharacters = removeNullCharacters;
 exports.setVerbosityLevel = setVerbosityLevel;
 exports.shadow = shadow;
 exports.string32 = string32;
 exports.stringToBytes = stringToBytes;
 exports.stringToPDFString = stringToPDFString;
+exports.stringToUTF16BEString = stringToUTF16BEString;
 exports.stringToUTF8String = stringToUTF8String;
+exports.unreachable = unreachable;
 exports.utf8StringToString = utf8StringToString;
 exports.warn = warn;
-exports.unreachable = unreachable;
-exports.IsEvalSupportedCached = exports.IsLittleEndianCached = exports.createObjectURL = exports.FormatError 
= exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = 
exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = 
exports.PasswordException = exports.MissingPDFException = exports.InvalidPDFException = 
exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = 
exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = 
exports.AnnotationReplyType = exports.AnnotationMarkedState = exports.AnnotationFlag = 
exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = 
exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = 
exports.BaseException = void 0;
+exports.VerbosityLevel = exports.Util = exports.UNSUPPORTED_FEATURES = exports.UnknownErrorException = 
exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag 
= exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = 
exports.MissingPDFException = exports.IsLittleEndianCached = exports.IsEvalSupportedCached = 
exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = 
exports.FontType = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = 
exports.CMapCompressionType = exports.BaseException = exports.AnnotationType = 
exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = 
exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = 
exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0;
 
 __w_pdfjs_require__(3);
 
@@ -915,6 +888,36 @@ const AnnotationBorderStyleType = {
   UNDERLINE: 5
 };
 exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
+const AnnotationActionEventType = {
+  E: "Mouse Enter",
+  X: "Mouse Exit",
+  D: "Mouse Down",
+  U: "Mouse Up",
+  Fo: "Focus",
+  Bl: "Blur",
+  PO: "PageOpen",
+  PC: "PageClose",
+  PV: "PageVisible",
+  PI: "PageInvisible",
+  K: "Keystroke",
+  F: "Format",
+  V: "Validate",
+  C: "Calculate"
+};
+exports.AnnotationActionEventType = AnnotationActionEventType;
+const DocumentActionEventType = {
+  WC: "WillClose",
+  WS: "WillSave",
+  DS: "DidSave",
+  WP: "WillPrint",
+  DP: "DidPrint"
+};
+exports.DocumentActionEventType = DocumentActionEventType;
+const PageActionEventType = {
+  O: "PageOpen",
+  C: "PageClose"
+};
+exports.PageActionEventType = PageActionEventType;
 const StreamType = {
   UNKNOWN: "UNKNOWN",
   FLATE: "FLATE",
@@ -931,6 +934,7 @@ exports.StreamType = StreamType;
 const FontType = {
   UNKNOWN: "UNKNOWN",
   TYPE1: "TYPE1",
+  TYPE1STANDARD: "TYPE1STANDARD",
   TYPE1C: "TYPE1C",
   CIDFONTTYPE0: "CIDFONTTYPE0",
   CIDFONTTYPE0C: "CIDFONTTYPE0C",
@@ -1052,6 +1056,7 @@ const UNSUPPORTED_FEATURES = {
   unknown: "unknown",
   forms: "forms",
   javaScript: "javaScript",
+  signatures: "signatures",
   smask: "smask",
   shadingPattern: "shadingPattern",
   font: "font",
@@ -1066,6 +1071,7 @@ const UNSUPPORTED_FEATURES = {
   errorOperatorList: "errorOperatorList",
   errorFontToUnicode: "errorFontToUnicode",
   errorFontLoadNative: "errorFontLoadNative",
+  errorFontBuildPath: "errorFontBuildPath",
   errorFontGetPath: "errorFontGetPath",
   errorMarkedContent: "errorMarkedContent"
 };
@@ -1323,6 +1329,20 @@ function string32(value) {
   return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
 }
 
+function objectSize(obj) {
+  return Object.keys(obj).length;
+}
+
+function objectFromMap(map) {
+  const obj = Object.create(null);
+
+  for (const [key, value] of map) {
+    obj[key] = value;
+  }
+
+  return obj;
+}
+
 function isLittleEndian() {
   const buffer8 = new Uint8Array(4);
   buffer8[0] = 1;
@@ -1354,14 +1374,11 @@ const IsEvalSupportedCached = {
 
 };
 exports.IsEvalSupportedCached = IsEvalSupportedCached;
-const rgbBuf = ["rgb(", 0, ",", 0, ",", 0, ")"];
+const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0"));
 
 class Util {
-  static makeCssRgb(r, g, b) {
-    rgbBuf[1] = r;
-    rgbBuf[3] = g;
-    rgbBuf[5] = b;
-    return rgbBuf.join("");
+  static makeHexColor(r, g, b) {
+    return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;
   }
 
   static transform(m1, m2) {
@@ -1405,7 +1422,7 @@ class Util {
     const c = m[2] * transpose[0] + m[3] * transpose[2];
     const d = m[2] * transpose[1] + m[3] * transpose[3];
     const first = (a + d) / 2;
-    const second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;
     const sx = first + second || 1;
     const sy = first - second || 1;
     return [Math.sqrt(sx), Math.sqrt(sy)];
@@ -1458,7 +1475,7 @@ class Util {
 }
 
 exports.Util = Util;
-const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 
0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 
0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
+const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 
0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 
0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac];
 
 function stringToPDFString(str) {
   const length = str.length,
@@ -1483,7 +1500,30 @@ function stringToPDFString(str) {
 }
 
 function escapeString(str) {
-  return str.replace(/([\(\)\\])/g, "\\$1");
+  return str.replace(/([()\\\n\r])/g, match => {
+    if (match === "\n") {
+      return "\\n";
+    } else if (match === "\r") {
+      return "\\r";
+    }
+
+    return `\\${match}`;
+  });
+}
+
+function isAscii(str) {
+  return /^[\x00-\x7F]*$/.test(str);
+}
+
+function stringToUTF16BEString(str) {
+  const buf = ["\xFE\xFF"];
+
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+    buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff));
+  }
+
+  return buf.join("");
 }
 
 function stringToUTF8String(str) {
@@ -1515,13 +1555,17 @@ function isArrayEqual(arr1, arr2) {
     return false;
   }
 
-  return arr1.every(function (element, index) {
-    return element === arr2[index];
-  });
+  for (let i = 0, ii = arr1.length; i < ii; i++) {
+    if (arr1[i] !== arr2[i]) {
+      return false;
+    }
+  }
+
+  return true;
 }
 
-function getModificationDate(date = new Date(Date.now())) {
-  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), 
(date.getUTCDate() + 1).toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), 
date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
+function getModificationDate(date = new Date()) {
+  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), 
date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), 
date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
   return buffer.join("");
 }
 
@@ -1548,40 +1592,34 @@ function createPromiseCapability() {
   return capability;
 }
 
-const createObjectURL = function createObjectURLClosure() {
-  const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-  return function createObjectURL(data, contentType, forceDataSchema = false) {
-    if (!forceDataSchema && URL.createObjectURL) {
-      const blob = new Blob([data], {
-        type: contentType
-      });
-      return URL.createObjectURL(blob);
-    }
-
-    let buffer = `data:${contentType};base64,`;
+function createObjectURL(data, contentType = "", forceDataSchema = false) {
+  if (URL.createObjectURL && !forceDataSchema) {
+    return URL.createObjectURL(new Blob([data], {
+      type: contentType
+    }));
+  }
 
-    for (let i = 0, ii = data.length; i < ii; i += 3) {
-      const b1 = data[i] & 0xff;
-      const b2 = data[i + 1] & 0xff;
-      const b3 = data[i + 2] & 0xff;
-      const d1 = b1 >> 2,
-            d2 = (b1 & 3) << 4 | b2 >> 4;
-      const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;
-      const d4 = i + 2 < ii ? b3 & 0x3f : 64;
-      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
-    }
+  const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+  let buffer = `data:${contentType};base64,`;
 
-    return buffer;
-  };
-}();
+  for (let i = 0, ii = data.length; i < ii; i += 3) {
+    const b1 = data[i] & 0xff;
+    const b2 = data[i + 1] & 0xff;
+    const b3 = data[i + 2] & 0xff;
+    const d1 = b1 >> 2,
+          d2 = (b1 & 3) << 4 | b2 >> 4;
+    const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64;
+    const d4 = i + 2 < ii ? b3 & 0x3f : 64;
+    buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+  }
 
-exports.createObjectURL = createObjectURL;
+  return buffer;
+}
 
 /***/ }),
 /* 3 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, __unused_webpack_exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
 var _is_node = __w_pdfjs_require__(4);
@@ -1590,95 +1628,97 @@ var _is_node = __w_pdfjs_require__(4);
 
 /***/ }),
 /* 4 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.isNodeJS = void 0;
 const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw 
&& !(process.versions.electron && process.type && process.type !== "browser");
 exports.isNodeJS = isNodeJS;
 
 /***/ }),
 /* 5 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.clearPrimitiveCaches = clearPrimitiveCaches;
-exports.isEOF = isEOF;
 exports.isCmd = isCmd;
 exports.isDict = isDict;
+exports.isEOF = isEOF;
 exports.isName = isName;
 exports.isRef = isRef;
 exports.isRefsEqual = isRefsEqual;
 exports.isStream = isStream;
-exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF 
= void 0;
+exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.EOF = exports.Dict = exports.Cmd 
= void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var EOF = {};
+var _base_stream = __w_pdfjs_require__(6);
+
+const EOF = {};
 exports.EOF = EOF;
 
-var Name = function NameClosure() {
+const Name = function NameClosure() {
   let nameCache = Object.create(null);
 
-  function Name(name) {
-    this.name = name;
-  }
+  class Name {
+    constructor(name) {
+      this.name = name;
+    }
 
-  Name.prototype = {};
+    static get(name) {
+      const nameValue = nameCache[name];
+      return nameValue ? nameValue : nameCache[name] = new Name(name);
+    }
 
-  Name.get = function Name_get(name) {
-    var nameValue = nameCache[name];
-    return nameValue ? nameValue : nameCache[name] = new Name(name);
-  };
+    static _clearCache() {
+      nameCache = Object.create(null);
+    }
 
-  Name._clearCache = function () {
-    nameCache = Object.create(null);
-  };
+  }
 
   return Name;
 }();
 
 exports.Name = Name;
 
-var Cmd = function CmdClosure() {
+const Cmd = function CmdClosure() {
   let cmdCache = Object.create(null);
 
-  function Cmd(cmd) {
-    this.cmd = cmd;
-  }
+  class Cmd {
+    constructor(cmd) {
+      this.cmd = cmd;
+    }
 
-  Cmd.prototype = {};
+    static get(cmd) {
+      const cmdValue = cmdCache[cmd];
+      return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
+    }
 
-  Cmd.get = function Cmd_get(cmd) {
-    var cmdValue = cmdCache[cmd];
-    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
-  };
+    static _clearCache() {
+      cmdCache = Object.create(null);
+    }
 
-  Cmd._clearCache = function () {
-    cmdCache = Object.create(null);
-  };
+  }
 
   return Cmd;
 }();
 
 exports.Cmd = Cmd;
 
-var Dict = function DictClosure() {
-  var nonSerializable = function nonSerializableClosure() {
-    return nonSerializable;
-  };
+const nonSerializable = function nonSerializableClosure() {
+  return nonSerializable;
+};
 
-  function Dict(xref) {
+class Dict {
+  constructor(xref = null) {
     this._map = Object.create(null);
     this.xref = xref;
     this.objId = null;
@@ -1686,118 +1726,121 @@ var Dict = function DictClosure() {
     this.__nonSerializable__ = nonSerializable;
   }
 
-  Dict.prototype = {
-    assignXref: function Dict_assignXref(newXref) {
-      this.xref = newXref;
-    },
+  assignXref(newXref) {
+    this.xref = newXref;
+  }
 
-    get size() {
-      return Object.keys(this._map).length;
-    },
+  get size() {
+    return Object.keys(this._map).length;
+  }
 
-    get(key1, key2, key3) {
-      let value = this._map[key1];
+  get(key1, key2, key3) {
+    let value = this._map[key1];
 
-      if (value === undefined && key2 !== undefined) {
-        value = this._map[key2];
+    if (value === undefined && key2 !== undefined) {
+      value = this._map[key2];
 
-        if (value === undefined && key3 !== undefined) {
-          value = this._map[key3];
-        }
+      if (value === undefined && key3 !== undefined) {
+        value = this._map[key3];
       }
+    }
 
-      if (value instanceof Ref && this.xref) {
-        return this.xref.fetch(value, this.suppressEncryption);
-      }
+    if (value instanceof Ref && this.xref) {
+      return this.xref.fetch(value, this.suppressEncryption);
+    }
 
-      return value;
-    },
+    return value;
+  }
 
-    async getAsync(key1, key2, key3) {
-      let value = this._map[key1];
+  async getAsync(key1, key2, key3) {
+    let value = this._map[key1];
 
-      if (value === undefined && key2 !== undefined) {
-        value = this._map[key2];
+    if (value === undefined && key2 !== undefined) {
+      value = this._map[key2];
 
-        if (value === undefined && key3 !== undefined) {
-          value = this._map[key3];
-        }
+      if (value === undefined && key3 !== undefined) {
+        value = this._map[key3];
       }
+    }
 
-      if (value instanceof Ref && this.xref) {
-        return this.xref.fetchAsync(value, this.suppressEncryption);
-      }
+    if (value instanceof Ref && this.xref) {
+      return this.xref.fetchAsync(value, this.suppressEncryption);
+    }
 
-      return value;
-    },
+    return value;
+  }
 
-    getArray(key1, key2, key3) {
-      let value = this.get(key1, key2, key3);
+  getArray(key1, key2, key3) {
+    let value = this._map[key1];
 
-      if (!Array.isArray(value) || !this.xref) {
-        return value;
+    if (value === undefined && key2 !== undefined) {
+      value = this._map[key2];
+
+      if (value === undefined && key3 !== undefined) {
+        value = this._map[key3];
       }
+    }
+
+    if (value instanceof Ref && this.xref) {
+      value = this.xref.fetch(value, this.suppressEncryption);
+    }
 
+    if (Array.isArray(value)) {
       value = value.slice();
 
       for (let i = 0, ii = value.length; i < ii; i++) {
-        if (!(value[i] instanceof Ref)) {
-          continue;
+        if (value[i] instanceof Ref && this.xref) {
+          value[i] = this.xref.fetch(value[i], this.suppressEncryption);
         }
-
-        value[i] = this.xref.fetch(value[i], this.suppressEncryption);
       }
+    }
 
-      return value;
-    },
+    return value;
+  }
 
-    getRaw: function Dict_getRaw(key) {
-      return this._map[key];
-    },
-    getKeys: function Dict_getKeys() {
-      return Object.keys(this._map);
-    },
-    getRawValues: function Dict_getRawValues() {
-      return Object.values(this._map);
-    },
-    set: function Dict_set(key, value) {
-      this._map[key] = value;
-    },
-    has: function Dict_has(key) {
-      return this._map[key] !== undefined;
-    },
-    forEach: function Dict_forEach(callback) {
-      for (var key in this._map) {
-        callback(key, this.get(key));
-      }
-    }
-  };
-  Dict.empty = new Dict(null);
+  getRaw(key) {
+    return this._map[key];
+  }
 
-  Dict.merge = function ({
-    xref,
-    dictArray,
-    mergeSubDicts = false
-  }) {
-    const mergedDict = new Dict(xref);
+  getKeys() {
+    return Object.keys(this._map);
+  }
 
-    if (!mergeSubDicts) {
-      for (const dict of dictArray) {
-        if (!(dict instanceof Dict)) {
-          continue;
-        }
+  getRawValues() {
+    return Object.values(this._map);
+  }
 
-        for (const [key, value] of Object.entries(dict._map)) {
-          if (mergedDict._map[key] === undefined) {
-            mergedDict._map[key] = value;
-          }
-        }
-      }
+  set(key, value) {
+    this._map[key] = value;
+  }
+
+  has(key) {
+    return this._map[key] !== undefined;
+  }
 
-      return mergedDict.size > 0 ? mergedDict : Dict.empty;
+  forEach(callback) {
+    for (const key in this._map) {
+      callback(key, this.get(key));
     }
+  }
 
-    const properties = new Map();
+  static get empty() {
+    const emptyDict = new Dict(null);
+
+    emptyDict.set = (key, value) => {
+      (0, _util.unreachable)("Should not call `set` on the empty dictionary.");
+    };
+
+    return (0, _util.shadow)(this, "empty", emptyDict);
+  }
+
+  static merge({
+    xref,
+    dictArray,
+    mergeSubDicts = false
+  }) {
+    const mergedDict = new Dict(xref),
+          properties = new Map();
 
     for (const dict of dictArray) {
       if (!(dict instanceof Dict)) {
@@ -1810,6 +1853,8 @@ var Dict = function DictClosure() {
         if (property === undefined) {
           property = [];
           properties.set(key, property);
+        } else if (!mergeSubDicts) {
+          continue;
         }
 
         property.push(value);
@@ -1843,40 +1888,40 @@ var Dict = function DictClosure() {
 
     properties.clear();
     return mergedDict.size > 0 ? mergedDict : Dict.empty;
-  };
+  }
 
-  return Dict;
-}();
+}
 
 exports.Dict = Dict;
 
-var Ref = function RefClosure() {
+const Ref = function RefClosure() {
   let refCache = Object.create(null);
 
-  function Ref(num, gen) {
-    this.num = num;
-    this.gen = gen;
-  }
+  class Ref {
+    constructor(num, gen) {
+      this.num = num;
+      this.gen = gen;
+    }
 
-  Ref.prototype = {
-    toString: function Ref_toString() {
+    toString() {
       if (this.gen === 0) {
         return `${this.num}R`;
       }
 
       return `${this.num}R${this.gen}`;
     }
-  };
 
-  Ref.get = function (num, gen) {
-    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
-    const refValue = refCache[key];
-    return refValue ? refValue : refCache[key] = new Ref(num, gen);
-  };
+    static get(num, gen) {
+      const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
+      const refValue = refCache[key];
+      return refValue ? refValue : refCache[key] = new Ref(num, gen);
+    }
 
-  Ref._clearCache = function () {
-    refCache = Object.create(null);
-  };
+    static _clearCache() {
+      refCache = Object.create(null);
+    }
+
+  }
 
   return Ref;
 }();
@@ -1884,8 +1929,8 @@ var Ref = function RefClosure() {
 exports.Ref = Ref;
 
 class RefSet {
-  constructor() {
-    this._set = new Set();
+  constructor(parent = null) {
+    this._set = new Set(parent && parent._set);
   }
 
   has(ref) {
@@ -1900,6 +1945,16 @@ class RefSet {
     this._set.delete(ref.toString());
   }
 
+  forEach(callback) {
+    for (const ref of this._set.values()) {
+      callback(ref);
+    }
+  }
+
+  clear() {
+    this._set.clear();
+  }
+
 }
 
 exports.RefSet = RefSet;
@@ -1968,7 +2023,7 @@ function isRefsEqual(v1, v2) {
 }
 
 function isStream(v) {
-  return typeof v === "object" && v !== null && v.getBytes !== undefined;
+  return v instanceof _base_stream.BaseStream;
 }
 
 function clearPrimitiveCaches() {
@@ -1981,25 +2036,145 @@ function clearPrimitiveCaches() {
 
 /***/ }),
 /* 6 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
+exports.BaseStream = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+class BaseStream {
+  constructor() {
+    if (this.constructor === BaseStream) {
+      (0, _util.unreachable)("Cannot initialize BaseStream.");
+    }
+  }
+
+  get length() {
+    (0, _util.unreachable)("Abstract getter `length` accessed");
+  }
+
+  get isEmpty() {
+    (0, _util.unreachable)("Abstract getter `isEmpty` accessed");
+  }
+
+  get isDataLoaded() {
+    return (0, _util.shadow)(this, "isDataLoaded", true);
+  }
+
+  getByte() {
+    (0, _util.unreachable)("Abstract method `getByte` called");
+  }
+
+  getBytes(length, forceClamped = false) {
+    (0, _util.unreachable)("Abstract method `getBytes` called");
+  }
+
+  peekByte() {
+    const peekedByte = this.getByte();
+
+    if (peekedByte !== -1) {
+      this.pos--;
+    }
+
+    return peekedByte;
+  }
+
+  peekBytes(length, forceClamped = false) {
+    const bytes = this.getBytes(length, forceClamped);
+    this.pos -= bytes.length;
+    return bytes;
+  }
+
+  getUint16() {
+    const b0 = this.getByte();
+    const b1 = this.getByte();
+
+    if (b0 === -1 || b1 === -1) {
+      return -1;
+    }
+
+    return (b0 << 8) + b1;
+  }
+
+  getInt32() {
+    const b0 = this.getByte();
+    const b1 = this.getByte();
+    const b2 = this.getByte();
+    const b3 = this.getByte();
+    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+  }
+
+  getByteRange(begin, end) {
+    (0, _util.unreachable)("Abstract method `getByteRange` called");
+  }
+
+  getString(length) {
+    return (0, _util.bytesToString)(this.getBytes(length, false));
+  }
+
+  skip(n) {
+    this.pos += n || 1;
+  }
+
+  reset() {
+    (0, _util.unreachable)("Abstract method `reset` called");
+  }
+
+  moveStart() {
+    (0, _util.unreachable)("Abstract method `moveStart` called");
+  }
+
+  makeSubStream(start, length, dict = null) {
+    (0, _util.unreachable)("Abstract method `makeSubStream` called");
+  }
+
+  getBaseStreams() {
+    return null;
+  }
+
+}
+
+exports.BaseStream = BaseStream;
+
+/***/ }),
+/* 7 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
 exports.NetworkPdfManager = exports.LocalPdfManager = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _chunked_stream = __w_pdfjs_require__(7);
+var _chunked_stream = __w_pdfjs_require__(8);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
+
+var _document = __w_pdfjs_require__(11);
+
+var _stream = __w_pdfjs_require__(10);
+
+function parseDocBaseUrl(url) {
+  if (url) {
+    const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url);
+
+    if (absoluteUrl) {
+      return absoluteUrl.href;
+    }
 
-var _document = __w_pdfjs_require__(9);
+    (0, _util.warn)(`Invalid absolute docBaseUrl: "${url}".`);
+  }
 
-var _stream = __w_pdfjs_require__(12);
+  return null;
+}
 
 class BasePdfManager {
   constructor() {
@@ -2017,19 +2192,7 @@ class BasePdfManager {
   }
 
   get docBaseUrl() {
-    let docBaseUrl = null;
-
-    if (this._docBaseUrl) {
-      const absoluteUrl = (0, _util.createValidAbsoluteUrl)(this._docBaseUrl);
-
-      if (absoluteUrl) {
-        docBaseUrl = absoluteUrl.href;
-      } else {
-        (0, _util.warn)(`Invalid absolute docBaseUrl: "${this._docBaseUrl}".`);
-      }
-    }
-
-    return (0, _util.shadow)(this, "docBaseUrl", docBaseUrl);
+    return this._docBaseUrl;
   }
 
   onLoadedStream() {
@@ -2056,6 +2219,18 @@ class BasePdfManager {
     return this.pdfDocument.fontFallback(id, handler);
   }
 
+  loadXfaFonts(handler, task) {
+    return this.pdfDocument.loadXfaFonts(handler, task);
+  }
+
+  loadXfaImages() {
+    return this.pdfDocument.loadXfaImages();
+  }
+
+  serializeXfaData(annotationStorage) {
+    return this.pdfDocument.serializeXfaData(annotationStorage);
+  }
+
   cleanup(manuallyTriggered = false) {
     return this.pdfDocument.cleanup(manuallyTriggered);
   }
@@ -2087,12 +2262,13 @@ class BasePdfManager {
 }
 
 class LocalPdfManager extends BasePdfManager {
-  constructor(docId, data, password, evaluatorOptions, docBaseUrl) {
+  constructor(docId, data, password, evaluatorOptions, enableXfa, docBaseUrl) {
     super();
     this._docId = docId;
     this._password = password;
-    this._docBaseUrl = docBaseUrl;
+    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);
     this.evaluatorOptions = evaluatorOptions;
+    this.enableXfa = enableXfa;
     const stream = new _stream.Stream(data);
     this.pdfDocument = new _document.PDFDocument(this, stream);
     this._loadedStreamPromise = Promise.resolve(stream);
@@ -2125,13 +2301,14 @@ class LocalPdfManager extends BasePdfManager {
 exports.LocalPdfManager = LocalPdfManager;
 
 class NetworkPdfManager extends BasePdfManager {
-  constructor(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {
+  constructor(docId, pdfNetworkStream, args, evaluatorOptions, enableXfa, docBaseUrl) {
     super();
     this._docId = docId;
     this._password = args.password;
-    this._docBaseUrl = docBaseUrl;
+    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);
     this.msgHandler = args.msgHandler;
     this.evaluatorOptions = evaluatorOptions;
+    this.enableXfa = enableXfa;
     this.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, {
       msgHandler: args.msgHandler,
       length: args.length,
@@ -2187,27 +2364,25 @@ class NetworkPdfManager extends BasePdfManager {
 exports.NetworkPdfManager = NetworkPdfManager;
 
 /***/ }),
-/* 7 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 8 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.ChunkedStreamManager = exports.ChunkedStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
 
-class ChunkedStream {
+var _stream = __w_pdfjs_require__(10);
+
+class ChunkedStream extends _stream.Stream {
   constructor(length, chunkSize, manager) {
-    this.bytes = new Uint8Array(length);
-    this.start = 0;
-    this.pos = 0;
-    this.end = length;
+    super(new Uint8Array(length), 0, length, null);
     this.chunkSize = chunkSize;
     this._loadedChunks = new Set();
     this.numChunks = Math.ceil(length / chunkSize);
@@ -2228,15 +2403,11 @@ class ChunkedStream {
     return chunks;
   }
 
-  getBaseStreams() {
-    return [this];
-  }
-
   get numChunksLoaded() {
     return this._loadedChunks.size;
   }
 
-  allChunksLoaded() {
+  get isDataLoaded() {
     return this.numChunksLoaded === this.numChunks;
   }
 
@@ -2331,14 +2502,6 @@ class ChunkedStream {
     return this._loadedChunks.has(chunk);
   }
 
-  get length() {
-    return this.end - this.start;
-  }
-
-  get isEmpty() {
-    return this.length === 0;
-  }
-
   getByte() {
     const pos = this.pos;
 
@@ -2353,25 +2516,6 @@ class ChunkedStream {
     return this.bytes[this.pos++];
   }
 
-  getUint16() {
-    const b0 = this.getByte();
-    const b1 = this.getByte();
-
-    if (b0 === -1 || b1 === -1) {
-      return -1;
-    }
-
-    return (b0 << 8) + b1;
-  }
-
-  getInt32() {
-    const b0 = this.getByte();
-    const b1 = this.getByte();
-    const b2 = this.getByte();
-    const b3 = this.getByte();
-    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-  }
-
   getBytes(length, forceClamped = false) {
     const bytes = this.bytes;
     const pos = this.pos;
@@ -2401,22 +2545,6 @@ class ChunkedStream {
     return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
   }
 
-  peekByte() {
-    const peekedByte = this.getByte();
-
-    if (peekedByte !== -1) {
-      this.pos--;
-    }
-
-    return peekedByte;
-  }
-
-  peekBytes(length, forceClamped = false) {
-    const bytes = this.getBytes(length, forceClamped);
-    this.pos -= bytes.length;
-    return bytes;
-  }
-
   getByteRange(begin, end) {
     if (begin < 0) {
       begin = 0;
@@ -2433,23 +2561,7 @@ class ChunkedStream {
     return this.bytes.subarray(begin, end);
   }
 
-  skip(n) {
-    if (!n) {
-      n = 1;
-    }
-
-    this.pos += n;
-  }
-
-  reset() {
-    this.pos = this.start;
-  }
-
-  moveStart() {
-    this.start = this.pos;
-  }
-
-  makeSubStream(start, length, dict) {
+  makeSubStream(start, length, dict = null) {
     if (length) {
       if (start + length > this.progressiveDataLength) {
         this.ensureRange(start, start + length);
@@ -2479,14 +2591,17 @@ class ChunkedStream {
       return missingChunks;
     };
 
-    ChunkedStreamSubstream.prototype.allChunksLoaded = function () {
-      if (this.numChunksLoaded === this.numChunks) {
-        return true;
-      }
+    Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", {
+      get() {
+        if (this.numChunksLoaded === this.numChunks) {
+          return true;
+        }
 
-      return this.getMissingChunks().length === 0;
-    };
+        return this.getMissingChunks().length === 0;
+      },
 
+      configurable: true
+    });
     const subStream = new ChunkedStreamSubstream();
     subStream.pos = subStream.start = start;
     subStream.end = start + length || this.end;
@@ -2494,6 +2609,10 @@ class ChunkedStream {
     return subStream;
   }
 
+  getBaseStreams() {
+    return [this];
+  }
+
 }
 
 exports.ChunkedStream = ChunkedStream;
@@ -2723,7 +2842,7 @@ class ChunkedStreamManager {
       this.stream.onReceiveData(begin, chunk);
     }
 
-    if (this.stream.allChunksLoaded()) {
+    if (this.stream.isDataLoaded) {
       this._loadedStreamCapability.resolve(this.stream);
     }
 
@@ -2814,27 +2933,34 @@ class ChunkedStreamManager {
 exports.ChunkedStreamManager = ChunkedStreamManager;
 
 /***/ }),
-/* 8 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 9 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.getLookupTableFactory = getLookupTableFactory;
+}));
+exports.collectActions = collectActions;
+exports.encodeToXmlString = encodeToXmlString;
+exports.escapePDFName = escapePDFName;
+exports.getArrayLookupTableFactory = getArrayLookupTableFactory;
 exports.getInheritableProperty = getInheritableProperty;
-exports.toRomanNumerals = toRomanNumerals;
+exports.getLookupTableFactory = getLookupTableFactory;
+exports.isWhiteSpace = isWhiteSpace;
 exports.log2 = log2;
+exports.parseXFAPath = parseXFAPath;
 exports.readInt8 = readInt8;
 exports.readUint16 = readUint16;
 exports.readUint32 = readUint32;
-exports.isWhiteSpace = isWhiteSpace;
-exports.XRefParseException = exports.XRefEntryException = exports.MissingDataException = void 0;
+exports.toRomanNumerals = toRomanNumerals;
+exports.validateCSSFont = validateCSSFont;
+exports.XRefParseException = exports.XRefEntryException = exports.ParserEOFException = 
exports.MissingDataException = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
+var _primitives = __w_pdfjs_require__(5);
+
 function getLookupTableFactory(initializer) {
   let lookup;
   return function () {
@@ -2848,6 +2974,25 @@ function getLookupTableFactory(initializer) {
   };
 }
 
+function getArrayLookupTableFactory(initializer) {
+  let lookup;
+  return function () {
+    if (initializer) {
+      let arr = initializer();
+      initializer = null;
+      lookup = Object.create(null);
+
+      for (let i = 0, ii = arr.length; i < ii; i += 2) {
+        lookup[arr[i]] = arr[i + 1];
+      }
+
+      arr = null;
+    }
+
+    return lookup;
+  };
+}
+
 class MissingDataException extends _util.BaseException {
   constructor(begin, end) {
     super(`Missing data [${begin}, ${end})`);
@@ -2859,6 +3004,10 @@ class MissingDataException extends _util.BaseException {
 
 exports.MissingDataException = MissingDataException;
 
+class ParserEOFException extends _util.BaseException {}
+
+exports.ParserEOFException = ParserEOFException;
+
 class XRefEntryException extends _util.BaseException {}
 
 exports.XRefEntryException = XRefEntryException;
@@ -2873,11 +3022,14 @@ function getInheritableProperty({
   getArray = false,
   stopWhenFound = true
 }) {
-  const LOOP_LIMIT = 100;
-  let loopCount = 0;
   let values;
+  const visited = new _primitives.RefSet();
+
+  while (dict instanceof _primitives.Dict && !(dict.objId && visited.has(dict.objId))) {
+    if (dict.objId) {
+      visited.put(dict.objId);
+    }
 
-  while (dict) {
     const value = getArray ? dict.getArray(key) : dict.get(key);
 
     if (value !== undefined) {
@@ -2892,11 +3044,6 @@ function getInheritableProperty({
       values.push(value);
     }
 
-    if (++loopCount > LOOP_LIMIT) {
-      (0, _util.warn)(`getInheritableProperty: maximum loop count exceeded for "${key}"`);
-      break;
-    }
-
     dict = dict.get("Parent");
   }
 
@@ -2950,45 +3097,395 @@ function isWhiteSpace(ch) {
   return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a;
 }
 
+function parseXFAPath(path) {
+  const positionPattern = /(.+)\[([0-9]+)\]$/;
+  return path.split(".").map(component => {
+    const m = component.match(positionPattern);
+
+    if (m) {
+      return {
+        name: m[1],
+        pos: parseInt(m[2], 10)
+      };
+    }
+
+    return {
+      name: component,
+      pos: 0
+    };
+  });
+}
+
+function escapePDFName(str) {
+  const buffer = [];
+  let start = 0;
+
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+
+    if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || 
char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char 
=== 0x25) {
+      if (start < i) {
+        buffer.push(str.substring(start, i));
+      }
+
+      buffer.push(`#${char.toString(16)}`);
+      start = i + 1;
+    }
+  }
+
+  if (buffer.length === 0) {
+    return str;
+  }
+
+  if (start < str.length) {
+    buffer.push(str.substring(start, str.length));
+  }
+
+  return buffer.join("");
+}
+
+function _collectJS(entry, xref, list, parents) {
+  if (!entry) {
+    return;
+  }
+
+  let parent = null;
+
+  if ((0, _primitives.isRef)(entry)) {
+    if (parents.has(entry)) {
+      return;
+    }
+
+    parent = entry;
+    parents.put(parent);
+    entry = xref.fetch(entry);
+  }
+
+  if (Array.isArray(entry)) {
+    for (const element of entry) {
+      _collectJS(element, xref, list, parents);
+    }
+  } else if (entry instanceof _primitives.Dict) {
+    if ((0, _primitives.isName)(entry.get("S"), "JavaScript") && entry.has("JS")) {
+      const js = entry.get("JS");
+      let code;
+
+      if ((0, _primitives.isStream)(js)) {
+        code = js.getString();
+      } else {
+        code = js;
+      }
+
+      code = (0, _util.stringToPDFString)(code);
+
+      if (code) {
+        list.push(code);
+      }
+    }
+
+    _collectJS(entry.getRaw("Next"), xref, list, parents);
+  }
+
+  if (parent) {
+    parents.remove(parent);
+  }
+}
+
+function collectActions(xref, dict, eventType) {
+  const actions = Object.create(null);
+  const additionalActionsDicts = getInheritableProperty({
+    dict,
+    key: "AA",
+    stopWhenFound: false
+  });
+
+  if (additionalActionsDicts) {
+    for (let i = additionalActionsDicts.length - 1; i >= 0; i--) {
+      const additionalActions = additionalActionsDicts[i];
+
+      if (!(additionalActions instanceof _primitives.Dict)) {
+        continue;
+      }
+
+      for (const key of additionalActions.getKeys()) {
+        const action = eventType[key];
+
+        if (!action) {
+          continue;
+        }
+
+        const actionDict = additionalActions.getRaw(key);
+        const parents = new _primitives.RefSet();
+        const list = [];
+
+        _collectJS(actionDict, xref, list, parents);
+
+        if (list.length > 0) {
+          actions[action] = list;
+        }
+      }
+    }
+  }
+
+  if (dict.has("A")) {
+    const actionDict = dict.get("A");
+    const parents = new _primitives.RefSet();
+    const list = [];
+
+    _collectJS(actionDict, xref, list, parents);
+
+    if (list.length > 0) {
+      actions.Action = list;
+    }
+  }
+
+  return (0, _util.objectSize)(actions) > 0 ? actions : null;
+}
+
+const XMLEntities = {
+  0x3c: "&lt;",
+  0x3e: "&gt;",
+  0x26: "&amp;",
+  0x22: "&quot;",
+  0x27: "&apos;"
+};
+
+function encodeToXmlString(str) {
+  const buffer = [];
+  let start = 0;
+
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.codePointAt(i);
+
+    if (0x20 <= char && char <= 0x7e) {
+      const entity = XMLEntities[char];
+
+      if (entity) {
+        if (start < i) {
+          buffer.push(str.substring(start, i));
+        }
+
+        buffer.push(entity);
+        start = i + 1;
+      }
+    } else {
+      if (start < i) {
+        buffer.push(str.substring(start, i));
+      }
+
+      buffer.push(`&#x${char.toString(16).toUpperCase()};`);
+
+      if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
+        i++;
+      }
+
+      start = i + 1;
+    }
+  }
+
+  if (buffer.length === 0) {
+    return str;
+  }
+
+  if (start < str.length) {
+    buffer.push(str.substring(start, str.length));
+  }
+
+  return buffer.join("");
+}
+
+function validateCSSFont(cssFontInfo) {
+  const DEFAULT_CSS_FONT_OBLIQUE = "14";
+  const DEFAULT_CSS_FONT_WEIGHT = "400";
+  const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", 
"1000", "normal", "bold", "bolder", "lighter"]);
+  const {
+    fontFamily,
+    fontWeight,
+    italicAngle
+  } = cssFontInfo;
+
+  if (/^".*"$/.test(fontFamily)) {
+    if (/[^\\]"/.test(fontFamily.slice(1, fontFamily.length - 1))) {
+      (0, _util.warn)(`XFA - FontFamily contains some unescaped ": ${fontFamily}.`);
+      return false;
+    }
+  } else if (/^'.*'$/.test(fontFamily)) {
+    if (/[^\\]'/.test(fontFamily.slice(1, fontFamily.length - 1))) {
+      (0, _util.warn)(`XFA - FontFamily contains some unescaped ': ${fontFamily}.`);
+      return false;
+    }
+  } else {
+    for (const ident of fontFamily.split(/[ \t]+/)) {
+      if (/^([0-9]|(-([0-9]|-)))/.test(ident) || !/^[a-zA-Z0-9\-_\\]+$/.test(ident)) {
+        (0, _util.warn)(`XFA - FontFamily contains some invalid <custom-ident>: ${fontFamily}.`);
+        return false;
+      }
+    }
+  }
+
+  const weight = fontWeight ? fontWeight.toString() : "";
+  cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT;
+  const angle = parseFloat(italicAngle);
+  cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : 
italicAngle.toString();
+  return true;
+}
+
 /***/ }),
-/* 9 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 10 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFDocument = exports.Page = void 0;
+}));
+exports.StringStream = exports.Stream = exports.NullStream = void 0;
+
+var _base_stream = __w_pdfjs_require__(6);
 
 var _util = __w_pdfjs_require__(2);
 
-var _obj = __w_pdfjs_require__(10);
+class Stream extends _base_stream.BaseStream {
+  constructor(arrayBuffer, start, length, dict) {
+    super();
+    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
+    this.start = start || 0;
+    this.pos = this.start;
+    this.end = start + length || this.bytes.length;
+    this.dict = dict;
+  }
+
+  get length() {
+    return this.end - this.start;
+  }
+
+  get isEmpty() {
+    return this.length === 0;
+  }
+
+  getByte() {
+    if (this.pos >= this.end) {
+      return -1;
+    }
+
+    return this.bytes[this.pos++];
+  }
+
+  getBytes(length, forceClamped = false) {
+    const bytes = this.bytes;
+    const pos = this.pos;
+    const strEnd = this.end;
+
+    if (!length) {
+      const subarray = bytes.subarray(pos, strEnd);
+      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
+    }
+
+    let end = pos + length;
+
+    if (end > strEnd) {
+      end = strEnd;
+    }
+
+    this.pos = end;
+    const subarray = bytes.subarray(pos, end);
+    return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
+  }
+
+  getByteRange(begin, end) {
+    if (begin < 0) {
+      begin = 0;
+    }
+
+    if (end > this.end) {
+      end = this.end;
+    }
+
+    return this.bytes.subarray(begin, end);
+  }
+
+  reset() {
+    this.pos = this.start;
+  }
+
+  moveStart() {
+    this.start = this.pos;
+  }
+
+  makeSubStream(start, length, dict = null) {
+    return new Stream(this.bytes.buffer, start, length, dict);
+  }
+
+}
+
+exports.Stream = Stream;
+
+class StringStream extends Stream {
+  constructor(str) {
+    super((0, _util.stringToBytes)(str));
+  }
+
+}
+
+exports.StringStream = StringStream;
+
+class NullStream extends Stream {
+  constructor() {
+    super(new Uint8Array(0));
+  }
+
+}
+
+exports.NullStream = NullStream;
+
+/***/ }),
+/* 11 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PDFDocument = exports.Page = void 0;
+
+var _util = __w_pdfjs_require__(2);
 
 var _primitives = __w_pdfjs_require__(5);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
+
+var _stream = __w_pdfjs_require__(10);
+
+var _annotation = __w_pdfjs_require__(12);
+
+var _base_stream = __w_pdfjs_require__(6);
 
-var _stream = __w_pdfjs_require__(12);
+var _crypto = __w_pdfjs_require__(72);
 
-var _annotation = __w_pdfjs_require__(25);
+var _catalog = __w_pdfjs_require__(64);
 
-var _crypto = __w_pdfjs_require__(22);
+var _xfa_fonts = __w_pdfjs_require__(55);
 
-var _parser = __w_pdfjs_require__(11);
+var _parser = __w_pdfjs_require__(17);
 
-var _operator_list = __w_pdfjs_require__(26);
+var _object_loader = __w_pdfjs_require__(70);
 
-var _evaluator = __w_pdfjs_require__(28);
+var _operator_list = __w_pdfjs_require__(62);
+
+var _evaluator = __w_pdfjs_require__(15);
+
+var _decode_stream = __w_pdfjs_require__(19);
+
+var _struct_tree = __w_pdfjs_require__(69);
+
+var _factory = __w_pdfjs_require__(74);
+
+var _xref = __w_pdfjs_require__(98);
 
 const DEFAULT_USER_UNIT = 1.0;
 const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
 
-function isAnnotationRenderable(annotation, intent) {
-  return intent === "display" && annotation.viewable || intent === "print" && annotation.printable;
-}
-
 class Page {
   constructor({
     pdfManager,
@@ -2999,7 +3496,10 @@ class Page {
     globalIdFactory,
     fontCache,
     builtInCMapCache,
-    globalImageCache
+    standardFontDataCache,
+    globalImageCache,
+    nonBlendModesSet,
+    xfaFactory
   }) {
     this.pdfManager = pdfManager;
     this.pageIndex = pageIndex;
@@ -3008,9 +3508,12 @@ class Page {
     this.ref = ref;
     this.fontCache = fontCache;
     this.builtInCMapCache = builtInCMapCache;
+    this.standardFontDataCache = standardFontDataCache;
     this.globalImageCache = globalImageCache;
+    this.nonBlendModesSet = nonBlendModesSet;
     this.evaluatorOptions = pdfManager.evaluatorOptions;
     this.resourcesPromise = null;
+    this.xfaFactory = xfaFactory;
     const idCounters = {
       obj: 0
     };
@@ -3019,6 +3522,10 @@ class Page {
         return `p${pageIndex}_${++idCounters.obj}`;
       }
 
+      static getPageObjId() {
+        return `page${ref.toString()}`;
+      }
+
     };
   }
 
@@ -3045,7 +3552,7 @@ class Page {
   }
 
   get content() {
-    return this.pageDict.get("Contents");
+    return this.pageDict.getArray("Contents");
   }
 
   get resources() {
@@ -3053,6 +3560,10 @@ class Page {
   }
 
   _getBoundingBox(name) {
+    if (this.xfaData) {
+      return this.xfaData.bbox;
+    }
+
     const box = this._getInheritableProperty(name, true);
 
     if (Array.isArray(box) && box.length === 4) {
@@ -3112,7 +3623,7 @@ class Page {
     if (rotate % 90 !== 0) {
       rotate = 0;
     } else if (rotate >= 360) {
-      rotate = rotate % 360;
+      rotate %= 360;
     } else if (rotate < 0) {
       rotate = (rotate % 360 + 360) % 360;
     }
@@ -3121,25 +3632,27 @@ class Page {
   }
 
   getContentStream() {
-    const content = this.content;
-    let stream;
-
-    if (Array.isArray(content)) {
-      const xref = this.xref;
-      const streams = [];
+    return this.pdfManager.ensure(this, "content").then(content => {
+      if (content instanceof _base_stream.BaseStream) {
+        return content;
+      }
 
-      for (const subStream of content) {
-        streams.push(xref.fetchIfRef(subStream));
+      if (Array.isArray(content)) {
+        return new _decode_stream.StreamsSequenceStream(content);
       }
 
-      stream = new _stream.StreamsSequenceStream(streams);
-    } else if ((0, _primitives.isStream)(content)) {
-      stream = content;
-    } else {
-      stream = new _stream.NullStream();
+      return new _stream.NullStream();
+    });
+  }
+
+  get xfaData() {
+    if (this.xfaFactory) {
+      return (0, _util.shadow)(this, "xfaData", {
+        bbox: this.xfaFactory.getBoundingBox(this.pageIndex)
+      });
     }
 
-    return stream;
+    return (0, _util.shadow)(this, "xfaData", null);
   }
 
   save(handler, task, annotationStorage) {
@@ -3150,6 +3663,7 @@ class Page {
       idFactory: this._localIdFactory,
       fontCache: this.fontCache,
       builtInCMapCache: this.builtInCMapCache,
+      standardFontDataCache: this.standardFontDataCache,
       globalImageCache: this.globalImageCache,
       options: this.evaluatorOptions
     });
@@ -3157,7 +3671,7 @@ class Page {
       const newRefsPromises = [];
 
       for (const annotation of annotations) {
-        if (!isAnnotationRenderable(annotation, "print")) {
+        if (!annotation.mustBePrinted(annotationStorage)) {
           continue;
         }
 
@@ -3177,7 +3691,7 @@ class Page {
     }
 
     return this.resourcesPromise.then(() => {
-      const objectLoader = new _obj.ObjectLoader(this.resources, keys, this.xref);
+      const objectLoader = new _object_loader.ObjectLoader(this.resources, keys, this.xref);
       return objectLoader.load();
     });
   }
@@ -3190,8 +3704,8 @@ class Page {
     renderInteractiveForms,
     annotationStorage
   }) {
-    const contentStreamPromise = this.pdfManager.ensure(this, "getContentStream");
-    const resourcesPromise = this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", 
"Font"]);
+    const contentStreamPromise = this.getContentStream();
+    const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", 
"Shading", "XObject"]);
     const partialEvaluator = new _evaluator.PartialEvaluator({
       xref: this.xref,
       handler,
@@ -3199,6 +3713,7 @@ class Page {
       idFactory: this._localIdFactory,
       fontCache: this.fontCache,
       builtInCMapCache: this.builtInCMapCache,
+      standardFontDataCache: this.standardFontDataCache,
       globalImageCache: this.globalImageCache,
       options: this.evaluatorOptions
     });
@@ -3206,7 +3721,7 @@ class Page {
     const pageListPromise = dataPromises.then(([contentStream]) => {
       const opList = new _operator_list.OperatorList(intent, sink);
       handler.send("StartRenderPage", {
-        transparency: partialEvaluator.hasBlendModes(this.resources),
+        transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet),
         pageIndex: this.pageIndex,
         intent
       });
@@ -3227,10 +3742,11 @@ class Page {
         };
       }
 
+      const annotationIntent = intent.startsWith("oplist-") ? intent.split("-")[1] : intent;
       const opListPromises = [];
 
       for (const annotation of annotations) {
-        if (isAnnotationRenderable(annotation, intent)) {
+        if (annotationIntent === "display" && annotation.mustBeViewed(annotationStorage) || annotationIntent 
=== "print" && annotation.mustBePrinted(annotationStorage)) {
           opListPromises.push(annotation.getOperatorList(partialEvaluator, task, renderInteractiveForms, 
annotationStorage).catch(function (reason) {
             (0, _util.warn)("getOperatorList - ignoring annotation data during " + `"${task.name}" task: 
"${reason}".`);
             return null;
@@ -3258,11 +3774,12 @@ class Page {
     handler,
     task,
     normalizeWhitespace,
+    includeMarkedContent,
     sink,
     combineTextItems
   }) {
-    const contentStreamPromise = this.pdfManager.ensure(this, "getContentStream");
-    const resourcesPromise = this.loadResources(["ExtGState", "XObject", "Font"]);
+    const contentStreamPromise = this.getContentStream();
+    const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]);
     const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
     return dataPromises.then(([contentStream]) => {
       const partialEvaluator = new _evaluator.PartialEvaluator({
@@ -3272,6 +3789,7 @@ class Page {
         idFactory: this._localIdFactory,
         fontCache: this.fontCache,
         builtInCMapCache: this.builtInCMapCache,
+        standardFontDataCache: this.standardFontDataCache,
         globalImageCache: this.globalImageCache,
         options: this.evaluatorOptions
       });
@@ -3280,18 +3798,36 @@ class Page {
         task,
         resources: this.resources,
         normalizeWhitespace,
+        includeMarkedContent,
         combineTextItems,
         sink
       });
     });
   }
 
+  async getStructTree() {
+    const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot");
+
+    if (!structTreeRoot) {
+      return null;
+    }
+
+    const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]);
+    return structTree.serializable;
+  }
+
+  _parseStructTree(structTreeRoot) {
+    const tree = new _struct_tree.StructTreePage(structTreeRoot, this.pageDict);
+    tree.parse();
+    return tree;
+  }
+
   getAnnotationsData(intent) {
     return this._parsedAnnotations.then(function (annotations) {
       const annotationsData = [];
 
       for (let i = 0, ii = annotations.length; i < ii; i++) {
-        if (!intent || isAnnotationRenderable(annotations[i], intent)) {
+        if (!intent || intent === "display" && annotations[i].viewable || intent === "print" && 
annotations[i].printable) {
           annotationsData.push(annotations[i].data);
         }
       }
@@ -3301,7 +3837,9 @@ class Page {
   }
 
   get annotations() {
-    return (0, _util.shadow)(this, "annotations", this._getInheritableProperty("Annots") || []);
+    const annots = this._getInheritableProperty("Annots");
+
+    return (0, _util.shadow)(this, "annotations", Array.isArray(annots) ? annots : []);
   }
 
   get _parsedAnnotations() {
@@ -3309,7 +3847,7 @@ class Page {
       const annotationPromises = [];
 
       for (const annotationRef of this.annotations) {
-        annotationPromises.push(_annotation.AnnotationFactory.create(this.xref, annotationRef, 
this.pdfManager, this._localIdFactory).catch(function (reason) {
+        annotationPromises.push(_annotation.AnnotationFactory.create(this.xref, annotationRef, 
this.pdfManager, this._localIdFactory, false).catch(function (reason) {
           (0, _util.warn)(`_parsedAnnotations: "${reason}".`);
           return null;
         }));
@@ -3322,6 +3860,11 @@ class Page {
     return (0, _util.shadow)(this, "_parsedAnnotations", parsedAnnotations);
   }
 
+  get jsActions() {
+    const actions = (0, _core_utils.collectActions)(this.xref, this.pageDict, _util.PageActionEventType);
+    return (0, _util.shadow)(this, "jsActions", actions);
+  }
+
 }
 
 exports.Page = Page;
@@ -3399,7 +3942,7 @@ class PDFDocument {
 
     this.pdfManager = pdfManager;
     this.stream = stream;
-    this.xref = new _obj.XRef(stream, pdfManager);
+    this.xref = new _xref.XRef(stream, pdfManager);
     this._pagePromises = [];
     this._version = null;
     const idCounters = {
@@ -3418,12 +3961,16 @@ class PDFDocument {
         (0, _util.unreachable)("Abstract method `createObjId` called.");
       }
 
+      static getPageObjId() {
+        (0, _util.unreachable)("Abstract method `getPageObjId` called.");
+      }
+
     };
   }
 
   parse(recoveryMode) {
     this.xref.parse(recoveryMode);
-    this.catalog = new _obj.Catalog(this.pdfManager, this.xref);
+    this.catalog = new _catalog.Catalog(this.pdfManager, this.xref);
 
     if (this.catalog.version) {
       this._version = this.catalog.version;
@@ -3530,6 +4077,10 @@ class PDFDocument {
   }
 
   get numPages() {
+    if (this.xfaFactory) {
+      return (0, _util.shadow)(this, "numPages", this.xfaFactory.numberPages);
+    }
+
     const linearization = this.linearization;
     const num = linearization ? linearization.numPages : this.catalog.numPages;
     return (0, _util.shadow)(this, "numPages", num);
@@ -3537,9 +4088,18 @@ class PDFDocument {
 
   _hasOnlyDocumentSignatures(fields, recursionDepth = 0) {
     const RECURSION_LIMIT = 10;
+
+    if (!Array.isArray(fields)) {
+      return false;
+    }
+
     return fields.every(field => {
       field = this.xref.fetchIfRef(field);
 
+      if (!(field instanceof _primitives.Dict)) {
+        return false;
+      }
+
       if (field.has("Kids")) {
         if (++recursionDepth > RECURSION_LIMIT) {
           (0, _util.warn)("_hasOnlyDocumentSignatures: maximum recursion depth reached");
@@ -3556,10 +4116,282 @@ class PDFDocument {
     });
   }
 
+  get xfaData() {
+    const acroForm = this.catalog.acroForm;
+
+    if (!acroForm) {
+      return null;
+    }
+
+    const xfa = acroForm.get("XFA");
+    const entries = {
+      "xdp:xdp": "",
+      template: "",
+      datasets: "",
+      config: "",
+      connectionSet: "",
+      localeSet: "",
+      stylesheet: "",
+      "/xdp:xdp": ""
+    };
+
+    if ((0, _primitives.isStream)(xfa) && !xfa.isEmpty) {
+      try {
+        entries["xdp:xdp"] = (0, _util.stringToUTF8String)(xfa.getString());
+        return entries;
+      } catch (_) {
+        (0, _util.warn)("XFA - Invalid utf-8 string.");
+        return null;
+      }
+    }
+
+    if (!Array.isArray(xfa) || xfa.length === 0) {
+      return null;
+    }
+
+    for (let i = 0, ii = xfa.length; i < ii; i += 2) {
+      let name;
+
+      if (i === 0) {
+        name = "xdp:xdp";
+      } else if (i === ii - 2) {
+        name = "/xdp:xdp";
+      } else {
+        name = xfa[i];
+      }
+
+      if (!entries.hasOwnProperty(name)) {
+        continue;
+      }
+
+      const data = this.xref.fetchIfRef(xfa[i + 1]);
+
+      if (!(0, _primitives.isStream)(data) || data.isEmpty) {
+        continue;
+      }
+
+      try {
+        entries[name] = (0, _util.stringToUTF8String)(data.getString());
+      } catch (_) {
+        (0, _util.warn)("XFA - Invalid utf-8 string.");
+        return null;
+      }
+    }
+
+    return entries;
+  }
+
+  get xfaFactory() {
+    if (this.pdfManager.enableXfa && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) {
+      const data = this.xfaData;
+      return (0, _util.shadow)(this, "xfaFactory", data ? new _factory.XFAFactory(data) : null);
+    }
+
+    return (0, _util.shadow)(this, "xfaFaxtory", null);
+  }
+
+  get isPureXfa() {
+    return this.xfaFactory && this.xfaFactory.isValid();
+  }
+
+  get htmlForXfa() {
+    if (this.xfaFactory) {
+      return this.xfaFactory.getPages();
+    }
+
+    return null;
+  }
+
+  async loadXfaImages() {
+    const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages");
+
+    if (!xfaImagesDict) {
+      return;
+    }
+
+    const keys = xfaImagesDict.getKeys();
+    const objectLoader = new _object_loader.ObjectLoader(xfaImagesDict, keys, this.xref);
+    await objectLoader.load();
+    const xfaImages = new Map();
+
+    for (const key of keys) {
+      const stream = xfaImagesDict.get(key);
+
+      if (!(0, _primitives.isStream)(stream)) {
+        continue;
+      }
+
+      xfaImages.set(key, stream.getBytes());
+    }
+
+    this.xfaFactory.setImages(xfaImages);
+  }
+
+  async loadXfaFonts(handler, task) {
+    const acroForm = await this.pdfManager.ensureCatalog("acroForm");
+
+    if (!acroForm) {
+      return;
+    }
+
+    const resources = await acroForm.getAsync("DR");
+
+    if (!(resources instanceof _primitives.Dict)) {
+      return;
+    }
+
+    const objectLoader = new _object_loader.ObjectLoader(resources, ["Font"], this.xref);
+    await objectLoader.load();
+    const fontRes = resources.get("Font");
+
+    if (!(fontRes instanceof _primitives.Dict)) {
+      return;
+    }
+
+    const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions);
+    options.useSystemFonts = false;
+    const partialEvaluator = new _evaluator.PartialEvaluator({
+      xref: this.xref,
+      handler,
+      pageIndex: -1,
+      idFactory: this._globalIdFactory,
+      fontCache: this.catalog.fontCache,
+      builtInCMapCache: this.catalog.builtInCMapCache,
+      standardFontDataCache: this.catalog.standardFontDataCache,
+      options
+    });
+    const operatorList = new _operator_list.OperatorList();
+    const pdfFonts = [];
+    const initialState = {
+      get font() {
+        return pdfFonts[pdfFonts.length - 1];
+      },
+
+      set font(font) {
+        pdfFonts.push(font);
+      },
+
+      clone() {
+        return this;
+      }
+
+    };
+    const fonts = new Map();
+    fontRes.forEach((fontName, font) => {
+      fonts.set(fontName, font);
+    });
+    const promises = [];
+
+    for (const [fontName, font] of fonts) {
+      const descriptor = font.get("FontDescriptor");
+
+      if (!(descriptor instanceof _primitives.Dict)) {
+        continue;
+      }
+
+      let fontFamily = descriptor.get("FontFamily");
+      fontFamily = fontFamily.replace(/[ ]+([0-9])/g, "$1");
+      const fontWeight = descriptor.get("FontWeight");
+      const italicAngle = -descriptor.get("ItalicAngle");
+      const cssFontInfo = {
+        fontFamily,
+        fontWeight,
+        italicAngle
+      };
+
+      if (!(0, _core_utils.validateCSSFont)(cssFontInfo)) {
+        continue;
+      }
+
+      promises.push(partialEvaluator.handleSetFont(resources, [_primitives.Name.get(fontName), 1], null, 
operatorList, task, initialState, null, cssFontInfo).catch(function (reason) {
+        (0, _util.warn)(`loadXfaFonts: "${reason}".`);
+        return null;
+      }));
+    }
+
+    await Promise.all(promises);
+    const missingFonts = this.xfaFactory.setFonts(pdfFonts);
+
+    if (!missingFonts) {
+      return;
+    }
+
+    options.ignoreErrors = true;
+    promises.length = 0;
+    pdfFonts.length = 0;
+    const reallyMissingFonts = new Set();
+
+    for (const missing of missingFonts) {
+      if (!(0, _xfa_fonts.getXfaFontWidths)(`${missing}-Regular`)) {
+        reallyMissingFonts.add(missing);
+      }
+    }
+
+    if (reallyMissingFonts.size) {
+      missingFonts.push("PdfJS-Fallback");
+    }
+
+    for (const missing of missingFonts) {
+      if (reallyMissingFonts.has(missing)) {
+        continue;
+      }
+
+      for (const fontInfo of [{
+        name: "Regular",
+        fontWeight: 400,
+        italicAngle: 0
+      }, {
+        name: "Bold",
+        fontWeight: 700,
+        italicAngle: 0
+      }, {
+        name: "Italic",
+        fontWeight: 400,
+        italicAngle: 12
+      }, {
+        name: "BoldItalic",
+        fontWeight: 700,
+        italicAngle: 12
+      }]) {
+        const name = `${missing}-${fontInfo.name}`;
+        const widths = (0, _xfa_fonts.getXfaFontWidths)(name);
+        const dict = new _primitives.Dict(null);
+        dict.set("BaseFont", _primitives.Name.get(name));
+        dict.set("Type", _primitives.Name.get("Font"));
+        dict.set("Subtype", _primitives.Name.get("TrueType"));
+        dict.set("Encoding", _primitives.Name.get("WinAnsiEncoding"));
+        const descriptor = new _primitives.Dict(null);
+        descriptor.set("Widths", widths);
+        dict.set("FontDescriptor", descriptor);
+        promises.push(partialEvaluator.handleSetFont(resources, [_primitives.Name.get(name), 1], null, 
operatorList, task, initialState, dict, {
+          fontFamily: missing,
+          fontWeight: fontInfo.fontWeight,
+          italicAngle: fontInfo.italicAngle
+        }).catch(function (reason) {
+          (0, _util.warn)(`loadXfaFonts: "${reason}".`);
+          return null;
+        }));
+      }
+    }
+
+    await Promise.all(promises);
+    this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts);
+  }
+
+  async serializeXfaData(annotationStorage) {
+    if (this.xfaFactory) {
+      return this.xfaFactory.serializeData(annotationStorage);
+    }
+
+    return null;
+  }
+
   get formInfo() {
     const formInfo = {
+      hasFields: false,
       hasAcroForm: false,
-      hasXfa: false
+      hasXfa: false,
+      hasSignatures: false
     };
     const acroForm = this.catalog.acroForm;
 
@@ -3568,22 +4400,24 @@ class PDFDocument {
     }
 
     try {
-      const xfa = acroForm.get("XFA");
-      const hasXfa = Array.isArray(xfa) && xfa.length > 0 || (0, _primitives.isStream)(xfa) && !xfa.isEmpty;
-      formInfo.hasXfa = hasXfa;
       const fields = acroForm.get("Fields");
       const hasFields = Array.isArray(fields) && fields.length > 0;
+      formInfo.hasFields = hasFields;
+      const xfa = acroForm.get("XFA");
+      formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || (0, _primitives.isStream)(xfa) && 
!xfa.isEmpty;
       const sigFlags = acroForm.get("SigFlags");
+      const hasSignatures = !!(sigFlags & 0x1);
 
-      const hasOnlyDocumentSignatures = !!(sigFlags & 0x1) && this._hasOnlyDocumentSignatures(fields);
+      const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields);
 
       formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
+      formInfo.hasSignatures = hasSignatures;
     } catch (ex) {
       if (ex instanceof _core_utils.MissingDataException) {
         throw ex;
       }
 
-      (0, _util.info)("Cannot fetch form information.");
+      (0, _util.warn)(`Cannot fetch form information: "${ex}".`);
     }
 
     return (0, _util.shadow)(this, "formInfo", formInfo);
@@ -3613,7 +4447,8 @@ class PDFDocument {
       IsLinearized: !!this.linearization,
       IsAcroFormPresent: this.formInfo.hasAcroForm,
       IsXFAPresent: this.formInfo.hasXfa,
-      IsCollectionPresent: !!this.catalog.collection
+      IsCollectionPresent: !!this.catalog.collection,
+      IsSignaturesPresent: this.formInfo.hasSignatures
     };
     let infoDict;
 
@@ -3661,24 +4496,36 @@ class PDFDocument {
     return (0, _util.shadow)(this, "documentInfo", docInfo);
   }
 
-  get fingerprint() {
-    let hash;
-    const idArray = this.xref.trailer.get("ID");
+  get fingerprints() {
+    function validate(data) {
+      return typeof data === "string" && data.length > 0 && data !== EMPTY_FINGERPRINT;
+    }
 
-    if (Array.isArray(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== 
EMPTY_FINGERPRINT) {
-      hash = (0, _util.stringToBytes)(idArray[0]);
-    } else {
-      hash = (0, _crypto.calculateMD5)(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, 
FINGERPRINT_FIRST_BYTES);
+    function hexString(hash) {
+      const buf = [];
+
+      for (let i = 0, ii = hash.length; i < ii; i++) {
+        const hex = hash[i].toString(16);
+        buf.push(hex.padStart(2, "0"));
+      }
+
+      return buf.join("");
     }
 
-    const fingerprintBuf = [];
+    const idArray = this.xref.trailer.get("ID");
+    let hashOriginal, hashModified;
+
+    if (Array.isArray(idArray) && validate(idArray[0])) {
+      hashOriginal = (0, _util.stringToBytes)(idArray[0]);
 
-    for (let i = 0, ii = hash.length; i < ii; i++) {
-      const hex = hash[i].toString(16);
-      fingerprintBuf.push(hex.padStart(2, "0"));
+      if (idArray[1] !== idArray[0] && validate(idArray[1])) {
+        hashModified = (0, _util.stringToBytes)(idArray[1]);
+      }
+    } else {
+      hashOriginal = (0, _crypto.calculateMD5)(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, 
FINGERPRINT_FIRST_BYTES);
     }
 
-    return (0, _util.shadow)(this, "fingerprint", fingerprintBuf.join(""));
+    return (0, _util.shadow)(this, "fingerprints", [hexString(hashOriginal), hashModified ? 
hexString(hashModified) : null]);
   }
 
   _getLinearizationPage(pageIndex) {
@@ -3714,6 +4561,24 @@ class PDFDocument {
       catalog,
       linearization
     } = this;
+
+    if (this.xfaFactory) {
+      return Promise.resolve(new Page({
+        pdfManager: this.pdfManager,
+        xref: this.xref,
+        pageIndex,
+        pageDict: _primitives.Dict.empty,
+        ref: null,
+        globalIdFactory: this._globalIdFactory,
+        fontCache: catalog.fontCache,
+        builtInCMapCache: catalog.builtInCMapCache,
+        standardFontDataCache: catalog.standardFontDataCache,
+        globalImageCache: catalog.globalImageCache,
+        nonBlendModesSet: catalog.nonBlendModesSet,
+        xfaFactory: this.xfaFactory
+      }));
+    }
+
     const promise = linearization && linearization.pageFirst === pageIndex ? 
this._getLinearizationPage(pageIndex) : catalog.getPageDict(pageIndex);
     return this._pagePromises[pageIndex] = promise.then(([pageDict, ref]) => {
       return new Page({
@@ -3725,7 +4590,10 @@ class PDFDocument {
         globalIdFactory: this._globalIdFactory,
         fontCache: catalog.fontCache,
         builtInCMapCache: catalog.builtInCMapCache,
-        globalImageCache: catalog.globalImageCache
+        standardFontDataCache: catalog.standardFontDataCache,
+        globalImageCache: catalog.globalImageCache,
+        nonBlendModesSet: catalog.nonBlendModesSet,
+        xfaFactory: null
       });
     });
   }
@@ -3748,32953 +4616,32508 @@ class PDFDocument {
     return this.catalog ? this.catalog.cleanup(manuallyTriggered) : (0, _primitives.clearPrimitiveCaches)();
   }
 
-}
+  _collectFieldObjects(name, fieldRef, promises) {
+    const field = this.xref.fetchIfRef(fieldRef);
 
-exports.PDFDocument = PDFDocument;
+    if (field.has("T")) {
+      const partName = (0, _util.stringToPDFString)(field.get("T"));
 
-/***/ }),
-/* 10 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+      if (name === "") {
+        name = partName;
+      } else {
+        name = `${name}.${partName}`;
+      }
+    }
 
-"use strict";
+    if (!promises.has(name)) {
+      promises.set(name, []);
+    }
 
+    promises.get(name).push(_annotation.AnnotationFactory.create(this.xref, fieldRef, this.pdfManager, 
this._localIdFactory, true).then(annotation => annotation && annotation.getFieldObject()).catch(function 
(reason) {
+      (0, _util.warn)(`_collectFieldObjects: "${reason}".`);
+      return null;
+    }));
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = void 0;
+    if (field.has("Kids")) {
+      const kids = field.get("Kids");
 
-var _util = __w_pdfjs_require__(2);
+      for (const kid of kids) {
+        this._collectFieldObjects(name, kid, promises);
+      }
+    }
+  }
 
-var _primitives = __w_pdfjs_require__(5);
+  get fieldObjects() {
+    if (!this.formInfo.hasFields) {
+      return (0, _util.shadow)(this, "fieldObjects", Promise.resolve(null));
+    }
+
+    const allFields = Object.create(null);
+    const fieldPromises = new Map();
 
-var _parser = __w_pdfjs_require__(11);
+    for (const fieldRef of this.catalog.acroForm.get("Fields")) {
+      this._collectFieldObjects("", fieldRef, fieldPromises);
+    }
 
-var _core_utils = __w_pdfjs_require__(8);
+    const allPromises = [];
 
-var _crypto = __w_pdfjs_require__(22);
+    for (const [name, promises] of fieldPromises) {
+      allPromises.push(Promise.all(promises).then(fields => {
+        fields = fields.filter(field => !!field);
 
-var _colorspace = __w_pdfjs_require__(23);
+        if (fields.length > 0) {
+          allFields[name] = fields;
+        }
+      }));
+    }
 
-var _image_utils = __w_pdfjs_require__(24);
+    return (0, _util.shadow)(this, "fieldObjects", Promise.all(allPromises).then(() => allFields));
+  }
 
-function fetchDestination(dest) {
-  return (0, _primitives.isDict)(dest) ? dest.get("D") : dest;
-}
+  get hasJSActions() {
+    const promise = this.pdfManager.ensureDoc("_parseHasJSActions");
+    return (0, _util.shadow)(this, "hasJSActions", promise);
+  }
 
-class Catalog {
-  constructor(pdfManager, xref) {
-    this.pdfManager = pdfManager;
-    this.xref = xref;
-    this._catDict = xref.getCatalogObj();
+  async _parseHasJSActions() {
+    const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), 
this.pdfManager.ensureDoc("fieldObjects")]);
 
-    if (!(0, _primitives.isDict)(this._catDict)) {
-      throw new _util.FormatError("Catalog object is not a dictionary.");
+    if (catalogJsActions) {
+      return true;
     }
 
-    this.fontCache = new _primitives.RefSetCache();
-    this.builtInCMapCache = new Map();
-    this.globalImageCache = new _image_utils.GlobalImageCache();
-    this.pageKidsCountCache = new _primitives.RefSetCache();
+    if (fieldObjects) {
+      return Object.values(fieldObjects).some(fieldObject => fieldObject.some(object => object.actions !== 
null));
+    }
+
+    return false;
   }
 
-  get version() {
-    const version = this._catDict.get("Version");
+  get calculationOrderIds() {
+    const acroForm = this.catalog.acroForm;
 
-    if (!(0, _primitives.isName)(version)) {
-      return (0, _util.shadow)(this, "version", null);
+    if (!acroForm || !acroForm.has("CO")) {
+      return (0, _util.shadow)(this, "calculationOrderIds", null);
     }
 
-    return (0, _util.shadow)(this, "version", version.name);
-  }
-
-  get collection() {
-    let collection = null;
+    const calculationOrder = acroForm.get("CO");
 
-    try {
-      const obj = this._catDict.get("Collection");
+    if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) {
+      return (0, _util.shadow)(this, "calculationOrderIds", null);
+    }
 
-      if ((0, _primitives.isDict)(obj) && obj.size > 0) {
-        collection = obj;
-      }
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+    const ids = calculationOrder.filter(_primitives.isRef).map(ref => ref.toString());
 
-      (0, _util.info)("Cannot fetch Collection entry; assuming no collection is present.");
+    if (ids.length === 0) {
+      return (0, _util.shadow)(this, "calculationOrderIds", null);
     }
 
-    return (0, _util.shadow)(this, "collection", collection);
+    return (0, _util.shadow)(this, "calculationOrderIds", ids);
   }
 
-  get acroForm() {
-    let acroForm = null;
-
-    try {
-      const obj = this._catDict.get("AcroForm");
+}
 
-      if ((0, _primitives.isDict)(obj) && obj.size > 0) {
-        acroForm = obj;
-      }
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+exports.PDFDocument = PDFDocument;
 
-      (0, _util.info)("Cannot fetch AcroForm entry; assuming no forms are present.");
-    }
+/***/ }),
+/* 12 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    return (0, _util.shadow)(this, "acroForm", acroForm);
-  }
 
-  get metadata() {
-    const streamRef = this._catDict.getRaw("Metadata");
 
-    if (!(0, _primitives.isRef)(streamRef)) {
-      return (0, _util.shadow)(this, "metadata", null);
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getQuadPoints = getQuadPoints;
+exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = 
void 0;
 
-    const suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata);
-    const stream = this.xref.fetch(streamRef, suppressEncryption);
-    let metadata;
+var _util = __w_pdfjs_require__(2);
 
-    if (stream && (0, _primitives.isDict)(stream.dict)) {
-      const type = stream.dict.get("Type");
-      const subtype = stream.dict.get("Subtype");
+var _core_utils = __w_pdfjs_require__(9);
 
-      if ((0, _primitives.isName)(type, "Metadata") && (0, _primitives.isName)(subtype, "XML")) {
-        try {
-          metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));
-        } catch (e) {
-          if (e instanceof _core_utils.MissingDataException) {
-            throw e;
-          }
+var _default_appearance = __w_pdfjs_require__(13);
 
-          (0, _util.info)("Skipping invalid metadata.");
-        }
-      }
-    }
+var _primitives = __w_pdfjs_require__(5);
 
-    return (0, _util.shadow)(this, "metadata", metadata);
-  }
+var _catalog = __w_pdfjs_require__(64);
 
-  get toplevelPagesDict() {
-    const pagesObj = this._catDict.get("Pages");
+var _colorspace = __w_pdfjs_require__(14);
 
-    if (!(0, _primitives.isDict)(pagesObj)) {
-      throw new _util.FormatError("Invalid top-level pages dictionary.");
-    }
+var _file_spec = __w_pdfjs_require__(66);
 
-    return (0, _util.shadow)(this, "toplevelPagesDict", pagesObj);
-  }
+var _object_loader = __w_pdfjs_require__(70);
 
-  get documentOutline() {
-    let obj = null;
+var _operator_list = __w_pdfjs_require__(62);
 
-    try {
-      obj = this._readDocumentOutline();
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+var _stream = __w_pdfjs_require__(10);
 
-      (0, _util.warn)("Unable to read document outline.");
-    }
+var _writer = __w_pdfjs_require__(71);
 
-    return (0, _util.shadow)(this, "documentOutline", obj);
+class AnnotationFactory {
+  static create(xref, ref, pdfManager, idFactory, collectFields) {
+    return Promise.all([pdfManager.ensureCatalog("acroForm"), collectFields ? this._getPageIndex(xref, ref, 
pdfManager) : -1]).then(([acroForm, pageIndex]) => pdfManager.ensure(this, "_create", [xref, ref, pdfManager, 
idFactory, acroForm, collectFields, pageIndex]));
   }
 
-  _readDocumentOutline() {
-    let obj = this._catDict.get("Outlines");
+  static _create(xref, ref, pdfManager, idFactory, acroForm, collectFields, pageIndex = -1) {
+    const dict = xref.fetchIfRef(ref);
 
-    if (!(0, _primitives.isDict)(obj)) {
-      return null;
+    if (!(0, _primitives.isDict)(dict)) {
+      return undefined;
     }
 
-    obj = obj.getRaw("First");
+    const id = (0, _primitives.isRef)(ref) ? ref.toString() : `annot_${idFactory.createObjId()}`;
+    let subtype = dict.get("Subtype");
+    subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;
+    const parameters = {
+      xref,
+      ref,
+      dict,
+      subtype,
+      id,
+      pdfManager,
+      acroForm: acroForm instanceof _primitives.Dict ? acroForm : _primitives.Dict.empty,
+      collectFields,
+      pageIndex
+    };
 
-    if (!(0, _primitives.isRef)(obj)) {
-      return null;
-    }
+    switch (subtype) {
+      case "Link":
+        return new LinkAnnotation(parameters);
 
-    const root = {
-      items: []
-    };
-    const queue = [{
-      obj,
-      parent: root
-    }];
-    const processed = new _primitives.RefSet();
-    processed.put(obj);
-    const xref = this.xref,
-          blackColor = new Uint8ClampedArray(3);
+      case "Text":
+        return new TextAnnotation(parameters);
 
-    while (queue.length > 0) {
-      const i = queue.shift();
-      const outlineDict = xref.fetchIfRef(i.obj);
+      case "Widget":
+        let fieldType = (0, _core_utils.getInheritableProperty)({
+          dict,
+          key: "FT"
+        });
+        fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
 
-      if (outlineDict === null) {
-        continue;
-      }
+        switch (fieldType) {
+          case "Tx":
+            return new TextWidgetAnnotation(parameters);
 
-      if (!outlineDict.has("Title")) {
-        throw new _util.FormatError("Invalid outline item encountered.");
-      }
+          case "Btn":
+            return new ButtonWidgetAnnotation(parameters);
 
-      const data = {
-        url: null,
-        dest: null
-      };
-      Catalog.parseDestDictionary({
-        destDict: outlineDict,
-        resultObj: data,
-        docBaseUrl: this.pdfManager.docBaseUrl
-      });
-      const title = outlineDict.get("Title");
-      const flags = outlineDict.get("F") || 0;
-      const color = outlineDict.getArray("C");
-      const count = outlineDict.get("Count");
-      let rgbColor = blackColor;
+          case "Ch":
+            return new ChoiceWidgetAnnotation(parameters);
 
-      if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 
0)) {
-        rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);
-      }
+          case "Sig":
+            return new SignatureWidgetAnnotation(parameters);
+        }
 
-      const outlineItem = {
-        dest: data.dest,
-        url: data.url,
-        unsafeUrl: data.unsafeUrl,
-        newWindow: data.newWindow,
-        title: (0, _util.stringToPDFString)(title),
-        color: rgbColor,
-        count: Number.isInteger(count) ? count : undefined,
-        bold: !!(flags & 2),
-        italic: !!(flags & 1),
-        items: []
-      };
-      i.parent.items.push(outlineItem);
-      obj = outlineDict.getRaw("First");
+        (0, _util.warn)(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field 
type.");
+        return new WidgetAnnotation(parameters);
 
-      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
-        queue.push({
-          obj,
-          parent: outlineItem
-        });
-        processed.put(obj);
-      }
+      case "Popup":
+        return new PopupAnnotation(parameters);
 
-      obj = outlineDict.getRaw("Next");
+      case "FreeText":
+        return new FreeTextAnnotation(parameters);
 
-      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
-        queue.push({
-          obj,
-          parent: i.parent
-        });
-        processed.put(obj);
-      }
-    }
+      case "Line":
+        return new LineAnnotation(parameters);
 
-    return root.items.length > 0 ? root.items : null;
-  }
+      case "Square":
+        return new SquareAnnotation(parameters);
 
-  get permissions() {
-    let permissions = null;
+      case "Circle":
+        return new CircleAnnotation(parameters);
 
-    try {
-      permissions = this._readPermissions();
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+      case "PolyLine":
+        return new PolylineAnnotation(parameters);
 
-      (0, _util.warn)("Unable to read permissions.");
-    }
+      case "Polygon":
+        return new PolygonAnnotation(parameters);
 
-    return (0, _util.shadow)(this, "permissions", permissions);
-  }
+      case "Caret":
+        return new CaretAnnotation(parameters);
 
-  _readPermissions() {
-    const encrypt = this.xref.trailer.get("Encrypt");
+      case "Ink":
+        return new InkAnnotation(parameters);
 
-    if (!(0, _primitives.isDict)(encrypt)) {
-      return null;
-    }
+      case "Highlight":
+        return new HighlightAnnotation(parameters);
 
-    let flags = encrypt.get("P");
+      case "Underline":
+        return new UnderlineAnnotation(parameters);
 
-    if (!(0, _util.isNum)(flags)) {
-      return null;
-    }
+      case "Squiggly":
+        return new SquigglyAnnotation(parameters);
 
-    flags += 2 ** 32;
-    const permissions = [];
+      case "StrikeOut":
+        return new StrikeOutAnnotation(parameters);
 
-    for (const key in _util.PermissionFlag) {
-      const value = _util.PermissionFlag[key];
+      case "Stamp":
+        return new StampAnnotation(parameters);
 
-      if (flags & value) {
-        permissions.push(value);
-      }
-    }
+      case "FileAttachment":
+        return new FileAttachmentAnnotation(parameters);
 
-    return permissions;
-  }
+      default:
+        if (!collectFields) {
+          if (!subtype) {
+            (0, _util.warn)("Annotation is missing the required /Subtype.");
+          } else {
+            (0, _util.warn)(`Unimplemented annotation type "${subtype}", ` + "falling back to base 
annotation.");
+          }
+        }
 
-  get optionalContentConfig() {
-    let config = null;
+        return new Annotation(parameters);
+    }
+  }
 
+  static async _getPageIndex(xref, ref, pdfManager) {
     try {
-      const properties = this._catDict.get("OCProperties");
+      const annotDict = await xref.fetchIfRefAsync(ref);
 
-      if (!properties) {
-        return (0, _util.shadow)(this, "optionalContentConfig", null);
+      if (!(0, _primitives.isDict)(annotDict)) {
+        return -1;
       }
 
-      const defaultConfig = properties.get("D");
+      const pageRef = annotDict.getRaw("P");
 
-      if (!defaultConfig) {
-        return (0, _util.shadow)(this, "optionalContentConfig", null);
+      if (!(0, _primitives.isRef)(pageRef)) {
+        return -1;
       }
 
-      const groupsData = properties.get("OCGs");
+      const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]);
+      return pageIndex;
+    } catch (ex) {
+      (0, _util.warn)(`_getPageIndex: "${ex}".`);
+      return -1;
+    }
+  }
 
-      if (!Array.isArray(groupsData)) {
-        return (0, _util.shadow)(this, "optionalContentConfig", null);
-      }
+}
 
-      const groups = [];
-      const groupRefs = [];
+exports.AnnotationFactory = AnnotationFactory;
 
-      for (const groupRef of groupsData) {
-        if (!(0, _primitives.isRef)(groupRef)) {
-          continue;
-        }
+function getRgbColor(color) {
+  const rgbColor = new Uint8ClampedArray(3);
 
-        groupRefs.push(groupRef);
-        const group = this.xref.fetchIfRef(groupRef);
-        groups.push({
-          id: groupRef.toString(),
-          name: (0, _util.isString)(group.get("Name")) ? (0, _util.stringToPDFString)(group.get("Name")) : 
null,
-          intent: (0, _util.isString)(group.get("Intent")) ? (0, 
_util.stringToPDFString)(group.get("Intent")) : null
-        });
-      }
+  if (!Array.isArray(color)) {
+    return rgbColor;
+  }
 
-      config = this._readOptionalContentConfig(defaultConfig, groupRefs);
-      config.groups = groups;
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+  switch (color.length) {
+    case 0:
+      return null;
 
-      (0, _util.warn)(`Unable to read optional content config: ${ex}`);
-    }
+    case 1:
+      _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
 
-    return (0, _util.shadow)(this, "optionalContentConfig", config);
-  }
+      return rgbColor;
 
-  _readOptionalContentConfig(config, contentGroupRefs) {
-    function parseOnOff(refs) {
-      const onParsed = [];
+    case 3:
+      _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
 
-      if (Array.isArray(refs)) {
-        for (const value of refs) {
-          if (!(0, _primitives.isRef)(value)) {
-            continue;
-          }
+      return rgbColor;
 
-          if (contentGroupRefs.includes(value)) {
-            onParsed.push(value.toString());
-          }
-        }
-      }
+    case 4:
+      _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
 
-      return onParsed;
-    }
+      return rgbColor;
 
-    function parseOrder(refs, nestedLevels = 0) {
-      if (!Array.isArray(refs)) {
-        return null;
-      }
+    default:
+      return rgbColor;
+  }
+}
 
-      const order = [];
+function getQuadPoints(dict, rect) {
+  if (!dict.has("QuadPoints")) {
+    return null;
+  }
 
-      for (const value of refs) {
-        if ((0, _primitives.isRef)(value) && contentGroupRefs.includes(value)) {
-          parsedOrderRefs.put(value);
-          order.push(value.toString());
-          continue;
-        }
+  const quadPoints = dict.getArray("QuadPoints");
 
-        const nestedOrder = parseNestedOrder(value, nestedLevels);
+  if (!Array.isArray(quadPoints) || quadPoints.length === 0 || quadPoints.length % 8 > 0) {
+    return null;
+  }
 
-        if (nestedOrder) {
-          order.push(nestedOrder);
-        }
-      }
+  const quadPointsLists = [];
 
-      if (nestedLevels > 0) {
-        return order;
+  for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) {
+    quadPointsLists.push([]);
+
+    for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) {
+      const x = quadPoints[j];
+      const y = quadPoints[j + 1];
+
+      if (rect !== null && (x < rect[0] || x > rect[2] || y < rect[1] || y > rect[3])) {
+        return null;
       }
 
-      const hiddenGroups = [];
+      quadPointsLists[i].push({
+        x,
+        y
+      });
+    }
+  }
 
-      for (const groupRef of contentGroupRefs) {
-        if (parsedOrderRefs.has(groupRef)) {
-          continue;
-        }
+  return quadPointsLists.map(quadPointsList => {
+    const [minX, maxX, minY, maxY] = quadPointsList.reduce(([mX, MX, mY, MY], quadPoint) => [Math.min(mX, 
quadPoint.x), Math.max(MX, quadPoint.x), Math.min(mY, quadPoint.y), Math.max(MY, quadPoint.y)], 
[Number.MAX_VALUE, Number.MIN_VALUE, Number.MAX_VALUE, Number.MIN_VALUE]);
+    return [{
+      x: minX,
+      y: maxY
+    }, {
+      x: maxX,
+      y: maxY
+    }, {
+      x: minX,
+      y: minY
+    }, {
+      x: maxX,
+      y: minY
+    }];
+  });
+}
 
-        hiddenGroups.push(groupRef.toString());
-      }
+function getTransformMatrix(rect, bbox, matrix) {
+  const [minX, minY, maxX, maxY] = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);
 
-      if (hiddenGroups.length) {
-        order.push({
-          name: null,
-          order: hiddenGroups
-        });
-      }
+  if (minX === maxX || minY === maxY) {
+    return [1, 0, 0, 1, rect[0], rect[1]];
+  }
 
-      return order;
-    }
+  const xRatio = (rect[2] - rect[0]) / (maxX - minX);
+  const yRatio = (rect[3] - rect[1]) / (maxY - minY);
+  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
+}
 
-    function parseNestedOrder(ref, nestedLevels) {
-      if (++nestedLevels > MAX_NESTED_LEVELS) {
-        (0, _util.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS.");
-        return null;
-      }
+class Annotation {
+  constructor(params) {
+    const dict = params.dict;
+    this.setContents(dict.get("Contents"));
+    this.setModificationDate(dict.get("M"));
+    this.setFlags(dict.get("F"));
+    this.setRectangle(dict.getArray("Rect"));
+    this.setColor(dict.getArray("C"));
+    this.setBorderStyle(dict);
+    this.setAppearance(dict);
+    this._streams = [];
 
-      const value = xref.fetchIfRef(ref);
+    if (this.appearance) {
+      this._streams.push(this.appearance);
+    }
 
-      if (!Array.isArray(value)) {
-        return null;
-      }
+    this.data = {
+      annotationFlags: this.flags,
+      borderStyle: this.borderStyle,
+      color: this.color,
+      contents: this.contents,
+      hasAppearance: !!this.appearance,
+      id: params.id,
+      modificationDate: this.modificationDate,
+      rect: this.rectangle,
+      subtype: params.subtype
+    };
 
-      const nestedName = xref.fetchIfRef(value[0]);
+    if (params.collectFields) {
+      const kids = dict.get("Kids");
 
-      if (typeof nestedName !== "string") {
-        return null;
-      }
+      if (Array.isArray(kids)) {
+        const kidIds = [];
 
-      const nestedOrder = parseOrder(value.slice(1), nestedLevels);
+        for (const kid of kids) {
+          if ((0, _primitives.isRef)(kid)) {
+            kidIds.push(kid.toString());
+          }
+        }
 
-      if (!nestedOrder || !nestedOrder.length) {
-        return null;
+        if (kidIds.length !== 0) {
+          this.data.kidIds = kidIds;
+        }
       }
 
-      return {
-        name: (0, _util.stringToPDFString)(nestedName),
-        order: nestedOrder
-      };
+      this.data.actions = (0, _core_utils.collectActions)(params.xref, dict, 
_util.AnnotationActionEventType);
+      this.data.fieldName = this._constructFieldName(dict);
+      this.data.pageIndex = params.pageIndex;
     }
 
-    const xref = this.xref,
-          parsedOrderRefs = new _primitives.RefSet(),
-          MAX_NESTED_LEVELS = 10;
-    return {
-      name: (0, _util.isString)(config.get("Name")) ? (0, _util.stringToPDFString)(config.get("Name")) : 
null,
-      creator: (0, _util.isString)(config.get("Creator")) ? (0, 
_util.stringToPDFString)(config.get("Creator")) : null,
-      baseState: (0, _primitives.isName)(config.get("BaseState")) ? config.get("BaseState").name : null,
-      on: parseOnOff(config.get("ON")),
-      off: parseOnOff(config.get("OFF")),
-      order: parseOrder(config.get("Order")),
-      groups: null
-    };
+    this._fallbackFontDict = null;
   }
 
-  get numPages() {
-    const obj = this.toplevelPagesDict.get("Count");
+  _hasFlag(flags, flag) {
+    return !!(flags & flag);
+  }
 
-    if (!Number.isInteger(obj)) {
-      throw new _util.FormatError("Page count in top-level pages dictionary is not an integer.");
-    }
+  _isViewable(flags) {
+    return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, 
_util.AnnotationFlag.NOVIEW);
+  }
 
-    return (0, _util.shadow)(this, "numPages", obj);
+  _isPrintable(flags) {
+    return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, 
_util.AnnotationFlag.INVISIBLE);
   }
 
-  get destinations() {
-    const obj = this._readDests(),
-          dests = Object.create(null);
+  mustBeViewed(annotationStorage) {
+    const storageEntry = annotationStorage && annotationStorage.get(this.data.id);
 
-    if (obj instanceof NameTree) {
-      const names = obj.getAll();
+    if (storageEntry && storageEntry.hidden !== undefined) {
+      return !storageEntry.hidden;
+    }
 
-      for (const name in names) {
-        dests[name] = fetchDestination(names[name]);
-      }
-    } else if (obj instanceof _primitives.Dict) {
-      obj.forEach(function (key, value) {
-        if (value) {
-          dests[key] = fetchDestination(value);
-        }
-      });
+    return this.viewable && !this._hasFlag(this.flags, _util.AnnotationFlag.HIDDEN);
+  }
+
+  mustBePrinted(annotationStorage) {
+    const storageEntry = annotationStorage && annotationStorage.get(this.data.id);
+
+    if (storageEntry && storageEntry.print !== undefined) {
+      return storageEntry.print;
     }
 
-    return (0, _util.shadow)(this, "destinations", dests);
+    return this.printable;
   }
 
-  getDestination(destinationId) {
-    const obj = this._readDests();
+  get viewable() {
+    if (this.data.quadPoints === null) {
+      return false;
+    }
 
-    if (obj instanceof NameTree || obj instanceof _primitives.Dict) {
-      return fetchDestination(obj.get(destinationId) || null);
+    if (this.flags === 0) {
+      return true;
     }
 
-    return null;
+    return this._isViewable(this.flags);
   }
 
-  _readDests() {
-    const obj = this._catDict.get("Names");
+  get printable() {
+    if (this.data.quadPoints === null) {
+      return false;
+    }
 
-    if (obj && obj.has("Dests")) {
-      return new NameTree(obj.getRaw("Dests"), this.xref);
-    } else if (this._catDict.has("Dests")) {
-      return this._catDict.get("Dests");
+    if (this.flags === 0) {
+      return false;
     }
 
-    return undefined;
+    return this._isPrintable(this.flags);
   }
 
-  get pageLabels() {
-    let obj = null;
+  setContents(contents) {
+    this.contents = (0, _util.stringToPDFString)(contents || "");
+  }
 
-    try {
-      obj = this._readPageLabels();
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+  setModificationDate(modificationDate) {
+    this.modificationDate = (0, _util.isString)(modificationDate) ? modificationDate : null;
+  }
 
-      (0, _util.warn)("Unable to read page labels.");
+  setFlags(flags) {
+    this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
+  }
+
+  hasFlag(flag) {
+    return this._hasFlag(this.flags, flag);
+  }
+
+  setRectangle(rectangle) {
+    if (Array.isArray(rectangle) && rectangle.length === 4) {
+      this.rectangle = _util.Util.normalizeRect(rectangle);
+    } else {
+      this.rectangle = [0, 0, 0, 0];
     }
+  }
 
-    return (0, _util.shadow)(this, "pageLabels", obj);
+  setColor(color) {
+    this.color = getRgbColor(color);
   }
 
-  _readPageLabels() {
-    const obj = this._catDict.getRaw("PageLabels");
+  setBorderStyle(borderStyle) {
+    this.borderStyle = new AnnotationBorderStyle();
 
-    if (!obj) {
-      return null;
+    if (!(0, _primitives.isDict)(borderStyle)) {
+      return;
     }
 
-    const pageLabels = new Array(this.numPages);
-    let style = null,
-        prefix = "";
-    const numberTree = new NumberTree(obj, this.xref);
-    const nums = numberTree.getAll();
-    let currentLabel = "",
-        currentIndex = 1;
+    if (borderStyle.has("BS")) {
+      const dict = borderStyle.get("BS");
+      const dictType = dict.get("Type");
 
-    for (let i = 0, ii = this.numPages; i < ii; i++) {
-      if (i in nums) {
-        const labelDict = nums[i];
+      if (!dictType || (0, _primitives.isName)(dictType, "Border")) {
+        this.borderStyle.setWidth(dict.get("W"), this.rectangle);
+        this.borderStyle.setStyle(dict.get("S"));
+        this.borderStyle.setDashArray(dict.getArray("D"));
+      }
+    } else if (borderStyle.has("Border")) {
+      const array = borderStyle.getArray("Border");
 
-        if (!(0, _primitives.isDict)(labelDict)) {
-          throw new _util.FormatError("PageLabel is not a dictionary.");
-        }
+      if (Array.isArray(array) && array.length >= 3) {
+        this.borderStyle.setHorizontalCornerRadius(array[0]);
+        this.borderStyle.setVerticalCornerRadius(array[1]);
+        this.borderStyle.setWidth(array[2], this.rectangle);
 
-        if (labelDict.has("Type") && !(0, _primitives.isName)(labelDict.get("Type"), "PageLabel")) {
-          throw new _util.FormatError("Invalid type in PageLabel dictionary.");
+        if (array.length === 4) {
+          this.borderStyle.setDashArray(array[3]);
         }
+      }
+    } else {
+      this.borderStyle.setWidth(0);
+    }
+  }
 
-        if (labelDict.has("S")) {
-          const s = labelDict.get("S");
+  setAppearance(dict) {
+    this.appearance = null;
+    const appearanceStates = dict.get("AP");
 
-          if (!(0, _primitives.isName)(s)) {
-            throw new _util.FormatError("Invalid style in PageLabel dictionary.");
-          }
+    if (!(0, _primitives.isDict)(appearanceStates)) {
+      return;
+    }
 
-          style = s.name;
-        } else {
-          style = null;
-        }
+    const normalAppearanceState = appearanceStates.get("N");
 
-        if (labelDict.has("P")) {
-          const p = labelDict.get("P");
+    if ((0, _primitives.isStream)(normalAppearanceState)) {
+      this.appearance = normalAppearanceState;
+      return;
+    }
 
-          if (!(0, _util.isString)(p)) {
-            throw new _util.FormatError("Invalid prefix in PageLabel dictionary.");
-          }
+    if (!(0, _primitives.isDict)(normalAppearanceState)) {
+      return;
+    }
 
-          prefix = (0, _util.stringToPDFString)(p);
-        } else {
-          prefix = "";
-        }
+    const as = dict.get("AS");
 
-        if (labelDict.has("St")) {
-          const st = labelDict.get("St");
+    if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {
+      return;
+    }
 
-          if (!(Number.isInteger(st) && st >= 1)) {
-            throw new _util.FormatError("Invalid start in PageLabel dictionary.");
-          }
+    this.appearance = normalAppearanceState.get(as.name);
+  }
 
-          currentIndex = st;
-        } else {
-          currentIndex = 1;
-        }
+  loadResources(keys) {
+    return this.appearance.dict.getAsync("Resources").then(resources => {
+      if (!resources) {
+        return undefined;
       }
 
-      switch (style) {
-        case "D":
-          currentLabel = currentIndex;
-          break;
+      const objectLoader = new _object_loader.ObjectLoader(resources, keys, resources.xref);
+      return objectLoader.load().then(function () {
+        return resources;
+      });
+    });
+  }
 
-        case "R":
-        case "r":
-          currentLabel = (0, _core_utils.toRomanNumerals)(currentIndex, style === "r");
-          break;
+  getOperatorList(evaluator, task, renderForms, annotationStorage) {
+    if (!this.appearance) {
+      return Promise.resolve(new _operator_list.OperatorList());
+    }
 
-        case "A":
-        case "a":
-          const LIMIT = 26;
-          const A_UPPER_CASE = 0x41,
-                A_LOWER_CASE = 0x61;
-          const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE;
-          const letterIndex = currentIndex - 1;
-          const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
-          const charBuf = [];
+    const appearance = this.appearance;
+    const data = this.data;
+    const appearanceDict = appearance.dict;
+    const resourcesPromise = this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", 
"Font"]);
+    const bbox = appearanceDict.getArray("BBox") || [0, 0, 1, 1];
+    const matrix = appearanceDict.getArray("Matrix") || [1, 0, 0, 1, 0, 0];
+    const transform = getTransformMatrix(data.rect, bbox, matrix);
+    return resourcesPromise.then(resources => {
+      const opList = new _operator_list.OperatorList();
+      opList.addOp(_util.OPS.beginAnnotation, [data.id, data.rect, transform, matrix]);
+      return evaluator.getOperatorList({
+        stream: appearance,
+        task,
+        resources,
+        operatorList: opList,
+        fallbackFontDict: this._fallbackFontDict
+      }).then(() => {
+        opList.addOp(_util.OPS.endAnnotation, []);
+        this.reset();
+        return opList;
+      });
+    });
+  }
 
-          for (let j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {
-            charBuf.push(character);
-          }
+  async save(evaluator, task, annotationStorage) {
+    return null;
+  }
 
-          currentLabel = charBuf.join("");
-          break;
+  getFieldObject() {
+    if (this.data.kidIds) {
+      return {
+        id: this.data.id,
+        actions: this.data.actions,
+        name: this.data.fieldName,
+        type: "",
+        kidIds: this.data.kidIds,
+        page: this.data.pageIndex
+      };
+    }
 
-        default:
-          if (style) {
-            throw new _util.FormatError(`Invalid style "${style}" in PageLabel dictionary.`);
-          }
+    return null;
+  }
 
-          currentLabel = "";
-      }
+  reset() {
+    for (const stream of this._streams) {
+      stream.reset();
+    }
+  }
 
-      pageLabels[i] = prefix + currentLabel;
-      currentIndex++;
+  _constructFieldName(dict) {
+    if (!dict.has("T") && !dict.has("Parent")) {
+      (0, _util.warn)("Unknown field name, falling back to empty field name.");
+      return "";
     }
 
-    return pageLabels;
-  }
+    if (!dict.has("Parent")) {
+      return (0, _util.stringToPDFString)(dict.get("T"));
+    }
 
-  get pageLayout() {
-    const obj = this._catDict.get("PageLayout");
+    const fieldName = [];
 
-    let pageLayout = "";
+    if (dict.has("T")) {
+      fieldName.unshift((0, _util.stringToPDFString)(dict.get("T")));
+    }
 
-    if ((0, _primitives.isName)(obj)) {
-      switch (obj.name) {
-        case "SinglePage":
-        case "OneColumn":
-        case "TwoColumnLeft":
-        case "TwoColumnRight":
-        case "TwoPageLeft":
-        case "TwoPageRight":
-          pageLayout = obj.name;
-      }
+    let loopDict = dict;
+    const visited = new _primitives.RefSet();
+
+    if (dict.objId) {
+      visited.put(dict.objId);
     }
 
-    return (0, _util.shadow)(this, "pageLayout", pageLayout);
-  }
+    while (loopDict.has("Parent")) {
+      loopDict = loopDict.get("Parent");
 
-  get pageMode() {
-    const obj = this._catDict.get("PageMode");
+      if (!(loopDict instanceof _primitives.Dict) || loopDict.objId && visited.has(loopDict.objId)) {
+        break;
+      }
 
-    let pageMode = "UseNone";
+      if (loopDict.objId) {
+        visited.put(loopDict.objId);
+      }
 
-    if ((0, _primitives.isName)(obj)) {
-      switch (obj.name) {
-        case "UseNone":
-        case "UseOutlines":
-        case "UseThumbs":
-        case "FullScreen":
-        case "UseOC":
-        case "UseAttachments":
-          pageMode = obj.name;
+      if (loopDict.has("T")) {
+        fieldName.unshift((0, _util.stringToPDFString)(loopDict.get("T")));
       }
     }
 
-    return (0, _util.shadow)(this, "pageMode", pageMode);
+    return fieldName.join(".");
   }
 
-  get viewerPreferences() {
-    const ViewerPreferencesValidators = {
-      HideToolbar: _util.isBool,
-      HideMenubar: _util.isBool,
-      HideWindowUI: _util.isBool,
-      FitWindow: _util.isBool,
-      CenterWindow: _util.isBool,
-      DisplayDocTitle: _util.isBool,
-      NonFullScreenPageMode: _primitives.isName,
-      Direction: _primitives.isName,
-      ViewArea: _primitives.isName,
-      ViewClip: _primitives.isName,
-      PrintArea: _primitives.isName,
-      PrintClip: _primitives.isName,
-      PrintScaling: _primitives.isName,
-      Duplex: _primitives.isName,
-      PickTrayByPDFSize: _util.isBool,
-      PrintPageRange: Array.isArray,
-      NumCopies: Number.isInteger
-    };
+}
 
-    const obj = this._catDict.get("ViewerPreferences");
+exports.Annotation = Annotation;
 
-    let prefs = null;
+class AnnotationBorderStyle {
+  constructor() {
+    this.width = 1;
+    this.style = _util.AnnotationBorderStyleType.SOLID;
+    this.dashArray = [3];
+    this.horizontalCornerRadius = 0;
+    this.verticalCornerRadius = 0;
+  }
 
-    if ((0, _primitives.isDict)(obj)) {
-      for (const key in ViewerPreferencesValidators) {
-        if (!obj.has(key)) {
-          continue;
-        }
+  setWidth(width, rect = [0, 0, 0, 0]) {
+    if ((0, _primitives.isName)(width)) {
+      this.width = 0;
+      return;
+    }
 
-        const value = obj.get(key);
+    if (Number.isInteger(width)) {
+      if (width > 0) {
+        const maxWidth = (rect[2] - rect[0]) / 2;
+        const maxHeight = (rect[3] - rect[1]) / 2;
 
-        if (!ViewerPreferencesValidators[key](value)) {
-          (0, _util.info)(`Bad value in ViewerPreferences for "${key}".`);
-          continue;
+        if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {
+          (0, _util.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);
+          width = 1;
         }
+      }
 
-        let prefValue;
-
-        switch (key) {
-          case "NonFullScreenPageMode":
-            switch (value.name) {
-              case "UseNone":
-              case "UseOutlines":
-              case "UseThumbs":
-              case "UseOC":
-                prefValue = value.name;
-                break;
-
-              default:
-                prefValue = "UseNone";
-            }
-
-            break;
+      this.width = width;
+    }
+  }
 
-          case "Direction":
-            switch (value.name) {
-              case "L2R":
-              case "R2L":
-                prefValue = value.name;
-                break;
+  setStyle(style) {
+    if (!(0, _primitives.isName)(style)) {
+      return;
+    }
 
-              default:
-                prefValue = "L2R";
-            }
+    switch (style.name) {
+      case "S":
+        this.style = _util.AnnotationBorderStyleType.SOLID;
+        break;
 
-            break;
+      case "D":
+        this.style = _util.AnnotationBorderStyleType.DASHED;
+        break;
 
-          case "ViewArea":
-          case "ViewClip":
-          case "PrintArea":
-          case "PrintClip":
-            switch (value.name) {
-              case "MediaBox":
-              case "CropBox":
-              case "BleedBox":
-              case "TrimBox":
-              case "ArtBox":
-                prefValue = value.name;
-                break;
+      case "B":
+        this.style = _util.AnnotationBorderStyleType.BEVELED;
+        break;
 
-              default:
-                prefValue = "CropBox";
-            }
+      case "I":
+        this.style = _util.AnnotationBorderStyleType.INSET;
+        break;
 
-            break;
+      case "U":
+        this.style = _util.AnnotationBorderStyleType.UNDERLINE;
+        break;
 
-          case "PrintScaling":
-            switch (value.name) {
-              case "None":
-              case "AppDefault":
-                prefValue = value.name;
-                break;
+      default:
+        break;
+    }
+  }
 
-              default:
-                prefValue = "AppDefault";
-            }
+  setDashArray(dashArray) {
+    if (Array.isArray(dashArray) && dashArray.length > 0) {
+      let isValid = true;
+      let allZeros = true;
 
-            break;
+      for (const element of dashArray) {
+        const validNumber = +element >= 0;
 
-          case "Duplex":
-            switch (value.name) {
-              case "Simplex":
-              case "DuplexFlipShortEdge":
-              case "DuplexFlipLongEdge":
-                prefValue = value.name;
-                break;
+        if (!validNumber) {
+          isValid = false;
+          break;
+        } else if (element > 0) {
+          allZeros = false;
+        }
+      }
 
-              default:
-                prefValue = "None";
-            }
+      if (isValid && !allZeros) {
+        this.dashArray = dashArray;
+      } else {
+        this.width = 0;
+      }
+    } else if (dashArray) {
+      this.width = 0;
+    }
+  }
 
-            break;
+  setHorizontalCornerRadius(radius) {
+    if (Number.isInteger(radius)) {
+      this.horizontalCornerRadius = radius;
+    }
+  }
 
-          case "PrintPageRange":
-            const length = value.length;
+  setVerticalCornerRadius(radius) {
+    if (Number.isInteger(radius)) {
+      this.verticalCornerRadius = radius;
+    }
+  }
 
-            if (length % 2 !== 0) {
-              break;
-            }
+}
 
-            const isValid = value.every((page, i, arr) => {
-              return Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= 
this.numPages;
-            });
+exports.AnnotationBorderStyle = AnnotationBorderStyle;
 
-            if (isValid) {
-              prefValue = value;
-            }
+class MarkupAnnotation extends Annotation {
+  constructor(parameters) {
+    super(parameters);
+    const dict = parameters.dict;
 
-            break;
+    if (dict.has("IRT")) {
+      const rawIRT = dict.getRaw("IRT");
+      this.data.inReplyTo = (0, _primitives.isRef)(rawIRT) ? rawIRT.toString() : null;
+      const rt = dict.get("RT");
+      this.data.replyType = (0, _primitives.isName)(rt) ? rt.name : _util.AnnotationReplyType.REPLY;
+    }
 
-          case "NumCopies":
-            if (value > 0) {
-              prefValue = value;
-            }
+    if (this.data.replyType === _util.AnnotationReplyType.GROUP) {
+      const parent = dict.get("IRT");
+      this.data.title = (0, _util.stringToPDFString)(parent.get("T") || "");
+      this.setContents(parent.get("Contents"));
+      this.data.contents = this.contents;
 
-            break;
+      if (!parent.has("CreationDate")) {
+        this.data.creationDate = null;
+      } else {
+        this.setCreationDate(parent.get("CreationDate"));
+        this.data.creationDate = this.creationDate;
+      }
 
-          default:
-            if (typeof value !== "boolean") {
-              throw new _util.FormatError(`viewerPreferences - expected a boolean value for: ${key}`);
-            }
+      if (!parent.has("M")) {
+        this.data.modificationDate = null;
+      } else {
+        this.setModificationDate(parent.get("M"));
+        this.data.modificationDate = this.modificationDate;
+      }
 
-            prefValue = value;
-        }
+      this.data.hasPopup = parent.has("Popup");
 
-        if (prefValue !== undefined) {
-          if (!prefs) {
-            prefs = Object.create(null);
-          }
+      if (!parent.has("C")) {
+        this.data.color = null;
+      } else {
+        this.setColor(parent.getArray("C"));
+        this.data.color = this.color;
+      }
+    } else {
+      this.data.title = (0, _util.stringToPDFString)(dict.get("T") || "");
+      this.setCreationDate(dict.get("CreationDate"));
+      this.data.creationDate = this.creationDate;
+      this.data.hasPopup = dict.has("Popup");
 
-          prefs[key] = prefValue;
-        } else {
-          (0, _util.info)(`Bad value in ViewerPreferences for "${key}".`);
-        }
+      if (!dict.has("C")) {
+        this.data.color = null;
       }
     }
-
-    return (0, _util.shadow)(this, "viewerPreferences", prefs);
   }
 
-  get openAction() {
-    const obj = this._catDict.get("OpenAction");
-
-    let openAction = null;
-
-    if ((0, _primitives.isDict)(obj)) {
-      const destDict = new _primitives.Dict(this.xref);
-      destDict.set("A", obj);
-      const resultObj = {
-        url: null,
-        dest: null,
-        action: null
-      };
-      Catalog.parseDestDictionary({
-        destDict,
-        resultObj
-      });
+  setCreationDate(creationDate) {
+    this.creationDate = (0, _util.isString)(creationDate) ? creationDate : null;
+  }
 
-      if (Array.isArray(resultObj.dest)) {
-        if (!openAction) {
-          openAction = Object.create(null);
-        }
+  _setDefaultAppearance({
+    xref,
+    extra,
+    strokeColor,
+    fillColor,
+    blendMode,
+    strokeAlpha,
+    fillAlpha,
+    pointsCallback
+  }) {
+    let minX = Number.MAX_VALUE;
+    let minY = Number.MAX_VALUE;
+    let maxX = Number.MIN_VALUE;
+    let maxY = Number.MIN_VALUE;
+    const buffer = ["q"];
 
-        openAction.dest = resultObj.dest;
-      } else if (resultObj.action) {
-        if (!openAction) {
-          openAction = Object.create(null);
-        }
+    if (extra) {
+      buffer.push(extra);
+    }
 
-        openAction.action = resultObj.action;
-      }
-    } else if (Array.isArray(obj)) {
-      if (!openAction) {
-        openAction = Object.create(null);
-      }
+    if (strokeColor) {
+      buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`);
+    }
 
-      openAction.dest = obj;
+    if (fillColor) {
+      buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`);
     }
 
-    return (0, _util.shadow)(this, "openAction", openAction);
-  }
+    let pointsArray = this.data.quadPoints;
 
-  get attachments() {
-    const obj = this._catDict.get("Names");
+    if (!pointsArray) {
+      pointsArray = [[{
+        x: this.rectangle[0],
+        y: this.rectangle[3]
+      }, {
+        x: this.rectangle[2],
+        y: this.rectangle[3]
+      }, {
+        x: this.rectangle[0],
+        y: this.rectangle[1]
+      }, {
+        x: this.rectangle[2],
+        y: this.rectangle[1]
+      }]];
+    }
 
-    let attachments = null;
+    for (const points of pointsArray) {
+      const [mX, MX, mY, MY] = pointsCallback(buffer, points);
+      minX = Math.min(minX, mX);
+      maxX = Math.max(maxX, MX);
+      minY = Math.min(minY, mY);
+      maxY = Math.max(maxY, MY);
+    }
 
-    if (obj && obj.has("EmbeddedFiles")) {
-      const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
-      const names = nameTree.getAll();
+    buffer.push("Q");
+    const formDict = new _primitives.Dict(xref);
+    const appearanceStreamDict = new _primitives.Dict(xref);
+    appearanceStreamDict.set("Subtype", _primitives.Name.get("Form"));
+    const appearanceStream = new _stream.StringStream(buffer.join(" "));
+    appearanceStream.dict = appearanceStreamDict;
+    formDict.set("Fm0", appearanceStream);
+    const gsDict = new _primitives.Dict(xref);
 
-      for (const name in names) {
-        const fs = new FileSpec(names[name], this.xref);
+    if (blendMode) {
+      gsDict.set("BM", _primitives.Name.get(blendMode));
+    }
 
-        if (!attachments) {
-          attachments = Object.create(null);
-        }
+    if (typeof strokeAlpha === "number") {
+      gsDict.set("CA", strokeAlpha);
+    }
 
-        attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;
-      }
+    if (typeof fillAlpha === "number") {
+      gsDict.set("ca", fillAlpha);
     }
 
-    return (0, _util.shadow)(this, "attachments", attachments);
-  }
+    const stateDict = new _primitives.Dict(xref);
+    stateDict.set("GS0", gsDict);
+    const resources = new _primitives.Dict(xref);
+    resources.set("ExtGState", stateDict);
+    resources.set("XObject", formDict);
+    const appearanceDict = new _primitives.Dict(xref);
+    appearanceDict.set("Resources", resources);
+    const bbox = this.data.rect = [minX, minY, maxX, maxY];
+    appearanceDict.set("BBox", bbox);
+    this.appearance = new _stream.StringStream("/GS0 gs /Fm0 Do");
+    this.appearance.dict = appearanceDict;
 
-  get javaScript() {
-    const obj = this._catDict.get("Names");
+    this._streams.push(this.appearance, appearanceStream);
+  }
 
-    let javaScript = null;
+}
 
-    function appendIfJavaScriptDict(jsDict) {
-      const type = jsDict.get("S");
+exports.MarkupAnnotation = MarkupAnnotation;
 
-      if (!(0, _primitives.isName)(type, "JavaScript")) {
-        return;
-      }
+class WidgetAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    const dict = params.dict;
+    const data = this.data;
+    this.ref = params.ref;
+    data.annotationType = _util.AnnotationType.WIDGET;
 
-      let js = jsDict.get("JS");
+    if (data.fieldName === undefined) {
+      data.fieldName = this._constructFieldName(dict);
+    }
 
-      if ((0, _primitives.isStream)(js)) {
-        js = (0, _util.bytesToString)(js.getBytes());
-      } else if (!(0, _util.isString)(js)) {
-        return;
-      }
+    if (data.actions === undefined) {
+      data.actions = (0, _core_utils.collectActions)(params.xref, dict, _util.AnnotationActionEventType);
+    }
 
-      if (!javaScript) {
-        javaScript = [];
-      }
+    const fieldValue = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "V",
+      getArray: true
+    });
+    data.fieldValue = this._decodeFormValue(fieldValue);
+    const defaultFieldValue = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "DV",
+      getArray: true
+    });
+    data.defaultFieldValue = this._decodeFormValue(defaultFieldValue);
+    data.alternativeText = (0, _util.stringToPDFString)(dict.get("TU") || "");
+    const defaultAppearance = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "DA"
+    }) || params.acroForm.get("DA");
+    this._defaultAppearance = (0, _util.isString)(defaultAppearance) ? defaultAppearance : "";
+    data.defaultAppearanceData = (0, _default_appearance.parseDefaultAppearance)(this._defaultAppearance);
+    const fieldType = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "FT"
+    });
+    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
+    const localResources = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "DR"
+    });
+    const acroFormResources = params.acroForm.get("DR");
+    const appearanceResources = this.appearance && this.appearance.dict.get("Resources");
+    this._fieldResources = {
+      localResources,
+      acroFormResources,
+      appearanceResources,
+      mergedResources: _primitives.Dict.merge({
+        xref: params.xref,
+        dictArray: [localResources, appearanceResources, acroFormResources],
+        mergeSubDicts: true
+      })
+    };
+    data.fieldFlags = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "Ff"
+    });
 
-      javaScript.push((0, _util.stringToPDFString)(js));
+    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
+      data.fieldFlags = 0;
     }
 
-    if (obj && obj.has("JavaScript")) {
-      const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref);
-      const names = nameTree.getAll();
-
-      for (const name in names) {
-        const jsDict = names[name];
+    data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);
+    data.hidden = this._hasFlag(data.annotationFlags, _util.AnnotationFlag.HIDDEN);
+  }
 
-        if ((0, _primitives.isDict)(jsDict)) {
-          appendIfJavaScriptDict(jsDict);
-        }
-      }
+  _decodeFormValue(formValue) {
+    if (Array.isArray(formValue)) {
+      return formValue.filter(item => (0, _util.isString)(item)).map(item => (0, 
_util.stringToPDFString)(item));
+    } else if ((0, _primitives.isName)(formValue)) {
+      return (0, _util.stringToPDFString)(formValue.name);
+    } else if ((0, _util.isString)(formValue)) {
+      return (0, _util.stringToPDFString)(formValue);
     }
 
-    const openAction = this._catDict.get("OpenAction");
+    return null;
+  }
+
+  hasFieldFlag(flag) {
+    return !!(this.data.fieldFlags & flag);
+  }
 
-    if ((0, _primitives.isDict)(openAction) && (0, _primitives.isName)(openAction.get("S"), "JavaScript")) {
-      appendIfJavaScriptDict(openAction);
+  getOperatorList(evaluator, task, renderForms, annotationStorage) {
+    if (renderForms && !(this instanceof SignatureWidgetAnnotation)) {
+      return Promise.resolve(new _operator_list.OperatorList());
     }
 
-    return (0, _util.shadow)(this, "javaScript", javaScript);
-  }
+    if (!this._hasText) {
+      return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
+    }
 
-  fontFallback(id, handler) {
-    const promises = [];
-    this.fontCache.forEach(function (promise) {
-      promises.push(promise);
-    });
-    return Promise.all(promises).then(translatedFonts => {
-      for (const translatedFont of translatedFonts) {
-        if (translatedFont.loadedName === id) {
-          translatedFont.fallback(handler);
-          return;
-        }
+    return this._getAppearance(evaluator, task, annotationStorage).then(content => {
+      if (this.appearance && content === null) {
+        return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
       }
-    });
-  }
 
-  cleanup(manuallyTriggered = false) {
-    (0, _primitives.clearPrimitiveCaches)();
-    this.globalImageCache.clear(manuallyTriggered);
-    this.pageKidsCountCache.clear();
-    const promises = [];
-    this.fontCache.forEach(function (promise) {
-      promises.push(promise);
-    });
-    return Promise.all(promises).then(translatedFonts => {
-      for (const {
-        dict
-      } of translatedFonts) {
-        delete dict.translated;
+      const operatorList = new _operator_list.OperatorList();
+
+      if (!this._defaultAppearance || content === null) {
+        return operatorList;
       }
 
-      this.fontCache.clear();
-      this.builtInCMapCache.clear();
+      const matrix = [1, 0, 0, 1, 0, 0];
+      const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];
+      const transform = getTransformMatrix(this.data.rect, bbox, matrix);
+      operatorList.addOp(_util.OPS.beginAnnotation, [this.data.id, this.data.rect, transform, matrix]);
+      const stream = new _stream.StringStream(content);
+      return evaluator.getOperatorList({
+        stream,
+        task,
+        resources: this._fieldResources.mergedResources,
+        operatorList
+      }).then(function () {
+        operatorList.addOp(_util.OPS.endAnnotation, []);
+        return operatorList;
+      });
     });
   }
 
-  getPageDict(pageIndex) {
-    const capability = (0, _util.createPromiseCapability)();
-    const nodesToVisit = [this._catDict.getRaw("Pages")];
-    const visitedNodes = new _primitives.RefSet();
-    const xref = this.xref,
-          pageKidsCountCache = this.pageKidsCountCache;
-    let count,
-        currentPageIndex = 0;
+  async save(evaluator, task, annotationStorage) {
+    if (!annotationStorage) {
+      return null;
+    }
 
-    function next() {
-      while (nodesToVisit.length) {
-        const currentNode = nodesToVisit.pop();
+    const storageEntry = annotationStorage.get(this.data.id);
+    const value = storageEntry && storageEntry.value;
 
-        if ((0, _primitives.isRef)(currentNode)) {
-          count = pageKidsCountCache.get(currentNode);
+    if (value === this.data.fieldValue || value === undefined) {
+      return null;
+    }
 
-          if (count > 0 && currentPageIndex + count < pageIndex) {
-            currentPageIndex += count;
-            continue;
-          }
+    let appearance = await this._getAppearance(evaluator, task, annotationStorage);
 
-          if (visitedNodes.has(currentNode)) {
-            capability.reject(new _util.FormatError("Pages tree contains circular reference."));
-            return;
-          }
+    if (appearance === null) {
+      return null;
+    }
 
-          visitedNodes.put(currentNode);
-          xref.fetchAsync(currentNode).then(function (obj) {
-            if ((0, _primitives.isDict)(obj, "Page") || (0, _primitives.isDict)(obj) && !obj.has("Kids")) {
-              if (pageIndex === currentPageIndex) {
-                if (currentNode && !pageKidsCountCache.has(currentNode)) {
-                  pageKidsCountCache.put(currentNode, 1);
-                }
+    const {
+      xref
+    } = evaluator;
+    const dict = xref.fetchIfRef(this.ref);
 
-                capability.resolve([obj, currentNode]);
-              } else {
-                currentPageIndex++;
-                next();
-              }
+    if (!(0, _primitives.isDict)(dict)) {
+      return null;
+    }
 
-              return;
-            }
+    const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];
+    const xfa = {
+      path: (0, _util.stringToPDFString)(dict.get("T") || ""),
+      value
+    };
+    const newRef = xref.getNewRef();
+    const AP = new _primitives.Dict(xref);
+    AP.set("N", newRef);
+    const encrypt = xref.encrypt;
+    let originalTransform = null;
+    let newTransform = null;
 
-            nodesToVisit.push(obj);
-            next();
-          }, capability.reject);
-          return;
-        }
+    if (encrypt) {
+      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
+      newTransform = encrypt.createCipherTransform(newRef.num, newRef.gen);
+      appearance = newTransform.encryptString(appearance);
+    }
 
-        if (!(0, _primitives.isDict)(currentNode)) {
-          capability.reject(new _util.FormatError("Page dictionary kid reference points to wrong type of 
object."));
-          return;
-        }
+    dict.set("V", (0, _util.isAscii)(value) ? value : (0, _util.stringToUTF16BEString)(value));
+    dict.set("AP", AP);
+    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
+    const appearanceDict = new _primitives.Dict(xref);
+    appearanceDict.set("Length", appearance.length);
+    appearanceDict.set("Subtype", _primitives.Name.get("Form"));
+    appearanceDict.set("Resources", this._getSaveFieldResources(xref));
+    appearanceDict.set("BBox", bbox);
+    const bufferOriginal = [`${this.ref.num} ${this.ref.gen} obj\n`];
+    (0, _writer.writeDict)(dict, bufferOriginal, originalTransform);
+    bufferOriginal.push("\nendobj\n");
+    const bufferNew = [`${newRef.num} ${newRef.gen} obj\n`];
+    (0, _writer.writeDict)(appearanceDict, bufferNew, newTransform);
+    bufferNew.push(" stream\n", appearance, "\nendstream\nendobj\n");
+    return [{
+      ref: this.ref,
+      data: bufferOriginal.join(""),
+      xfa
+    }, {
+      ref: newRef,
+      data: bufferNew.join(""),
+      xfa: null
+    }];
+  }
 
-        count = currentNode.get("Count");
+  async _getAppearance(evaluator, task, annotationStorage) {
+    const isPassword = this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD);
 
-        if (Number.isInteger(count) && count >= 0) {
-          const objId = currentNode.objId;
+    if (!annotationStorage || isPassword) {
+      return null;
+    }
 
-          if (objId && !pageKidsCountCache.has(objId)) {
-            pageKidsCountCache.put(objId, count);
-          }
+    const storageEntry = annotationStorage.get(this.data.id);
+    let value = storageEntry && storageEntry.value;
 
-          if (currentPageIndex + count <= pageIndex) {
-            currentPageIndex += count;
-            continue;
-          }
-        }
+    if (value === undefined) {
+      return null;
+    }
 
-        const kids = currentNode.get("Kids");
+    value = value.trim();
 
-        if (!Array.isArray(kids)) {
-          if ((0, _primitives.isName)(currentNode.get("Type"), "Page") || !currentNode.has("Type") && 
currentNode.has("Contents")) {
-            if (currentPageIndex === pageIndex) {
-              capability.resolve([currentNode, null]);
-              return;
-            }
+    if (value === "") {
+      return "";
+    }
 
-            currentPageIndex++;
-            continue;
-          }
+    let lineCount = -1;
 
-          capability.reject(new _util.FormatError("Page dictionary kids object is not an array."));
-          return;
-        }
+    if (this.data.multiLine) {
+      lineCount = value.split(/\r\n|\r|\n/).length;
+    }
 
-        for (let last = kids.length - 1; last >= 0; last--) {
-          nodesToVisit.push(kids[last]);
-        }
-      }
+    const defaultPadding = 2;
+    const hPadding = defaultPadding;
+    const totalHeight = this.data.rect[3] - this.data.rect[1];
+    const totalWidth = this.data.rect[2] - this.data.rect[0];
 
-      capability.reject(new Error(`Page index ${pageIndex} not found.`));
+    if (!this._defaultAppearance) {
+      this.data.defaultAppearanceData = (0, 
_default_appearance.parseDefaultAppearance)(this._defaultAppearance = "/Helvetica 0 Tf 0 g");
     }
 
-    next();
-    return capability.promise;
-  }
+    const [defaultAppearance, fontSize] = this._computeFontSize(totalHeight, lineCount);
 
-  getPageIndex(pageRef) {
-    const xref = this.xref;
+    const font = await this._getFontData(evaluator, task);
+    let descent = font.descent;
 
-    function pagesBeforeRef(kidRef) {
-      let total = 0,
-          parentRef;
-      return xref.fetchAsync(kidRef).then(function (node) {
-        if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, "Page") && !((0, 
_primitives.isDict)(node) && !node.has("Type") && node.has("Contents"))) {
-          throw new _util.FormatError("The reference does not point to a /Page dictionary.");
-        }
-
-        if (!node) {
-          return null;
-        }
+    if (isNaN(descent)) {
+      descent = 0;
+    }
 
-        if (!(0, _primitives.isDict)(node)) {
-          throw new _util.FormatError("Node must be a dictionary.");
-        }
+    const vPadding = defaultPadding + Math.abs(descent) * fontSize;
+    const alignment = this.data.textAlignment;
 
-        parentRef = node.getRaw("Parent");
-        return node.getAsync("Parent");
-      }).then(function (parent) {
-        if (!parent) {
-          return null;
-        }
+    if (this.data.multiLine) {
+      return this._getMultilineAppearance(defaultAppearance, value, font, fontSize, totalWidth, totalHeight, 
alignment, hPadding, vPadding);
+    }
 
-        if (!(0, _primitives.isDict)(parent)) {
-          throw new _util.FormatError("Parent must be a dictionary.");
-        }
+    const encodedString = font.encodeString(value).join("");
 
-        return parent.getAsync("Kids");
-      }).then(function (kids) {
-        if (!kids) {
-          return null;
-        }
+    if (this.data.comb) {
+      return this._getCombAppearance(defaultAppearance, font, encodedString, totalWidth, hPadding, vPadding);
+    }
 
-        const kidPromises = [];
-        let found = false;
+    if (alignment === 0 || alignment > 2) {
+      return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm (${(0, 
_util.escapeString)(encodedString)}) Tj` + " ET Q EMC";
+    }
 
-        for (let i = 0, ii = kids.length; i < ii; i++) {
-          const kid = kids[i];
+    const renderedText = this._renderText(encodedString, font, fontSize, totalWidth, alignment, hPadding, 
vPadding);
 
-          if (!(0, _primitives.isRef)(kid)) {
-            throw new _util.FormatError("Kid must be a reference.");
-          }
+    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC";
+  }
 
-          if ((0, _primitives.isRefsEqual)(kid, kidRef)) {
-            found = true;
-            break;
-          }
+  async _getFontData(evaluator, task) {
+    const operatorList = new _operator_list.OperatorList();
+    const initialState = {
+      font: null,
 
-          kidPromises.push(xref.fetchAsync(kid).then(function (obj) {
-            if (!(0, _primitives.isDict)(obj)) {
-              throw new _util.FormatError("Kid node must be a dictionary.");
-            }
+      clone() {
+        return this;
+      }
 
-            if (obj.has("Count")) {
-              total += obj.get("Count");
-            } else {
-              total++;
-            }
-          }));
-        }
+    };
+    const {
+      fontName,
+      fontSize
+    } = this.data.defaultAppearanceData;
+    await evaluator.handleSetFont(this._fieldResources.mergedResources, [fontName && 
_primitives.Name.get(fontName), fontSize], null, operatorList, task, initialState, null);
+    return initialState.font;
+  }
 
-        if (!found) {
-          throw new _util.FormatError("Kid reference not found in parent's kids.");
-        }
+  _computeFontSize(height, lineCount) {
+    let {
+      fontSize
+    } = this.data.defaultAppearanceData;
 
-        return Promise.all(kidPromises).then(function () {
-          return [total, parentRef];
-        });
-      });
-    }
+    if (!fontSize) {
+      const roundWithOneDigit = x => Math.round(x * 10) / 10;
 
-    let total = 0;
+      const FONT_FACTOR = 0.8;
 
-    function next(ref) {
-      return pagesBeforeRef(ref).then(function (args) {
-        if (!args) {
-          return total;
-        }
+      if (lineCount === -1) {
+        fontSize = roundWithOneDigit(FONT_FACTOR * height);
+      } else {
+        fontSize = 10;
+        let lineHeight = fontSize / FONT_FACTOR;
+        let numberOfLines = Math.round(height / lineHeight);
+        numberOfLines = Math.max(numberOfLines, lineCount);
+        lineHeight = height / numberOfLines;
+        fontSize = roundWithOneDigit(FONT_FACTOR * lineHeight);
+      }
 
-        const [count, parentRef] = args;
-        total += count;
-        return next(parentRef);
+      const {
+        fontName,
+        fontColor
+      } = this.data.defaultAppearanceData;
+      this._defaultAppearance = (0, _default_appearance.createDefaultAppearance)({
+        fontSize,
+        fontName,
+        fontColor
       });
     }
 
-    return next(pageRef);
+    return [this._defaultAppearance, fontSize];
   }
 
-  static parseDestDictionary(params) {
-    function addDefaultProtocolToUrl(url) {
-      return url.startsWith("www.") ? `http://${url}` : url;
-    }
+  _renderText(text, font, fontSize, totalWidth, alignment, hPadding, vPadding) {
+    const glyphs = font.charsToGlyphs(text);
+    const scale = fontSize / 1000;
+    let width = 0;
 
-    function tryConvertUrlEncoding(url) {
-      try {
-        return (0, _util.stringToUTF8String)(url);
-      } catch (e) {
-        return url;
-      }
+    for (const glyph of glyphs) {
+      width += glyph.width * scale;
     }
 
-    const destDict = params.destDict;
+    let shift;
 
-    if (!(0, _primitives.isDict)(destDict)) {
-      (0, _util.warn)("parseDestDictionary: `destDict` must be a dictionary.");
-      return;
+    if (alignment === 1) {
+      shift = (totalWidth - width) / 2;
+    } else if (alignment === 2) {
+      shift = totalWidth - width - hPadding;
+    } else {
+      shift = hPadding;
     }
 
-    const resultObj = params.resultObj;
-
-    if (typeof resultObj !== "object") {
-      (0, _util.warn)("parseDestDictionary: `resultObj` must be an object.");
-      return;
-    }
+    shift = shift.toFixed(2);
+    vPadding = vPadding.toFixed(2);
+    return `${shift} ${vPadding} Td (${(0, _util.escapeString)(text)}) Tj`;
+  }
 
-    const docBaseUrl = params.docBaseUrl || null;
-    let action = destDict.get("A"),
-        url,
-        dest;
+  _getSaveFieldResources(xref) {
+    const {
+      localResources,
+      appearanceResources,
+      acroFormResources
+    } = this._fieldResources;
+    const fontName = this.data.defaultAppearanceData && this.data.defaultAppearanceData.fontName;
 
-    if (!(0, _primitives.isDict)(action) && destDict.has("Dest")) {
-      action = destDict.get("Dest");
+    if (!fontName) {
+      return localResources || _primitives.Dict.empty;
     }
 
-    if ((0, _primitives.isDict)(action)) {
-      const actionType = action.get("S");
+    for (const resources of [localResources, appearanceResources]) {
+      if (resources instanceof _primitives.Dict) {
+        const localFont = resources.get("Font");
 
-      if (!(0, _primitives.isName)(actionType)) {
-        (0, _util.warn)("parseDestDictionary: Invalid type in Action dictionary.");
-        return;
+        if (localFont instanceof _primitives.Dict && localFont.has(fontName)) {
+          return resources;
+        }
       }
+    }
 
-      const actionName = actionType.name;
+    if (acroFormResources instanceof _primitives.Dict) {
+      const acroFormFont = acroFormResources.get("Font");
 
-      switch (actionName) {
-        case "URI":
-          url = action.get("URI");
+      if (acroFormFont instanceof _primitives.Dict && acroFormFont.has(fontName)) {
+        const subFontDict = new _primitives.Dict(xref);
+        subFontDict.set(fontName, acroFormFont.getRaw(fontName));
+        const subResourcesDict = new _primitives.Dict(xref);
+        subResourcesDict.set("Font", subFontDict);
+        return _primitives.Dict.merge({
+          xref,
+          dictArray: [subResourcesDict, localResources],
+          mergeSubDicts: true
+        });
+      }
+    }
 
-          if ((0, _primitives.isName)(url)) {
-            url = "/" + url.name;
-          } else if ((0, _util.isString)(url)) {
-            url = addDefaultProtocolToUrl(url);
-          }
+    return localResources || _primitives.Dict.empty;
+  }
 
-          break;
+  getFieldObject() {
+    return null;
+  }
 
-        case "GoTo":
-          dest = action.get("D");
-          break;
+}
 
-        case "Launch":
-        case "GoToR":
-          const urlDict = action.get("F");
+class TextWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    this._hasText = true;
+    const dict = params.dict;
 
-          if ((0, _primitives.isDict)(urlDict)) {
-            url = urlDict.get("F") || null;
-          } else if ((0, _util.isString)(urlDict)) {
-            url = urlDict;
-          }
+    if (!(0, _util.isString)(this.data.fieldValue)) {
+      this.data.fieldValue = "";
+    }
 
-          let remoteDest = action.get("D");
+    let alignment = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "Q"
+    });
 
-          if (remoteDest) {
-            if ((0, _primitives.isName)(remoteDest)) {
-              remoteDest = remoteDest.name;
-            }
+    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
+      alignment = null;
+    }
 
-            if ((0, _util.isString)(url)) {
-              const baseUrl = url.split("#")[0];
+    this.data.textAlignment = alignment;
+    let maximumLength = (0, _core_utils.getInheritableProperty)({
+      dict,
+      key: "MaxLen"
+    });
 
-              if ((0, _util.isString)(remoteDest)) {
-                url = baseUrl + "#" + remoteDest;
-              } else if (Array.isArray(remoteDest)) {
-                url = baseUrl + "#" + JSON.stringify(remoteDest);
-              }
-            }
-          }
+    if (!Number.isInteger(maximumLength) || maximumLength < 0) {
+      maximumLength = null;
+    }
 
-          const newWindow = action.get("NewWindow");
+    this.data.maxLen = maximumLength;
+    this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);
+    this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;
+  }
 
-          if ((0, _util.isBool)(newWindow)) {
-            resultObj.newWindow = newWindow;
-          }
+  _getCombAppearance(defaultAppearance, font, text, width, hPadding, vPadding) {
+    const combWidth = (width / this.data.maxLen).toFixed(2);
+    const buf = [];
+    const positions = font.getCharPositions(text);
 
-          break;
+    for (const [start, end] of positions) {
+      buf.push(`(${(0, _util.escapeString)(text.substring(start, end))}) Tj`);
+    }
 
-        case "Named":
-          const namedAction = action.get("N");
+    const renderedComb = buf.join(` ${combWidth} 0 Td `);
+    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm ${renderedComb}` + " 
ET Q EMC";
+  }
 
-          if ((0, _primitives.isName)(namedAction)) {
-            resultObj.action = namedAction.name;
-          }
+  _getMultilineAppearance(defaultAppearance, text, font, fontSize, width, height, alignment, hPadding, 
vPadding) {
+    const lines = text.split(/\r\n|\r|\n/);
+    const buf = [];
+    const totalWidth = width - 2 * hPadding;
 
-          break;
+    for (const line of lines) {
+      const chunks = this._splitLine(line, font, fontSize, totalWidth);
 
-        case "JavaScript":
-          const jsAction = action.get("JS");
-          let js;
+      for (const chunk of chunks) {
+        const padding = buf.length === 0 ? hPadding : 0;
+        buf.push(this._renderText(chunk, font, fontSize, width, alignment, padding, -fontSize));
+      }
+    }
 
-          if ((0, _primitives.isStream)(jsAction)) {
-            js = (0, _util.bytesToString)(jsAction.getBytes());
-          } else if ((0, _util.isString)(jsAction)) {
-            js = jsAction;
-          }
+    const renderedText = buf.join("\n");
+    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 0 ${height} Tm ${renderedText}` + " ET Q EMC";
+  }
 
-          if (js) {
-            const URL_OPEN_METHODS = ["app.launchURL", "window.open"];
-            const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").split(".").join("\\.") + 
")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i");
-            const jsUrl = regex.exec((0, _util.stringToPDFString)(js));
+  _splitLine(line, font, fontSize, width) {
+    line = font.encodeString(line).join("");
+    const glyphs = font.charsToGlyphs(line);
 
-            if (jsUrl && jsUrl[2]) {
-              url = jsUrl[2];
+    if (glyphs.length <= 1) {
+      return [line];
+    }
 
-              if (jsUrl[3] === "true" && jsUrl[1] === "app.launchURL") {
-                resultObj.newWindow = true;
-              }
+    const positions = font.getCharPositions(line);
+    const scale = fontSize / 1000;
+    const chunks = [];
+    let lastSpacePosInStringStart = -1,
+        lastSpacePosInStringEnd = -1,
+        lastSpacePos = -1,
+        startChunk = 0,
+        currentWidth = 0;
 
-              break;
-            }
+    for (let i = 0, ii = glyphs.length; i < ii; i++) {
+      const [start, end] = positions[i];
+      const glyph = glyphs[i];
+      const glyphWidth = glyph.width * scale;
+
+      if (glyph.unicode === " ") {
+        if (currentWidth + glyphWidth > width) {
+          chunks.push(line.substring(startChunk, start));
+          startChunk = start;
+          currentWidth = glyphWidth;
+          lastSpacePosInStringStart = -1;
+          lastSpacePos = -1;
+        } else {
+          currentWidth += glyphWidth;
+          lastSpacePosInStringStart = start;
+          lastSpacePosInStringEnd = end;
+          lastSpacePos = i;
+        }
+      } else {
+        if (currentWidth + glyphWidth > width) {
+          if (lastSpacePosInStringStart !== -1) {
+            chunks.push(line.substring(startChunk, lastSpacePosInStringEnd));
+            startChunk = lastSpacePosInStringEnd;
+            i = lastSpacePos + 1;
+            lastSpacePosInStringStart = -1;
+            currentWidth = 0;
+          } else {
+            chunks.push(line.substring(startChunk, start));
+            startChunk = start;
+            currentWidth = glyphWidth;
           }
-
-        default:
-          (0, _util.warn)(`parseDestDictionary: unsupported action type "${actionName}".`);
-          break;
+        } else {
+          currentWidth += glyphWidth;
+        }
       }
-    } else if (destDict.has("Dest")) {
-      dest = destDict.get("Dest");
     }
 
-    if ((0, _util.isString)(url)) {
-      url = tryConvertUrlEncoding(url);
-      const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);
-
-      if (absoluteUrl) {
-        resultObj.url = absoluteUrl.href;
-      }
-
-      resultObj.unsafeUrl = url;
+    if (startChunk < line.length) {
+      chunks.push(line.substring(startChunk, line.length));
     }
 
-    if (dest) {
-      if ((0, _primitives.isName)(dest)) {
-        dest = dest.name;
-      }
+    return chunks;
+  }
 
-      if ((0, _util.isString)(dest) || Array.isArray(dest)) {
-        resultObj.dest = dest;
-      }
-    }
+  getFieldObject() {
+    return {
+      id: this.data.id,
+      value: this.data.fieldValue,
+      defaultValue: this.data.defaultFieldValue,
+      multiline: this.data.multiLine,
+      password: this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD),
+      charLimit: this.data.maxLen,
+      comb: this.data.comb,
+      editable: !this.data.readOnly,
+      hidden: this.data.hidden,
+      name: this.data.fieldName,
+      rect: this.data.rect,
+      actions: this.data.actions,
+      page: this.data.pageIndex,
+      type: "text"
+    };
   }
 
 }
 
-exports.Catalog = Catalog;
+class ButtonWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    this.checkedAppearance = null;
+    this.uncheckedAppearance = null;
+    this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    this.data.pushButton = this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    this.data.isTooltipOnly = false;
 
-var XRef = function XRefClosure() {
-  function XRef(stream, pdfManager) {
-    this.stream = stream;
-    this.pdfManager = pdfManager;
-    this.entries = [];
-    this.xrefstms = Object.create(null);
-    this._cacheMap = new Map();
-    this.stats = {
-      streamTypes: Object.create(null),
-      fontTypes: Object.create(null)
-    };
-    this._newRefNum = null;
+    if (this.data.checkBox) {
+      this._processCheckBox(params);
+    } else if (this.data.radioButton) {
+      this._processRadioButton(params);
+    } else if (this.data.pushButton) {
+      this._processPushButton(params);
+    } else {
+      (0, _util.warn)("Invalid field flags for button widget annotation");
+    }
   }
 
-  XRef.prototype = {
-    getNewRef: function XRef_getNewRef() {
-      if (this._newRefNum === null) {
-        this._newRefNum = this.entries.length;
-      }
+  getOperatorList(evaluator, task, renderForms, annotationStorage) {
+    if (this.data.pushButton) {
+      return super.getOperatorList(evaluator, task, false, annotationStorage);
+    }
 
-      return _primitives.Ref.get(this._newRefNum++, 0);
-    },
-    resetNewRef: function XRef_resetNewRef() {
-      this._newRefNum = null;
-    },
-    setStartXRef: function XRef_setStartXRef(startXRef) {
-      this.startXRefQueue = [startXRef];
-    },
-    parse: function XRef_parse(recoveryMode) {
-      var trailerDict;
+    if (annotationStorage) {
+      const storageEntry = annotationStorage.get(this.data.id);
+      const value = storageEntry && storageEntry.value;
 
-      if (!recoveryMode) {
-        trailerDict = this.readXRef();
-      } else {
-        (0, _util.warn)("Indexing all PDF objects");
-        trailerDict = this.indexObjects();
+      if (value === undefined) {
+        return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
       }
 
-      trailerDict.assignXref(this);
-      this.trailer = trailerDict;
-      let encrypt;
-
-      try {
-        encrypt = trailerDict.get("Encrypt");
-      } catch (ex) {
-        if (ex instanceof _core_utils.MissingDataException) {
-          throw ex;
-        }
+      let appearance;
 
-        (0, _util.warn)(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`);
+      if (value) {
+        appearance = this.checkedAppearance;
+      } else {
+        appearance = this.uncheckedAppearance;
       }
 
-      if ((0, _primitives.isDict)(encrypt)) {
-        var ids = trailerDict.get("ID");
-        var fileId = ids && ids.length ? ids[0] : "";
-        encrypt.suppressEncryption = true;
-        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
+      if (appearance) {
+        const savedAppearance = this.appearance;
+        this.appearance = appearance;
+        const operatorList = super.getOperatorList(evaluator, task, renderForms, annotationStorage);
+        this.appearance = savedAppearance;
+        return operatorList;
       }
 
-      let root;
+      return Promise.resolve(new _operator_list.OperatorList());
+    }
 
-      try {
-        root = trailerDict.get("Root");
-      } catch (ex) {
-        if (ex instanceof _core_utils.MissingDataException) {
-          throw ex;
-        }
+    return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
+  }
 
-        (0, _util.warn)(`XRef.parse - Invalid "Root" reference: "${ex}".`);
-      }
+  async save(evaluator, task, annotationStorage) {
+    if (this.data.checkBox) {
+      return this._saveCheckbox(evaluator, task, annotationStorage);
+    }
 
-      if ((0, _primitives.isDict)(root) && root.has("Pages")) {
-        this.root = root;
-      } else {
-        if (!recoveryMode) {
-          throw new _core_utils.XRefParseException();
-        }
+    if (this.data.radioButton) {
+      return this._saveRadioButton(evaluator, task, annotationStorage);
+    }
 
-        throw new _util.FormatError("Invalid root reference");
-      }
-    },
-    processXRefTable: function XRef_processXRefTable(parser) {
-      if (!("tableState" in this)) {
-        this.tableState = {
-          entryNum: 0,
-          streamPos: parser.lexer.stream.pos,
-          parserBuf1: parser.buf1,
-          parserBuf2: parser.buf2
-        };
-      }
+    return null;
+  }
 
-      var obj = this.readXRefTable(parser);
+  async _saveCheckbox(evaluator, task, annotationStorage) {
+    if (!annotationStorage) {
+      return null;
+    }
 
-      if (!(0, _primitives.isCmd)(obj, "trailer")) {
-        throw new _util.FormatError("Invalid XRef table: could not find trailer dictionary");
-      }
+    const storageEntry = annotationStorage.get(this.data.id);
+    const value = storageEntry && storageEntry.value;
 
-      var dict = parser.getObj();
+    if (value === undefined) {
+      return null;
+    }
 
-      if (!(0, _primitives.isDict)(dict) && dict.dict) {
-        dict = dict.dict;
-      }
+    const defaultValue = this.data.fieldValue && this.data.fieldValue !== "Off";
 
-      if (!(0, _primitives.isDict)(dict)) {
-        throw new _util.FormatError("Invalid XRef table: could not parse trailer dictionary");
-      }
+    if (defaultValue === value) {
+      return null;
+    }
 
-      delete this.tableState;
-      return dict;
-    },
-    readXRefTable: function XRef_readXRefTable(parser) {
-      var stream = parser.lexer.stream;
-      var tableState = this.tableState;
-      stream.pos = tableState.streamPos;
-      parser.buf1 = tableState.parserBuf1;
-      parser.buf2 = tableState.parserBuf2;
-      var obj;
+    const dict = evaluator.xref.fetchIfRef(this.ref);
 
-      while (true) {
-        if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) {
-          if ((0, _primitives.isCmd)(obj = parser.getObj(), "trailer")) {
-            break;
-          }
+    if (!(0, _primitives.isDict)(dict)) {
+      return null;
+    }
 
-          tableState.firstEntryNum = obj;
-          tableState.entryCount = parser.getObj();
-        }
+    const xfa = {
+      path: (0, _util.stringToPDFString)(dict.get("T") || ""),
+      value: value ? this.data.exportValue : ""
+    };
 
-        var first = tableState.firstEntryNum;
-        var count = tableState.entryCount;
+    const name = _primitives.Name.get(value ? this.data.exportValue : "Off");
 
-        if (!Number.isInteger(first) || !Number.isInteger(count)) {
-          throw new _util.FormatError("Invalid XRef table: wrong types in subsection header");
-        }
+    dict.set("V", name);
+    dict.set("AS", name);
+    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
+    const encrypt = evaluator.xref.encrypt;
+    let originalTransform = null;
 
-        for (var i = tableState.entryNum; i < count; i++) {
-          tableState.streamPos = stream.pos;
-          tableState.entryNum = i;
-          tableState.parserBuf1 = parser.buf1;
-          tableState.parserBuf2 = parser.buf2;
-          var entry = {};
-          entry.offset = parser.getObj();
-          entry.gen = parser.getObj();
-          var type = parser.getObj();
+    if (encrypt) {
+      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
+    }
 
-          if (type instanceof _primitives.Cmd) {
-            switch (type.cmd) {
-              case "f":
-                entry.free = true;
-                break;
+    const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`];
+    (0, _writer.writeDict)(dict, buffer, originalTransform);
+    buffer.push("\nendobj\n");
+    return [{
+      ref: this.ref,
+      data: buffer.join(""),
+      xfa
+    }];
+  }
 
-              case "n":
-                entry.uncompressed = true;
-                break;
-            }
-          }
+  async _saveRadioButton(evaluator, task, annotationStorage) {
+    if (!annotationStorage) {
+      return null;
+    }
 
-          if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || 
entry.uncompressed)) {
-            throw new _util.FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`);
-          }
+    const storageEntry = annotationStorage.get(this.data.id);
+    const value = storageEntry && storageEntry.value;
 
-          if (i === 0 && entry.free && first === 1) {
-            first = 0;
-          }
+    if (value === undefined) {
+      return null;
+    }
 
-          if (!this.entries[i + first]) {
-            this.entries[i + first] = entry;
-          }
-        }
+    const defaultValue = this.data.fieldValue === this.data.buttonValue;
 
-        tableState.entryNum = 0;
-        tableState.streamPos = stream.pos;
-        tableState.parserBuf1 = parser.buf1;
-        tableState.parserBuf2 = parser.buf2;
-        delete tableState.firstEntryNum;
-        delete tableState.entryCount;
-      }
+    if (defaultValue === value) {
+      return null;
+    }
 
-      if (this.entries[0] && !this.entries[0].free) {
-        throw new _util.FormatError("Invalid XRef table: unexpected first object");
-      }
+    const dict = evaluator.xref.fetchIfRef(this.ref);
 
-      return obj;
-    },
-    processXRefStream: function XRef_processXRefStream(stream) {
-      if (!("streamState" in this)) {
-        var streamParameters = stream.dict;
-        var byteWidths = streamParameters.get("W");
-        var range = streamParameters.get("Index");
+    if (!(0, _primitives.isDict)(dict)) {
+      return null;
+    }
 
-        if (!range) {
-          range = [0, streamParameters.get("Size")];
-        }
+    const xfa = {
+      path: (0, _util.stringToPDFString)(dict.get("T") || ""),
+      value: value ? this.data.buttonValue : ""
+    };
 
-        this.streamState = {
-          entryRanges: range,
-          byteWidths,
-          entryNum: 0,
-          streamPos: stream.pos
-        };
-      }
+    const name = _primitives.Name.get(value ? this.data.buttonValue : "Off");
 
-      this.readXRefStream(stream);
-      delete this.streamState;
-      return stream.dict;
-    },
-    readXRefStream: function XRef_readXRefStream(stream) {
-      var i, j;
-      var streamState = this.streamState;
-      stream.pos = streamState.streamPos;
-      var byteWidths = streamState.byteWidths;
-      var typeFieldWidth = byteWidths[0];
-      var offsetFieldWidth = byteWidths[1];
-      var generationFieldWidth = byteWidths[2];
-      var entryRanges = streamState.entryRanges;
+    let parentBuffer = null;
+    const encrypt = evaluator.xref.encrypt;
 
-      while (entryRanges.length > 0) {
-        var first = entryRanges[0];
-        var n = entryRanges[1];
+    if (value) {
+      if ((0, _primitives.isRef)(this.parent)) {
+        const parent = evaluator.xref.fetch(this.parent);
+        let parentTransform = null;
 
-        if (!Number.isInteger(first) || !Number.isInteger(n)) {
-          throw new _util.FormatError(`Invalid XRef range fields: ${first}, ${n}`);
+        if (encrypt) {
+          parentTransform = encrypt.createCipherTransform(this.parent.num, this.parent.gen);
         }
 
-        if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || 
!Number.isInteger(generationFieldWidth)) {
-          throw new _util.FormatError(`Invalid XRef entry fields length: ${first}, ${n}`);
-        }
+        parent.set("V", name);
+        parentBuffer = [`${this.parent.num} ${this.parent.gen} obj\n`];
+        (0, _writer.writeDict)(parent, parentBuffer, parentTransform);
+        parentBuffer.push("\nendobj\n");
+      } else if ((0, _primitives.isDict)(this.parent)) {
+        this.parent.set("V", name);
+      }
+    }
 
-        for (i = streamState.entryNum; i < n; ++i) {
-          streamState.entryNum = i;
-          streamState.streamPos = stream.pos;
-          var type = 0,
-              offset = 0,
-              generation = 0;
+    dict.set("AS", name);
+    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
+    let originalTransform = null;
 
-          for (j = 0; j < typeFieldWidth; ++j) {
-            type = type << 8 | stream.getByte();
-          }
+    if (encrypt) {
+      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
+    }
 
-          if (typeFieldWidth === 0) {
-            type = 1;
-          }
+    const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`];
+    (0, _writer.writeDict)(dict, buffer, originalTransform);
+    buffer.push("\nendobj\n");
+    const newRefs = [{
+      ref: this.ref,
+      data: buffer.join(""),
+      xfa
+    }];
 
-          for (j = 0; j < offsetFieldWidth; ++j) {
-            offset = offset << 8 | stream.getByte();
-          }
+    if (parentBuffer !== null) {
+      newRefs.push({
+        ref: this.parent,
+        data: parentBuffer.join(""),
+        xfa: null
+      });
+    }
 
-          for (j = 0; j < generationFieldWidth; ++j) {
-            generation = generation << 8 | stream.getByte();
-          }
+    return newRefs;
+  }
 
-          var entry = {};
-          entry.offset = offset;
-          entry.gen = generation;
+  _processCheckBox(params) {
+    const customAppearance = params.dict.get("AP");
 
-          switch (type) {
-            case 0:
-              entry.free = true;
-              break;
+    if (!(0, _primitives.isDict)(customAppearance)) {
+      return;
+    }
 
-            case 1:
-              entry.uncompressed = true;
-              break;
+    const normalAppearance = customAppearance.get("N");
 
-            case 2:
-              break;
+    if (!(0, _primitives.isDict)(normalAppearance)) {
+      return;
+    }
 
-            default:
-              throw new _util.FormatError(`Invalid XRef entry type: ${type}`);
-          }
+    const exportValues = normalAppearance.getKeys();
 
-          if (!this.entries[first + i]) {
-            this.entries[first + i] = entry;
-          }
-        }
+    if (!exportValues.includes("Off")) {
+      exportValues.push("Off");
+    }
 
-        streamState.entryNum = 0;
-        streamState.streamPos = stream.pos;
-        entryRanges.splice(0, 2);
-      }
-    },
-    indexObjects: function XRef_indexObjects() {
-      var TAB = 0x9,
-          LF = 0xa,
-          CR = 0xd,
-          SPACE = 0x20;
-      var PERCENT = 0x25,
-          LT = 0x3c;
+    if (!exportValues.includes(this.data.fieldValue)) {
+      this.data.fieldValue = null;
+    }
 
-      function readToken(data, offset) {
-        var token = "",
-            ch = data[offset];
+    if (exportValues.length !== 2) {
+      return;
+    }
 
-        while (ch !== LF && ch !== CR && ch !== LT) {
-          if (++offset >= data.length) {
-            break;
-          }
+    this.data.exportValue = exportValues[0] === "Off" ? exportValues[1] : exportValues[0];
+    this.checkedAppearance = normalAppearance.get(this.data.exportValue);
+    this.uncheckedAppearance = normalAppearance.get("Off") || null;
 
-          token += String.fromCharCode(ch);
-          ch = data[offset];
-        }
+    this._streams.push(this.checkedAppearance);
 
-        return token;
-      }
+    if (this.uncheckedAppearance) {
+      this._streams.push(this.uncheckedAppearance);
+    }
 
-      function skipUntil(data, offset, what) {
-        var length = what.length,
-            dataLength = data.length;
-        var skipped = 0;
+    this._fallbackFontDict = this.fallbackFontDict;
+  }
 
-        while (offset < dataLength) {
-          var i = 0;
+  _processRadioButton(params) {
+    this.data.fieldValue = this.data.buttonValue = null;
+    const fieldParent = params.dict.get("Parent");
 
-          while (i < length && data[offset + i] === what[i]) {
-            ++i;
-          }
+    if ((0, _primitives.isDict)(fieldParent)) {
+      this.parent = params.dict.getRaw("Parent");
+      const fieldParentValue = fieldParent.get("V");
 
-          if (i >= length) {
-            break;
-          }
+      if ((0, _primitives.isName)(fieldParentValue)) {
+        this.data.fieldValue = this._decodeFormValue(fieldParentValue);
+      }
+    }
 
-          offset++;
-          skipped++;
-        }
+    const appearanceStates = params.dict.get("AP");
 
-        return skipped;
-      }
+    if (!(0, _primitives.isDict)(appearanceStates)) {
+      return;
+    }
 
-      var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
-      const endobjRegExp = /\bendobj[\b\s]$/;
-      const nestedObjRegExp = /\s+(\d+\s+\d+\s+obj[\b\s<])$/;
-      const CHECK_CONTENT_LENGTH = 25;
-      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
-      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
-      const objBytes = new Uint8Array([111, 98, 106]);
-      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
-      this.entries.length = 0;
-      var stream = this.stream;
-      stream.pos = 0;
-      var buffer = stream.getBytes();
-      var position = stream.start,
-          length = buffer.length;
-      var trailers = [],
-          xrefStms = [];
+    const normalAppearance = appearanceStates.get("N");
 
-      while (position < length) {
-        var ch = buffer[position];
+    if (!(0, _primitives.isDict)(normalAppearance)) {
+      return;
+    }
 
-        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
-          ++position;
-          continue;
-        }
+    for (const key of normalAppearance.getKeys()) {
+      if (key !== "Off") {
+        this.data.buttonValue = this._decodeFormValue(key);
+        break;
+      }
+    }
 
-        if (ch === PERCENT) {
-          do {
-            ++position;
+    this.checkedAppearance = normalAppearance.get(this.data.buttonValue);
+    this.uncheckedAppearance = normalAppearance.get("Off") || null;
 
-            if (position >= length) {
-              break;
-            }
+    this._streams.push(this.checkedAppearance);
 
-            ch = buffer[position];
-          } while (ch !== LF && ch !== CR);
+    if (this.uncheckedAppearance) {
+      this._streams.push(this.uncheckedAppearance);
+    }
 
-          continue;
-        }
+    this._fallbackFontDict = this.fallbackFontDict;
+  }
 
-        var token = readToken(buffer, position);
-        var m;
+  _processPushButton(params) {
+    if (!params.dict.has("A") && !params.dict.has("AA") && !this.data.alternativeText) {
+      (0, _util.warn)("Push buttons without action dictionaries are not supported");
+      return;
+    }
 
-        if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) {
-          position += skipUntil(buffer, position, trailerBytes);
-          trailers.push(position);
-          position += skipUntil(buffer, position, startxrefBytes);
-        } else if (m = objRegExp.exec(token)) {
-          const num = m[1] | 0,
-                gen = m[2] | 0;
+    this.data.isTooltipOnly = !params.dict.has("A") && !params.dict.has("AA");
 
-          if (!this.entries[num] || this.entries[num].gen === gen) {
-            this.entries[num] = {
-              offset: position - stream.start,
-              gen,
-              uncompressed: true
-            };
-          }
+    _catalog.Catalog.parseDestDictionary({
+      destDict: params.dict,
+      resultObj: this.data,
+      docBaseUrl: params.pdfManager.docBaseUrl
+    });
+  }
 
-          let contentLength,
-              startPos = position + token.length;
+  getFieldObject() {
+    let type = "button";
+    let exportValues;
 
-          while (startPos < buffer.length) {
-            const endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;
-            contentLength = endPos - position;
-            const checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);
-            const tokenStr = (0, _util.bytesToString)(buffer.subarray(checkPos, endPos));
+    if (this.data.checkBox) {
+      type = "checkbox";
+      exportValues = this.data.exportValue;
+    } else if (this.data.radioButton) {
+      type = "radiobutton";
+      exportValues = this.data.buttonValue;
+    }
 
-            if (endobjRegExp.test(tokenStr)) {
-              break;
-            } else {
-              const objToken = nestedObjRegExp.exec(tokenStr);
+    return {
+      id: this.data.id,
+      value: this.data.fieldValue || "Off",
+      defaultValue: this.data.defaultFieldValue,
+      exportValues,
+      editable: !this.data.readOnly,
+      name: this.data.fieldName,
+      rect: this.data.rect,
+      hidden: this.data.hidden,
+      actions: this.data.actions,
+      page: this.data.pageIndex,
+      type
+    };
+  }
 
-              if (objToken && objToken[1]) {
-                (0, _util.warn)('indexObjects: Found new "obj" inside of another "obj", ' + 'caused by 
missing "endobj" -- trying to recover.');
-                contentLength -= objToken[1].length;
-                break;
-              }
-            }
+  get fallbackFontDict() {
+    const dict = new _primitives.Dict();
+    dict.set("BaseFont", _primitives.Name.get("ZapfDingbats"));
+    dict.set("Type", _primitives.Name.get("FallbackType"));
+    dict.set("Subtype", _primitives.Name.get("FallbackType"));
+    dict.set("Encoding", _primitives.Name.get("ZapfDingbatsEncoding"));
+    return (0, _util.shadow)(this, "fallbackFontDict", dict);
+  }
 
-            startPos = endPos;
-          }
+}
 
-          const content = buffer.subarray(position, position + contentLength);
-          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+class ChoiceWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    this.data.options = [];
+    const options = (0, _core_utils.getInheritableProperty)({
+      dict: params.dict,
+      key: "Opt"
+    });
 
-          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
-            xrefStms.push(position - stream.start);
-            this.xrefstms[position - stream.start] = 1;
-          }
+    if (Array.isArray(options)) {
+      const xref = params.xref;
 
-          position += contentLength;
-        } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) {
-          trailers.push(position);
-          position += skipUntil(buffer, position, startxrefBytes);
-        } else {
-          position += token.length + 1;
-        }
+      for (let i = 0, ii = options.length; i < ii; i++) {
+        const option = xref.fetchIfRef(options[i]);
+        const isOptionArray = Array.isArray(option);
+        this.data.options[i] = {
+          exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option),
+          displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option)
+        };
       }
+    }
 
-      var i, ii;
+    if ((0, _util.isString)(this.data.fieldValue)) {
+      this.data.fieldValue = [this.data.fieldValue];
+    } else if (!this.data.fieldValue) {
+      this.data.fieldValue = [];
+    }
 
-      for (i = 0, ii = xrefStms.length; i < ii; ++i) {
-        this.startXRefQueue.push(xrefStms[i]);
-        this.readXRef(true);
-      }
+    this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);
+    this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);
+    this._hasText = true;
+  }
 
-      let trailerDict;
+  getFieldObject() {
+    const type = this.data.combo ? "combobox" : "listbox";
+    const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null;
+    return {
+      id: this.data.id,
+      value,
+      defaultValue: this.data.defaultFieldValue,
+      editable: !this.data.readOnly,
+      name: this.data.fieldName,
+      rect: this.data.rect,
+      numItems: this.data.fieldValue.length,
+      multipleSelection: this.data.multiSelect,
+      hidden: this.data.hidden,
+      actions: this.data.actions,
+      items: this.data.options,
+      page: this.data.pageIndex,
+      type
+    };
+  }
 
-      for (i = 0, ii = trailers.length; i < ii; ++i) {
-        stream.pos = trailers[i];
-        const parser = new _parser.Parser({
-          lexer: new _parser.Lexer(stream),
-          xref: this,
-          allowStreams: true,
-          recoveryMode: true
-        });
-        var obj = parser.getObj();
+}
 
-        if (!(0, _primitives.isCmd)(obj, "trailer")) {
-          continue;
-        }
+class SignatureWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    this.data.fieldValue = null;
+  }
 
-        const dict = parser.getObj();
+  getFieldObject() {
+    return {
+      id: this.data.id,
+      value: null,
+      page: this.data.pageIndex,
+      type: "signature"
+    };
+  }
 
-        if (!(0, _primitives.isDict)(dict)) {
-          continue;
-        }
+}
 
-        let rootDict;
+class TextAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    const DEFAULT_ICON_SIZE = 22;
+    super(parameters);
+    const dict = parameters.dict;
+    this.data.annotationType = _util.AnnotationType.TEXT;
 
-        try {
-          rootDict = dict.get("Root");
-        } catch (ex) {
-          if (ex instanceof _core_utils.MissingDataException) {
-            throw ex;
-          }
+    if (this.data.hasAppearance) {
+      this.data.name = "NoIcon";
+    } else {
+      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;
+      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;
+      this.data.name = dict.has("Name") ? dict.get("Name").name : "Note";
+    }
 
-          continue;
-        }
+    if (dict.has("State")) {
+      this.data.state = dict.get("State") || null;
+      this.data.stateModel = dict.get("StateModel") || null;
+    } else {
+      this.data.state = null;
+      this.data.stateModel = null;
+    }
+  }
 
-        if (!(0, _primitives.isDict)(rootDict) || !rootDict.has("Pages")) {
-          continue;
-        }
+}
 
-        if (dict.has("ID")) {
-          return dict;
-        }
+class LinkAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    this.data.annotationType = _util.AnnotationType.LINK;
+    const quadPoints = getQuadPoints(params.dict, this.rectangle);
 
-        trailerDict = dict;
-      }
+    if (quadPoints) {
+      this.data.quadPoints = quadPoints;
+    }
 
-      if (trailerDict) {
-        return trailerDict;
-      }
+    _catalog.Catalog.parseDestDictionary({
+      destDict: params.dict,
+      resultObj: this.data,
+      docBaseUrl: params.pdfManager.docBaseUrl
+    });
+  }
 
-      throw new _util.InvalidPDFException("Invalid PDF structure.");
-    },
-    readXRef: function XRef_readXRef(recoveryMode) {
-      var stream = this.stream;
-      const startXRefParsedCache = Object.create(null);
+}
 
-      try {
-        while (this.startXRefQueue.length) {
-          var startXRef = this.startXRefQueue[0];
+class PopupAnnotation extends Annotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.POPUP;
+    let parentItem = parameters.dict.get("Parent");
 
-          if (startXRefParsedCache[startXRef]) {
-            (0, _util.warn)("readXRef - skipping XRef table since it was already parsed.");
-            this.startXRefQueue.shift();
-            continue;
-          }
+    if (!parentItem) {
+      (0, _util.warn)("Popup annotation has a missing or invalid parent annotation.");
+      return;
+    }
 
-          startXRefParsedCache[startXRef] = true;
-          stream.pos = startXRef + stream.start;
-          const parser = new _parser.Parser({
-            lexer: new _parser.Lexer(stream),
-            xref: this,
-            allowStreams: true
-          });
-          var obj = parser.getObj();
-          var dict;
+    const parentSubtype = parentItem.get("Subtype");
+    this.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;
+    const rawParent = parameters.dict.getRaw("Parent");
+    this.data.parentId = (0, _primitives.isRef)(rawParent) ? rawParent.toString() : null;
+    const parentRect = parentItem.getArray("Rect");
 
-          if ((0, _primitives.isCmd)(obj, "xref")) {
-            dict = this.processXRefTable(parser);
+    if (Array.isArray(parentRect) && parentRect.length === 4) {
+      this.data.parentRect = _util.Util.normalizeRect(parentRect);
+    } else {
+      this.data.parentRect = [0, 0, 0, 0];
+    }
 
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
+    const rt = parentItem.get("RT");
 
-            obj = dict.get("XRefStm");
+    if ((0, _primitives.isName)(rt, _util.AnnotationReplyType.GROUP)) {
+      parentItem = parentItem.get("IRT");
+    }
 
-            if (Number.isInteger(obj)) {
-              var pos = obj;
+    if (!parentItem.has("M")) {
+      this.data.modificationDate = null;
+    } else {
+      this.setModificationDate(parentItem.get("M"));
+      this.data.modificationDate = this.modificationDate;
+    }
 
-              if (!(pos in this.xrefstms)) {
-                this.xrefstms[pos] = 1;
-                this.startXRefQueue.push(pos);
-              }
-            }
-          } else if (Number.isInteger(obj)) {
-            if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), "obj") || 
!(0, _primitives.isStream)(obj = parser.getObj())) {
-              throw new _util.FormatError("Invalid XRef stream");
-            }
+    if (!parentItem.has("C")) {
+      this.data.color = null;
+    } else {
+      this.setColor(parentItem.getArray("C"));
+      this.data.color = this.color;
+    }
 
-            dict = this.processXRefStream(obj);
+    if (!this.viewable) {
+      const parentFlags = parentItem.get("F");
 
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
+      if (this._isViewable(parentFlags)) {
+        this.setFlags(parentFlags);
+      }
+    }
 
-            if (!dict) {
-              throw new _util.FormatError("Failed to read XRef stream");
-            }
-          } else {
-            throw new _util.FormatError("Invalid XRef stream header");
-          }
+    this.data.title = (0, _util.stringToPDFString)(parentItem.get("T") || "");
+    this.data.contents = (0, _util.stringToPDFString)(parentItem.get("Contents") || "");
+  }
 
-          obj = dict.get("Prev");
+}
 
-          if (Number.isInteger(obj)) {
-            this.startXRefQueue.push(obj);
-          } else if ((0, _primitives.isRef)(obj)) {
-            this.startXRefQueue.push(obj.num);
-          }
+class FreeTextAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.FREETEXT;
+  }
 
-          this.startXRefQueue.shift();
-        }
+}
 
-        return this.topDict;
-      } catch (e) {
-        if (e instanceof _core_utils.MissingDataException) {
-          throw e;
-        }
+class LineAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.LINE;
+    const lineCoordinates = parameters.dict.getArray("L");
+    this.data.lineCoordinates = _util.Util.normalizeRect(lineCoordinates);
 
-        (0, _util.info)("(while reading XRef): " + e);
-      }
+    if (!this.appearance) {
+      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+      const strokeAlpha = parameters.dict.get("CA");
+      let fillColor = null,
+          interiorColor = parameters.dict.getArray("IC");
 
-      if (recoveryMode) {
-        return undefined;
+      if (interiorColor) {
+        interiorColor = getRgbColor(interiorColor);
+        fillColor = interiorColor ? Array.from(interiorColor).map(c => c / 255) : null;
       }
 
-      throw new _core_utils.XRefParseException();
-    },
-    getEntry: function XRef_getEntry(i) {
-      var xrefEntry = this.entries[i];
+      const fillAlpha = fillColor ? strokeAlpha : null;
+      const borderWidth = this.borderStyle.width || 1,
+            borderAdjust = 2 * borderWidth;
+      const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - 
borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust];
 
-      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
-        return xrefEntry;
+      if (!_util.Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
       }
 
-      return null;
-    },
-    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
-      if (obj instanceof _primitives.Ref) {
-        return this.fetch(obj, suppressEncryption);
-      }
+      this._setDefaultAppearance({
+        xref: parameters.xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} 
${lineCoordinates[3]} l`, "S");
+          return [points[0].x - borderWidth, points[1].x + borderWidth, points[3].y - borderWidth, 
points[1].y + borderWidth];
+        }
+      });
+    }
+  }
 
-      return obj;
-    },
-    fetch: function XRef_fetch(ref, suppressEncryption) {
-      if (!(ref instanceof _primitives.Ref)) {
-        throw new Error("ref object is not a reference");
-      }
+}
 
-      const num = ref.num;
+class SquareAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.SQUARE;
 
-      const cacheEntry = this._cacheMap.get(num);
+    if (!this.appearance) {
+      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+      const strokeAlpha = parameters.dict.get("CA");
+      let fillColor = null,
+          interiorColor = parameters.dict.getArray("IC");
+
+      if (interiorColor) {
+        interiorColor = getRgbColor(interiorColor);
+        fillColor = interiorColor ? Array.from(interiorColor).map(c => c / 255) : null;
+      }
+
+      const fillAlpha = fillColor ? strokeAlpha : null;
+
+      this._setDefaultAppearance({
+        xref: parameters.xref,
+        extra: `${this.borderStyle.width} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          const x = points[2].x + this.borderStyle.width / 2;
+          const y = points[2].y + this.borderStyle.width / 2;
+          const width = points[3].x - points[2].x - this.borderStyle.width;
+          const height = points[1].y - points[3].y - this.borderStyle.width;
+          buffer.push(`${x} ${y} ${width} ${height} re`);
+
+          if (fillColor) {
+            buffer.push("B");
+          } else {
+            buffer.push("S");
+          }
 
-      if (cacheEntry !== undefined) {
-        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {
-          cacheEntry.objId = ref.toString();
+          return [points[0].x, points[1].x, points[3].y, points[1].y];
         }
+      });
+    }
+  }
 
-        return cacheEntry;
-      }
+}
 
-      let xrefEntry = this.getEntry(num);
+class CircleAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.CIRCLE;
 
-      if (xrefEntry === null) {
-        this._cacheMap.set(num, xrefEntry);
+    if (!this.appearance) {
+      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+      const strokeAlpha = parameters.dict.get("CA");
+      let fillColor = null;
+      let interiorColor = parameters.dict.getArray("IC");
+
+      if (interiorColor) {
+        interiorColor = getRgbColor(interiorColor);
+        fillColor = interiorColor ? Array.from(interiorColor).map(c => c / 255) : null;
+      }
+
+      const fillAlpha = fillColor ? strokeAlpha : null;
+      const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4));
+
+      this._setDefaultAppearance({
+        xref: parameters.xref,
+        extra: `${this.borderStyle.width} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          const x0 = points[0].x + this.borderStyle.width / 2;
+          const y0 = points[0].y - this.borderStyle.width / 2;
+          const x1 = points[3].x - this.borderStyle.width / 2;
+          const y1 = points[3].y + this.borderStyle.width / 2;
+          const xMid = x0 + (x1 - x0) / 2;
+          const yMid = y0 + (y1 - y0) / 2;
+          const xOffset = (x1 - x0) / 2 * controlPointsDistance;
+          const yOffset = (y1 - y0) / 2 * controlPointsDistance;
+          buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, 
`${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - 
yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h");
+
+          if (fillColor) {
+            buffer.push("B");
+          } else {
+            buffer.push("S");
+          }
 
-        return xrefEntry;
-      }
+          return [points[0].x, points[1].x, points[3].y, points[1].y];
+        }
+      });
+    }
+  }
 
-      if (xrefEntry.uncompressed) {
-        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
-      } else {
-        xrefEntry = this.fetchCompressed(ref, xrefEntry, suppressEncryption);
-      }
+}
 
-      if ((0, _primitives.isDict)(xrefEntry)) {
-        xrefEntry.objId = ref.toString();
-      } else if ((0, _primitives.isStream)(xrefEntry)) {
-        xrefEntry.dict.objId = ref.toString();
-      }
+class PolylineAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.POLYLINE;
+    this.data.vertices = [];
+    const rawVertices = parameters.dict.getArray("Vertices");
 
-      return xrefEntry;
-    },
+    if (!Array.isArray(rawVertices)) {
+      return;
+    }
+
+    for (let i = 0, ii = rawVertices.length; i < ii; i += 2) {
+      this.data.vertices.push({
+        x: rawVertices[i],
+        y: rawVertices[i + 1]
+      });
+    }
 
-    fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {
-      var gen = ref.gen;
-      var num = ref.num;
+    if (!this.appearance) {
+      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+      const strokeAlpha = parameters.dict.get("CA");
+      const borderWidth = this.borderStyle.width || 1,
+            borderAdjust = 2 * borderWidth;
+      const bbox = [Infinity, Infinity, -Infinity, -Infinity];
 
-      if (xrefEntry.gen !== gen) {
-        throw new _core_utils.XRefEntryException(`Inconsistent generation in XRef: ${ref}`);
+      for (const vertex of this.data.vertices) {
+        bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust);
+        bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust);
+        bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust);
+        bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust);
       }
 
-      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
-      const parser = new _parser.Parser({
-        lexer: new _parser.Lexer(stream),
-        xref: this,
-        allowStreams: true
-      });
-      var obj1 = parser.getObj();
-      var obj2 = parser.getObj();
-      var obj3 = parser.getObj();
-
-      if (obj1 !== num || obj2 !== gen || !(obj3 instanceof _primitives.Cmd)) {
-        throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
+      if (!_util.Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
       }
 
-      if (obj3.cmd !== "obj") {
-        if (obj3.cmd.startsWith("obj")) {
-          num = parseInt(obj3.cmd.substring(3), 10);
+      this._setDefaultAppearance({
+        xref: parameters.xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        strokeAlpha,
+        pointsCallback: (buffer, points) => {
+          const vertices = this.data.vertices;
 
-          if (!Number.isNaN(num)) {
-            return num;
+          for (let i = 0, ii = vertices.length; i < ii; i++) {
+            buffer.push(`${vertices[i].x} ${vertices[i].y} ${i === 0 ? "m" : "l"}`);
           }
+
+          buffer.push("S");
+          return [points[0].x, points[1].x, points[3].y, points[1].y];
         }
+      });
+    }
+  }
 
-        throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
-      }
+}
 
-      if (this.encrypt && !suppressEncryption) {
-        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
-      } else {
-        xrefEntry = parser.getObj();
-      }
+class PolygonAnnotation extends PolylineAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.POLYGON;
+  }
 
-      if (!(0, _primitives.isStream)(xrefEntry)) {
-        this._cacheMap.set(num, xrefEntry);
-      }
+}
 
-      return xrefEntry;
-    },
+class CaretAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.CARET;
+  }
 
-    fetchCompressed(ref, xrefEntry, suppressEncryption = false) {
-      const tableOffset = xrefEntry.offset;
-      const stream = this.fetch(_primitives.Ref.get(tableOffset, 0));
+}
 
-      if (!(0, _primitives.isStream)(stream)) {
-        throw new _util.FormatError("bad ObjStm stream");
-      }
+class InkAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.INK;
+    this.data.inkLists = [];
+    const rawInkLists = parameters.dict.getArray("InkList");
 
-      const first = stream.dict.get("First");
-      const n = stream.dict.get("N");
+    if (!Array.isArray(rawInkLists)) {
+      return;
+    }
 
-      if (!Number.isInteger(first) || !Number.isInteger(n)) {
-        throw new _util.FormatError("invalid first and n parameters for ObjStm stream");
-      }
+    const xref = parameters.xref;
 
-      const parser = new _parser.Parser({
-        lexer: new _parser.Lexer(stream),
-        xref: this,
-        allowStreams: true
-      });
-      const nums = new Array(n);
+    for (let i = 0, ii = rawInkLists.length; i < ii; ++i) {
+      this.data.inkLists.push([]);
 
-      for (let i = 0; i < n; ++i) {
-        const num = parser.getObj();
+      for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) {
+        this.data.inkLists[i].push({
+          x: xref.fetchIfRef(rawInkLists[i][j]),
+          y: xref.fetchIfRef(rawInkLists[i][j + 1])
+        });
+      }
+    }
 
-        if (!Number.isInteger(num)) {
-          throw new _util.FormatError(`invalid object number in the ObjStm stream: ${num}`);
-        }
+    if (!this.appearance) {
+      const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+      const strokeAlpha = parameters.dict.get("CA");
+      const borderWidth = this.borderStyle.width || 1,
+            borderAdjust = 2 * borderWidth;
+      const bbox = [Infinity, Infinity, -Infinity, -Infinity];
+
+      for (const inkLists of this.data.inkLists) {
+        for (const vertex of inkLists) {
+          bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust);
+          bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust);
+          bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust);
+          bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust);
+        }
+      }
+
+      if (!_util.Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
+      }
+
+      this._setDefaultAppearance({
+        xref: parameters.xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        strokeAlpha,
+        pointsCallback: (buffer, points) => {
+          for (const inkList of this.data.inkLists) {
+            for (let i = 0, ii = inkList.length; i < ii; i++) {
+              buffer.push(`${inkList[i].x} ${inkList[i].y} ${i === 0 ? "m" : "l"}`);
+            }
 
-        const offset = parser.getObj();
+            buffer.push("S");
+          }
 
-        if (!Number.isInteger(offset)) {
-          throw new _util.FormatError(`invalid object offset in the ObjStm stream: ${offset}`);
+          return [points[0].x, points[1].x, points[3].y, points[1].y];
         }
+      });
+    }
+  }
 
-        nums[i] = num;
-      }
-
-      const entries = new Array(n);
+}
 
-      for (let i = 0; i < n; ++i) {
-        const obj = parser.getObj();
-        entries[i] = obj;
+class HighlightAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.HIGHLIGHT;
+    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);
 
-        if (parser.buf1 instanceof _primitives.Cmd && parser.buf1.cmd === "endobj") {
-          parser.shift();
-        }
+    if (quadPoints) {
+      const resources = this.appearance && this.appearance.dict.get("Resources");
 
-        if ((0, _primitives.isStream)(obj)) {
-          continue;
+      if (!this.appearance || !(resources && resources.has("ExtGState"))) {
+        if (this.appearance) {
+          (0, _util.warn)("HighlightAnnotation - ignoring built-in appearance stream.");
         }
 
-        const num = nums[i],
-              entry = this.entries[num];
+        const fillColor = this.color ? Array.from(this.color).map(c => c / 255) : [1, 1, 0];
+        const fillAlpha = parameters.dict.get("CA");
 
-        if (entry && entry.offset === tableOffset && entry.gen === i) {
-          this._cacheMap.set(num, obj);
-        }
+        this._setDefaultAppearance({
+          xref: parameters.xref,
+          fillColor,
+          blendMode: "Multiply",
+          fillAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${points[0].x} ${points[0].y} m`, `${points[1].x} ${points[1].y} l`, 
`${points[3].x} ${points[3].y} l`, `${points[2].x} ${points[2].y} l`, "f");
+            return [points[0].x, points[1].x, points[3].y, points[1].y];
+          }
+        });
       }
+    } else {
+      this.data.hasPopup = false;
+    }
+  }
 
-      xrefEntry = entries[xrefEntry.gen];
-
-      if (xrefEntry === undefined) {
-        throw new _core_utils.XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);
-      }
+}
 
-      return xrefEntry;
-    },
+class UnderlineAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.UNDERLINE;
+    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);
 
-    async fetchIfRefAsync(obj, suppressEncryption) {
-      if (obj instanceof _primitives.Ref) {
-        return this.fetchAsync(obj, suppressEncryption);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+        const strokeAlpha = parameters.dict.get("CA");
+
+        this._setDefaultAppearance({
+          xref: parameters.xref,
+          extra: "[] 0 d 1 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${points[2].x} ${points[2].y} m`, `${points[3].x} ${points[3].y} l`, "S");
+            return [points[0].x, points[1].x, points[3].y, points[1].y];
+          }
+        });
       }
+    } else {
+      this.data.hasPopup = false;
+    }
+  }
 
-      return obj;
-    },
+}
 
-    async fetchAsync(ref, suppressEncryption) {
-      try {
-        return this.fetch(ref, suppressEncryption);
-      } catch (ex) {
-        if (!(ex instanceof _core_utils.MissingDataException)) {
-          throw ex;
-        }
+class SquigglyAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.SQUIGGLY;
+    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);
 
-        await this.pdfManager.requestRange(ex.begin, ex.end);
-        return this.fetchAsync(ref, suppressEncryption);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+        const strokeAlpha = parameters.dict.get("CA");
+
+        this._setDefaultAppearance({
+          xref: parameters.xref,
+          extra: "[] 0 d 1 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            const dy = (points[0].y - points[2].y) / 6;
+            let shift = dy;
+            let x = points[2].x;
+            const y = points[2].y;
+            const xEnd = points[3].x;
+            buffer.push(`${x} ${y + shift} m`);
+
+            do {
+              x += 2;
+              shift = shift === 0 ? dy : 0;
+              buffer.push(`${x} ${y + shift} l`);
+            } while (x < xEnd);
+
+            buffer.push("S");
+            return [points[2].x, xEnd, y - 2 * dy, y + 2 * dy];
+          }
+        });
       }
-    },
-
-    getCatalogObj: function XRef_getCatalogObj() {
-      return this.root;
+    } else {
+      this.data.hasPopup = false;
     }
-  };
-  return XRef;
-}();
+  }
 
-exports.XRef = XRef;
+}
 
-class NameOrNumberTree {
-  constructor(root, xref, type) {
-    if (this.constructor === NameOrNumberTree) {
-      (0, _util.unreachable)("Cannot initialize NameOrNumberTree.");
+class StrikeOutAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.STRIKEOUT;
+    const quadPoints = this.data.quadPoints = getQuadPoints(parameters.dict, null);
+
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = this.color ? Array.from(this.color).map(c => c / 255) : [0, 0, 0];
+        const strokeAlpha = parameters.dict.get("CA");
+
+        this._setDefaultAppearance({
+          xref: parameters.xref,
+          extra: "[] 0 d 1 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${(points[0].x + points[2].x) / 2} ` + `${(points[0].y + points[2].y) / 2} m`, 
`${(points[1].x + points[3].x) / 2} ` + `${(points[1].y + points[3].y) / 2} l`, "S");
+            return [points[0].x, points[1].x, points[3].y, points[1].y];
+          }
+        });
+      }
+    } else {
+      this.data.hasPopup = false;
     }
+  }
 
-    this.root = root;
-    this.xref = xref;
-    this._type = type;
+}
+
+class StampAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    this.data.annotationType = _util.AnnotationType.STAMP;
   }
 
-  getAll() {
-    const dict = Object.create(null);
+}
 
-    if (!this.root) {
-      return dict;
-    }
+class FileAttachmentAnnotation extends MarkupAnnotation {
+  constructor(parameters) {
+    super(parameters);
+    const file = new _file_spec.FileSpec(parameters.dict.get("FS"), parameters.xref);
+    this.data.annotationType = _util.AnnotationType.FILEATTACHMENT;
+    this.data.file = file.serializable;
+  }
 
-    const xref = this.xref;
-    const processed = new _primitives.RefSet();
-    processed.put(this.root);
-    const queue = [this.root];
+}
 
-    while (queue.length > 0) {
-      const obj = xref.fetchIfRef(queue.shift());
+/***/ }),
+/* 13 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      if (!(0, _primitives.isDict)(obj)) {
-        continue;
-      }
 
-      if (obj.has("Kids")) {
-        const kids = obj.get("Kids");
 
-        for (let i = 0, ii = kids.length; i < ii; i++) {
-          const kid = kids[i];
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.createDefaultAppearance = createDefaultAppearance;
+exports.parseDefaultAppearance = parseDefaultAppearance;
 
-          if (processed.has(kid)) {
-            throw new _util.FormatError(`Duplicate entry in "${this._type}" tree.`);
-          }
+var _util = __w_pdfjs_require__(2);
 
-          queue.push(kid);
-          processed.put(kid);
-        }
+var _colorspace = __w_pdfjs_require__(14);
 
-        continue;
-      }
+var _core_utils = __w_pdfjs_require__(9);
 
-      const entries = obj.get(this._type);
+var _evaluator = __w_pdfjs_require__(15);
 
-      if (Array.isArray(entries)) {
-        for (let i = 0, ii = entries.length; i < ii; i += 2) {
-          dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);
-        }
-      }
-    }
+var _primitives = __w_pdfjs_require__(5);
 
-    return dict;
+var _stream = __w_pdfjs_require__(10);
+
+class DefaultAppearanceEvaluator extends _evaluator.EvaluatorPreprocessor {
+  constructor(str) {
+    super(new _stream.StringStream(str));
   }
 
-  get(key) {
-    if (!this.root) {
-      return null;
-    }
+  parse() {
+    const operation = {
+      fn: 0,
+      args: []
+    };
+    const result = {
+      fontSize: 0,
+      fontName: "",
+      fontColor: new Uint8ClampedArray(3)
+    };
 
-    const xref = this.xref;
-    let kidsOrEntries = xref.fetchIfRef(this.root);
-    let loopCount = 0;
-    const MAX_LEVELS = 10;
-
-    while (kidsOrEntries.has("Kids")) {
-      if (++loopCount > MAX_LEVELS) {
-        (0, _util.warn)(`Search depth limit reached for "${this._type}" tree.`);
-        return null;
-      }
+    try {
+      while (true) {
+        operation.args.length = 0;
 
-      const kids = kidsOrEntries.get("Kids");
+        if (!this.read(operation)) {
+          break;
+        }
 
-      if (!Array.isArray(kids)) {
-        return null;
-      }
+        if (this.savedStatesDepth !== 0) {
+          continue;
+        }
 
-      let l = 0,
-          r = kids.length - 1;
+        const {
+          fn,
+          args
+        } = operation;
 
-      while (l <= r) {
-        const m = l + r >> 1;
-        const kid = xref.fetchIfRef(kids[m]);
-        const limits = kid.get("Limits");
+        switch (fn | 0) {
+          case _util.OPS.setFont:
+            const [fontName, fontSize] = args;
 
-        if (key < xref.fetchIfRef(limits[0])) {
-          r = m - 1;
-        } else if (key > xref.fetchIfRef(limits[1])) {
-          l = m + 1;
-        } else {
-          kidsOrEntries = xref.fetchIfRef(kids[m]);
-          break;
-        }
-      }
+            if (fontName instanceof _primitives.Name) {
+              result.fontName = fontName.name;
+            }
 
-      if (l > r) {
-        return null;
-      }
-    }
+            if (typeof fontSize === "number" && fontSize > 0) {
+              result.fontSize = fontSize;
+            }
 
-    const entries = kidsOrEntries.get(this._type);
+            break;
 
-    if (Array.isArray(entries)) {
-      let l = 0,
-          r = entries.length - 2;
+          case _util.OPS.setFillRGBColor:
+            _colorspace.ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0);
 
-      while (l <= r) {
-        const tmp = l + r >> 1,
-              m = tmp + (tmp & 1);
-        const currentKey = xref.fetchIfRef(entries[m]);
+            break;
 
-        if (key < currentKey) {
-          r = m - 2;
-        } else if (key > currentKey) {
-          l = m + 2;
-        } else {
-          return xref.fetchIfRef(entries[m + 1]);
-        }
-      }
+          case _util.OPS.setFillGray:
+            _colorspace.ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0);
 
-      (0, _util.info)(`Falling back to an exhaustive search, for key "${key}", ` + `in "${this._type}" 
tree.`);
+            break;
 
-      for (let m = 0, mm = entries.length; m < mm; m += 2) {
-        const currentKey = xref.fetchIfRef(entries[m]);
+          case _util.OPS.setFillColorSpace:
+            _colorspace.ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0);
 
-        if (currentKey === key) {
-          (0, _util.warn)(`The "${key}" key was found at an incorrect, ` + `i.e. out-of-order, position in 
"${this._type}" tree.`);
-          return xref.fetchIfRef(entries[m + 1]);
+            break;
         }
       }
+    } catch (reason) {
+      (0, _util.warn)(`parseDefaultAppearance - ignoring errors: "${reason}".`);
     }
 
-    return null;
+    return result;
   }
 
 }
 
-class NameTree extends NameOrNumberTree {
-  constructor(root, xref) {
-    super(root, xref, "Names");
-  }
-
+function parseDefaultAppearance(str) {
+  return new DefaultAppearanceEvaluator(str).parse();
 }
 
-class NumberTree extends NameOrNumberTree {
-  constructor(root, xref) {
-    super(root, xref, "Nums");
+function createDefaultAppearance({
+  fontSize,
+  fontName,
+  fontColor
+}) {
+  let colorCmd;
+
+  if (fontColor.every(c => c === 0)) {
+    colorCmd = "0 g";
+  } else {
+    colorCmd = Array.from(fontColor).map(c => (c / 255).toFixed(2)).join(" ") + " rg";
   }
 
+  return `/${(0, _core_utils.escapePDFName)(fontName)} ${fontSize} Tf ${colorCmd}`;
 }
 
-var FileSpec = function FileSpecClosure() {
-  function FileSpec(root, xref) {
-    if (!root || !(0, _primitives.isDict)(root)) {
-      return;
-    }
+/***/ }),
+/* 14 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    this.xref = xref;
-    this.root = root;
 
-    if (root.has("FS")) {
-      this.fs = root.get("FS");
-    }
 
-    this.description = root.has("Desc") ? (0, _util.stringToPDFString)(root.get("Desc")) : "";
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ColorSpace = void 0;
 
-    if (root.has("RF")) {
-      (0, _util.warn)("Related file specifications are not supported");
-    }
+var _util = __w_pdfjs_require__(2);
 
-    this.contentAvailable = true;
+var _primitives = __w_pdfjs_require__(5);
 
-    if (!root.has("EF")) {
-      this.contentAvailable = false;
-      (0, _util.warn)("Non-embedded file specifications are not supported");
+var _core_utils = __w_pdfjs_require__(9);
+
+function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
+  const COMPONENTS = 3;
+  alpha01 = alpha01 !== 1 ? 0 : alpha01;
+  const xRatio = w1 / w2;
+  const yRatio = h1 / h2;
+  let newIndex = 0,
+      oldIndex;
+  const xScaled = new Uint16Array(w2);
+  const w1Scanline = w1 * COMPONENTS;
+
+  for (let i = 0; i < w2; i++) {
+    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
+  }
+
+  for (let i = 0; i < h2; i++) {
+    const py = Math.floor(i * yRatio) * w1Scanline;
+
+    for (let j = 0; j < w2; j++) {
+      oldIndex = py + xScaled[j];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      newIndex += alpha01;
     }
   }
+}
 
-  function pickPlatformItem(dict) {
-    if (dict.has("UF")) {
-      return dict.get("UF");
-    } else if (dict.has("F")) {
-      return dict.get("F");
-    } else if (dict.has("Unix")) {
-      return dict.get("Unix");
-    } else if (dict.has("Mac")) {
-      return dict.get("Mac");
-    } else if (dict.has("DOS")) {
-      return dict.get("DOS");
+class ColorSpace {
+  constructor(name, numComps) {
+    if (this.constructor === ColorSpace) {
+      (0, _util.unreachable)("Cannot initialize ColorSpace.");
     }
 
-    return null;
+    this.name = name;
+    this.numComps = numComps;
   }
 
-  FileSpec.prototype = {
-    get filename() {
-      if (!this._filename && this.root) {
-        var filename = pickPlatformItem(this.root) || "unnamed";
-        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, "\\").replace(/\\\//g, 
"/").replace(/\\/g, "/");
-      }
+  getRgb(src, srcOffset) {
+    const rgb = new Uint8ClampedArray(3);
+    this.getRgbItem(src, srcOffset, rgb, 0);
+    return rgb;
+  }
 
-      return this._filename;
-    },
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    (0, _util.unreachable)("Should not call ColorSpace.getRgbItem");
+  }
 
-    get content() {
-      if (!this.contentAvailable) {
-        return null;
-      }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    (0, _util.unreachable)("Should not call ColorSpace.getRgbBuffer");
+  }
+
+  getOutputLength(inputLength, alpha01) {
+    (0, _util.unreachable)("Should not call ColorSpace.getOutputLength");
+  }
+
+  isPassthrough(bits) {
+    return false;
+  }
+
+  isDefaultDecode(decodeMap, bpc) {
+    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+  }
+
+  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
+    const count = originalWidth * originalHeight;
+    let rgbBuf = null;
+    const numComponentColors = 1 << bpc;
+    const needsResizing = originalHeight !== height || originalWidth !== width;
 
-      if (!this.contentRef && this.root) {
-        this.contentRef = pickPlatformItem(this.root.get("EF"));
+    if (this.isPassthrough(bpc)) {
+      rgbBuf = comps;
+    } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name 
!== "DeviceRGB") {
+      const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);
+
+      for (let i = 0; i < numComponentColors; i++) {
+        allColors[i] = i;
       }
 
-      var content = null;
+      const colorMap = new Uint8ClampedArray(numComponentColors * 3);
+      this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);
+
+      if (!needsResizing) {
+        let destPos = 0;
 
-      if (this.contentRef) {
-        var xref = this.xref;
-        var fileObj = xref.fetchIfRef(this.contentRef);
+        for (let i = 0; i < count; ++i) {
+          const key = comps[i] * 3;
+          dest[destPos++] = colorMap[key];
+          dest[destPos++] = colorMap[key + 1];
+          dest[destPos++] = colorMap[key + 2];
+          destPos += alpha01;
+        }
+      } else {
+        rgbBuf = new Uint8Array(count * 3);
+        let rgbPos = 0;
 
-        if (fileObj && (0, _primitives.isStream)(fileObj)) {
-          content = fileObj.getBytes();
-        } else {
-          (0, _util.warn)("Embedded file specification points to non-existing/invalid " + "content");
+        for (let i = 0; i < count; ++i) {
+          const key = comps[i] * 3;
+          rgbBuf[rgbPos++] = colorMap[key];
+          rgbBuf[rgbPos++] = colorMap[key + 1];
+          rgbBuf[rgbPos++] = colorMap[key + 2];
         }
+      }
+    } else {
+      if (!needsResizing) {
+        this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
       } else {
-        (0, _util.warn)("Embedded file specification does not have a content");
+        rgbBuf = new Uint8ClampedArray(count * 3);
+        this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
       }
+    }
 
-      return content;
-    },
+    if (rgbBuf) {
+      if (needsResizing) {
+        resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
+      } else {
+        let destPos = 0,
+            rgbPos = 0;
 
-    get serializable() {
-      return {
-        filename: this.filename,
-        content: this.content
-      };
+        for (let i = 0, ii = width * actualHeight; i < ii; i++) {
+          dest[destPos++] = rgbBuf[rgbPos++];
+          dest[destPos++] = rgbBuf[rgbPos++];
+          dest[destPos++] = rgbBuf[rgbPos++];
+          destPos += alpha01;
+        }
+      }
     }
+  }
 
-  };
-  return FileSpec;
-}();
+  get usesZeroToOneRange() {
+    return (0, _util.shadow)(this, "usesZeroToOneRange", true);
+  }
 
-exports.FileSpec = FileSpec;
+  static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) {
+    if (!localColorSpaceCache) {
+      throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.');
+    }
 
-const ObjectLoader = function () {
-  function mayHaveChildren(value) {
-    return value instanceof _primitives.Ref || value instanceof _primitives.Dict || Array.isArray(value) || 
(0, _primitives.isStream)(value);
-  }
+    if (!parsedColorSpace) {
+      throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.');
+    }
 
-  function addChildren(node, nodesToVisit) {
-    if (node instanceof _primitives.Dict) {
-      node = node.getRawValues();
-    } else if ((0, _primitives.isStream)(node)) {
-      node = node.dict.getRawValues();
-    } else if (!Array.isArray(node)) {
-      return;
+    let csName, csRef;
+
+    if (cacheKey instanceof _primitives.Ref) {
+      csRef = cacheKey;
+      cacheKey = xref.fetch(cacheKey);
     }
 
-    for (const rawValue of node) {
-      if (mayHaveChildren(rawValue)) {
-        nodesToVisit.push(rawValue);
-      }
+    if (cacheKey instanceof _primitives.Name) {
+      csName = cacheKey.name;
     }
-  }
 
-  function ObjectLoader(dict, keys, xref) {
-    this.dict = dict;
-    this.keys = keys;
-    this.xref = xref;
-    this.refSet = null;
+    if (csName || csRef) {
+      localColorSpaceCache.set(csName, csRef, parsedColorSpace);
+    }
   }
 
-  ObjectLoader.prototype = {
-    async load() {
-      if (!this.xref.stream.allChunksLoaded || this.xref.stream.allChunksLoaded()) {
-        return undefined;
-      }
+  static getCached(cacheKey, xref, localColorSpaceCache) {
+    if (!localColorSpaceCache) {
+      throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.');
+    }
 
-      const {
-        keys,
-        dict
-      } = this;
-      this.refSet = new _primitives.RefSet();
-      const nodesToVisit = [];
+    if (cacheKey instanceof _primitives.Ref) {
+      const localColorSpace = localColorSpaceCache.getByRef(cacheKey);
 
-      for (let i = 0, ii = keys.length; i < ii; i++) {
-        const rawValue = dict.getRaw(keys[i]);
+      if (localColorSpace) {
+        return localColorSpace;
+      }
 
-        if (rawValue !== undefined) {
-          nodesToVisit.push(rawValue);
+      try {
+        cacheKey = xref.fetch(cacheKey);
+      } catch (ex) {
+        if (ex instanceof _core_utils.MissingDataException) {
+          throw ex;
         }
       }
+    }
 
-      return this._walk(nodesToVisit);
-    },
+    if (cacheKey instanceof _primitives.Name) {
+      const localColorSpace = localColorSpaceCache.getByName(cacheKey.name);
 
-    async _walk(nodesToVisit) {
-      const nodesToRevisit = [];
-      const pendingRequests = [];
+      if (localColorSpace) {
+        return localColorSpace;
+      }
+    }
 
-      while (nodesToVisit.length) {
-        let currentNode = nodesToVisit.pop();
+    return null;
+  }
 
-        if (currentNode instanceof _primitives.Ref) {
-          if (this.refSet.has(currentNode)) {
-            continue;
-          }
+  static async parseAsync({
+    cs,
+    xref,
+    resources = null,
+    pdfFunctionFactory,
+    localColorSpaceCache
+  }) {
+    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
 
-          try {
-            this.refSet.put(currentNode);
-            currentNode = this.xref.fetch(currentNode);
-          } catch (ex) {
-            if (!(ex instanceof _core_utils.MissingDataException)) {
-              throw ex;
-            }
+    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
 
-            nodesToRevisit.push(currentNode);
-            pendingRequests.push({
-              begin: ex.begin,
-              end: ex.end
-            });
-          }
-        }
+    return parsedColorSpace;
+  }
 
-        if (currentNode && currentNode.getBaseStreams) {
-          const baseStreams = currentNode.getBaseStreams();
-          let foundMissingData = false;
+  static parse({
+    cs,
+    xref,
+    resources = null,
+    pdfFunctionFactory,
+    localColorSpaceCache
+  }) {
+    const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache);
 
-          for (let i = 0, ii = baseStreams.length; i < ii; i++) {
-            const stream = baseStreams[i];
+    if (cachedColorSpace) {
+      return cachedColorSpace;
+    }
 
-            if (stream.allChunksLoaded && !stream.allChunksLoaded()) {
-              foundMissingData = true;
-              pendingRequests.push({
-                begin: stream.start,
-                end: stream.end
-              });
-            }
-          }
+    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
 
-          if (foundMissingData) {
-            nodesToRevisit.push(currentNode);
-          }
-        }
+    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
 
-        addChildren(currentNode, nodesToVisit);
-      }
+    return parsedColorSpace;
+  }
+
+  static _parse(cs, xref, resources = null, pdfFunctionFactory) {
+    cs = xref.fetchIfRef(cs);
+
+    if ((0, _primitives.isName)(cs)) {
+      switch (cs.name) {
+        case "DeviceGray":
+        case "G":
+          return this.singletons.gray;
+
+        case "DeviceRGB":
+        case "RGB":
+          return this.singletons.rgb;
+
+        case "DeviceCMYK":
+        case "CMYK":
+          return this.singletons.cmyk;
+
+        case "Pattern":
+          return new PatternCS(null);
+
+        default:
+          if ((0, _primitives.isDict)(resources)) {
+            const colorSpaces = resources.get("ColorSpace");
 
-      if (pendingRequests.length) {
-        await this.xref.stream.manager.requestRanges(pendingRequests);
+            if ((0, _primitives.isDict)(colorSpaces)) {
+              const resourcesCS = colorSpaces.get(cs.name);
 
-        for (let i = 0, ii = nodesToRevisit.length; i < ii; i++) {
-          const node = nodesToRevisit[i];
+              if (resourcesCS) {
+                if ((0, _primitives.isName)(resourcesCS)) {
+                  return this._parse(resourcesCS, xref, resources, pdfFunctionFactory);
+                }
 
-          if (node instanceof _primitives.Ref) {
-            this.refSet.remove(node);
+                cs = resourcesCS;
+                break;
+              }
+            }
           }
-        }
 
-        return this._walk(nodesToRevisit);
+          throw new _util.FormatError(`Unrecognized ColorSpace: ${cs.name}`);
       }
-
-      this.refSet = null;
-      return undefined;
     }
 
-  };
-  return ObjectLoader;
-}();
+    if (Array.isArray(cs)) {
+      const mode = xref.fetchIfRef(cs[0]).name;
+      let params, numComps, baseCS, whitePoint, blackPoint, gamma;
 
-exports.ObjectLoader = ObjectLoader;
+      switch (mode) {
+        case "DeviceGray":
+        case "G":
+          return this.singletons.gray;
 
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+        case "DeviceRGB":
+        case "RGB":
+          return this.singletons.rgb;
 
-"use strict";
+        case "DeviceCMYK":
+        case "CMYK":
+          return this.singletons.cmyk;
 
+        case "CalGray":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          gamma = params.get("Gamma");
+          return new CalGrayCS(whitePoint, blackPoint, gamma);
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Parser = exports.Linearization = exports.Lexer = void 0;
+        case "CalRGB":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          gamma = params.getArray("Gamma");
+          const matrix = params.getArray("Matrix");
+          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
 
-var _stream = __w_pdfjs_require__(12);
+        case "ICCBased":
+          const stream = xref.fetchIfRef(cs[1]);
+          const dict = stream.dict;
+          numComps = dict.get("N");
+          const alt = dict.get("Alternate");
 
-var _util = __w_pdfjs_require__(2);
+          if (alt) {
+            const altCS = this._parse(alt, xref, resources, pdfFunctionFactory);
 
-var _primitives = __w_pdfjs_require__(5);
+            if (altCS.numComps === numComps) {
+              return altCS;
+            }
 
-var _core_utils = __w_pdfjs_require__(8);
+            (0, _util.warn)("ICCBased color space: Ignoring incorrect /Alternate entry.");
+          }
 
-var _ccitt_stream = __w_pdfjs_require__(13);
+          if (numComps === 1) {
+            return this.singletons.gray;
+          } else if (numComps === 3) {
+            return this.singletons.rgb;
+          } else if (numComps === 4) {
+            return this.singletons.cmyk;
+          }
 
-var _jbig2_stream = __w_pdfjs_require__(15);
+          break;
 
-var _jpeg_stream = __w_pdfjs_require__(18);
+        case "Pattern":
+          baseCS = cs[1] || null;
 
-var _jpx_stream = __w_pdfjs_require__(20);
+          if (baseCS) {
+            baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory);
+          }
 
-const MAX_LENGTH_TO_CACHE = 1000;
-const MAX_ADLER32_LENGTH = 5552;
+          return new PatternCS(baseCS);
 
-function computeAdler32(bytes) {
-  const bytesLength = bytes.length;
-  let a = 1,
-      b = 0;
+        case "Indexed":
+        case "I":
+          baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory);
+          const hiVal = xref.fetchIfRef(cs[2]) + 1;
+          const lookup = xref.fetchIfRef(cs[3]);
+          return new IndexedCS(baseCS, hiVal, lookup);
 
-  for (let i = 0; i < bytesLength; ++i) {
-    a += bytes[i] & 0xff;
-    b += a;
-  }
+        case "Separation":
+        case "DeviceN":
+          const name = xref.fetchIfRef(cs[1]);
+          numComps = Array.isArray(name) ? name.length : 1;
+          baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory);
+          const tintFn = pdfFunctionFactory.create(cs[3]);
+          return new AlternateCS(numComps, baseCS, tintFn);
 
-  return b % 65521 << 16 | a % 65521;
-}
+        case "Lab":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          const range = params.getArray("Range");
+          return new LabCS(whitePoint, blackPoint, range);
 
-class Parser {
-  constructor({
-    lexer,
-    xref,
-    allowStreams = false,
-    recoveryMode = false
-  }) {
-    this.lexer = lexer;
-    this.xref = xref;
-    this.allowStreams = allowStreams;
-    this.recoveryMode = recoveryMode;
-    this.imageCache = Object.create(null);
-    this.refill();
-  }
+        default:
+          throw new _util.FormatError(`Unimplemented ColorSpace object: ${mode}`);
+      }
+    }
 
-  refill() {
-    this.buf1 = this.lexer.getObj();
-    this.buf2 = this.lexer.getObj();
+    throw new _util.FormatError(`Unrecognized ColorSpace object: ${cs}`);
   }
 
-  shift() {
-    if (this.buf2 instanceof _primitives.Cmd && this.buf2.cmd === "ID") {
-      this.buf1 = this.buf2;
-      this.buf2 = null;
-    } else {
-      this.buf1 = this.buf2;
-      this.buf2 = this.lexer.getObj();
+  static isDefaultDecode(decode, numComps) {
+    if (!Array.isArray(decode)) {
+      return true;
     }
-  }
 
-  tryShift() {
-    try {
-      this.shift();
+    if (numComps * 2 !== decode.length) {
+      (0, _util.warn)("The decode map is not the correct length");
       return true;
-    } catch (e) {
-      if (e instanceof _core_utils.MissingDataException) {
-        throw e;
-      }
+    }
 
-      return false;
+    for (let i = 0, ii = decode.length; i < ii; i += 2) {
+      if (decode[i] !== 0 || decode[i + 1] !== 1) {
+        return false;
+      }
     }
-  }
 
-  getObj(cipherTransform = null) {
-    const buf1 = this.buf1;
-    this.shift();
+    return true;
+  }
 
-    if (buf1 instanceof _primitives.Cmd) {
-      switch (buf1.cmd) {
-        case "BI":
-          return this.makeInlineImage(cipherTransform);
-
-        case "[":
-          const array = [];
-
-          while (!(0, _primitives.isCmd)(this.buf1, "]") && !(0, _primitives.isEOF)(this.buf1)) {
-            array.push(this.getObj(cipherTransform));
-          }
-
-          if ((0, _primitives.isEOF)(this.buf1)) {
-            if (!this.recoveryMode) {
-              throw new _util.FormatError("End of file inside array");
-            }
-
-            return array;
-          }
-
-          this.shift();
-          return array;
-
-        case "<<":
-          const dict = new _primitives.Dict(this.xref);
+  static get singletons() {
+    return (0, _util.shadow)(this, "singletons", {
+      get gray() {
+        return (0, _util.shadow)(this, "gray", new DeviceGrayCS());
+      },
 
-          while (!(0, _primitives.isCmd)(this.buf1, ">>") && !(0, _primitives.isEOF)(this.buf1)) {
-            if (!(0, _primitives.isName)(this.buf1)) {
-              (0, _util.info)("Malformed dictionary: key must be a name object");
-              this.shift();
-              continue;
-            }
+      get rgb() {
+        return (0, _util.shadow)(this, "rgb", new DeviceRgbCS());
+      },
 
-            const key = this.buf1.name;
-            this.shift();
+      get cmyk() {
+        return (0, _util.shadow)(this, "cmyk", new DeviceCmykCS());
+      }
 
-            if ((0, _primitives.isEOF)(this.buf1)) {
-              break;
-            }
+    });
+  }
 
-            dict.set(key, this.getObj(cipherTransform));
-          }
+}
 
-          if ((0, _primitives.isEOF)(this.buf1)) {
-            if (!this.recoveryMode) {
-              throw new _util.FormatError("End of file inside dictionary");
-            }
+exports.ColorSpace = ColorSpace;
 
-            return dict;
-          }
+class AlternateCS extends ColorSpace {
+  constructor(numComps, base, tintFn) {
+    super("Alternate", numComps);
+    this.base = base;
+    this.tintFn = tintFn;
+    this.tmpBuf = new Float32Array(base.numComps);
+  }
 
-          if ((0, _primitives.isCmd)(this.buf2, "stream")) {
-            return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
-          }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const tmpBuf = this.tmpBuf;
+    this.tintFn(src, srcOffset, tmpBuf, 0);
+    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
+  }
 
-          this.shift();
-          return dict;
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const tintFn = this.tintFn;
+    const base = this.base;
+    const scale = 1 / ((1 << bits) - 1);
+    const baseNumComps = base.numComps;
+    const usesZeroToOneRange = base.usesZeroToOneRange;
+    const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
+    let pos = isPassthrough ? destOffset : 0;
+    const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
+    const numComps = this.numComps;
+    const scaled = new Float32Array(numComps);
+    const tinted = new Float32Array(baseNumComps);
+    let i, j;
 
-        default:
-          return buf1;
+    for (i = 0; i < count; i++) {
+      for (j = 0; j < numComps; j++) {
+        scaled[j] = src[srcOffset++] * scale;
       }
-    }
 
-    if (Number.isInteger(buf1)) {
-      if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, "R")) {
-        const ref = _primitives.Ref.get(buf1, this.buf1);
+      tintFn(scaled, 0, tinted, 0);
 
-        this.shift();
-        this.shift();
-        return ref;
+      if (usesZeroToOneRange) {
+        for (j = 0; j < baseNumComps; j++) {
+          baseBuf[pos++] = tinted[j] * 255;
+        }
+      } else {
+        base.getRgbItem(tinted, 0, baseBuf, pos);
+        pos += baseNumComps;
       }
-
-      return buf1;
     }
 
-    if (typeof buf1 === "string") {
-      if (cipherTransform) {
-        return cipherTransform.decryptString(buf1);
-      }
-
-      return buf1;
+    if (!isPassthrough) {
+      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
     }
-
-    return buf1;
   }
 
-  findDefaultInlineStreamEnd(stream) {
-    const E = 0x45,
-          I = 0x49,
-          SPACE = 0x20,
-          LF = 0xa,
-          CR = 0xd,
-          NUL = 0x0;
-    const lexer = this.lexer,
-          startPos = stream.pos,
-          n = 10;
-    let state = 0,
-        ch,
-        maybeEIPos;
+  getOutputLength(inputLength, alpha01) {
+    return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
+  }
 
-    while ((ch = stream.getByte()) !== -1) {
-      if (state === 0) {
-        state = ch === E ? 1 : 0;
-      } else if (state === 1) {
-        state = ch === I ? 2 : 0;
-      } else {
-        (0, _util.assert)(state === 2, "findDefaultInlineStreamEnd - invalid state.");
+}
 
-        if (ch === SPACE || ch === LF || ch === CR) {
-          maybeEIPos = stream.pos;
-          const followingBytes = stream.peekBytes(n);
+class PatternCS extends ColorSpace {
+  constructor(baseCS) {
+    super("Pattern", null);
+    this.base = baseCS;
+  }
 
-          for (let i = 0, ii = followingBytes.length; i < ii; i++) {
-            ch = followingBytes[i];
+  isDefaultDecode(decodeMap, bpc) {
+    (0, _util.unreachable)("Should not call PatternCS.isDefaultDecode");
+  }
 
-            if (ch === NUL && followingBytes[i + 1] !== NUL) {
-              continue;
-            }
+}
 
-            if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {
-              state = 0;
-              break;
-            }
-          }
+class IndexedCS extends ColorSpace {
+  constructor(base, highVal, lookup) {
+    super("Indexed", 1);
+    this.base = base;
+    this.highVal = highVal;
+    const length = base.numComps * highVal;
+    this.lookup = new Uint8Array(length);
 
-          if (state !== 2) {
-            continue;
-          }
+    if ((0, _primitives.isStream)(lookup)) {
+      const bytes = lookup.getBytes(length);
+      this.lookup.set(bytes);
+    } else if (typeof lookup === "string") {
+      for (let i = 0; i < length; ++i) {
+        this.lookup[i] = lookup.charCodeAt(i) & 0xff;
+      }
+    } else {
+      throw new _util.FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);
+    }
+  }
 
-          if (lexer.knownCommands) {
-            const nextObj = lexer.peekObj();
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const numComps = this.base.numComps;
+    const start = src[srcOffset] * numComps;
+    this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);
+  }
 
-            if (nextObj instanceof _primitives.Cmd && !lexer.knownCommands[nextObj.cmd]) {
-              state = 0;
-            }
-          } else {
-            (0, _util.warn)("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");
-          }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const base = this.base;
+    const numComps = base.numComps;
+    const outputDelta = base.getOutputLength(numComps, alpha01);
+    const lookup = this.lookup;
 
-          if (state === 2) {
-            break;
-          }
-        } else {
-          state = 0;
-        }
-      }
+    for (let i = 0; i < count; ++i) {
+      const lookupPos = src[srcOffset++] * numComps;
+      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+      destOffset += outputDelta;
     }
+  }
 
-    if (ch === -1) {
-      (0, _util.warn)("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a 
valid EI marker");
+  getOutputLength(inputLength, alpha01) {
+    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
+  }
 
-      if (maybeEIPos) {
-        (0, _util.warn)('... trying to recover by using the last "EI" occurrence.');
-        stream.skip(-(stream.pos - maybeEIPos));
-      }
+  isDefaultDecode(decodeMap, bpc) {
+    if (!Array.isArray(decodeMap)) {
+      return true;
     }
 
-    let endOffset = 4;
-    stream.skip(-endOffset);
-    ch = stream.peekByte();
-    stream.skip(endOffset);
+    if (decodeMap.length !== 2) {
+      (0, _util.warn)("Decode map length is not correct");
+      return true;
+    }
 
-    if (!(0, _core_utils.isWhiteSpace)(ch)) {
-      endOffset--;
+    if (!Number.isInteger(bpc) || bpc < 1) {
+      (0, _util.warn)("Bits per component is not correct");
+      return true;
     }
 
-    return stream.pos - endOffset - startPos;
+    return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1;
   }
 
-  findDCTDecodeInlineStreamEnd(stream) {
-    const startPos = stream.pos;
-    let foundEOI = false,
-        b,
-        markerLength;
+}
 
-    while ((b = stream.getByte()) !== -1) {
-      if (b !== 0xff) {
-        continue;
-      }
+class DeviceGrayCS extends ColorSpace {
+  constructor() {
+    super("DeviceGray", 1);
+  }
 
-      switch (stream.getByte()) {
-        case 0x00:
-          break;
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const c = src[srcOffset] * 255;
+    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+  }
 
-        case 0xff:
-          stream.skip(-1);
-          break;
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const scale = 255 / ((1 << bits) - 1);
+    let j = srcOffset,
+        q = destOffset;
 
-        case 0xd9:
-          foundEOI = true;
-          break;
+    for (let i = 0; i < count; ++i) {
+      const c = scale * src[j++];
+      dest[q++] = c;
+      dest[q++] = c;
+      dest[q++] = c;
+      q += alpha01;
+    }
+  }
 
-        case 0xc0:
-        case 0xc1:
-        case 0xc2:
-        case 0xc3:
-        case 0xc5:
-        case 0xc6:
-        case 0xc7:
-        case 0xc9:
-        case 0xca:
-        case 0xcb:
-        case 0xcd:
-        case 0xce:
-        case 0xcf:
-        case 0xc4:
-        case 0xcc:
-        case 0xda:
-        case 0xdb:
-        case 0xdc:
-        case 0xdd:
-        case 0xde:
-        case 0xdf:
-        case 0xe0:
-        case 0xe1:
-        case 0xe2:
-        case 0xe3:
-        case 0xe4:
-        case 0xe5:
-        case 0xe6:
-        case 0xe7:
-        case 0xe8:
-        case 0xe9:
-        case 0xea:
-        case 0xeb:
-        case 0xec:
-        case 0xed:
-        case 0xee:
-        case 0xef:
-        case 0xfe:
-          markerLength = stream.getUint16();
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01);
+  }
 
-          if (markerLength > 2) {
-            stream.skip(markerLength - 2);
-          } else {
-            stream.skip(-2);
-          }
+}
 
-          break;
-      }
+class DeviceRgbCS extends ColorSpace {
+  constructor() {
+    super("DeviceRGB", 3);
+  }
 
-      if (foundEOI) {
-        break;
-      }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    dest[destOffset] = src[srcOffset] * 255;
+    dest[destOffset + 1] = src[srcOffset + 1] * 255;
+    dest[destOffset + 2] = src[srcOffset + 2] * 255;
+  }
+
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    if (bits === 8 && alpha01 === 0) {
+      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+      return;
     }
 
-    const length = stream.pos - startPos;
+    const scale = 255 / ((1 << bits) - 1);
+    let j = srcOffset,
+        q = destOffset;
 
-    if (b === -1) {
-      (0, _util.warn)("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ 
instead.");
-      stream.skip(-length);
-      return this.findDefaultInlineStreamEnd(stream);
+    for (let i = 0; i < count; ++i) {
+      dest[q++] = scale * src[j++];
+      dest[q++] = scale * src[j++];
+      dest[q++] = scale * src[j++];
+      q += alpha01;
     }
-
-    this.inlineStreamSkipEI(stream);
-    return length;
   }
 
-  findASCII85DecodeInlineStreamEnd(stream) {
-    const TILDE = 0x7e,
-          GT = 0x3e;
-    const startPos = stream.pos;
-    let ch;
-
-    while ((ch = stream.getByte()) !== -1) {
-      if (ch === TILDE) {
-        const tildePos = stream.pos;
-        ch = stream.peekByte();
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01) / 3 | 0;
+  }
 
-        while ((0, _core_utils.isWhiteSpace)(ch)) {
-          stream.skip();
-          ch = stream.peekByte();
-        }
+  isPassthrough(bits) {
+    return bits === 8;
+  }
 
-        if (ch === GT) {
-          stream.skip();
-          break;
-        }
+}
 
-        if (stream.pos > tildePos) {
-          const maybeEI = stream.peekBytes(2);
+const DeviceCmykCS = function DeviceCmykCSClosure() {
+  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
+    const c = src[srcOffset] * srcScale;
+    const m = src[srcOffset + 1] * srcScale;
+    const y = src[srcOffset + 2] * srcScale;
+    const k = src[srcOffset + 3] * srcScale;
+    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 
212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + 
-17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 
17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
+    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y 
+ 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 
131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 
24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
+    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y 
- 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 
50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + 
-193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
+  }
 
-          if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) {
-            break;
-          }
-        }
-      }
+  class DeviceCmykCS extends ColorSpace {
+    constructor() {
+      super("DeviceCMYK", 4);
     }
 
-    const length = stream.pos - startPos;
-
-    if (ch === -1) {
-      (0, _util.warn)("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ 
instead.");
-      stream.skip(-length);
-      return this.findDefaultInlineStreamEnd(stream);
+    getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(src, srcOffset, 1, dest, destOffset);
     }
 
-    this.inlineStreamSkipEI(stream);
-    return length;
-  }
-
-  findASCIIHexDecodeInlineStreamEnd(stream) {
-    const GT = 0x3e;
-    const startPos = stream.pos;
-    let ch;
+    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      const scale = 1 / ((1 << bits) - 1);
 
-    while ((ch = stream.getByte()) !== -1) {
-      if (ch === GT) {
-        break;
+      for (let i = 0; i < count; i++) {
+        convertToRgb(src, srcOffset, scale, dest, destOffset);
+        srcOffset += 4;
+        destOffset += 3 + alpha01;
       }
     }
 
-    const length = stream.pos - startPos;
-
-    if (ch === -1) {
-      (0, _util.warn)("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ 
instead.");
-      stream.skip(-length);
-      return this.findDefaultInlineStreamEnd(stream);
+    getOutputLength(inputLength, alpha01) {
+      return inputLength / 4 * (3 + alpha01) | 0;
     }
 
-    this.inlineStreamSkipEI(stream);
-    return length;
   }
 
-  inlineStreamSkipEI(stream) {
-    const E = 0x45,
-          I = 0x49;
-    let state = 0,
-        ch;
+  return DeviceCmykCS;
+}();
 
-    while ((ch = stream.getByte()) !== -1) {
-      if (state === 0) {
-        state = ch === E ? 1 : 0;
-      } else if (state === 1) {
-        state = ch === I ? 2 : 0;
-      } else if (state === 2) {
-        break;
-      }
-    }
+const CalGrayCS = function CalGrayCSClosure() {
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    const A = src[srcOffset] * scale;
+    const AG = A ** cs.G;
+    const L = cs.YW * AG;
+    const val = Math.max(295.8 * L ** 0.333333333333333333 - 40.8, 0);
+    dest[destOffset] = val;
+    dest[destOffset + 1] = val;
+    dest[destOffset + 2] = val;
   }
 
-  makeInlineImage(cipherTransform) {
-    const lexer = this.lexer;
-    const stream = lexer.stream;
-    const dict = new _primitives.Dict(this.xref);
-    let dictLength;
+  class CalGrayCS extends ColorSpace {
+    constructor(whitePoint, blackPoint, gamma) {
+      super("CalGray", 1);
 
-    while (!(0, _primitives.isCmd)(this.buf1, "ID") && !(0, _primitives.isEOF)(this.buf1)) {
-      if (!(0, _primitives.isName)(this.buf1)) {
-        throw new _util.FormatError("Dictionary key must be a name object");
+      if (!whitePoint) {
+        throw new _util.FormatError("WhitePoint missing - required for color space CalGray");
       }
 
-      const key = this.buf1.name;
-      this.shift();
+      blackPoint = blackPoint || [0, 0, 0];
+      gamma = gamma || 1;
+      this.XW = whitePoint[0];
+      this.YW = whitePoint[1];
+      this.ZW = whitePoint[2];
+      this.XB = blackPoint[0];
+      this.YB = blackPoint[1];
+      this.ZB = blackPoint[2];
+      this.G = gamma;
 
-      if ((0, _primitives.isEOF)(this.buf1)) {
-        break;
+      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback 
available");
       }
 
-      dict.set(key, this.getObj(cipherTransform));
+      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+        (0, _util.info)(`Invalid BlackPoint for ${this.name}, falling back to default.`);
+        this.XB = this.YB = this.ZB = 0;
+      }
+
+      if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
+        (0, _util.warn)(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only 
default values are supported.`);
+      }
+
+      if (this.G < 1) {
+        (0, _util.info)(`Invalid Gamma: ${this.G} for ${this.name}, ` + "falling back to default.");
+        this.G = 1;
+      }
     }
 
-    if (lexer.beginInlineImagePos !== -1) {
-      dictLength = stream.pos - lexer.beginInlineImagePos;
+    getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
     }
 
-    const filter = dict.get("Filter", "F");
-    let filterName;
-
-    if ((0, _primitives.isName)(filter)) {
-      filterName = filter.name;
-    } else if (Array.isArray(filter)) {
-      const filterZero = this.xref.fetchIfRef(filter[0]);
+    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      const scale = 1 / ((1 << bits) - 1);
 
-      if ((0, _primitives.isName)(filterZero)) {
-        filterName = filterZero.name;
+      for (let i = 0; i < count; ++i) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+        srcOffset += 1;
+        destOffset += 3 + alpha01;
       }
     }
 
-    const startPos = stream.pos;
-    let length;
+    getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01);
+    }
 
-    if (filterName === "DCTDecode" || filterName === "DCT") {
-      length = this.findDCTDecodeInlineStreamEnd(stream);
-    } else if (filterName === "ASCII85Decode" || filterName === "A85") {
-      length = this.findASCII85DecodeInlineStreamEnd(stream);
-    } else if (filterName === "ASCIIHexDecode" || filterName === "AHx") {
-      length = this.findASCIIHexDecodeInlineStreamEnd(stream);
-    } else {
-      length = this.findDefaultInlineStreamEnd(stream);
+  }
+
+  return CalGrayCS;
+}();
+
+const CalRGBCS = function CalRGBCSClosure() {
+  const BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, 
-0.0685, 1.0296]);
+  const BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 
0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
+  const SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 
1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
+  const FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
+  const tempNormalizeMatrix = new Float32Array(3);
+  const tempConvertMatrix1 = new Float32Array(3);
+  const tempConvertMatrix2 = new Float32Array(3);
+  const DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;
+
+  function matrixProduct(a, b, result) {
+    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
+    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
+  }
+
+  function convertToFlat(sourceWhitePoint, LMS, result) {
+    result[0] = LMS[0] * 1 / sourceWhitePoint[0];
+    result[1] = LMS[1] * 1 / sourceWhitePoint[1];
+    result[2] = LMS[2] * 1 / sourceWhitePoint[2];
+  }
+
+  function convertToD65(sourceWhitePoint, LMS, result) {
+    const D65X = 0.95047;
+    const D65Y = 1;
+    const D65Z = 1.08883;
+    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
+    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
+    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
+  }
+
+  function sRGBTransferFunction(color) {
+    if (color <= 0.0031308) {
+      return adjustToRange(0, 1, 12.92 * color);
     }
 
-    let imageStream = stream.makeSubStream(startPos, length, dict);
-    let cacheKey;
+    if (color >= 0.99554525) {
+      return 1;
+    }
 
-    if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {
-      const imageBytes = imageStream.getBytes();
-      imageStream.reset();
-      const initialStreamPos = stream.pos;
-      stream.pos = lexer.beginInlineImagePos;
-      const dictBytes = stream.getBytes(dictLength);
-      stream.pos = initialStreamPos;
-      cacheKey = computeAdler32(imageBytes) + "_" + computeAdler32(dictBytes);
-      const cacheEntry = this.imageCache[cacheKey];
+    return adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055);
+  }
 
-      if (cacheEntry !== undefined) {
-        this.buf2 = _primitives.Cmd.get("EI");
-        this.shift();
-        cacheEntry.reset();
-        return cacheEntry;
-      }
+  function adjustToRange(min, max, value) {
+    return Math.max(min, Math.min(max, value));
+  }
+
+  function decodeL(L) {
+    if (L < 0) {
+      return -decodeL(-L);
     }
 
-    if (cipherTransform) {
-      imageStream = cipherTransform.createStream(imageStream, length);
+    if (L > 8.0) {
+      return ((L + 16) / 116) ** 3;
     }
 
-    imageStream = this.filter(imageStream, dict, length);
-    imageStream.dict = dict;
+    return L * DECODE_L_CONSTANT;
+  }
 
-    if (cacheKey !== undefined) {
-      imageStream.cacheKey = `inline_${length}_${cacheKey}`;
-      this.imageCache[cacheKey] = imageStream;
+  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
+    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
+      result[0] = XYZ_Flat[0];
+      result[1] = XYZ_Flat[1];
+      result[2] = XYZ_Flat[2];
+      return;
     }
 
-    this.buf2 = _primitives.Cmd.get("EI");
-    this.shift();
-    return imageStream;
+    const zeroDecodeL = decodeL(0);
+    const X_DST = zeroDecodeL;
+    const X_SRC = decodeL(sourceBlackPoint[0]);
+    const Y_DST = zeroDecodeL;
+    const Y_SRC = decodeL(sourceBlackPoint[1]);
+    const Z_DST = zeroDecodeL;
+    const Z_SRC = decodeL(sourceBlackPoint[2]);
+    const X_Scale = (1 - X_DST) / (1 - X_SRC);
+    const X_Offset = 1 - X_Scale;
+    const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
+    const Y_Offset = 1 - Y_Scale;
+    const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
+    const Z_Offset = 1 - Z_Scale;
+    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
+    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
+    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
   }
 
-  _findStreamLength(startPos, signature) {
-    const {
-      stream
-    } = this.lexer;
-    stream.pos = startPos;
-    const SCAN_BLOCK_LENGTH = 2048;
-    const signatureLength = signature.length;
+  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
+    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
+      result[0] = XYZ_In[0];
+      result[1] = XYZ_In[1];
+      result[2] = XYZ_In[2];
+      return;
+    }
 
-    while (stream.pos < stream.end) {
-      const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
-      const scanLength = scanBytes.length - signatureLength;
+    const LMS = result;
+    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    const LMS_Flat = tempNormalizeMatrix;
+    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
+    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
+  }
 
-      if (scanLength <= 0) {
-        break;
-      }
+  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
+    const LMS = result;
+    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    const LMS_D65 = tempNormalizeMatrix;
+    convertToD65(sourceWhitePoint, LMS, LMS_D65);
+    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
+  }
 
-      let pos = 0;
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    const A = adjustToRange(0, 1, src[srcOffset] * scale);
+    const B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
+    const C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
+    const AGR = A === 1 ? 1 : A ** cs.GR;
+    const BGG = B === 1 ? 1 : B ** cs.GG;
+    const CGB = C === 1 ? 1 : C ** cs.GB;
+    const X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
+    const Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
+    const Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
+    const XYZ = tempConvertMatrix1;
+    XYZ[0] = X;
+    XYZ[1] = Y;
+    XYZ[2] = Z;
+    const XYZ_Flat = tempConvertMatrix2;
+    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
+    const XYZ_Black = tempConvertMatrix1;
+    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
+    const XYZ_D65 = tempConvertMatrix2;
+    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
+    const SRGB = tempConvertMatrix1;
+    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
+    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;
+    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;
+    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;
+  }
 
-      while (pos < scanLength) {
-        let j = 0;
+  class CalRGBCS extends ColorSpace {
+    constructor(whitePoint, blackPoint, gamma, matrix) {
+      super("CalRGB", 3);
 
-        while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
-          j++;
-        }
+      if (!whitePoint) {
+        throw new _util.FormatError("WhitePoint missing - required for color space CalRGB");
+      }
 
-        if (j >= signatureLength) {
-          stream.pos += pos;
-          return stream.pos - startPos;
-        }
+      blackPoint = blackPoint || new Float32Array(3);
+      gamma = gamma || new Float32Array([1, 1, 1]);
+      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
+      const XW = whitePoint[0];
+      const YW = whitePoint[1];
+      const ZW = whitePoint[2];
+      this.whitePoint = whitePoint;
+      const XB = blackPoint[0];
+      const YB = blackPoint[1];
+      const ZB = blackPoint[2];
+      this.blackPoint = blackPoint;
+      this.GR = gamma[0];
+      this.GG = gamma[1];
+      this.GB = gamma[2];
+      this.MXA = matrix[0];
+      this.MYA = matrix[1];
+      this.MZA = matrix[2];
+      this.MXB = matrix[3];
+      this.MYB = matrix[4];
+      this.MZB = matrix[5];
+      this.MXC = matrix[6];
+      this.MYC = matrix[7];
+      this.MZC = matrix[8];
 
-        pos++;
+      if (XW < 0 || ZW < 0 || YW !== 1) {
+        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback 
available");
       }
 
-      stream.pos += scanLength;
+      if (XB < 0 || YB < 0 || ZB < 0) {
+        (0, _util.info)(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to 
default.");
+        this.blackPoint = new Float32Array(3);
+      }
+
+      if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
+        (0, _util.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling 
back to default.`);
+        this.GR = this.GG = this.GB = 1;
+      }
     }
 
-    return -1;
-  }
+    getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+    }
 
-  makeStream(dict, cipherTransform) {
-    const lexer = this.lexer;
-    let stream = lexer.stream;
-    lexer.skipToNextLine();
-    const startPos = stream.pos - 1;
-    let length = dict.get("Length");
+    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      const scale = 1 / ((1 << bits) - 1);
 
-    if (!Number.isInteger(length)) {
-      (0, _util.info)(`Bad length "${length}" in stream`);
-      length = 0;
+      for (let i = 0; i < count; ++i) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+        srcOffset += 3;
+        destOffset += 3 + alpha01;
+      }
     }
 
-    stream.pos = startPos + length;
-    lexer.nextChar();
+    getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01) / 3 | 0;
+    }
 
-    if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, "endstream")) {
-      this.shift();
-    } else {
-      const ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]);
+  }
 
-      let actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE);
+  return CalRGBCS;
+}();
 
-      if (actualLength < 0) {
-        const MAX_TRUNCATION = 1;
+const LabCS = function LabCSClosure() {
+  function fn_g(x) {
+    let result;
 
-        for (let i = 1; i <= MAX_TRUNCATION; i++) {
-          const end = ENDSTREAM_SIGNATURE.length - i;
-          const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);
+    if (x >= 6 / 29) {
+      result = x ** 3;
+    } else {
+      result = 108 / 841 * (x - 4 / 29);
+    }
 
-          const maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE);
+    return result;
+  }
 
-          if (maybeLength >= 0) {
-            const lastByte = stream.peekBytes(end + 1)[end];
+  function decode(value, high1, low2, high2) {
+    return low2 + value * (high2 - low2) / high1;
+  }
 
-            if (!(0, _core_utils.isWhiteSpace)(lastByte)) {
-              break;
-            }
+  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
+    let Ls = src[srcOffset];
+    let as = src[srcOffset + 1];
+    let bs = src[srcOffset + 2];
 
-            (0, _util.info)(`Found "${(0, _util.bytesToString)(TRUNCATED_SIGNATURE)}" when ` + "searching 
for endstream command.");
-            actualLength = maybeLength;
-            break;
-          }
-        }
+    if (maxVal !== false) {
+      Ls = decode(Ls, maxVal, 0, 100);
+      as = decode(as, maxVal, cs.amin, cs.amax);
+      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+    }
 
-        if (actualLength < 0) {
-          throw new _util.FormatError("Missing endstream command.");
-        }
-      }
+    if (as > cs.amax) {
+      as = cs.amax;
+    } else if (as < cs.amin) {
+      as = cs.amin;
+    }
 
-      length = actualLength;
-      lexer.nextChar();
-      this.shift();
-      this.shift();
+    if (bs > cs.bmax) {
+      bs = cs.bmax;
+    } else if (bs < cs.bmin) {
+      bs = cs.bmin;
     }
 
-    this.shift();
-    stream = stream.makeSubStream(startPos, length, dict);
+    const M = (Ls + 16) / 116;
+    const L = M + as / 500;
+    const N = M - bs / 200;
+    const X = cs.XW * fn_g(L);
+    const Y = cs.YW * fn_g(M);
+    const Z = cs.ZW * fn_g(N);
+    let r, g, b;
 
-    if (cipherTransform) {
-      stream = cipherTransform.createStream(stream, length);
+    if (cs.ZW < 1) {
+      r = X * 3.1339 + Y * -1.617 + Z * -0.4906;
+      g = X * -0.9785 + Y * 1.916 + Z * 0.0333;
+      b = X * 0.072 + Y * -0.229 + Z * 1.4057;
+    } else {
+      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+      b = X * 0.0557 + Y * -0.204 + Z * 1.057;
     }
 
-    stream = this.filter(stream, dict, length);
-    stream.dict = dict;
-    return stream;
+    dest[destOffset] = Math.sqrt(r) * 255;
+    dest[destOffset + 1] = Math.sqrt(g) * 255;
+    dest[destOffset + 2] = Math.sqrt(b) * 255;
   }
 
-  filter(stream, dict, length) {
-    let filter = dict.get("Filter", "F");
-    let params = dict.get("DecodeParms", "DP");
+  class LabCS extends ColorSpace {
+    constructor(whitePoint, blackPoint, range) {
+      super("Lab", 3);
 
-    if ((0, _primitives.isName)(filter)) {
-      if (Array.isArray(params)) {
-        (0, _util.warn)("/DecodeParms should not contain an Array, " + "when /Filter contains a Name.");
+      if (!whitePoint) {
+        throw new _util.FormatError("WhitePoint missing - required for color space Lab");
       }
 
-      return this.makeFilter(stream, filter.name, length, params);
-    }
-
-    let maybeLength = length;
+      blackPoint = blackPoint || [0, 0, 0];
+      range = range || [-100, 100, -100, 100];
+      this.XW = whitePoint[0];
+      this.YW = whitePoint[1];
+      this.ZW = whitePoint[2];
+      this.amin = range[0];
+      this.amax = range[1];
+      this.bmin = range[2];
+      this.bmax = range[3];
+      this.XB = blackPoint[0];
+      this.YB = blackPoint[1];
+      this.ZB = blackPoint[2];
 
-    if (Array.isArray(filter)) {
-      const filterArray = filter;
-      const paramsArray = params;
+      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+        throw new _util.FormatError("Invalid WhitePoint components, no fallback available");
+      }
 
-      for (let i = 0, ii = filterArray.length; i < ii; ++i) {
-        filter = this.xref.fetchIfRef(filterArray[i]);
+      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+        (0, _util.info)("Invalid BlackPoint, falling back to default");
+        this.XB = this.YB = this.ZB = 0;
+      }
 
-        if (!(0, _primitives.isName)(filter)) {
-          throw new _util.FormatError(`Bad filter name "${filter}"`);
-        }
+      if (this.amin > this.amax || this.bmin > this.bmax) {
+        (0, _util.info)("Invalid Range, falling back to defaults");
+        this.amin = -100;
+        this.amax = 100;
+        this.bmin = -100;
+        this.bmax = 100;
+      }
+    }
 
-        params = null;
+    getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(this, src, srcOffset, false, dest, destOffset);
+    }
 
-        if (Array.isArray(paramsArray) && i in paramsArray) {
-          params = this.xref.fetchIfRef(paramsArray[i]);
-        }
+    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      const maxVal = (1 << bits) - 1;
 
-        stream = this.makeFilter(stream, filter.name, maybeLength, params);
-        maybeLength = null;
+      for (let i = 0; i < count; i++) {
+        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
+        srcOffset += 3;
+        destOffset += 3 + alpha01;
       }
     }
 
-    return stream;
-  }
+    getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01) / 3 | 0;
+    }
 
-  makeFilter(stream, name, maybeLength, params) {
-    if (maybeLength === 0) {
-      (0, _util.warn)(`Empty "${name}" stream.`);
-      return new _stream.NullStream();
+    isDefaultDecode(decodeMap, bpc) {
+      return true;
     }
 
-    try {
-      const xrefStreamStats = this.xref.stats.streamTypes;
+    get usesZeroToOneRange() {
+      return (0, _util.shadow)(this, "usesZeroToOneRange", false);
+    }
 
-      if (name === "FlateDecode" || name === "Fl") {
-        xrefStreamStats[_util.StreamType.FLATE] = true;
+  }
 
-        if (params) {
-          return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, 
params);
-        }
+  return LabCS;
+}();
 
-        return new _stream.FlateStream(stream, maybeLength);
-      }
+/***/ }),
+/* 15 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      if (name === "LZWDecode" || name === "LZW") {
-        xrefStreamStats[_util.StreamType.LZW] = true;
-        let earlyChange = 1;
 
-        if (params) {
-          if (params.has("EarlyChange")) {
-            earlyChange = params.get("EarlyChange");
-          }
 
-          return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), 
maybeLength, params);
-        }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PartialEvaluator = exports.EvaluatorPreprocessor = void 0;
 
-        return new _stream.LZWStream(stream, maybeLength, earlyChange);
-      }
+var _util = __w_pdfjs_require__(2);
 
-      if (name === "DCTDecode" || name === "DCT") {
-        xrefStreamStats[_util.StreamType.DCT] = true;
-        return new _jpeg_stream.JpegStream(stream, maybeLength, stream.dict, params);
-      }
+var _cmap = __w_pdfjs_require__(16);
 
-      if (name === "JPXDecode" || name === "JPX") {
-        xrefStreamStats[_util.StreamType.JPX] = true;
-        return new _jpx_stream.JpxStream(stream, maybeLength, stream.dict, params);
-      }
+var _primitives = __w_pdfjs_require__(5);
 
-      if (name === "ASCII85Decode" || name === "A85") {
-        xrefStreamStats[_util.StreamType.A85] = true;
-        return new _stream.Ascii85Stream(stream, maybeLength);
-      }
+var _fonts = __w_pdfjs_require__(34);
 
-      if (name === "ASCIIHexDecode" || name === "AHx") {
-        xrefStreamStats[_util.StreamType.AHX] = true;
-        return new _stream.AsciiHexStream(stream, maybeLength);
-      }
+var _fonts_utils = __w_pdfjs_require__(38);
 
-      if (name === "CCITTFaxDecode" || name === "CCF") {
-        xrefStreamStats[_util.StreamType.CCF] = true;
-        return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params);
-      }
+var _encodings = __w_pdfjs_require__(37);
 
-      if (name === "RunLengthDecode" || name === "RL") {
-        xrefStreamStats[_util.StreamType.RLX] = true;
-        return new _stream.RunLengthStream(stream, maybeLength);
-      }
+var _standard_fonts = __w_pdfjs_require__(41);
 
-      if (name === "JBIG2Decode") {
-        xrefStreamStats[_util.StreamType.JBIG] = true;
-        return new _jbig2_stream.Jbig2Stream(stream, maybeLength, stream.dict, params);
-      }
+var _unicode = __w_pdfjs_require__(40);
 
-      (0, _util.warn)(`Filter "${name}" is not supported.`);
-      return stream;
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+var _pattern = __w_pdfjs_require__(49);
 
-      (0, _util.warn)(`Invalid stream: "${ex}"`);
-      return new _stream.NullStream();
-    }
-  }
+var _to_unicode_map = __w_pdfjs_require__(42);
 
-}
+var _function = __w_pdfjs_require__(50);
 
-exports.Parser = Parser;
-const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+var _parser = __w_pdfjs_require__(17);
 
-function toHexDigit(ch) {
-  if (ch >= 0x30 && ch <= 0x39) {
-    return ch & 0x0f;
-  }
+var _image_utils = __w_pdfjs_require__(52);
 
-  if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
-    return (ch & 0x0f) + 9;
-  }
+var _stream = __w_pdfjs_require__(10);
 
-  return -1;
-}
+var _bidi = __w_pdfjs_require__(53);
 
-class Lexer {
-  constructor(stream, knownCommands = null) {
-    this.stream = stream;
-    this.nextChar();
-    this.strBuf = [];
-    this.knownCommands = knownCommands;
-    this._hexStringNumWarn = 0;
-    this.beginInlineImagePos = -1;
-  }
+var _colorspace = __w_pdfjs_require__(14);
 
-  nextChar() {
-    return this.currentChar = this.stream.getByte();
-  }
-
-  peekChar() {
-    return this.stream.peekByte();
-  }
-
-  getNumber() {
-    let ch = this.currentChar;
-    let eNotation = false;
-    let divideBy = 0;
-    let sign = 0;
-
-    if (ch === 0x2d) {
-      sign = -1;
-      ch = this.nextChar();
-
-      if (ch === 0x2d) {
-        ch = this.nextChar();
-      }
-    } else if (ch === 0x2b) {
-      sign = 1;
-      ch = this.nextChar();
-    }
+var _decode_stream = __w_pdfjs_require__(19);
 
-    if (ch === 0x0a || ch === 0x0d) {
-      do {
-        ch = this.nextChar();
-      } while (ch === 0x0a || ch === 0x0d);
-    }
+var _glyphlist = __w_pdfjs_require__(39);
 
-    if (ch === 0x2e) {
-      divideBy = 10;
-      ch = this.nextChar();
-    }
+var _core_utils = __w_pdfjs_require__(9);
 
-    if (ch < 0x30 || ch > 0x39) {
-      if (divideBy === 10 && sign === 0 && ((0, _core_utils.isWhiteSpace)(ch) || ch === -1)) {
-        (0, _util.warn)("Lexer.getNumber - treating a single decimal point as zero.");
-        return 0;
-      }
+var _metrics = __w_pdfjs_require__(54);
 
-      throw new _util.FormatError(`Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`);
-    }
+var _xfa_fonts = __w_pdfjs_require__(55);
 
-    sign = sign || 1;
-    let baseValue = ch - 0x30;
-    let powerValue = 0;
-    let powerValueSign = 1;
+var _murmurhash = __w_pdfjs_require__(61);
 
-    while ((ch = this.nextChar()) >= 0) {
-      if (ch >= 0x30 && ch <= 0x39) {
-        const currentDigit = ch - 0x30;
+var _operator_list = __w_pdfjs_require__(62);
 
-        if (eNotation) {
-          powerValue = powerValue * 10 + currentDigit;
-        } else {
-          if (divideBy !== 0) {
-            divideBy *= 10;
-          }
+var _image = __w_pdfjs_require__(63);
 
-          baseValue = baseValue * 10 + currentDigit;
-        }
-      } else if (ch === 0x2e) {
-        if (divideBy === 0) {
-          divideBy = 1;
-        } else {
-          break;
-        }
-      } else if (ch === 0x2d) {
-        (0, _util.warn)("Badly formatted number: minus sign in the middle");
-      } else if (ch === 0x45 || ch === 0x65) {
-        ch = this.peekChar();
+const DefaultPartialEvaluatorOptions = Object.freeze({
+  maxImageSize: -1,
+  disableFontFace: false,
+  ignoreErrors: false,
+  isEvalSupported: true,
+  fontExtraProperties: false,
+  useSystemFonts: true,
+  cMapUrl: null,
+  standardFontDataUrl: null
+});
+const PatternType = {
+  TILING: 1,
+  SHADING: 2
+};
+const deferred = Promise.resolve();
 
-        if (ch === 0x2b || ch === 0x2d) {
-          powerValueSign = ch === 0x2d ? -1 : 1;
-          this.nextChar();
-        } else if (ch < 0x30 || ch > 0x39) {
-          break;
-        }
+function normalizeBlendMode(value, parsingArray = false) {
+  if (Array.isArray(value)) {
+    for (let i = 0, ii = value.length; i < ii; i++) {
+      const maybeBM = normalizeBlendMode(value[i], true);
 
-        eNotation = true;
-      } else {
-        break;
+      if (maybeBM) {
+        return maybeBM;
       }
     }
 
-    if (divideBy !== 0) {
-      baseValue /= divideBy;
-    }
+    (0, _util.warn)(`Unsupported blend mode Array: ${value}`);
+    return "source-over";
+  }
 
-    if (eNotation) {
-      baseValue *= 10 ** (powerValueSign * powerValue);
+  if (!(0, _primitives.isName)(value)) {
+    if (parsingArray) {
+      return null;
     }
 
-    return sign * baseValue;
+    return "source-over";
   }
 
-  getString() {
-    let numParen = 1;
-    let done = false;
-    const strBuf = this.strBuf;
-    strBuf.length = 0;
-    let ch = this.nextChar();
+  switch (value.name) {
+    case "Normal":
+    case "Compatible":
+      return "source-over";
 
-    while (true) {
-      let charBuffered = false;
+    case "Multiply":
+      return "multiply";
 
-      switch (ch | 0) {
-        case -1:
-          (0, _util.warn)("Unterminated string");
-          done = true;
-          break;
+    case "Screen":
+      return "screen";
 
-        case 0x28:
-          ++numParen;
-          strBuf.push("(");
-          break;
+    case "Overlay":
+      return "overlay";
 
-        case 0x29:
-          if (--numParen === 0) {
-            this.nextChar();
-            done = true;
-          } else {
-            strBuf.push(")");
-          }
+    case "Darken":
+      return "darken";
 
-          break;
+    case "Lighten":
+      return "lighten";
 
-        case 0x5c:
-          ch = this.nextChar();
+    case "ColorDodge":
+      return "color-dodge";
 
-          switch (ch) {
-            case -1:
-              (0, _util.warn)("Unterminated string");
-              done = true;
-              break;
+    case "ColorBurn":
+      return "color-burn";
 
-            case 0x6e:
-              strBuf.push("\n");
-              break;
+    case "HardLight":
+      return "hard-light";
 
-            case 0x72:
-              strBuf.push("\r");
-              break;
+    case "SoftLight":
+      return "soft-light";
 
-            case 0x74:
-              strBuf.push("\t");
-              break;
+    case "Difference":
+      return "difference";
 
-            case 0x62:
-              strBuf.push("\b");
-              break;
+    case "Exclusion":
+      return "exclusion";
 
-            case 0x66:
-              strBuf.push("\f");
-              break;
+    case "Hue":
+      return "hue";
 
-            case 0x5c:
-            case 0x28:
-            case 0x29:
-              strBuf.push(String.fromCharCode(ch));
-              break;
+    case "Saturation":
+      return "saturation";
 
-            case 0x30:
-            case 0x31:
-            case 0x32:
-            case 0x33:
-            case 0x34:
-            case 0x35:
-            case 0x36:
-            case 0x37:
-              let x = ch & 0x0f;
-              ch = this.nextChar();
-              charBuffered = true;
+    case "Color":
+      return "color";
 
-              if (ch >= 0x30 && ch <= 0x37) {
-                x = (x << 3) + (ch & 0x0f);
-                ch = this.nextChar();
+    case "Luminosity":
+      return "luminosity";
+  }
 
-                if (ch >= 0x30 && ch <= 0x37) {
-                  charBuffered = false;
-                  x = (x << 3) + (ch & 0x0f);
-                }
-              }
+  if (parsingArray) {
+    return null;
+  }
 
-              strBuf.push(String.fromCharCode(x));
-              break;
+  (0, _util.warn)(`Unsupported blend mode: ${value.name}`);
+  return "source-over";
+}
 
-            case 0x0d:
-              if (this.peekChar() === 0x0a) {
-                this.nextChar();
-              }
+class TimeSlotManager {
+  static get TIME_SLOT_DURATION_MS() {
+    return (0, _util.shadow)(this, "TIME_SLOT_DURATION_MS", 20);
+  }
 
-              break;
+  static get CHECK_TIME_EVERY() {
+    return (0, _util.shadow)(this, "CHECK_TIME_EVERY", 100);
+  }
 
-            case 0x0a:
-              break;
+  constructor() {
+    this.reset();
+  }
 
-            default:
-              strBuf.push(String.fromCharCode(ch));
-              break;
-          }
+  check() {
+    if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {
+      return false;
+    }
 
-          break;
+    this.checked = 0;
+    return this.endTime <= Date.now();
+  }
 
-        default:
-          strBuf.push(String.fromCharCode(ch));
-          break;
-      }
+  reset() {
+    this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;
+    this.checked = 0;
+  }
 
-      if (done) {
-        break;
-      }
+}
 
-      if (!charBuffered) {
-        ch = this.nextChar();
-      }
-    }
+class PartialEvaluator {
+  constructor({
+    xref,
+    handler,
+    pageIndex,
+    idFactory,
+    fontCache,
+    builtInCMapCache,
+    standardFontDataCache,
+    globalImageCache,
+    options = null
+  }) {
+    this.xref = xref;
+    this.handler = handler;
+    this.pageIndex = pageIndex;
+    this.idFactory = idFactory;
+    this.fontCache = fontCache;
+    this.builtInCMapCache = builtInCMapCache;
+    this.standardFontDataCache = standardFontDataCache;
+    this.globalImageCache = globalImageCache;
+    this.options = options || DefaultPartialEvaluatorOptions;
+    this.parsingType3Font = false;
+    this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);
+  }
 
-    return strBuf.join("");
+  get _pdfFunctionFactory() {
+    const pdfFunctionFactory = new _function.PDFFunctionFactory({
+      xref: this.xref,
+      isEvalSupported: this.options.isEvalSupported
+    });
+    return (0, _util.shadow)(this, "_pdfFunctionFactory", pdfFunctionFactory);
   }
 
-  getName() {
-    let ch, previousCh;
-    const strBuf = this.strBuf;
-    strBuf.length = 0;
+  clone(newOptions = null) {
+    const newEvaluator = Object.create(this);
+    newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions);
+    return newEvaluator;
+  }
 
-    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
-      if (ch === 0x23) {
-        ch = this.nextChar();
+  hasBlendModes(resources, nonBlendModesSet) {
+    if (!(resources instanceof _primitives.Dict)) {
+      return false;
+    }
 
-        if (specialChars[ch]) {
-          (0, _util.warn)("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number.");
-          strBuf.push("#");
-          break;
-        }
+    if (resources.objId && nonBlendModesSet.has(resources.objId)) {
+      return false;
+    }
 
-        const x = toHexDigit(ch);
+    const processed = new _primitives.RefSet(nonBlendModesSet);
 
-        if (x !== -1) {
-          previousCh = ch;
-          ch = this.nextChar();
-          const x2 = toHexDigit(ch);
+    if (resources.objId) {
+      processed.put(resources.objId);
+    }
 
-          if (x2 === -1) {
-            (0, _util.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal 
number.");
-            strBuf.push("#", String.fromCharCode(previousCh));
+    const nodes = [resources],
+          xref = this.xref;
 
-            if (specialChars[ch]) {
-              break;
+    while (nodes.length) {
+      const node = nodes.shift();
+      const graphicStates = node.get("ExtGState");
+
+      if (graphicStates instanceof _primitives.Dict) {
+        for (let graphicState of graphicStates.getRawValues()) {
+          if (graphicState instanceof _primitives.Ref) {
+            if (processed.has(graphicState)) {
+              continue;
             }
 
-            strBuf.push(String.fromCharCode(ch));
-            continue;
+            try {
+              graphicState = xref.fetch(graphicState);
+            } catch (ex) {
+              processed.put(graphicState);
+              (0, _util.info)(`hasBlendModes - ignoring ExtGState: "${ex}".`);
+              continue;
+            }
           }
 
-          strBuf.push(String.fromCharCode(x << 4 | x2));
-        } else {
-          strBuf.push("#", String.fromCharCode(ch));
-        }
-      } else {
-        strBuf.push(String.fromCharCode(ch));
-      }
-    }
-
-    if (strBuf.length > 127) {
-      (0, _util.warn)(`Name token is longer than allowed by the spec: ${strBuf.length}`);
-    }
+          if (!(graphicState instanceof _primitives.Dict)) {
+            continue;
+          }
 
-    return _primitives.Name.get(strBuf.join(""));
-  }
+          if (graphicState.objId) {
+            processed.put(graphicState.objId);
+          }
 
-  _hexStringWarn(ch) {
-    const MAX_HEX_STRING_NUM_WARN = 5;
+          const bm = graphicState.get("BM");
 
-    if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {
-      (0, _util.warn)("getHexString - ignoring additional invalid characters.");
-      return;
-    }
+          if (bm instanceof _primitives.Name) {
+            if (bm.name !== "Normal") {
+              return true;
+            }
 
-    if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {
-      return;
-    }
+            continue;
+          }
 
-    (0, _util.warn)(`getHexString - ignoring invalid character: ${ch}`);
-  }
+          if (bm !== undefined && Array.isArray(bm)) {
+            for (const element of bm) {
+              if (element instanceof _primitives.Name && element.name !== "Normal") {
+                return true;
+              }
+            }
+          }
+        }
+      }
 
-  getHexString() {
-    const strBuf = this.strBuf;
-    strBuf.length = 0;
-    let ch = this.currentChar;
-    let isFirstHex = true;
-    let firstDigit, secondDigit;
-    this._hexStringNumWarn = 0;
+      const xObjects = node.get("XObject");
 
-    while (true) {
-      if (ch < 0) {
-        (0, _util.warn)("Unterminated hex string");
-        break;
-      } else if (ch === 0x3e) {
-        this.nextChar();
-        break;
-      } else if (specialChars[ch] === 1) {
-        ch = this.nextChar();
+      if (!(xObjects instanceof _primitives.Dict)) {
         continue;
-      } else {
-        if (isFirstHex) {
-          firstDigit = toHexDigit(ch);
-
-          if (firstDigit === -1) {
-            this._hexStringWarn(ch);
+      }
 
-            ch = this.nextChar();
+      for (let xObject of xObjects.getRawValues()) {
+        if (xObject instanceof _primitives.Ref) {
+          if (processed.has(xObject)) {
             continue;
           }
-        } else {
-          secondDigit = toHexDigit(ch);
 
-          if (secondDigit === -1) {
-            this._hexStringWarn(ch);
-
-            ch = this.nextChar();
+          try {
+            xObject = xref.fetch(xObject);
+          } catch (ex) {
+            processed.put(xObject);
+            (0, _util.info)(`hasBlendModes - ignoring XObject: "${ex}".`);
             continue;
           }
+        }
 
-          strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));
+        if (!(0, _primitives.isStream)(xObject)) {
+          continue;
         }
 
-        isFirstHex = !isFirstHex;
-        ch = this.nextChar();
-      }
-    }
+        if (xObject.dict.objId) {
+          processed.put(xObject.dict.objId);
+        }
 
-    return strBuf.join("");
-  }
+        const xResources = xObject.dict.get("Resources");
 
-  getObj() {
-    let comment = false;
-    let ch = this.currentChar;
+        if (!(xResources instanceof _primitives.Dict)) {
+          continue;
+        }
 
-    while (true) {
-      if (ch < 0) {
-        return _primitives.EOF;
-      }
+        if (xResources.objId && processed.has(xResources.objId)) {
+          continue;
+        }
 
-      if (comment) {
-        if (ch === 0x0a || ch === 0x0d) {
-          comment = false;
+        nodes.push(xResources);
+
+        if (xResources.objId) {
+          processed.put(xResources.objId);
         }
-      } else if (ch === 0x25) {
-        comment = true;
-      } else if (specialChars[ch] !== 1) {
-        break;
       }
-
-      ch = this.nextChar();
     }
 
-    switch (ch | 0) {
-      case 0x30:
-      case 0x31:
-      case 0x32:
-      case 0x33:
-      case 0x34:
-      case 0x35:
-      case 0x36:
-      case 0x37:
-      case 0x38:
-      case 0x39:
-      case 0x2b:
-      case 0x2d:
-      case 0x2e:
-        return this.getNumber();
+    processed.forEach(ref => {
+      nonBlendModesSet.put(ref);
+    });
+    return false;
+  }
 
-      case 0x28:
-        return this.getString();
+  async fetchBuiltInCMap(name) {
+    const cachedData = this.builtInCMapCache.get(name);
 
-      case 0x2f:
-        return this.getName();
+    if (cachedData) {
+      return cachedData;
+    }
 
-      case 0x5b:
-        this.nextChar();
-        return _primitives.Cmd.get("[");
+    let data;
 
-      case 0x5d:
-        this.nextChar();
-        return _primitives.Cmd.get("]");
+    if (this.options.cMapUrl !== null) {
+      const url = `${this.options.cMapUrl}${name}.bcmap`;
+      const response = await fetch(url);
 
-      case 0x3c:
-        ch = this.nextChar();
+      if (!response.ok) {
+        throw new Error(`fetchBuiltInCMap: failed to fetch file "${url}" with "${response.statusText}".`);
+      }
 
-        if (ch === 0x3c) {
-          this.nextChar();
-          return _primitives.Cmd.get("<<");
-        }
+      data = {
+        cMapData: new Uint8Array(await response.arrayBuffer()),
+        compressionType: _util.CMapCompressionType.BINARY
+      };
+    } else {
+      data = await this.handler.sendWithPromise("FetchBuiltInCMap", {
+        name
+      });
+    }
 
-        return this.getHexString();
+    if (data.compressionType !== _util.CMapCompressionType.NONE) {
+      this.builtInCMapCache.set(name, data);
+    }
 
-      case 0x3e:
-        ch = this.nextChar();
-
-        if (ch === 0x3e) {
-          this.nextChar();
-          return _primitives.Cmd.get(">>");
-        }
-
-        return _primitives.Cmd.get(">");
+    return data;
+  }
 
-      case 0x7b:
-        this.nextChar();
-        return _primitives.Cmd.get("{");
+  async fetchStandardFontData(name) {
+    const cachedData = this.standardFontDataCache.get(name);
 
-      case 0x7d:
-        this.nextChar();
-        return _primitives.Cmd.get("}");
+    if (cachedData) {
+      return new _stream.Stream(cachedData);
+    }
 
-      case 0x29:
-        this.nextChar();
-        throw new _util.FormatError(`Illegal character: ${ch}`);
+    if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") {
+      return null;
     }
 
-    let str = String.fromCharCode(ch);
-    const knownCommands = this.knownCommands;
-    let knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+    const standardFontNameToFileName = (0, _standard_fonts.getFontNameToFileMap)(),
+          filename = standardFontNameToFileName[name];
+    let data;
 
-    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
-      const possibleCommand = str + String.fromCharCode(ch);
+    if (this.options.standardFontDataUrl !== null) {
+      const url = `${this.options.standardFontDataUrl}${filename}`;
+      const response = await fetch(url);
 
-      if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
-        break;
+      if (!response.ok) {
+        (0, _util.warn)(`fetchStandardFontData: failed to fetch file "${url}" with 
"${response.statusText}".`);
+      } else {
+        data = await response.arrayBuffer();
       }
-
-      if (str.length === 128) {
-        throw new _util.FormatError(`Command token too long: ${str.length}`);
+    } else {
+      try {
+        data = await this.handler.sendWithPromise("FetchStandardFontData", {
+          filename
+        });
+      } catch (e) {
+        (0, _util.warn)(`fetchStandardFontData: failed to fetch file "${filename}" with "${e}".`);
       }
-
-      str = possibleCommand;
-      knownCommandFound = knownCommands && knownCommands[str] !== undefined;
-    }
-
-    if (str === "true") {
-      return true;
-    }
-
-    if (str === "false") {
-      return false;
     }
 
-    if (str === "null") {
+    if (!data) {
       return null;
     }
 
-    if (str === "BI") {
-      this.beginInlineImagePos = this.stream.pos;
-    }
-
-    return _primitives.Cmd.get(str);
+    this.standardFontDataCache.set(name, data);
+    return new _stream.Stream(data);
   }
 
-  peekObj() {
-    const streamPos = this.stream.pos,
-          currentChar = this.currentChar,
-          beginInlineImagePos = this.beginInlineImagePos;
-    let nextObj;
-
-    try {
-      nextObj = this.getObj();
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
+  async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) {
+    const dict = xobj.dict;
+    const matrix = dict.getArray("Matrix");
+    let bbox = dict.getArray("BBox");
 
-      (0, _util.warn)(`peekObj: ${ex}`);
+    if (Array.isArray(bbox) && bbox.length === 4) {
+      bbox = _util.Util.normalizeRect(bbox);
+    } else {
+      bbox = null;
     }
 
-    this.stream.pos = streamPos;
-    this.currentChar = currentChar;
-    this.beginInlineImagePos = beginInlineImagePos;
-    return nextObj;
-  }
-
-  skipToNextLine() {
-    let ch = this.currentChar;
-
-    while (ch >= 0) {
-      if (ch === 0x0d) {
-        ch = this.nextChar();
-
-        if (ch === 0x0a) {
-          this.nextChar();
-        }
-
-        break;
-      } else if (ch === 0x0a) {
-        this.nextChar();
-        break;
-      }
+    let optionalContent = null,
+        groupOptions;
 
-      ch = this.nextChar();
+    if (dict.has("OC")) {
+      optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
+      operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]);
     }
-  }
-
-}
-
-exports.Lexer = Lexer;
 
-class Linearization {
-  static create(stream) {
-    function getInt(linDict, name, allowZeroValue = false) {
-      const obj = linDict.get(name);
+    const group = dict.get("Group");
 
-      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
-        return obj;
-      }
+    if (group) {
+      groupOptions = {
+        matrix,
+        bbox,
+        smask,
+        isolated: false,
+        knockout: false
+      };
+      const groupSubtype = group.get("S");
+      let colorSpace = null;
 
-      throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid.");
-    }
+      if ((0, _primitives.isName)(groupSubtype, "Transparency")) {
+        groupOptions.isolated = group.get("I") || false;
+        groupOptions.knockout = group.get("K") || false;
 
-    function getHints(linDict) {
-      const hints = linDict.get("H");
-      let hintsLength;
+        if (group.has("CS")) {
+          const cs = group.getRaw("CS");
 
-      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
-        for (let index = 0; index < hintsLength; index++) {
-          const hint = hints[index];
+          const cachedColorSpace = _colorspace.ColorSpace.getCached(cs, this.xref, localColorSpaceCache);
 
-          if (!(Number.isInteger(hint) && hint > 0)) {
-            throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`);
+          if (cachedColorSpace) {
+            colorSpace = cachedColorSpace;
+          } else {
+            colorSpace = await this.parseColorSpace({
+              cs,
+              resources,
+              localColorSpaceCache
+            });
           }
         }
+      }
 
-        return hints;
+      if (smask && smask.backdrop) {
+        colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;
+        smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
       }
 
-      throw new Error("Hint array in the linearization dictionary is invalid.");
+      operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);
     }
 
-    const parser = new Parser({
-      lexer: new Lexer(stream),
-      xref: null
-    });
-    const obj1 = parser.getObj();
-    const obj2 = parser.getObj();
-    const obj3 = parser.getObj();
-    const linDict = parser.getObj();
-    let obj, length;
+    operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);
+    return this.getOperatorList({
+      stream: xobj,
+      task,
+      resources: dict.get("Resources") || resources,
+      operatorList,
+      initialState
+    }).then(function () {
+      operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);
 
-    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, "obj") && (0, 
_primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get("Linearized")) && obj > 0)) {
-      return null;
-    } else if ((length = getInt(linDict, "L")) !== stream.length) {
-      throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream 
length.");
-    }
+      if (group) {
+        operatorList.addOp(_util.OPS.endGroup, [groupOptions]);
+      }
 
-    return {
-      length,
-      hints: getHints(linDict),
-      objectNumberFirst: getInt(linDict, "O"),
-      endFirst: getInt(linDict, "E"),
-      numPages: getInt(linDict, "N"),
-      mainXRefEntriesOffset: getInt(linDict, "T"),
-      pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0
-    };
+      if (optionalContent) {
+        operatorList.addOp(_util.OPS.endMarkedContent, []);
+      }
+    });
   }
 
-}
-
-exports.Linearization = Linearization;
-
-/***/ }),
-/* 12 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
+  _sendImgData(objId, imgData, cacheGlobally = false) {
+    const transfers = imgData ? [imgData.data.buffer] : null;
 
+    if (this.parsingType3Font || cacheGlobally) {
+      return this.handler.send("commonobj", [objId, "Image", imgData], transfers);
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = 
exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.FlateStream = 
exports.DecodeStream = exports.DecryptStream = exports.AsciiHexStream = exports.Ascii85Stream = void 0;
+    return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers);
+  }
 
-var _util = __w_pdfjs_require__(2);
+  async buildPaintImageXObject({
+    resources,
+    image,
+    isInline = false,
+    operatorList,
+    cacheKey,
+    localImageCache,
+    localColorSpaceCache
+  }) {
+    const dict = image.dict;
+    const imageRef = dict.objId;
+    const w = dict.get("Width", "W");
+    const h = dict.get("Height", "H");
 
-var _primitives = __w_pdfjs_require__(5);
+    if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {
+      (0, _util.warn)("Image dimensions are missing, or not numbers.");
+      return undefined;
+    }
 
-var _core_utils = __w_pdfjs_require__(8);
+    const maxImageSize = this.options.maxImageSize;
 
-var Stream = function StreamClosure() {
-  function Stream(arrayBuffer, start, length, dict) {
-    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
-    this.start = start || 0;
-    this.pos = this.start;
-    this.end = start + length || this.bytes.length;
-    this.dict = dict;
-  }
+    if (maxImageSize !== -1 && w * h > maxImageSize) {
+      (0, _util.warn)("Image exceeded maximum allowed size and was removed.");
+      return undefined;
+    }
 
-  Stream.prototype = {
-    get length() {
-      return this.end - this.start;
-    },
+    const imageMask = dict.get("ImageMask", "IM") || false;
+    let imgData, args;
 
-    get isEmpty() {
-      return this.length === 0;
-    },
+    if (imageMask) {
+      const width = dict.get("Width", "W");
+      const height = dict.get("Height", "H");
+      const bitStrideLength = width + 7 >> 3;
+      const imgArray = image.getBytes(bitStrideLength * height, true);
+      const decode = dict.getArray("Decode", "D");
+      imgData = _image.PDFImage.createMask({
+        imgArray,
+        width,
+        height,
+        imageIsFromDecodeStream: image instanceof _decode_stream.DecodeStream,
+        inverseDecode: !!decode && decode[0] > 0
+      });
+      imgData.cached = !!cacheKey;
+      args = [imgData];
+      operatorList.addOp(_util.OPS.paintImageMaskXObject, args);
 
-    getByte: function Stream_getByte() {
-      if (this.pos >= this.end) {
-        return -1;
+      if (cacheKey) {
+        localImageCache.set(cacheKey, imageRef, {
+          fn: _util.OPS.paintImageMaskXObject,
+          args
+        });
       }
 
-      return this.bytes[this.pos++];
-    },
-    getUint16: function Stream_getUint16() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-
-      if (b0 === -1 || b1 === -1) {
-        return -1;
-      }
+      return undefined;
+    }
 
-      return (b0 << 8) + b1;
-    },
-    getInt32: function Stream_getInt32() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      var b2 = this.getByte();
-      var b3 = this.getByte();
-      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-    },
+    const softMask = dict.get("SMask", "SM") || false;
+    const mask = dict.get("Mask") || false;
+    const SMALL_IMAGE_DIMENSIONS = 200;
 
-    getBytes(length, forceClamped = false) {
-      var bytes = this.bytes;
-      var pos = this.pos;
-      var strEnd = this.end;
+    if (isInline && !softMask && !mask && w + h < SMALL_IMAGE_DIMENSIONS) {
+      const imageObj = new _image.PDFImage({
+        xref: this.xref,
+        res: resources,
+        image,
+        isInline,
+        pdfFunctionFactory: this._pdfFunctionFactory,
+        localColorSpaceCache
+      });
+      imgData = imageObj.createImageData(true);
+      operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);
+      return undefined;
+    }
 
-      if (!length) {
-        const subarray = bytes.subarray(pos, strEnd);
-        return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
-      }
+    let objId = `img_${this.idFactory.createObjId()}`,
+        cacheGlobally = false;
 
-      var end = pos + length;
+    if (this.parsingType3Font) {
+      objId = `${this.idFactory.getDocId()}_type3_${objId}`;
+    } else if (imageRef) {
+      cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex);
 
-      if (end > strEnd) {
-        end = strEnd;
+      if (cacheGlobally) {
+        objId = `${this.idFactory.getDocId()}_${objId}`;
       }
+    }
 
-      this.pos = end;
-      const subarray = bytes.subarray(pos, end);
-      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
-    },
+    operatorList.addDependency(objId);
+    args = [objId, w, h];
 
-    peekByte: function Stream_peekByte() {
-      var peekedByte = this.getByte();
+    _image.PDFImage.buildImage({
+      xref: this.xref,
+      res: resources,
+      image,
+      isInline,
+      pdfFunctionFactory: this._pdfFunctionFactory,
+      localColorSpaceCache
+    }).then(imageObj => {
+      imgData = imageObj.createImageData(false);
 
-      if (peekedByte !== -1) {
-        this.pos--;
+      if (cacheKey && imageRef && cacheGlobally) {
+        this.globalImageCache.addByteSize(imageRef, imgData.data.length);
       }
 
-      return peekedByte;
-    },
-
-    peekBytes(length, forceClamped = false) {
-      var bytes = this.getBytes(length, forceClamped);
-      this.pos -= bytes.length;
-      return bytes;
-    },
+      return this._sendImgData(objId, imgData, cacheGlobally);
+    }).catch(reason => {
+      (0, _util.warn)(`Unable to decode image "${objId}": "${reason}".`);
+      return this._sendImgData(objId, null, cacheGlobally);
+    });
 
-    getByteRange(begin, end) {
-      if (begin < 0) {
-        begin = 0;
-      }
+    operatorList.addOp(_util.OPS.paintImageXObject, args);
 
-      if (end > this.end) {
-        end = this.end;
-      }
+    if (cacheKey) {
+      localImageCache.set(cacheKey, imageRef, {
+        fn: _util.OPS.paintImageXObject,
+        args
+      });
 
-      return this.bytes.subarray(begin, end);
-    },
+      if (imageRef) {
+        (0, _util.assert)(!isInline, "Cannot cache an inline image globally.");
+        this.globalImageCache.addPageIndex(imageRef, this.pageIndex);
 
-    skip: function Stream_skip(n) {
-      if (!n) {
-        n = 1;
+        if (cacheGlobally) {
+          this.globalImageCache.setData(imageRef, {
+            objId,
+            fn: _util.OPS.paintImageXObject,
+            args,
+            byteSize: 0
+          });
+        }
       }
-
-      this.pos += n;
-    },
-    reset: function Stream_reset() {
-      this.pos = this.start;
-    },
-    moveStart: function Stream_moveStart() {
-      this.start = this.pos;
-    },
-    makeSubStream: function Stream_makeSubStream(start, length, dict) {
-      return new Stream(this.bytes.buffer, start, length, dict);
     }
-  };
-  return Stream;
-}();
-
-exports.Stream = Stream;
 
-var StringStream = function StringStreamClosure() {
-  function StringStream(str) {
-    const bytes = (0, _util.stringToBytes)(str);
-    Stream.call(this, bytes);
+    return undefined;
   }
 
-  StringStream.prototype = Stream.prototype;
-  return StringStream;
-}();
-
-exports.StringStream = StringStream;
+  handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) {
+    const smaskContent = smask.get("G");
+    const smaskOptions = {
+      subtype: smask.get("S").name,
+      backdrop: smask.get("BC")
+    };
+    const transferObj = smask.get("TR");
 
-var DecodeStream = function DecodeStreamClosure() {
-  var emptyBuffer = new Uint8Array(0);
+    if ((0, _function.isPDFFunction)(transferObj)) {
+      const transferFn = this._pdfFunctionFactory.create(transferObj);
 
-  function DecodeStream(maybeMinBufferLength) {
-    this._rawMinBufferLength = maybeMinBufferLength || 0;
-    this.pos = 0;
-    this.bufferLength = 0;
-    this.eof = false;
-    this.buffer = emptyBuffer;
-    this.minBufferLength = 512;
+      const transferMap = new Uint8Array(256);
+      const tmp = new Float32Array(1);
 
-    if (maybeMinBufferLength) {
-      while (this.minBufferLength < maybeMinBufferLength) {
-        this.minBufferLength *= 2;
+      for (let i = 0; i < 256; i++) {
+        tmp[0] = i / 255;
+        transferFn(tmp, 0, tmp, 0);
+        transferMap[i] = tmp[0] * 255 | 0;
       }
+
+      smaskOptions.transferMap = transferMap;
     }
-  }
 
-  DecodeStream.prototype = {
-    get isEmpty() {
-      while (!this.eof && this.bufferLength === 0) {
-        this.readBlock();
-      }
+    return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, 
stateManager.state.clone(), localColorSpaceCache);
+  }
 
-      return this.bufferLength === 0;
-    },
+  handleTransferFunction(tr) {
+    let transferArray;
 
-    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
-      var buffer = this.buffer;
+    if (Array.isArray(tr)) {
+      transferArray = tr;
+    } else if ((0, _function.isPDFFunction)(tr)) {
+      transferArray = [tr];
+    } else {
+      return null;
+    }
 
-      if (requested <= buffer.byteLength) {
-        return buffer;
-      }
+    const transferMaps = [];
+    let numFns = 0,
+        numEffectfulFns = 0;
 
-      var size = this.minBufferLength;
+    for (const entry of transferArray) {
+      const transferObj = this.xref.fetchIfRef(entry);
+      numFns++;
 
-      while (size < requested) {
-        size *= 2;
+      if ((0, _primitives.isName)(transferObj, "Identity")) {
+        transferMaps.push(null);
+        continue;
+      } else if (!(0, _function.isPDFFunction)(transferObj)) {
+        return null;
       }
 
-      var buffer2 = new Uint8Array(size);
-      buffer2.set(buffer);
-      return this.buffer = buffer2;
-    },
-    getByte: function DecodeStream_getByte() {
-      var pos = this.pos;
+      const transferFn = this._pdfFunctionFactory.create(transferObj);
 
-      while (this.bufferLength <= pos) {
-        if (this.eof) {
-          return -1;
-        }
+      const transferMap = new Uint8Array(256),
+            tmp = new Float32Array(1);
 
-        this.readBlock();
+      for (let j = 0; j < 256; j++) {
+        tmp[0] = j / 255;
+        transferFn(tmp, 0, tmp, 0);
+        transferMap[j] = tmp[0] * 255 | 0;
       }
 
-      return this.buffer[this.pos++];
-    },
-    getUint16: function DecodeStream_getUint16() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-
-      if (b0 === -1 || b1 === -1) {
-        return -1;
-      }
+      transferMaps.push(transferMap);
+      numEffectfulFns++;
+    }
 
-      return (b0 << 8) + b1;
-    },
-    getInt32: function DecodeStream_getInt32() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      var b2 = this.getByte();
-      var b3 = this.getByte();
-      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-    },
+    if (!(numFns === 1 || numFns === 4)) {
+      return null;
+    }
 
-    getBytes(length, forceClamped = false) {
-      var end,
-          pos = this.pos;
+    if (numEffectfulFns === 0) {
+      return null;
+    }
 
-      if (length) {
-        this.ensureBuffer(pos + length);
-        end = pos + length;
+    return transferMaps;
+  }
 
-        while (!this.eof && this.bufferLength < end) {
-          this.readBlock();
-        }
+  handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, cacheKey, 
localTilingPatternCache) {
+    const tilingOpList = new _operator_list.OperatorList();
 
-        var bufEnd = this.bufferLength;
+    const patternResources = _primitives.Dict.merge({
+      xref: this.xref,
+      dictArray: [patternDict.get("Resources"), resources]
+    });
 
-        if (end > bufEnd) {
-          end = bufEnd;
-        }
-      } else {
-        while (!this.eof) {
-          this.readBlock();
-        }
+    return this.getOperatorList({
+      stream: pattern,
+      task,
+      resources: patternResources,
+      operatorList: tilingOpList
+    }).then(function () {
+      const operatorListIR = tilingOpList.getIR();
+      const tilingPatternIR = (0, _pattern.getTilingPatternIR)(operatorListIR, patternDict, color);
+      operatorList.addDependencies(tilingOpList.dependencies);
+      operatorList.addOp(fn, tilingPatternIR);
 
-        end = this.bufferLength;
+      if (cacheKey) {
+        localTilingPatternCache.set(cacheKey, patternDict.objId, {
+          operatorListIR,
+          dict: patternDict
+        });
       }
-
-      this.pos = end;
-      const subarray = this.buffer.subarray(pos, end);
-      return forceClamped && !(subarray instanceof Uint8ClampedArray) ? new Uint8ClampedArray(subarray) : 
subarray;
-    },
-
-    peekByte: function DecodeStream_peekByte() {
-      var peekedByte = this.getByte();
-
-      if (peekedByte !== -1) {
-        this.pos--;
+    }).catch(reason => {
+      if (reason instanceof _util.AbortException) {
+        return;
       }
 
-      return peekedByte;
-    },
-
-    peekBytes(length, forceClamped = false) {
-      var bytes = this.getBytes(length, forceClamped);
-      this.pos -= bytes.length;
-      return bytes;
-    },
-
-    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
-      var end = start + length;
-
-      while (this.bufferLength <= end && !this.eof) {
-        this.readBlock();
+      if (this.options.ignoreErrors) {
+        this.handler.send("UnsupportedFeature", {
+          featureId: _util.UNSUPPORTED_FEATURES.errorTilingPattern
+        });
+        (0, _util.warn)(`handleTilingType - ignoring pattern: "${reason}".`);
+        return;
       }
 
-      return new Stream(this.buffer, start, length, dict);
-    },
-
-    getByteRange(begin, end) {
-      (0, _util.unreachable)("Should not call DecodeStream.getByteRange");
-    },
-
-    skip: function DecodeStream_skip(n) {
-      if (!n) {
-        n = 1;
-      }
+      throw reason;
+    });
+  }
 
-      this.pos += n;
-    },
-    reset: function DecodeStream_reset() {
-      this.pos = 0;
-    },
-    getBaseStreams: function DecodeStream_getBaseStreams() {
-      if (this.str && this.str.getBaseStreams) {
-        return this.str.getBaseStreams();
+  handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, 
cssFontInfo = null) {
+    const fontName = fontArgs && fontArgs[0] instanceof _primitives.Name ? fontArgs[0].name : null;
+    return this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo).then(translated => {
+      if (!translated.font.isType3Font) {
+        return translated;
       }
 
-      return [];
-    }
-  };
-  return DecodeStream;
-}();
-
-exports.DecodeStream = DecodeStream;
+      return translated.loadType3Data(this, resources, task).then(function () {
+        operatorList.addDependencies(translated.type3Dependencies);
+        return translated;
+      }).catch(reason => {
+        this.handler.send("UnsupportedFeature", {
+          featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadType3
+        });
+        return new TranslatedFont({
+          loadedName: "g_font_error",
+          font: new _fonts.ErrorFont(`Type3 font load error: ${reason}`),
+          dict: translated.font,
+          evaluatorOptions: this.options
+        });
+      });
+    }).then(translated => {
+      state.font = translated.font;
+      translated.send(this.handler);
+      return translated.loadedName;
+    });
+  }
 
-var StreamsSequenceStream = function StreamsSequenceStreamClosure() {
-  function StreamsSequenceStream(streams) {
-    this.streams = streams;
-    let maybeLength = 0;
+  handleText(chars, state) {
+    const font = state.font;
+    const glyphs = font.charsToGlyphs(chars);
 
-    for (let i = 0, ii = streams.length; i < ii; i++) {
-      const stream = streams[i];
+    if (font.data) {
+      const isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
 
-      if (stream instanceof DecodeStream) {
-        maybeLength += stream._rawMinBufferLength;
-      } else {
-        maybeLength += stream.length;
+      if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || 
this.options.disableFontFace) {
+        PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options);
       }
     }
 
-    DecodeStream.call(this, maybeLength);
+    return glyphs;
   }
 
-  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
-
-  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {
-    var streams = this.streams;
-
-    if (streams.length === 0) {
-      this.eof = true;
+  ensureStateFont(state) {
+    if (state.font) {
       return;
     }
 
-    var stream = streams.shift();
-    var chunk = stream.getBytes();
-    var bufferLength = this.bufferLength;
-    var newLength = bufferLength + chunk.length;
-    var buffer = this.ensureBuffer(newLength);
-    buffer.set(chunk, bufferLength);
-    this.bufferLength = newLength;
-  };
-
-  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {
-    var baseStreams = [];
-
-    for (var i = 0, ii = this.streams.length; i < ii; i++) {
-      var stream = this.streams[i];
+    const reason = new _util.FormatError("Missing setFont (Tf) operator before text rendering operator.");
 
-      if (stream.getBaseStreams) {
-        baseStreams.push(...stream.getBaseStreams());
-      }
+    if (this.options.ignoreErrors) {
+      this.handler.send("UnsupportedFeature", {
+        featureId: _util.UNSUPPORTED_FEATURES.errorFontState
+      });
+      (0, _util.warn)(`ensureStateFont: "${reason}".`);
+      return;
     }
 
-    return baseStreams;
-  };
+    throw reason;
+  }
 
-  return StreamsSequenceStream;
-}();
+  async setGState({
+    resources,
+    gState,
+    operatorList,
+    cacheKey,
+    task,
+    stateManager,
+    localGStateCache,
+    localColorSpaceCache
+  }) {
+    const gStateRef = gState.objId;
+    let isSimpleGState = true;
+    const gStateObj = [];
+    const gStateKeys = gState.getKeys();
+    let promise = Promise.resolve();
 
-exports.StreamsSequenceStream = StreamsSequenceStream;
+    for (let i = 0, ii = gStateKeys.length; i < ii; i++) {
+      const key = gStateKeys[i];
+      const value = gState.get(key);
 
-var FlateStream = function FlateStreamClosure() {
-  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
-  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 
0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 
0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
-  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 
0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 
0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
-  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 
0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 
0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 
0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 
0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 
0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 
0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 
0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 
0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 
0x900cc, 0x7010b, 0x80066, 0x
 80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 
0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 
0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 
0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 
0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 
0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 
0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 
0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 
0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 
0x8003b, 0x900d6, 0x7010d, 
 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 
0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 
0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 
0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 
0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 
0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 
0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 
0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 
0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 
0x80072, 0x80032, 0x900c5
 , 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 
0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 
0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 
0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 
0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 
0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 
0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 
0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 
0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 
0x9009b, 0x70116, 0x8007d, 0x800
 3d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 
0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 
0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 
0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 
0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 
0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 
0x8004f, 0x900ff]), 9];
-  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 
0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 
0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 
0x00000]), 5];
+      switch (key) {
+        case "Type":
+          break;
 
-  function FlateStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-    var cmf = str.getByte();
-    var flg = str.getByte();
+        case "LW":
+        case "LC":
+        case "LJ":
+        case "ML":
+        case "D":
+        case "RI":
+        case "FL":
+        case "CA":
+        case "ca":
+          gStateObj.push([key, value]);
+          break;
 
-    if (cmf === -1 || flg === -1) {
-      throw new _util.FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);
-    }
+        case "Font":
+          isSimpleGState = false;
+          promise = promise.then(() => {
+            return this.handleSetFont(resources, null, value[0], operatorList, task, 
stateManager.state).then(function (loadedName) {
+              operatorList.addDependency(loadedName);
+              gStateObj.push([key, [loadedName, value[1]]]);
+            });
+          });
+          break;
 
-    if ((cmf & 0x0f) !== 0x08) {
-      throw new _util.FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`);
-    }
+        case "BM":
+          gStateObj.push([key, normalizeBlendMode(value)]);
+          break;
 
-    if (((cmf << 8) + flg) % 31 !== 0) {
-      throw new _util.FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);
-    }
+        case "SMask":
+          if ((0, _primitives.isName)(value, "None")) {
+            gStateObj.push([key, false]);
+            break;
+          }
 
-    if (flg & 0x20) {
-      throw new _util.FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);
-    }
+          if ((0, _primitives.isDict)(value)) {
+            isSimpleGState = false;
+            promise = promise.then(() => {
+              return this.handleSMask(value, resources, operatorList, task, stateManager, 
localColorSpaceCache);
+            });
+            gStateObj.push([key, true]);
+          } else {
+            (0, _util.warn)("Unsupported SMask type");
+          }
 
-    this.codeSize = 0;
-    this.codeBuf = 0;
-    DecodeStream.call(this, maybeLength);
-  }
+          break;
 
-  FlateStream.prototype = Object.create(DecodeStream.prototype);
+        case "TR":
+          const transferMaps = this.handleTransferFunction(value);
+          gStateObj.push([key, transferMaps]);
+          break;
 
-  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
-    var str = this.str;
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-    var b;
+        case "OP":
+        case "op":
+        case "OPM":
+        case "BG":
+        case "BG2":
+        case "UCR":
+        case "UCR2":
+        case "TR2":
+        case "HT":
+        case "SM":
+        case "SA":
+        case "AIS":
+        case "TK":
+          (0, _util.info)("graphic state operator " + key);
+          break;
 
-    while (codeSize < bits) {
-      if ((b = str.getByte()) === -1) {
-        throw new _util.FormatError("Bad encoding in flate stream");
+        default:
+          (0, _util.info)("Unknown graphic state operator " + key);
+          break;
       }
-
-      codeBuf |= b << codeSize;
-      codeSize += 8;
     }
 
-    b = codeBuf & (1 << bits) - 1;
-    this.codeBuf = codeBuf >> bits;
-    this.codeSize = codeSize -= bits;
-    return b;
-  };
-
-  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
-    var str = this.str;
-    var codes = table[0];
-    var maxLen = table[1];
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-    var b;
-
-    while (codeSize < maxLen) {
-      if ((b = str.getByte()) === -1) {
-        break;
+    return promise.then(function () {
+      if (gStateObj.length > 0) {
+        operatorList.addOp(_util.OPS.setGState, [gStateObj]);
       }
 
-      codeBuf |= b << codeSize;
-      codeSize += 8;
-    }
+      if (isSimpleGState) {
+        localGStateCache.set(cacheKey, gStateRef, gStateObj);
+      }
+    });
+  }
 
-    var code = codes[codeBuf & (1 << maxLen) - 1];
-    var codeLen = code >> 16;
-    var codeVal = code & 0xffff;
+  loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) {
+    const errorFont = async () => {
+      return new TranslatedFont({
+        loadedName: "g_font_error",
+        font: new _fonts.ErrorFont(`Font "${fontName}" is not available.`),
+        dict: font,
+        evaluatorOptions: this.options
+      });
+    };
 
-    if (codeLen < 1 || codeSize < codeLen) {
-      throw new _util.FormatError("Bad encoding in flate stream");
-    }
+    const xref = this.xref;
+    let fontRef;
 
-    this.codeBuf = codeBuf >> codeLen;
-    this.codeSize = codeSize - codeLen;
-    return codeVal;
-  };
+    if (font) {
+      if (!(0, _primitives.isRef)(font)) {
+        throw new _util.FormatError('The "font" object should be a reference.');
+      }
 
-  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {
-    var n = lengths.length;
-    var maxLen = 0;
-    var i;
+      fontRef = font;
+    } else {
+      const fontRes = resources.get("Font");
 
-    for (i = 0; i < n; ++i) {
-      if (lengths[i] > maxLen) {
-        maxLen = lengths[i];
+      if (fontRes) {
+        fontRef = fontRes.getRaw(fontName);
       }
     }
 
-    var size = 1 << maxLen;
-    var codes = new Int32Array(size);
-
-    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
-      for (var val = 0; val < n; ++val) {
-        if (lengths[val] === len) {
-          var code2 = 0;
-          var t = code;
+    if (!fontRef) {
+      const partialMsg = `Font "${fontName || font && font.toString()}" is not available`;
 
-          for (i = 0; i < len; ++i) {
-            code2 = code2 << 1 | t & 1;
-            t >>= 1;
-          }
+      if (!this.options.ignoreErrors && !this.parsingType3Font) {
+        (0, _util.warn)(`${partialMsg}.`);
+        return errorFont();
+      }
 
-          for (i = code2; i < size; i += skip) {
-            codes[i] = len << 16 | val;
-          }
+      this.handler.send("UnsupportedFeature", {
+        featureId: _util.UNSUPPORTED_FEATURES.errorFontMissing
+      });
+      (0, _util.warn)(`${partialMsg} -- attempting to fallback to a default font.`);
 
-          ++code;
-        }
+      if (fallbackFontDict) {
+        fontRef = fallbackFontDict;
+      } else {
+        fontRef = PartialEvaluator.fallbackFontDict;
       }
     }
 
-    return [codes, maxLen];
-  };
-
-  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
-    var buffer, len;
-    var str = this.str;
-    var hdr = this.getBits(3);
-
-    if (hdr & 1) {
-      this.eof = true;
+    if (this.fontCache.has(fontRef)) {
+      return this.fontCache.get(fontRef);
     }
 
-    hdr >>= 1;
-
-    if (hdr === 0) {
-      var b;
+    font = xref.fetchIfRef(fontRef);
 
-      if ((b = str.getByte()) === -1) {
-        throw new _util.FormatError("Bad block header in flate stream");
-      }
+    if (!(0, _primitives.isDict)(font)) {
+      return errorFont();
+    }
 
-      var blockLen = b;
+    if (font.cacheKey && this.fontCache.has(font.cacheKey)) {
+      return this.fontCache.get(font.cacheKey);
+    }
 
-      if ((b = str.getByte()) === -1) {
-        throw new _util.FormatError("Bad block header in flate stream");
-      }
+    const fontCapability = (0, _util.createPromiseCapability)();
+    let preEvaluatedFont;
 
-      blockLen |= b << 8;
+    try {
+      preEvaluatedFont = this.preEvaluateFont(font);
+      preEvaluatedFont.cssFontInfo = cssFontInfo;
+    } catch (reason) {
+      (0, _util.warn)(`loadFont - preEvaluateFont failed: "${reason}".`);
+      return errorFont();
+    }
 
-      if ((b = str.getByte()) === -1) {
-        throw new _util.FormatError("Bad block header in flate stream");
-      }
+    const {
+      descriptor,
+      hash
+    } = preEvaluatedFont;
+    const fontRefIsRef = (0, _primitives.isRef)(fontRef);
+    let fontID;
 
-      var check = b;
+    if (fontRefIsRef) {
+      fontID = `f${fontRef.toString()}`;
+    }
 
-      if ((b = str.getByte()) === -1) {
-        throw new _util.FormatError("Bad block header in flate stream");
+    if (hash && (0, _primitives.isDict)(descriptor)) {
+      if (!descriptor.fontAliases) {
+        descriptor.fontAliases = Object.create(null);
       }
 
-      check |= b << 8;
-
-      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
-        throw new _util.FormatError("Bad uncompressed block length in flate stream");
-      }
+      const fontAliases = descriptor.fontAliases;
 
-      this.codeBuf = 0;
-      this.codeSize = 0;
-      const bufferLength = this.bufferLength,
-            end = bufferLength + blockLen;
-      buffer = this.ensureBuffer(end);
-      this.bufferLength = end;
+      if (fontAliases[hash]) {
+        const aliasFontRef = fontAliases[hash].aliasRef;
 
-      if (blockLen === 0) {
-        if (str.peekByte() === -1) {
-          this.eof = true;
+        if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
+          this.fontCache.putAlias(fontRef, aliasFontRef);
+          return this.fontCache.get(fontRef);
         }
       } else {
-        const block = str.getBytes(blockLen);
-        buffer.set(block, bufferLength);
+        fontAliases[hash] = {
+          fontID: this.idFactory.createFontId()
+        };
+      }
 
-        if (block.length < blockLen) {
-          this.eof = true;
-        }
+      if (fontRefIsRef) {
+        fontAliases[hash].aliasRef = fontRef;
       }
 
-      return;
+      fontID = fontAliases[hash].fontID;
     }
 
-    var litCodeTable;
-    var distCodeTable;
+    if (fontRefIsRef) {
+      this.fontCache.put(fontRef, fontCapability.promise);
+    } else {
+      if (!fontID) {
+        fontID = this.idFactory.createFontId();
+      }
 
-    if (hdr === 1) {
-      litCodeTable = fixedLitCodeTab;
-      distCodeTable = fixedDistCodeTab;
-    } else if (hdr === 2) {
-      var numLitCodes = this.getBits(5) + 257;
-      var numDistCodes = this.getBits(5) + 1;
-      var numCodeLenCodes = this.getBits(4) + 4;
-      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
-      var i;
+      font.cacheKey = `cacheKey_${fontID}`;
+      this.fontCache.put(font.cacheKey, fontCapability.promise);
+    }
 
-      for (i = 0; i < numCodeLenCodes; ++i) {
-        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+    (0, _util.assert)(fontID && fontID.startsWith("f"), 'The "fontID" must be (correctly) defined.');
+    font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;
+    this.translateFont(preEvaluatedFont).then(translatedFont => {
+      if (translatedFont.fontType !== undefined) {
+        const xrefFontStats = xref.stats.fontTypes;
+        xrefFontStats[translatedFont.fontType] = true;
       }
 
-      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
-      len = 0;
-      i = 0;
-      var codes = numLitCodes + numDistCodes;
-      var codeLengths = new Uint8Array(codes);
-      var bitsLength, bitsOffset, what;
-
-      while (i < codes) {
-        var code = this.getCode(codeLenCodeTab);
+      fontCapability.resolve(new TranslatedFont({
+        loadedName: font.loadedName,
+        font: translatedFont,
+        dict: font,
+        evaluatorOptions: this.options
+      }));
+    }).catch(reason => {
+      this.handler.send("UnsupportedFeature", {
+        featureId: _util.UNSUPPORTED_FEATURES.errorFontTranslate
+      });
+      (0, _util.warn)(`loadFont - translateFont failed: "${reason}".`);
 
-        if (code === 16) {
-          bitsLength = 2;
-          bitsOffset = 3;
-          what = len;
-        } else if (code === 17) {
-          bitsLength = 3;
-          bitsOffset = 3;
-          what = len = 0;
-        } else if (code === 18) {
-          bitsLength = 7;
-          bitsOffset = 11;
-          what = len = 0;
-        } else {
-          codeLengths[i++] = len = code;
-          continue;
-        }
+      try {
+        const fontFile3 = descriptor && descriptor.get("FontFile3");
+        const subtype = fontFile3 && fontFile3.get("Subtype");
+        const fontType = (0, _fonts_utils.getFontType)(preEvaluatedFont.type, subtype && subtype.name);
+        const xrefFontStats = xref.stats.fontTypes;
+        xrefFontStats[fontType] = true;
+      } catch (ex) {}
 
-        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+      fontCapability.resolve(new TranslatedFont({
+        loadedName: font.loadedName,
+        font: new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason),
+        dict: font,
+        evaluatorOptions: this.options
+      }));
+    });
+    return fontCapability.promise;
+  }
 
-        while (repeatLength-- > 0) {
-          codeLengths[i++] = what;
-        }
-      }
+  buildPath(operatorList, fn, args, parsingText = false) {
+    const lastIndex = operatorList.length - 1;
 
-      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
-      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
-    } else {
-      throw new _util.FormatError("Unknown block type in flate stream");
+    if (!args) {
+      args = [];
     }
 
-    buffer = this.buffer;
-    var limit = buffer ? buffer.length : 0;
-    var pos = this.bufferLength;
+    if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {
+      if (parsingText) {
+        (0, _util.warn)(`Encountered path operator "${fn}" inside of a text object.`);
+        operatorList.addOp(_util.OPS.save, null);
+      }
 
-    while (true) {
-      var code1 = this.getCode(litCodeTable);
+      operatorList.addOp(_util.OPS.constructPath, [[fn], args]);
 
-      if (code1 < 256) {
-        if (pos + 1 >= limit) {
-          buffer = this.ensureBuffer(pos + 1);
-          limit = buffer.length;
-        }
+      if (parsingText) {
+        operatorList.addOp(_util.OPS.restore, null);
+      }
+    } else {
+      const opArgs = operatorList.argsArray[lastIndex];
+      opArgs[0].push(fn);
+      Array.prototype.push.apply(opArgs[1], args);
+    }
+  }
 
-        buffer[pos++] = code1;
-        continue;
+  parseColorSpace({
+    cs,
+    resources,
+    localColorSpaceCache
+  }) {
+    return _colorspace.ColorSpace.parseAsync({
+      cs,
+      xref: this.xref,
+      resources,
+      pdfFunctionFactory: this._pdfFunctionFactory,
+      localColorSpaceCache
+    }).catch(reason => {
+      if (reason instanceof _util.AbortException) {
+        return null;
       }
 
-      if (code1 === 256) {
-        this.bufferLength = pos;
-        return;
+      if (this.options.ignoreErrors) {
+        this.handler.send("UnsupportedFeature", {
+          featureId: _util.UNSUPPORTED_FEATURES.errorColorSpace
+        });
+        (0, _util.warn)(`parseColorSpace - ignoring ColorSpace: "${reason}".`);
+        return null;
       }
 
-      code1 -= 257;
-      code1 = lengthDecode[code1];
-      var code2 = code1 >> 16;
+      throw reason;
+    });
+  }
 
-      if (code2 > 0) {
-        code2 = this.getBits(code2);
-      }
+  parseShading({
+    keyObj,
+    shading,
+    resources,
+    localColorSpaceCache,
+    localShadingPatternCache,
+    matrix = null
+  }) {
+    let id = localShadingPatternCache.get(keyObj);
 
-      len = (code1 & 0xffff) + code2;
-      code1 = this.getCode(distCodeTable);
-      code1 = distDecode[code1];
-      code2 = code1 >> 16;
+    if (!id) {
+      var shadingFill = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, 
this._pdfFunctionFactory, localColorSpaceCache);
 
-      if (code2 > 0) {
-        code2 = this.getBits(code2);
-      }
+      const patternIR = shadingFill.getIR();
+      id = `pattern_${this.idFactory.createObjId()}`;
+      localShadingPatternCache.set(keyObj, id);
+      this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]);
+    }
+
+    return id;
+  }
 
-      var dist = (code1 & 0xffff) + code2;
+  handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, 
localTilingPatternCache, localShadingPatternCache) {
+    const patternName = args.pop();
 
-      if (pos + len >= limit) {
-        buffer = this.ensureBuffer(pos + len);
-        limit = buffer.length;
-      }
+    if (patternName instanceof _primitives.Name) {
+      const name = patternName.name;
+      const localTilingPattern = localTilingPatternCache.getByName(name);
 
-      for (var k = 0; k < len; ++k, ++pos) {
-        buffer[pos] = buffer[pos - dist];
+      if (localTilingPattern) {
+        try {
+          const color = cs.base ? cs.base.getRgb(args, 0) : null;
+          const tilingPatternIR = (0, _pattern.getTilingPatternIR)(localTilingPattern.operatorListIR, 
localTilingPattern.dict, color);
+          operatorList.addOp(fn, tilingPatternIR);
+          return undefined;
+        } catch (ex) {}
+      }
+
+      const pattern = patterns.get(name);
+
+      if (pattern) {
+        const dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;
+        const typeNum = dict.get("PatternType");
+
+        if (typeNum === PatternType.TILING) {
+          const color = cs.base ? cs.base.getRgb(args, 0) : null;
+          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, name, 
localTilingPatternCache);
+        } else if (typeNum === PatternType.SHADING) {
+          const shading = dict.get("Shading");
+          const matrix = dict.getArray("Matrix");
+          const objId = this.parseShading({
+            keyObj: pattern,
+            shading,
+            matrix,
+            resources,
+            localColorSpaceCache,
+            localShadingPatternCache
+          });
+          operatorList.addOp(fn, ["Shading", objId]);
+          return undefined;
+        }
+
+        throw new _util.FormatError(`Unknown PatternType: ${typeNum}`);
       }
     }
-  };
 
-  return FlateStream;
-}();
+    throw new _util.FormatError(`Unknown PatternName: ${patternName}`);
+  }
 
-exports.FlateStream = FlateStream;
+  _parseVisibilityExpression(array, nestingCounter, currentResult) {
+    const MAX_NESTING = 10;
 
-var PredictorStream = function PredictorStreamClosure() {
-  function PredictorStream(str, maybeLength, params) {
-    if (!(0, _primitives.isDict)(params)) {
-      return str;
+    if (++nestingCounter > MAX_NESTING) {
+      (0, _util.warn)("Visibility expression is too deeply nested");
+      return;
     }
 
-    var predictor = this.predictor = params.get("Predictor") || 1;
+    const length = array.length;
+    const operator = this.xref.fetchIfRef(array[0]);
 
-    if (predictor <= 1) {
-      return str;
+    if (length < 2 || !(0, _primitives.isName)(operator)) {
+      (0, _util.warn)("Invalid visibility expression");
+      return;
     }
 
-    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
-      throw new _util.FormatError(`Unsupported predictor: ${predictor}`);
-    }
+    switch (operator.name) {
+      case "And":
+      case "Or":
+      case "Not":
+        currentResult.push(operator.name);
+        break;
 
-    if (predictor === 2) {
-      this.readBlock = this.readBlockTiff;
-    } else {
-      this.readBlock = this.readBlockPng;
+      default:
+        (0, _util.warn)(`Invalid operator ${operator.name} in visibility expression`);
+        return;
     }
 
-    this.str = str;
-    this.dict = str.dict;
-    var colors = this.colors = params.get("Colors") || 1;
-    var bits = this.bits = params.get("BitsPerComponent") || 8;
-    var columns = this.columns = params.get("Columns") || 1;
-    this.pixBytes = colors * bits + 7 >> 3;
-    this.rowBytes = columns * colors * bits + 7 >> 3;
-    DecodeStream.call(this, maybeLength);
-    return this;
-  }
+    for (let i = 1; i < length; i++) {
+      const raw = array[i];
+      const object = this.xref.fetchIfRef(raw);
 
-  PredictorStream.prototype = Object.create(DecodeStream.prototype);
+      if (Array.isArray(object)) {
+        const nestedResult = [];
+        currentResult.push(nestedResult);
 
-  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {
-    var rowBytes = this.rowBytes;
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-    var bits = this.bits;
-    var colors = this.colors;
-    var rawBytes = this.str.getBytes(rowBytes);
-    this.eof = !rawBytes.length;
+        this._parseVisibilityExpression(object, nestingCounter, nestedResult);
+      } else if ((0, _primitives.isRef)(raw)) {
+        currentResult.push(raw.toString());
+      }
+    }
+  }
 
-    if (this.eof) {
-      return;
+  async parseMarkedContentProps(contentProperties, resources) {
+    let optionalContent;
+
+    if ((0, _primitives.isName)(contentProperties)) {
+      const properties = resources.get("Properties");
+      optionalContent = properties.get(contentProperties.name);
+    } else if ((0, _primitives.isDict)(contentProperties)) {
+      optionalContent = contentProperties;
+    } else {
+      throw new _util.FormatError("Optional content properties malformed.");
     }
 
-    var inbuf = 0,
-        outbuf = 0;
-    var inbits = 0,
-        outbits = 0;
-    var pos = bufferLength;
-    var i;
+    const optionalContentType = optionalContent.get("Type").name;
 
-    if (bits === 1 && colors === 1) {
-      for (i = 0; i < rowBytes; ++i) {
-        var c = rawBytes[i] ^ inbuf;
-        c ^= c >> 1;
-        c ^= c >> 2;
-        c ^= c >> 4;
-        inbuf = (c & 1) << 7;
-        buffer[pos++] = c;
-      }
-    } else if (bits === 8) {
-      for (i = 0; i < colors; ++i) {
-        buffer[pos++] = rawBytes[i];
-      }
+    if (optionalContentType === "OCG") {
+      return {
+        type: optionalContentType,
+        id: optionalContent.objId
+      };
+    } else if (optionalContentType === "OCMD") {
+      const expression = optionalContent.get("VE");
 
-      for (; i < rowBytes; ++i) {
-        buffer[pos] = buffer[pos - colors] + rawBytes[i];
-        pos++;
-      }
-    } else if (bits === 16) {
-      var bytesPerPixel = colors * 2;
+      if (Array.isArray(expression)) {
+        const result = [];
 
-      for (i = 0; i < bytesPerPixel; ++i) {
-        buffer[pos++] = rawBytes[i];
-      }
+        this._parseVisibilityExpression(expression, 0, result);
 
-      for (; i < rowBytes; i += 2) {
-        var sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 
0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff);
-        buffer[pos++] = sum >> 8 & 0xff;
-        buffer[pos++] = sum & 0xff;
+        if (result.length > 0) {
+          return {
+            type: "OCMD",
+            expression: result
+          };
+        }
       }
-    } else {
-      var compArray = new Uint8Array(colors + 1);
-      var bitMask = (1 << bits) - 1;
-      var j = 0,
-          k = bufferLength;
-      var columns = this.columns;
 
-      for (i = 0; i < columns; ++i) {
-        for (var kk = 0; kk < colors; ++kk) {
-          if (inbits < bits) {
-            inbuf = inbuf << 8 | rawBytes[j++] & 0xff;
-            inbits += 8;
-          }
+      const optionalContentGroups = optionalContent.get("OCGs");
 
-          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
-          inbits -= bits;
-          outbuf = outbuf << bits | compArray[kk];
-          outbits += bits;
+      if (Array.isArray(optionalContentGroups) || (0, _primitives.isDict)(optionalContentGroups)) {
+        const groupIds = [];
 
-          if (outbits >= 8) {
-            buffer[k++] = outbuf >> outbits - 8 & 0xff;
-            outbits -= 8;
+        if (Array.isArray(optionalContentGroups)) {
+          for (const ocg of optionalContentGroups) {
+            groupIds.push(ocg.toString());
           }
+        } else {
+          groupIds.push(optionalContentGroups.objId);
         }
-      }
 
-      if (outbits > 0) {
-        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
+        return {
+          type: optionalContentType,
+          ids: groupIds,
+          policy: (0, _primitives.isName)(optionalContent.get("P")) ? optionalContent.get("P").name : null,
+          expression: null
+        };
+      } else if ((0, _primitives.isRef)(optionalContentGroups)) {
+        return {
+          type: optionalContentType,
+          id: optionalContentGroups.toString()
+        };
       }
     }
 
-    this.bufferLength += rowBytes;
-  };
+    return null;
+  }
 
-  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {
-    var rowBytes = this.rowBytes;
-    var pixBytes = this.pixBytes;
-    var predictor = this.str.getByte();
-    var rawBytes = this.str.getBytes(rowBytes);
-    this.eof = !rawBytes.length;
+  getOperatorList({
+    stream,
+    task,
+    resources,
+    operatorList,
+    initialState = null,
+    fallbackFontDict = null
+  }) {
+    resources = resources || _primitives.Dict.empty;
+    initialState = initialState || new EvalState();
 
-    if (this.eof) {
-      return;
-    }
-
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
-
-    if (prevRow.length === 0) {
-      prevRow = new Uint8Array(rowBytes);
+    if (!operatorList) {
+      throw new Error('getOperatorList: missing "operatorList" parameter');
     }
 
-    var i,
-        j = bufferLength,
-        up,
-        c;
+    const self = this;
+    const xref = this.xref;
+    let parsingText = false;
+    const localImageCache = new _image_utils.LocalImageCache();
+    const localColorSpaceCache = new _image_utils.LocalColorSpaceCache();
+    const localGStateCache = new _image_utils.LocalGStateCache();
+    const localTilingPatternCache = new _image_utils.LocalTilingPatternCache();
+    const localShadingPatternCache = new Map();
 
-    switch (predictor) {
-      case 0:
-        for (i = 0; i < rowBytes; ++i) {
-          buffer[j++] = rawBytes[i];
-        }
+    const xobjs = resources.get("XObject") || _primitives.Dict.empty;
 
-        break;
+    const patterns = resources.get("Pattern") || _primitives.Dict.empty;
 
-      case 1:
-        for (i = 0; i < pixBytes; ++i) {
-          buffer[j++] = rawBytes[i];
-        }
+    const stateManager = new StateManager(initialState);
+    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+    const timeSlotManager = new TimeSlotManager();
 
-        for (; i < rowBytes; ++i) {
-          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff;
-          j++;
-        }
+    function closePendingRestoreOPS(argument) {
+      for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
+        operatorList.addOp(_util.OPS.restore, []);
+      }
+    }
 
-        break;
+    return new Promise(function promiseBody(resolve, reject) {
+      const next = function (promise) {
+        Promise.all([promise, operatorList.ready]).then(function () {
+          try {
+            promiseBody(resolve, reject);
+          } catch (ex) {
+            reject(ex);
+          }
+        }, reject);
+      };
 
-      case 2:
-        for (i = 0; i < rowBytes; ++i) {
-          buffer[j++] = prevRow[i] + rawBytes[i] & 0xff;
-        }
+      task.ensureNotTerminated();
+      timeSlotManager.reset();
+      const operation = {};
+      let stop, i, ii, cs, name, isValidName;
 
-        break;
+      while (!(stop = timeSlotManager.check())) {
+        operation.args = null;
 
-      case 3:
-        for (i = 0; i < pixBytes; ++i) {
-          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        if (!preprocessor.read(operation)) {
+          break;
         }
 
-        for (; i < rowBytes; ++i) {
-          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff;
-          j++;
-        }
+        let args = operation.args;
+        let fn = operation.fn;
 
-        break;
+        switch (fn | 0) {
+          case _util.OPS.paintXObject:
+            isValidName = args[0] instanceof _primitives.Name;
+            name = args[0].name;
 
-      case 4:
-        for (i = 0; i < pixBytes; ++i) {
-          up = prevRow[i];
-          c = rawBytes[i];
-          buffer[j++] = up + c;
-        }
+            if (isValidName) {
+              const localImage = localImageCache.getByName(name);
 
-        for (; i < rowBytes; ++i) {
-          up = prevRow[i];
-          var upLeft = prevRow[i - pixBytes];
-          var left = buffer[j - pixBytes];
-          var p = left + up - upLeft;
-          var pa = p - left;
+              if (localImage) {
+                operatorList.addOp(localImage.fn, localImage.args);
+                args = null;
+                continue;
+              }
+            }
 
-          if (pa < 0) {
-            pa = -pa;
-          }
+            next(new Promise(function (resolveXObject, rejectXObject) {
+              if (!isValidName) {
+                throw new _util.FormatError("XObject must be referred to by name.");
+              }
 
-          var pb = p - up;
+              let xobj = xobjs.getRaw(name);
 
-          if (pb < 0) {
-            pb = -pb;
-          }
+              if (xobj instanceof _primitives.Ref) {
+                const localImage = localImageCache.getByRef(xobj);
 
-          var pc = p - upLeft;
+                if (localImage) {
+                  operatorList.addOp(localImage.fn, localImage.args);
+                  resolveXObject();
+                  return;
+                }
 
-          if (pc < 0) {
-            pc = -pc;
-          }
+                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
 
-          c = rawBytes[i];
+                if (globalImage) {
+                  operatorList.addDependency(globalImage.objId);
+                  operatorList.addOp(globalImage.fn, globalImage.args);
+                  resolveXObject();
+                  return;
+                }
 
-          if (pa <= pb && pa <= pc) {
-            buffer[j++] = left + c;
-          } else if (pb <= pc) {
-            buffer[j++] = up + c;
-          } else {
-            buffer[j++] = upLeft + c;
-          }
-        }
+                xobj = xref.fetch(xobj);
+              }
 
-        break;
+              if (!(0, _primitives.isStream)(xobj)) {
+                throw new _util.FormatError("XObject should be a stream");
+              }
 
-      default:
-        throw new _util.FormatError(`Unsupported predictor: ${predictor}`);
-    }
+              const type = xobj.dict.get("Subtype");
 
-    this.bufferLength += rowBytes;
-  };
+              if (!(0, _primitives.isName)(type)) {
+                throw new _util.FormatError("XObject should have a Name subtype");
+              }
 
-  return PredictorStream;
-}();
+              if (type.name === "Form") {
+                stateManager.save();
+                self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), 
localColorSpaceCache).then(function () {
+                  stateManager.restore();
+                  resolveXObject();
+                }, rejectXObject);
+                return;
+              } else if (type.name === "Image") {
+                self.buildPaintImageXObject({
+                  resources,
+                  image: xobj,
+                  operatorList,
+                  cacheKey: name,
+                  localImageCache,
+                  localColorSpaceCache
+                }).then(resolveXObject, rejectXObject);
+                return;
+              } else if (type.name === "PS") {
+                (0, _util.info)("Ignored XObject subtype PS");
+              } else {
+                throw new _util.FormatError(`Unhandled XObject subtype ${type.name}`);
+              }
 
-exports.PredictorStream = PredictorStream;
+              resolveXObject();
+            }).catch(function (reason) {
+              if (reason instanceof _util.AbortException) {
+                return;
+              }
 
-var DecryptStream = function DecryptStreamClosure() {
-  function DecryptStream(str, maybeLength, decrypt) {
-    this.str = str;
-    this.dict = str.dict;
-    this.decrypt = decrypt;
-    this.nextChunk = null;
-    this.initialized = false;
-    DecodeStream.call(this, maybeLength);
-  }
+              if (self.options.ignoreErrors) {
+                self.handler.send("UnsupportedFeature", {
+                  featureId: _util.UNSUPPORTED_FEATURES.errorXObject
+                });
+                (0, _util.warn)(`getOperatorList - ignoring XObject: "${reason}".`);
+                return;
+              }
 
-  var chunkSize = 512;
-  DecryptStream.prototype = Object.create(DecodeStream.prototype);
+              throw reason;
+            }));
+            return;
 
-  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
-    var chunk;
+          case _util.OPS.setFont:
+            var fontSize = args[1];
+            next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, 
fallbackFontDict).then(function (loadedName) {
+              operatorList.addDependency(loadedName);
+              operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);
+            }));
+            return;
 
-    if (this.initialized) {
-      chunk = this.nextChunk;
-    } else {
-      chunk = this.str.getBytes(chunkSize);
-      this.initialized = true;
-    }
+          case _util.OPS.beginText:
+            parsingText = true;
+            break;
 
-    if (!chunk || chunk.length === 0) {
-      this.eof = true;
-      return;
-    }
+          case _util.OPS.endText:
+            parsingText = false;
+            break;
 
-    this.nextChunk = this.str.getBytes(chunkSize);
-    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
-    var decrypt = this.decrypt;
-    chunk = decrypt(chunk, !hasMoreData);
-    var bufferLength = this.bufferLength;
-    var i,
-        n = chunk.length;
-    var buffer = this.ensureBuffer(bufferLength + n);
+          case _util.OPS.endInlineImage:
+            var cacheKey = args[0].cacheKey;
 
-    for (i = 0; i < n; i++) {
-      buffer[bufferLength++] = chunk[i];
-    }
+            if (cacheKey) {
+              const localImage = localImageCache.getByName(cacheKey);
 
-    this.bufferLength = bufferLength;
-  };
+              if (localImage) {
+                operatorList.addOp(localImage.fn, localImage.args);
+                args = null;
+                continue;
+              }
+            }
 
-  return DecryptStream;
-}();
+            next(self.buildPaintImageXObject({
+              resources,
+              image: args[0],
+              isInline: true,
+              operatorList,
+              cacheKey,
+              localImageCache,
+              localColorSpaceCache
+            }));
+            return;
 
-exports.DecryptStream = DecryptStream;
+          case _util.OPS.showText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-var Ascii85Stream = function Ascii85StreamClosure() {
-  function Ascii85Stream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-    this.input = new Uint8Array(5);
+            args[0] = self.handleText(args[0], stateManager.state);
+            break;
 
-    if (maybeLength) {
-      maybeLength = 0.8 * maybeLength;
-    }
+          case _util.OPS.showSpacedText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-    DecodeStream.call(this, maybeLength);
-  }
+            var arr = args[0];
+            var combinedGlyphs = [];
+            var arrLength = arr.length;
+            var state = stateManager.state;
 
-  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
+            for (i = 0; i < arrLength; ++i) {
+              const arrItem = arr[i];
 
-  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
-    var TILDA_CHAR = 0x7e;
-    var Z_LOWER_CHAR = 0x7a;
-    var EOF = -1;
-    var str = this.str;
-    var c = str.getByte();
+              if ((0, _util.isString)(arrItem)) {
+                Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));
+              } else if ((0, _util.isNum)(arrItem)) {
+                combinedGlyphs.push(arrItem);
+              }
+            }
 
-    while ((0, _core_utils.isWhiteSpace)(c)) {
-      c = str.getByte();
-    }
+            args[0] = combinedGlyphs;
+            fn = _util.OPS.showText;
+            break;
 
-    if (c === EOF || c === TILDA_CHAR) {
-      this.eof = true;
-      return;
-    }
+          case _util.OPS.nextLineShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-    var bufferLength = this.bufferLength,
-        buffer;
-    var i;
+            operatorList.addOp(_util.OPS.nextLine);
+            args[0] = self.handleText(args[0], stateManager.state);
+            fn = _util.OPS.showText;
+            break;
 
-    if (c === Z_LOWER_CHAR) {
-      buffer = this.ensureBuffer(bufferLength + 4);
+          case _util.OPS.nextLineSetSpacingShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-      for (i = 0; i < 4; ++i) {
-        buffer[bufferLength + i] = 0;
-      }
+            operatorList.addOp(_util.OPS.nextLine);
+            operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);
+            operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);
+            args[0] = self.handleText(args[0], stateManager.state);
+            fn = _util.OPS.showText;
+            break;
 
-      this.bufferLength += 4;
-    } else {
-      var input = this.input;
-      input[0] = c;
+          case _util.OPS.setTextRenderingMode:
+            stateManager.state.textRenderingMode = args[0];
+            break;
 
-      for (i = 1; i < 5; ++i) {
-        c = str.getByte();
+          case _util.OPS.setFillColorSpace:
+            {
+              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);
 
-        while ((0, _core_utils.isWhiteSpace)(c)) {
-          c = str.getByte();
-        }
+              if (cachedColorSpace) {
+                stateManager.state.fillColorSpace = cachedColorSpace;
+                continue;
+              }
 
-        input[i] = c;
+              next(self.parseColorSpace({
+                cs: args[0],
+                resources,
+                localColorSpaceCache
+              }).then(function (colorSpace) {
+                if (colorSpace) {
+                  stateManager.state.fillColorSpace = colorSpace;
+                }
+              }));
+              return;
+            }
 
-        if (c === EOF || c === TILDA_CHAR) {
-          break;
-        }
-      }
+          case _util.OPS.setStrokeColorSpace:
+            {
+              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);
 
-      buffer = this.ensureBuffer(bufferLength + i - 1);
-      this.bufferLength += i - 1;
+              if (cachedColorSpace) {
+                stateManager.state.strokeColorSpace = cachedColorSpace;
+                continue;
+              }
 
-      if (i < 5) {
-        for (; i < 5; ++i) {
-          input[i] = 0x21 + 84;
-        }
+              next(self.parseColorSpace({
+                cs: args[0],
+                resources,
+                localColorSpaceCache
+              }).then(function (colorSpace) {
+                if (colorSpace) {
+                  stateManager.state.strokeColorSpace = colorSpace;
+                }
+              }));
+              return;
+            }
 
-        this.eof = true;
-      }
+          case _util.OPS.setFillColor:
+            cs = stateManager.state.fillColorSpace;
+            args = cs.getRgb(args, 0);
+            fn = _util.OPS.setFillRGBColor;
+            break;
 
-      var t = 0;
+          case _util.OPS.setStrokeColor:
+            cs = stateManager.state.strokeColorSpace;
+            args = cs.getRgb(args, 0);
+            fn = _util.OPS.setStrokeRGBColor;
+            break;
 
-      for (i = 0; i < 5; ++i) {
-        t = t * 85 + (input[i] - 0x21);
-      }
+          case _util.OPS.setFillGray:
+            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
+            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
+            fn = _util.OPS.setFillRGBColor;
+            break;
 
-      for (i = 3; i >= 0; --i) {
-        buffer[bufferLength + i] = t & 0xff;
-        t >>= 8;
-      }
-    }
-  };
+          case _util.OPS.setStrokeGray:
+            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
+            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
+            fn = _util.OPS.setStrokeRGBColor;
+            break;
 
-  return Ascii85Stream;
-}();
+          case _util.OPS.setFillCMYKColor:
+            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;
+            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
+            fn = _util.OPS.setFillRGBColor;
+            break;
 
-exports.Ascii85Stream = Ascii85Stream;
+          case _util.OPS.setStrokeCMYKColor:
+            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;
+            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
+            fn = _util.OPS.setStrokeRGBColor;
+            break;
 
-var AsciiHexStream = function AsciiHexStreamClosure() {
-  function AsciiHexStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-    this.firstDigit = -1;
+          case _util.OPS.setFillRGBColor:
+            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;
+            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
+            break;
 
-    if (maybeLength) {
-      maybeLength = 0.5 * maybeLength;
-    }
+          case _util.OPS.setStrokeRGBColor:
+            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;
+            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
+            break;
 
-    DecodeStream.call(this, maybeLength);
-  }
+          case _util.OPS.setFillColorN:
+            cs = stateManager.state.fillColorSpace;
 
-  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
+            if (cs.name === "Pattern") {
+              next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, 
task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
+              return;
+            }
 
-  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
-    var UPSTREAM_BLOCK_SIZE = 8000;
-    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
+            args = cs.getRgb(args, 0);
+            fn = _util.OPS.setFillRGBColor;
+            break;
 
-    if (!bytes.length) {
-      this.eof = true;
-      return;
-    }
+          case _util.OPS.setStrokeColorN:
+            cs = stateManager.state.strokeColorSpace;
 
-    var maxDecodeLength = bytes.length + 1 >> 1;
-    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
-    var bufferLength = this.bufferLength;
-    var firstDigit = this.firstDigit;
+            if (cs.name === "Pattern") {
+              next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, 
task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
+              return;
+            }
 
-    for (var i = 0, ii = bytes.length; i < ii; i++) {
-      var ch = bytes[i],
-          digit;
+            args = cs.getRgb(args, 0);
+            fn = _util.OPS.setStrokeRGBColor;
+            break;
 
-      if (ch >= 0x30 && ch <= 0x39) {
-        digit = ch & 0x0f;
-      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
-        digit = (ch & 0x0f) + 9;
-      } else if (ch === 0x3e) {
-        this.eof = true;
-        break;
-      } else {
-        continue;
-      }
+          case _util.OPS.shadingFill:
+            var shadingRes = resources.get("Shading");
 
-      if (firstDigit < 0) {
-        firstDigit = digit;
-      } else {
-        buffer[bufferLength++] = firstDigit << 4 | digit;
-        firstDigit = -1;
-      }
-    }
+            if (!shadingRes) {
+              throw new _util.FormatError("No shading resource found");
+            }
 
-    if (firstDigit >= 0 && this.eof) {
-      buffer[bufferLength++] = firstDigit << 4;
-      firstDigit = -1;
-    }
+            var shading = shadingRes.get(args[0].name);
 
-    this.firstDigit = firstDigit;
-    this.bufferLength = bufferLength;
-  };
+            if (!shading) {
+              throw new _util.FormatError("No shading object found");
+            }
 
-  return AsciiHexStream;
-}();
+            const patternId = self.parseShading({
+              keyObj: shading,
+              shading,
+              resources,
+              localColorSpaceCache,
+              localShadingPatternCache
+            });
+            args = [patternId];
+            fn = _util.OPS.shadingFill;
+            break;
 
-exports.AsciiHexStream = AsciiHexStream;
+          case _util.OPS.setGState:
+            isValidName = args[0] instanceof _primitives.Name;
+            name = args[0].name;
 
-var RunLengthStream = function RunLengthStreamClosure() {
-  function RunLengthStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-    DecodeStream.call(this, maybeLength);
-  }
+            if (isValidName) {
+              const localGStateObj = localGStateCache.getByName(name);
 
-  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
+              if (localGStateObj) {
+                if (localGStateObj.length > 0) {
+                  operatorList.addOp(_util.OPS.setGState, [localGStateObj]);
+                }
 
-  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
-    var repeatHeader = this.str.getBytes(2);
+                args = null;
+                continue;
+              }
+            }
 
-    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
-      this.eof = true;
-      return;
-    }
+            next(new Promise(function (resolveGState, rejectGState) {
+              if (!isValidName) {
+                throw new _util.FormatError("GState must be referred to by name.");
+              }
 
-    var buffer;
-    var bufferLength = this.bufferLength;
-    var n = repeatHeader[0];
+              const extGState = resources.get("ExtGState");
 
-    if (n < 128) {
-      buffer = this.ensureBuffer(bufferLength + n + 1);
-      buffer[bufferLength++] = repeatHeader[1];
+              if (!(extGState instanceof _primitives.Dict)) {
+                throw new _util.FormatError("ExtGState should be a dictionary.");
+              }
 
-      if (n > 0) {
-        var source = this.str.getBytes(n);
-        buffer.set(source, bufferLength);
-        bufferLength += n;
-      }
-    } else {
-      n = 257 - n;
-      var b = repeatHeader[1];
-      buffer = this.ensureBuffer(bufferLength + n + 1);
+              const gState = extGState.get(name);
 
-      for (var i = 0; i < n; i++) {
-        buffer[bufferLength++] = b;
-      }
-    }
+              if (!(gState instanceof _primitives.Dict)) {
+                throw new _util.FormatError("GState should be a dictionary.");
+              }
 
-    this.bufferLength = bufferLength;
-  };
-
-  return RunLengthStream;
-}();
-
-exports.RunLengthStream = RunLengthStream;
-
-var LZWStream = function LZWStreamClosure() {
-  function LZWStream(str, maybeLength, earlyChange) {
-    this.str = str;
-    this.dict = str.dict;
-    this.cachedData = 0;
-    this.bitsCached = 0;
-    var maxLzwDictionarySize = 4096;
-    var lzwState = {
-      earlyChange,
-      codeLength: 9,
-      nextCode: 258,
-      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
-      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
-      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
-      currentSequence: new Uint8Array(maxLzwDictionarySize),
-      currentSequenceLength: 0
-    };
-
-    for (var i = 0; i < 256; ++i) {
-      lzwState.dictionaryValues[i] = i;
-      lzwState.dictionaryLengths[i] = 1;
-    }
-
-    this.lzwState = lzwState;
-    DecodeStream.call(this, maybeLength);
-  }
+              self.setGState({
+                resources,
+                gState,
+                operatorList,
+                cacheKey: name,
+                task,
+                stateManager,
+                localGStateCache,
+                localColorSpaceCache
+              }).then(resolveGState, rejectGState);
+            }).catch(function (reason) {
+              if (reason instanceof _util.AbortException) {
+                return;
+              }
 
-  LZWStream.prototype = Object.create(DecodeStream.prototype);
+              if (self.options.ignoreErrors) {
+                self.handler.send("UnsupportedFeature", {
+                  featureId: _util.UNSUPPORTED_FEATURES.errorExtGState
+                });
+                (0, _util.warn)(`getOperatorList - ignoring ExtGState: "${reason}".`);
+                return;
+              }
 
-  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
-    var bitsCached = this.bitsCached;
-    var cachedData = this.cachedData;
+              throw reason;
+            }));
+            return;
 
-    while (bitsCached < n) {
-      var c = this.str.getByte();
+          case _util.OPS.moveTo:
+          case _util.OPS.lineTo:
+          case _util.OPS.curveTo:
+          case _util.OPS.curveTo2:
+          case _util.OPS.curveTo3:
+          case _util.OPS.closePath:
+          case _util.OPS.rectangle:
+            self.buildPath(operatorList, fn, args, parsingText);
+            continue;
 
-      if (c === -1) {
-        this.eof = true;
-        return null;
-      }
+          case _util.OPS.markPoint:
+          case _util.OPS.markPointProps:
+          case _util.OPS.beginCompat:
+          case _util.OPS.endCompat:
+            continue;
 
-      cachedData = cachedData << 8 | c;
-      bitsCached += 8;
-    }
+          case _util.OPS.beginMarkedContentProps:
+            if (!(0, _primitives.isName)(args[0])) {
+              (0, _util.warn)(`Expected name for beginMarkedContentProps arg0=${args[0]}`);
+              continue;
+            }
 
-    this.bitsCached = bitsCached -= n;
-    this.cachedData = cachedData;
-    this.lastCode = null;
-    return cachedData >>> bitsCached & (1 << n) - 1;
-  };
+            if (args[0].name === "OC") {
+              next(self.parseMarkedContentProps(args[1], resources).then(data => {
+                operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", data]);
+              }).catch(reason => {
+                if (reason instanceof _util.AbortException) {
+                  return;
+                }
 
-  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
-    var blockSize = 512;
-    var estimatedDecodedSize = blockSize * 2,
-        decodedSizeDelta = blockSize;
-    var i, j, q;
-    var lzwState = this.lzwState;
+                if (self.options.ignoreErrors) {
+                  self.handler.send("UnsupportedFeature", {
+                    featureId: _util.UNSUPPORTED_FEATURES.errorMarkedContent
+                  });
+                  (0, _util.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`);
+                  return;
+                }
 
-    if (!lzwState) {
-      return;
-    }
+                throw reason;
+              }));
+              return;
+            }
 
-    var earlyChange = lzwState.earlyChange;
-    var nextCode = lzwState.nextCode;
-    var dictionaryValues = lzwState.dictionaryValues;
-    var dictionaryLengths = lzwState.dictionaryLengths;
-    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
-    var codeLength = lzwState.codeLength;
-    var prevCode = lzwState.prevCode;
-    var currentSequence = lzwState.currentSequence;
-    var currentSequenceLength = lzwState.currentSequenceLength;
-    var decodedLength = 0;
-    var currentBufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+            args = [args[0].name, args[1] instanceof _primitives.Dict ? args[1].get("MCID") : null];
+            break;
 
-    for (i = 0; i < blockSize; i++) {
-      var code = this.readBits(codeLength);
-      var hasPrev = currentSequenceLength > 0;
+          case _util.OPS.beginMarkedContent:
+          case _util.OPS.endMarkedContent:
+          default:
+            if (args !== null) {
+              for (i = 0, ii = args.length; i < ii; i++) {
+                if (args[i] instanceof _primitives.Dict) {
+                  break;
+                }
+              }
 
-      if (code < 256) {
-        currentSequence[0] = code;
-        currentSequenceLength = 1;
-      } else if (code >= 258) {
-        if (code < nextCode) {
-          currentSequenceLength = dictionaryLengths[code];
+              if (i < ii) {
+                (0, _util.warn)("getOperatorList - ignoring operator: " + fn);
+                continue;
+              }
+            }
 
-          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
-            currentSequence[j] = dictionaryValues[q];
-            q = dictionaryPrevCodes[q];
-          }
-        } else {
-          currentSequence[currentSequenceLength++] = currentSequence[0];
         }
-      } else if (code === 256) {
-        codeLength = 9;
-        nextCode = 258;
-        currentSequenceLength = 0;
-        continue;
-      } else {
-        this.eof = true;
-        delete this.lzwState;
-        break;
-      }
 
-      if (hasPrev) {
-        dictionaryPrevCodes[nextCode] = prevCode;
-        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
-        dictionaryValues[nextCode] = currentSequence[0];
-        nextCode++;
-        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : 
Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
+        operatorList.addOp(fn, args);
       }
 
-      prevCode = code;
-      decodedLength += currentSequenceLength;
-
-      if (estimatedDecodedSize < decodedLength) {
-        do {
-          estimatedDecodedSize += decodedSizeDelta;
-        } while (estimatedDecodedSize < decodedLength);
-
-        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+      if (stop) {
+        next(deferred);
+        return;
       }
 
-      for (j = 0; j < currentSequenceLength; j++) {
-        buffer[currentBufferLength++] = currentSequence[j];
+      closePendingRestoreOPS();
+      resolve();
+    }).catch(reason => {
+      if (reason instanceof _util.AbortException) {
+        return;
       }
-    }
-
-    lzwState.nextCode = nextCode;
-    lzwState.codeLength = codeLength;
-    lzwState.prevCode = prevCode;
-    lzwState.currentSequenceLength = currentSequenceLength;
-    this.bufferLength = currentBufferLength;
-  };
-
-  return LZWStream;
-}();
 
-exports.LZWStream = LZWStream;
+      if (this.options.ignoreErrors) {
+        this.handler.send("UnsupportedFeature", {
+          featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList
+        });
+        (0, _util.warn)(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
+        closePendingRestoreOPS();
+        return;
+      }
 
-var NullStream = function NullStreamClosure() {
-  function NullStream() {
-    Stream.call(this, new Uint8Array(0));
+      throw reason;
+    });
   }
 
-  NullStream.prototype = Stream.prototype;
-  return NullStream;
-}();
-
-exports.NullStream = NullStream;
-
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.CCITTFaxStream = void 0;
-
-var _primitives = __w_pdfjs_require__(5);
+  getTextContent({
+    stream,
+    task,
+    resources,
+    stateManager = null,
+    normalizeWhitespace = false,
+    combineTextItems = false,
+    includeMarkedContent = false,
+    sink,
+    seenStyles = new Set()
+  }) {
+    resources = resources || _primitives.Dict.empty;
+    stateManager = stateManager || new StateManager(new TextState());
+    const WhitespaceRegexp = /\s/g;
+    const textContent = {
+      items: [],
+      styles: Object.create(null)
+    };
+    const textContentItem = {
+      initialized: false,
+      str: [],
+      totalWidth: 0,
+      totalHeight: 0,
+      width: 0,
+      height: 0,
+      vertical: false,
+      lastCharSize: 0,
+      prevTransform: null,
+      textAdvanceScale: 0,
+      spaceWidth: 0,
+      spaceInFlowMin: 0,
+      spaceInFlowMax: 0,
+      trackingSpaceMin: Infinity,
+      transform: null,
+      fontName: null,
+      hasEOL: false,
+      isLastCharWhiteSpace: false
+    };
+    const TRACKING_SPACE_FACTOR = 0.3;
+    const SPACE_IN_FLOW_MIN_FACTOR = 0.3;
+    const SPACE_IN_FLOW_MAX_FACTOR = 1.3;
+    const self = this;
+    const xref = this.xref;
+    const showSpacedTextBuffer = [];
+    let xobjs = null;
+    const emptyXObjectCache = new _image_utils.LocalImageCache();
+    const emptyGStateCache = new _image_utils.LocalGStateCache();
+    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+    let textState;
 
-var _ccitt = __w_pdfjs_require__(14);
+    function getCurrentTextTransform() {
+      const font = textState.font;
+      const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, 
textState.textRise];
 
-var _stream = __w_pdfjs_require__(12);
+      if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !(0, 
_util.isArrayEqual)(textState.fontMatrix, _util.FONT_IDENTITY_MATRIX)) {
+        const glyphHeight = font.bbox[3] - font.bbox[1];
 
-var CCITTFaxStream = function CCITTFaxStreamClosure() {
-  function CCITTFaxStream(str, maybeLength, params) {
-    this.str = str;
-    this.dict = str.dict;
+        if (glyphHeight > 0) {
+          tsm[3] *= glyphHeight * textState.fontMatrix[3];
+        }
+      }
 
-    if (!(0, _primitives.isDict)(params)) {
-      params = _primitives.Dict.empty;
+      return _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));
     }
 
-    const source = {
-      next() {
-        return str.getByte();
+    function ensureTextContentItem() {
+      if (textContentItem.initialized) {
+        return textContentItem;
       }
 
-    };
-    this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, {
-      K: params.get("K"),
-      EndOfLine: params.get("EndOfLine"),
-      EncodedByteAlign: params.get("EncodedByteAlign"),
-      Columns: params.get("Columns"),
-      Rows: params.get("Rows"),
-      EndOfBlock: params.get("EndOfBlock"),
-      BlackIs1: params.get("BlackIs1")
-    });
+      const font = textState.font,
+            loadedName = font.loadedName;
 
-    _stream.DecodeStream.call(this, maybeLength);
-  }
+      if (!seenStyles.has(loadedName)) {
+        seenStyles.add(loadedName);
+        textContent.styles[loadedName] = {
+          fontFamily: font.fallbackName,
+          ascent: font.ascent,
+          descent: font.descent,
+          vertical: font.vertical
+        };
+      }
 
-  CCITTFaxStream.prototype = Object.create(_stream.DecodeStream.prototype);
+      textContentItem.fontName = loadedName;
+      const trm = textContentItem.transform = getCurrentTextTransform();
 
-  CCITTFaxStream.prototype.readBlock = function () {
-    while (!this.eof) {
-      const c = this.ccittFaxDecoder.readNextChar();
+      if (!font.vertical) {
+        textContentItem.width = textContentItem.totalWidth = 0;
+        textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]);
+        textContentItem.vertical = false;
+      } else {
+        textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]);
+        textContentItem.height = textContentItem.totalHeight = 0;
+        textContentItem.vertical = true;
+      }
 
-      if (c === -1) {
-        this.eof = true;
-        return;
+      const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
+      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
+      textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
+      textContentItem.lastCharSize = textContentItem.lastCharSize || 0;
+      const spaceWidth = font.spaceWidth / 1000 * textState.fontSize;
+
+      if (spaceWidth) {
+        textContentItem.spaceWidth = spaceWidth;
+        textContentItem.trackingSpaceMin = spaceWidth * TRACKING_SPACE_FACTOR;
+        textContentItem.spaceInFlowMin = spaceWidth * SPACE_IN_FLOW_MIN_FACTOR;
+        textContentItem.spaceInFlowMax = spaceWidth * SPACE_IN_FLOW_MAX_FACTOR;
+      } else {
+        textContentItem.spaceWidth = 0;
+        textContentItem.trackingSpaceMin = Infinity;
       }
 
-      this.ensureBuffer(this.bufferLength + 1);
-      this.buffer[this.bufferLength++] = c;
+      textContentItem.hasEOL = false;
+      textContentItem.initialized = true;
+      return textContentItem;
     }
-  };
 
-  return CCITTFaxStream;
-}();
+    function updateAdvanceScale() {
+      if (!textContentItem.initialized) {
+        return;
+      }
 
-exports.CCITTFaxStream = CCITTFaxStream;
+      const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
+      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
+      const scaleFactor = scaleCtmX * scaleLineX;
 
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+      if (scaleFactor === textContentItem.textAdvanceScale) {
+        return;
+      }
 
-"use strict";
+      if (!textContentItem.vertical) {
+        textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
+        textContentItem.width = 0;
+      } else {
+        textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
+        textContentItem.height = 0;
+      }
 
+      textContentItem.textAdvanceScale = scaleFactor;
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.CCITTFaxDecoder = void 0;
+    function replaceWhitespace(str) {
+      const ii = str.length;
+      let i = 0,
+          code;
 
-var _util = __w_pdfjs_require__(2);
+      while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7f) {
+        i++;
+      }
 
-const CCITTFaxDecoder = function CCITTFaxDecoder() {
-  const ccittEOL = -2;
-  const ccittEOF = -1;
-  const twoDimPass = 0;
-  const twoDimHoriz = 1;
-  const twoDimVert0 = 2;
-  const twoDimVertR1 = 3;
-  const twoDimVertL1 = 4;
-  const twoDimVertR2 = 5;
-  const twoDimVertL2 = 6;
-  const twoDimVertR3 = 7;
-  const twoDimVertL3 = 8;
-  const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, 
twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, 
twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], 
[3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, 
twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], 
[3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, 
twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1]
 , [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, 
twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVer
 t0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0]];
-  const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], 
[-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 
1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 
1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];
-  const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], 
[8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], 
[8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], 
[7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], 
[8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], 
[6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], 
[6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], 
[8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], 
[7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], 
[8, 0], [8, 0], [8, 320]
 , [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 
10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 
11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 
27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 
1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 
50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 
56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 
192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 
448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 
896], [9, 960], [9, 1024], 
 [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], 
[4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 
2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], 
[4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 
3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], 
[4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], 
[5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], 
[5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], 
[5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 
9], [5, 9], [5, 9], [5,
  9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], 
[6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 
4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], 
[4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 
4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], 
[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 
5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], 
[6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], 
[5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], 
[5, 64], [4, 6], [4, 6], 
 [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 
6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], 
[4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 
7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], 
[4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];
-  const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], 
[-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], 
[-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], 
[-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 
2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 
2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 
2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 
18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], 
[13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], 
[12, 59], [12, 59], [12, 6
 0], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], 
[11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 
512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 
1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];
-  const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 
13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], 
[12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 
16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 
32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], 
[8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], 
[7, 11], [7, 11], [7, 1
 1], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 
11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 
15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], 
[12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], 
[12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];
-  const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 
6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], 
[3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 
3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], 
[2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 
2]];
-
-  function CCITTFaxDecoder(source, options = {}) {
-    if (!source || typeof source.next !== "function") {
-      throw new Error('CCITTFaxDecoder - invalid "source" parameter.');
+      return i < ii ? str.replace(WhitespaceRegexp, " ") : str;
     }
 
-    this.source = source;
-    this.eof = false;
-    this.encoding = options.K || 0;
-    this.eoline = options.EndOfLine || false;
-    this.byteAlign = options.EncodedByteAlign || false;
-    this.columns = options.Columns || 1728;
-    this.rows = options.Rows || 0;
-    let eoblock = options.EndOfBlock;
-
-    if (eoblock === null || eoblock === undefined) {
-      eoblock = true;
+    function runBidiTransform(textChunk) {
+      const text = textChunk.str.join("");
+      const bidiResult = (0, _bidi.bidi)(text, -1, textChunk.vertical);
+      const str = normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str;
+      return {
+        str,
+        dir: bidiResult.dir,
+        width: textChunk.totalWidth,
+        height: textChunk.totalHeight,
+        transform: textChunk.transform,
+        fontName: textChunk.fontName,
+        hasEOL: textChunk.hasEOL
+      };
     }
 
-    this.eoblock = eoblock;
-    this.black = options.BlackIs1 || false;
-    this.codingLine = new Uint32Array(this.columns + 1);
-    this.refLine = new Uint32Array(this.columns + 2);
-    this.codingLine[0] = this.columns;
-    this.codingPos = 0;
-    this.row = 0;
-    this.nextLine2D = this.encoding < 0;
-    this.inputBits = 0;
-    this.inputBuf = 0;
-    this.outputBits = 0;
-    this.rowsDone = false;
-    let code1;
-
-    while ((code1 = this._lookBits(12)) === 0) {
-      this._eatBits(1);
-    }
+    function handleSetFont(fontName, fontRef) {
+      return self.loadFont(fontName, fontRef, resources).then(function (translated) {
+        if (!translated.font.isType3Font) {
+          return translated;
+        }
 
-    if (code1 === 1) {
-      this._eatBits(12);
+        return translated.loadType3Data(self, resources, task).catch(function () {}).then(function () {
+          return translated;
+        });
+      }).then(function (translated) {
+        textState.font = translated.font;
+        textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+      });
     }
 
-    if (this.encoding > 0) {
-      this.nextLine2D = !this._lookBits(1);
+    function compareWithLastPosition(fontSize) {
+      if (!combineTextItems || !textState.font || !textContentItem.prevTransform) {
+        return;
+      }
 
-      this._eatBits(1);
-    }
-  }
+      const currentTransform = getCurrentTextTransform();
+      const posX = currentTransform[4];
+      const posY = currentTransform[5];
+      const lastPosX = textContentItem.prevTransform[4];
+      const lastPosY = textContentItem.prevTransform[5];
 
-  CCITTFaxDecoder.prototype = {
-    readNextChar() {
-      if (this.eof) {
-        return -1;
+      if (lastPosX === posX && lastPosY === posY) {
+        return;
       }
 
-      const refLine = this.refLine;
-      const codingLine = this.codingLine;
-      const columns = this.columns;
-      let refPos, blackPixels, bits, i;
+      const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale;
+      const advanceY = (posY - lastPosY) / textContentItem.textAdvanceScale;
+      const HALF_LAST_CHAR = -0.5 * textContentItem.lastCharSize;
 
-      if (this.outputBits === 0) {
-        if (this.rowsDone) {
-          this.eof = true;
+      if (textState.font.vertical) {
+        if (Math.abs(advanceX) > textContentItem.width / textContentItem.textAdvanceScale) {
+          appendEOL();
+          return;
         }
 
-        if (this.eof) {
-          return -1;
+        if (HALF_LAST_CHAR > advanceY) {
+          return;
         }
 
-        this.err = false;
-        let code1, code2, code3;
-
-        if (this.nextLine2D) {
-          for (i = 0; codingLine[i] < columns; ++i) {
-            refLine[i] = codingLine[i];
+        if (advanceY > textContentItem.trackingSpaceMin) {
+          textContentItem.height += advanceY;
+        } else if (!addFakeSpaces(advanceY, 0, textContentItem.prevTransform)) {
+          if (textContentItem.str.length === 0) {
+            textContent.items.push({
+              str: " ",
+              dir: "ltr",
+              width: 0,
+              height: advanceY,
+              transform: textContentItem.prevTransform,
+              fontName: textContentItem.fontName,
+              hasEOL: false
+            });
+            textContentItem.isLastCharWhiteSpace = true;
+          } else {
+            textContentItem.height += advanceY;
           }
+        }
 
-          refLine[i++] = columns;
-          refLine[i] = columns;
-          codingLine[0] = 0;
-          this.codingPos = 0;
-          refPos = 0;
-          blackPixels = 0;
+        return;
+      }
 
-          while (codingLine[this.codingPos] < columns) {
-            code1 = this._getTwoDimCode();
+      if (Math.abs(advanceY) > textContentItem.height / textContentItem.textAdvanceScale) {
+        appendEOL();
+        return;
+      }
 
-            switch (code1) {
-              case twoDimPass:
-                this._addPixels(refLine[refPos + 1], blackPixels);
+      if (HALF_LAST_CHAR > advanceX) {
+        return;
+      }
 
-                if (refLine[refPos + 1] < columns) {
-                  refPos += 2;
-                }
+      if (advanceX <= textContentItem.trackingSpaceMin) {
+        textContentItem.width += advanceX;
+      } else if (!addFakeSpaces(advanceX, 0, textContentItem.prevTransform)) {
+        if (textContentItem.str.length === 0) {
+          textContent.items.push({
+            str: " ",
+            dir: "ltr",
+            width: advanceX,
+            height: 0,
+            transform: textContentItem.prevTransform,
+            fontName: textContentItem.fontName,
+            hasEOL: false
+          });
+          textContentItem.isLastCharWhiteSpace = true;
+        } else {
+          textContentItem.width += advanceX;
+        }
+      }
+    }
 
-                break;
+    function buildTextContentItem({
+      chars,
+      extraSpacing,
+      isFirstChunk
+    }) {
+      const font = textState.font;
 
-              case twoDimHoriz:
-                code1 = code2 = 0;
+      if (!chars) {
+        const charSpacing = textState.charSpacing + extraSpacing;
 
-                if (blackPixels) {
-                  do {
-                    code1 += code3 = this._getBlackCode();
-                  } while (code3 >= 64);
+        if (charSpacing) {
+          if (!font.vertical) {
+            textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
+          } else {
+            textState.translateTextMatrix(0, charSpacing);
+          }
+        }
 
-                  do {
-                    code2 += code3 = this._getWhiteCode();
-                  } while (code3 >= 64);
-                } else {
-                  do {
-                    code1 += code3 = this._getWhiteCode();
-                  } while (code3 >= 64);
+        return;
+      }
 
-                  do {
-                    code2 += code3 = this._getBlackCode();
-                  } while (code3 >= 64);
-                }
+      const NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();
+      const glyphs = font.charsToGlyphs(chars);
+      const scale = textState.fontMatrix[0] * textState.fontSize;
 
-                this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
+      if (isFirstChunk) {
+        compareWithLastPosition(scale);
+      }
 
-                if (codingLine[this.codingPos] < columns) {
-                  this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);
-                }
+      let textChunk = ensureTextContentItem();
+      let size = 0;
+      let lastCharSize = 0;
 
-                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                  refPos += 2;
-                }
+      for (let i = 0, ii = glyphs.length; i < ii; i++) {
+        const glyph = glyphs[i];
+        let charSpacing = textState.charSpacing + (i === ii - 1 ? extraSpacing : 0);
+        let glyphUnicode = glyph.unicode;
 
-                break;
+        if (glyph.isSpace) {
+          charSpacing += textState.wordSpacing;
+          textChunk.isLastCharWhiteSpace = true;
+        } else {
+          glyphUnicode = NormalizedUnicodes[glyphUnicode] || glyphUnicode;
+          glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);
+          textChunk.isLastCharWhiteSpace = false;
+        }
 
-              case twoDimVertR3:
-                this._addPixels(refLine[refPos] + 3, blackPixels);
+        textChunk.str.push(glyphUnicode);
+        const glyphWidth = font.vertical && glyph.vmetric ? glyph.vmetric[0] : glyph.width;
+        let scaledDim = glyphWidth * scale;
 
-                blackPixels ^= 1;
+        if (!font.vertical) {
+          scaledDim *= textState.textHScale;
+          textState.translateTextMatrix(scaledDim, 0);
+        } else {
+          textState.translateTextMatrix(0, scaledDim);
+          scaledDim = Math.abs(scaledDim);
+        }
 
-                if (codingLine[this.codingPos] < columns) {
-                  ++refPos;
+        size += scaledDim;
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+        if (charSpacing) {
+          if (!font.vertical) {
+            charSpacing *= textState.textHScale;
+          }
 
-                break;
+          scaledDim += charSpacing;
+          const wasSplit = charSpacing > textContentItem.trackingSpaceMin && addFakeSpaces(charSpacing, 
size);
 
-              case twoDimVertR2:
-                this._addPixels(refLine[refPos] + 2, blackPixels);
+          if (!font.vertical) {
+            textState.translateTextMatrix(charSpacing, 0);
+          } else {
+            textState.translateTextMatrix(0, charSpacing);
+          }
 
-                blackPixels ^= 1;
+          if (wasSplit) {
+            textChunk = ensureTextContentItem();
+            size = 0;
+          } else {
+            size += charSpacing;
+          }
+        }
 
-                if (codingLine[this.codingPos] < columns) {
-                  ++refPos;
+        lastCharSize = scaledDim;
+      }
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+      textChunk.lastCharSize = lastCharSize;
 
-                break;
+      if (!font.vertical) {
+        textChunk.width += size;
+      } else {
+        textChunk.height += size;
+      }
 
-              case twoDimVertR1:
-                this._addPixels(refLine[refPos] + 1, blackPixels);
+      textChunk.prevTransform = getCurrentTextTransform();
+    }
 
-                blackPixels ^= 1;
+    function appendEOL() {
+      if (textContentItem.initialized) {
+        textContentItem.hasEOL = true;
+        flushTextContentItem();
+      } else if (textContent.items.length > 0) {
+        textContent.items[textContent.items.length - 1].hasEOL = true;
+      } else {
+        textContent.items.push({
+          str: "",
+          dir: "ltr",
+          width: 0,
+          height: 0,
+          transform: getCurrentTextTransform(),
+          fontName: textState.font.loadedName,
+          hasEOL: true
+        });
+      }
 
-                if (codingLine[this.codingPos] < columns) {
-                  ++refPos;
+      textContentItem.isLastCharWhiteSpace = false;
+      textContentItem.lastCharSize = 0;
+    }
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+    function addFakeSpaces(width, size, transf = null) {
+      if (textContentItem.spaceInFlowMin <= width && width <= textContentItem.spaceInFlowMax) {
+        if (textContentItem.initialized) {
+          textContentItem.str.push(" ");
+          textContentItem.isLastCharWhiteSpace = true;
+        }
 
-                break;
+        return false;
+      }
 
-              case twoDimVert0:
-                this._addPixels(refLine[refPos], blackPixels);
+      const fontName = textContentItem.fontName;
+      let height = 0;
+      width *= textContentItem.textAdvanceScale;
 
-                blackPixels ^= 1;
+      if (!textContentItem.vertical) {
+        textContentItem.width += size;
+      } else {
+        textContentItem.height += size;
+        height = width;
+        width = 0;
+      }
 
-                if (codingLine[this.codingPos] < columns) {
-                  ++refPos;
+      flushTextContentItem();
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+      if (textContentItem.isLastCharWhiteSpace) {
+        return true;
+      }
 
-                break;
+      textContentItem.isLastCharWhiteSpace = true;
+      textContent.items.push({
+        str: " ",
+        dir: "ltr",
+        width,
+        height,
+        transform: transf ? transf : getCurrentTextTransform(),
+        fontName,
+        hasEOL: false
+      });
+      return true;
+    }
 
-              case twoDimVertL3:
-                this._addPixelsNeg(refLine[refPos] - 3, blackPixels);
+    function flushTextContentItem() {
+      if (!textContentItem.initialized || !textContentItem.str) {
+        return;
+      }
 
-                blackPixels ^= 1;
+      if (!textContentItem.vertical) {
+        textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
+      } else {
+        textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
+      }
 
-                if (codingLine[this.codingPos] < columns) {
-                  if (refPos > 0) {
-                    --refPos;
-                  } else {
-                    ++refPos;
-                  }
+      textContent.items.push(runBidiTransform(textContentItem));
+      textContentItem.initialized = false;
+      textContentItem.str.length = 0;
+    }
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+    function enqueueChunk() {
+      const length = textContent.items.length;
 
-                break;
+      if (length > 0) {
+        sink.enqueue(textContent, length);
+        textContent.items = [];
+        textContent.styles = Object.create(null);
+      }
+    }
 
-              case twoDimVertL2:
-                this._addPixelsNeg(refLine[refPos] - 2, blackPixels);
+    const timeSlotManager = new TimeSlotManager();
+    return new Promise(function promiseBody(resolve, reject) {
+      const next = function (promise) {
+        enqueueChunk();
+        Promise.all([promise, sink.ready]).then(function () {
+          try {
+            promiseBody(resolve, reject);
+          } catch (ex) {
+            reject(ex);
+          }
+        }, reject);
+      };
 
-                blackPixels ^= 1;
+      task.ensureNotTerminated();
+      timeSlotManager.reset();
+      const operation = {};
+      let stop,
+          args = [];
 
-                if (codingLine[this.codingPos] < columns) {
-                  if (refPos > 0) {
-                    --refPos;
-                  } else {
-                    ++refPos;
-                  }
+      while (!(stop = timeSlotManager.check())) {
+        args.length = 0;
+        operation.args = args;
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+        if (!preprocessor.read(operation)) {
+          break;
+        }
 
-                break;
+        textState = stateManager.state;
+        const fn = operation.fn;
+        args = operation.args;
 
-              case twoDimVertL1:
-                this._addPixelsNeg(refLine[refPos] - 1, blackPixels);
+        switch (fn | 0) {
+          case _util.OPS.setFont:
+            var fontNameArg = args[0].name,
+                fontSizeArg = args[1];
 
-                blackPixels ^= 1;
+            if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
+              break;
+            }
 
-                if (codingLine[this.codingPos] < columns) {
-                  if (refPos > 0) {
-                    --refPos;
-                  } else {
-                    ++refPos;
-                  }
+            flushTextContentItem();
+            textState.fontName = fontNameArg;
+            textState.fontSize = fontSizeArg;
+            next(handleSetFont(fontNameArg, null));
+            return;
 
-                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
-                    refPos += 2;
-                  }
-                }
+          case _util.OPS.setTextRise:
+            flushTextContentItem();
+            textState.textRise = args[0];
+            break;
 
-                break;
+          case _util.OPS.setHScale:
+            flushTextContentItem();
+            textState.textHScale = args[0] / 100;
+            break;
 
-              case ccittEOF:
-                this._addPixels(columns, 0);
+          case _util.OPS.setLeading:
+            flushTextContentItem();
+            textState.leading = args[0];
+            break;
 
-                this.eof = true;
-                break;
+          case _util.OPS.moveText:
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
 
-              default:
-                (0, _util.info)("bad 2d code");
+          case _util.OPS.setLeadingMoveText:
+            flushTextContentItem();
+            textState.leading = -args[1];
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
 
-                this._addPixels(columns, 0);
+          case _util.OPS.nextLine:
+            appendEOL();
+            textState.carriageReturn();
+            break;
 
-                this.err = true;
-            }
-          }
-        } else {
-          codingLine[0] = 0;
-          this.codingPos = 0;
-          blackPixels = 0;
+          case _util.OPS.setTextMatrix:
+            textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+            textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+            updateAdvanceScale();
+            break;
 
-          while (codingLine[this.codingPos] < columns) {
-            code1 = 0;
+          case _util.OPS.setCharSpacing:
+            textState.charSpacing = args[0];
+            break;
 
-            if (blackPixels) {
-              do {
-                code1 += code3 = this._getBlackCode();
-              } while (code3 >= 64);
-            } else {
-              do {
-                code1 += code3 = this._getWhiteCode();
-              } while (code3 >= 64);
-            }
+          case _util.OPS.setWordSpacing:
+            textState.wordSpacing = args[0];
+            break;
 
-            this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
+          case _util.OPS.beginText:
+            flushTextContentItem();
+            textState.textMatrix = _util.IDENTITY_MATRIX.slice();
+            textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();
+            break;
 
-            blackPixels ^= 1;
-          }
-        }
+          case _util.OPS.showSpacedText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-        let gotEOL = false;
+            const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000;
+            const elements = args[0];
+            let isFirstChunk = true;
+
+            for (let i = 0, ii = elements.length; i < ii - 1; i++) {
+              const item = elements[i];
+
+              if (typeof item === "string") {
+                showSpacedTextBuffer.push(item);
+              } else if (typeof item === "number" && item !== 0) {
+                const str = showSpacedTextBuffer.join("");
+                showSpacedTextBuffer.length = 0;
+                buildTextContentItem({
+                  chars: str,
+                  extraSpacing: item * spaceFactor,
+                  isFirstChunk
+                });
 
-        if (this.byteAlign) {
-          this.inputBits &= ~7;
-        }
+                if (str && isFirstChunk) {
+                  isFirstChunk = false;
+                }
+              }
+            }
 
-        if (!this.eoblock && this.row === this.rows - 1) {
-          this.rowsDone = true;
-        } else {
-          code1 = this._lookBits(12);
+            const item = elements[elements.length - 1];
 
-          if (this.eoline) {
-            while (code1 !== ccittEOF && code1 !== 1) {
-              this._eatBits(1);
+            if (typeof item === "string") {
+              showSpacedTextBuffer.push(item);
+            }
 
-              code1 = this._lookBits(12);
+            if (showSpacedTextBuffer.length > 0) {
+              const str = showSpacedTextBuffer.join("");
+              showSpacedTextBuffer.length = 0;
+              buildTextContentItem({
+                chars: str,
+                extraSpacing: 0,
+                isFirstChunk
+              });
             }
-          } else {
-            while (code1 === 0) {
-              this._eatBits(1);
 
-              code1 = this._lookBits(12);
+            break;
+
+          case _util.OPS.showText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
             }
-          }
 
-          if (code1 === 1) {
-            this._eatBits(12);
+            buildTextContentItem({
+              chars: args[0],
+              extraSpacing: 0,
+              isFirstChunk: true
+            });
+            break;
 
-            gotEOL = true;
-          } else if (code1 === ccittEOF) {
-            this.eof = true;
-          }
-        }
+          case _util.OPS.nextLineShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-        if (!this.eof && this.encoding > 0 && !this.rowsDone) {
-          this.nextLine2D = !this._lookBits(1);
+            textContentItem.hasEOL = true;
+            flushTextContentItem();
+            textState.carriageReturn();
+            buildTextContentItem({
+              chars: args[0],
+              extraSpacing: 0,
+              isFirstChunk: true
+            });
+            break;
 
-          this._eatBits(1);
-        }
+          case _util.OPS.nextLineSetSpacingShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
 
-        if (this.eoblock && gotEOL && this.byteAlign) {
-          code1 = this._lookBits(12);
+            textContentItem.hasEOL = true;
+            flushTextContentItem();
+            textState.wordSpacing = args[0];
+            textState.charSpacing = args[1];
+            textState.carriageReturn();
+            buildTextContentItem({
+              chars: args[2],
+              extraSpacing: 0,
+              isFirstChunk: true
+            });
+            break;
+
+          case _util.OPS.paintXObject:
+            flushTextContentItem();
 
-          if (code1 === 1) {
-            this._eatBits(12);
+            if (!xobjs) {
+              xobjs = resources.get("XObject") || _primitives.Dict.empty;
+            }
 
-            if (this.encoding > 0) {
-              this._lookBits(1);
+            var isValidName = args[0] instanceof _primitives.Name;
+            var name = args[0].name;
 
-              this._eatBits(1);
+            if (isValidName && emptyXObjectCache.getByName(name)) {
+              break;
             }
 
-            if (this.encoding >= 0) {
-              for (i = 0; i < 4; ++i) {
-                code1 = this._lookBits(12);
+            next(new Promise(function (resolveXObject, rejectXObject) {
+              if (!isValidName) {
+                throw new _util.FormatError("XObject must be referred to by name.");
+              }
+
+              let xobj = xobjs.getRaw(name);
 
-                if (code1 !== 1) {
-                  (0, _util.info)("bad rtc code: " + code1);
+              if (xobj instanceof _primitives.Ref) {
+                if (emptyXObjectCache.getByRef(xobj)) {
+                  resolveXObject();
+                  return;
                 }
 
-                this._eatBits(12);
-
-                if (this.encoding > 0) {
-                  this._lookBits(1);
+                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
 
-                  this._eatBits(1);
+                if (globalImage) {
+                  resolveXObject();
+                  return;
                 }
+
+                xobj = xref.fetch(xobj);
               }
-            }
 
-            this.eof = true;
-          }
-        } else if (this.err && this.eoline) {
-          while (true) {
-            code1 = this._lookBits(13);
+              if (!(0, _primitives.isStream)(xobj)) {
+                throw new _util.FormatError("XObject should be a stream");
+              }
 
-            if (code1 === ccittEOF) {
-              this.eof = true;
-              return -1;
-            }
+              const type = xobj.dict.get("Subtype");
 
-            if (code1 >> 1 === 1) {
-              break;
-            }
+              if (!(0, _primitives.isName)(type)) {
+                throw new _util.FormatError("XObject should have a Name subtype");
+              }
 
-            this._eatBits(1);
-          }
+              if (type.name !== "Form") {
+                emptyXObjectCache.set(name, xobj.dict.objId, true);
+                resolveXObject();
+                return;
+              }
 
-          this._eatBits(12);
+              const currentState = stateManager.state.clone();
+              const xObjStateManager = new StateManager(currentState);
+              const matrix = xobj.dict.getArray("Matrix");
 
-          if (this.encoding > 0) {
-            this._eatBits(1);
+              if (Array.isArray(matrix) && matrix.length === 6) {
+                xObjStateManager.transform(matrix);
+              }
 
-            this.nextLine2D = !(code1 & 1);
-          }
-        }
+              enqueueChunk();
+              const sinkWrapper = {
+                enqueueInvoked: false,
 
-        if (codingLine[0] > 0) {
-          this.outputBits = codingLine[this.codingPos = 0];
-        } else {
-          this.outputBits = codingLine[this.codingPos = 1];
-        }
+                enqueue(chunk, size) {
+                  this.enqueueInvoked = true;
+                  sink.enqueue(chunk, size);
+                },
 
-        this.row++;
-      }
+                get desiredSize() {
+                  return sink.desiredSize;
+                },
 
-      let c;
+                get ready() {
+                  return sink.ready;
+                }
 
-      if (this.outputBits >= 8) {
-        c = this.codingPos & 1 ? 0 : 0xff;
-        this.outputBits -= 8;
+              };
+              self.getTextContent({
+                stream: xobj,
+                task,
+                resources: xobj.dict.get("Resources") || resources,
+                stateManager: xObjStateManager,
+                normalizeWhitespace,
+                combineTextItems,
+                includeMarkedContent,
+                sink: sinkWrapper,
+                seenStyles
+              }).then(function () {
+                if (!sinkWrapper.enqueueInvoked) {
+                  emptyXObjectCache.set(name, xobj.dict.objId, true);
+                }
 
-        if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
-          this.codingPos++;
-          this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
-        }
-      } else {
-        bits = 8;
-        c = 0;
+                resolveXObject();
+              }, rejectXObject);
+            }).catch(function (reason) {
+              if (reason instanceof _util.AbortException) {
+                return;
+              }
 
-        do {
-          if (this.outputBits > bits) {
-            c <<= bits;
+              if (self.options.ignoreErrors) {
+                (0, _util.warn)(`getTextContent - ignoring XObject: "${reason}".`);
+                return;
+              }
 
-            if (!(this.codingPos & 1)) {
-              c |= 0xff >> 8 - bits;
-            }
+              throw reason;
+            }));
+            return;
 
-            this.outputBits -= bits;
-            bits = 0;
-          } else {
-            c <<= this.outputBits;
+          case _util.OPS.setGState:
+            isValidName = args[0] instanceof _primitives.Name;
+            name = args[0].name;
 
-            if (!(this.codingPos & 1)) {
-              c |= 0xff >> 8 - this.outputBits;
+            if (isValidName && emptyGStateCache.getByName(name)) {
+              break;
             }
 
-            bits -= this.outputBits;
-            this.outputBits = 0;
+            next(new Promise(function (resolveGState, rejectGState) {
+              if (!isValidName) {
+                throw new _util.FormatError("GState must be referred to by name.");
+              }
 
-            if (codingLine[this.codingPos] < columns) {
-              this.codingPos++;
-              this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
-            } else if (bits > 0) {
-              c <<= bits;
-              bits = 0;
-            }
-          }
-        } while (bits);
-      }
+              const extGState = resources.get("ExtGState");
 
-      if (this.black) {
-        c ^= 0xff;
-      }
+              if (!(extGState instanceof _primitives.Dict)) {
+                throw new _util.FormatError("ExtGState should be a dictionary.");
+              }
 
-      return c;
-    },
+              const gState = extGState.get(name);
 
-    _addPixels(a1, blackPixels) {
-      const codingLine = this.codingLine;
-      let codingPos = this.codingPos;
+              if (!(gState instanceof _primitives.Dict)) {
+                throw new _util.FormatError("GState should be a dictionary.");
+              }
 
-      if (a1 > codingLine[codingPos]) {
-        if (a1 > this.columns) {
-          (0, _util.info)("row is wrong length");
-          this.err = true;
-          a1 = this.columns;
-        }
+              const gStateFont = gState.get("Font");
 
-        if (codingPos & 1 ^ blackPixels) {
-          ++codingPos;
-        }
+              if (!gStateFont) {
+                emptyGStateCache.set(name, gState.objId, true);
+                resolveGState();
+                return;
+              }
 
-        codingLine[codingPos] = a1;
-      }
+              flushTextContentItem();
+              textState.fontName = null;
+              textState.fontSize = gStateFont[1];
+              handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState);
+            }).catch(function (reason) {
+              if (reason instanceof _util.AbortException) {
+                return;
+              }
 
-      this.codingPos = codingPos;
-    },
+              if (self.options.ignoreErrors) {
+                (0, _util.warn)(`getTextContent - ignoring ExtGState: "${reason}".`);
+                return;
+              }
 
-    _addPixelsNeg(a1, blackPixels) {
-      const codingLine = this.codingLine;
-      let codingPos = this.codingPos;
+              throw reason;
+            }));
+            return;
 
-      if (a1 > codingLine[codingPos]) {
-        if (a1 > this.columns) {
-          (0, _util.info)("row is wrong length");
-          this.err = true;
-          a1 = this.columns;
-        }
+          case _util.OPS.beginMarkedContent:
+            if (includeMarkedContent) {
+              textContent.items.push({
+                type: "beginMarkedContent",
+                tag: (0, _primitives.isName)(args[0]) ? args[0].name : null
+              });
+            }
 
-        if (codingPos & 1 ^ blackPixels) {
-          ++codingPos;
-        }
+            break;
+
+          case _util.OPS.beginMarkedContentProps:
+            if (includeMarkedContent) {
+              flushTextContentItem();
+              let mcid = null;
+
+              if ((0, _primitives.isDict)(args[1])) {
+                mcid = args[1].get("MCID");
+              }
+
+              textContent.items.push({
+                type: "beginMarkedContentProps",
+                id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mcid${mcid}` : null,
+                tag: (0, _primitives.isName)(args[0]) ? args[0].name : null
+              });
+            }
+
+            break;
+
+          case _util.OPS.endMarkedContent:
+            if (includeMarkedContent) {
+              flushTextContentItem();
+              textContent.items.push({
+                type: "endMarkedContent"
+              });
+            }
 
-        codingLine[codingPos] = a1;
-      } else if (a1 < codingLine[codingPos]) {
-        if (a1 < 0) {
-          (0, _util.info)("invalid code");
-          this.err = true;
-          a1 = 0;
+            break;
         }
 
-        while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
-          --codingPos;
+        if (textContent.items.length >= sink.desiredSize) {
+          stop = true;
+          break;
         }
+      }
 
-        codingLine[codingPos] = a1;
+      if (stop) {
+        next(deferred);
+        return;
       }
 
-      this.codingPos = codingPos;
-    },
+      flushTextContentItem();
+      enqueueChunk();
+      resolve();
+    }).catch(reason => {
+      if (reason instanceof _util.AbortException) {
+        return;
+      }
 
-    _findTableCode(start, end, table, limit) {
-      const limitValue = limit || 0;
+      if (this.options.ignoreErrors) {
+        (0, _util.warn)(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
+        flushTextContentItem();
+        enqueueChunk();
+        return;
+      }
 
-      for (let i = start; i <= end; ++i) {
-        let code = this._lookBits(i);
+      throw reason;
+    });
+  }
 
-        if (code === ccittEOF) {
-          return [true, 1, false];
-        }
+  extractDataStructures(dict, baseDict, properties) {
+    const xref = this.xref;
+    let cidToGidBytes;
+    const toUnicodePromise = this.readToUnicode(properties.toUnicode || dict.get("ToUnicode") || 
baseDict.get("ToUnicode"));
 
-        if (i < end) {
-          code <<= end - i;
-        }
+    if (properties.composite) {
+      const cidSystemInfo = dict.get("CIDSystemInfo");
 
-        if (!limitValue || code >= limitValue) {
-          const p = table[code - limitValue];
+      if ((0, _primitives.isDict)(cidSystemInfo)) {
+        properties.cidSystemInfo = {
+          registry: (0, _util.stringToPDFString)(cidSystemInfo.get("Registry")),
+          ordering: (0, _util.stringToPDFString)(cidSystemInfo.get("Ordering")),
+          supplement: cidSystemInfo.get("Supplement")
+        };
+      }
 
-          if (p[0] === i) {
-            this._eatBits(i);
+      const cidToGidMap = dict.get("CIDToGIDMap");
 
-            return [true, p[1], true];
-          }
-        }
+      if ((0, _primitives.isStream)(cidToGidMap)) {
+        cidToGidBytes = cidToGidMap.getBytes();
       }
+    }
 
-      return [false, 0, false];
-    },
+    const differences = [];
+    let baseEncodingName = null;
+    let encoding;
+
+    if (dict.has("Encoding")) {
+      encoding = dict.get("Encoding");
 
-    _getTwoDimCode() {
-      let code = 0;
-      let p;
+      if ((0, _primitives.isDict)(encoding)) {
+        baseEncodingName = encoding.get("BaseEncoding");
+        baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;
 
-      if (this.eoblock) {
-        code = this._lookBits(7);
-        p = twoDimTable[code];
+        if (encoding.has("Differences")) {
+          const diffEncoding = encoding.get("Differences");
+          let index = 0;
 
-        if (p && p[0] > 0) {
-          this._eatBits(p[0]);
+          for (let j = 0, jj = diffEncoding.length; j < jj; j++) {
+            const data = xref.fetchIfRef(diffEncoding[j]);
 
-          return p[1];
+            if ((0, _util.isNum)(data)) {
+              index = data;
+            } else if ((0, _primitives.isName)(data)) {
+              differences[index++] = data.name;
+            } else {
+              throw new _util.FormatError(`Invalid entry in 'Differences' array: ${data}`);
+            }
+          }
         }
+      } else if ((0, _primitives.isName)(encoding)) {
+        baseEncodingName = encoding.name;
       } else {
-        const result = this._findTableCode(1, 7, twoDimTable);
+        throw new _util.FormatError("Encoding is not a Name nor a Dict");
+      }
 
-        if (result[0] && result[2]) {
-          return result[1];
-        }
+      if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && 
baseEncodingName !== "WinAnsiEncoding") {
+        baseEncodingName = null;
       }
+    }
 
-      (0, _util.info)("Bad two dim code");
-      return ccittEOF;
-    },
+    if (baseEncodingName) {
+      properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName);
+    } else {
+      const isSymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Symbolic);
+      const isNonsymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Nonsymbolic);
+      encoding = _encodings.StandardEncoding;
 
-    _getWhiteCode() {
-      let code = 0;
-      let p;
+      if (properties.type === "TrueType" && !isNonsymbolicFont) {
+        encoding = _encodings.WinAnsiEncoding;
+      }
 
-      if (this.eoblock) {
-        code = this._lookBits(12);
+      if (isSymbolicFont) {
+        encoding = _encodings.MacRomanEncoding;
 
-        if (code === ccittEOF) {
-          return 1;
+        if (!properties.file || properties.isInternalFont) {
+          if (/Symbol/i.test(properties.name)) {
+            encoding = _encodings.SymbolSetEncoding;
+          } else if (/Dingbats|Wingdings/i.test(properties.name)) {
+            encoding = _encodings.ZapfDingbatsEncoding;
+          }
         }
+      }
 
-        if (code >> 5 === 0) {
-          p = whiteTable1[code];
-        } else {
-          p = whiteTable2[code >> 3];
-        }
+      properties.defaultEncoding = encoding;
+    }
+
+    properties.differences = differences;
+    properties.baseEncodingName = baseEncodingName;
+    properties.hasEncoding = !!baseEncodingName || differences.length > 0;
+    properties.dict = dict;
+    return toUnicodePromise.then(readToUnicode => {
+      properties.toUnicode = readToUnicode;
+      return this.buildToUnicode(properties);
+    }).then(builtToUnicode => {
+      properties.toUnicode = builtToUnicode;
 
-        if (p[0] > 0) {
-          this._eatBits(p[0]);
+      if (cidToGidBytes) {
+        properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode);
+      }
 
-          return p[1];
-        }
-      } else {
-        let result = this._findTableCode(1, 9, whiteTable2);
+      return properties;
+    });
+  }
 
-        if (result[0]) {
-          return result[1];
-        }
+  _simpleFontToUnicode(properties, forceGlyphs = false) {
+    (0, _util.assert)(!properties.composite, "Must be a simple font.");
+    const toUnicode = [];
+    const encoding = properties.defaultEncoding.slice();
+    const baseEncodingName = properties.baseEncodingName;
+    const differences = properties.differences;
 
-        result = this._findTableCode(11, 12, whiteTable1);
+    for (const charcode in differences) {
+      const glyphName = differences[charcode];
 
-        if (result[0]) {
-          return result[1];
-        }
+      if (glyphName === ".notdef") {
+        continue;
       }
 
-      (0, _util.info)("bad white code");
-
-      this._eatBits(1);
+      encoding[charcode] = glyphName;
+    }
 
-      return 1;
-    },
+    const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
 
-    _getBlackCode() {
-      let code, p;
+    for (const charcode in encoding) {
+      let glyphName = encoding[charcode];
 
-      if (this.eoblock) {
-        code = this._lookBits(13);
+      if (glyphName === "") {
+        continue;
+      } else if (glyphsUnicodeMap[glyphName] === undefined) {
+        let code = 0;
 
-        if (code === ccittEOF) {
-          return 1;
-        }
+        switch (glyphName[0]) {
+          case "G":
+            if (glyphName.length === 3) {
+              code = parseInt(glyphName.substring(1), 16);
+            }
 
-        if (code >> 7 === 0) {
-          p = blackTable1[code];
-        } else if (code >> 9 === 0 && code >> 7 !== 0) {
-          p = blackTable2[(code >> 1) - 64];
-        } else {
-          p = blackTable3[code >> 7];
-        }
+            break;
 
-        if (p[0] > 0) {
-          this._eatBits(p[0]);
+          case "g":
+            if (glyphName.length === 5) {
+              code = parseInt(glyphName.substring(1), 16);
+            }
 
-          return p[1];
-        }
-      } else {
-        let result = this._findTableCode(2, 6, blackTable3);
+            break;
 
-        if (result[0]) {
-          return result[1];
-        }
+          case "C":
+          case "c":
+            if (glyphName.length >= 3 && glyphName.length <= 4) {
+              const codeStr = glyphName.substring(1);
 
-        result = this._findTableCode(7, 12, blackTable2, 64);
+              if (forceGlyphs) {
+                code = parseInt(codeStr, 16);
+                break;
+              }
 
-        if (result[0]) {
-          return result[1];
-        }
+              code = +codeStr;
 
-        result = this._findTableCode(10, 13, blackTable1);
+              if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {
+                return this._simpleFontToUnicode(properties, true);
+              }
+            }
 
-        if (result[0]) {
-          return result[1];
-        }
-      }
+            break;
 
-      (0, _util.info)("bad black code");
+          default:
+            const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
 
-      this._eatBits(1);
+            if (unicode !== -1) {
+              code = unicode;
+            }
 
-      return 1;
-    },
+        }
 
-    _lookBits(n) {
-      let c;
+        if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {
+          if (baseEncodingName && code === +charcode) {
+            const baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);
 
-      while (this.inputBits < n) {
-        if ((c = this.source.next()) === -1) {
-          if (this.inputBits === 0) {
-            return ccittEOF;
+            if (baseEncoding && (glyphName = baseEncoding[charcode])) {
+              toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
+              continue;
+            }
           }
 
-          return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n;
+          toUnicode[charcode] = String.fromCodePoint(code);
         }
 
-        this.inputBuf = this.inputBuf << 8 | c;
-        this.inputBits += 8;
+        continue;
       }
 
-      return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n;
-    },
-
-    _eatBits(n) {
-      if ((this.inputBits -= n) < 0) {
-        this.inputBits = 0;
-      }
+      toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
     }
 
-  };
-  return CCITTFaxDecoder;
-}();
-
-exports.CCITTFaxDecoder = CCITTFaxDecoder;
+    return toUnicode;
+  }
 
-/***/ }),
-/* 15 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+  async buildToUnicode(properties) {
+    properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;
 
-"use strict";
+    if (properties.hasIncludedToUnicodeMap) {
+      if (!properties.composite && properties.hasEncoding) {
+        properties.fallbackToUnicode = this._simpleFontToUnicode(properties);
+      }
 
+      return properties.toUnicode;
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Jbig2Stream = void 0;
+    if (!properties.composite) {
+      return new _to_unicode_map.ToUnicodeMap(this._simpleFontToUnicode(properties));
+    }
 
-var _primitives = __w_pdfjs_require__(5);
+    if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof 
_cmap.IdentityCMap) || properties.cidSystemInfo.registry === "Adobe" && (properties.cidSystemInfo.ordering 
=== "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" 
|| properties.cidSystemInfo.ordering === "Korea1"))) {
+      const {
+        registry,
+        ordering
+      } = properties.cidSystemInfo;
 
-var _stream = __w_pdfjs_require__(12);
+      const ucs2CMapName = _primitives.Name.get(`${registry}-${ordering}-UCS2`);
 
-var _jbig = __w_pdfjs_require__(16);
+      const ucs2CMap = await _cmap.CMapFactory.create({
+        encoding: ucs2CMapName,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      });
+      const toUnicode = [];
+      properties.cMap.forEach(function (charcode, cid) {
+        if (cid > 0xffff) {
+          throw new _util.FormatError("Max size of CID is 65,535");
+        }
 
-var _util = __w_pdfjs_require__(2);
+        const ucs2 = ucs2CMap.lookup(cid);
 
-const Jbig2Stream = function Jbig2StreamClosure() {
-  function Jbig2Stream(stream, maybeLength, dict, params) {
-    this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-    this.params = params;
+        if (ucs2) {
+          toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));
+        }
+      });
+      return new _to_unicode_map.ToUnicodeMap(toUnicode);
+    }
 
-    _stream.DecodeStream.call(this, maybeLength);
+    return new _to_unicode_map.IdentityToUnicodeMap(properties.firstChar, properties.lastChar);
   }
 
-  Jbig2Stream.prototype = Object.create(_stream.DecodeStream.prototype);
-  Object.defineProperty(Jbig2Stream.prototype, "bytes", {
-    get() {
-      return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
-    },
-
-    configurable: true
-  });
-
-  Jbig2Stream.prototype.ensureBuffer = function (requested) {};
-
-  Jbig2Stream.prototype.readBlock = function () {
-    if (this.eof) {
-      return;
+  readToUnicode(cmapObj) {
+    if (!cmapObj) {
+      return Promise.resolve(null);
     }
 
-    const jbig2Image = new _jbig.Jbig2Image();
-    const chunks = [];
-
-    if ((0, _primitives.isDict)(this.params)) {
-      const globalsStream = this.params.get("JBIG2Globals");
+    if ((0, _primitives.isName)(cmapObj)) {
+      return _cmap.CMapFactory.create({
+        encoding: cmapObj,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      }).then(function (cmap) {
+        if (cmap instanceof _cmap.IdentityCMap) {
+          return new _to_unicode_map.IdentityToUnicodeMap(0, 0xffff);
+        }
 
-      if ((0, _primitives.isStream)(globalsStream)) {
-        const globals = globalsStream.getBytes();
-        chunks.push({
-          data: globals,
-          start: 0,
-          end: globals.length
-        });
-      }
-    }
-
-    chunks.push({
-      data: this.bytes,
-      start: 0,
-      end: this.bytes.length
-    });
-    const data = jbig2Image.parseChunks(chunks);
-    const dataLength = data.length;
-
-    for (let i = 0; i < dataLength; i++) {
-      data[i] ^= 0xff;
-    }
-
-    this.buffer = data;
-    this.bufferLength = dataLength;
-    this.eof = true;
-  };
-
-  return Jbig2Stream;
-}();
-
-exports.Jbig2Stream = Jbig2Stream;
-
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+        return new _to_unicode_map.ToUnicodeMap(cmap.getMap());
+      });
+    } else if ((0, _primitives.isStream)(cmapObj)) {
+      return _cmap.CMapFactory.create({
+        encoding: cmapObj,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      }).then(function (cmap) {
+        if (cmap instanceof _cmap.IdentityCMap) {
+          return new _to_unicode_map.IdentityToUnicodeMap(0, 0xffff);
+        }
 
-"use strict";
+        const map = new Array(cmap.length);
+        cmap.forEach(function (charCode, token) {
+          const str = [];
 
+          for (let k = 0; k < token.length; k += 2) {
+            const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Jbig2Image = void 0;
+            if ((w1 & 0xf800) !== 0xd800) {
+              str.push(w1);
+              continue;
+            }
 
-var _util = __w_pdfjs_require__(2);
+            k += 2;
+            const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+          }
 
-var _core_utils = __w_pdfjs_require__(8);
+          map[charCode] = String.fromCodePoint.apply(String, str);
+        });
+        return new _to_unicode_map.ToUnicodeMap(map);
+      }, reason => {
+        if (reason instanceof _util.AbortException) {
+          return null;
+        }
 
-var _arithmetic_decoder = __w_pdfjs_require__(17);
+        if (this.options.ignoreErrors) {
+          this.handler.send("UnsupportedFeature", {
+            featureId: _util.UNSUPPORTED_FEATURES.errorFontToUnicode
+          });
+          (0, _util.warn)(`readToUnicode - ignoring ToUnicode data: "${reason}".`);
+          return null;
+        }
 
-var _ccitt = __w_pdfjs_require__(14);
+        throw reason;
+      });
+    }
 
-class Jbig2Error extends _util.BaseException {
-  constructor(msg) {
-    super(`JBIG2 error: ${msg}`);
+    return Promise.resolve(null);
   }
 
-}
+  readCidToGidMap(glyphsData, toUnicode) {
+    const result = [];
 
-var Jbig2Image = function Jbig2ImageClosure() {
-  function ContextCache() {}
+    for (let j = 0, jj = glyphsData.length; j < jj; j++) {
+      const glyphID = glyphsData[j++] << 8 | glyphsData[j];
+      const code = j >> 1;
 
-  ContextCache.prototype = {
-    getContexts(id) {
-      if (id in this) {
-        return this[id];
+      if (glyphID === 0 && !toUnicode.has(code)) {
+        continue;
       }
 
-      return this[id] = new Int8Array(1 << 16);
+      result[code] = glyphID;
     }
 
-  };
-
-  function DecodingContext(data, start, end) {
-    this.data = data;
-    this.start = start;
-    this.end = end;
+    return result;
   }
 
-  DecodingContext.prototype = {
-    get decoder() {
-      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);
-      return (0, _util.shadow)(this, "decoder", decoder);
-    },
-
-    get contextCache() {
-      var cache = new ContextCache();
-      return (0, _util.shadow)(this, "contextCache", cache);
-    }
+  extractWidths(dict, descriptor, properties) {
+    const xref = this.xref;
+    let glyphsWidths = [];
+    let defaultWidth = 0;
+    const glyphsVMetrics = [];
+    let defaultVMetrics;
+    let i, ii, j, jj, start, code, widths;
 
-  };
+    if (properties.composite) {
+      defaultWidth = dict.has("DW") ? dict.get("DW") : 1000;
+      widths = dict.get("W");
 
-  function decodeInteger(contextCache, procedure, decoder) {
-    var contexts = contextCache.getContexts(procedure);
-    var prev = 1;
+      if (widths) {
+        for (i = 0, ii = widths.length; i < ii; i++) {
+          start = xref.fetchIfRef(widths[i++]);
+          code = xref.fetchIfRef(widths[i]);
 
-    function readBits(length) {
-      var v = 0;
+          if (Array.isArray(code)) {
+            for (j = 0, jj = code.length; j < jj; j++) {
+              glyphsWidths[start++] = xref.fetchIfRef(code[j]);
+            }
+          } else {
+            const width = xref.fetchIfRef(widths[++i]);
 
-      for (var i = 0; i < length; i++) {
-        var bit = decoder.readBit(contexts, prev);
-        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
-        v = v << 1 | bit;
+            for (j = start; j <= code; j++) {
+              glyphsWidths[j] = width;
+            }
+          }
+        }
       }
 
-      return v >>> 0;
-    }
+      if (properties.vertical) {
+        let vmetrics = dict.getArray("DW2") || [880, -1000];
+        defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
+        vmetrics = dict.get("W2");
 
-    var sign = readBits(1);
-    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : 
readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
+        if (vmetrics) {
+          for (i = 0, ii = vmetrics.length; i < ii; i++) {
+            start = xref.fetchIfRef(vmetrics[i++]);
+            code = xref.fetchIfRef(vmetrics[i]);
 
-    if (sign === 0) {
-      return value;
-    } else if (value > 0) {
-      return -value;
-    }
+            if (Array.isArray(code)) {
+              for (j = 0, jj = code.length; j < jj; j++) {
+                glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), 
xref.fetchIfRef(code[j])];
+              }
+            } else {
+              const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), 
xref.fetchIfRef(vmetrics[++i])];
 
-    return null;
-  }
+              for (j = start; j <= code; j++) {
+                glyphsVMetrics[j] = vmetric;
+              }
+            }
+          }
+        }
+      }
+    } else {
+      const firstChar = properties.firstChar;
+      widths = dict.get("Widths");
 
-  function decodeIAID(contextCache, decoder, codeLength) {
-    var contexts = contextCache.getContexts("IAID");
-    var prev = 1;
+      if (widths) {
+        j = firstChar;
 
-    for (var i = 0; i < codeLength; i++) {
-      var bit = decoder.readBit(contexts, prev);
-      prev = prev << 1 | bit;
-    }
+        for (i = 0, ii = widths.length; i < ii; i++) {
+          glyphsWidths[j++] = xref.fetchIfRef(widths[i]);
+        }
+
+        defaultWidth = parseFloat(descriptor.get("MissingWidth")) || 0;
+      } else {
+        const baseFontName = dict.get("BaseFont");
 
-    if (codeLength < 31) {
-      return prev & (1 << codeLength) - 1;
+        if ((0, _primitives.isName)(baseFontName)) {
+          const metrics = this.getBaseFontMetrics(baseFontName.name);
+          glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
+          defaultWidth = metrics.defaultWidth;
+        }
+      }
     }
 
-    return prev & 0x7fffffff;
-  }
+    let isMonospace = true;
+    let firstWidth = defaultWidth;
 
-  var SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, 
"ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, 
"PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", 
"ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, 
"IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", 
"IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", 
"ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", 
"EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, 
"Extension"];
-  var CodingTemplates = [[{
-    x: -1,
-    y: -2
-  }, {
-    x: 0,
-    y: -2
-  }, {
-    x: 1,
-    y: -2
-  }, {
-    x: -2,
-    y: -1
-  }, {
-    x: -1,
-    y: -1
-  }, {
-    x: 0,
-    y: -1
-  }, {
-    x: 1,
-    y: -1
-  }, {
-    x: 2,
-    y: -1
-  }, {
-    x: -4,
-    y: 0
-  }, {
-    x: -3,
-    y: 0
-  }, {
-    x: -2,
-    y: 0
-  }, {
-    x: -1,
-    y: 0
-  }], [{
-    x: -1,
-    y: -2
-  }, {
-    x: 0,
-    y: -2
-  }, {
-    x: 1,
-    y: -2
-  }, {
-    x: 2,
-    y: -2
-  }, {
-    x: -2,
-    y: -1
-  }, {
-    x: -1,
-    y: -1
-  }, {
-    x: 0,
-    y: -1
-  }, {
-    x: 1,
-    y: -1
-  }, {
-    x: 2,
-    y: -1
-  }, {
-    x: -3,
-    y: 0
-  }, {
-    x: -2,
-    y: 0
-  }, {
-    x: -1,
-    y: 0
-  }], [{
-    x: -1,
-    y: -2
-  }, {
-    x: 0,
-    y: -2
-  }, {
-    x: 1,
-    y: -2
-  }, {
-    x: -2,
-    y: -1
-  }, {
-    x: -1,
-    y: -1
-  }, {
-    x: 0,
-    y: -1
-  }, {
-    x: 1,
-    y: -1
-  }, {
-    x: -2,
-    y: 0
-  }, {
-    x: -1,
-    y: 0
-  }], [{
-    x: -3,
-    y: -1
-  }, {
-    x: -2,
-    y: -1
-  }, {
-    x: -1,
-    y: -1
-  }, {
-    x: 0,
-    y: -1
-  }, {
-    x: 1,
-    y: -1
-  }, {
-    x: -4,
-    y: 0
-  }, {
-    x: -3,
-    y: 0
-  }, {
-    x: -2,
-    y: 0
-  }, {
-    x: -1,
-    y: 0
-  }]];
-  var RefinementTemplates = [{
-    coding: [{
-      x: 0,
-      y: -1
-    }, {
-      x: 1,
-      y: -1
-    }, {
-      x: -1,
-      y: 0
-    }],
-    reference: [{
-      x: 0,
-      y: -1
-    }, {
-      x: 1,
-      y: -1
-    }, {
-      x: -1,
-      y: 0
-    }, {
-      x: 0,
-      y: 0
-    }, {
-      x: 1,
-      y: 0
-    }, {
-      x: -1,
-      y: 1
-    }, {
-      x: 0,
-      y: 1
-    }, {
-      x: 1,
-      y: 1
-    }]
-  }, {
-    coding: [{
-      x: -1,
-      y: -1
-    }, {
-      x: 0,
-      y: -1
-    }, {
-      x: 1,
-      y: -1
-    }, {
-      x: -1,
-      y: 0
-    }],
-    reference: [{
-      x: 0,
-      y: -1
-    }, {
-      x: -1,
-      y: 0
-    }, {
-      x: 0,
-      y: 0
-    }, {
-      x: 1,
-      y: 0
-    }, {
-      x: 0,
-      y: 1
-    }, {
-      x: 1,
-      y: 1
-    }]
-  }];
-  var ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195];
-  var RefinementReusedContexts = [0x0020, 0x0008];
+    for (const glyph in glyphsWidths) {
+      const glyphWidth = glyphsWidths[glyph];
 
-  function decodeBitmapTemplate0(width, height, decodingContext) {
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts("GB");
-    var contextLabel,
-        i,
-        j,
-        pixel,
-        row,
-        row1,
-        row2,
-        bitmap = [];
-    var OLD_PIXEL_MASK = 0x7bf7;
+      if (!glyphWidth) {
+        continue;
+      }
 
-    for (i = 0; i < height; i++) {
-      row = bitmap[i] = new Uint8Array(width);
-      row1 = i < 1 ? row : bitmap[i - 1];
-      row2 = i < 2 ? row : bitmap[i - 2];
-      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] 
<< 5 | row1[3] << 4;
+      if (!firstWidth) {
+        firstWidth = glyphWidth;
+        continue;
+      }
 
-      for (j = 0; j < width; j++) {
-        row[j] = pixel = decoder.readBit(contexts, contextLabel);
-        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 
4 < width ? row1[j + 4] << 4 : 0) | pixel;
+      if (firstWidth !== glyphWidth) {
+        isMonospace = false;
+        break;
       }
     }
 
-    return bitmap;
+    if (isMonospace) {
+      properties.flags |= _fonts_utils.FontFlags.FixedPitch;
+    }
+
+    properties.defaultWidth = defaultWidth;
+    properties.widths = glyphsWidths;
+    properties.defaultVMetrics = defaultVMetrics;
+    properties.vmetrics = glyphsVMetrics;
   }
 
-  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
-    if (mmr) {
-      const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
-      return decodeMMRBitmap(input, width, height, false);
-    }
+  isSerifFont(baseFontName) {
+    const fontNameWoStyle = baseFontName.split("-")[0];
+    return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== 
-1;
+  }
 
-    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && 
at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
-      return decodeBitmapTemplate0(width, height, decodingContext);
-    }
+  getBaseFontMetrics(name) {
+    let defaultWidth = 0;
+    let widths = Object.create(null);
+    let monospace = false;
+    const stdFontMap = (0, _standard_fonts.getStdFontMap)();
+    let lookupName = stdFontMap[name] || name;
+    const Metrics = (0, _metrics.getMetrics)();
 
-    var useskip = !!skip;
-    var template = CodingTemplates[templateIndex].concat(at);
-    template.sort(function (a, b) {
-      return a.y - b.y || a.x - b.x;
-    });
-    var templateLength = template.length;
-    var templateX = new Int8Array(templateLength);
-    var templateY = new Int8Array(templateLength);
-    var changingTemplateEntries = [];
-    var reuseMask = 0,
-        minX = 0,
-        maxX = 0,
-        minY = 0;
-    var c, k;
-
-    for (k = 0; k < templateLength; k++) {
-      templateX[k] = template[k].x;
-      templateY[k] = template[k].y;
-      minX = Math.min(minX, template[k].x);
-      maxX = Math.max(maxX, template[k].x);
-      minY = Math.min(minY, template[k].y);
-
-      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 
1].x - 1) {
-        reuseMask |= 1 << templateLength - 1 - k;
+    if (!(lookupName in Metrics)) {
+      if (this.isSerifFont(name)) {
+        lookupName = "Times-Roman";
       } else {
-        changingTemplateEntries.push(k);
+        lookupName = "Helvetica";
       }
     }
 
-    var changingEntriesLength = changingTemplateEntries.length;
-    var changingTemplateX = new Int8Array(changingEntriesLength);
-    var changingTemplateY = new Int8Array(changingEntriesLength);
-    var changingTemplateBit = new Uint16Array(changingEntriesLength);
+    const glyphWidths = Metrics[lookupName];
 
-    for (c = 0; c < changingEntriesLength; c++) {
-      k = changingTemplateEntries[c];
-      changingTemplateX[c] = template[k].x;
-      changingTemplateY[c] = template[k].y;
-      changingTemplateBit[c] = 1 << templateLength - 1 - k;
+    if ((0, _util.isNum)(glyphWidths)) {
+      defaultWidth = glyphWidths;
+      monospace = true;
+    } else {
+      widths = glyphWidths();
     }
 
-    var sbb_left = -minX;
-    var sbb_top = -minY;
-    var sbb_right = width - maxX;
-    var pseudoPixelContext = ReusedContexts[templateIndex];
-    var row = new Uint8Array(width);
-    var bitmap = [];
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts("GB");
-    var ltp = 0,
-        j,
-        i0,
-        j0,
-        contextLabel = 0,
-        bit,
-        shift;
-
-    for (var i = 0; i < height; i++) {
-      if (prediction) {
-        var sltp = decoder.readBit(contexts, pseudoPixelContext);
-        ltp ^= sltp;
-
-        if (ltp) {
-          bitmap.push(row);
-          continue;
-        }
-      }
-
-      row = new Uint8Array(row);
-      bitmap.push(row);
+    return {
+      defaultWidth,
+      monospace,
+      widths
+    };
+  }
 
-      for (j = 0; j < width; j++) {
-        if (useskip && skip[i][j]) {
-          row[j] = 0;
-          continue;
-        }
+  buildCharCodeToWidth(widthsByGlyphName, properties) {
+    const widths = Object.create(null);
+    const differences = properties.differences;
+    const encoding = properties.defaultEncoding;
 
-        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
-          contextLabel = contextLabel << 1 & reuseMask;
+    for (let charCode = 0; charCode < 256; charCode++) {
+      if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
+        widths[charCode] = widthsByGlyphName[differences[charCode]];
+        continue;
+      }
 
-          for (k = 0; k < changingEntriesLength; k++) {
-            i0 = i + changingTemplateY[k];
-            j0 = j + changingTemplateX[k];
-            bit = bitmap[i0][j0];
+      if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
+        widths[charCode] = widthsByGlyphName[encoding[charCode]];
+        continue;
+      }
+    }
 
-            if (bit) {
-              bit = changingTemplateBit[k];
-              contextLabel |= bit;
-            }
-          }
-        } else {
-          contextLabel = 0;
-          shift = templateLength - 1;
+    return widths;
+  }
 
-          for (k = 0; k < templateLength; k++, shift--) {
-            j0 = j + templateX[k];
+  preEvaluateFont(dict) {
+    const baseDict = dict;
+    let type = dict.get("Subtype");
 
-            if (j0 >= 0 && j0 < width) {
-              i0 = i + templateY[k];
+    if (!(0, _primitives.isName)(type)) {
+      throw new _util.FormatError("invalid font Subtype");
+    }
 
-              if (i0 >= 0) {
-                bit = bitmap[i0][j0];
+    let composite = false;
+    let hash, toUnicode;
 
-                if (bit) {
-                  contextLabel |= bit << shift;
-                }
-              }
-            }
-          }
-        }
+    if (type.name === "Type0") {
+      const df = dict.get("DescendantFonts");
 
-        var pixel = decoder.readBit(contexts, contextLabel);
-        row[j] = pixel;
+      if (!df) {
+        throw new _util.FormatError("Descendant fonts are not specified");
       }
-    }
 
-    return bitmap;
-  }
+      dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
 
-  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, 
decodingContext) {
-    var codingTemplate = RefinementTemplates[templateIndex].coding;
+      if (!(dict instanceof _primitives.Dict)) {
+        throw new _util.FormatError("Descendant font is not a dictionary.");
+      }
 
-    if (templateIndex === 0) {
-      codingTemplate = codingTemplate.concat([at[0]]);
-    }
+      type = dict.get("Subtype");
 
-    var codingTemplateLength = codingTemplate.length;
-    var codingTemplateX = new Int32Array(codingTemplateLength);
-    var codingTemplateY = new Int32Array(codingTemplateLength);
-    var k;
+      if (!(0, _primitives.isName)(type)) {
+        throw new _util.FormatError("invalid font Subtype");
+      }
 
-    for (k = 0; k < codingTemplateLength; k++) {
-      codingTemplateX[k] = codingTemplate[k].x;
-      codingTemplateY[k] = codingTemplate[k].y;
+      composite = true;
     }
 
-    var referenceTemplate = RefinementTemplates[templateIndex].reference;
-
-    if (templateIndex === 0) {
-      referenceTemplate = referenceTemplate.concat([at[1]]);
-    }
+    const firstChar = dict.get("FirstChar") || 0,
+          lastChar = dict.get("LastChar") || (composite ? 0xffff : 0xff);
+    const descriptor = dict.get("FontDescriptor");
 
-    var referenceTemplateLength = referenceTemplate.length;
-    var referenceTemplateX = new Int32Array(referenceTemplateLength);
-    var referenceTemplateY = new Int32Array(referenceTemplateLength);
+    if (descriptor) {
+      hash = new _murmurhash.MurmurHash3_64();
+      const encoding = baseDict.getRaw("Encoding");
 
-    for (k = 0; k < referenceTemplateLength; k++) {
-      referenceTemplateX[k] = referenceTemplate[k].x;
-      referenceTemplateY[k] = referenceTemplate[k].y;
-    }
+      if ((0, _primitives.isName)(encoding)) {
+        hash.update(encoding.name);
+      } else if ((0, _primitives.isRef)(encoding)) {
+        hash.update(encoding.toString());
+      } else if ((0, _primitives.isDict)(encoding)) {
+        for (const entry of encoding.getRawValues()) {
+          if ((0, _primitives.isName)(entry)) {
+            hash.update(entry.name);
+          } else if ((0, _primitives.isRef)(entry)) {
+            hash.update(entry.toString());
+          } else if (Array.isArray(entry)) {
+            const diffLength = entry.length,
+                  diffBuf = new Array(diffLength);
 
-    var referenceWidth = referenceBitmap[0].length;
-    var referenceHeight = referenceBitmap.length;
-    var pseudoPixelContext = RefinementReusedContexts[templateIndex];
-    var bitmap = [];
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts("GR");
-    var ltp = 0;
+            for (let j = 0; j < diffLength; j++) {
+              const diffEntry = entry[j];
 
-    for (var i = 0; i < height; i++) {
-      if (prediction) {
-        var sltp = decoder.readBit(contexts, pseudoPixelContext);
-        ltp ^= sltp;
+              if ((0, _primitives.isName)(diffEntry)) {
+                diffBuf[j] = diffEntry.name;
+              } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {
+                diffBuf[j] = diffEntry.toString();
+              }
+            }
 
-        if (ltp) {
-          throw new Jbig2Error("prediction is not supported");
+            hash.update(diffBuf.join());
+          }
         }
       }
 
-      var row = new Uint8Array(width);
-      bitmap.push(row);
-
-      for (var j = 0; j < width; j++) {
-        var i0, j0;
-        var contextLabel = 0;
+      hash.update(`${firstChar}-${lastChar}`);
+      toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode");
 
-        for (k = 0; k < codingTemplateLength; k++) {
-          i0 = i + codingTemplateY[k];
-          j0 = j + codingTemplateX[k];
+      if ((0, _primitives.isStream)(toUnicode)) {
+        const stream = toUnicode.str || toUnicode;
+        const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : 
new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
+        hash.update(uint8array);
+      } else if ((0, _primitives.isName)(toUnicode)) {
+        hash.update(toUnicode.name);
+      }
 
-          if (i0 < 0 || j0 < 0 || j0 >= width) {
-            contextLabel <<= 1;
-          } else {
-            contextLabel = contextLabel << 1 | bitmap[i0][j0];
-          }
-        }
+      const widths = dict.get("Widths") || baseDict.get("Widths");
 
-        for (k = 0; k < referenceTemplateLength; k++) {
-          i0 = i + referenceTemplateY[k] - offsetY;
-          j0 = j + referenceTemplateX[k] - offsetX;
+      if (Array.isArray(widths)) {
+        const widthsBuf = [];
 
-          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
-            contextLabel <<= 1;
-          } else {
-            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
+        for (const entry of widths) {
+          if ((0, _util.isNum)(entry) || (0, _primitives.isRef)(entry)) {
+            widthsBuf.push(entry.toString());
           }
         }
 
-        var pixel = decoder.readBit(contexts, contextLabel);
-        row[j] = pixel;
+        hash.update(widthsBuf.join());
       }
-    }
-
-    return bitmap;
-  }
 
-  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, 
huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
-    if (huffman && refinement) {
-      throw new Jbig2Error("symbol refinement with Huffman is not supported");
-    }
+      if (composite) {
+        hash.update("compositeFont");
+        const compositeWidths = dict.get("W") || baseDict.get("W");
 
-    var newSymbols = [];
-    var currentHeight = 0;
-    var symbolCodeLength = (0, _core_utils.log2)(symbols.length + numberOfNewSymbols);
-    var decoder = decodingContext.decoder;
-    var contextCache = decodingContext.contextCache;
-    let tableB1, symbolWidths;
+        if (Array.isArray(compositeWidths)) {
+          const widthsBuf = [];
 
-    if (huffman) {
-      tableB1 = getStandardTable(1);
-      symbolWidths = [];
-      symbolCodeLength = Math.max(symbolCodeLength, 1);
-    }
+          for (const entry of compositeWidths) {
+            if ((0, _util.isNum)(entry) || (0, _primitives.isRef)(entry)) {
+              widthsBuf.push(entry.toString());
+            } else if (Array.isArray(entry)) {
+              const subWidthsBuf = [];
 
-    while (newSymbols.length < numberOfNewSymbols) {
-      var deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : 
decodeInteger(contextCache, "IADH", decoder);
-      currentHeight += deltaHeight;
-      let currentWidth = 0,
-          totalWidth = 0;
-      const firstSymbol = huffman ? symbolWidths.length : 0;
+              for (const element of entry) {
+                if ((0, _util.isNum)(element) || (0, _primitives.isRef)(element)) {
+                  subWidthsBuf.push(element.toString());
+                }
+              }
 
-      while (true) {
-        var deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : 
decodeInteger(contextCache, "IADW", decoder);
+              widthsBuf.push(`[${subWidthsBuf.join()}]`);
+            }
+          }
 
-        if (deltaWidth === null) {
-          break;
+          hash.update(widthsBuf.join());
         }
+      }
+    }
 
-        currentWidth += deltaWidth;
-        totalWidth += currentWidth;
-        var bitmap;
+    return {
+      descriptor,
+      dict,
+      baseDict,
+      composite,
+      type: type.name,
+      firstChar,
+      lastChar,
+      toUnicode,
+      hash: hash ? hash.hexdigest() : ""
+    };
+  }
 
-        if (refinement) {
-          var numberOfInstances = decodeInteger(contextCache, "IAAI", decoder);
+  async translateFont({
+    descriptor,
+    dict,
+    baseDict,
+    composite,
+    type,
+    firstChar,
+    lastChar,
+    toUnicode,
+    cssFontInfo
+  }) {
+    const isType3Font = type === "Type3";
+    let properties;
 
-          if (numberOfInstances > 1) {
-            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, 
numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, 
refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);
-          } else {
-            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
-            var rdx = decodeInteger(contextCache, "IARDX", decoder);
-            var rdy = decodeInteger(contextCache, "IARDY", decoder);
-            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - 
symbols.length];
-            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, 
rdy, false, refinementAt, decodingContext);
-          }
+    if (!descriptor) {
+      if (isType3Font) {
+        descriptor = new _primitives.Dict(null);
+        descriptor.set("FontName", _primitives.Name.get(type));
+        descriptor.set("FontBBox", dict.getArray("FontBBox") || [0, 0, 0, 0]);
+      } else {
+        let baseFontName = dict.get("BaseFont");
 
-          newSymbols.push(bitmap);
-        } else if (huffman) {
-          symbolWidths.push(currentWidth);
-        } else {
-          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, 
decodingContext);
-          newSymbols.push(bitmap);
+        if (!(0, _primitives.isName)(baseFontName)) {
+          throw new _util.FormatError("Base font is not specified");
         }
-      }
 
-      if (huffman && !refinement) {
-        const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
-        huffmanInput.byteAlign();
-        let collectiveBitmap;
+        baseFontName = baseFontName.name.replace(/[,_]/g, "-");
+        const metrics = this.getBaseFontMetrics(baseFontName);
+        const fontNameWoStyle = baseFontName.split("-")[0];
+        const flags = (this.isSerifFont(fontNameWoStyle) ? _fonts_utils.FontFlags.Serif : 0) | 
(metrics.monospace ? _fonts_utils.FontFlags.FixedPitch : 0) | ((0, 
_standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts_utils.FontFlags.Symbolic : 
_fonts_utils.FontFlags.Nonsymbolic);
+        properties = {
+          type,
+          name: baseFontName,
+          loadedName: baseDict.loadedName,
+          widths: metrics.widths,
+          defaultWidth: metrics.defaultWidth,
+          flags,
+          firstChar,
+          lastChar,
+          toUnicode,
+          xHeight: 0,
+          capHeight: 0,
+          italicAngle: 0,
+          isType3Font
+        };
+        const widths = dict.get("Widths");
+        const standardFontName = (0, _standard_fonts.getStandardFontName)(baseFontName);
+        let file = null;
 
-        if (bitmapSize === 0) {
-          collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
-        } else {
-          const originalEnd = huffmanInput.end;
-          const bitmapEnd = huffmanInput.position + bitmapSize;
-          huffmanInput.end = bitmapEnd;
-          collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);
-          huffmanInput.end = originalEnd;
-          huffmanInput.position = bitmapEnd;
+        if (standardFontName) {
+          properties.isStandardFont = true;
+          file = await this.fetchStandardFontData(standardFontName);
+          properties.isInternalFont = !!file;
         }
 
-        const numberOfSymbolsDecoded = symbolWidths.length;
+        return this.extractDataStructures(dict, dict, properties).then(newProperties => {
+          if (widths) {
+            const glyphWidths = [];
+            let j = firstChar;
 
-        if (firstSymbol === numberOfSymbolsDecoded - 1) {
-          newSymbols.push(collectiveBitmap);
-        } else {
-          let i,
-              y,
-              xMin = 0,
-              xMax,
-              bitmapWidth,
-              symbolBitmap;
-
-          for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) {
-            bitmapWidth = symbolWidths[i];
-            xMax = xMin + bitmapWidth;
-            symbolBitmap = [];
-
-            for (y = 0; y < currentHeight; y++) {
-              symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
+            for (let i = 0, ii = widths.length; i < ii; i++) {
+              glyphWidths[j++] = this.xref.fetchIfRef(widths[i]);
             }
 
-            newSymbols.push(symbolBitmap);
-            xMin = xMax;
+            newProperties.widths = glyphWidths;
+          } else {
+            newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties);
           }
-        }
-      }
-    }
-
-    var exportedSymbols = [];
-    var flags = [],
-        currentFlag = false;
-    var totalSymbolsLength = symbols.length + numberOfNewSymbols;
 
-    while (flags.length < totalSymbolsLength) {
-      var runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder);
-
-      while (runLength--) {
-        flags.push(currentFlag);
+          return new _fonts.Font(baseFontName, file, newProperties);
+        });
       }
-
-      currentFlag = !currentFlag;
     }
 
-    for (var i = 0, ii = symbols.length; i < ii; i++) {
-      if (flags[i]) {
-        exportedSymbols.push(symbols[i]);
-      }
-    }
+    let fontName = descriptor.get("FontName");
+    let baseFont = dict.get("BaseFont");
 
-    for (var j = 0; j < numberOfNewSymbols; i++, j++) {
-      if (flags[i]) {
-        exportedSymbols.push(newSymbols[j]);
-      }
+    if ((0, _util.isString)(fontName)) {
+      fontName = _primitives.Name.get(fontName);
     }
 
-    return exportedSymbols;
-  }
-
-  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, 
stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, 
huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
-    if (huffman && refinement) {
-      throw new Jbig2Error("refinement with Huffman is not supported");
+    if ((0, _util.isString)(baseFont)) {
+      baseFont = _primitives.Name.get(baseFont);
     }
 
-    var bitmap = [];
-    var i, row;
+    if (!isType3Font) {
+      const fontNameStr = fontName && fontName.name;
+      const baseFontStr = baseFont && baseFont.name;
 
-    for (i = 0; i < height; i++) {
-      row = new Uint8Array(width);
+      if (fontNameStr !== baseFontStr) {
+        (0, _util.info)(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as 
the Font's BaseFont "${baseFontStr}".`);
 
-      if (defaultPixelValue) {
-        for (var j = 0; j < width; j++) {
-          row[j] = defaultPixelValue;
+        if (fontNameStr && baseFontStr && baseFontStr.startsWith(fontNameStr)) {
+          fontName = baseFont;
         }
       }
-
-      bitmap.push(row);
     }
 
-    var decoder = decodingContext.decoder;
-    var contextCache = decodingContext.contextCache;
-    var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, 
"IADT", decoder);
-    var firstS = 0;
-    i = 0;
-
-    while (i < numberOfSymbolInstances) {
-      var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, 
"IADT", decoder);
-      stripT += deltaT;
-      var deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : 
decodeInteger(contextCache, "IAFS", decoder);
-      firstS += deltaFirstS;
-      var currentS = firstS;
-
-      do {
-        let currentT = 0;
-
-        if (stripSize > 1) {
-          currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", 
decoder);
-        }
+    fontName = fontName || baseFont;
 
-        var t = stripSize * stripT + currentT;
-        var symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, 
decoder, symbolCodeLength);
-        var applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, 
"IARI", decoder));
-        var symbolBitmap = inputSymbols[symbolId];
-        var symbolWidth = symbolBitmap[0].length;
-        var symbolHeight = symbolBitmap.length;
+    if (!(0, _primitives.isName)(fontName)) {
+      throw new _util.FormatError("invalid font name");
+    }
 
-        if (applyRefinement) {
-          var rdw = decodeInteger(contextCache, "IARDW", decoder);
-          var rdh = decodeInteger(contextCache, "IARDH", decoder);
-          var rdx = decodeInteger(contextCache, "IARDX", decoder);
-          var rdy = decodeInteger(contextCache, "IARDY", decoder);
-          symbolWidth += rdw;
-          symbolHeight += rdh;
-          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, 
(rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
-        }
+    let fontFile, subtype, length1, length2, length3;
 
-        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
-        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
-        var s2, t2, symbolRow;
+    try {
+      fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3");
+    } catch (ex) {
+      if (!this.options.ignoreErrors) {
+        throw ex;
+      }
 
-        if (transposed) {
-          for (s2 = 0; s2 < symbolHeight; s2++) {
-            row = bitmap[offsetS + s2];
+      (0, _util.warn)(`translateFont - fetching "${fontName.name}" font file: "${ex}".`);
+      fontFile = new _stream.NullStream();
+    }
 
-            if (!row) {
-              continue;
-            }
+    let isStandardFont = false;
+    let isInternalFont = false;
+    let glyphScaleFactors = null;
 
-            symbolRow = symbolBitmap[s2];
-            var maxWidth = Math.min(width - offsetT, symbolWidth);
+    if (fontFile) {
+      if (fontFile.dict) {
+        const subtypeEntry = fontFile.dict.get("Subtype");
 
-            switch (combinationOperator) {
-              case 0:
-                for (t2 = 0; t2 < maxWidth; t2++) {
-                  row[offsetT + t2] |= symbolRow[t2];
-                }
+        if (subtypeEntry instanceof _primitives.Name) {
+          subtype = subtypeEntry.name;
+        }
 
-                break;
+        length1 = fontFile.dict.get("Length1");
+        length2 = fontFile.dict.get("Length2");
+        length3 = fontFile.dict.get("Length3");
+      }
+    } else if (cssFontInfo) {
+      const standardFontName = (0, _xfa_fonts.getXfaFontName)(fontName.name);
 
-              case 2:
-                for (t2 = 0; t2 < maxWidth; t2++) {
-                  row[offsetT + t2] ^= symbolRow[t2];
-                }
+      if (standardFontName) {
+        cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`;
+        cssFontInfo.lineHeight = standardFontName.lineHeight || null;
+        glyphScaleFactors = standardFontName.factors || null;
+        fontFile = await this.fetchStandardFontData(standardFontName.name);
+        isInternalFont = !!fontFile;
+        type = "TrueType";
+      }
+    } else if (!isType3Font) {
+      const standardFontName = (0, _standard_fonts.getStandardFontName)(fontName.name);
 
-                break;
+      if (standardFontName) {
+        isStandardFont = true;
+        fontFile = await this.fetchStandardFontData(standardFontName);
+        isInternalFont = !!fontFile;
+      }
+    }
 
-              default:
-                throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
-            }
-          }
-
-          currentS += symbolHeight - 1;
-        } else {
-          for (t2 = 0; t2 < symbolHeight; t2++) {
-            row = bitmap[offsetT + t2];
-
-            if (!row) {
-              continue;
-            }
-
-            symbolRow = symbolBitmap[t2];
+    properties = {
+      type,
+      name: fontName.name,
+      subtype,
+      file: fontFile,
+      length1,
+      length2,
+      length3,
+      isStandardFont,
+      isInternalFont,
+      loadedName: baseDict.loadedName,
+      composite,
+      fixedPitch: false,
+      fontMatrix: dict.getArray("FontMatrix") || _util.FONT_IDENTITY_MATRIX,
+      firstChar,
+      lastChar,
+      toUnicode,
+      bbox: descriptor.getArray("FontBBox") || dict.getArray("FontBBox"),
+      ascent: descriptor.get("Ascent"),
+      descent: descriptor.get("Descent"),
+      xHeight: descriptor.get("XHeight") || 0,
+      capHeight: descriptor.get("CapHeight") || 0,
+      flags: descriptor.get("Flags"),
+      italicAngle: descriptor.get("ItalicAngle") || 0,
+      isType3Font,
+      cssFontInfo,
+      scaleFactors: glyphScaleFactors
+    };
 
-            switch (combinationOperator) {
-              case 0:
-                for (s2 = 0; s2 < symbolWidth; s2++) {
-                  row[offsetS + s2] |= symbolRow[s2];
-                }
+    if (composite) {
+      const cidEncoding = baseDict.get("Encoding");
 
-                break;
+      if ((0, _primitives.isName)(cidEncoding)) {
+        properties.cidEncoding = cidEncoding.name;
+      }
 
-              case 2:
-                for (s2 = 0; s2 < symbolWidth; s2++) {
-                  row[offsetS + s2] ^= symbolRow[s2];
-                }
+      const cMap = await _cmap.CMapFactory.create({
+        encoding: cidEncoding,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      });
+      properties.cMap = cMap;
+      properties.vertical = properties.cMap.vertical;
+    }
 
-                break;
+    return this.extractDataStructures(dict, baseDict, properties).then(newProperties => {
+      this.extractWidths(dict, descriptor, newProperties);
+      return new _fonts.Font(fontName.name, fontFile, newProperties);
+    });
+  }
 
-              default:
-                throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
-            }
-          }
+  static buildFontPaths(font, glyphs, handler, evaluatorOptions) {
+    function buildPath(fontChar) {
+      const glyphName = `${font.loadedName}_path_${fontChar}`;
 
-          currentS += symbolWidth - 1;
+      try {
+        if (font.renderer.hasBuiltPath(fontChar)) {
+          return;
         }
 
-        i++;
-        var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, 
"IADS", decoder);
-
-        if (deltaS === null) {
-          break;
+        handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]);
+      } catch (reason) {
+        if (evaluatorOptions.ignoreErrors) {
+          handler.send("UnsupportedFeature", {
+            featureId: _util.UNSUPPORTED_FEATURES.errorFontBuildPath
+          });
+          (0, _util.warn)(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`);
+          return;
         }
 
-        currentS += deltaS + dsOffset;
-      } while (true);
-    }
-
-    return bitmap;
-  }
-
-  function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, 
decodingContext) {
-    const at = [];
-
-    if (!mmr) {
-      at.push({
-        x: -patternWidth,
-        y: 0
-      });
-
-      if (template === 0) {
-        at.push({
-          x: -3,
-          y: -1
-        });
-        at.push({
-          x: 2,
-          y: -2
-        });
-        at.push({
-          x: -2,
-          y: -2
-        });
+        throw reason;
       }
     }
 
-    const collectiveWidth = (maxPatternIndex + 1) * patternWidth;
-    const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, 
decodingContext);
-    const patterns = [];
-
-    for (let i = 0; i <= maxPatternIndex; i++) {
-      const patternBitmap = [];
-      const xMin = patternWidth * i;
-      const xMax = xMin + patternWidth;
+    for (const glyph of glyphs) {
+      buildPath(glyph.fontChar);
+      const accent = glyph.accent;
 
-      for (let y = 0; y < patternHeight; y++) {
-        patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
+      if (accent && accent.fontChar) {
+        buildPath(accent.fontChar);
       }
-
-      patterns.push(patternBitmap);
     }
-
-    return patterns;
   }
 
-  function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, 
enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, 
decodingContext) {
-    const skip = null;
-
-    if (enableSkip) {
-      throw new Jbig2Error("skip is not supported");
-    }
-
-    if (combinationOperator !== 0) {
-      throw new Jbig2Error("operator " + combinationOperator + " is not supported in halftone region");
-    }
+  static get fallbackFontDict() {
+    const dict = new _primitives.Dict();
+    dict.set("BaseFont", _primitives.Name.get("PDFJS-FallbackFont"));
+    dict.set("Type", _primitives.Name.get("FallbackType"));
+    dict.set("Subtype", _primitives.Name.get("FallbackType"));
+    dict.set("Encoding", _primitives.Name.get("WinAnsiEncoding"));
+    return (0, _util.shadow)(this, "fallbackFontDict", dict);
+  }
 
-    const regionBitmap = [];
-    let i, j, row;
+}
 
-    for (i = 0; i < regionHeight; i++) {
-      row = new Uint8Array(regionWidth);
+exports.PartialEvaluator = PartialEvaluator;
 
-      if (defaultPixelValue) {
-        for (j = 0; j < regionWidth; j++) {
-          row[j] = defaultPixelValue;
-        }
-      }
+class TranslatedFont {
+  constructor({
+    loadedName,
+    font,
+    dict,
+    evaluatorOptions
+  }) {
+    this.loadedName = loadedName;
+    this.font = font;
+    this.dict = dict;
+    this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions;
+    this.type3Loaded = null;
+    this.type3Dependencies = font.isType3Font ? new Set() : null;
+    this.sent = false;
+  }
 
-      regionBitmap.push(row);
+  send(handler) {
+    if (this.sent) {
+      return;
     }
 
-    const numberOfPatterns = patterns.length;
-    const pattern0 = patterns[0];
-    const patternWidth = pattern0[0].length,
-          patternHeight = pattern0.length;
-    const bitsPerValue = (0, _core_utils.log2)(numberOfPatterns);
-    const at = [];
-
-    if (!mmr) {
-      at.push({
-        x: template <= 1 ? 3 : 2,
-        y: -1
-      });
+    this.sent = true;
+    handler.send("commonobj", [this.loadedName, "Font", 
this.font.exportData(this._evaluatorOptions.fontExtraProperties)]);
+  }
 
-      if (template === 0) {
-        at.push({
-          x: -3,
-          y: -1
-        });
-        at.push({
-          x: 2,
-          y: -2
-        });
-        at.push({
-          x: -2,
-          y: -2
-        });
-      }
+  fallback(handler) {
+    if (!this.font.data) {
+      return;
     }
 
-    const grayScaleBitPlanes = [];
-    let mmrInput, bitmap;
+    this.font.disableFontFace = true;
+    PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions);
+  }
 
-    if (mmr) {
-      mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
+  loadType3Data(evaluator, resources, task) {
+    if (this.type3Loaded) {
+      return this.type3Loaded;
     }
 
-    for (i = bitsPerValue - 1; i >= 0; i--) {
-      if (mmr) {
-        bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
-      } else {
-        bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
-      }
-
-      grayScaleBitPlanes[i] = bitmap;
+    if (!this.font.isType3Font) {
+      throw new Error("Must be a Type3 font.");
     }
 
-    let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;
-
-    for (mg = 0; mg < gridHeight; mg++) {
-      for (ng = 0; ng < gridWidth; ng++) {
-        bit = 0;
-        patternIndex = 0;
-
-        for (j = bitsPerValue - 1; j >= 0; j--) {
-          bit = grayScaleBitPlanes[j][mg][ng] ^ bit;
-          patternIndex |= bit << j;
-        }
-
-        patternBitmap = patterns[patternIndex];
-        x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
-        y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;
-
-        if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
-          for (i = 0; i < patternHeight; i++) {
-            regionRow = regionBitmap[y + i];
-            patternRow = patternBitmap[i];
+    const type3Evaluator = evaluator.clone({
+      ignoreErrors: false
+    });
+    type3Evaluator.parsingType3Font = true;
+    const translatedFont = this.font,
+          type3Dependencies = this.type3Dependencies;
+    let loadCharProcsPromise = Promise.resolve();
+    const charProcs = this.dict.get("CharProcs");
+    const fontResources = this.dict.get("Resources") || resources;
+    const charProcOperatorList = Object.create(null);
+    const isEmptyBBox = !translatedFont.bbox || (0, _util.isArrayEqual)(translatedFont.bbox, [0, 0, 0, 0]);
 
-            for (j = 0; j < patternWidth; j++) {
-              regionRow[x + j] |= patternRow[j];
-            }
+    for (const key of charProcs.getKeys()) {
+      loadCharProcsPromise = loadCharProcsPromise.then(() => {
+        const glyphStream = charProcs.get(key);
+        const operatorList = new _operator_list.OperatorList();
+        return type3Evaluator.getOperatorList({
+          stream: glyphStream,
+          task,
+          resources: fontResources,
+          operatorList
+        }).then(() => {
+          if (operatorList.fnArray[0] === _util.OPS.setCharWidthAndBounds) {
+            this._removeType3ColorOperators(operatorList, isEmptyBBox);
           }
-        } else {
-          let regionX, regionY;
-
-          for (i = 0; i < patternHeight; i++) {
-            regionY = y + i;
-
-            if (regionY < 0 || regionY >= regionHeight) {
-              continue;
-            }
-
-            regionRow = regionBitmap[regionY];
-            patternRow = patternBitmap[i];
 
-            for (j = 0; j < patternWidth; j++) {
-              regionX = x + j;
+          charProcOperatorList[key] = operatorList.getIR();
 
-              if (regionX >= 0 && regionX < regionWidth) {
-                regionRow[regionX] |= patternRow[j];
-              }
-            }
+          for (const dependency of operatorList.dependencies) {
+            type3Dependencies.add(dependency);
           }
-        }
-      }
-    }
-
-    return regionBitmap;
-  }
-
-  function readSegmentHeader(data, start) {
-    var segmentHeader = {};
-    segmentHeader.number = (0, _core_utils.readUint32)(data, start);
-    var flags = data[start + 4];
-    var segmentType = flags & 0x3f;
-
-    if (!SegmentTypes[segmentType]) {
-      throw new Jbig2Error("invalid segment type: " + segmentType);
-    }
-
-    segmentHeader.type = segmentType;
-    segmentHeader.typeName = SegmentTypes[segmentType];
-    segmentHeader.deferredNonRetain = !!(flags & 0x80);
-    var pageAssociationFieldSize = !!(flags & 0x40);
-    var referredFlags = data[start + 5];
-    var referredToCount = referredFlags >> 5 & 7;
-    var retainBits = [referredFlags & 31];
-    var position = start + 6;
-
-    if (referredFlags === 7) {
-      referredToCount = (0, _core_utils.readUint32)(data, position - 1) & 0x1fffffff;
-      position += 3;
-      var bytes = referredToCount + 7 >> 3;
-      retainBits[0] = data[position++];
-
-      while (--bytes > 0) {
-        retainBits.push(data[position++]);
-      }
-    } else if (referredFlags === 5 || referredFlags === 6) {
-      throw new Jbig2Error("invalid referred-to flags");
-    }
-
-    segmentHeader.retainBits = retainBits;
-    let referredToSegmentNumberSize = 4;
-
-    if (segmentHeader.number <= 256) {
-      referredToSegmentNumberSize = 1;
-    } else if (segmentHeader.number <= 65536) {
-      referredToSegmentNumberSize = 2;
+        }).catch(function (reason) {
+          (0, _util.warn)(`Type3 font resource "${key}" is not available.`);
+          const dummyOperatorList = new _operator_list.OperatorList();
+          charProcOperatorList[key] = dummyOperatorList.getIR();
+        });
+      });
     }
 
-    var referredTo = [];
-    var i, ii;
-
-    for (i = 0; i < referredToCount; i++) {
-      let number;
+    this.type3Loaded = loadCharProcsPromise.then(() => {
+      translatedFont.charProcOperatorList = charProcOperatorList;
 
-      if (referredToSegmentNumberSize === 1) {
-        number = data[position];
-      } else if (referredToSegmentNumberSize === 2) {
-        number = (0, _core_utils.readUint16)(data, position);
-      } else {
-        number = (0, _core_utils.readUint32)(data, position);
+      if (this._bbox) {
+        translatedFont.isCharBBox = true;
+        translatedFont.bbox = this._bbox;
       }
+    });
+    return this.type3Loaded;
+  }
 
-      referredTo.push(number);
-      position += referredToSegmentNumberSize;
-    }
-
-    segmentHeader.referredTo = referredTo;
-
-    if (!pageAssociationFieldSize) {
-      segmentHeader.pageAssociation = data[position++];
-    } else {
-      segmentHeader.pageAssociation = (0, _core_utils.readUint32)(data, position);
-      position += 4;
-    }
-
-    segmentHeader.length = (0, _core_utils.readUint32)(data, position);
-    position += 4;
-
-    if (segmentHeader.length === 0xffffffff) {
-      if (segmentType === 38) {
-        var genericRegionInfo = readRegionSegmentInformation(data, position);
-        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];
-        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
-        var searchPatternLength = 6;
-        var searchPattern = new Uint8Array(searchPatternLength);
-
-        if (!genericRegionMmr) {
-          searchPattern[0] = 0xff;
-          searchPattern[1] = 0xac;
-        }
-
-        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff;
-        searchPattern[3] = genericRegionInfo.height >> 16 & 0xff;
-        searchPattern[4] = genericRegionInfo.height >> 8 & 0xff;
-        searchPattern[5] = genericRegionInfo.height & 0xff;
+  _removeType3ColorOperators(operatorList, isEmptyBBox = false) {
+    if (isEmptyBBox) {
+      if (!this._bbox) {
+        this._bbox = [Infinity, Infinity, -Infinity, -Infinity];
+      }
+
+      const charBBox = _util.Util.normalizeRect(operatorList.argsArray[0].slice(2));
+
+      this._bbox[0] = Math.min(this._bbox[0], charBBox[0]);
+      this._bbox[1] = Math.min(this._bbox[1], charBBox[1]);
+      this._bbox[2] = Math.max(this._bbox[2], charBBox[2]);
+      this._bbox[3] = Math.max(this._bbox[3], charBBox[3]);
+    }
+
+    let i = 1,
+        ii = operatorList.length;
+
+    while (i < ii) {
+      switch (operatorList.fnArray[i]) {
+        case _util.OPS.setStrokeColorSpace:
+        case _util.OPS.setFillColorSpace:
+        case _util.OPS.setStrokeColor:
+        case _util.OPS.setStrokeColorN:
+        case _util.OPS.setFillColor:
+        case _util.OPS.setFillColorN:
+        case _util.OPS.setStrokeGray:
+        case _util.OPS.setFillGray:
+        case _util.OPS.setStrokeRGBColor:
+        case _util.OPS.setFillRGBColor:
+        case _util.OPS.setStrokeCMYKColor:
+        case _util.OPS.setFillCMYKColor:
+        case _util.OPS.shadingFill:
+        case _util.OPS.setRenderingIntent:
+          operatorList.fnArray.splice(i, 1);
+          operatorList.argsArray.splice(i, 1);
+          ii--;
+          continue;
 
-        for (i = position, ii = data.length; i < ii; i++) {
-          var j = 0;
+        case _util.OPS.setGState:
+          const [gStateObj] = operatorList.argsArray[i];
+          let j = 0,
+              jj = gStateObj.length;
+
+          while (j < jj) {
+            const [gStateKey] = gStateObj[j];
+
+            switch (gStateKey) {
+              case "TR":
+              case "TR2":
+              case "HT":
+              case "BG":
+              case "BG2":
+              case "UCR":
+              case "UCR2":
+                gStateObj.splice(j, 1);
+                jj--;
+                continue;
+            }
 
-          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
             j++;
           }
 
-          if (j === searchPatternLength) {
-            segmentHeader.length = i + searchPatternLength;
-            break;
-          }
-        }
-
-        if (segmentHeader.length === 0xffffffff) {
-          throw new Jbig2Error("segment end was not found");
-        }
-      } else {
-        throw new Jbig2Error("invalid unknown segment length");
-      }
-    }
-
-    segmentHeader.headerEnd = position;
-    return segmentHeader;
-  }
-
-  function readSegments(header, data, start, end) {
-    var segments = [];
-    var position = start;
-
-    while (position < end) {
-      var segmentHeader = readSegmentHeader(data, position);
-      position = segmentHeader.headerEnd;
-      var segment = {
-        header: segmentHeader,
-        data
-      };
-
-      if (!header.randomAccess) {
-        segment.start = position;
-        position += segmentHeader.length;
-        segment.end = position;
+          break;
       }
 
-      segments.push(segment);
-
-      if (segmentHeader.type === 51) {
-        break;
-      }
+      i++;
     }
+  }
 
-    if (header.randomAccess) {
-      for (var i = 0, ii = segments.length; i < ii; i++) {
-        segments[i].start = position;
-        position += segments[i].header.length;
-        segments[i].end = position;
-      }
-    }
+}
 
-    return segments;
+class StateManager {
+  constructor(initialState = new EvalState()) {
+    this.state = initialState;
+    this.stateStack = [];
   }
 
-  function readRegionSegmentInformation(data, start) {
-    return {
-      width: (0, _core_utils.readUint32)(data, start),
-      height: (0, _core_utils.readUint32)(data, start + 4),
-      x: (0, _core_utils.readUint32)(data, start + 8),
-      y: (0, _core_utils.readUint32)(data, start + 12),
-      combinationOperator: data[start + 16] & 7
-    };
+  save() {
+    const old = this.state;
+    this.stateStack.push(this.state);
+    this.state = old.clone();
   }
 
-  var RegionSegmentInformationFieldLength = 17;
-
-  function processSegment(segment, visitor) {
-    var header = segment.header;
-    var data = segment.data,
-        position = segment.start,
-        end = segment.end;
-    var args, at, i, atLength;
-
-    switch (header.type) {
-      case 0:
-        var dictionary = {};
-        var dictionaryFlags = (0, _core_utils.readUint16)(data, position);
-        dictionary.huffman = !!(dictionaryFlags & 1);
-        dictionary.refinement = !!(dictionaryFlags & 2);
-        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;
-        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;
-        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;
-        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;
-        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
-        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
-        dictionary.template = dictionaryFlags >> 10 & 3;
-        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
-        position += 2;
-
-        if (!dictionary.huffman) {
-          atLength = dictionary.template === 0 ? 4 : 1;
-          at = [];
-
-          for (i = 0; i < atLength; i++) {
-            at.push({
-              x: (0, _core_utils.readInt8)(data, position),
-              y: (0, _core_utils.readInt8)(data, position + 1)
-            });
-            position += 2;
-          }
-
-          dictionary.at = at;
-        }
-
-        if (dictionary.refinement && !dictionary.refinementTemplate) {
-          at = [];
-
-          for (i = 0; i < 2; i++) {
-            at.push({
-              x: (0, _core_utils.readInt8)(data, position),
-              y: (0, _core_utils.readInt8)(data, position + 1)
-            });
-            position += 2;
-          }
-
-          dictionary.refinementAt = at;
-        }
-
-        dictionary.numberOfExportedSymbols = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        dictionary.numberOfNewSymbols = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        args = [dictionary, header.number, header.referredTo, data, position, end];
-        break;
-
-      case 6:
-      case 7:
-        var textRegion = {};
-        textRegion.info = readRegionSegmentInformation(data, position);
-        position += RegionSegmentInformationFieldLength;
-        var textRegionSegmentFlags = (0, _core_utils.readUint16)(data, position);
-        position += 2;
-        textRegion.huffman = !!(textRegionSegmentFlags & 1);
-        textRegion.refinement = !!(textRegionSegmentFlags & 2);
-        textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;
-        textRegion.stripSize = 1 << textRegion.logStripSize;
-        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;
-        textRegion.transposed = !!(textRegionSegmentFlags & 64);
-        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;
-        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
-        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
-        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;
-
-        if (textRegion.huffman) {
-          var textRegionHuffmanFlags = (0, _core_utils.readUint16)(data, position);
-          position += 2;
-          textRegion.huffmanFS = textRegionHuffmanFlags & 3;
-          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;
-          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;
-          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;
-          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;
-          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;
-          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
-          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
-        }
-
-        if (textRegion.refinement && !textRegion.refinementTemplate) {
-          at = [];
-
-          for (i = 0; i < 2; i++) {
-            at.push({
-              x: (0, _core_utils.readInt8)(data, position),
-              y: (0, _core_utils.readInt8)(data, position + 1)
-            });
-            position += 2;
-          }
-
-          textRegion.refinementAt = at;
-        }
-
-        textRegion.numberOfSymbolInstances = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        args = [textRegion, header.referredTo, data, position, end];
-        break;
-
-      case 16:
-        const patternDictionary = {};
-        const patternDictionaryFlags = data[position++];
-        patternDictionary.mmr = !!(patternDictionaryFlags & 1);
-        patternDictionary.template = patternDictionaryFlags >> 1 & 3;
-        patternDictionary.patternWidth = data[position++];
-        patternDictionary.patternHeight = data[position++];
-        patternDictionary.maxPatternIndex = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        args = [patternDictionary, header.number, data, position, end];
-        break;
-
-      case 22:
-      case 23:
-        const halftoneRegion = {};
-        halftoneRegion.info = readRegionSegmentInformation(data, position);
-        position += RegionSegmentInformationFieldLength;
-        const halftoneRegionFlags = data[position++];
-        halftoneRegion.mmr = !!(halftoneRegionFlags & 1);
-        halftoneRegion.template = halftoneRegionFlags >> 1 & 3;
-        halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);
-        halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;
-        halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;
-        halftoneRegion.gridWidth = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        halftoneRegion.gridHeight = (0, _core_utils.readUint32)(data, position);
-        position += 4;
-        halftoneRegion.gridOffsetX = (0, _core_utils.readUint32)(data, position) & 0xffffffff;
-        position += 4;
-        halftoneRegion.gridOffsetY = (0, _core_utils.readUint32)(data, position) & 0xffffffff;
-        position += 4;
-        halftoneRegion.gridVectorX = (0, _core_utils.readUint16)(data, position);
-        position += 2;
-        halftoneRegion.gridVectorY = (0, _core_utils.readUint16)(data, position);
-        position += 2;
-        args = [halftoneRegion, header.referredTo, data, position, end];
-        break;
-
-      case 38:
-      case 39:
-        var genericRegion = {};
-        genericRegion.info = readRegionSegmentInformation(data, position);
-        position += RegionSegmentInformationFieldLength;
-        var genericRegionSegmentFlags = data[position++];
-        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
-        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
-        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
-
-        if (!genericRegion.mmr) {
-          atLength = genericRegion.template === 0 ? 4 : 1;
-          at = [];
-
-          for (i = 0; i < atLength; i++) {
-            at.push({
-              x: (0, _core_utils.readInt8)(data, position),
-              y: (0, _core_utils.readInt8)(data, position + 1)
-            });
-            position += 2;
-          }
-
-          genericRegion.at = at;
-        }
-
-        args = [genericRegion, data, position, end];
-        break;
-
-      case 48:
-        var pageInfo = {
-          width: (0, _core_utils.readUint32)(data, position),
-          height: (0, _core_utils.readUint32)(data, position + 4),
-          resolutionX: (0, _core_utils.readUint32)(data, position + 8),
-          resolutionY: (0, _core_utils.readUint32)(data, position + 12)
-        };
-
-        if (pageInfo.height === 0xffffffff) {
-          delete pageInfo.height;
-        }
-
-        var pageSegmentFlags = data[position + 16];
-        (0, _core_utils.readUint16)(data, position + 17);
-        pageInfo.lossless = !!(pageSegmentFlags & 1);
-        pageInfo.refinement = !!(pageSegmentFlags & 2);
-        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;
-        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;
-        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
-        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
-        args = [pageInfo];
-        break;
-
-      case 49:
-        break;
-
-      case 50:
-        break;
-
-      case 51:
-        break;
-
-      case 53:
-        args = [header.number, data, position, end];
-        break;
-
-      case 62:
-        break;
-
-      default:
-        throw new Jbig2Error(`segment type ${header.typeName}(${header.type})` + " is not implemented");
-    }
-
-    var callbackName = "on" + header.typeName;
+  restore() {
+    const prev = this.stateStack.pop();
 
-    if (callbackName in visitor) {
-      visitor[callbackName].apply(visitor, args);
+    if (prev) {
+      this.state = prev;
     }
   }
 
-  function processSegments(segments, visitor) {
-    for (var i = 0, ii = segments.length; i < ii; i++) {
-      processSegment(segments[i], visitor);
-    }
+  transform(args) {
+    this.state.ctm = _util.Util.transform(this.state.ctm, args);
   }
 
-  function parseJbig2Chunks(chunks) {
-    var visitor = new SimpleSegmentVisitor();
-
-    for (var i = 0, ii = chunks.length; i < ii; i++) {
-      var chunk = chunks[i];
-      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
-      processSegments(segments, visitor);
-    }
+}
 
-    return visitor.buffer;
+class TextState {
+  constructor() {
+    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
+    this.fontName = null;
+    this.fontSize = 0;
+    this.font = null;
+    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
+    this.textMatrix = _util.IDENTITY_MATRIX.slice();
+    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.leading = 0;
+    this.textHScale = 1;
+    this.textRise = 0;
   }
 
-  function parseJbig2(data) {
-    const end = data.length;
-    let position = 0;
-
-    if (data[position] !== 0x97 || data[position + 1] !== 0x4a || data[position + 2] !== 0x42 || 
data[position + 3] !== 0x32 || data[position + 4] !== 0x0d || data[position + 5] !== 0x0a || data[position + 
6] !== 0x1a || data[position + 7] !== 0x0a) {
-      throw new Jbig2Error("parseJbig2 - invalid header.");
-    }
-
-    const header = Object.create(null);
-    position += 8;
-    const flags = data[position++];
-    header.randomAccess = !(flags & 1);
-
-    if (!(flags & 2)) {
-      header.numberOfPages = (0, _core_utils.readUint32)(data, position);
-      position += 4;
-    }
-
-    const segments = readSegments(header, data, position, end);
-    const visitor = new SimpleSegmentVisitor();
-    processSegments(segments, visitor);
-    const {
-      width,
-      height
-    } = visitor.currentPageInfo;
-    const bitPacked = visitor.buffer;
-    const imgData = new Uint8ClampedArray(width * height);
-    let q = 0,
-        k = 0;
-
-    for (let i = 0; i < height; i++) {
-      let mask = 0,
-          buffer;
-
-      for (let j = 0; j < width; j++) {
-        if (!mask) {
-          mask = 128;
-          buffer = bitPacked[k++];
-        }
-
-        imgData[q++] = buffer & mask ? 0 : 255;
-        mask >>= 1;
-      }
-    }
-
-    return {
-      imgData,
-      width,
-      height
-    };
+  setTextMatrix(a, b, c, d, e, f) {
+    const m = this.textMatrix;
+    m[0] = a;
+    m[1] = b;
+    m[2] = c;
+    m[3] = d;
+    m[4] = e;
+    m[5] = f;
   }
 
-  function SimpleSegmentVisitor() {}
-
-  SimpleSegmentVisitor.prototype = {
-    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
-      this.currentPageInfo = info;
-      var rowSize = info.width + 7 >> 3;
-      var buffer = new Uint8ClampedArray(rowSize * info.height);
-
-      if (info.defaultPixelValue) {
-        for (var i = 0, ii = buffer.length; i < ii; i++) {
-          buffer[i] = 0xff;
-        }
-      }
-
-      this.buffer = buffer;
-    },
-    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
-      var pageInfo = this.currentPageInfo;
-      var width = regionInfo.width,
-          height = regionInfo.height;
-      var rowSize = pageInfo.width + 7 >> 3;
-      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : 
pageInfo.combinationOperator;
-      var buffer = this.buffer;
-      var mask0 = 128 >> (regionInfo.x & 7);
-      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
-      var i, j, mask, offset;
-
-      switch (combinationOperator) {
-        case 0:
-          for (i = 0; i < height; i++) {
-            mask = mask0;
-            offset = offset0;
-
-            for (j = 0; j < width; j++) {
-              if (bitmap[i][j]) {
-                buffer[offset] |= mask;
-              }
-
-              mask >>= 1;
-
-              if (!mask) {
-                mask = 128;
-                offset++;
-              }
-            }
-
-            offset0 += rowSize;
-          }
-
-          break;
-
-        case 2:
-          for (i = 0; i < height; i++) {
-            mask = mask0;
-            offset = offset0;
-
-            for (j = 0; j < width; j++) {
-              if (bitmap[i][j]) {
-                buffer[offset] ^= mask;
-              }
-
-              mask >>= 1;
-
-              if (!mask) {
-                mask = 128;
-                offset++;
-              }
-            }
-
-            offset0 += rowSize;
-          }
-
-          break;
-
-        default:
-          throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
-      }
-    },
-    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, 
end) {
-      var regionInfo = region.info;
-      var decodingContext = new DecodingContext(data, start, end);
-      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, 
region.prediction, null, region.at, decodingContext);
-      this.drawBitmap(regionInfo, bitmap);
-    },
-    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
-      this.onImmediateGenericRegion.apply(this, arguments);
-    },
-    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, 
referredSegments, data, start, end) {
-      let huffmanTables, huffmanInput;
-
-      if (dictionary.huffman) {
-        huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
-        huffmanInput = new Reader(data, start, end);
-      }
-
-      var symbols = this.symbols;
-
-      if (!symbols) {
-        this.symbols = symbols = {};
-      }
-
-      var inputSymbols = [];
-
-      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
-        const referredSymbols = symbols[referredSegments[i]];
-
-        if (referredSymbols) {
-          inputSymbols = inputSymbols.concat(referredSymbols);
-        }
-      }
-
-      var decodingContext = new DecodingContext(data, start, end);
-      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, 
inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, 
dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, 
huffmanInput);
-    },
-    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, 
data, start, end) {
-      var regionInfo = region.info;
-      let huffmanTables, huffmanInput;
-      var symbols = this.symbols;
-      var inputSymbols = [];
-
-      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
-        const referredSymbols = symbols[referredSegments[i]];
-
-        if (referredSymbols) {
-          inputSymbols = inputSymbols.concat(referredSymbols);
-        }
-      }
-
-      var symbolCodeLength = (0, _core_utils.log2)(inputSymbols.length);
-
-      if (region.huffman) {
-        huffmanInput = new Reader(data, start, end);
-        huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, 
inputSymbols.length, huffmanInput);
-      }
-
-      var decodingContext = new DecodingContext(data, start, end);
-      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, 
region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, 
region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, 
region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
-      this.drawBitmap(regionInfo, bitmap);
-    },
-    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
-      this.onImmediateTextRegion.apply(this, arguments);
-    },
-
-    onPatternDictionary(dictionary, currentSegment, data, start, end) {
-      let patterns = this.patterns;
-
-      if (!patterns) {
-        this.patterns = patterns = {};
-      }
-
-      const decodingContext = new DecodingContext(data, start, end);
-      patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, 
dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
-    },
-
-    onImmediateHalftoneRegion(region, referredSegments, data, start, end) {
-      const patterns = this.patterns[referredSegments[0]];
-      const regionInfo = region.info;
-      const decodingContext = new DecodingContext(data, start, end);
-      const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, 
regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, 
region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, 
decodingContext);
-      this.drawBitmap(regionInfo, bitmap);
-    },
-
-    onImmediateLosslessHalftoneRegion() {
-      this.onImmediateHalftoneRegion.apply(this, arguments);
-    },
-
-    onTables(currentSegment, data, start, end) {
-      let customTables = this.customTables;
-
-      if (!customTables) {
-        this.customTables = customTables = {};
-      }
-
-      customTables[currentSegment] = decodeTablesSegment(data, start, end);
-    }
-
-  };
-
-  function HuffmanLine(lineData) {
-    if (lineData.length === 2) {
-      this.isOOB = true;
-      this.rangeLow = 0;
-      this.prefixLength = lineData[0];
-      this.rangeLength = 0;
-      this.prefixCode = lineData[1];
-      this.isLowerRange = false;
-    } else {
-      this.isOOB = false;
-      this.rangeLow = lineData[0];
-      this.prefixLength = lineData[1];
-      this.rangeLength = lineData[2];
-      this.prefixCode = lineData[3];
-      this.isLowerRange = lineData[4] === "lower";
-    }
+  setTextLineMatrix(a, b, c, d, e, f) {
+    const m = this.textLineMatrix;
+    m[0] = a;
+    m[1] = b;
+    m[2] = c;
+    m[3] = d;
+    m[4] = e;
+    m[5] = f;
   }
 
-  function HuffmanTreeNode(line) {
-    this.children = [];
-
-    if (line) {
-      this.isLeaf = true;
-      this.rangeLength = line.rangeLength;
-      this.rangeLow = line.rangeLow;
-      this.isLowerRange = line.isLowerRange;
-      this.isOOB = line.isOOB;
-    } else {
-      this.isLeaf = false;
-    }
+  translateTextMatrix(x, y) {
+    const m = this.textMatrix;
+    m[4] = m[0] * x + m[2] * y + m[4];
+    m[5] = m[1] * x + m[3] * y + m[5];
   }
 
-  HuffmanTreeNode.prototype = {
-    buildTree(line, shift) {
-      const bit = line.prefixCode >> shift & 1;
-
-      if (shift <= 0) {
-        this.children[bit] = new HuffmanTreeNode(line);
-      } else {
-        let node = this.children[bit];
-
-        if (!node) {
-          this.children[bit] = node = new HuffmanTreeNode(null);
-        }
-
-        node.buildTree(line, shift - 1);
-      }
-    },
-
-    decodeNode(reader) {
-      if (this.isLeaf) {
-        if (this.isOOB) {
-          return null;
-        }
-
-        const htOffset = reader.readBits(this.rangeLength);
-        return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
-      }
-
-      const node = this.children[reader.readBit()];
+  translateTextLineMatrix(x, y) {
+    const m = this.textLineMatrix;
+    m[4] = m[0] * x + m[2] * y + m[4];
+    m[5] = m[1] * x + m[3] * y + m[5];
+  }
 
-      if (!node) {
-        throw new Jbig2Error("invalid Huffman data");
-      }
+  carriageReturn() {
+    this.translateTextLineMatrix(0, -this.leading);
+    this.textMatrix = this.textLineMatrix.slice();
+  }
 
-      return node.decodeNode(reader);
-    }
+  clone() {
+    const clone = Object.create(this);
+    clone.textMatrix = this.textMatrix.slice();
+    clone.textLineMatrix = this.textLineMatrix.slice();
+    clone.fontMatrix = this.fontMatrix.slice();
+    return clone;
+  }
 
-  };
+}
 
-  function HuffmanTable(lines, prefixCodesDone) {
-    if (!prefixCodesDone) {
-      this.assignPrefixCodes(lines);
-    }
+class EvalState {
+  constructor() {
+    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
+    this.font = null;
+    this.textRenderingMode = _util.TextRenderingMode.FILL;
+    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
+    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
+  }
 
-    this.rootNode = new HuffmanTreeNode(null);
+  clone() {
+    return Object.create(this);
+  }
 
-    for (let i = 0, ii = lines.length; i < ii; i++) {
-      const line = lines[i];
+}
 
-      if (line.prefixLength > 0) {
-        this.rootNode.buildTree(line, line.prefixLength - 1);
-      }
-    }
+class EvaluatorPreprocessor {
+  static get opMap() {
+    const getOPMap = (0, _core_utils.getLookupTableFactory)(function (t) {
+      t.w = {
+        id: _util.OPS.setLineWidth,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.J = {
+        id: _util.OPS.setLineCap,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.j = {
+        id: _util.OPS.setLineJoin,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.M = {
+        id: _util.OPS.setMiterLimit,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.d = {
+        id: _util.OPS.setDash,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.ri = {
+        id: _util.OPS.setRenderingIntent,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.i = {
+        id: _util.OPS.setFlatness,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.gs = {
+        id: _util.OPS.setGState,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.q = {
+        id: _util.OPS.save,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.Q = {
+        id: _util.OPS.restore,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.cm = {
+        id: _util.OPS.transform,
+        numArgs: 6,
+        variableArgs: false
+      };
+      t.m = {
+        id: _util.OPS.moveTo,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.l = {
+        id: _util.OPS.lineTo,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.c = {
+        id: _util.OPS.curveTo,
+        numArgs: 6,
+        variableArgs: false
+      };
+      t.v = {
+        id: _util.OPS.curveTo2,
+        numArgs: 4,
+        variableArgs: false
+      };
+      t.y = {
+        id: _util.OPS.curveTo3,
+        numArgs: 4,
+        variableArgs: false
+      };
+      t.h = {
+        id: _util.OPS.closePath,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.re = {
+        id: _util.OPS.rectangle,
+        numArgs: 4,
+        variableArgs: false
+      };
+      t.S = {
+        id: _util.OPS.stroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.s = {
+        id: _util.OPS.closeStroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.f = {
+        id: _util.OPS.fill,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.F = {
+        id: _util.OPS.fill,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t["f*"] = {
+        id: _util.OPS.eoFill,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.B = {
+        id: _util.OPS.fillStroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t["B*"] = {
+        id: _util.OPS.eoFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.b = {
+        id: _util.OPS.closeFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t["b*"] = {
+        id: _util.OPS.closeEOFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.n = {
+        id: _util.OPS.endPath,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.W = {
+        id: _util.OPS.clip,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t["W*"] = {
+        id: _util.OPS.eoClip,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.BT = {
+        id: _util.OPS.beginText,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.ET = {
+        id: _util.OPS.endText,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.Tc = {
+        id: _util.OPS.setCharSpacing,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Tw = {
+        id: _util.OPS.setWordSpacing,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Tz = {
+        id: _util.OPS.setHScale,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.TL = {
+        id: _util.OPS.setLeading,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Tf = {
+        id: _util.OPS.setFont,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.Tr = {
+        id: _util.OPS.setTextRenderingMode,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Ts = {
+        id: _util.OPS.setTextRise,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Td = {
+        id: _util.OPS.moveText,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.TD = {
+        id: _util.OPS.setLeadingMoveText,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.Tm = {
+        id: _util.OPS.setTextMatrix,
+        numArgs: 6,
+        variableArgs: false
+      };
+      t["T*"] = {
+        id: _util.OPS.nextLine,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.Tj = {
+        id: _util.OPS.showText,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.TJ = {
+        id: _util.OPS.showSpacedText,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t["'"] = {
+        id: _util.OPS.nextLineShowText,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t['"'] = {
+        id: _util.OPS.nextLineSetSpacingShowText,
+        numArgs: 3,
+        variableArgs: false
+      };
+      t.d0 = {
+        id: _util.OPS.setCharWidth,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.d1 = {
+        id: _util.OPS.setCharWidthAndBounds,
+        numArgs: 6,
+        variableArgs: false
+      };
+      t.CS = {
+        id: _util.OPS.setStrokeColorSpace,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.cs = {
+        id: _util.OPS.setFillColorSpace,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.SC = {
+        id: _util.OPS.setStrokeColor,
+        numArgs: 4,
+        variableArgs: true
+      };
+      t.SCN = {
+        id: _util.OPS.setStrokeColorN,
+        numArgs: 33,
+        variableArgs: true
+      };
+      t.sc = {
+        id: _util.OPS.setFillColor,
+        numArgs: 4,
+        variableArgs: true
+      };
+      t.scn = {
+        id: _util.OPS.setFillColorN,
+        numArgs: 33,
+        variableArgs: true
+      };
+      t.G = {
+        id: _util.OPS.setStrokeGray,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.g = {
+        id: _util.OPS.setFillGray,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.RG = {
+        id: _util.OPS.setStrokeRGBColor,
+        numArgs: 3,
+        variableArgs: false
+      };
+      t.rg = {
+        id: _util.OPS.setFillRGBColor,
+        numArgs: 3,
+        variableArgs: false
+      };
+      t.K = {
+        id: _util.OPS.setStrokeCMYKColor,
+        numArgs: 4,
+        variableArgs: false
+      };
+      t.k = {
+        id: _util.OPS.setFillCMYKColor,
+        numArgs: 4,
+        variableArgs: false
+      };
+      t.sh = {
+        id: _util.OPS.shadingFill,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.BI = {
+        id: _util.OPS.beginInlineImage,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.ID = {
+        id: _util.OPS.beginImageData,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.EI = {
+        id: _util.OPS.endInlineImage,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.Do = {
+        id: _util.OPS.paintXObject,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.MP = {
+        id: _util.OPS.markPoint,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.DP = {
+        id: _util.OPS.markPointProps,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.BMC = {
+        id: _util.OPS.beginMarkedContent,
+        numArgs: 1,
+        variableArgs: false
+      };
+      t.BDC = {
+        id: _util.OPS.beginMarkedContentProps,
+        numArgs: 2,
+        variableArgs: false
+      };
+      t.EMC = {
+        id: _util.OPS.endMarkedContent,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.BX = {
+        id: _util.OPS.beginCompat,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.EX = {
+        id: _util.OPS.endCompat,
+        numArgs: 0,
+        variableArgs: false
+      };
+      t.BM = null;
+      t.BD = null;
+      t.true = null;
+      t.fa = null;
+      t.fal = null;
+      t.fals = null;
+      t.false = null;
+      t.nu = null;
+      t.nul = null;
+      t.null = null;
+    });
+    return (0, _util.shadow)(this, "opMap", getOPMap());
   }
 
-  HuffmanTable.prototype = {
-    decode(reader) {
-      return this.rootNode.decodeNode(reader);
-    },
-
-    assignPrefixCodes(lines) {
-      const linesLength = lines.length;
-      let prefixLengthMax = 0;
-
-      for (let i = 0; i < linesLength; i++) {
-        prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
-      }
-
-      const histogram = new Uint32Array(prefixLengthMax + 1);
+  static get MAX_INVALID_PATH_OPS() {
+    return (0, _util.shadow)(this, "MAX_INVALID_PATH_OPS", 20);
+  }
 
-      for (let i = 0; i < linesLength; i++) {
-        histogram[lines[i].prefixLength]++;
-      }
+  constructor(stream, xref, stateManager = new StateManager()) {
+    this.parser = new _parser.Parser({
+      lexer: new _parser.Lexer(stream, EvaluatorPreprocessor.opMap),
+      xref
+    });
+    this.stateManager = stateManager;
+    this.nonProcessedArgs = [];
+    this._numInvalidPathOPS = 0;
+  }
 
-      let currentLength = 1,
-          firstCode = 0,
-          currentCode,
-          currentTemp,
-          line;
-      histogram[0] = 0;
+  get savedStatesDepth() {
+    return this.stateManager.stateStack.length;
+  }
 
-      while (currentLength <= prefixLengthMax) {
-        firstCode = firstCode + histogram[currentLength - 1] << 1;
-        currentCode = firstCode;
-        currentTemp = 0;
+  read(operation) {
+    let args = operation.args;
 
-        while (currentTemp < linesLength) {
-          line = lines[currentTemp];
+    while (true) {
+      const obj = this.parser.getObj();
 
-          if (line.prefixLength === currentLength) {
-            line.prefixCode = currentCode;
-            currentCode++;
-          }
+      if (obj instanceof _primitives.Cmd) {
+        const cmd = obj.cmd;
+        const opSpec = EvaluatorPreprocessor.opMap[cmd];
 
-          currentTemp++;
+        if (!opSpec) {
+          (0, _util.warn)(`Unknown command "${cmd}".`);
+          continue;
         }
 
-        currentLength++;
-      }
-    }
+        const fn = opSpec.id;
+        const numArgs = opSpec.numArgs;
+        let argsLength = args !== null ? args.length : 0;
 
-  };
+        if (!opSpec.variableArgs) {
+          if (argsLength !== numArgs) {
+            const nonProcessedArgs = this.nonProcessedArgs;
 
-  function decodeTablesSegment(data, start, end) {
-    const flags = data[start];
-    const lowestValue = (0, _core_utils.readUint32)(data, start + 1) & 0xffffffff;
-    const highestValue = (0, _core_utils.readUint32)(data, start + 5) & 0xffffffff;
-    const reader = new Reader(data, start + 9, end);
-    const prefixSizeBits = (flags >> 1 & 7) + 1;
-    const rangeSizeBits = (flags >> 4 & 7) + 1;
-    const lines = [];
-    let prefixLength,
-        rangeLength,
-        currentRangeLow = lowestValue;
+            while (argsLength > numArgs) {
+              nonProcessedArgs.push(args.shift());
+              argsLength--;
+            }
 
-    do {
-      prefixLength = reader.readBits(prefixSizeBits);
-      rangeLength = reader.readBits(rangeSizeBits);
-      lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
-      currentRangeLow += 1 << rangeLength;
-    } while (currentRangeLow < highestValue);
+            while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
+              if (args === null) {
+                args = [];
+              }
 
-    prefixLength = reader.readBits(prefixSizeBits);
-    lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"]));
-    prefixLength = reader.readBits(prefixSizeBits);
-    lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
+              args.unshift(nonProcessedArgs.pop());
+              argsLength++;
+            }
+          }
 
-    if (flags & 1) {
-      prefixLength = reader.readBits(prefixSizeBits);
-      lines.push(new HuffmanLine([prefixLength, 0]));
-    }
+          if (argsLength < numArgs) {
+            const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} 
args.`;
 
-    return new HuffmanTable(lines, false);
-  }
+            if (fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath && ++this._numInvalidPathOPS > 
EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) {
+              throw new _util.FormatError(`Invalid ${partialMsg}`);
+            }
 
-  const standardTablesCache = {};
+            (0, _util.warn)(`Skipping ${partialMsg}`);
 
-  function getStandardTable(number) {
-    let table = standardTablesCache[number];
+            if (args !== null) {
+              args.length = 0;
+            }
 
-    if (table) {
-      return table;
-    }
+            continue;
+          }
+        } else if (argsLength > numArgs) {
+          (0, _util.info)(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} 
args.`);
+        }
 
-    let lines;
+        this.preprocessCommand(fn, args);
+        operation.fn = fn;
+        operation.args = args;
+        return true;
+      }
 
-    switch (number) {
-      case 1:
-        lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
-        break;
+      if (obj === _primitives.EOF) {
+        return false;
+      }
 
-      case 2:
-        lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 
32, 0x3e], [6, 0x3f]];
-        break;
+      if (obj !== null) {
+        if (args === null) {
+          args = [];
+        }
 
-      case 3:
-        lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 
6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]];
-        break;
+        args.push(obj);
 
-      case 4:
-        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 
32, 0x1f]];
-        break;
+        if (args.length > 33) {
+          throw new _util.FormatError("Too many arguments");
+        }
+      }
+    }
+  }
 
-      case 5:
-        lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 
6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]];
+  preprocessCommand(fn, args) {
+    switch (fn | 0) {
+      case _util.OPS.save:
+        this.stateManager.save();
         break;
 
-      case 6:
-        lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 
6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 
9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]];
+      case _util.OPS.restore:
+        this.stateManager.restore();
         break;
 
-      case 7:
-        lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 
0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 
0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]];
+      case _util.OPS.transform:
+        this.stateManager.transform(args);
         break;
+    }
+  }
 
-      case 8:
-        lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 
0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], 
[22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], 
[646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]];
-        break;
+}
 
-      case 9:
-        lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 
0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], 
[39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], 
[779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]];
-        break;
+exports.EvaluatorPreprocessor = EvaluatorPreprocessor;
 
-      case 10:
-        lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], 
[2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 
6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], 
[2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]];
-        break;
+/***/ }),
+/* 16 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      case 11:
-        lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 
0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 
0x7e], [141, 7, 32, 0x7f]];
-        break;
 
-      case 12:
-        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 
0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 
0xfe], [73, 8, 32, 0xff]];
-        break;
 
-      case 13:
-        lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 
0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 
0x7e], [141, 7, 32, 0x7f]];
-        break;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.IdentityCMap = exports.CMapFactory = exports.CMap = void 0;
 
-      case 14:
-        lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
-        break;
+var _util = __w_pdfjs_require__(2);
 
-      case 15:
-        lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], 
[0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 
32, 0x7e, "lower"], [25, 7, 32, 0x7f]];
-        break;
+var _primitives = __w_pdfjs_require__(5);
 
-      default:
-        throw new Jbig2Error(`standard table B.${number} does not exist`);
-    }
+var _parser = __w_pdfjs_require__(17);
 
-    for (let i = 0, ii = lines.length; i < ii; i++) {
-      lines[i] = new HuffmanLine(lines[i]);
-    }
+var _core_utils = __w_pdfjs_require__(9);
 
-    table = new HuffmanTable(lines, true);
-    standardTablesCache[number] = table;
-    return table;
-  }
+var _stream = __w_pdfjs_require__(10);
 
-  function Reader(data, start, end) {
-    this.data = data;
-    this.start = start;
-    this.end = end;
-    this.position = start;
-    this.shift = -1;
-    this.currentByte = 0;
+const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", 
"78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", 
"83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", 
"Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", 
"Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", 
"Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", 
"Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", 
"B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", 
"ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", 
"Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB
 -EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", 
"GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", 
"HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", 
"HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", 
"KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", 
"KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", 
"RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", 
"UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", 
"UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", 
"UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H",
  "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", 
"UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", 
"UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", 
"UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", 
"UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", 
"WP-Symbol"];
+const MAX_MAP_RANGE = 2 ** 24 - 1;
+
+class CMap {
+  constructor(builtInCMap = false) {
+    this.codespaceRanges = [[], [], [], []];
+    this.numCodespaceRanges = 0;
+    this._map = [];
+    this.name = "";
+    this.vertical = false;
+    this.useCMap = null;
+    this.builtInCMap = builtInCMap;
   }
 
-  Reader.prototype = {
-    readBit() {
-      if (this.shift < 0) {
-        if (this.position >= this.end) {
-          throw new Jbig2Error("end of data while reading bit");
-        }
+  addCodespaceRange(n, low, high) {
+    this.codespaceRanges[n - 1].push(low, high);
+    this.numCodespaceRanges++;
+  }
 
-        this.currentByte = this.data[this.position++];
-        this.shift = 7;
-      }
+  mapCidRange(low, high, dstLow) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");
+    }
 
-      const bit = this.currentByte >> this.shift & 1;
-      this.shift--;
-      return bit;
-    },
+    while (low <= high) {
+      this._map[low++] = dstLow++;
+    }
+  }
 
-    readBits(numBits) {
-      let result = 0,
-          i;
+  mapBfRange(low, high, dstLow) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");
+    }
 
-      for (i = numBits - 1; i >= 0; i--) {
-        result |= this.readBit() << i;
-      }
+    const lastByte = dstLow.length - 1;
 
-      return result;
-    },
+    while (low <= high) {
+      this._map[low++] = dstLow;
+      dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
+    }
+  }
 
-    byteAlign() {
-      this.shift = -1;
-    },
+  mapBfRangeToArray(low, high, array) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");
+    }
 
-    next() {
-      if (this.position >= this.end) {
-        return -1;
-      }
+    const ii = array.length;
+    let i = 0;
 
-      return this.data[this.position++];
+    while (low <= high && i < ii) {
+      this._map[low] = array[i++];
+      ++low;
     }
+  }
 
-  };
+  mapOne(src, dst) {
+    this._map[src] = dst;
+  }
 
-  function getCustomHuffmanTable(index, referredTo, customTables) {
-    let currentIndex = 0;
+  lookup(code) {
+    return this._map[code];
+  }
+
+  contains(code) {
+    return this._map[code] !== undefined;
+  }
 
-    for (let i = 0, ii = referredTo.length; i < ii; i++) {
-      const table = customTables[referredTo[i]];
+  forEach(callback) {
+    const map = this._map;
+    const length = map.length;
 
-      if (table) {
-        if (index === currentIndex) {
-          return table;
+    if (length <= 0x10000) {
+      for (let i = 0; i < length; i++) {
+        if (map[i] !== undefined) {
+          callback(i, map[i]);
         }
+      }
+    } else {
+      for (const i in map) {
+        callback(i, map[i]);
+      }
+    }
+  }
+
+  charCodeOf(value) {
+    const map = this._map;
 
-        currentIndex++;
+    if (map.length <= 0x10000) {
+      return map.indexOf(value);
+    }
+
+    for (const charCode in map) {
+      if (map[charCode] === value) {
+        return charCode | 0;
       }
     }
 
-    throw new Jbig2Error("can't find custom Huffman table");
+    return -1;
   }
 
-  function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
-    const codes = [];
+  getMap() {
+    return this._map;
+  }
 
-    for (let i = 0; i <= 34; i++) {
-      const codeLength = reader.readBits(4);
-      codes.push(new HuffmanLine([i, codeLength, 0, 0]));
-    }
+  readCharCode(str, offset, out) {
+    let c = 0;
+    const codespaceRanges = this.codespaceRanges;
 
-    const runCodesTable = new HuffmanTable(codes, false);
-    codes.length = 0;
+    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
+      c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
+      const codespaceRange = codespaceRanges[n];
 
-    for (let i = 0; i < numberOfSymbols;) {
-      const codeLength = runCodesTable.decode(reader);
+      for (let k = 0, kk = codespaceRange.length; k < kk;) {
+        const low = codespaceRange[k++];
+        const high = codespaceRange[k++];
 
-      if (codeLength >= 32) {
-        let repeatedLength, numberOfRepeats, j;
+        if (c >= low && c <= high) {
+          out.charcode = c;
+          out.length = n + 1;
+          return;
+        }
+      }
+    }
 
-        switch (codeLength) {
-          case 32:
-            if (i === 0) {
-              throw new Jbig2Error("no previous value in symbol ID table");
-            }
+    out.charcode = 0;
+    out.length = 1;
+  }
 
-            numberOfRepeats = reader.readBits(2) + 3;
-            repeatedLength = codes[i - 1].prefixLength;
-            break;
+  getCharCodeLength(charCode) {
+    const codespaceRanges = this.codespaceRanges;
 
-          case 33:
-            numberOfRepeats = reader.readBits(3) + 3;
-            repeatedLength = 0;
-            break;
+    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
+      const codespaceRange = codespaceRanges[n];
 
-          case 34:
-            numberOfRepeats = reader.readBits(7) + 11;
-            repeatedLength = 0;
-            break;
+      for (let k = 0, kk = codespaceRange.length; k < kk;) {
+        const low = codespaceRange[k++];
+        const high = codespaceRange[k++];
 
-          default:
-            throw new Jbig2Error("invalid code length in symbol ID table");
+        if (charCode >= low && charCode <= high) {
+          return n + 1;
         }
+      }
+    }
 
-        for (j = 0; j < numberOfRepeats; j++) {
-          codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
-          i++;
-        }
-      } else {
-        codes.push(new HuffmanLine([i, codeLength, 0, 0]));
-        i++;
+    return 1;
+  }
+
+  get length() {
+    return this._map.length;
+  }
+
+  get isIdentityCMap() {
+    if (!(this.name === "Identity-H" || this.name === "Identity-V")) {
+      return false;
+    }
+
+    if (this._map.length !== 0x10000) {
+      return false;
+    }
+
+    for (let i = 0; i < 0x10000; i++) {
+      if (this._map[i] !== i) {
+        return false;
       }
     }
 
-    reader.byteAlign();
-    const symbolIDTable = new HuffmanTable(codes, false);
-    let customIndex = 0,
-        tableFirstS,
-        tableDeltaS,
-        tableDeltaT;
+    return true;
+  }
 
-    switch (textRegion.huffmanFS) {
-      case 0:
-      case 1:
-        tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
-        break;
+}
 
-      case 3:
-        tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
-        customIndex++;
-        break;
+exports.CMap = CMap;
 
-      default:
-        throw new Jbig2Error("invalid Huffman FS selector");
+class IdentityCMap extends CMap {
+  constructor(vertical, n) {
+    super();
+    this.vertical = vertical;
+    this.addCodespaceRange(n, 0, 0xffff);
+  }
+
+  mapCidRange(low, high, dstLow) {
+    (0, _util.unreachable)("should not call mapCidRange");
+  }
+
+  mapBfRange(low, high, dstLow) {
+    (0, _util.unreachable)("should not call mapBfRange");
+  }
+
+  mapBfRangeToArray(low, high, array) {
+    (0, _util.unreachable)("should not call mapBfRangeToArray");
+  }
+
+  mapOne(src, dst) {
+    (0, _util.unreachable)("should not call mapCidOne");
+  }
+
+  lookup(code) {
+    return Number.isInteger(code) && code <= 0xffff ? code : undefined;
+  }
+
+  contains(code) {
+    return Number.isInteger(code) && code <= 0xffff;
+  }
+
+  forEach(callback) {
+    for (let i = 0; i <= 0xffff; i++) {
+      callback(i, i);
     }
+  }
 
-    switch (textRegion.huffmanDS) {
-      case 0:
-      case 1:
-      case 2:
-        tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
-        break;
+  charCodeOf(value) {
+    return Number.isInteger(value) && value <= 0xffff ? value : -1;
+  }
 
-      case 3:
-        tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
-        customIndex++;
-        break;
+  getMap() {
+    const map = new Array(0x10000);
 
-      default:
-        throw new Jbig2Error("invalid Huffman DS selector");
+    for (let i = 0; i <= 0xffff; i++) {
+      map[i] = i;
     }
 
-    switch (textRegion.huffmanDT) {
-      case 0:
-      case 1:
-      case 2:
-        tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
-        break;
+    return map;
+  }
 
-      case 3:
-        tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
-        customIndex++;
-        break;
+  get length() {
+    return 0x10000;
+  }
 
-      default:
-        throw new Jbig2Error("invalid Huffman DT selector");
+  get isIdentityCMap() {
+    (0, _util.unreachable)("should not access .isIdentityCMap");
+  }
+
+}
+
+exports.IdentityCMap = IdentityCMap;
+
+const BinaryCMapReader = function BinaryCMapReaderClosure() {
+  function hexToInt(a, size) {
+    let n = 0;
+
+    for (let i = 0; i <= size; i++) {
+      n = n << 8 | a[i];
     }
 
-    if (textRegion.refinement) {
-      throw new Jbig2Error("refinement with Huffman is not supported");
+    return n >>> 0;
+  }
+
+  function hexToStr(a, size) {
+    if (size === 1) {
+      return String.fromCharCode(a[0], a[1]);
     }
 
-    return {
-      symbolIDTable,
-      tableFirstS,
-      tableDeltaS,
-      tableDeltaT
-    };
+    if (size === 3) {
+      return String.fromCharCode(a[0], a[1], a[2], a[3]);
+    }
+
+    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
   }
 
-  function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
-    let customIndex = 0,
-        tableDeltaHeight,
-        tableDeltaWidth;
+  function addHex(a, b, size) {
+    let c = 0;
 
-    switch (dictionary.huffmanDHSelector) {
-      case 0:
-      case 1:
-        tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
-        break;
+    for (let i = size; i >= 0; i--) {
+      c += a[i] + b[i];
+      a[i] = c & 255;
+      c >>= 8;
+    }
+  }
 
-      case 3:
-        tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
-        customIndex++;
-        break;
+  function incHex(a, size) {
+    let c = 1;
 
-      default:
-        throw new Jbig2Error("invalid Huffman DH selector");
+    for (let i = size; i >= 0 && c > 0; i--) {
+      c += a[i];
+      a[i] = c & 255;
+      c >>= 8;
     }
+  }
 
-    switch (dictionary.huffmanDWSelector) {
-      case 0:
-      case 1:
-        tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
-        break;
+  const MAX_NUM_SIZE = 16;
+  const MAX_ENCODED_NUM_SIZE = 19;
 
-      case 3:
-        tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
-        customIndex++;
-        break;
+  class BinaryCMapStream {
+    constructor(data) {
+      this.buffer = data;
+      this.pos = 0;
+      this.end = data.length;
+      this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
+    }
 
-      default:
-        throw new Jbig2Error("invalid Huffman DW selector");
+    readByte() {
+      if (this.pos >= this.end) {
+        return -1;
+      }
+
+      return this.buffer[this.pos++];
     }
 
-    let tableBitmapSize, tableAggregateInstances;
+    readNumber() {
+      let n = 0;
+      let last;
 
-    if (dictionary.bitmapSizeSelector) {
-      tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
-      customIndex++;
-    } else {
-      tableBitmapSize = getStandardTable(1);
+      do {
+        const b = this.readByte();
+
+        if (b < 0) {
+          throw new _util.FormatError("unexpected EOF in bcmap");
+        }
+
+        last = !(b & 0x80);
+        n = n << 7 | b & 0x7f;
+      } while (!last);
+
+      return n;
     }
 
-    if (dictionary.aggregationInstancesSelector) {
-      tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
-    } else {
-      tableAggregateInstances = getStandardTable(1);
+    readSigned() {
+      const n = this.readNumber();
+      return n & 1 ? ~(n >>> 1) : n >>> 1;
     }
 
-    return {
-      tableDeltaHeight,
-      tableDeltaWidth,
-      tableBitmapSize,
-      tableAggregateInstances
-    };
-  }
+    readHex(num, size) {
+      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));
+      this.pos += size + 1;
+    }
+
+    readHexNumber(num, size) {
+      let last;
+      const stack = this.tmpBuf;
+      let sp = 0;
+
+      do {
+        const b = this.readByte();
+
+        if (b < 0) {
+          throw new _util.FormatError("unexpected EOF in bcmap");
+        }
+
+        last = !(b & 0x80);
+        stack[sp++] = b & 0x7f;
+      } while (!last);
+
+      let i = size,
+          buffer = 0,
+          bufferSize = 0;
+
+      while (i >= 0) {
+        while (bufferSize < 8 && stack.length > 0) {
+          buffer |= stack[--sp] << bufferSize;
+          bufferSize += 7;
+        }
+
+        num[i] = buffer & 255;
+        i--;
+        buffer >>= 8;
+        bufferSize -= 8;
+      }
+    }
+
+    readHexSigned(num, size) {
+      this.readHexNumber(num, size);
+      const sign = num[size] & 1 ? 255 : 0;
+      let c = 0;
 
-  function readUncompressedBitmap(reader, width, height) {
-    const bitmap = [];
+      for (let i = 0; i <= size; i++) {
+        c = (c & 1) << 8 | num[i];
+        num[i] = c >> 1 ^ sign;
+      }
+    }
 
-    for (let y = 0; y < height; y++) {
-      const row = new Uint8Array(width);
-      bitmap.push(row);
+    readString() {
+      const len = this.readNumber();
+      let s = "";
 
-      for (let x = 0; x < width; x++) {
-        row[x] = reader.readBit();
+      for (let i = 0; i < len; i++) {
+        s += String.fromCharCode(this.readNumber());
       }
 
-      reader.byteAlign();
+      return s;
     }
 
-    return bitmap;
   }
 
-  function decodeMMRBitmap(input, width, height, endOfBlock) {
-    const params = {
-      K: -1,
-      Columns: width,
-      Rows: height,
-      BlackIs1: true,
-      EndOfBlock: endOfBlock
-    };
-    const decoder = new _ccitt.CCITTFaxDecoder(input, params);
-    const bitmap = [];
-    let currentByte,
-        eof = false;
+  class BinaryCMapReader {
+    async process(data, cMap, extend) {
+      const stream = new BinaryCMapStream(data);
+      const header = stream.readByte();
+      cMap.vertical = !!(header & 1);
+      let useCMap = null;
+      const start = new Uint8Array(MAX_NUM_SIZE);
+      const end = new Uint8Array(MAX_NUM_SIZE);
+      const char = new Uint8Array(MAX_NUM_SIZE);
+      const charCode = new Uint8Array(MAX_NUM_SIZE);
+      const tmp = new Uint8Array(MAX_NUM_SIZE);
+      let code;
+      let b;
 
-    for (let y = 0; y < height; y++) {
-      const row = new Uint8Array(width);
-      bitmap.push(row);
-      let shift = -1;
+      while ((b = stream.readByte()) >= 0) {
+        const type = b >> 5;
 
-      for (let x = 0; x < width; x++) {
-        if (shift < 0) {
-          currentByte = decoder.readNextChar();
+        if (type === 7) {
+          switch (b & 0x1f) {
+            case 0:
+              stream.readString();
+              break;
 
-          if (currentByte === -1) {
-            currentByte = 0;
-            eof = true;
+            case 1:
+              useCMap = stream.readString();
+              break;
           }
 
-          shift = 7;
+          continue;
+        }
+
+        const sequence = !!(b & 0x10);
+        const dataSize = b & 15;
+
+        if (dataSize + 1 > MAX_NUM_SIZE) {
+          throw new Error("BinaryCMapReader.process: Invalid dataSize.");
         }
 
-        row[x] = currentByte >> shift & 1;
-        shift--;
-      }
-    }
+        const ucs2DataSize = 1;
+        const subitemsCount = stream.readNumber();
 
-    if (endOfBlock && !eof) {
-      const lookForEOFLimit = 5;
+        switch (type) {
+          case 0:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
 
-      for (let i = 0; i < lookForEOFLimit; i++) {
-        if (decoder.readNextChar() === -1) {
-          break;
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+            }
+
+            break;
+
+          case 1:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            stream.readNumber();
+
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              stream.readNumber();
+            }
+
+            break;
+
+          case 2:
+            stream.readHex(char, dataSize);
+            code = stream.readNumber();
+            cMap.mapOne(hexToInt(char, dataSize), code);
+
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(char, dataSize);
+
+              if (!sequence) {
+                stream.readHexNumber(tmp, dataSize);
+                addHex(char, tmp, dataSize);
+              }
+
+              code = stream.readSigned() + (code + 1);
+              cMap.mapOne(hexToInt(char, dataSize), code);
+            }
+
+            break;
+
+          case 3:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            code = stream.readNumber();
+            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+
+              if (!sequence) {
+                stream.readHexNumber(start, dataSize);
+                addHex(start, end, dataSize);
+              } else {
+                start.set(end);
+              }
+
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              code = stream.readNumber();
+              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+            }
+
+            break;
+
+          case 4:
+            stream.readHex(char, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(char, ucs2DataSize);
+
+              if (!sequence) {
+                stream.readHexNumber(tmp, ucs2DataSize);
+                addHex(char, tmp, ucs2DataSize);
+              }
+
+              incHex(charCode, dataSize);
+              stream.readHexSigned(tmp, dataSize);
+              addHex(charCode, tmp, dataSize);
+              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+            }
+
+            break;
+
+          case 5:
+            stream.readHex(start, ucs2DataSize);
+            stream.readHexNumber(end, ucs2DataSize);
+            addHex(end, start, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, 
dataSize));
+
+            for (let i = 1; i < subitemsCount; i++) {
+              incHex(end, ucs2DataSize);
+
+              if (!sequence) {
+                stream.readHexNumber(start, ucs2DataSize);
+                addHex(start, end, ucs2DataSize);
+              } else {
+                start.set(end);
+              }
+
+              stream.readHexNumber(end, ucs2DataSize);
+              addHex(end, start, ucs2DataSize);
+              stream.readHex(charCode, dataSize);
+              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, 
dataSize));
+            }
+
+            break;
+
+          default:
+            throw new Error(`BinaryCMapReader.process - unknown type: ${type}`);
         }
       }
+
+      if (useCMap) {
+        return extend(useCMap);
+      }
+
+      return cMap;
     }
 
-    return bitmap;
   }
 
-  function Jbig2Image() {}
+  return BinaryCMapReader;
+}();
 
-  Jbig2Image.prototype = {
-    parseChunks(chunks) {
-      return parseJbig2Chunks(chunks);
-    },
+const CMapFactory = function CMapFactoryClosure() {
+  function strToInt(str) {
+    let a = 0;
 
-    parse(data) {
-      const {
-        imgData,
-        width,
-        height
-      } = parseJbig2(data);
-      this.width = width;
-      this.height = height;
-      return imgData;
+    for (let i = 0; i < str.length; i++) {
+      a = a << 8 | str.charCodeAt(i);
     }
 
-  };
-  return Jbig2Image;
-}();
+    return a >>> 0;
+  }
 
-exports.Jbig2Image = Jbig2Image;
+  function expectString(obj) {
+    if (!(0, _util.isString)(obj)) {
+      throw new _util.FormatError("Malformed CMap: expected string.");
+    }
+  }
 
-/***/ }),
-/* 17 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+  function expectInt(obj) {
+    if (!Number.isInteger(obj)) {
+      throw new _util.FormatError("Malformed CMap: expected int.");
+    }
+  }
 
-"use strict";
+  function parseBfChar(cMap, lexer) {
+    while (true) {
+      let obj = lexer.getObj();
 
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ArithmeticDecoder = void 0;
-const QeTable = [{
-  qe: 0x5601,
-  nmps: 1,
-  nlps: 1,
-  switchFlag: 1
-}, {
-  qe: 0x3401,
-  nmps: 2,
-  nlps: 6,
-  switchFlag: 0
-}, {
-  qe: 0x1801,
-  nmps: 3,
-  nlps: 9,
-  switchFlag: 0
-}, {
-  qe: 0x0ac1,
-  nmps: 4,
-  nlps: 12,
-  switchFlag: 0
-}, {
-  qe: 0x0521,
-  nmps: 5,
-  nlps: 29,
-  switchFlag: 0
-}, {
-  qe: 0x0221,
-  nmps: 38,
-  nlps: 33,
-  switchFlag: 0
-}, {
-  qe: 0x5601,
-  nmps: 7,
-  nlps: 6,
-  switchFlag: 1
-}, {
-  qe: 0x5401,
-  nmps: 8,
-  nlps: 14,
-  switchFlag: 0
-}, {
-  qe: 0x4801,
-  nmps: 9,
-  nlps: 14,
-  switchFlag: 0
-}, {
-  qe: 0x3801,
-  nmps: 10,
-  nlps: 14,
-  switchFlag: 0
-}, {
-  qe: 0x3001,
-  nmps: 11,
-  nlps: 17,
-  switchFlag: 0
-}, {
-  qe: 0x2401,
-  nmps: 12,
-  nlps: 18,
-  switchFlag: 0
-}, {
-  qe: 0x1c01,
-  nmps: 13,
-  nlps: 20,
-  switchFlag: 0
-}, {
-  qe: 0x1601,
-  nmps: 29,
-  nlps: 21,
-  switchFlag: 0
-}, {
-  qe: 0x5601,
-  nmps: 15,
-  nlps: 14,
-  switchFlag: 1
-}, {
-  qe: 0x5401,
-  nmps: 16,
-  nlps: 14,
-  switchFlag: 0
-}, {
-  qe: 0x5101,
-  nmps: 17,
-  nlps: 15,
-  switchFlag: 0
-}, {
-  qe: 0x4801,
-  nmps: 18,
-  nlps: 16,
-  switchFlag: 0
-}, {
-  qe: 0x3801,
-  nmps: 19,
-  nlps: 17,
-  switchFlag: 0
-}, {
-  qe: 0x3401,
-  nmps: 20,
-  nlps: 18,
-  switchFlag: 0
-}, {
-  qe: 0x3001,
-  nmps: 21,
-  nlps: 19,
-  switchFlag: 0
-}, {
-  qe: 0x2801,
-  nmps: 22,
-  nlps: 19,
-  switchFlag: 0
-}, {
-  qe: 0x2401,
-  nmps: 23,
-  nlps: 20,
-  switchFlag: 0
-}, {
-  qe: 0x2201,
-  nmps: 24,
-  nlps: 21,
-  switchFlag: 0
-}, {
-  qe: 0x1c01,
-  nmps: 25,
-  nlps: 22,
-  switchFlag: 0
-}, {
-  qe: 0x1801,
-  nmps: 26,
-  nlps: 23,
-  switchFlag: 0
-}, {
-  qe: 0x1601,
-  nmps: 27,
-  nlps: 24,
-  switchFlag: 0
-}, {
-  qe: 0x1401,
-  nmps: 28,
-  nlps: 25,
-  switchFlag: 0
-}, {
-  qe: 0x1201,
-  nmps: 29,
-  nlps: 26,
-  switchFlag: 0
-}, {
-  qe: 0x1101,
-  nmps: 30,
-  nlps: 27,
-  switchFlag: 0
-}, {
-  qe: 0x0ac1,
-  nmps: 31,
-  nlps: 28,
-  switchFlag: 0
-}, {
-  qe: 0x09c1,
-  nmps: 32,
-  nlps: 29,
-  switchFlag: 0
-}, {
-  qe: 0x08a1,
-  nmps: 33,
-  nlps: 30,
-  switchFlag: 0
-}, {
-  qe: 0x0521,
-  nmps: 34,
-  nlps: 31,
-  switchFlag: 0
-}, {
-  qe: 0x0441,
-  nmps: 35,
-  nlps: 32,
-  switchFlag: 0
-}, {
-  qe: 0x02a1,
-  nmps: 36,
-  nlps: 33,
-  switchFlag: 0
-}, {
-  qe: 0x0221,
-  nmps: 37,
-  nlps: 34,
-  switchFlag: 0
-}, {
-  qe: 0x0141,
-  nmps: 38,
-  nlps: 35,
-  switchFlag: 0
-}, {
-  qe: 0x0111,
-  nmps: 39,
-  nlps: 36,
-  switchFlag: 0
-}, {
-  qe: 0x0085,
-  nmps: 40,
-  nlps: 37,
-  switchFlag: 0
-}, {
-  qe: 0x0049,
-  nmps: 41,
-  nlps: 38,
-  switchFlag: 0
-}, {
-  qe: 0x0025,
-  nmps: 42,
-  nlps: 39,
-  switchFlag: 0
-}, {
-  qe: 0x0015,
-  nmps: 43,
-  nlps: 40,
-  switchFlag: 0
-}, {
-  qe: 0x0009,
-  nmps: 44,
-  nlps: 41,
-  switchFlag: 0
-}, {
-  qe: 0x0005,
-  nmps: 45,
-  nlps: 42,
-  switchFlag: 0
-}, {
-  qe: 0x0001,
-  nmps: 45,
-  nlps: 43,
-  switchFlag: 0
-}, {
-  qe: 0x5601,
-  nmps: 46,
-  nlps: 46,
-  switchFlag: 0
-}];
-
-class ArithmeticDecoder {
-  constructor(data, start, end) {
-    this.data = data;
-    this.bp = start;
-    this.dataEnd = end;
-    this.chigh = data[start];
-    this.clow = 0;
-    this.byteIn();
-    this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f;
-    this.clow = this.clow << 7 & 0xffff;
-    this.ct -= 7;
-    this.a = 0x8000;
-  }
-
-  byteIn() {
-    const data = this.data;
-    let bp = this.bp;
-
-    if (data[bp] === 0xff) {
-      if (data[bp + 1] > 0x8f) {
-        this.clow += 0xff00;
-        this.ct = 8;
-      } else {
-        bp++;
-        this.clow += data[bp] << 9;
-        this.ct = 7;
-        this.bp = bp;
+      if ((0, _primitives.isCmd)(obj, "endbfchar")) {
+        return;
       }
-    } else {
-      bp++;
-      this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00;
-      this.ct = 8;
-      this.bp = bp;
-    }
 
-    if (this.clow > 0xffff) {
-      this.chigh += this.clow >> 16;
-      this.clow &= 0xffff;
+      expectString(obj);
+      const src = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      const dst = obj;
+      cMap.mapOne(src, dst);
     }
   }
 
-  readBit(contexts, pos) {
-    let cx_index = contexts[pos] >> 1,
-        cx_mps = contexts[pos] & 1;
-    const qeTableIcx = QeTable[cx_index];
-    const qeIcx = qeTableIcx.qe;
-    let d;
-    let a = this.a - qeIcx;
-
-    if (this.chigh < qeIcx) {
-      if (a < qeIcx) {
-        a = qeIcx;
-        d = cx_mps;
-        cx_index = qeTableIcx.nmps;
-      } else {
-        a = qeIcx;
-        d = 1 ^ cx_mps;
-
-        if (qeTableIcx.switchFlag === 1) {
-          cx_mps = d;
-        }
+  function parseBfRange(cMap, lexer) {
+    while (true) {
+      let obj = lexer.getObj();
 
-        cx_index = qeTableIcx.nlps;
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
       }
-    } else {
-      this.chigh -= qeIcx;
 
-      if ((a & 0x8000) !== 0) {
-        this.a = a;
-        return cx_mps;
+      if ((0, _primitives.isCmd)(obj, "endbfrange")) {
+        return;
       }
 
-      if (a < qeIcx) {
-        d = 1 ^ cx_mps;
+      expectString(obj);
+      const low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      const high = strToInt(obj);
+      obj = lexer.getObj();
 
-        if (qeTableIcx.switchFlag === 1) {
-          cx_mps = d;
+      if (Number.isInteger(obj) || (0, _util.isString)(obj)) {
+        const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
+        cMap.mapBfRange(low, high, dstLow);
+      } else if ((0, _primitives.isCmd)(obj, "[")) {
+        obj = lexer.getObj();
+        const array = [];
+
+        while (!(0, _primitives.isCmd)(obj, "]") && !(0, _primitives.isEOF)(obj)) {
+          array.push(obj);
+          obj = lexer.getObj();
         }
 
-        cx_index = qeTableIcx.nlps;
+        cMap.mapBfRangeToArray(low, high, array);
       } else {
-        d = cx_mps;
-        cx_index = qeTableIcx.nmps;
+        break;
       }
     }
 
-    do {
-      if (this.ct === 0) {
-        this.byteIn();
-      }
-
-      a <<= 1;
-      this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1;
-      this.clow = this.clow << 1 & 0xffff;
-      this.ct--;
-    } while ((a & 0x8000) === 0);
-
-    this.a = a;
-    contexts[pos] = cx_index << 1 | cx_mps;
-    return d;
+    throw new _util.FormatError("Invalid bf range.");
   }
 
-}
-
-exports.ArithmeticDecoder = ArithmeticDecoder;
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+  function parseCidChar(cMap, lexer) {
+    while (true) {
+      let obj = lexer.getObj();
 
-"use strict";
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
 
+      if ((0, _primitives.isCmd)(obj, "endcidchar")) {
+        return;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.JpegStream = void 0;
+      expectString(obj);
+      const src = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      const dst = obj;
+      cMap.mapOne(src, dst);
+    }
+  }
 
-var _stream = __w_pdfjs_require__(12);
+  function parseCidRange(cMap, lexer) {
+    while (true) {
+      let obj = lexer.getObj();
 
-var _primitives = __w_pdfjs_require__(5);
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
 
-var _jpg = __w_pdfjs_require__(19);
+      if ((0, _primitives.isCmd)(obj, "endcidrange")) {
+        return;
+      }
 
-var _util = __w_pdfjs_require__(2);
+      expectString(obj);
+      const low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      const high = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      const dstLow = obj;
+      cMap.mapCidRange(low, high, dstLow);
+    }
+  }
 
-const JpegStream = function JpegStreamClosure() {
-  function JpegStream(stream, maybeLength, dict, params) {
-    let ch;
+  function parseCodespaceRange(cMap, lexer) {
+    while (true) {
+      let obj = lexer.getObj();
 
-    while ((ch = stream.getByte()) !== -1) {
-      if (ch === 0xff) {
-        stream.skip(-1);
+      if ((0, _primitives.isEOF)(obj)) {
         break;
       }
-    }
 
-    this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-    this.params = params;
+      if ((0, _primitives.isCmd)(obj, "endcodespacerange")) {
+        return;
+      }
 
-    _stream.DecodeStream.call(this, maybeLength);
-  }
+      if (!(0, _util.isString)(obj)) {
+        break;
+      }
 
-  JpegStream.prototype = Object.create(_stream.DecodeStream.prototype);
-  Object.defineProperty(JpegStream.prototype, "bytes", {
-    get: function JpegStream_bytes() {
-      return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
-    },
-    configurable: true
-  });
+      const low = strToInt(obj);
+      obj = lexer.getObj();
 
-  JpegStream.prototype.ensureBuffer = function (requested) {};
+      if (!(0, _util.isString)(obj)) {
+        break;
+      }
 
-  JpegStream.prototype.readBlock = function () {
-    if (this.eof) {
-      return;
+      const high = strToInt(obj);
+      cMap.addCodespaceRange(obj.length, low, high);
     }
 
-    const jpegOptions = {
-      decodeTransform: undefined,
-      colorTransform: undefined
-    };
-    const decodeArr = this.dict.getArray("Decode", "D");
-
-    if (this.forceRGB && Array.isArray(decodeArr)) {
-      const bitsPerComponent = this.dict.get("BitsPerComponent") || 8;
-      const decodeArrLength = decodeArr.length;
-      const transform = new Int32Array(decodeArrLength);
-      let transformNeeded = false;
-      const maxValue = (1 << bitsPerComponent) - 1;
-
-      for (let i = 0; i < decodeArrLength; i += 2) {
-        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
-        transform[i + 1] = decodeArr[i] * maxValue | 0;
+    throw new _util.FormatError("Invalid codespace range.");
+  }
 
-        if (transform[i] !== 256 || transform[i + 1] !== 0) {
-          transformNeeded = true;
-        }
-      }
+  function parseWMode(cMap, lexer) {
+    const obj = lexer.getObj();
 
-      if (transformNeeded) {
-        jpegOptions.decodeTransform = transform;
-      }
+    if (Number.isInteger(obj)) {
+      cMap.vertical = !!obj;
     }
+  }
 
-    if ((0, _primitives.isDict)(this.params)) {
-      const colorTransform = this.params.get("ColorTransform");
+  function parseCMapName(cMap, lexer) {
+    const obj = lexer.getObj();
 
-      if (Number.isInteger(colorTransform)) {
-        jpegOptions.colorTransform = colorTransform;
-      }
+    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {
+      cMap.name = obj.name;
     }
+  }
 
-    const jpegImage = new _jpg.JpegImage(jpegOptions);
-    jpegImage.parse(this.bytes);
-    const data = jpegImage.getData({
-      width: this.drawWidth,
-      height: this.drawHeight,
-      forceRGB: this.forceRGB,
-      isSourcePDF: true
-    });
-    this.buffer = data;
-    this.bufferLength = data.length;
-    this.eof = true;
-  };
+  async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
+    let previous, embeddedUseCMap;
 
-  return JpegStream;
-}();
+    objLoop: while (true) {
+      try {
+        const obj = lexer.getObj();
 
-exports.JpegStream = JpegStream;
+        if ((0, _primitives.isEOF)(obj)) {
+          break;
+        } else if ((0, _primitives.isName)(obj)) {
+          if (obj.name === "WMode") {
+            parseWMode(cMap, lexer);
+          } else if (obj.name === "CMapName") {
+            parseCMapName(cMap, lexer);
+          }
 
-/***/ }),
-/* 19 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+          previous = obj;
+        } else if ((0, _primitives.isCmd)(obj)) {
+          switch (obj.cmd) {
+            case "endcmap":
+              break objLoop;
 
-"use strict";
+            case "usecmap":
+              if ((0, _primitives.isName)(previous)) {
+                embeddedUseCMap = previous.name;
+              }
 
+              break;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.JpegImage = void 0;
+            case "begincodespacerange":
+              parseCodespaceRange(cMap, lexer);
+              break;
 
-var _util = __w_pdfjs_require__(2);
+            case "beginbfchar":
+              parseBfChar(cMap, lexer);
+              break;
 
-var _core_utils = __w_pdfjs_require__(8);
+            case "begincidchar":
+              parseCidChar(cMap, lexer);
+              break;
 
-class JpegError extends _util.BaseException {
-  constructor(msg) {
-    super(`JPEG error: ${msg}`);
-  }
-
-}
-
-class DNLMarkerError extends _util.BaseException {
-  constructor(message, scanLines) {
-    super(message);
-    this.scanLines = scanLines;
-  }
-
-}
-
-class EOIMarkerError extends _util.BaseException {}
-
-var JpegImage = function JpegImageClosure() {
-  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 
40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 
58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
-  var dctCos1 = 4017;
-  var dctSin1 = 799;
-  var dctCos3 = 3406;
-  var dctSin3 = 2276;
-  var dctCos6 = 1567;
-  var dctSin6 = 3784;
-  var dctSqrt2 = 5793;
-  var dctSqrt1d2 = 2896;
-
-  function JpegImage({
-    decodeTransform = null,
-    colorTransform = -1
-  } = {}) {
-    this._decodeTransform = decodeTransform;
-    this._colorTransform = colorTransform;
-  }
+            case "beginbfrange":
+              parseBfRange(cMap, lexer);
+              break;
 
-  function buildHuffmanTable(codeLengths, values) {
-    var k = 0,
-        code = [],
-        i,
-        j,
-        length = 16;
+            case "begincidrange":
+              parseCidRange(cMap, lexer);
+              break;
+          }
+        }
+      } catch (ex) {
+        if (ex instanceof _core_utils.MissingDataException) {
+          throw ex;
+        }
 
-    while (length > 0 && !codeLengths[length - 1]) {
-      length--;
+        (0, _util.warn)("Invalid cMap data: " + ex);
+        continue;
+      }
     }
 
-    code.push({
-      children: [],
-      index: 0
-    });
-    var p = code[0],
-        q;
+    if (!useCMap && embeddedUseCMap) {
+      useCMap = embeddedUseCMap;
+    }
 
-    for (i = 0; i < length; i++) {
-      for (j = 0; j < codeLengths[i]; j++) {
-        p = code.pop();
-        p.children[p.index] = values[k];
+    if (useCMap) {
+      return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+    }
 
-        while (p.index > 0) {
-          p = code.pop();
-        }
+    return cMap;
+  }
 
-        p.index++;
-        code.push(p);
+  async function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
+    cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap);
 
-        while (code.length <= i) {
-          code.push(q = {
-            children: [],
-            index: 0
-          });
-          p.children[p.index] = q.children;
-          p = q;
-        }
+    if (cMap.numCodespaceRanges === 0) {
+      const useCodespaceRanges = cMap.useCMap.codespaceRanges;
 
-        k++;
+      for (let i = 0; i < useCodespaceRanges.length; i++) {
+        cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
       }
 
-      if (i + 1 < length) {
-        code.push(q = {
-          children: [],
-          index: 0
-        });
-        p.children[p.index] = q.children;
-        p = q;
-      }
+      cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
     }
 
-    return code[0].children;
-  }
-
-  function getBlockBufferOffset(component, row, col) {
-    return 64 * ((component.blocksPerLine + 1) * row + col);
+    cMap.useCMap.forEach(function (key, value) {
+      if (!cMap.contains(key)) {
+        cMap.mapOne(key, cMap.useCMap.lookup(key));
+      }
+    });
+    return cMap;
   }
 
-  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, 
successivePrev, successive, parseDNLMarker = false) {
-    var mcusPerLine = frame.mcusPerLine;
-    var progressive = frame.progressive;
-    const startOffset = offset;
-    let bitsData = 0,
-        bitsCount = 0;
+  async function createBuiltInCMap(name, fetchBuiltInCMap) {
+    if (name === "Identity-H") {
+      return new IdentityCMap(false, 2);
+    } else if (name === "Identity-V") {
+      return new IdentityCMap(true, 2);
+    }
 
-    function readBit() {
-      if (bitsCount > 0) {
-        bitsCount--;
-        return bitsData >> bitsCount & 1;
-      }
+    if (!BUILT_IN_CMAPS.includes(name)) {
+      throw new Error("Unknown CMap name: " + name);
+    }
 
-      bitsData = data[offset++];
+    if (!fetchBuiltInCMap) {
+      throw new Error("Built-in CMap parameters are not provided.");
+    }
 
-      if (bitsData === 0xff) {
-        var nextByte = data[offset++];
+    const {
+      cMapData,
+      compressionType
+    } = await fetchBuiltInCMap(name);
+    const cMap = new CMap(true);
+
+    if (compressionType === _util.CMapCompressionType.BINARY) {
+      return new BinaryCMapReader().process(cMapData, cMap, useCMap => {
+        return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+      });
+    }
 
-        if (nextByte) {
-          if (nextByte === 0xdc && parseDNLMarker) {
-            offset += 2;
-            const scanLines = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
+    if (compressionType === _util.CMapCompressionType.NONE) {
+      const lexer = new _parser.Lexer(new _stream.Stream(cMapData));
+      return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
+    }
 
-            if (scanLines > 0 && scanLines !== frame.scanLines) {
-              throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
-            }
-          } else if (nextByte === 0xd9) {
-            if (parseDNLMarker) {
-              const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
+    throw new Error("TODO: Only BINARY/NONE CMap compression is currently supported.");
+  }
 
-              if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 10) {
-                throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly 
caused by incorrect `scanLines` parameter", maybeScanLines);
-              }
-            }
+  return {
+    async create(params) {
+      const encoding = params.encoding;
+      const fetchBuiltInCMap = params.fetchBuiltInCMap;
+      const useCMap = params.useCMap;
 
-            throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
-          }
+      if ((0, _primitives.isName)(encoding)) {
+        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
+      } else if ((0, _primitives.isStream)(encoding)) {
+        const parsedCMap = await parseCMap(new CMap(), new _parser.Lexer(encoding), fetchBuiltInCMap, 
useCMap);
 
-          throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
+        if (parsedCMap.isIdentityCMap) {
+          return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
         }
+
+        return parsedCMap;
       }
 
-      bitsCount = 7;
-      return bitsData >>> 7;
+      throw new Error("Encoding required.");
     }
 
-    function decodeHuffman(tree) {
-      var node = tree;
+  };
+}();
 
-      while (true) {
-        node = node[readBit()];
+exports.CMapFactory = CMapFactory;
 
-        switch (typeof node) {
-          case "number":
-            return node;
+/***/ }),
+/* 17 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-          case "object":
-            continue;
-        }
 
-        throw new JpegError("invalid huffman sequence");
-      }
-    }
 
-    function receive(length) {
-      var n = 0;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Parser = exports.Linearization = exports.Lexer = void 0;
 
-      while (length > 0) {
-        n = n << 1 | readBit();
-        length--;
-      }
+var _util = __w_pdfjs_require__(2);
 
-      return n;
-    }
+var _primitives = __w_pdfjs_require__(5);
 
-    function receiveAndExtend(length) {
-      if (length === 1) {
-        return readBit() === 1 ? 1 : -1;
-      }
+var _core_utils = __w_pdfjs_require__(9);
 
-      var n = receive(length);
+var _ascii_85_stream = __w_pdfjs_require__(18);
 
-      if (n >= 1 << length - 1) {
-        return n;
-      }
+var _ascii_hex_stream = __w_pdfjs_require__(20);
 
-      return n + (-1 << length) + 1;
-    }
+var _ccitt_stream = __w_pdfjs_require__(21);
 
-    function decodeBaseline(component, blockOffset) {
-      var t = decodeHuffman(component.huffmanTableDC);
-      var diff = t === 0 ? 0 : receiveAndExtend(t);
-      component.blockData[blockOffset] = component.pred += diff;
-      var k = 1;
+var _flate_stream = __w_pdfjs_require__(23);
 
-      while (k < 64) {
-        var rs = decodeHuffman(component.huffmanTableAC);
-        var s = rs & 15,
-            r = rs >> 4;
+var _jbig2_stream = __w_pdfjs_require__(24);
 
-        if (s === 0) {
-          if (r < 15) {
-            break;
-          }
+var _jpeg_stream = __w_pdfjs_require__(27);
 
-          k += 16;
-          continue;
-        }
+var _jpx_stream = __w_pdfjs_require__(29);
 
-        k += r;
-        var z = dctZigZag[k];
-        component.blockData[blockOffset + z] = receiveAndExtend(s);
-        k++;
-      }
-    }
+var _lzw_stream = __w_pdfjs_require__(31);
 
-    function decodeDCFirst(component, blockOffset) {
-      var t = decodeHuffman(component.huffmanTableDC);
-      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
-      component.blockData[blockOffset] = component.pred += diff;
-    }
+var _stream = __w_pdfjs_require__(10);
 
-    function decodeDCSuccessive(component, blockOffset) {
-      component.blockData[blockOffset] |= readBit() << successive;
-    }
+var _predictor_stream = __w_pdfjs_require__(32);
 
-    var eobrun = 0;
+var _run_length_stream = __w_pdfjs_require__(33);
 
-    function decodeACFirst(component, blockOffset) {
-      if (eobrun > 0) {
-        eobrun--;
-        return;
-      }
+const MAX_LENGTH_TO_CACHE = 1000;
+const MAX_ADLER32_LENGTH = 5552;
 
-      var k = spectralStart,
-          e = spectralEnd;
+function computeAdler32(bytes) {
+  const bytesLength = bytes.length;
+  let a = 1,
+      b = 0;
 
-      while (k <= e) {
-        var rs = decodeHuffman(component.huffmanTableAC);
-        var s = rs & 15,
-            r = rs >> 4;
+  for (let i = 0; i < bytesLength; ++i) {
+    a += bytes[i] & 0xff;
+    b += a;
+  }
 
-        if (s === 0) {
-          if (r < 15) {
-            eobrun = receive(r) + (1 << r) - 1;
-            break;
-          }
+  return b % 65521 << 16 | a % 65521;
+}
 
-          k += 16;
-          continue;
-        }
+class Parser {
+  constructor({
+    lexer,
+    xref,
+    allowStreams = false,
+    recoveryMode = false
+  }) {
+    this.lexer = lexer;
+    this.xref = xref;
+    this.allowStreams = allowStreams;
+    this.recoveryMode = recoveryMode;
+    this.imageCache = Object.create(null);
+    this.refill();
+  }
 
-        k += r;
-        var z = dctZigZag[k];
-        component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
-        k++;
-      }
+  refill() {
+    this.buf1 = this.lexer.getObj();
+    this.buf2 = this.lexer.getObj();
+  }
+
+  shift() {
+    if (this.buf2 instanceof _primitives.Cmd && this.buf2.cmd === "ID") {
+      this.buf1 = this.buf2;
+      this.buf2 = null;
+    } else {
+      this.buf1 = this.buf2;
+      this.buf2 = this.lexer.getObj();
     }
+  }
+
+  tryShift() {
+    try {
+      this.shift();
+      return true;
+    } catch (e) {
+      if (e instanceof _core_utils.MissingDataException) {
+        throw e;
+      }
 
-    var successiveACState = 0,
-        successiveACNextValue;
+      return false;
+    }
+  }
 
-    function decodeACSuccessive(component, blockOffset) {
-      var k = spectralStart;
-      var e = spectralEnd;
-      var r = 0;
-      var s;
-      var rs;
+  getObj(cipherTransform = null) {
+    const buf1 = this.buf1;
+    this.shift();
 
-      while (k <= e) {
-        const offsetZ = blockOffset + dctZigZag[k];
-        const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
+    if (buf1 instanceof _primitives.Cmd) {
+      switch (buf1.cmd) {
+        case "BI":
+          return this.makeInlineImage(cipherTransform);
 
-        switch (successiveACState) {
-          case 0:
-            rs = decodeHuffman(component.huffmanTableAC);
-            s = rs & 15;
-            r = rs >> 4;
+        case "[":
+          const array = [];
 
-            if (s === 0) {
-              if (r < 15) {
-                eobrun = receive(r) + (1 << r);
-                successiveACState = 4;
-              } else {
-                r = 16;
-                successiveACState = 1;
-              }
-            } else {
-              if (s !== 1) {
-                throw new JpegError("invalid ACn encoding");
-              }
+          while (!(0, _primitives.isCmd)(this.buf1, "]") && !(0, _primitives.isEOF)(this.buf1)) {
+            array.push(this.getObj(cipherTransform));
+          }
 
-              successiveACNextValue = receiveAndExtend(s);
-              successiveACState = r ? 2 : 3;
+          if ((0, _primitives.isEOF)(this.buf1)) {
+            if (this.recoveryMode) {
+              return array;
             }
 
-            continue;
+            throw new _core_utils.ParserEOFException("End of file inside array.");
+          }
 
-          case 1:
-          case 2:
-            if (component.blockData[offsetZ]) {
-              component.blockData[offsetZ] += sign * (readBit() << successive);
-            } else {
-              r--;
+          this.shift();
+          return array;
 
-              if (r === 0) {
-                successiveACState = successiveACState === 2 ? 3 : 0;
-              }
+        case "<<":
+          const dict = new _primitives.Dict(this.xref);
+
+          while (!(0, _primitives.isCmd)(this.buf1, ">>") && !(0, _primitives.isEOF)(this.buf1)) {
+            if (!(0, _primitives.isName)(this.buf1)) {
+              (0, _util.info)("Malformed dictionary: key must be a name object");
+              this.shift();
+              continue;
             }
 
-            break;
+            const key = this.buf1.name;
+            this.shift();
 
-          case 3:
-            if (component.blockData[offsetZ]) {
-              component.blockData[offsetZ] += sign * (readBit() << successive);
-            } else {
-              component.blockData[offsetZ] = successiveACNextValue << successive;
-              successiveACState = 0;
+            if ((0, _primitives.isEOF)(this.buf1)) {
+              break;
             }
 
-            break;
+            dict.set(key, this.getObj(cipherTransform));
+          }
 
-          case 4:
-            if (component.blockData[offsetZ]) {
-              component.blockData[offsetZ] += sign * (readBit() << successive);
+          if ((0, _primitives.isEOF)(this.buf1)) {
+            if (this.recoveryMode) {
+              return dict;
             }
 
-            break;
-        }
+            throw new _core_utils.ParserEOFException("End of file inside dictionary.");
+          }
 
-        k++;
-      }
+          if ((0, _primitives.isCmd)(this.buf2, "stream")) {
+            return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
+          }
 
-      if (successiveACState === 4) {
-        eobrun--;
+          this.shift();
+          return dict;
 
-        if (eobrun === 0) {
-          successiveACState = 0;
-        }
+        default:
+          return buf1;
       }
     }
 
-    let blockRow = 0;
+    if (Number.isInteger(buf1)) {
+      if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, "R")) {
+        const ref = _primitives.Ref.get(buf1, this.buf1);
 
-    function decodeMcu(component, decode, mcu, row, col) {
-      var mcuRow = mcu / mcusPerLine | 0;
-      var mcuCol = mcu % mcusPerLine;
-      blockRow = mcuRow * component.v + row;
-      var blockCol = mcuCol * component.h + col;
-      const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
-      decode(component, blockOffset);
-    }
+        this.shift();
+        this.shift();
+        return ref;
+      }
 
-    function decodeBlock(component, decode, mcu) {
-      blockRow = mcu / component.blocksPerLine | 0;
-      var blockCol = mcu % component.blocksPerLine;
-      const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
-      decode(component, blockOffset);
+      return buf1;
     }
 
-    var componentsLength = components.length;
-    var component, i, j, k, n;
-    var decodeFn;
-
-    if (progressive) {
-      if (spectralStart === 0) {
-        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
-      } else {
-        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+    if (typeof buf1 === "string") {
+      if (cipherTransform) {
+        return cipherTransform.decryptString(buf1);
       }
-    } else {
-      decodeFn = decodeBaseline;
+
+      return buf1;
     }
 
-    var mcu = 0,
-        fileMarker;
-    var mcuExpected;
+    return buf1;
+  }
 
-    if (componentsLength === 1) {
-      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
-    } else {
-      mcuExpected = mcusPerLine * frame.mcusPerColumn;
-    }
+  findDefaultInlineStreamEnd(stream) {
+    const E = 0x45,
+          I = 0x49,
+          SPACE = 0x20,
+          LF = 0xa,
+          CR = 0xd,
+          NUL = 0x0;
+    const lexer = this.lexer,
+          startPos = stream.pos,
+          n = 10;
+    let state = 0,
+        ch,
+        maybeEIPos;
 
-    var h, v;
+    while ((ch = stream.getByte()) !== -1) {
+      if (state === 0) {
+        state = ch === E ? 1 : 0;
+      } else if (state === 1) {
+        state = ch === I ? 2 : 0;
+      } else {
+        (0, _util.assert)(state === 2, "findDefaultInlineStreamEnd - invalid state.");
 
-    while (mcu <= mcuExpected) {
-      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
+        if (ch === SPACE || ch === LF || ch === CR) {
+          maybeEIPos = stream.pos;
+          const followingBytes = stream.peekBytes(n);
 
-      if (mcuToRead > 0) {
-        for (i = 0; i < componentsLength; i++) {
-          components[i].pred = 0;
-        }
+          for (let i = 0, ii = followingBytes.length; i < ii; i++) {
+            ch = followingBytes[i];
 
-        eobrun = 0;
+            if (ch === NUL && followingBytes[i + 1] !== NUL) {
+              continue;
+            }
 
-        if (componentsLength === 1) {
-          component = components[0];
+            if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {
+              state = 0;
+              break;
+            }
+          }
 
-          for (n = 0; n < mcuToRead; n++) {
-            decodeBlock(component, decodeFn, mcu);
-            mcu++;
+          if (state !== 2) {
+            continue;
           }
-        } else {
-          for (n = 0; n < mcuToRead; n++) {
-            for (i = 0; i < componentsLength; i++) {
-              component = components[i];
-              h = component.h;
-              v = component.v;
-
-              for (j = 0; j < v; j++) {
-                for (k = 0; k < h; k++) {
-                  decodeMcu(component, decodeFn, mcu, j, k);
-                }
-              }
+
+          if (lexer.knownCommands) {
+            const nextObj = lexer.peekObj();
+
+            if (nextObj instanceof _primitives.Cmd && !lexer.knownCommands[nextObj.cmd]) {
+              state = 0;
             }
+          } else {
+            (0, _util.warn)("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");
+          }
 
-            mcu++;
+          if (state === 2) {
+            break;
           }
+        } else {
+          state = 0;
         }
       }
+    }
 
-      bitsCount = 0;
-      fileMarker = findNextFileMarker(data, offset);
+    if (ch === -1) {
+      (0, _util.warn)("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a 
valid EI marker");
 
-      if (!fileMarker) {
-        break;
+      if (maybeEIPos) {
+        (0, _util.warn)('... trying to recover by using the last "EI" occurrence.');
+        stream.skip(-(stream.pos - maybeEIPos));
       }
+    }
 
-      if (fileMarker.invalid) {
-        const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
-        (0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
-        offset = fileMarker.offset;
-      }
+    let endOffset = 4;
+    stream.skip(-endOffset);
+    ch = stream.peekByte();
+    stream.skip(endOffset);
 
-      if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
-        offset += 2;
-      } else {
-        break;
-      }
+    if (!(0, _core_utils.isWhiteSpace)(ch)) {
+      endOffset--;
     }
 
-    return offset - startOffset;
+    return stream.pos - endOffset - startPos;
   }
 
-  function quantizeAndInverse(component, blockBufferOffset, p) {
-    var qt = component.quantizationTable,
-        blockData = component.blockData;
-    var v0, v1, v2, v3, v4, v5, v6, v7;
-    var p0, p1, p2, p3, p4, p5, p6, p7;
-    var t;
-
-    if (!qt) {
-      throw new JpegError("missing required Quantization Table.");
-    }
-
-    for (var row = 0; row < 64; row += 8) {
-      p0 = blockData[blockBufferOffset + row];
-      p1 = blockData[blockBufferOffset + row + 1];
-      p2 = blockData[blockBufferOffset + row + 2];
-      p3 = blockData[blockBufferOffset + row + 3];
-      p4 = blockData[blockBufferOffset + row + 4];
-      p5 = blockData[blockBufferOffset + row + 5];
-      p6 = blockData[blockBufferOffset + row + 6];
-      p7 = blockData[blockBufferOffset + row + 7];
-      p0 *= qt[row];
-
-      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
-        t = dctSqrt2 * p0 + 512 >> 10;
-        p[row] = t;
-        p[row + 1] = t;
-        p[row + 2] = t;
-        p[row + 3] = t;
-        p[row + 4] = t;
-        p[row + 5] = t;
-        p[row + 6] = t;
-        p[row + 7] = t;
-        continue;
-      }
-
-      p1 *= qt[row + 1];
-      p2 *= qt[row + 2];
-      p3 *= qt[row + 3];
-      p4 *= qt[row + 4];
-      p5 *= qt[row + 5];
-      p6 *= qt[row + 6];
-      p7 *= qt[row + 7];
-      v0 = dctSqrt2 * p0 + 128 >> 8;
-      v1 = dctSqrt2 * p4 + 128 >> 8;
-      v2 = p2;
-      v3 = p6;
-      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
-      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
-      v5 = p3 << 4;
-      v6 = p5 << 4;
-      v0 = v0 + v1 + 1 >> 1;
-      v1 = v0 - v1;
-      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
-      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
-      v3 = t;
-      v4 = v4 + v6 + 1 >> 1;
-      v6 = v4 - v6;
-      v7 = v7 + v5 + 1 >> 1;
-      v5 = v7 - v5;
-      v0 = v0 + v3 + 1 >> 1;
-      v3 = v0 - v3;
-      v1 = v1 + v2 + 1 >> 1;
-      v2 = v1 - v2;
-      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
-      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
-      v7 = t;
-      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
-      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
-      v6 = t;
-      p[row] = v0 + v7;
-      p[row + 7] = v0 - v7;
-      p[row + 1] = v1 + v6;
-      p[row + 6] = v1 - v6;
-      p[row + 2] = v2 + v5;
-      p[row + 5] = v2 - v5;
-      p[row + 3] = v3 + v4;
-      p[row + 4] = v3 - v4;
-    }
-
-    for (var col = 0; col < 8; ++col) {
-      p0 = p[col];
-      p1 = p[col + 8];
-      p2 = p[col + 16];
-      p3 = p[col + 24];
-      p4 = p[col + 32];
-      p5 = p[col + 40];
-      p6 = p[col + 48];
-      p7 = p[col + 56];
-
-      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
-        t = dctSqrt2 * p0 + 8192 >> 14;
-
-        if (t < -2040) {
-          t = 0;
-        } else if (t >= 2024) {
-          t = 255;
-        } else {
-          t = t + 2056 >> 4;
-        }
+  findDCTDecodeInlineStreamEnd(stream) {
+    const startPos = stream.pos;
+    let foundEOI = false,
+        b,
+        markerLength;
 
-        blockData[blockBufferOffset + col] = t;
-        blockData[blockBufferOffset + col + 8] = t;
-        blockData[blockBufferOffset + col + 16] = t;
-        blockData[blockBufferOffset + col + 24] = t;
-        blockData[blockBufferOffset + col + 32] = t;
-        blockData[blockBufferOffset + col + 40] = t;
-        blockData[blockBufferOffset + col + 48] = t;
-        blockData[blockBufferOffset + col + 56] = t;
+    while ((b = stream.getByte()) !== -1) {
+      if (b !== 0xff) {
         continue;
       }
 
-      v0 = dctSqrt2 * p0 + 2048 >> 12;
-      v1 = dctSqrt2 * p4 + 2048 >> 12;
-      v2 = p2;
-      v3 = p6;
-      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
-      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
-      v5 = p3;
-      v6 = p5;
-      v0 = (v0 + v1 + 1 >> 1) + 4112;
-      v1 = v0 - v1;
-      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
-      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
-      v3 = t;
-      v4 = v4 + v6 + 1 >> 1;
-      v6 = v4 - v6;
-      v7 = v7 + v5 + 1 >> 1;
-      v5 = v7 - v5;
-      v0 = v0 + v3 + 1 >> 1;
-      v3 = v0 - v3;
-      v1 = v1 + v2 + 1 >> 1;
-      v2 = v1 - v2;
-      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
-      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
-      v7 = t;
-      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
-      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
-      v6 = t;
-      p0 = v0 + v7;
-      p7 = v0 - v7;
-      p1 = v1 + v6;
-      p6 = v1 - v6;
-      p2 = v2 + v5;
-      p5 = v2 - v5;
-      p3 = v3 + v4;
-      p4 = v3 - v4;
-
-      if (p0 < 16) {
-        p0 = 0;
-      } else if (p0 >= 4080) {
-        p0 = 255;
-      } else {
-        p0 >>= 4;
-      }
+      switch (stream.getByte()) {
+        case 0x00:
+          break;
 
-      if (p1 < 16) {
-        p1 = 0;
-      } else if (p1 >= 4080) {
-        p1 = 255;
-      } else {
-        p1 >>= 4;
-      }
+        case 0xff:
+          stream.skip(-1);
+          break;
 
-      if (p2 < 16) {
-        p2 = 0;
-      } else if (p2 >= 4080) {
-        p2 = 255;
-      } else {
-        p2 >>= 4;
-      }
+        case 0xd9:
+          foundEOI = true;
+          break;
 
-      if (p3 < 16) {
-        p3 = 0;
-      } else if (p3 >= 4080) {
-        p3 = 255;
-      } else {
-        p3 >>= 4;
-      }
+        case 0xc0:
+        case 0xc1:
+        case 0xc2:
+        case 0xc3:
+        case 0xc5:
+        case 0xc6:
+        case 0xc7:
+        case 0xc9:
+        case 0xca:
+        case 0xcb:
+        case 0xcd:
+        case 0xce:
+        case 0xcf:
+        case 0xc4:
+        case 0xcc:
+        case 0xda:
+        case 0xdb:
+        case 0xdc:
+        case 0xdd:
+        case 0xde:
+        case 0xdf:
+        case 0xe0:
+        case 0xe1:
+        case 0xe2:
+        case 0xe3:
+        case 0xe4:
+        case 0xe5:
+        case 0xe6:
+        case 0xe7:
+        case 0xe8:
+        case 0xe9:
+        case 0xea:
+        case 0xeb:
+        case 0xec:
+        case 0xed:
+        case 0xee:
+        case 0xef:
+        case 0xfe:
+          markerLength = stream.getUint16();
 
-      if (p4 < 16) {
-        p4 = 0;
-      } else if (p4 >= 4080) {
-        p4 = 255;
-      } else {
-        p4 >>= 4;
-      }
+          if (markerLength > 2) {
+            stream.skip(markerLength - 2);
+          } else {
+            stream.skip(-2);
+          }
 
-      if (p5 < 16) {
-        p5 = 0;
-      } else if (p5 >= 4080) {
-        p5 = 255;
-      } else {
-        p5 >>= 4;
+          break;
       }
 
-      if (p6 < 16) {
-        p6 = 0;
-      } else if (p6 >= 4080) {
-        p6 = 255;
-      } else {
-        p6 >>= 4;
+      if (foundEOI) {
+        break;
       }
+    }
 
-      if (p7 < 16) {
-        p7 = 0;
-      } else if (p7 >= 4080) {
-        p7 = 255;
-      } else {
-        p7 >>= 4;
-      }
+    const length = stream.pos - startPos;
 
-      blockData[blockBufferOffset + col] = p0;
-      blockData[blockBufferOffset + col + 8] = p1;
-      blockData[blockBufferOffset + col + 16] = p2;
-      blockData[blockBufferOffset + col + 24] = p3;
-      blockData[blockBufferOffset + col + 32] = p4;
-      blockData[blockBufferOffset + col + 40] = p5;
-      blockData[blockBufferOffset + col + 48] = p6;
-      blockData[blockBufferOffset + col + 56] = p7;
+    if (b === -1) {
+      (0, _util.warn)("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ 
instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
     }
+
+    this.inlineStreamSkipEI(stream);
+    return length;
   }
 
-  function buildComponentData(frame, component) {
-    var blocksPerLine = component.blocksPerLine;
-    var blocksPerColumn = component.blocksPerColumn;
-    var computationBuffer = new Int16Array(64);
+  findASCII85DecodeInlineStreamEnd(stream) {
+    const TILDE = 0x7e,
+          GT = 0x3e;
+    const startPos = stream.pos;
+    let ch;
 
-    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
-      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
-        var offset = getBlockBufferOffset(component, blockRow, blockCol);
-        quantizeAndInverse(component, offset, computationBuffer);
-      }
-    }
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === TILDE) {
+        const tildePos = stream.pos;
+        ch = stream.peekByte();
 
-    return component.blockData;
-  }
+        while ((0, _core_utils.isWhiteSpace)(ch)) {
+          stream.skip();
+          ch = stream.peekByte();
+        }
 
-  function findNextFileMarker(data, currentPos, startPos = currentPos) {
-    const maxPos = data.length - 1;
-    var newPos = startPos < currentPos ? startPos : currentPos;
+        if (ch === GT) {
+          stream.skip();
+          break;
+        }
 
-    if (currentPos >= maxPos) {
-      return null;
+        if (stream.pos > tildePos) {
+          const maybeEI = stream.peekBytes(2);
+
+          if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) {
+            break;
+          }
+        }
+      }
     }
 
-    var currentMarker = (0, _core_utils.readUint16)(data, currentPos);
+    const length = stream.pos - startPos;
 
-    if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
-      return {
-        invalid: null,
-        marker: currentMarker,
-        offset: currentPos
-      };
+    if (ch === -1) {
+      (0, _util.warn)("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ 
instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
     }
 
-    var newMarker = (0, _core_utils.readUint16)(data, newPos);
+    this.inlineStreamSkipEI(stream);
+    return length;
+  }
+
+  findASCIIHexDecodeInlineStreamEnd(stream) {
+    const GT = 0x3e;
+    const startPos = stream.pos;
+    let ch;
 
-    while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
-      if (++newPos >= maxPos) {
-        return null;
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === GT) {
+        break;
       }
+    }
 
-      newMarker = (0, _core_utils.readUint16)(data, newPos);
+    const length = stream.pos - startPos;
+
+    if (ch === -1) {
+      (0, _util.warn)("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ 
instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
     }
 
-    return {
-      invalid: currentMarker.toString(16),
-      marker: newMarker,
-      offset: newPos
-    };
+    this.inlineStreamSkipEI(stream);
+    return length;
   }
 
-  JpegImage.prototype = {
-    parse(data, {
-      dnlScanLines = null
-    } = {}) {
-      function readDataBlock() {
-        const length = (0, _core_utils.readUint16)(data, offset);
-        offset += 2;
-        let endOffset = offset + length - 2;
-        var fileMarker = findNextFileMarker(data, endOffset, offset);
-
-        if (fileMarker && fileMarker.invalid) {
-          (0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
-          endOffset = fileMarker.offset;
-        }
+  inlineStreamSkipEI(stream) {
+    const E = 0x45,
+          I = 0x49;
+    let state = 0,
+        ch;
 
-        var array = data.subarray(offset, endOffset);
-        offset += array.length;
-        return array;
+    while ((ch = stream.getByte()) !== -1) {
+      if (state === 0) {
+        state = ch === E ? 1 : 0;
+      } else if (state === 1) {
+        state = ch === I ? 2 : 0;
+      } else if (state === 2) {
+        break;
       }
+    }
+  }
 
-      function prepareComponents(frame) {
-        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
-        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
-
-        for (var i = 0; i < frame.components.length; i++) {
-          component = frame.components[i];
-          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
-          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
-          var blocksPerLineForMcu = mcusPerLine * component.h;
-          var blocksPerColumnForMcu = mcusPerColumn * component.v;
-          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
-          component.blockData = new Int16Array(blocksBufferSize);
-          component.blocksPerLine = blocksPerLine;
-          component.blocksPerColumn = blocksPerColumn;
-        }
+  makeInlineImage(cipherTransform) {
+    const lexer = this.lexer;
+    const stream = lexer.stream;
+    const dict = new _primitives.Dict(this.xref);
+    let dictLength;
 
-        frame.mcusPerLine = mcusPerLine;
-        frame.mcusPerColumn = mcusPerColumn;
+    while (!(0, _primitives.isCmd)(this.buf1, "ID") && !(0, _primitives.isEOF)(this.buf1)) {
+      if (!(0, _primitives.isName)(this.buf1)) {
+        throw new _util.FormatError("Dictionary key must be a name object");
       }
 
-      var offset = 0;
-      var jfif = null;
-      var adobe = null;
-      var frame, resetInterval;
-      let numSOSMarkers = 0;
-      var quantizationTables = [];
-      var huffmanTablesAC = [],
-          huffmanTablesDC = [];
-      let fileMarker = (0, _core_utils.readUint16)(data, offset);
-      offset += 2;
+      const key = this.buf1.name;
+      this.shift();
 
-      if (fileMarker !== 0xffd8) {
-        throw new JpegError("SOI not found");
+      if ((0, _primitives.isEOF)(this.buf1)) {
+        break;
       }
 
-      fileMarker = (0, _core_utils.readUint16)(data, offset);
-      offset += 2;
+      dict.set(key, this.getObj(cipherTransform));
+    }
 
-      markerLoop: while (fileMarker !== 0xffd9) {
-        var i, j, l;
-
-        switch (fileMarker) {
-          case 0xffe0:
-          case 0xffe1:
-          case 0xffe2:
-          case 0xffe3:
-          case 0xffe4:
-          case 0xffe5:
-          case 0xffe6:
-          case 0xffe7:
-          case 0xffe8:
-          case 0xffe9:
-          case 0xffea:
-          case 0xffeb:
-          case 0xffec:
-          case 0xffed:
-          case 0xffee:
-          case 0xffef:
-          case 0xfffe:
-            var appData = readDataBlock();
-
-            if (fileMarker === 0xffe0) {
-              if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 
&& appData[4] === 0) {
-                jfif = {
-                  version: {
-                    major: appData[5],
-                    minor: appData[6]
-                  },
-                  densityUnits: appData[7],
-                  xDensity: appData[8] << 8 | appData[9],
-                  yDensity: appData[10] << 8 | appData[11],
-                  thumbWidth: appData[12],
-                  thumbHeight: appData[13],
-                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
-                };
-              }
-            }
+    if (lexer.beginInlineImagePos !== -1) {
+      dictLength = stream.pos - lexer.beginInlineImagePos;
+    }
 
-            if (fileMarker === 0xffee) {
-              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 
&& appData[4] === 0x65) {
-                adobe = {
-                  version: appData[5] << 8 | appData[6],
-                  flags0: appData[7] << 8 | appData[8],
-                  flags1: appData[9] << 8 | appData[10],
-                  transformCode: appData[11]
-                };
-              }
-            }
+    const filter = dict.get("Filter", "F");
+    let filterName;
 
-            break;
+    if ((0, _primitives.isName)(filter)) {
+      filterName = filter.name;
+    } else if (Array.isArray(filter)) {
+      const filterZero = this.xref.fetchIfRef(filter[0]);
 
-          case 0xffdb:
-            const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
-            var quantizationTablesEnd = quantizationTablesLength + offset - 2;
-            var z;
+      if ((0, _primitives.isName)(filterZero)) {
+        filterName = filterZero.name;
+      }
+    }
 
-            while (offset < quantizationTablesEnd) {
-              var quantizationTableSpec = data[offset++];
-              var tableData = new Uint16Array(64);
+    const startPos = stream.pos;
+    let length;
 
-              if (quantizationTableSpec >> 4 === 0) {
-                for (j = 0; j < 64; j++) {
-                  z = dctZigZag[j];
-                  tableData[z] = data[offset++];
-                }
-              } else if (quantizationTableSpec >> 4 === 1) {
-                for (j = 0; j < 64; j++) {
-                  z = dctZigZag[j];
-                  tableData[z] = (0, _core_utils.readUint16)(data, offset);
-                  offset += 2;
-                }
-              } else {
-                throw new JpegError("DQT - invalid table spec");
-              }
+    if (filterName === "DCTDecode" || filterName === "DCT") {
+      length = this.findDCTDecodeInlineStreamEnd(stream);
+    } else if (filterName === "ASCII85Decode" || filterName === "A85") {
+      length = this.findASCII85DecodeInlineStreamEnd(stream);
+    } else if (filterName === "ASCIIHexDecode" || filterName === "AHx") {
+      length = this.findASCIIHexDecodeInlineStreamEnd(stream);
+    } else {
+      length = this.findDefaultInlineStreamEnd(stream);
+    }
 
-              quantizationTables[quantizationTableSpec & 15] = tableData;
-            }
+    let imageStream = stream.makeSubStream(startPos, length, dict);
+    let cacheKey;
 
-            break;
+    if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {
+      const imageBytes = imageStream.getBytes();
+      imageStream.reset();
+      const initialStreamPos = stream.pos;
+      stream.pos = lexer.beginInlineImagePos;
+      const dictBytes = stream.getBytes(dictLength);
+      stream.pos = initialStreamPos;
+      cacheKey = computeAdler32(imageBytes) + "_" + computeAdler32(dictBytes);
+      const cacheEntry = this.imageCache[cacheKey];
 
-          case 0xffc0:
-          case 0xffc1:
-          case 0xffc2:
-            if (frame) {
-              throw new JpegError("Only single frame JPEGs supported");
-            }
+      if (cacheEntry !== undefined) {
+        this.buf2 = _primitives.Cmd.get("EI");
+        this.shift();
+        cacheEntry.reset();
+        return cacheEntry;
+      }
+    }
 
-            offset += 2;
-            frame = {};
-            frame.extended = fileMarker === 0xffc1;
-            frame.progressive = fileMarker === 0xffc2;
-            frame.precision = data[offset++];
-            const sofScanLines = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
-            frame.scanLines = dnlScanLines || sofScanLines;
-            frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
-            frame.components = [];
-            frame.componentIds = {};
-            var componentsCount = data[offset++],
-                componentId;
-            var maxH = 0,
-                maxV = 0;
-
-            for (i = 0; i < componentsCount; i++) {
-              componentId = data[offset];
-              var h = data[offset + 1] >> 4;
-              var v = data[offset + 1] & 15;
-
-              if (maxH < h) {
-                maxH = h;
-              }
+    if (cipherTransform) {
+      imageStream = cipherTransform.createStream(imageStream, length);
+    }
 
-              if (maxV < v) {
-                maxV = v;
-              }
+    imageStream = this.filter(imageStream, dict, length);
+    imageStream.dict = dict;
 
-              var qId = data[offset + 2];
-              l = frame.components.push({
-                h,
-                v,
-                quantizationId: qId,
-                quantizationTable: null
-              });
-              frame.componentIds[componentId] = l - 1;
-              offset += 3;
-            }
+    if (cacheKey !== undefined) {
+      imageStream.cacheKey = `inline_${length}_${cacheKey}`;
+      this.imageCache[cacheKey] = imageStream;
+    }
 
-            frame.maxH = maxH;
-            frame.maxV = maxV;
-            prepareComponents(frame);
-            break;
+    this.buf2 = _primitives.Cmd.get("EI");
+    this.shift();
+    return imageStream;
+  }
 
-          case 0xffc4:
-            const huffmanLength = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
+  _findStreamLength(startPos, signature) {
+    const {
+      stream
+    } = this.lexer;
+    stream.pos = startPos;
+    const SCAN_BLOCK_LENGTH = 2048;
+    const signatureLength = signature.length;
 
-            for (i = 2; i < huffmanLength;) {
-              var huffmanTableSpec = data[offset++];
-              var codeLengths = new Uint8Array(16);
-              var codeLengthSum = 0;
+    while (stream.pos < stream.end) {
+      const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+      const scanLength = scanBytes.length - signatureLength;
 
-              for (j = 0; j < 16; j++, offset++) {
-                codeLengthSum += codeLengths[j] = data[offset];
-              }
+      if (scanLength <= 0) {
+        break;
+      }
 
-              var huffmanValues = new Uint8Array(codeLengthSum);
+      let pos = 0;
 
-              for (j = 0; j < codeLengthSum; j++, offset++) {
-                huffmanValues[j] = data[offset];
-              }
+      while (pos < scanLength) {
+        let j = 0;
 
-              i += 17 + codeLengthSum;
-              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = 
buildHuffmanTable(codeLengths, huffmanValues);
-            }
+        while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
+          j++;
+        }
 
-            break;
+        if (j >= signatureLength) {
+          stream.pos += pos;
+          return stream.pos - startPos;
+        }
 
-          case 0xffdd:
-            offset += 2;
-            resetInterval = (0, _core_utils.readUint16)(data, offset);
-            offset += 2;
-            break;
+        pos++;
+      }
 
-          case 0xffda:
-            const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
-            offset += 2;
-            var selectorsCount = data[offset++];
-            var components = [],
-                component;
-
-            for (i = 0; i < selectorsCount; i++) {
-              const index = data[offset++];
-              var componentIndex = frame.componentIds[index];
-              component = frame.components[componentIndex];
-              component.index = index;
-              var tableSpec = data[offset++];
-              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
-              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
-              components.push(component);
-            }
+      stream.pos += scanLength;
+    }
 
-            var spectralStart = data[offset++];
-            var spectralEnd = data[offset++];
-            var successiveApproximation = data[offset++];
+    return -1;
+  }
 
-            try {
-              var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, 
spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
-              offset += processed;
-            } catch (ex) {
-              if (ex instanceof DNLMarkerError) {
-                (0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);
-                return this.parse(data, {
-                  dnlScanLines: ex.scanLines
-                });
-              } else if (ex instanceof EOIMarkerError) {
-                (0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);
-                break markerLoop;
-              }
+  makeStream(dict, cipherTransform) {
+    const lexer = this.lexer;
+    let stream = lexer.stream;
+    lexer.skipToNextLine();
+    const startPos = stream.pos - 1;
+    let length = dict.get("Length");
 
-              throw ex;
-            }
+    if (!Number.isInteger(length)) {
+      (0, _util.info)(`Bad length "${length}" in stream`);
+      length = 0;
+    }
 
-            break;
+    stream.pos = startPos + length;
+    lexer.nextChar();
 
-          case 0xffdc:
-            offset += 4;
-            break;
+    if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, "endstream")) {
+      this.shift();
+    } else {
+      const ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]);
 
-          case 0xffff:
-            if (data[offset] !== 0xff) {
-              offset--;
-            }
+      let actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE);
 
-            break;
+      if (actualLength < 0) {
+        const MAX_TRUNCATION = 1;
 
-          default:
-            const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
+        for (let i = 1; i <= MAX_TRUNCATION; i++) {
+          const end = ENDSTREAM_SIGNATURE.length - i;
+          const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);
 
-            if (nextFileMarker && nextFileMarker.invalid) {
-              (0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + 
nextFileMarker.invalid);
-              offset = nextFileMarker.offset;
-              break;
-            }
+          const maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE);
 
-            if (offset >= data.length - 1) {
-              (0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an 
EOI marker (0xFFD9).");
-              break markerLoop;
+          if (maybeLength >= 0) {
+            const lastByte = stream.peekBytes(end + 1)[end];
+
+            if (!(0, _core_utils.isWhiteSpace)(lastByte)) {
+              break;
             }
 
-            throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
+            (0, _util.info)(`Found "${(0, _util.bytesToString)(TRUNCATED_SIGNATURE)}" when ` + "searching 
for endstream command.");
+            actualLength = maybeLength;
+            break;
+          }
         }
 
-        fileMarker = (0, _core_utils.readUint16)(data, offset);
-        offset += 2;
+        if (actualLength < 0) {
+          throw new _util.FormatError("Missing endstream command.");
+        }
       }
 
-      this.width = frame.samplesPerLine;
-      this.height = frame.scanLines;
-      this.jfif = jfif;
-      this.adobe = adobe;
-      this.components = [];
+      length = actualLength;
+      lexer.nextChar();
+      this.shift();
+      this.shift();
+    }
+
+    this.shift();
+    stream = stream.makeSubStream(startPos, length, dict);
 
-      for (i = 0; i < frame.components.length; i++) {
-        component = frame.components[i];
-        var quantizationTable = quantizationTables[component.quantizationId];
+    if (cipherTransform) {
+      stream = cipherTransform.createStream(stream, length);
+    }
 
-        if (quantizationTable) {
-          component.quantizationTable = quantizationTable;
-        }
+    stream = this.filter(stream, dict, length);
+    stream.dict = dict;
+    return stream;
+  }
 
-        this.components.push({
-          index: component.index,
-          output: buildComponentData(frame, component),
-          scaleX: component.h / frame.maxH,
-          scaleY: component.v / frame.maxV,
-          blocksPerLine: component.blocksPerLine,
-          blocksPerColumn: component.blocksPerColumn
-        });
+  filter(stream, dict, length) {
+    let filter = dict.get("Filter", "F");
+    let params = dict.get("DecodeParms", "DP");
+
+    if ((0, _primitives.isName)(filter)) {
+      if (Array.isArray(params)) {
+        (0, _util.warn)("/DecodeParms should not contain an Array, " + "when /Filter contains a Name.");
       }
 
-      this.numComponents = this.components.length;
-      return undefined;
-    },
+      return this.makeFilter(stream, filter.name, length, params);
+    }
 
-    _getLinearizedBlockData(width, height, isSourcePDF = false) {
-      var scaleX = this.width / width,
-          scaleY = this.height / height;
-      var component, componentScaleX, componentScaleY, blocksPerScanline;
-      var x, y, i, j, k;
-      var index;
-      var offset = 0;
-      var output;
-      var numComponents = this.components.length;
-      var dataLength = width * height * numComponents;
-      var data = new Uint8ClampedArray(dataLength);
-      var xScaleBlockOffset = new Uint32Array(width);
-      var mask3LSB = 0xfffffff8;
-      let lastComponentScaleX;
+    let maybeLength = length;
 
-      for (i = 0; i < numComponents; i++) {
-        component = this.components[i];
-        componentScaleX = component.scaleX * scaleX;
-        componentScaleY = component.scaleY * scaleY;
-        offset = i;
-        output = component.output;
-        blocksPerScanline = component.blocksPerLine + 1 << 3;
+    if (Array.isArray(filter)) {
+      const filterArray = filter;
+      const paramsArray = params;
 
-        if (componentScaleX !== lastComponentScaleX) {
-          for (x = 0; x < width; x++) {
-            j = 0 | x * componentScaleX;
-            xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
-          }
+      for (let i = 0, ii = filterArray.length; i < ii; ++i) {
+        filter = this.xref.fetchIfRef(filterArray[i]);
 
-          lastComponentScaleX = componentScaleX;
+        if (!(0, _primitives.isName)(filter)) {
+          throw new _util.FormatError(`Bad filter name "${filter}"`);
         }
 
-        for (y = 0; y < height; y++) {
-          j = 0 | y * componentScaleY;
-          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
+        params = null;
 
-          for (x = 0; x < width; x++) {
-            data[offset] = output[index + xScaleBlockOffset[x]];
-            offset += numComponents;
-          }
+        if (Array.isArray(paramsArray) && i in paramsArray) {
+          params = this.xref.fetchIfRef(paramsArray[i]);
         }
-      }
 
-      let transform = this._decodeTransform;
-
-      if (!isSourcePDF && numComponents === 4 && !transform) {
-        transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
+        stream = this.makeFilter(stream, filter.name, maybeLength, params);
+        maybeLength = null;
       }
+    }
 
-      if (transform) {
-        for (i = 0; i < dataLength;) {
-          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
-            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
-          }
-        }
-      }
+    return stream;
+  }
 
-      return data;
-    },
+  makeFilter(stream, name, maybeLength, params) {
+    if (maybeLength === 0) {
+      (0, _util.warn)(`Empty "${name}" stream.`);
+      return new _stream.NullStream();
+    }
 
-    get _isColorConversionNeeded() {
-      if (this.adobe) {
-        return !!this.adobe.transformCode;
-      }
+    try {
+      const xrefStreamStats = this.xref.stats.streamTypes;
 
-      if (this.numComponents === 3) {
-        if (this._colorTransform === 0) {
-          return false;
-        } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && 
this.components[2].index === 0x42) {
-          return false;
+      if (name === "FlateDecode" || name === "Fl") {
+        xrefStreamStats[_util.StreamType.FLATE] = true;
+
+        if (params) {
+          return new _predictor_stream.PredictorStream(new _flate_stream.FlateStream(stream, maybeLength), 
maybeLength, params);
         }
 
-        return true;
+        return new _flate_stream.FlateStream(stream, maybeLength);
       }
 
-      if (this._colorTransform === 1) {
-        return true;
-      }
+      if (name === "LZWDecode" || name === "LZW") {
+        xrefStreamStats[_util.StreamType.LZW] = true;
+        let earlyChange = 1;
 
-      return false;
-    },
+        if (params) {
+          if (params.has("EarlyChange")) {
+            earlyChange = params.get("EarlyChange");
+          }
 
-    _convertYccToRgb: function convertYccToRgb(data) {
-      var Y, Cb, Cr;
+          return new _predictor_stream.PredictorStream(new _lzw_stream.LZWStream(stream, maybeLength, 
earlyChange), maybeLength, params);
+        }
 
-      for (var i = 0, length = data.length; i < length; i += 3) {
-        Y = data[i];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        data[i] = Y - 179.456 + 1.402 * Cr;
-        data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
-        data[i + 2] = Y - 226.816 + 1.772 * Cb;
+        return new _lzw_stream.LZWStream(stream, maybeLength, earlyChange);
       }
 
-      return data;
-    },
-    _convertYcckToRgb: function convertYcckToRgb(data) {
-      var Y, Cb, Cr, k;
-      var offset = 0;
-
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        Y = data[i];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        k = data[i + 3];
-        data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 
5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 
0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 
0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
-        data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 
0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 
0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 
0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
-        data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 
0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 
0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 
0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
+      if (name === "DCTDecode" || name === "DCT") {
+        xrefStreamStats[_util.StreamType.DCT] = true;
+        return new _jpeg_stream.JpegStream(stream, maybeLength, params);
       }
 
-      return data.subarray(0, offset);
-    },
-    _convertYcckToCmyk: function convertYcckToCmyk(data) {
-      var Y, Cb, Cr;
-
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        Y = data[i];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        data[i] = 434.456 - Y - 1.402 * Cr;
-        data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
-        data[i + 2] = 481.816 - Y - 1.772 * Cb;
+      if (name === "JPXDecode" || name === "JPX") {
+        xrefStreamStats[_util.StreamType.JPX] = true;
+        return new _jpx_stream.JpxStream(stream, maybeLength, params);
       }
 
-      return data;
-    },
-    _convertCmykToRgb: function convertCmykToRgb(data) {
-      var c, m, y, k;
-      var offset = 0;
-
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        c = data[i];
-        m = data[i + 1];
-        y = data[i + 2];
-        k = data[i + 3];
-        data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 
0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m 
- 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * 
(-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * 
k + 0.7430659151342254);
-        data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 
0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * 
m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 
* y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.00031891311758832814 * k + 
0.7364883807733168);
-        data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 
0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 
* m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * 
(5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k 
+ 0.7063770186160144);
+      if (name === "ASCII85Decode" || name === "A85") {
+        xrefStreamStats[_util.StreamType.A85] = true;
+        return new _ascii_85_stream.Ascii85Stream(stream, maybeLength);
       }
 
-      return data.subarray(0, offset);
-    },
-
-    getData({
-      width,
-      height,
-      forceRGB = false,
-      isSourcePDF = false
-    }) {
-      if (this.numComponents > 4) {
-        throw new JpegError("Unsupported color mode");
+      if (name === "ASCIIHexDecode" || name === "AHx") {
+        xrefStreamStats[_util.StreamType.AHX] = true;
+        return new _ascii_hex_stream.AsciiHexStream(stream, maybeLength);
       }
 
-      var data = this._getLinearizedBlockData(width, height, isSourcePDF);
-
-      if (this.numComponents === 1 && forceRGB) {
-        var dataLength = data.length;
-        var rgbData = new Uint8ClampedArray(dataLength * 3);
-        var offset = 0;
+      if (name === "CCITTFaxDecode" || name === "CCF") {
+        xrefStreamStats[_util.StreamType.CCF] = true;
+        return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params);
+      }
 
-        for (var i = 0; i < dataLength; i++) {
-          var grayColor = data[i];
-          rgbData[offset++] = grayColor;
-          rgbData[offset++] = grayColor;
-          rgbData[offset++] = grayColor;
-        }
+      if (name === "RunLengthDecode" || name === "RL") {
+        xrefStreamStats[_util.StreamType.RLX] = true;
+        return new _run_length_stream.RunLengthStream(stream, maybeLength);
+      }
 
-        return rgbData;
-      } else if (this.numComponents === 3 && this._isColorConversionNeeded) {
-        return this._convertYccToRgb(data);
-      } else if (this.numComponents === 4) {
-        if (this._isColorConversionNeeded) {
-          if (forceRGB) {
-            return this._convertYcckToRgb(data);
-          }
+      if (name === "JBIG2Decode") {
+        xrefStreamStats[_util.StreamType.JBIG] = true;
+        return new _jbig2_stream.Jbig2Stream(stream, maybeLength, params);
+      }
 
-          return this._convertYcckToCmyk(data);
-        } else if (forceRGB) {
-          return this._convertCmykToRgb(data);
-        }
+      (0, _util.warn)(`Filter "${name}" is not supported.`);
+      return stream;
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
       }
 
-      return data;
+      (0, _util.warn)(`Invalid stream: "${ex}"`);
+      return new _stream.NullStream();
     }
+  }
 
-  };
-  return JpegImage;
-}();
-
-exports.JpegImage = JpegImage;
-
-/***/ }),
-/* 20 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
+}
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.JpxStream = void 0;
+exports.Parser = Parser;
+const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
 
-var _stream = __w_pdfjs_require__(12);
+function toHexDigit(ch) {
+  if (ch >= 0x30 && ch <= 0x39) {
+    return ch & 0x0f;
+  }
 
-var _jpx = __w_pdfjs_require__(21);
+  if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+    return (ch & 0x0f) + 9;
+  }
 
-var _util = __w_pdfjs_require__(2);
+  return -1;
+}
 
-const JpxStream = function JpxStreamClosure() {
-  function JpxStream(stream, maybeLength, dict, params) {
+class Lexer {
+  constructor(stream, knownCommands = null) {
     this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-    this.params = params;
-
-    _stream.DecodeStream.call(this, maybeLength);
+    this.nextChar();
+    this.strBuf = [];
+    this.knownCommands = knownCommands;
+    this._hexStringNumWarn = 0;
+    this.beginInlineImagePos = -1;
   }
 
-  JpxStream.prototype = Object.create(_stream.DecodeStream.prototype);
-  Object.defineProperty(JpxStream.prototype, "bytes", {
-    get: function JpxStream_bytes() {
-      return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
-    },
-    configurable: true
-  });
-
-  JpxStream.prototype.ensureBuffer = function (requested) {};
-
-  JpxStream.prototype.readBlock = function () {
-    if (this.eof) {
-      return;
-    }
+  nextChar() {
+    return this.currentChar = this.stream.getByte();
+  }
 
-    const jpxImage = new _jpx.JpxImage();
-    jpxImage.parse(this.bytes);
-    const width = jpxImage.width;
-    const height = jpxImage.height;
-    const componentsCount = jpxImage.componentsCount;
-    const tileCount = jpxImage.tiles.length;
+  peekChar() {
+    return this.stream.peekByte();
+  }
 
-    if (tileCount === 1) {
-      this.buffer = jpxImage.tiles[0].items;
-    } else {
-      const data = new Uint8ClampedArray(width * height * componentsCount);
+  getNumber() {
+    let ch = this.currentChar;
+    let eNotation = false;
+    let divideBy = 0;
+    let sign = 0;
 
-      for (let k = 0; k < tileCount; k++) {
-        const tileComponents = jpxImage.tiles[k];
-        const tileWidth = tileComponents.width;
-        const tileHeight = tileComponents.height;
-        const tileLeft = tileComponents.left;
-        const tileTop = tileComponents.top;
-        const src = tileComponents.items;
-        let srcPosition = 0;
-        let dataPosition = (width * tileTop + tileLeft) * componentsCount;
-        const imgRowSize = width * componentsCount;
-        const tileRowSize = tileWidth * componentsCount;
+    if (ch === 0x2d) {
+      sign = -1;
+      ch = this.nextChar();
 
-        for (let j = 0; j < tileHeight; j++) {
-          const rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
-          data.set(rowBytes, dataPosition);
-          srcPosition += tileRowSize;
-          dataPosition += imgRowSize;
-        }
+      if (ch === 0x2d) {
+        ch = this.nextChar();
       }
-
-      this.buffer = data;
+    } else if (ch === 0x2b) {
+      sign = 1;
+      ch = this.nextChar();
     }
 
-    this.bufferLength = this.buffer.length;
-    this.eof = true;
-  };
-
-  return JpxStream;
-}();
+    if (ch === 0x0a || ch === 0x0d) {
+      do {
+        ch = this.nextChar();
+      } while (ch === 0x0a || ch === 0x0d);
+    }
 
-exports.JpxStream = JpxStream;
+    if (ch === 0x2e) {
+      divideBy = 10;
+      ch = this.nextChar();
+    }
 
-/***/ }),
-/* 21 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    if (ch < 0x30 || ch > 0x39) {
+      if (divideBy === 10 && sign === 0 && ((0, _core_utils.isWhiteSpace)(ch) || ch === -1)) {
+        (0, _util.warn)("Lexer.getNumber - treating a single decimal point as zero.");
+        return 0;
+      }
 
-"use strict";
+      throw new _util.FormatError(`Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`);
+    }
 
+    sign = sign || 1;
+    let baseValue = ch - 0x30;
+    let powerValue = 0;
+    let powerValueSign = 1;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.JpxImage = void 0;
+    while ((ch = this.nextChar()) >= 0) {
+      if (ch >= 0x30 && ch <= 0x39) {
+        const currentDigit = ch - 0x30;
 
-var _util = __w_pdfjs_require__(2);
+        if (eNotation) {
+          powerValue = powerValue * 10 + currentDigit;
+        } else {
+          if (divideBy !== 0) {
+            divideBy *= 10;
+          }
 
-var _core_utils = __w_pdfjs_require__(8);
+          baseValue = baseValue * 10 + currentDigit;
+        }
+      } else if (ch === 0x2e) {
+        if (divideBy === 0) {
+          divideBy = 1;
+        } else {
+          break;
+        }
+      } else if (ch === 0x2d) {
+        (0, _util.warn)("Badly formatted number: minus sign in the middle");
+      } else if (ch === 0x45 || ch === 0x65) {
+        ch = this.peekChar();
 
-var _arithmetic_decoder = __w_pdfjs_require__(17);
+        if (ch === 0x2b || ch === 0x2d) {
+          powerValueSign = ch === 0x2d ? -1 : 1;
+          this.nextChar();
+        } else if (ch < 0x30 || ch > 0x39) {
+          break;
+        }
 
-class JpxError extends _util.BaseException {
-  constructor(msg) {
-    super(`JPX error: ${msg}`);
-  }
+        eNotation = true;
+      } else {
+        break;
+      }
+    }
 
-}
+    if (divideBy !== 0) {
+      baseValue /= divideBy;
+    }
 
-var JpxImage = function JpxImageClosure() {
-  var SubbandsGainLog2 = {
-    LL: 0,
-    LH: 1,
-    HL: 1,
-    HH: 2
-  };
+    if (eNotation) {
+      baseValue *= 10 ** (powerValueSign * powerValue);
+    }
 
-  function JpxImage() {
-    this.failOnCorruptedImage = false;
+    return sign * baseValue;
   }
 
-  JpxImage.prototype = {
-    parse: function JpxImage_parse(data) {
-      var head = (0, _core_utils.readUint16)(data, 0);
+  getString() {
+    let numParen = 1;
+    let done = false;
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    let ch = this.nextChar();
 
-      if (head === 0xff4f) {
-        this.parseCodestream(data, 0, data.length);
-        return;
-      }
+    while (true) {
+      let charBuffered = false;
 
-      var position = 0,
-          length = data.length;
+      switch (ch | 0) {
+        case -1:
+          (0, _util.warn)("Unterminated string");
+          done = true;
+          break;
 
-      while (position < length) {
-        var headerSize = 8;
-        var lbox = (0, _core_utils.readUint32)(data, position);
-        var tbox = (0, _core_utils.readUint32)(data, position + 4);
-        position += headerSize;
+        case 0x28:
+          ++numParen;
+          strBuf.push("(");
+          break;
 
-        if (lbox === 1) {
-          lbox = (0, _core_utils.readUint32)(data, position) * 4294967296 + (0, 
_core_utils.readUint32)(data, position + 4);
-          position += 8;
-          headerSize += 8;
-        }
+        case 0x29:
+          if (--numParen === 0) {
+            this.nextChar();
+            done = true;
+          } else {
+            strBuf.push(")");
+          }
 
-        if (lbox === 0) {
-          lbox = length - position + headerSize;
-        }
+          break;
 
-        if (lbox < headerSize) {
-          throw new JpxError("Invalid box field size");
-        }
+        case 0x5c:
+          ch = this.nextChar();
 
-        var dataLength = lbox - headerSize;
-        var jumpDataLength = true;
+          switch (ch) {
+            case -1:
+              (0, _util.warn)("Unterminated string");
+              done = true;
+              break;
 
-        switch (tbox) {
-          case 0x6a703268:
-            jumpDataLength = false;
-            break;
+            case 0x6e:
+              strBuf.push("\n");
+              break;
 
-          case 0x636f6c72:
-            var method = data[position];
+            case 0x72:
+              strBuf.push("\r");
+              break;
 
-            if (method === 1) {
-              var colorspace = (0, _core_utils.readUint32)(data, position + 3);
+            case 0x74:
+              strBuf.push("\t");
+              break;
 
-              switch (colorspace) {
-                case 16:
-                case 17:
-                case 18:
-                  break;
+            case 0x62:
+              strBuf.push("\b");
+              break;
 
-                default:
-                  (0, _util.warn)("Unknown colorspace " + colorspace);
-                  break;
-              }
-            } else if (method === 2) {
-              (0, _util.info)("ICC profile not supported");
-            }
+            case 0x66:
+              strBuf.push("\f");
+              break;
 
-            break;
+            case 0x5c:
+            case 0x28:
+            case 0x29:
+              strBuf.push(String.fromCharCode(ch));
+              break;
 
-          case 0x6a703263:
-            this.parseCodestream(data, position, position + dataLength);
-            break;
-
-          case 0x6a502020:
-            if ((0, _core_utils.readUint32)(data, position) !== 0x0d0a870a) {
-              (0, _util.warn)("Invalid JP2 signature");
-            }
-
-            break;
-
-          case 0x6a501a1a:
-          case 0x66747970:
-          case 0x72726571:
-          case 0x72657320:
-          case 0x69686472:
-            break;
+            case 0x30:
+            case 0x31:
+            case 0x32:
+            case 0x33:
+            case 0x34:
+            case 0x35:
+            case 0x36:
+            case 0x37:
+              let x = ch & 0x0f;
+              ch = this.nextChar();
+              charBuffered = true;
 
-          default:
-            var headerType = String.fromCharCode(tbox >> 24 & 0xff, tbox >> 16 & 0xff, tbox >> 8 & 0xff, 
tbox & 0xff);
-            (0, _util.warn)("Unsupported header type " + tbox + " (" + headerType + ")");
-            break;
-        }
+              if (ch >= 0x30 && ch <= 0x37) {
+                x = (x << 3) + (ch & 0x0f);
+                ch = this.nextChar();
 
-        if (jumpDataLength) {
-          position += dataLength;
-        }
-      }
-    },
-    parseImageProperties: function JpxImage_parseImageProperties(stream) {
-      var newByte = stream.getByte();
-
-      while (newByte >= 0) {
-        var oldByte = newByte;
-        newByte = stream.getByte();
-        var code = oldByte << 8 | newByte;
-
-        if (code === 0xff51) {
-          stream.skip(4);
-          var Xsiz = stream.getInt32() >>> 0;
-          var Ysiz = stream.getInt32() >>> 0;
-          var XOsiz = stream.getInt32() >>> 0;
-          var YOsiz = stream.getInt32() >>> 0;
-          stream.skip(16);
-          var Csiz = stream.getUint16();
-          this.width = Xsiz - XOsiz;
-          this.height = Ysiz - YOsiz;
-          this.componentsCount = Csiz;
-          this.bitsPerComponent = 8;
-          return;
-        }
-      }
+                if (ch >= 0x30 && ch <= 0x37) {
+                  charBuffered = false;
+                  x = (x << 3) + (ch & 0x0f);
+                }
+              }
 
-      throw new JpxError("No size marker found in JPX stream");
-    },
-    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
-      var context = {};
-      var doNotRecover = false;
+              strBuf.push(String.fromCharCode(x));
+              break;
 
-      try {
-        var position = start;
+            case 0x0d:
+              if (this.peekChar() === 0x0a) {
+                this.nextChar();
+              }
 
-        while (position + 1 < end) {
-          var code = (0, _core_utils.readUint16)(data, position);
-          position += 2;
-          var length = 0,
-              j,
-              sqcd,
-              spqcds,
-              spqcdSize,
-              scalarExpounded,
-              tile;
-
-          switch (code) {
-            case 0xff4f:
-              context.mainHeader = true;
               break;
 
-            case 0xffd9:
+            case 0x0a:
               break;
 
-            case 0xff51:
-              length = (0, _core_utils.readUint16)(data, position);
-              var siz = {};
-              siz.Xsiz = (0, _core_utils.readUint32)(data, position + 4);
-              siz.Ysiz = (0, _core_utils.readUint32)(data, position + 8);
-              siz.XOsiz = (0, _core_utils.readUint32)(data, position + 12);
-              siz.YOsiz = (0, _core_utils.readUint32)(data, position + 16);
-              siz.XTsiz = (0, _core_utils.readUint32)(data, position + 20);
-              siz.YTsiz = (0, _core_utils.readUint32)(data, position + 24);
-              siz.XTOsiz = (0, _core_utils.readUint32)(data, position + 28);
-              siz.YTOsiz = (0, _core_utils.readUint32)(data, position + 32);
-              var componentsCount = (0, _core_utils.readUint16)(data, position + 36);
-              siz.Csiz = componentsCount;
-              var components = [];
-              j = position + 38;
-
-              for (var i = 0; i < componentsCount; i++) {
-                var component = {
-                  precision: (data[j] & 0x7f) + 1,
-                  isSigned: !!(data[j] & 0x80),
-                  XRsiz: data[j + 1],
-                  YRsiz: data[j + 2]
-                };
-                j += 3;
-                calculateComponentDimensions(component, siz);
-                components.push(component);
-              }
-
-              context.SIZ = siz;
-              context.components = components;
-              calculateTileGrids(context, components);
-              context.QCC = [];
-              context.COC = [];
+            default:
+              strBuf.push(String.fromCharCode(ch));
               break;
+          }
 
-            case 0xff5c:
-              length = (0, _core_utils.readUint16)(data, position);
-              var qcd = {};
-              j = position + 2;
-              sqcd = data[j++];
+          break;
 
-              switch (sqcd & 0x1f) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
+        default:
+          strBuf.push(String.fromCharCode(ch));
+          break;
+      }
 
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
+      if (done) {
+        break;
+      }
 
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
+      if (!charBuffered) {
+        ch = this.nextChar();
+      }
+    }
 
-                default:
-                  throw new Error("Invalid SQcd value " + sqcd);
-              }
+    return strBuf.join("");
+  }
 
-              qcd.noQuantization = spqcdSize === 8;
-              qcd.scalarExpounded = scalarExpounded;
-              qcd.guardBits = sqcd >> 5;
-              spqcds = [];
+  getName() {
+    let ch, previousCh;
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
 
-              while (j < length + position) {
-                var spqcd = {};
+    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+      if (ch === 0x23) {
+        ch = this.nextChar();
 
-                if (spqcdSize === 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
-                  j += 2;
-                }
+        if (specialChars[ch]) {
+          (0, _util.warn)("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number.");
+          strBuf.push("#");
+          break;
+        }
 
-                spqcds.push(spqcd);
-              }
+        const x = toHexDigit(ch);
 
-              qcd.SPqcds = spqcds;
+        if (x !== -1) {
+          previousCh = ch;
+          ch = this.nextChar();
+          const x2 = toHexDigit(ch);
 
-              if (context.mainHeader) {
-                context.QCD = qcd;
-              } else {
-                context.currentTile.QCD = qcd;
-                context.currentTile.QCC = [];
-              }
+          if (x2 === -1) {
+            (0, _util.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal 
number.");
+            strBuf.push("#", String.fromCharCode(previousCh));
 
+            if (specialChars[ch]) {
               break;
+            }
 
-            case 0xff5d:
-              length = (0, _core_utils.readUint16)(data, position);
-              var qcc = {};
-              j = position + 2;
-              var cqcc;
+            strBuf.push(String.fromCharCode(ch));
+            continue;
+          }
 
-              if (context.SIZ.Csiz < 257) {
-                cqcc = data[j++];
-              } else {
-                cqcc = (0, _core_utils.readUint16)(data, j);
-                j += 2;
-              }
+          strBuf.push(String.fromCharCode(x << 4 | x2));
+        } else {
+          strBuf.push("#", String.fromCharCode(ch));
+        }
+      } else {
+        strBuf.push(String.fromCharCode(ch));
+      }
+    }
 
-              sqcd = data[j++];
+    if (strBuf.length > 127) {
+      (0, _util.warn)(`Name token is longer than allowed by the spec: ${strBuf.length}`);
+    } else if (strBuf.length === 0) {
+      (0, _util.warn)("Name token is empty.");
+    }
 
-              switch (sqcd & 0x1f) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
+    return _primitives.Name.get(strBuf.join(""));
+  }
 
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
+  _hexStringWarn(ch) {
+    const MAX_HEX_STRING_NUM_WARN = 5;
 
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
+    if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {
+      (0, _util.warn)("getHexString - ignoring additional invalid characters.");
+      return;
+    }
 
-                default:
-                  throw new Error("Invalid SQcd value " + sqcd);
-              }
+    if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {
+      return;
+    }
 
-              qcc.noQuantization = spqcdSize === 8;
-              qcc.scalarExpounded = scalarExpounded;
-              qcc.guardBits = sqcd >> 5;
-              spqcds = [];
+    (0, _util.warn)(`getHexString - ignoring invalid character: ${ch}`);
+  }
 
-              while (j < length + position) {
-                spqcd = {};
+  getHexString() {
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    let ch = this.currentChar;
+    let isFirstHex = true;
+    let firstDigit, secondDigit;
+    this._hexStringNumWarn = 0;
 
-                if (spqcdSize === 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
-                  j += 2;
-                }
+    while (true) {
+      if (ch < 0) {
+        (0, _util.warn)("Unterminated hex string");
+        break;
+      } else if (ch === 0x3e) {
+        this.nextChar();
+        break;
+      } else if (specialChars[ch] === 1) {
+        ch = this.nextChar();
+        continue;
+      } else {
+        if (isFirstHex) {
+          firstDigit = toHexDigit(ch);
 
-                spqcds.push(spqcd);
-              }
+          if (firstDigit === -1) {
+            this._hexStringWarn(ch);
 
-              qcc.SPqcds = spqcds;
+            ch = this.nextChar();
+            continue;
+          }
+        } else {
+          secondDigit = toHexDigit(ch);
 
-              if (context.mainHeader) {
-                context.QCC[cqcc] = qcc;
-              } else {
-                context.currentTile.QCC[cqcc] = qcc;
-              }
+          if (secondDigit === -1) {
+            this._hexStringWarn(ch);
 
-              break;
+            ch = this.nextChar();
+            continue;
+          }
 
-            case 0xff52:
-              length = (0, _core_utils.readUint16)(data, position);
-              var cod = {};
-              j = position + 2;
-              var scod = data[j++];
-              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
-              cod.sopMarkerUsed = !!(scod & 2);
-              cod.ephMarkerUsed = !!(scod & 4);
-              cod.progressionOrder = data[j++];
-              cod.layersCount = (0, _core_utils.readUint16)(data, j);
-              j += 2;
-              cod.multipleComponentTransform = data[j++];
-              cod.decompositionLevelsCount = data[j++];
-              cod.xcb = (data[j++] & 0xf) + 2;
-              cod.ycb = (data[j++] & 0xf) + 2;
-              var blockStyle = data[j++];
-              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
-              cod.resetContextProbabilities = !!(blockStyle & 2);
-              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
-              cod.verticallyStripe = !!(blockStyle & 8);
-              cod.predictableTermination = !!(blockStyle & 16);
-              cod.segmentationSymbolUsed = !!(blockStyle & 32);
-              cod.reversibleTransformation = data[j++];
-
-              if (cod.entropyCoderWithCustomPrecincts) {
-                var precinctsSizes = [];
-
-                while (j < length + position) {
-                  var precinctsSize = data[j++];
-                  precinctsSizes.push({
-                    PPx: precinctsSize & 0xf,
-                    PPy: precinctsSize >> 4
-                  });
-                }
+          strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));
+        }
 
-                cod.precinctsSizes = precinctsSizes;
-              }
+        isFirstHex = !isFirstHex;
+        ch = this.nextChar();
+      }
+    }
 
-              var unsupported = [];
+    return strBuf.join("");
+  }
 
-              if (cod.selectiveArithmeticCodingBypass) {
-                unsupported.push("selectiveArithmeticCodingBypass");
-              }
+  getObj() {
+    let comment = false;
+    let ch = this.currentChar;
 
-              if (cod.resetContextProbabilities) {
-                unsupported.push("resetContextProbabilities");
-              }
+    while (true) {
+      if (ch < 0) {
+        return _primitives.EOF;
+      }
 
-              if (cod.terminationOnEachCodingPass) {
-                unsupported.push("terminationOnEachCodingPass");
-              }
+      if (comment) {
+        if (ch === 0x0a || ch === 0x0d) {
+          comment = false;
+        }
+      } else if (ch === 0x25) {
+        comment = true;
+      } else if (specialChars[ch] !== 1) {
+        break;
+      }
 
-              if (cod.verticallyStripe) {
-                unsupported.push("verticallyStripe");
-              }
+      ch = this.nextChar();
+    }
 
-              if (cod.predictableTermination) {
-                unsupported.push("predictableTermination");
-              }
+    switch (ch | 0) {
+      case 0x30:
+      case 0x31:
+      case 0x32:
+      case 0x33:
+      case 0x34:
+      case 0x35:
+      case 0x36:
+      case 0x37:
+      case 0x38:
+      case 0x39:
+      case 0x2b:
+      case 0x2d:
+      case 0x2e:
+        return this.getNumber();
 
-              if (unsupported.length > 0) {
-                doNotRecover = true;
-                throw new Error("Unsupported COD options (" + unsupported.join(", ") + ")");
-              }
+      case 0x28:
+        return this.getString();
 
-              if (context.mainHeader) {
-                context.COD = cod;
-              } else {
-                context.currentTile.COD = cod;
-                context.currentTile.COC = [];
-              }
+      case 0x2f:
+        return this.getName();
 
-              break;
+      case 0x5b:
+        this.nextChar();
+        return _primitives.Cmd.get("[");
 
-            case 0xff90:
-              length = (0, _core_utils.readUint16)(data, position);
-              tile = {};
-              tile.index = (0, _core_utils.readUint16)(data, position + 2);
-              tile.length = (0, _core_utils.readUint32)(data, position + 4);
-              tile.dataEnd = tile.length + position - 2;
-              tile.partIndex = data[position + 8];
-              tile.partsCount = data[position + 9];
-              context.mainHeader = false;
-
-              if (tile.partIndex === 0) {
-                tile.COD = context.COD;
-                tile.COC = context.COC.slice(0);
-                tile.QCD = context.QCD;
-                tile.QCC = context.QCC.slice(0);
-              }
+      case 0x5d:
+        this.nextChar();
+        return _primitives.Cmd.get("]");
 
-              context.currentTile = tile;
-              break;
+      case 0x3c:
+        ch = this.nextChar();
 
-            case 0xff93:
-              tile = context.currentTile;
+        if (ch === 0x3c) {
+          this.nextChar();
+          return _primitives.Cmd.get("<<");
+        }
 
-              if (tile.partIndex === 0) {
-                initializeTile(context, tile.index);
-                buildPackets(context);
-              }
+        return this.getHexString();
 
-              length = tile.dataEnd - position;
-              parseTilePackets(context, data, position, length);
-              break;
+      case 0x3e:
+        ch = this.nextChar();
 
-            case 0xff55:
-            case 0xff57:
-            case 0xff58:
-            case 0xff64:
-              length = (0, _core_utils.readUint16)(data, position);
-              break;
+        if (ch === 0x3e) {
+          this.nextChar();
+          return _primitives.Cmd.get(">>");
+        }
 
-            case 0xff53:
-              throw new Error("Codestream code 0xFF53 (COC) is not implemented");
+        return _primitives.Cmd.get(">");
 
-            default:
-              throw new Error("Unknown codestream code: " + code.toString(16));
-          }
+      case 0x7b:
+        this.nextChar();
+        return _primitives.Cmd.get("{");
 
-          position += length;
-        }
-      } catch (e) {
-        if (doNotRecover || this.failOnCorruptedImage) {
-          throw new JpxError(e.message);
-        } else {
-          (0, _util.warn)("JPX: Trying to recover from: " + e.message);
-        }
-      }
+      case 0x7d:
+        this.nextChar();
+        return _primitives.Cmd.get("}");
 
-      this.tiles = transformComponents(context);
-      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
-      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
-      this.componentsCount = context.SIZ.Csiz;
+      case 0x29:
+        this.nextChar();
+        throw new _util.FormatError(`Illegal character: ${ch}`);
     }
-  };
 
-  function calculateComponentDimensions(component, siz) {
-    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
-    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
-    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
-    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
-    component.width = component.x1 - component.x0;
-    component.height = component.y1 - component.y0;
-  }
+    let str = String.fromCharCode(ch);
+    const knownCommands = this.knownCommands;
+    let knownCommandFound = knownCommands && knownCommands[str] !== undefined;
 
-  function calculateTileGrids(context, components) {
-    var siz = context.SIZ;
-    var tile,
-        tiles = [];
-    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
-    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+      const possibleCommand = str + String.fromCharCode(ch);
 
-    for (var q = 0; q < numYtiles; q++) {
-      for (var p = 0; p < numXtiles; p++) {
-        tile = {};
-        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
-        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
-        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
-        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
-        tile.width = tile.tx1 - tile.tx0;
-        tile.height = tile.ty1 - tile.ty0;
-        tile.components = [];
-        tiles.push(tile);
+      if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
+        break;
       }
-    }
 
-    context.tiles = tiles;
-    var componentsCount = siz.Csiz;
+      if (str.length === 128) {
+        throw new _util.FormatError(`Command token too long: ${str.length}`);
+      }
 
-    for (var i = 0, ii = componentsCount; i < ii; i++) {
-      var component = components[i];
+      str = possibleCommand;
+      knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+    }
 
-      for (var j = 0, jj = tiles.length; j < jj; j++) {
-        var tileComponent = {};
-        tile = tiles[j];
-        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
-        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
-        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
-        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
-        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
-        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
-        tile.components[i] = tileComponent;
-      }
+    if (str === "true") {
+      return true;
     }
-  }
 
-  function getBlocksDimensions(context, component, r) {
-    var codOrCoc = component.codingStyleParameters;
-    var result = {};
+    if (str === "false") {
+      return false;
+    }
 
-    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
-      result.PPx = 15;
-      result.PPy = 15;
-    } else {
-      result.PPx = codOrCoc.precinctsSizes[r].PPx;
-      result.PPy = codOrCoc.precinctsSizes[r].PPy;
+    if (str === "null") {
+      return null;
     }
 
-    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);
-    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);
-    return result;
-  }
+    if (str === "BI") {
+      this.beginInlineImagePos = this.stream.pos;
+    }
 
-  function buildPrecincts(context, resolution, dimensions) {
-    var precinctWidth = 1 << dimensions.PPx;
-    var precinctHeight = 1 << dimensions.PPy;
-    var isZeroRes = resolution.resLevel === 0;
-    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);
-    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);
-    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - 
Math.floor(resolution.trx0 / precinctWidth) : 0;
-    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - 
Math.floor(resolution.try0 / precinctHeight) : 0;
-    var numprecincts = numprecinctswide * numprecinctshigh;
-    resolution.precinctParameters = {
-      precinctWidth,
-      precinctHeight,
-      numprecinctswide,
-      numprecinctshigh,
-      numprecincts,
-      precinctWidthInSubband,
-      precinctHeightInSubband
-    };
+    return _primitives.Cmd.get(str);
   }
 
-  function buildCodeblocks(context, subband, dimensions) {
-    var xcb_ = dimensions.xcb_;
-    var ycb_ = dimensions.ycb_;
-    var codeblockWidth = 1 << xcb_;
-    var codeblockHeight = 1 << ycb_;
-    var cbx0 = subband.tbx0 >> xcb_;
-    var cby0 = subband.tby0 >> ycb_;
-    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;
-    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;
-    var precinctParameters = subband.resolution.precinctParameters;
-    var codeblocks = [];
-    var precincts = [];
-    var i, j, codeblock, precinctNumber;
-
-    for (j = cby0; j < cby1; j++) {
-      for (i = cbx0; i < cbx1; i++) {
-        codeblock = {
-          cbx: i,
-          cby: j,
-          tbx0: codeblockWidth * i,
-          tby0: codeblockHeight * j,
-          tbx1: codeblockWidth * (i + 1),
-          tby1: codeblockHeight * (j + 1)
-        };
-        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
-        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
-        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
-        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
-        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);
-        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);
-        precinctNumber = pi + pj * precinctParameters.numprecinctswide;
-        codeblock.precinctNumber = precinctNumber;
-        codeblock.subbandType = subband.type;
-        codeblock.Lblock = 3;
-
-        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {
-          continue;
-        }
-
-        codeblocks.push(codeblock);
-        var precinct = precincts[precinctNumber];
-
-        if (precinct !== undefined) {
-          if (i < precinct.cbxMin) {
-            precinct.cbxMin = i;
-          } else if (i > precinct.cbxMax) {
-            precinct.cbxMax = i;
-          }
-
-          if (j < precinct.cbyMin) {
-            precinct.cbxMin = j;
-          } else if (j > precinct.cbyMax) {
-            precinct.cbyMax = j;
-          }
-        } else {
-          precincts[precinctNumber] = precinct = {
-            cbxMin: i,
-            cbyMin: j,
-            cbxMax: i,
-            cbyMax: j
-          };
-        }
+  peekObj() {
+    const streamPos = this.stream.pos,
+          currentChar = this.currentChar,
+          beginInlineImagePos = this.beginInlineImagePos;
+    let nextObj;
 
-        codeblock.precinct = precinct;
+    try {
+      nextObj = this.getObj();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
       }
+
+      (0, _util.warn)(`peekObj: ${ex}`);
     }
 
-    subband.codeblockParameters = {
-      codeblockWidth: xcb_,
-      codeblockHeight: ycb_,
-      numcodeblockwide: cbx1 - cbx0 + 1,
-      numcodeblockhigh: cby1 - cby0 + 1
-    };
-    subband.codeblocks = codeblocks;
-    subband.precincts = precincts;
+    this.stream.pos = streamPos;
+    this.currentChar = currentChar;
+    this.beginInlineImagePos = beginInlineImagePos;
+    return nextObj;
   }
 
-  function createPacket(resolution, precinctNumber, layerNumber) {
-    var precinctCodeblocks = [];
-    var subbands = resolution.subbands;
-
-    for (var i = 0, ii = subbands.length; i < ii; i++) {
-      var subband = subbands[i];
-      var codeblocks = subband.codeblocks;
+  skipToNextLine() {
+    let ch = this.currentChar;
 
-      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
-        var codeblock = codeblocks[j];
+    while (ch >= 0) {
+      if (ch === 0x0d) {
+        ch = this.nextChar();
 
-        if (codeblock.precinctNumber !== precinctNumber) {
-          continue;
+        if (ch === 0x0a) {
+          this.nextChar();
         }
 
-        precinctCodeblocks.push(codeblock);
+        break;
+      } else if (ch === 0x0a) {
+        this.nextChar();
+        break;
       }
-    }
 
-    return {
-      layerNumber,
-      codeblocks: precinctCodeblocks
-    };
+      ch = this.nextChar();
+    }
   }
 
-  function LayerResolutionComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
+}
 
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
tile.components[q].codingStyleParameters.decompositionLevelsCount);
-    }
+exports.Lexer = Lexer;
 
-    var l = 0,
-        r = 0,
-        i = 0,
-        k = 0;
+class Linearization {
+  static create(stream) {
+    function getInt(linDict, name, allowZeroValue = false) {
+      const obj = linDict.get(name);
 
-    this.nextPacket = function JpxImage_nextPacket() {
-      for (; l < layersCount; l++) {
-        for (; r <= maxDecompositionLevelsCount; r++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
+      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
+        return obj;
+      }
 
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
+      throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid.");
+    }
 
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
+    function getHints(linDict) {
+      const hints = linDict.get("H");
+      let hintsLength;
 
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
+      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
+        for (let index = 0; index < hintsLength; index++) {
+          const hint = hints[index];
 
-            k = 0;
+          if (!(Number.isInteger(hint) && hint > 0)) {
+            throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`);
           }
-
-          i = 0;
         }
 
-        r = 0;
+        return hints;
       }
 
-      throw new JpxError("Out of packets");
-    };
-  }
+      throw new Error("Hint array in the linearization dictionary is invalid.");
+    }
 
-  function ResolutionLayerComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
+    const parser = new Parser({
+      lexer: new Lexer(stream),
+      xref: null
+    });
+    const obj1 = parser.getObj();
+    const obj2 = parser.getObj();
+    const obj3 = parser.getObj();
+    const linDict = parser.getObj();
+    let obj, length;
 
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, "obj") && (0, 
_primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get("Linearized")) && obj > 0)) {
+      return null;
+    } else if ((length = getInt(linDict, "L")) !== stream.length) {
+      throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream 
length.");
     }
 
-    var r = 0,
-        l = 0,
-        i = 0,
-        k = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      for (; r <= maxDecompositionLevelsCount; r++) {
-        for (; l < layersCount; l++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
+    return {
+      length,
+      hints: getHints(linDict),
+      objectNumberFirst: getInt(linDict, "O"),
+      endFirst: getInt(linDict, "E"),
+      numPages: getInt(linDict, "N"),
+      mainXRefEntriesOffset: getInt(linDict, "T"),
+      pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0
+    };
+  }
 
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
+}
 
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
+exports.Linearization = Linearization;
 
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
+/***/ }),
+/* 18 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-            k = 0;
-          }
 
-          i = 0;
-        }
 
-        l = 0;
-      }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Ascii85Stream = void 0;
 
-      throw new JpxError("Out of packets");
-    };
-  }
+var _decode_stream = __w_pdfjs_require__(19);
 
-  function ResolutionPositionComponentLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var l, r, c, p;
-    var maxDecompositionLevelsCount = 0;
+var _core_utils = __w_pdfjs_require__(9);
 
-    for (c = 0; c < componentsCount; c++) {
-      const component = tile.components[c];
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
component.codingStyleParameters.decompositionLevelsCount);
+class Ascii85Stream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength) {
+    if (maybeLength) {
+      maybeLength *= 0.8;
     }
 
-    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);
-
-    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
-      var maxNumPrecincts = 0;
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+    this.input = new Uint8Array(5);
+  }
 
-      for (c = 0; c < componentsCount; ++c) {
-        var resolutions = tile.components[c].resolutions;
+  readBlock() {
+    const TILDA_CHAR = 0x7e;
+    const Z_LOWER_CHAR = 0x7a;
+    const EOF = -1;
+    const str = this.str;
+    let c = str.getByte();
 
-        if (r < resolutions.length) {
-          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);
-        }
-      }
+    while ((0, _core_utils.isWhiteSpace)(c)) {
+      c = str.getByte();
+    }
 
-      maxNumPrecinctsInLevel[r] = maxNumPrecincts;
+    if (c === EOF || c === TILDA_CHAR) {
+      this.eof = true;
+      return;
     }
 
-    l = 0;
-    r = 0;
-    c = 0;
-    p = 0;
+    const bufferLength = this.bufferLength;
+    let buffer, i;
 
-    this.nextPacket = function JpxImage_nextPacket() {
-      for (; r <= maxDecompositionLevelsCount; r++) {
-        for (; p < maxNumPrecinctsInLevel[r]; p++) {
-          for (; c < componentsCount; c++) {
-            const component = tile.components[c];
+    if (c === Z_LOWER_CHAR) {
+      buffer = this.ensureBuffer(bufferLength + 4);
 
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
+      for (i = 0; i < 4; ++i) {
+        buffer[bufferLength + i] = 0;
+      }
 
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
+      this.bufferLength += 4;
+    } else {
+      const input = this.input;
+      input[0] = c;
 
-            if (p >= numprecincts) {
-              continue;
-            }
+      for (i = 1; i < 5; ++i) {
+        c = str.getByte();
 
-            for (; l < layersCount;) {
-              var packet = createPacket(resolution, p, l);
-              l++;
-              return packet;
-            }
+        while ((0, _core_utils.isWhiteSpace)(c)) {
+          c = str.getByte();
+        }
 
-            l = 0;
-          }
+        input[i] = c;
 
-          c = 0;
+        if (c === EOF || c === TILDA_CHAR) {
+          break;
         }
-
-        p = 0;
       }
 
-      throw new JpxError("Out of packets");
-    };
-  }
-
-  function PositionComponentResolutionLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var precinctsSizes = getPrecinctSizesInImageScale(tile);
-    var precinctsIterationSizes = precinctsSizes;
-    var l = 0,
-        r = 0,
-        c = 0,
-        px = 0,
-        py = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      for (; py < precinctsIterationSizes.maxNumHigh; py++) {
-        for (; px < precinctsIterationSizes.maxNumWide; px++) {
-          for (; c < componentsCount; c++) {
-            var component = tile.components[c];
-            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
-
-            for (; r <= decompositionLevelsCount; r++) {
-              var resolution = component.resolutions[r];
-              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];
-              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
-
-              if (k === null) {
-                continue;
-              }
-
-              for (; l < layersCount;) {
-                var packet = createPacket(resolution, k, l);
-                l++;
-                return packet;
-              }
+      buffer = this.ensureBuffer(bufferLength + i - 1);
+      this.bufferLength += i - 1;
 
-              l = 0;
-            }
+      if (i < 5) {
+        for (; i < 5; ++i) {
+          input[i] = 0x21 + 84;
+        }
 
-            r = 0;
-          }
+        this.eof = true;
+      }
 
-          c = 0;
-        }
+      let t = 0;
 
-        px = 0;
+      for (i = 0; i < 5; ++i) {
+        t = t * 85 + (input[i] - 0x21);
       }
 
-      throw new JpxError("Out of packets");
-    };
+      for (i = 3; i >= 0; --i) {
+        buffer[bufferLength + i] = t & 0xff;
+        t >>= 8;
+      }
+    }
   }
 
-  function ComponentPositionResolutionLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var precinctsSizes = getPrecinctSizesInImageScale(tile);
-    var l = 0,
-        r = 0,
-        c = 0,
-        px = 0,
-        py = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      for (; c < componentsCount; ++c) {
-        var component = tile.components[c];
-        var precinctsIterationSizes = precinctsSizes.components[c];
-        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
-
-        for (; py < precinctsIterationSizes.maxNumHigh; py++) {
-          for (; px < precinctsIterationSizes.maxNumWide; px++) {
-            for (; r <= decompositionLevelsCount; r++) {
-              var resolution = component.resolutions[r];
-              var sizeInImageScale = precinctsIterationSizes.resolutions[r];
-              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
-
-              if (k === null) {
-                continue;
-              }
-
-              for (; l < layersCount;) {
-                var packet = createPacket(resolution, k, l);
-                l++;
-                return packet;
-              }
+}
 
-              l = 0;
-            }
+exports.Ascii85Stream = Ascii85Stream;
 
-            r = 0;
-          }
+/***/ }),
+/* 19 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-          px = 0;
-        }
 
-        py = 0;
-      }
 
-      throw new JpxError("Out of packets");
-    };
-  }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.StreamsSequenceStream = exports.DecodeStream = void 0;
 
-  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
-    var posX = pxIndex * precinctIterationSizes.minWidth;
-    var posY = pyIndex * precinctIterationSizes.minHeight;
+var _base_stream = __w_pdfjs_require__(6);
 
-    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {
-      return null;
-    }
+var _stream = __w_pdfjs_require__(10);
 
-    var startPrecinctRowIndex = posY / sizeInImageScale.width * 
resolution.precinctParameters.numprecinctswide;
-    return posX / sizeInImageScale.height + startPrecinctRowIndex;
-  }
-
-  function getPrecinctSizesInImageScale(tile) {
-    var componentsCount = tile.components.length;
-    var minWidth = Number.MAX_VALUE;
-    var minHeight = Number.MAX_VALUE;
-    var maxNumWide = 0;
-    var maxNumHigh = 0;
-    var sizePerComponent = new Array(componentsCount);
-
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
-      var sizePerResolution = new Array(decompositionLevelsCount + 1);
-      var minWidthCurrentComponent = Number.MAX_VALUE;
-      var minHeightCurrentComponent = Number.MAX_VALUE;
-      var maxNumWideCurrentComponent = 0;
-      var maxNumHighCurrentComponent = 0;
-      var scale = 1;
-
-      for (var r = decompositionLevelsCount; r >= 0; --r) {
-        var resolution = component.resolutions[r];
-        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;
-        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;
-        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);
-        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);
-        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, 
resolution.precinctParameters.numprecinctswide);
-        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, 
resolution.precinctParameters.numprecinctshigh);
-        sizePerResolution[r] = {
-          width: widthCurrentResolution,
-          height: heightCurrentResolution
-        };
-        scale <<= 1;
-      }
-
-      minWidth = Math.min(minWidth, minWidthCurrentComponent);
-      minHeight = Math.min(minHeight, minHeightCurrentComponent);
-      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
-      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);
-      sizePerComponent[c] = {
-        resolutions: sizePerResolution,
-        minWidth: minWidthCurrentComponent,
-        minHeight: minHeightCurrentComponent,
-        maxNumWide: maxNumWideCurrentComponent,
-        maxNumHigh: maxNumHighCurrentComponent
-      };
-    }
+const emptyBuffer = new Uint8Array(0);
 
-    return {
-      components: sizePerComponent,
-      minWidth,
-      minHeight,
-      maxNumWide,
-      maxNumHigh
-    };
-  }
-
-  function buildPackets(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var componentsCount = siz.Csiz;
-
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
-      var resolutions = [];
-      var subbands = [];
-
-      for (var r = 0; r <= decompositionLevelsCount; r++) {
-        var blocksDimensions = getBlocksDimensions(context, component, r);
-        var resolution = {};
-        var scale = 1 << decompositionLevelsCount - r;
-        resolution.trx0 = Math.ceil(component.tcx0 / scale);
-        resolution.try0 = Math.ceil(component.tcy0 / scale);
-        resolution.trx1 = Math.ceil(component.tcx1 / scale);
-        resolution.try1 = Math.ceil(component.tcy1 / scale);
-        resolution.resLevel = r;
-        buildPrecincts(context, resolution, blocksDimensions);
-        resolutions.push(resolution);
-        var subband;
-
-        if (r === 0) {
-          subband = {};
-          subband.type = "LL";
-          subband.tbx0 = Math.ceil(component.tcx0 / scale);
-          subband.tby0 = Math.ceil(component.tcy0 / scale);
-          subband.tbx1 = Math.ceil(component.tcx1 / scale);
-          subband.tby1 = Math.ceil(component.tcy1 / scale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolution.subbands = [subband];
-        } else {
-          var bscale = 1 << decompositionLevelsCount - r + 1;
-          var resolutionSubbands = [];
-          subband = {};
-          subband.type = "HL";
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-          subband = {};
-          subband.type = "LH";
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-          subband = {};
-          subband.type = "HH";
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-          resolution.subbands = resolutionSubbands;
-        }
-      }
-
-      component.resolutions = resolutions;
-      component.subbands = subbands;
-    }
-
-    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
-
-    switch (progressionOrder) {
-      case 0:
-        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);
-        break;
-
-      case 1:
-        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);
-        break;
-
-      case 2:
-        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);
-        break;
-
-      case 3:
-        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);
-        break;
-
-      case 4:
-        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);
-        break;
+class DecodeStream extends _base_stream.BaseStream {
+  constructor(maybeMinBufferLength) {
+    super();
+    this._rawMinBufferLength = maybeMinBufferLength || 0;
+    this.pos = 0;
+    this.bufferLength = 0;
+    this.eof = false;
+    this.buffer = emptyBuffer;
+    this.minBufferLength = 512;
 
-      default:
-        throw new JpxError(`Unsupported progression order ${progressionOrder}`);
+    if (maybeMinBufferLength) {
+      while (this.minBufferLength < maybeMinBufferLength) {
+        this.minBufferLength *= 2;
+      }
     }
   }
 
-  function parseTilePackets(context, data, offset, dataLength) {
-    var position = 0;
-    var buffer,
-        bufferSize = 0,
-        skipNextBit = false;
-
-    function readBits(count) {
-      while (bufferSize < count) {
-        var b = data[offset + position];
-        position++;
+  get isEmpty() {
+    while (!this.eof && this.bufferLength === 0) {
+      this.readBlock();
+    }
 
-        if (skipNextBit) {
-          buffer = buffer << 7 | b;
-          bufferSize += 7;
-          skipNextBit = false;
-        } else {
-          buffer = buffer << 8 | b;
-          bufferSize += 8;
-        }
+    return this.bufferLength === 0;
+  }
 
-        if (b === 0xff) {
-          skipNextBit = true;
-        }
-      }
+  ensureBuffer(requested) {
+    const buffer = this.buffer;
 
-      bufferSize -= count;
-      return buffer >>> bufferSize & (1 << count) - 1;
+    if (requested <= buffer.byteLength) {
+      return buffer;
     }
 
-    function skipMarkerIfEqual(value) {
-      if (data[offset + position - 1] === 0xff && data[offset + position] === value) {
-        skipBytes(1);
-        return true;
-      } else if (data[offset + position] === 0xff && data[offset + position + 1] === value) {
-        skipBytes(2);
-        return true;
-      }
+    let size = this.minBufferLength;
 
-      return false;
+    while (size < requested) {
+      size *= 2;
     }
 
-    function skipBytes(count) {
-      position += count;
-    }
+    const buffer2 = new Uint8Array(size);
+    buffer2.set(buffer);
+    return this.buffer = buffer2;
+  }
 
-    function alignToByte() {
-      bufferSize = 0;
+  getByte() {
+    const pos = this.pos;
 
-      if (skipNextBit) {
-        position++;
-        skipNextBit = false;
+    while (this.bufferLength <= pos) {
+      if (this.eof) {
+        return -1;
       }
+
+      this.readBlock();
     }
 
-    function readCodingpasses() {
-      if (readBits(1) === 0) {
-        return 1;
-      }
+    return this.buffer[this.pos++];
+  }
 
-      if (readBits(1) === 0) {
-        return 2;
-      }
+  getBytes(length, forceClamped = false) {
+    const pos = this.pos;
+    let end;
 
-      var value = readBits(2);
+    if (length) {
+      this.ensureBuffer(pos + length);
+      end = pos + length;
 
-      if (value < 3) {
-        return value + 3;
+      while (!this.eof && this.bufferLength < end) {
+        this.readBlock();
       }
 
-      value = readBits(5);
+      const bufEnd = this.bufferLength;
 
-      if (value < 31) {
-        return value + 6;
+      if (end > bufEnd) {
+        end = bufEnd;
+      }
+    } else {
+      while (!this.eof) {
+        this.readBlock();
       }
 
-      value = readBits(7);
-      return value + 37;
+      end = this.bufferLength;
     }
 
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var sopMarkerUsed = context.COD.sopMarkerUsed;
-    var ephMarkerUsed = context.COD.ephMarkerUsed;
-    var packetsIterator = tile.packetsIterator;
+    this.pos = end;
+    const subarray = this.buffer.subarray(pos, end);
+    return forceClamped && !(subarray instanceof Uint8ClampedArray) ? new Uint8ClampedArray(subarray) : 
subarray;
+  }
 
-    while (position < dataLength) {
-      alignToByte();
+  reset() {
+    this.pos = 0;
+  }
 
-      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
-        skipBytes(4);
+  makeSubStream(start, length, dict = null) {
+    if (length === undefined) {
+      while (!this.eof) {
+        this.readBlock();
       }
+    } else {
+      const end = start + length;
 
-      var packet = packetsIterator.nextPacket();
-
-      if (!readBits(1)) {
-        continue;
+      while (this.bufferLength <= end && !this.eof) {
+        this.readBlock();
       }
+    }
 
-      var layerNumber = packet.layerNumber;
-      var queue = [],
-          codeblock;
-
-      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
-        codeblock = packet.codeblocks[i];
-        var precinct = codeblock.precinct;
-        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
-        var codeblockRow = codeblock.cby - precinct.cbyMin;
-        var codeblockIncluded = false;
-        var firstTimeInclusion = false;
-        var valueReady;
+    return new _stream.Stream(this.buffer, start, length, dict);
+  }
 
-        if (codeblock.included !== undefined) {
-          codeblockIncluded = !!readBits(1);
-        } else {
-          precinct = codeblock.precinct;
-          var inclusionTree, zeroBitPlanesTree;
+  getBaseStreams() {
+    return this.str ? this.str.getBaseStreams() : null;
+  }
 
-          if (precinct.inclusionTree !== undefined) {
-            inclusionTree = precinct.inclusionTree;
-          } else {
-            var width = precinct.cbxMax - precinct.cbxMin + 1;
-            var height = precinct.cbyMax - precinct.cbyMin + 1;
-            inclusionTree = new InclusionTree(width, height, layerNumber);
-            zeroBitPlanesTree = new TagTree(width, height);
-            precinct.inclusionTree = inclusionTree;
-            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
-          }
+}
 
-          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
-            while (true) {
-              if (readBits(1)) {
-                valueReady = !inclusionTree.nextLevel();
+exports.DecodeStream = DecodeStream;
 
-                if (valueReady) {
-                  codeblock.included = true;
-                  codeblockIncluded = firstTimeInclusion = true;
-                  break;
-                }
-              } else {
-                inclusionTree.incrementValue(layerNumber);
-                break;
-              }
-            }
-          }
-        }
+class StreamsSequenceStream extends DecodeStream {
+  constructor(streams) {
+    let maybeLength = 0;
 
-        if (!codeblockIncluded) {
-          continue;
-        }
+    for (const stream of streams) {
+      maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length;
+    }
 
-        if (firstTimeInclusion) {
-          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
-          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
+    super(maybeLength);
+    this.streams = streams;
+  }
 
-          while (true) {
-            if (readBits(1)) {
-              valueReady = !zeroBitPlanesTree.nextLevel();
+  readBlock() {
+    const streams = this.streams;
 
-              if (valueReady) {
-                break;
-              }
-            } else {
-              zeroBitPlanesTree.incrementValue();
-            }
-          }
+    if (streams.length === 0) {
+      this.eof = true;
+      return;
+    }
 
-          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
-        }
+    const stream = streams.shift();
+    const chunk = stream.getBytes();
+    const bufferLength = this.bufferLength;
+    const newLength = bufferLength + chunk.length;
+    const buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  }
 
-        var codingpasses = readCodingpasses();
+  getBaseStreams() {
+    const baseStreamsBuf = [];
 
-        while (readBits(1)) {
-          codeblock.Lblock++;
-        }
+    for (const stream of this.streams) {
+      const baseStreams = stream.getBaseStreams();
 
-        var codingpassesLog2 = (0, _core_utils.log2)(codingpasses);
-        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + 
codeblock.Lblock;
-        var codedDataLength = readBits(bits);
-        queue.push({
-          codeblock,
-          codingpasses,
-          dataLength: codedDataLength
-        });
+      if (baseStreams) {
+        baseStreamsBuf.push(...baseStreams);
       }
+    }
 
-      alignToByte();
+    return baseStreamsBuf.length > 0 ? baseStreamsBuf : null;
+  }
 
-      if (ephMarkerUsed) {
-        skipMarkerIfEqual(0x92);
-      }
+}
 
-      while (queue.length > 0) {
-        var packetItem = queue.shift();
-        codeblock = packetItem.codeblock;
+exports.StreamsSequenceStream = StreamsSequenceStream;
 
-        if (codeblock.data === undefined) {
-          codeblock.data = [];
-        }
+/***/ }),
+/* 20 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-        codeblock.data.push({
-          data,
-          start: offset + position,
-          end: offset + position + packetItem.dataLength,
-          codingpasses: packetItem.codingpasses
-        });
-        position += packetItem.dataLength;
-      }
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.AsciiHexStream = void 0;
+
+var _decode_stream = __w_pdfjs_require__(19);
+
+class AsciiHexStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength) {
+    if (maybeLength) {
+      maybeLength *= 0.5;
     }
 
-    return position;
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+    this.firstDigit = -1;
   }
 
-  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, 
segmentationSymbolUsed) {
-    var x0 = subband.tbx0;
-    var y0 = subband.tby0;
-    var width = subband.tbx1 - subband.tbx0;
-    var codeblocks = subband.codeblocks;
-    var right = subband.type.charAt(0) === "H" ? 1 : 0;
-    var bottom = subband.type.charAt(1) === "H" ? levelWidth : 0;
+  readBlock() {
+    const UPSTREAM_BLOCK_SIZE = 8000;
+    const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
 
-    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
-      var codeblock = codeblocks[i];
-      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
-      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
+    if (!bytes.length) {
+      this.eof = true;
+      return;
+    }
 
-      if (blockWidth === 0 || blockHeight === 0) {
-        continue;
-      }
+    const maxDecodeLength = bytes.length + 1 >> 1;
+    const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
+    let bufferLength = this.bufferLength;
+    let firstDigit = this.firstDigit;
 
-      if (codeblock.data === undefined) {
+    for (const ch of bytes) {
+      let digit;
+
+      if (ch >= 0x30 && ch <= 0x39) {
+        digit = ch & 0x0f;
+      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+        digit = (ch & 0x0f) + 9;
+      } else if (ch === 0x3e) {
+        this.eof = true;
+        break;
+      } else {
         continue;
       }
 
-      var bitModel, currentCodingpassType;
-      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);
-      currentCodingpassType = 2;
-      var data = codeblock.data,
-          totalLength = 0,
-          codingpasses = 0;
-      var j, jj, dataItem;
-
-      for (j = 0, jj = data.length; j < jj; j++) {
-        dataItem = data[j];
-        totalLength += dataItem.end - dataItem.start;
-        codingpasses += dataItem.codingpasses;
+      if (firstDigit < 0) {
+        firstDigit = digit;
+      } else {
+        buffer[bufferLength++] = firstDigit << 4 | digit;
+        firstDigit = -1;
       }
+    }
 
-      var encodedData = new Uint8Array(totalLength);
-      var position = 0;
-
-      for (j = 0, jj = data.length; j < jj; j++) {
-        dataItem = data[j];
-        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
-        encodedData.set(chunk, position);
-        position += chunk.length;
-      }
+    if (firstDigit >= 0 && this.eof) {
+      buffer[bufferLength++] = firstDigit << 4;
+      firstDigit = -1;
+    }
 
-      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);
-      bitModel.setDecoder(decoder);
+    this.firstDigit = firstDigit;
+    this.bufferLength = bufferLength;
+  }
 
-      for (j = 0; j < codingpasses; j++) {
-        switch (currentCodingpassType) {
-          case 0:
-            bitModel.runSignificancePropagationPass();
-            break;
+}
 
-          case 1:
-            bitModel.runMagnitudeRefinementPass();
-            break;
+exports.AsciiHexStream = AsciiHexStream;
 
-          case 2:
-            bitModel.runCleanupPass();
+/***/ }),
+/* 21 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-            if (segmentationSymbolUsed) {
-              bitModel.checkSegmentationSymbol();
-            }
 
-            break;
-        }
 
-        currentCodingpassType = (currentCodingpassType + 1) % 3;
-      }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.CCITTFaxStream = void 0;
 
-      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;
-      var sign = bitModel.coefficentsSign;
-      var magnitude = bitModel.coefficentsMagnitude;
-      var bitsDecoded = bitModel.bitsDecoded;
-      var magnitudeCorrection = reversible ? 0 : 0.5;
-      var k, n, nb;
-      position = 0;
-      var interleave = subband.type !== "LL";
+var _primitives = __w_pdfjs_require__(5);
 
-      for (j = 0; j < blockHeight; j++) {
-        var row = offset / width | 0;
-        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
+var _ccitt = __w_pdfjs_require__(22);
 
-        for (k = 0; k < blockWidth; k++) {
-          n = magnitude[position];
+var _decode_stream = __w_pdfjs_require__(19);
 
-          if (n !== 0) {
-            n = (n + magnitudeCorrection) * delta;
+class CCITTFaxStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength, params) {
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
 
-            if (sign[position] !== 0) {
-              n = -n;
-            }
+    if (!(0, _primitives.isDict)(params)) {
+      params = _primitives.Dict.empty;
+    }
 
-            nb = bitsDecoded[position];
-            var pos = interleave ? levelOffset + (offset << 1) : offset;
+    const source = {
+      next() {
+        return str.getByte();
+      }
 
-            if (reversible && nb >= mb) {
-              coefficients[pos] = n;
-            } else {
-              coefficients[pos] = n * (1 << mb - nb);
-            }
-          }
+    };
+    this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, {
+      K: params.get("K"),
+      EndOfLine: params.get("EndOfLine"),
+      EncodedByteAlign: params.get("EncodedByteAlign"),
+      Columns: params.get("Columns"),
+      Rows: params.get("Rows"),
+      EndOfBlock: params.get("EndOfBlock"),
+      BlackIs1: params.get("BlackIs1")
+    });
+  }
 
-          offset++;
-          position++;
-        }
+  readBlock() {
+    while (!this.eof) {
+      const c = this.ccittFaxDecoder.readNextChar();
 
-        offset += width - blockWidth;
+      if (c === -1) {
+        this.eof = true;
+        return;
       }
+
+      this.ensureBuffer(this.bufferLength + 1);
+      this.buffer[this.bufferLength++] = c;
     }
   }
 
-  function transformTile(context, tile, c) {
-    var component = tile.components[c];
-    var codingStyleParameters = component.codingStyleParameters;
-    var quantizationParameters = component.quantizationParameters;
-    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;
-    var spqcds = quantizationParameters.SPqcds;
-    var scalarExpounded = quantizationParameters.scalarExpounded;
-    var guardBits = quantizationParameters.guardBits;
-    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
-    var precision = context.components[c].precision;
-    var reversible = codingStyleParameters.reversibleTransformation;
-    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();
-    var subbandCoefficients = [];
-    var b = 0;
-
-    for (var i = 0; i <= decompositionLevelsCount; i++) {
-      var resolution = component.resolutions[i];
-      var width = resolution.trx1 - resolution.trx0;
-      var height = resolution.try1 - resolution.try0;
-      var coefficients = new Float32Array(width * height);
-
-      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
-        var mu, epsilon;
+}
 
-        if (!scalarExpounded) {
-          mu = spqcds[0].mu;
-          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
-        } else {
-          mu = spqcds[b].mu;
-          epsilon = spqcds[b].epsilon;
-          b++;
-        }
+exports.CCITTFaxStream = CCITTFaxStream;
 
-        var subband = resolution.subbands[j];
-        var gainLog2 = SubbandsGainLog2[subband.type];
-        var delta = reversible ? 1 : 2 ** (precision + gainLog2 - epsilon) * (1 + mu / 2048);
-        var mb = guardBits + epsilon - 1;
-        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, 
segmentationSymbolUsed);
-      }
+/***/ }),
+/* 22 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      subbandCoefficients.push({
-        width,
-        height,
-        items: coefficients
-      });
-    }
 
-    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);
-    return {
-      left: component.tcx0,
-      top: component.tcy0,
-      width: result.width,
-      height: result.height,
-      items: result.items
-    };
-  }
 
-  function transformComponents(context) {
-    var siz = context.SIZ;
-    var components = context.components;
-    var componentsCount = siz.Csiz;
-    var resultImages = [];
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.CCITTFaxDecoder = void 0;
 
-    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
-      var tile = context.tiles[i];
-      var transformedTiles = [];
-      var c;
+var _util = __w_pdfjs_require__(2);
 
-      for (c = 0; c < componentsCount; c++) {
-        transformedTiles[c] = transformTile(context, tile, c);
-      }
+const ccittEOL = -2;
+const ccittEOF = -1;
+const twoDimPass = 0;
+const twoDimHoriz = 1;
+const twoDimVert0 = 2;
+const twoDimVertR1 = 3;
+const twoDimVertL1 = 4;
+const twoDimVertR2 = 5;
+const twoDimVertL2 = 6;
+const twoDimVertR3 = 7;
+const twoDimVertL3 = 8;
+const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, 
twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, 
twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, 
twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], 
[3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, 
twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], 
[3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, 
twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], 
 [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, 
twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], 
[1, twoDimVert0], [1, twoDimVert0
 ], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, 
twoDimVert0], [1, twoDimVert0]];
+const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], 
[-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 
1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 
1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];
+const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], 
[8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], 
[8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], 
[7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], 
[8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], 
[6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], 
[6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], 
[8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], 
[7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], 
[8, 0], [8, 0], [8, 320], 
 [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 
10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 
11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 
27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 
1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 
50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 
56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 
192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 
448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 
896], [9, 960], [9, 1024], [9
 , 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 
2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], 
[4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 
2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], 
[4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 
3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 
128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 
128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 
8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], 
[5, 9], [5, 9], [5, 9
 ], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], 
[6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 
4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], 
[4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 
4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], 
[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 
5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], 
[6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], 
[5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], 
[5, 64], [4, 6], [4, 6], [4
 , 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 
6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], 
[4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 
7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], 
[4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];
+const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, 
-1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, 
-1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, 
-1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], 
[12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], 
[11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], 
[12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 
18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], 
[13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], 
[12, 59], [12, 60]
 , [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], 
[11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 
512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 
1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];
+const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 
13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], 
[12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 
16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 
32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], 
[8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], 
[7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], 
[7, 11], [7, 11], [7, 11]
 , [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 
11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 
15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], 
[12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], 
[12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 
12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];
+const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], 
[4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 
1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], 
[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 
2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];
+
+class CCITTFaxDecoder {
+  constructor(source, options = {}) {
+    if (!source || typeof source.next !== "function") {
+      throw new Error('CCITTFaxDecoder - invalid "source" parameter.');
+    }
 
-      var tile0 = transformedTiles[0];
-      var out = new Uint8ClampedArray(tile0.items.length * componentsCount);
-      var result = {
-        left: tile0.left,
-        top: tile0.top,
-        width: tile0.width,
-        height: tile0.height,
-        items: out
-      };
-      var shift, offset;
-      var pos = 0,
-          j,
-          jj,
-          y0,
-          y1,
-          y2;
-
-      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
-        var fourComponents = componentsCount === 4;
-        var y0items = transformedTiles[0].items;
-        var y1items = transformedTiles[1].items;
-        var y2items = transformedTiles[2].items;
-        var y3items = fourComponents ? transformedTiles[3].items : null;
-        shift = components[0].precision - 8;
-        offset = (128 << shift) + 0.5;
-        var component0 = tile.components[0];
-        var alpha01 = componentsCount - 3;
-        jj = y0items.length;
-
-        if (!component0.codingStyleParameters.reversibleTransformation) {
-          for (j = 0; j < jj; j++, pos += alpha01) {
-            y0 = y0items[j] + offset;
-            y1 = y1items[j];
-            y2 = y2items[j];
-            out[pos++] = y0 + 1.402 * y2 >> shift;
-            out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift;
-            out[pos++] = y0 + 1.772 * y1 >> shift;
-          }
-        } else {
-          for (j = 0; j < jj; j++, pos += alpha01) {
-            y0 = y0items[j] + offset;
-            y1 = y1items[j];
-            y2 = y2items[j];
-            const g = y0 - (y2 + y1 >> 2);
-            out[pos++] = g + y2 >> shift;
-            out[pos++] = g >> shift;
-            out[pos++] = g + y1 >> shift;
-          }
-        }
+    this.source = source;
+    this.eof = false;
+    this.encoding = options.K || 0;
+    this.eoline = options.EndOfLine || false;
+    this.byteAlign = options.EncodedByteAlign || false;
+    this.columns = options.Columns || 1728;
+    this.rows = options.Rows || 0;
+    let eoblock = options.EndOfBlock;
 
-        if (fourComponents) {
-          for (j = 0, pos = 3; j < jj; j++, pos += 4) {
-            out[pos] = y3items[j] + offset >> shift;
-          }
-        }
-      } else {
-        for (c = 0; c < componentsCount; c++) {
-          var items = transformedTiles[c].items;
-          shift = components[c].precision - 8;
-          offset = (128 << shift) + 0.5;
+    if (eoblock === null || eoblock === undefined) {
+      eoblock = true;
+    }
 
-          for (pos = c, j = 0, jj = items.length; j < jj; j++) {
-            out[pos] = items[j] + offset >> shift;
-            pos += componentsCount;
-          }
-        }
-      }
+    this.eoblock = eoblock;
+    this.black = options.BlackIs1 || false;
+    this.codingLine = new Uint32Array(this.columns + 1);
+    this.refLine = new Uint32Array(this.columns + 2);
+    this.codingLine[0] = this.columns;
+    this.codingPos = 0;
+    this.row = 0;
+    this.nextLine2D = this.encoding < 0;
+    this.inputBits = 0;
+    this.inputBuf = 0;
+    this.outputBits = 0;
+    this.rowsDone = false;
+    let code1;
 
-      resultImages.push(result);
+    while ((code1 = this._lookBits(12)) === 0) {
+      this._eatBits(1);
     }
 
-    return resultImages;
-  }
+    if (code1 === 1) {
+      this._eatBits(12);
+    }
 
-  function initializeTile(context, tileIndex) {
-    var siz = context.SIZ;
-    var componentsCount = siz.Csiz;
-    var tile = context.tiles[tileIndex];
+    if (this.encoding > 0) {
+      this.nextLine2D = !this._lookBits(1);
 
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : 
context.currentTile.QCD;
-      component.quantizationParameters = qcdOrQcc;
-      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : 
context.currentTile.COD;
-      component.codingStyleParameters = codOrCoc;
+      this._eatBits(1);
     }
-
-    tile.codingStyleDefaultParameters = context.currentTile.COD;
   }
 
-  var TagTree = function TagTreeClosure() {
-    function TagTree(width, height) {
-      var levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;
-      this.levels = [];
-
-      for (var i = 0; i < levelsLength; i++) {
-        var level = {
-          width,
-          height,
-          items: []
-        };
-        this.levels.push(level);
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
+  readNextChar() {
+    if (this.eof) {
+      return -1;
     }
 
-    TagTree.prototype = {
-      reset: function TagTree_reset(i, j) {
-        var currentLevel = 0,
-            value = 0,
-            level;
+    const refLine = this.refLine;
+    const codingLine = this.codingLine;
+    const columns = this.columns;
+    let refPos, blackPixels, bits, i;
 
-        while (currentLevel < this.levels.length) {
-          level = this.levels[currentLevel];
-          var index = i + j * level.width;
+    if (this.outputBits === 0) {
+      if (this.rowsDone) {
+        this.eof = true;
+      }
 
-          if (level.items[index] !== undefined) {
-            value = level.items[index];
-            break;
-          }
+      if (this.eof) {
+        return -1;
+      }
 
-          level.index = index;
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
+      this.err = false;
+      let code1, code2, code3;
 
-        currentLevel--;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        this.currentLevel = currentLevel;
-        delete this.value;
-      },
-      incrementValue: function TagTree_incrementValue() {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index]++;
-      },
-      nextLevel: function TagTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        currentLevel--;
-
-        if (currentLevel < 0) {
-          this.value = value;
-          return false;
+      if (this.nextLine2D) {
+        for (i = 0; codingLine[i] < columns; ++i) {
+          refLine[i] = codingLine[i];
         }
 
-        this.currentLevel = currentLevel;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return TagTree;
-  }();
-
-  var InclusionTree = function InclusionTreeClosure() {
-    function InclusionTree(width, height, defaultValue) {
-      var levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;
-      this.levels = [];
+        refLine[i++] = columns;
+        refLine[i] = columns;
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        refPos = 0;
+        blackPixels = 0;
 
-      for (var i = 0; i < levelsLength; i++) {
-        var items = new Uint8Array(width * height);
+        while (codingLine[this.codingPos] < columns) {
+          code1 = this._getTwoDimCode();
 
-        for (var j = 0, jj = items.length; j < jj; j++) {
-          items[j] = defaultValue;
-        }
+          switch (code1) {
+            case twoDimPass:
+              this._addPixels(refLine[refPos + 1], blackPixels);
 
-        var level = {
-          width,
-          height,
-          items
-        };
-        this.levels.push(level);
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
-    }
+              if (refLine[refPos + 1] < columns) {
+                refPos += 2;
+              }
 
-    InclusionTree.prototype = {
-      reset: function InclusionTree_reset(i, j, stopValue) {
-        var currentLevel = 0;
+              break;
 
-        while (currentLevel < this.levels.length) {
-          var level = this.levels[currentLevel];
-          var index = i + j * level.width;
-          level.index = index;
-          var value = level.items[index];
+            case twoDimHoriz:
+              code1 = code2 = 0;
 
-          if (value === 0xff) {
-            break;
-          }
+              if (blackPixels) {
+                do {
+                  code1 += code3 = this._getBlackCode();
+                } while (code3 >= 64);
 
-          if (value > stopValue) {
-            this.currentLevel = currentLevel;
-            this.propagateValues();
-            return false;
-          }
+                do {
+                  code2 += code3 = this._getWhiteCode();
+                } while (code3 >= 64);
+              } else {
+                do {
+                  code1 += code3 = this._getWhiteCode();
+                } while (code3 >= 64);
 
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
+                do {
+                  code2 += code3 = this._getBlackCode();
+                } while (code3 >= 64);
+              }
 
-        this.currentLevel = currentLevel - 1;
-        return true;
-      },
-      incrementValue: function InclusionTree_incrementValue(stopValue) {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index] = stopValue + 1;
-        this.propagateValues();
-      },
-      propagateValues: function InclusionTree_propagateValues() {
-        var levelIndex = this.currentLevel;
-        var level = this.levels[levelIndex];
-        var currentValue = level.items[level.index];
+              this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
 
-        while (--levelIndex >= 0) {
-          level = this.levels[levelIndex];
-          level.items[level.index] = currentValue;
-        }
-      },
-      nextLevel: function InclusionTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        level.items[level.index] = 0xff;
-        currentLevel--;
-
-        if (currentLevel < 0) {
-          return false;
-        }
+              if (codingLine[this.codingPos] < columns) {
+                this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);
+              }
 
-        this.currentLevel = currentLevel;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return InclusionTree;
-  }();
+              while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                refPos += 2;
+              }
 
-  var BitModel = function BitModelClosure() {
-    var UNIFORM_CONTEXT = 17;
-    var RUNLENGTH_CONTEXT = 18;
-    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 
3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 
4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);
-    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 
7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 
8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);
-    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 
5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 
8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);
+              break;
 
-    function BitModel(width, height, subband, zeroBitPlanes, mb) {
-      this.width = width;
-      this.height = height;
-      let contextLabelTable;
+            case twoDimVertR3:
+              this._addPixels(refLine[refPos] + 3, blackPixels);
 
-      if (subband === "HH") {
-        contextLabelTable = HHContextLabel;
-      } else if (subband === "HL") {
-        contextLabelTable = HLContextLabel;
-      } else {
-        contextLabelTable = LLAndLHContextsLabel;
-      }
+              blackPixels ^= 1;
 
-      this.contextLabelTable = contextLabelTable;
-      var coefficientCount = width * height;
-      this.neighborsSignificance = new Uint8Array(coefficientCount);
-      this.coefficentsSign = new Uint8Array(coefficientCount);
-      let coefficentsMagnitude;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
 
-      if (mb > 14) {
-        coefficentsMagnitude = new Uint32Array(coefficientCount);
-      } else if (mb > 6) {
-        coefficentsMagnitude = new Uint16Array(coefficientCount);
-      } else {
-        coefficentsMagnitude = new Uint8Array(coefficientCount);
-      }
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
 
-      this.coefficentsMagnitude = coefficentsMagnitude;
-      this.processingFlags = new Uint8Array(coefficientCount);
-      var bitsDecoded = new Uint8Array(coefficientCount);
+              break;
 
-      if (zeroBitPlanes !== 0) {
-        for (var i = 0; i < coefficientCount; i++) {
-          bitsDecoded[i] = zeroBitPlanes;
-        }
-      }
+            case twoDimVertR2:
+              this._addPixels(refLine[refPos] + 2, blackPixels);
 
-      this.bitsDecoded = bitsDecoded;
-      this.reset();
-    }
+              blackPixels ^= 1;
 
-    BitModel.prototype = {
-      setDecoder: function BitModel_setDecoder(decoder) {
-        this.decoder = decoder;
-      },
-      reset: function BitModel_reset() {
-        this.contexts = new Int8Array(19);
-        this.contexts[0] = 4 << 1 | 0;
-        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;
-        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;
-      },
-      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {
-        var neighborsSignificance = this.neighborsSignificance;
-        var width = this.width,
-            height = this.height;
-        var left = column > 0;
-        var right = column + 1 < width;
-        var i;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
 
-        if (row > 0) {
-          i = index - width;
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
 
-          if (left) {
-            neighborsSignificance[i - 1] += 0x10;
-          }
+              break;
 
-          if (right) {
-            neighborsSignificance[i + 1] += 0x10;
-          }
+            case twoDimVertR1:
+              this._addPixels(refLine[refPos] + 1, blackPixels);
 
-          neighborsSignificance[i] += 0x04;
-        }
+              blackPixels ^= 1;
 
-        if (row + 1 < height) {
-          i = index + width;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
 
-          if (left) {
-            neighborsSignificance[i - 1] += 0x10;
-          }
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
 
-          if (right) {
-            neighborsSignificance[i + 1] += 0x10;
-          }
+              break;
 
-          neighborsSignificance[i] += 0x04;
-        }
+            case twoDimVert0:
+              this._addPixels(refLine[refPos], blackPixels);
 
-        if (left) {
-          neighborsSignificance[index - 1] += 0x01;
-        }
+              blackPixels ^= 1;
 
-        if (right) {
-          neighborsSignificance[index + 1] += 0x01;
-        }
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
 
-        neighborsSignificance[index] |= 0x80;
-      },
-      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {
-        var decoder = this.decoder;
-        var width = this.width,
-            height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var neighborsSignificance = this.neighborsSignificance;
-        var processingFlags = this.processingFlags;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        var processedInverseMask = ~1;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-
-        for (var i0 = 0; i0 < height; i0 += 4) {
-          for (var j = 0; j < width; j++) {
-            var index = i0 * width + j;
-
-            for (var i1 = 0; i1 < 4; i1++, index += width) {
-              var i = i0 + i1;
-
-              if (i >= height) {
-                break;
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
               }
 
-              processingFlags[index] &= processedInverseMask;
+              break;
 
-              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {
-                continue;
-              }
+            case twoDimVertL3:
+              this._addPixelsNeg(refLine[refPos] - 3, blackPixels);
 
-              var contextLabel = labels[neighborsSignificance[index]];
-              var decision = decoder.readBit(contexts, contextLabel);
+              blackPixels ^= 1;
 
-              if (decision) {
-                var sign = this.decodeSignBit(i, j, index);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j, index);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
 
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
-        var width = this.width,
-            height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contribution, sign0, sign1, significance1;
-        var contextLabel, decoded;
-        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;
-
-        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
-          sign1 = coefficentsSign[index + 1];
-
-          if (significance1) {
-            sign0 = coefficentsSign[index - 1];
-            contribution = 1 - sign1 - sign0;
-          } else {
-            contribution = 1 - sign1 - sign1;
-          }
-        } else if (significance1) {
-          sign0 = coefficentsSign[index - 1];
-          contribution = 1 - sign0 - sign0;
-        } else {
-          contribution = 0;
-        }
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
 
-        var horizontalContribution = 3 * contribution;
-        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;
+              break;
 
-        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
-          sign1 = coefficentsSign[index + width];
+            case twoDimVertL2:
+              this._addPixelsNeg(refLine[refPos] - 2, blackPixels);
 
-          if (significance1) {
-            sign0 = coefficentsSign[index - width];
-            contribution = 1 - sign1 - sign0 + horizontalContribution;
-          } else {
-            contribution = 1 - sign1 - sign1 + horizontalContribution;
-          }
-        } else if (significance1) {
-          sign0 = coefficentsSign[index - width];
-          contribution = 1 - sign0 - sign0 + horizontalContribution;
-        } else {
-          contribution = horizontalContribution;
-        }
+              blackPixels ^= 1;
 
-        if (contribution >= 0) {
-          contextLabel = 9 + contribution;
-          decoded = this.decoder.readBit(this.contexts, contextLabel);
-        } else {
-          contextLabel = 9 - contribution;
-          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
-        }
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
 
-        return decoded;
-      },
-      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {
-        var decoder = this.decoder;
-        var width = this.width,
-            height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var neighborsSignificance = this.neighborsSignificance;
-        var contexts = this.contexts;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        var length = width * height;
-        var width4 = width * 4;
-
-        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
-          indexNext = Math.min(length, index0 + width4);
-
-          for (var j = 0; j < width; j++) {
-            for (var index = index0 + j; index < indexNext; index += width) {
-              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
-                continue;
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
               }
 
-              var contextLabel = 16;
+              break;
 
-              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
-                processingFlags[index] ^= firstMagnitudeBitMask;
-                var significance = neighborsSignificance[index] & 127;
-                contextLabel = significance === 0 ? 15 : 14;
-              }
+            case twoDimVertL1:
+              this._addPixelsNeg(refLine[refPos] - 1, blackPixels);
 
-              var bit = decoder.readBit(contexts, contextLabel);
-              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      runCleanupPass: function BitModel_runCleanupPass() {
-        var decoder = this.decoder;
-        var width = this.width,
-            height = this.height;
-        var neighborsSignificance = this.neighborsSignificance;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        var oneRowDown = width;
-        var twoRowsDown = width * 2;
-        var threeRowsDown = width * 3;
-        var iNext;
-
-        for (var i0 = 0; i0 < height; i0 = iNext) {
-          iNext = Math.min(i0 + 4, height);
-          var indexBase = i0 * width;
-          var checkAllEmpty = i0 + 3 < height;
-
-          for (var j = 0; j < width; j++) {
-            var index0 = indexBase + j;
-            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + 
oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] 
=== 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && 
neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;
-            var i1 = 0,
-                index = index0;
-            var i = i0,
-                sign;
-
-            if (allEmpty) {
-              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);
-
-              if (!hasSignificantCoefficent) {
-                bitsDecoded[index0]++;
-                bitsDecoded[index0 + oneRowDown]++;
-                bitsDecoded[index0 + twoRowsDown]++;
-                bitsDecoded[index0 + threeRowsDown]++;
-                continue;
-              }
+              blackPixels ^= 1;
 
-              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, 
UNIFORM_CONTEXT);
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
 
-              if (i1 !== 0) {
-                i = i0 + i1;
-                index += i1 * width;
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
               }
 
-              sign = this.decodeSignBit(i, j, index);
-              coefficentsSign[index] = sign;
-              coefficentsMagnitude[index] = 1;
-              this.setNeighborsSignificance(i, j, index);
-              processingFlags[index] |= firstMagnitudeBitMask;
-              index = index0;
-
-              for (var i2 = i0; i2 <= i; i2++, index += width) {
-                bitsDecoded[index]++;
-              }
+              break;
 
-              i1++;
-            }
+            case ccittEOF:
+              this._addPixels(columns, 0);
 
-            for (i = i0 + i1; i < iNext; i++, index += width) {
-              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
-                continue;
-              }
+              this.eof = true;
+              break;
 
-              var contextLabel = labels[neighborsSignificance[index]];
-              var decision = decoder.readBit(contexts, contextLabel);
+            default:
+              (0, _util.info)("bad 2d code");
 
-              if (decision === 1) {
-                sign = this.decodeSignBit(i, j, index);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j, index);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
+              this._addPixels(columns, 0);
 
-              bitsDecoded[index]++;
-            }
+              this.err = true;
           }
         }
-      },
-      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
-        var decoder = this.decoder;
-        var contexts = this.contexts;
-        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, 
UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, 
UNIFORM_CONTEXT);
+      } else {
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        blackPixels = 0;
 
-        if (symbol !== 0xa) {
-          throw new JpxError("Invalid segmentation symbol");
-        }
-      }
-    };
-    return BitModel;
-  }();
+        while (codingLine[this.codingPos] < columns) {
+          code1 = 0;
 
-  var Transform = function TransformClosure() {
-    function Transform() {}
+          if (blackPixels) {
+            do {
+              code1 += code3 = this._getBlackCode();
+            } while (code3 >= 64);
+          } else {
+            do {
+              code1 += code3 = this._getWhiteCode();
+            } while (code3 >= 64);
+          }
 
-    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {
-      var ll = subbands[0];
+          this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
 
-      for (var i = 1, ii = subbands.length; i < ii; i++) {
-        ll = this.iterate(ll, subbands[i], u0, v0);
+          blackPixels ^= 1;
+        }
       }
 
-      return ll;
-    };
-
-    Transform.prototype.extend = function extend(buffer, offset, size) {
-      var i1 = offset - 1,
-          j1 = offset + 1;
-      var i2 = offset + size - 2,
-          j2 = offset + size;
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1] = buffer[j1];
-      buffer[j2] = buffer[i2];
-    };
+      let gotEOL = false;
 
-    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {
-      var llWidth = ll.width,
-          llHeight = ll.height,
-          llItems = ll.items;
-      var width = hl_lh_hh.width;
-      var height = hl_lh_hh.height;
-      var items = hl_lh_hh.items;
-      var i, j, k, l, u, v;
+      if (this.byteAlign) {
+        this.inputBits &= ~7;
+      }
 
-      for (k = 0, i = 0; i < llHeight; i++) {
-        l = i * 2 * width;
+      if (!this.eoblock && this.row === this.rows - 1) {
+        this.rowsDone = true;
+      } else {
+        code1 = this._lookBits(12);
 
-        for (j = 0; j < llWidth; j++, k++, l += 2) {
-          items[l] = llItems[k];
-        }
-      }
+        if (this.eoline) {
+          while (code1 !== ccittEOF && code1 !== 1) {
+            this._eatBits(1);
 
-      llItems = ll.items = null;
-      var bufferPadding = 4;
-      var rowBuffer = new Float32Array(width + 2 * bufferPadding);
+            code1 = this._lookBits(12);
+          }
+        } else {
+          while (code1 === 0) {
+            this._eatBits(1);
 
-      if (width === 1) {
-        if ((u0 & 1) !== 0) {
-          for (v = 0, k = 0; v < height; v++, k += width) {
-            items[k] *= 0.5;
+            code1 = this._lookBits(12);
           }
         }
-      } else {
-        for (v = 0, k = 0; v < height; v++, k += width) {
-          rowBuffer.set(items.subarray(k, k + width), bufferPadding);
-          this.extend(rowBuffer, bufferPadding, width);
-          this.filter(rowBuffer, bufferPadding, width);
-          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);
+
+        if (code1 === 1) {
+          this._eatBits(12);
+
+          gotEOL = true;
+        } else if (code1 === ccittEOF) {
+          this.eof = true;
         }
       }
 
-      var numBuffers = 16;
-      var colBuffers = [];
+      if (!this.eof && this.encoding > 0 && !this.rowsDone) {
+        this.nextLine2D = !this._lookBits(1);
 
-      for (i = 0; i < numBuffers; i++) {
-        colBuffers.push(new Float32Array(height + 2 * bufferPadding));
+        this._eatBits(1);
       }
 
-      var b,
-          currentBuffer = 0;
-      ll = bufferPadding + height;
+      if (this.eoblock && gotEOL && this.byteAlign) {
+        code1 = this._lookBits(12);
 
-      if (height === 1) {
-        if ((v0 & 1) !== 0) {
-          for (u = 0; u < width; u++) {
-            items[u] *= 0.5;
-          }
-        }
-      } else {
-        for (u = 0; u < width; u++) {
-          if (currentBuffer === 0) {
-            numBuffers = Math.min(width - u, numBuffers);
+        if (code1 === 1) {
+          this._eatBits(12);
 
-            for (k = u, l = bufferPadding; l < ll; k += width, l++) {
-              for (b = 0; b < numBuffers; b++) {
-                colBuffers[b][l] = items[k + b];
-              }
-            }
+          if (this.encoding > 0) {
+            this._lookBits(1);
 
-            currentBuffer = numBuffers;
+            this._eatBits(1);
           }
 
-          currentBuffer--;
-          var buffer = colBuffers[currentBuffer];
-          this.extend(buffer, bufferPadding, height);
-          this.filter(buffer, bufferPadding, height);
+          if (this.encoding >= 0) {
+            for (i = 0; i < 4; ++i) {
+              code1 = this._lookBits(12);
+
+              if (code1 !== 1) {
+                (0, _util.info)("bad rtc code: " + code1);
+              }
+
+              this._eatBits(12);
 
-          if (currentBuffer === 0) {
-            k = u - numBuffers + 1;
+              if (this.encoding > 0) {
+                this._lookBits(1);
 
-            for (l = bufferPadding; l < ll; k += width, l++) {
-              for (b = 0; b < numBuffers; b++) {
-                items[k + b] = colBuffers[b][l];
+                this._eatBits(1);
               }
             }
           }
+
+          this.eof = true;
         }
-      }
+      } else if (this.err && this.eoline) {
+        while (true) {
+          code1 = this._lookBits(13);
 
-      return {
-        width,
-        height,
-        items
-      };
-    };
+          if (code1 === ccittEOF) {
+            this.eof = true;
+            return -1;
+          }
 
-    return Transform;
-  }();
+          if (code1 >> 1 === 1) {
+            break;
+          }
 
-  var IrreversibleTransform = function IrreversibleTransformClosure() {
-    function IrreversibleTransform() {
-      Transform.call(this);
-    }
+          this._eatBits(1);
+        }
 
-    IrreversibleTransform.prototype = Object.create(Transform.prototype);
+        this._eatBits(12);
 
-    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {
-      var len = length >> 1;
-      offset = offset | 0;
-      var j, n, current, next;
-      var alpha = -1.586134342059924;
-      var beta = -0.052980118572961;
-      var gamma = 0.882911075530934;
-      var delta = 0.443506852043971;
-      var K = 1.230174104914001;
-      var K_ = 1 / K;
-      j = offset - 3;
+        if (this.encoding > 0) {
+          this._eatBits(1);
 
-      for (n = len + 4; n--; j += 2) {
-        x[j] *= K_;
+          this.nextLine2D = !(code1 & 1);
+        }
       }
 
-      j = offset - 2;
-      current = delta * x[j - 1];
-
-      for (n = len + 3; n--; j += 2) {
-        next = delta * x[j + 1];
-        x[j] = K * x[j] - current - next;
-
-        if (n--) {
-          j += 2;
-          current = delta * x[j + 1];
-          x[j] = K * x[j] - current - next;
-        } else {
-          break;
-        }
+      if (codingLine[0] > 0) {
+        this.outputBits = codingLine[this.codingPos = 0];
+      } else {
+        this.outputBits = codingLine[this.codingPos = 1];
       }
 
-      j = offset - 1;
-      current = gamma * x[j - 1];
+      this.row++;
+    }
 
-      for (n = len + 2; n--; j += 2) {
-        next = gamma * x[j + 1];
-        x[j] -= current + next;
+    let c;
 
-        if (n--) {
-          j += 2;
-          current = gamma * x[j + 1];
-          x[j] -= current + next;
-        } else {
-          break;
-        }
+    if (this.outputBits >= 8) {
+      c = this.codingPos & 1 ? 0 : 0xff;
+      this.outputBits -= 8;
+
+      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
+        this.codingPos++;
+        this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
       }
+    } else {
+      bits = 8;
+      c = 0;
 
-      j = offset;
-      current = beta * x[j - 1];
+      do {
+        if (this.outputBits > bits) {
+          c <<= bits;
 
-      for (n = len + 1; n--; j += 2) {
-        next = beta * x[j + 1];
-        x[j] -= current + next;
+          if (!(this.codingPos & 1)) {
+            c |= 0xff >> 8 - bits;
+          }
 
-        if (n--) {
-          j += 2;
-          current = beta * x[j + 1];
-          x[j] -= current + next;
+          this.outputBits -= bits;
+          bits = 0;
         } else {
-          break;
-        }
-      }
+          c <<= this.outputBits;
 
-      if (len !== 0) {
-        j = offset + 1;
-        current = alpha * x[j - 1];
+          if (!(this.codingPos & 1)) {
+            c |= 0xff >> 8 - this.outputBits;
+          }
 
-        for (n = len; n--; j += 2) {
-          next = alpha * x[j + 1];
-          x[j] -= current + next;
+          bits -= this.outputBits;
+          this.outputBits = 0;
 
-          if (n--) {
-            j += 2;
-            current = alpha * x[j + 1];
-            x[j] -= current + next;
-          } else {
-            break;
+          if (codingLine[this.codingPos] < columns) {
+            this.codingPos++;
+            this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
+          } else if (bits > 0) {
+            c <<= bits;
+            bits = 0;
           }
         }
-      }
-    };
-
-    return IrreversibleTransform;
-  }();
+      } while (bits);
+    }
 
-  var ReversibleTransform = function ReversibleTransformClosure() {
-    function ReversibleTransform() {
-      Transform.call(this);
+    if (this.black) {
+      c ^= 0xff;
     }
 
-    ReversibleTransform.prototype = Object.create(Transform.prototype);
+    return c;
+  }
 
-    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {
-      var len = length >> 1;
-      offset = offset | 0;
-      var j, n;
+  _addPixels(a1, blackPixels) {
+    const codingLine = this.codingLine;
+    let codingPos = this.codingPos;
 
-      for (j = offset, n = len + 1; n--; j += 2) {
-        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        (0, _util.info)("row is wrong length");
+        this.err = true;
+        a1 = this.columns;
       }
 
-      for (j = offset + 1, n = len; n--; j += 2) {
-        x[j] += x[j - 1] + x[j + 1] >> 1;
+      if (codingPos & 1 ^ blackPixels) {
+        ++codingPos;
       }
-    };
 
-    return ReversibleTransform;
-  }();
+      codingLine[codingPos] = a1;
+    }
 
-  return JpxImage;
-}();
+    this.codingPos = codingPos;
+  }
 
-exports.JpxImage = JpxImage;
+  _addPixelsNeg(a1, blackPixels) {
+    const codingLine = this.codingLine;
+    let codingPos = this.codingPos;
 
-/***/ }),
-/* 22 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        (0, _util.info)("row is wrong length");
+        this.err = true;
+        a1 = this.columns;
+      }
 
-"use strict";
+      if (codingPos & 1 ^ blackPixels) {
+        ++codingPos;
+      }
 
+      codingLine[codingPos] = a1;
+    } else if (a1 < codingLine[codingPos]) {
+      if (a1 < 0) {
+        (0, _util.info)("invalid code");
+        this.err = true;
+        a1 = 0;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = 
exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher 
= exports.AES128Cipher = void 0;
+      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
+        --codingPos;
+      }
 
-var _util = __w_pdfjs_require__(2);
+      codingLine[codingPos] = a1;
+    }
 
-var _primitives = __w_pdfjs_require__(5);
+    this.codingPos = codingPos;
+  }
 
-var _stream = __w_pdfjs_require__(12);
+  _findTableCode(start, end, table, limit) {
+    const limitValue = limit || 0;
 
-var ARCFourCipher = function ARCFourCipherClosure() {
-  function ARCFourCipher(key) {
-    this.a = 0;
-    this.b = 0;
-    var s = new Uint8Array(256);
-    var i,
-        j = 0,
-        tmp,
-        keyLength = key.length;
+    for (let i = start; i <= end; ++i) {
+      let code = this._lookBits(i);
 
-    for (i = 0; i < 256; ++i) {
-      s[i] = i;
-    }
+      if (code === ccittEOF) {
+        return [true, 1, false];
+      }
 
-    for (i = 0; i < 256; ++i) {
-      tmp = s[i];
-      j = j + tmp + key[i % keyLength] & 0xff;
-      s[i] = s[j];
-      s[j] = tmp;
-    }
+      if (i < end) {
+        code <<= end - i;
+      }
 
-    this.s = s;
-  }
+      if (!limitValue || code >= limitValue) {
+        const p = table[code - limitValue];
 
-  ARCFourCipher.prototype = {
-    encryptBlock: function ARCFourCipher_encryptBlock(data) {
-      var i,
-          n = data.length,
-          tmp,
-          tmp2;
-      var a = this.a,
-          b = this.b,
-          s = this.s;
-      var output = new Uint8Array(n);
+        if (p[0] === i) {
+          this._eatBits(i);
 
-      for (i = 0; i < n; ++i) {
-        a = a + 1 & 0xff;
-        tmp = s[a];
-        b = b + tmp & 0xff;
-        tmp2 = s[b];
-        s[a] = tmp2;
-        s[b] = tmp;
-        output[i] = data[i] ^ s[tmp + tmp2 & 0xff];
+          return [true, p[1], true];
+        }
       }
-
-      this.a = a;
-      this.b = b;
-      return output;
     }
-  };
-  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
-  ARCFourCipher.prototype.encrypt = ARCFourCipher.prototype.encryptBlock;
-  return ARCFourCipher;
-}();
 
-exports.ARCFourCipher = ARCFourCipher;
+    return [false, 0, false];
+  }
 
-var calculateMD5 = function calculateMD5Closure() {
-  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 
14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 
21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
-  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, 
-1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 
1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 
568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, 
-2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, 
-722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, 
-57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 
-145523070, -1120210379, 718787259, -343485551]);
+  _getTwoDimCode() {
+    let code = 0;
+    let p;
 
-  function hash(data, offset, length) {
-    var h0 = 1732584193,
-        h1 = -271733879,
-        h2 = -1732584194,
-        h3 = 271733878;
-    var paddedLength = length + 72 & ~63;
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
+    if (this.eoblock) {
+      code = this._lookBits(7);
+      p = twoDimTable[code];
 
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
-    }
+      if (p && p[0] > 0) {
+        this._eatBits(p[0]);
 
-    padded[i++] = 0x80;
-    n = paddedLength - 8;
+        return p[1];
+      }
+    } else {
+      const result = this._findTableCode(1, 7, twoDimTable);
 
-    while (i < n) {
-      padded[i++] = 0;
+      if (result[0] && result[2]) {
+        return result[1];
+      }
     }
 
-    padded[i++] = length << 3 & 0xff;
-    padded[i++] = length >> 5 & 0xff;
-    padded[i++] = length >> 13 & 0xff;
-    padded[i++] = length >> 21 & 0xff;
-    padded[i++] = length >>> 29 & 0xff;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    var w = new Int32Array(16);
+    (0, _util.info)("Bad two dim code");
+    return ccittEOF;
+  }
 
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j, i += 4) {
-        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
+  _getWhiteCode() {
+    let code = 0;
+    let p;
+
+    if (this.eoblock) {
+      code = this._lookBits(12);
+
+      if (code === ccittEOF) {
+        return 1;
       }
 
-      var a = h0,
-          b = h1,
-          c = h2,
-          d = h3,
-          f,
-          g;
+      if (code >> 5 === 0) {
+        p = whiteTable1[code];
+      } else {
+        p = whiteTable2[code >> 3];
+      }
 
-      for (j = 0; j < 64; ++j) {
-        if (j < 16) {
-          f = b & c | ~b & d;
-          g = j;
-        } else if (j < 32) {
-          f = d & b | ~d & c;
-          g = 5 * j + 1 & 15;
-        } else if (j < 48) {
-          f = b ^ c ^ d;
-          g = 3 * j + 5 & 15;
-        } else {
-          f = c ^ (b | ~d);
-          g = 7 * j & 15;
-        }
+      if (p[0] > 0) {
+        this._eatBits(p[0]);
 
-        var tmp = d,
-            rotateArg = a + f + k[j] + w[g] | 0,
-            rotate = r[j];
-        d = c;
-        c = b;
-        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
-        a = tmp;
+        return p[1];
       }
+    } else {
+      let result = this._findTableCode(1, 9, whiteTable2);
 
-      h0 = h0 + a | 0;
-      h1 = h1 + b | 0;
-      h2 = h2 + c | 0;
-      h3 = h3 + d | 0;
+      if (result[0]) {
+        return result[1];
+      }
+
+      result = this._findTableCode(11, 12, whiteTable1);
+
+      if (result[0]) {
+        return result[1];
+      }
     }
 
-    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 
& 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 
0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
+    (0, _util.info)("bad white code");
+
+    this._eatBits(1);
+
+    return 1;
   }
 
-  return hash;
-}();
+  _getBlackCode() {
+    let code, p;
 
-exports.calculateMD5 = calculateMD5;
+    if (this.eoblock) {
+      code = this._lookBits(13);
 
-var Word64 = function Word64Closure() {
-  function Word64(highInteger, lowInteger) {
-    this.high = highInteger | 0;
-    this.low = lowInteger | 0;
-  }
+      if (code === ccittEOF) {
+        return 1;
+      }
 
-  Word64.prototype = {
-    and: function Word64_and(word) {
-      this.high &= word.high;
-      this.low &= word.low;
-    },
-    xor: function Word64_xor(word) {
-      this.high ^= word.high;
-      this.low ^= word.low;
-    },
-    or: function Word64_or(word) {
-      this.high |= word.high;
-      this.low |= word.low;
-    },
-    shiftRight: function Word64_shiftRight(places) {
-      if (places >= 32) {
-        this.low = this.high >>> places - 32 | 0;
-        this.high = 0;
+      if (code >> 7 === 0) {
+        p = blackTable1[code];
+      } else if (code >> 9 === 0 && code >> 7 !== 0) {
+        p = blackTable2[(code >> 1) - 64];
       } else {
-        this.low = this.low >>> places | this.high << 32 - places;
-        this.high = this.high >>> places | 0;
+        p = blackTable3[code >> 7];
       }
-    },
-    shiftLeft: function Word64_shiftLeft(places) {
-      if (places >= 32) {
-        this.high = this.low << places - 32;
-        this.low = 0;
-      } else {
-        this.high = this.high << places | this.low >>> 32 - places;
-        this.low = this.low << places;
+
+      if (p[0] > 0) {
+        this._eatBits(p[0]);
+
+        return p[1];
       }
-    },
-    rotateRight: function Word64_rotateRight(places) {
-      var low, high;
+    } else {
+      let result = this._findTableCode(2, 6, blackTable3);
 
-      if (places & 32) {
-        high = this.low;
-        low = this.high;
-      } else {
-        low = this.low;
-        high = this.high;
+      if (result[0]) {
+        return result[1];
       }
 
-      places &= 31;
-      this.low = low >>> places | high << 32 - places;
-      this.high = high >>> places | low << 32 - places;
-    },
-    not: function Word64_not() {
-      this.high = ~this.high;
-      this.low = ~this.low;
-    },
-    add: function Word64_add(word) {
-      var lowAdd = (this.low >>> 0) + (word.low >>> 0);
-      var highAdd = (this.high >>> 0) + (word.high >>> 0);
+      result = this._findTableCode(7, 12, blackTable2, 64);
 
-      if (lowAdd > 0xffffffff) {
-        highAdd += 1;
+      if (result[0]) {
+        return result[1];
       }
 
-      this.low = lowAdd | 0;
-      this.high = highAdd | 0;
-    },
-    copyTo: function Word64_copyTo(bytes, offset) {
-      bytes[offset] = this.high >>> 24 & 0xff;
-      bytes[offset + 1] = this.high >> 16 & 0xff;
-      bytes[offset + 2] = this.high >> 8 & 0xff;
-      bytes[offset + 3] = this.high & 0xff;
-      bytes[offset + 4] = this.low >>> 24 & 0xff;
-      bytes[offset + 5] = this.low >> 16 & 0xff;
-      bytes[offset + 6] = this.low >> 8 & 0xff;
-      bytes[offset + 7] = this.low & 0xff;
-    },
-    assign: function Word64_assign(word) {
-      this.high = word.high;
-      this.low = word.low;
+      result = this._findTableCode(10, 13, blackTable1);
+
+      if (result[0]) {
+        return result[1];
+      }
     }
-  };
-  return Word64;
-}();
 
-var calculateSHA256 = function calculateSHA256Closure() {
-  function rotr(x, n) {
-    return x >>> n | x << 32 - n;
-  }
+    (0, _util.info)("bad black code");
 
-  function ch(x, y, z) {
-    return x & y ^ ~x & z;
-  }
+    this._eatBits(1);
 
-  function maj(x, y, z) {
-    return x & y ^ x & z ^ y & z;
+    return 1;
   }
 
-  function sigma(x) {
-    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
-  }
+  _lookBits(n) {
+    let c;
 
-  function sigmaPrime(x) {
-    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
-  }
+    while (this.inputBits < n) {
+      if ((c = this.source.next()) === -1) {
+        if (this.inputBits === 0) {
+          return ccittEOF;
+        }
 
-  function littleSigma(x) {
-    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
+        return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n;
+      }
+
+      this.inputBuf = this.inputBuf << 8 | c;
+      this.inputBits += 8;
+    }
+
+    return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n;
   }
 
-  function littleSigmaPrime(x) {
-    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
+  _eatBits(n) {
+    if ((this.inputBits -= n) < 0) {
+      this.inputBits = 0;
+    }
   }
 
-  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 
0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 
0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 
0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 
0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 
0xbef9a3f7, 0xc67178f2];
+}
 
-  function hash(data, offset, length) {
-    var h0 = 0x6a09e667,
-        h1 = 0xbb67ae85,
-        h2 = 0x3c6ef372,
-        h3 = 0xa54ff53a,
-        h4 = 0x510e527f,
-        h5 = 0x9b05688c,
-        h6 = 0x1f83d9ab,
-        h7 = 0x5be0cd19;
-    var paddedLength = Math.ceil((length + 9) / 64) * 64;
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
+exports.CCITTFaxDecoder = CCITTFaxDecoder;
 
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
-    }
+/***/ }),
+/* 23 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    padded[i++] = 0x80;
-    n = paddedLength - 8;
 
-    while (i < n) {
-      padded[i++] = 0;
-    }
 
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = length >>> 29 & 0xff;
-    padded[i++] = length >> 21 & 0xff;
-    padded[i++] = length >> 13 & 0xff;
-    padded[i++] = length >> 5 & 0xff;
-    padded[i++] = length << 3 & 0xff;
-    var w = new Uint32Array(64);
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.FlateStream = void 0;
 
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j) {
-        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
-        i += 4;
-      }
+var _decode_stream = __w_pdfjs_require__(19);
 
-      for (j = 16; j < 64; ++j) {
-        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
-      }
+var _util = __w_pdfjs_require__(2);
 
-      var a = h0,
-          b = h1,
-          c = h2,
-          d = h3,
-          e = h4,
-          f = h5,
-          g = h6,
-          h = h7,
-          t1,
-          t2;
+const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
+const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 
0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 
0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
+const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 
0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 
0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
+const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 
0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 
0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 
0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 
0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 
0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 
0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 
0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 
0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 
0x900cc, 0x7010b, 0x80066, 0x
 80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 
0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 
0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 
0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 
0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 
0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 
0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 
0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 
0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 
0x8003b, 0x900d6, 0x7010d, 
 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 
0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 
0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 
0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 
0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 
0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 
0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 
0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 
0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 
0x80072, 0x80032, 0x900c5
 , 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 
0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 
0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 
0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 
0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 
0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 
0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 
0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 
0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 
0x9009b, 0x70116, 0x8007d, 0x800
 3d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 
0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 
0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 
0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 
0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 
0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 
0x8004f, 0x900ff]), 9];
+const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 
0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 
0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 
0x00000]), 5];
 
-      for (j = 0; j < 64; ++j) {
-        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
-        t2 = sigma(a) + maj(a, b, c);
-        h = g;
-        g = f;
-        f = e;
-        e = d + t1 | 0;
-        d = c;
-        c = b;
-        b = a;
-        a = t1 + t2 | 0;
-      }
+class FlateStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength) {
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+    const cmf = str.getByte();
+    const flg = str.getByte();
 
-      h0 = h0 + a | 0;
-      h1 = h1 + b | 0;
-      h2 = h2 + c | 0;
-      h3 = h3 + d | 0;
-      h4 = h4 + e | 0;
-      h5 = h5 + f | 0;
-      h6 = h6 + g | 0;
-      h7 = h7 + h | 0;
+    if (cmf === -1 || flg === -1) {
+      throw new _util.FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);
     }
 
-    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 
16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 
24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 
0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 
& 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
-  }
+    if ((cmf & 0x0f) !== 0x08) {
+      throw new _util.FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`);
+    }
 
-  return hash;
-}();
+    if (((cmf << 8) + flg) % 31 !== 0) {
+      throw new _util.FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);
+    }
 
-exports.calculateSHA256 = calculateSHA256;
+    if (flg & 0x20) {
+      throw new _util.FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);
+    }
 
-var calculateSHA512 = function calculateSHA512Closure() {
-  function ch(result, x, y, z, tmp) {
-    result.assign(x);
-    result.and(y);
-    tmp.assign(x);
-    tmp.not();
-    tmp.and(z);
-    result.xor(tmp);
+    this.codeSize = 0;
+    this.codeBuf = 0;
   }
 
-  function maj(result, x, y, z, tmp) {
-    result.assign(x);
-    result.and(y);
-    tmp.assign(x);
-    tmp.and(z);
-    result.xor(tmp);
-    tmp.assign(y);
-    tmp.and(z);
-    result.xor(tmp);
-  }
+  getBits(bits) {
+    const str = this.str;
+    let codeSize = this.codeSize;
+    let codeBuf = this.codeBuf;
+    let b;
 
-  function sigma(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(28);
-    tmp.assign(x);
-    tmp.rotateRight(34);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.rotateRight(39);
-    result.xor(tmp);
-  }
+    while (codeSize < bits) {
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError("Bad encoding in flate stream");
+      }
 
-  function sigmaPrime(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(14);
-    tmp.assign(x);
-    tmp.rotateRight(18);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.rotateRight(41);
-    result.xor(tmp);
-  }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
 
-  function littleSigma(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(1);
-    tmp.assign(x);
-    tmp.rotateRight(8);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.shiftRight(7);
-    result.xor(tmp);
+    b = codeBuf & (1 << bits) - 1;
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+    return b;
   }
 
-  function littleSigmaPrime(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(19);
-    tmp.assign(x);
-    tmp.rotateRight(61);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.shiftRight(6);
-    result.xor(tmp);
-  }
+  getCode(table) {
+    const str = this.str;
+    const codes = table[0];
+    const maxLen = table[1];
+    let codeSize = this.codeSize;
+    let codeBuf = this.codeBuf;
+    let b;
 
-  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 
0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 
0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 
0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 
0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 
0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 
0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 
0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 
0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 
0x98fb213f), new Word64(0xb
 f597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new 
Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new 
Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new 
Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new 
Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new 
Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new 
Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new 
Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new 
Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new 
Word64(0x5b9cca4f, 0x7763e373), new
  Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new 
Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new 
Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new 
Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new 
Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new 
Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new 
Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new 
Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new 
Word64(0x6c44198c, 0x4a475817)];
+    while (codeSize < maxLen) {
+      if ((b = str.getByte()) === -1) {
+        break;
+      }
 
-  function hash(data, offset, length, mode384) {
-    mode384 = !!mode384;
-    var h0, h1, h2, h3, h4, h5, h6, h7;
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
 
-    if (!mode384) {
-      h0 = new Word64(0x6a09e667, 0xf3bcc908);
-      h1 = new Word64(0xbb67ae85, 0x84caa73b);
-      h2 = new Word64(0x3c6ef372, 0xfe94f82b);
-      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
-      h4 = new Word64(0x510e527f, 0xade682d1);
-      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
-      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
-      h7 = new Word64(0x5be0cd19, 0x137e2179);
-    } else {
-      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
-      h1 = new Word64(0x629a292a, 0x367cd507);
-      h2 = new Word64(0x9159015a, 0x3070dd17);
-      h3 = new Word64(0x152fecd8, 0xf70e5939);
-      h4 = new Word64(0x67332667, 0xffc00b31);
-      h5 = new Word64(0x8eb44a87, 0x68581511);
-      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
-      h7 = new Word64(0x47b5481d, 0xbefa4fa4);
+    const code = codes[codeBuf & (1 << maxLen) - 1];
+    const codeLen = code >> 16;
+    const codeVal = code & 0xffff;
+
+    if (codeLen < 1 || codeSize < codeLen) {
+      throw new _util.FormatError("Bad encoding in flate stream");
     }
 
-    var paddedLength = Math.ceil((length + 17) / 128) * 128;
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
+    this.codeBuf = codeBuf >> codeLen;
+    this.codeSize = codeSize - codeLen;
+    return codeVal;
+  }
+
+  generateHuffmanTable(lengths) {
+    const n = lengths.length;
+    let maxLen = 0;
+    let i;
 
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
+    for (i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen) {
+        maxLen = lengths[i];
+      }
     }
 
-    padded[i++] = 0x80;
-    n = paddedLength - 16;
+    const size = 1 << maxLen;
+    const codes = new Int32Array(size);
 
-    while (i < n) {
-      padded[i++] = 0;
+    for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
+      for (let val = 0; val < n; ++val) {
+        if (lengths[val] === len) {
+          let code2 = 0;
+          let t = code;
+
+          for (i = 0; i < len; ++i) {
+            code2 = code2 << 1 | t & 1;
+            t >>= 1;
+          }
+
+          for (i = code2; i < size; i += skip) {
+            codes[i] = len << 16 | val;
+          }
+
+          ++code;
+        }
+      }
     }
 
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = length >>> 29 & 0xff;
-    padded[i++] = length >> 21 & 0xff;
-    padded[i++] = length >> 13 & 0xff;
-    padded[i++] = length >> 5 & 0xff;
-    padded[i++] = length << 3 & 0xff;
-    var w = new Array(80);
+    return [codes, maxLen];
+  }
 
-    for (i = 0; i < 80; i++) {
-      w[i] = new Word64(0, 0);
+  readBlock() {
+    let buffer, len;
+    const str = this.str;
+    let hdr = this.getBits(3);
+
+    if (hdr & 1) {
+      this.eof = true;
     }
 
-    var a = new Word64(0, 0),
-        b = new Word64(0, 0),
-        c = new Word64(0, 0);
-    var d = new Word64(0, 0),
-        e = new Word64(0, 0),
-        f = new Word64(0, 0);
-    var g = new Word64(0, 0),
-        h = new Word64(0, 0);
-    var t1 = new Word64(0, 0),
-        t2 = new Word64(0, 0);
-    var tmp1 = new Word64(0, 0),
-        tmp2 = new Word64(0, 0),
-        tmp3;
+    hdr >>= 1;
 
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j) {
-        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
-        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
-        i += 8;
+    if (hdr === 0) {
+      let b;
+
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError("Bad block header in flate stream");
       }
 
-      for (j = 16; j < 80; ++j) {
-        tmp3 = w[j];
-        littleSigmaPrime(tmp3, w[j - 2], tmp2);
-        tmp3.add(w[j - 7]);
-        littleSigma(tmp1, w[j - 15], tmp2);
-        tmp3.add(tmp1);
-        tmp3.add(w[j - 16]);
+      let blockLen = b;
+
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError("Bad block header in flate stream");
       }
 
-      a.assign(h0);
-      b.assign(h1);
-      c.assign(h2);
-      d.assign(h3);
-      e.assign(h4);
-      f.assign(h5);
-      g.assign(h6);
-      h.assign(h7);
+      blockLen |= b << 8;
 
-      for (j = 0; j < 80; ++j) {
-        t1.assign(h);
-        sigmaPrime(tmp1, e, tmp2);
-        t1.add(tmp1);
-        ch(tmp1, e, f, g, tmp2);
-        t1.add(tmp1);
-        t1.add(k[j]);
-        t1.add(w[j]);
-        sigma(t2, a, tmp2);
-        maj(tmp1, a, b, c, tmp2);
-        t2.add(tmp1);
-        tmp3 = h;
-        h = g;
-        g = f;
-        f = e;
-        d.add(t1);
-        e = d;
-        d = c;
-        c = b;
-        b = a;
-        tmp3.assign(t1);
-        tmp3.add(t2);
-        a = tmp3;
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError("Bad block header in flate stream");
       }
 
-      h0.add(a);
-      h1.add(b);
-      h2.add(c);
-      h3.add(d);
-      h4.add(e);
-      h5.add(f);
-      h6.add(g);
-      h7.add(h);
-    }
-
-    var result;
-
-    if (!mode384) {
-      result = new Uint8Array(64);
-      h0.copyTo(result, 0);
-      h1.copyTo(result, 8);
-      h2.copyTo(result, 16);
-      h3.copyTo(result, 24);
-      h4.copyTo(result, 32);
-      h5.copyTo(result, 40);
-      h6.copyTo(result, 48);
-      h7.copyTo(result, 56);
-    } else {
-      result = new Uint8Array(48);
-      h0.copyTo(result, 0);
-      h1.copyTo(result, 8);
-      h2.copyTo(result, 16);
-      h3.copyTo(result, 24);
-      h4.copyTo(result, 32);
-      h5.copyTo(result, 40);
-    }
-
-    return result;
-  }
+      let check = b;
 
-  return hash;
-}();
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError("Bad block header in flate stream");
+      }
 
-exports.calculateSHA512 = calculateSHA512;
+      check |= b << 8;
 
-var calculateSHA384 = function calculateSHA384Closure() {
-  function hash(data, offset, length) {
-    return calculateSHA512(data, offset, length, true);
-  }
+      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
+        throw new _util.FormatError("Bad uncompressed block length in flate stream");
+      }
 
-  return hash;
-}();
+      this.codeBuf = 0;
+      this.codeSize = 0;
+      const bufferLength = this.bufferLength,
+            end = bufferLength + blockLen;
+      buffer = this.ensureBuffer(end);
+      this.bufferLength = end;
 
-exports.calculateSHA384 = calculateSHA384;
+      if (blockLen === 0) {
+        if (str.peekByte() === -1) {
+          this.eof = true;
+        }
+      } else {
+        const block = str.getBytes(blockLen);
+        buffer.set(block, bufferLength);
 
-var NullCipher = function NullCipherClosure() {
-  function NullCipher() {}
+        if (block.length < blockLen) {
+          this.eof = true;
+        }
+      }
 
-  NullCipher.prototype = {
-    decryptBlock: function NullCipher_decryptBlock(data) {
-      return data;
-    },
-    encrypt: function NullCipher_encrypt(data) {
-      return data;
+      return;
     }
-  };
-  return NullCipher;
-}();
 
-class AESBaseCipher {
-  constructor() {
-    if (this.constructor === AESBaseCipher) {
-      (0, _util.unreachable)("Cannot initialize AESBaseCipher.");
-    }
+    let litCodeTable;
+    let distCodeTable;
 
-    this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 
0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 
0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 
0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 
0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 
0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 
0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 
0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 
0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 
0x5e, 0x0b, 0xdb, 0xe0, 0
 x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 
0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 
0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 
0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 
0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 
0x0f, 0xb0, 0x54, 0xbb, 0x16]);
-    this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 
0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 
0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 
0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 
0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 
0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 
0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 
0x1c, 0x75, 0xdf, 0x6e, 0x4
 7, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 
0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 
0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 
0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 
0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
-    this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 
0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 
0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 
0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 
0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 
0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 
0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 
0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 
0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 
0xf9082b94, 0xf701269f, 0x4d
 e6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 
0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 
0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 
0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 
0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 
0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 
0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 
0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 
0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 
0x94de6c87, 0x86c57b9a, 0x88c
 c7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 
0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 
0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 
0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 
0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 
0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 
0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 
0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 
0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 
0xef15e8e6, 0xe11ce5ed, 0xf307
 f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 
0x8d4697a3]);
-    this._mixCol = new Uint8Array(256);
+    if (hdr === 1) {
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr === 2) {
+      const numLitCodes = this.getBits(5) + 257;
+      const numDistCodes = this.getBits(5) + 1;
+      const numCodeLenCodes = this.getBits(4) + 4;
+      const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+      let i;
 
-    for (let i = 0; i < 256; i++) {
-      if (i < 128) {
-        this._mixCol[i] = i << 1;
-      } else {
-        this._mixCol[i] = i << 1 ^ 0x1b;
+      for (i = 0; i < numCodeLenCodes; ++i) {
+        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
       }
-    }
-
-    this.buffer = new Uint8Array(16);
-    this.bufferPosition = 0;
-  }
-
-  _expandKey(cipherKey) {
-    (0, _util.unreachable)("Cannot call `_expandKey` on the base class");
-  }
 
-  _decrypt(input, key) {
-    let t, u, v;
-    const state = new Uint8Array(16);
-    state.set(input);
+      const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+      len = 0;
+      i = 0;
+      const codes = numLitCodes + numDistCodes;
+      const codeLengths = new Uint8Array(codes);
+      let bitsLength, bitsOffset, what;
 
-    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
-    }
+      while (i < codes) {
+        const code = this.getCode(codeLenCodeTab);
 
-    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {
-      t = state[13];
-      state[13] = state[9];
-      state[9] = state[5];
-      state[5] = state[1];
-      state[1] = t;
-      t = state[14];
-      u = state[10];
-      state[14] = state[6];
-      state[10] = state[2];
-      state[6] = t;
-      state[2] = u;
-      t = state[15];
-      u = state[11];
-      v = state[7];
-      state[15] = state[3];
-      state[11] = t;
-      state[7] = u;
-      state[3] = v;
+        if (code === 16) {
+          bitsLength = 2;
+          bitsOffset = 3;
+          what = len;
+        } else if (code === 17) {
+          bitsLength = 3;
+          bitsOffset = 3;
+          what = len = 0;
+        } else if (code === 18) {
+          bitsLength = 7;
+          bitsOffset = 11;
+          what = len = 0;
+        } else {
+          codeLengths[i++] = len = code;
+          continue;
+        }
 
-      for (let j = 0; j < 16; ++j) {
-        state[j] = this._inv_s[state[j]];
-      }
+        let repeatLength = this.getBits(bitsLength) + bitsOffset;
 
-      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
+        while (repeatLength-- > 0) {
+          codeLengths[i++] = what;
+        }
       }
 
-      for (let j = 0; j < 16; j += 4) {
-        const s0 = this._mix[state[j]];
-        const s1 = this._mix[state[j + 1]];
-        const s2 = this._mix[state[j + 2]];
-        const s3 = this._mix[state[j + 3]];
-        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
-        state[j] = t >>> 24 & 0xff;
-        state[j + 1] = t >> 16 & 0xff;
-        state[j + 2] = t >> 8 & 0xff;
-        state[j + 3] = t & 0xff;
-      }
+      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+    } else {
+      throw new _util.FormatError("Unknown block type in flate stream");
     }
 
-    t = state[13];
-    state[13] = state[9];
-    state[9] = state[5];
-    state[5] = state[1];
-    state[1] = t;
-    t = state[14];
-    u = state[10];
-    state[14] = state[6];
-    state[10] = state[2];
-    state[6] = t;
-    state[2] = u;
-    t = state[15];
-    u = state[11];
-    v = state[7];
-    state[15] = state[3];
-    state[11] = t;
-    state[7] = u;
-    state[3] = v;
-
-    for (let j = 0; j < 16; ++j) {
-      state[j] = this._inv_s[state[j]];
-      state[j] ^= key[j];
-    }
+    buffer = this.buffer;
+    let limit = buffer ? buffer.length : 0;
+    let pos = this.bufferLength;
 
-    return state;
-  }
+    while (true) {
+      let code1 = this.getCode(litCodeTable);
 
-  _encrypt(input, key) {
-    const s = this._s;
-    let t, u, v;
-    const state = new Uint8Array(16);
-    state.set(input);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
 
-    for (let j = 0; j < 16; ++j) {
-      state[j] ^= key[j];
-    }
+        buffer[pos++] = code1;
+        continue;
+      }
 
-    for (let i = 1; i < this._cyclesOfRepetition; i++) {
-      for (let j = 0; j < 16; ++j) {
-        state[j] = s[state[j]];
+      if (code1 === 256) {
+        this.bufferLength = pos;
+        return;
       }
 
-      v = state[1];
-      state[1] = state[5];
-      state[5] = state[9];
-      state[9] = state[13];
-      state[13] = v;
-      v = state[2];
-      u = state[6];
-      state[2] = state[10];
-      state[6] = state[14];
-      state[10] = v;
-      state[14] = u;
-      v = state[3];
-      u = state[7];
-      t = state[11];
-      state[3] = state[15];
-      state[7] = v;
-      state[11] = u;
-      state[15] = t;
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      let code2 = code1 >> 16;
 
-      for (let j = 0; j < 16; j += 4) {
-        const s0 = state[j + 0];
-        const s1 = state[j + 1];
-        const s2 = state[j + 2];
-        const s3 = state[j + 3];
-        t = s0 ^ s1 ^ s2 ^ s3;
-        state[j + 0] ^= t ^ this._mixCol[s0 ^ s1];
-        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];
-        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];
-        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
       }
 
-      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
+      len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
       }
-    }
 
-    for (let j = 0; j < 16; ++j) {
-      state[j] = s[state[j]];
-    }
+      const dist = (code1 & 0xffff) + code2;
 
-    v = state[1];
-    state[1] = state[5];
-    state[5] = state[9];
-    state[9] = state[13];
-    state[13] = v;
-    v = state[2];
-    u = state[6];
-    state[2] = state[10];
-    state[6] = state[14];
-    state[10] = v;
-    state[14] = u;
-    v = state[3];
-    u = state[7];
-    t = state[11];
-    state[3] = state[15];
-    state[7] = v;
-    state[11] = u;
-    state[15] = t;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
 
-    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
+      for (let k = 0; k < len; ++k, ++pos) {
+        buffer[pos] = buffer[pos - dist];
+      }
     }
-
-    return state;
   }
 
-  _decryptBlock2(data, finalize) {
-    const sourceLength = data.length;
-    let buffer = this.buffer,
-        bufferLength = this.bufferPosition;
-    const result = [];
-    let iv = this.iv;
+}
 
-    for (let i = 0; i < sourceLength; ++i) {
-      buffer[bufferLength] = data[i];
-      ++bufferLength;
+exports.FlateStream = FlateStream;
 
-      if (bufferLength < 16) {
-        continue;
-      }
+/***/ }),
+/* 24 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      const plain = this._decrypt(buffer, this._key);
 
-      for (let j = 0; j < 16; ++j) {
-        plain[j] ^= iv[j];
-      }
 
-      iv = buffer;
-      result.push(plain);
-      buffer = new Uint8Array(16);
-      bufferLength = 0;
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Jbig2Stream = void 0;
 
-    this.buffer = buffer;
-    this.bufferLength = bufferLength;
-    this.iv = iv;
+var _primitives = __w_pdfjs_require__(5);
 
-    if (result.length === 0) {
-      return new Uint8Array(0);
-    }
+var _decode_stream = __w_pdfjs_require__(19);
 
-    let outputLength = 16 * result.length;
+var _jbig = __w_pdfjs_require__(25);
 
-    if (finalize) {
-      const lastBlock = result[result.length - 1];
-      let psLen = lastBlock[15];
+var _util = __w_pdfjs_require__(2);
 
-      if (psLen <= 16) {
-        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {
-          if (lastBlock[i] !== psLen) {
-            psLen = 0;
-            break;
-          }
-        }
+class Jbig2Stream extends _decode_stream.DecodeStream {
+  constructor(stream, maybeLength, params) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+    this.params = params;
+  }
 
-        outputLength -= psLen;
-        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
-      }
-    }
+  get bytes() {
+    return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
 
-    const output = new Uint8Array(outputLength);
+  ensureBuffer(requested) {}
 
-    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-      output.set(result[i], j);
+  readBlock() {
+    if (this.eof) {
+      return;
     }
 
-    return output;
-  }
+    const jbig2Image = new _jbig.Jbig2Image();
+    const chunks = [];
 
-  decryptBlock(data, finalize, iv = null) {
-    const sourceLength = data.length;
-    const buffer = this.buffer;
-    let bufferLength = this.bufferPosition;
+    if ((0, _primitives.isDict)(this.params)) {
+      const globalsStream = this.params.get("JBIG2Globals");
 
-    if (iv) {
-      this.iv = iv;
-    } else {
-      for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
-        buffer[bufferLength] = data[i];
+      if ((0, _primitives.isStream)(globalsStream)) {
+        const globals = globalsStream.getBytes();
+        chunks.push({
+          data: globals,
+          start: 0,
+          end: globals.length
+        });
       }
+    }
 
-      if (bufferLength < 16) {
-        this.bufferLength = bufferLength;
-        return new Uint8Array(0);
-      }
+    chunks.push({
+      data: this.bytes,
+      start: 0,
+      end: this.bytes.length
+    });
+    const data = jbig2Image.parseChunks(chunks);
+    const dataLength = data.length;
 
-      this.iv = buffer;
-      data = data.subarray(16);
+    for (let i = 0; i < dataLength; i++) {
+      data[i] ^= 0xff;
     }
 
-    this.buffer = new Uint8Array(16);
-    this.bufferLength = 0;
-    this.decryptBlock = this._decryptBlock2;
-    return this.decryptBlock(data, finalize);
+    this.buffer = data;
+    this.bufferLength = dataLength;
+    this.eof = true;
   }
 
-  encrypt(data, iv) {
-    const sourceLength = data.length;
-    let buffer = this.buffer,
-        bufferLength = this.bufferPosition;
-    const result = [];
+}
 
-    if (!iv) {
-      iv = new Uint8Array(16);
-    }
+exports.Jbig2Stream = Jbig2Stream;
 
-    for (let i = 0; i < sourceLength; ++i) {
-      buffer[bufferLength] = data[i];
-      ++bufferLength;
+/***/ }),
+/* 25 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      if (bufferLength < 16) {
-        continue;
-      }
 
-      for (let j = 0; j < 16; ++j) {
-        buffer[j] ^= iv[j];
-      }
 
-      const cipher = this._encrypt(buffer, this._key);
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Jbig2Image = void 0;
 
-      iv = cipher;
-      result.push(cipher);
-      buffer = new Uint8Array(16);
-      bufferLength = 0;
-    }
+var _util = __w_pdfjs_require__(2);
 
-    this.buffer = buffer;
-    this.bufferLength = bufferLength;
-    this.iv = iv;
+var _core_utils = __w_pdfjs_require__(9);
 
-    if (result.length === 0) {
-      return new Uint8Array(0);
-    }
+var _arithmetic_decoder = __w_pdfjs_require__(26);
 
-    const outputLength = 16 * result.length;
-    const output = new Uint8Array(outputLength);
+var _ccitt = __w_pdfjs_require__(22);
 
-    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-      output.set(result[i], j);
+class Jbig2Error extends _util.BaseException {
+  constructor(msg) {
+    super(`JBIG2 error: ${msg}`);
+  }
+
+}
+
+class ContextCache {
+  getContexts(id) {
+    if (id in this) {
+      return this[id];
     }
 
-    return output;
+    return this[id] = new Int8Array(1 << 16);
   }
 
 }
 
-class AES128Cipher extends AESBaseCipher {
-  constructor(key) {
-    super();
-    this._cyclesOfRepetition = 10;
-    this._keySize = 160;
-    this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 
0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 
0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 
0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 
0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 
0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 
0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 
0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 
0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 
0x04, 0x08, 0x10, 0x20, 0x40
 , 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 
0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 
0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 
0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 
0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 
0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
-    this._key = this._expandKey(key);
+class DecodingContext {
+  constructor(data, start, end) {
+    this.data = data;
+    this.start = start;
+    this.end = end;
   }
 
-  _expandKey(cipherKey) {
-    const b = 176;
-    const s = this._s;
-    const rcon = this._rcon;
-    const result = new Uint8Array(b);
-    result.set(cipherKey);
+  get decoder() {
+    const decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);
+    return (0, _util.shadow)(this, "decoder", decoder);
+  }
 
-    for (let j = 16, i = 1; j < b; ++i) {
-      let t1 = result[j - 3];
-      let t2 = result[j - 2];
-      let t3 = result[j - 1];
-      let t4 = result[j - 4];
-      t1 = s[t1];
-      t2 = s[t2];
-      t3 = s[t3];
-      t4 = s[t4];
-      t1 = t1 ^ rcon[i];
+  get contextCache() {
+    const cache = new ContextCache();
+    return (0, _util.shadow)(this, "contextCache", cache);
+  }
 
-      for (let n = 0; n < 4; ++n) {
-        result[j] = t1 ^= result[j - 16];
-        j++;
-        result[j] = t2 ^= result[j - 16];
-        j++;
-        result[j] = t3 ^= result[j - 16];
-        j++;
-        result[j] = t4 ^= result[j - 16];
-        j++;
-      }
+}
+
+function decodeInteger(contextCache, procedure, decoder) {
+  const contexts = contextCache.getContexts(procedure);
+  let prev = 1;
+
+  function readBits(length) {
+    let v = 0;
+
+    for (let i = 0; i < length; i++) {
+      const bit = decoder.readBit(contexts, prev);
+      prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
+      v = v << 1 | bit;
     }
 
-    return result;
+    return v >>> 0;
+  }
+
+  const sign = readBits(1);
+  const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : 
readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
+
+  if (sign === 0) {
+    return value;
+  } else if (value > 0) {
+    return -value;
   }
 
+  return null;
 }
 
-exports.AES128Cipher = AES128Cipher;
+function decodeIAID(contextCache, decoder, codeLength) {
+  const contexts = contextCache.getContexts("IAID");
+  let prev = 1;
 
-class AES256Cipher extends AESBaseCipher {
-  constructor(key) {
-    super();
-    this._cyclesOfRepetition = 14;
-    this._keySize = 224;
-    this._key = this._expandKey(key);
+  for (let i = 0; i < codeLength; i++) {
+    const bit = decoder.readBit(contexts, prev);
+    prev = prev << 1 | bit;
   }
 
-  _expandKey(cipherKey) {
-    const b = 240;
-    const s = this._s;
-    const result = new Uint8Array(b);
-    result.set(cipherKey);
-    let r = 1;
-    let t1, t2, t3, t4;
+  if (codeLength < 31) {
+    return prev & (1 << codeLength) - 1;
+  }
 
-    for (let j = 32, i = 1; j < b; ++i) {
-      if (j % 32 === 16) {
-        t1 = s[t1];
-        t2 = s[t2];
-        t3 = s[t3];
-        t4 = s[t4];
-      } else if (j % 32 === 0) {
-        t1 = result[j - 3];
-        t2 = result[j - 2];
-        t3 = result[j - 1];
-        t4 = result[j - 4];
-        t1 = s[t1];
-        t2 = s[t2];
-        t3 = s[t3];
-        t4 = s[t4];
-        t1 = t1 ^ r;
+  return prev & 0x7fffffff;
+}
 
-        if ((r <<= 1) >= 256) {
-          r = (r ^ 0x1b) & 0xff;
-        }
-      }
+const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, 
"ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, 
"PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", 
"ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, 
"IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", 
"IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", 
"ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", 
"EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, 
"Extension"];
+const CodingTemplates = [[{
+  x: -1,
+  y: -2
+}, {
+  x: 0,
+  y: -2
+}, {
+  x: 1,
+  y: -2
+}, {
+  x: -2,
+  y: -1
+}, {
+  x: -1,
+  y: -1
+}, {
+  x: 0,
+  y: -1
+}, {
+  x: 1,
+  y: -1
+}, {
+  x: 2,
+  y: -1
+}, {
+  x: -4,
+  y: 0
+}, {
+  x: -3,
+  y: 0
+}, {
+  x: -2,
+  y: 0
+}, {
+  x: -1,
+  y: 0
+}], [{
+  x: -1,
+  y: -2
+}, {
+  x: 0,
+  y: -2
+}, {
+  x: 1,
+  y: -2
+}, {
+  x: 2,
+  y: -2
+}, {
+  x: -2,
+  y: -1
+}, {
+  x: -1,
+  y: -1
+}, {
+  x: 0,
+  y: -1
+}, {
+  x: 1,
+  y: -1
+}, {
+  x: 2,
+  y: -1
+}, {
+  x: -3,
+  y: 0
+}, {
+  x: -2,
+  y: 0
+}, {
+  x: -1,
+  y: 0
+}], [{
+  x: -1,
+  y: -2
+}, {
+  x: 0,
+  y: -2
+}, {
+  x: 1,
+  y: -2
+}, {
+  x: -2,
+  y: -1
+}, {
+  x: -1,
+  y: -1
+}, {
+  x: 0,
+  y: -1
+}, {
+  x: 1,
+  y: -1
+}, {
+  x: -2,
+  y: 0
+}, {
+  x: -1,
+  y: 0
+}], [{
+  x: -3,
+  y: -1
+}, {
+  x: -2,
+  y: -1
+}, {
+  x: -1,
+  y: -1
+}, {
+  x: 0,
+  y: -1
+}, {
+  x: 1,
+  y: -1
+}, {
+  x: -4,
+  y: 0
+}, {
+  x: -3,
+  y: 0
+}, {
+  x: -2,
+  y: 0
+}, {
+  x: -1,
+  y: 0
+}]];
+const RefinementTemplates = [{
+  coding: [{
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: -1,
+    y: 0
+  }],
+  reference: [{
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: -1,
+    y: 0
+  }, {
+    x: 0,
+    y: 0
+  }, {
+    x: 1,
+    y: 0
+  }, {
+    x: -1,
+    y: 1
+  }, {
+    x: 0,
+    y: 1
+  }, {
+    x: 1,
+    y: 1
+  }]
+}, {
+  coding: [{
+    x: -1,
+    y: -1
+  }, {
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: -1,
+    y: 0
+  }],
+  reference: [{
+    x: 0,
+    y: -1
+  }, {
+    x: -1,
+    y: 0
+  }, {
+    x: 0,
+    y: 0
+  }, {
+    x: 1,
+    y: 0
+  }, {
+    x: 0,
+    y: 1
+  }, {
+    x: 1,
+    y: 1
+  }]
+}];
+const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195];
+const RefinementReusedContexts = [0x0020, 0x0008];
 
-      for (let n = 0; n < 4; ++n) {
-        result[j] = t1 ^= result[j - 32];
-        j++;
-        result[j] = t2 ^= result[j - 32];
-        j++;
-        result[j] = t3 ^= result[j - 32];
-        j++;
-        result[j] = t4 ^= result[j - 32];
-        j++;
-      }
-    }
+function decodeBitmapTemplate0(width, height, decodingContext) {
+  const decoder = decodingContext.decoder;
+  const contexts = decodingContext.contextCache.getContexts("GB");
+  const bitmap = [];
+  let contextLabel, i, j, pixel, row, row1, row2;
+  const OLD_PIXEL_MASK = 0x7bf7;
 
-    return result;
+  for (i = 0; i < height; i++) {
+    row = bitmap[i] = new Uint8Array(width);
+    row1 = i < 1 ? row : bitmap[i - 1];
+    row2 = i < 2 ? row : bitmap[i - 2];
+    contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 
5 | row1[3] << 4;
+
+    for (j = 0; j < width; j++) {
+      row[j] = pixel = decoder.readBit(contexts, contextLabel);
+      contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 
< width ? row1[j + 4] << 4 : 0) | pixel;
+    }
   }
 
+  return bitmap;
 }
 
-exports.AES256Cipher = AES256Cipher;
+function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
+  if (mmr) {
+    const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
+    return decodeMMRBitmap(input, width, height, false);
+  }
 
-var PDF17 = function PDF17Closure() {
-  function compareByteArrays(array1, array2) {
-    if (array1.length !== array2.length) {
-      return false;
-    }
+  if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && 
at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
+    return decodeBitmapTemplate0(width, height, decodingContext);
+  }
 
-    for (var i = 0; i < array1.length; i++) {
-      if (array1[i] !== array2[i]) {
-        return false;
-      }
+  const useskip = !!skip;
+  const template = CodingTemplates[templateIndex].concat(at);
+  template.sort(function (a, b) {
+    return a.y - b.y || a.x - b.x;
+  });
+  const templateLength = template.length;
+  const templateX = new Int8Array(templateLength);
+  const templateY = new Int8Array(templateLength);
+  const changingTemplateEntries = [];
+  let reuseMask = 0,
+      minX = 0,
+      maxX = 0,
+      minY = 0;
+  let c, k;
+
+  for (k = 0; k < templateLength; k++) {
+    templateX[k] = template[k].x;
+    templateY[k] = template[k].y;
+    minX = Math.min(minX, template[k].x);
+    maxX = Math.max(maxX, template[k].x);
+    minY = Math.min(minY, template[k].y);
+
+    if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x 
- 1) {
+      reuseMask |= 1 << templateLength - 1 - k;
+    } else {
+      changingTemplateEntries.push(k);
     }
-
-    return true;
   }
 
-  function PDF17() {}
+  const changingEntriesLength = changingTemplateEntries.length;
+  const changingTemplateX = new Int8Array(changingEntriesLength);
+  const changingTemplateY = new Int8Array(changingEntriesLength);
+  const changingTemplateBit = new Uint16Array(changingEntriesLength);
 
-  PDF17.prototype = {
-    checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, 
ownerPassword) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerValidationSalt, password.length);
-      hashData.set(userBytes, password.length + ownerValidationSalt.length);
-      var result = calculateSHA256(hashData, 0, hashData.length);
-      return compareByteArrays(result, ownerPassword);
-    },
-    checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userValidationSalt, password.length);
-      var result = calculateSHA256(hashData, 0, hashData.length);
-      return compareByteArrays(result, userPassword);
-    },
-    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerKeySalt, password.length);
-      hashData.set(userBytes, password.length + ownerKeySalt.length);
-      var key = calculateSHA256(hashData, 0, hashData.length);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
-    },
-    getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userKeySalt, password.length);
-      var key = calculateSHA256(hashData, 0, hashData.length);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+  for (c = 0; c < changingEntriesLength; c++) {
+    k = changingTemplateEntries[c];
+    changingTemplateX[c] = template[k].x;
+    changingTemplateY[c] = template[k].y;
+    changingTemplateBit[c] = 1 << templateLength - 1 - k;
+  }
+
+  const sbb_left = -minX;
+  const sbb_top = -minY;
+  const sbb_right = width - maxX;
+  const pseudoPixelContext = ReusedContexts[templateIndex];
+  let row = new Uint8Array(width);
+  const bitmap = [];
+  const decoder = decodingContext.decoder;
+  const contexts = decodingContext.contextCache.getContexts("GB");
+  let ltp = 0,
+      j,
+      i0,
+      j0,
+      contextLabel = 0,
+      bit,
+      shift;
+
+  for (let i = 0; i < height; i++) {
+    if (prediction) {
+      const sltp = decoder.readBit(contexts, pseudoPixelContext);
+      ltp ^= sltp;
+
+      if (ltp) {
+        bitmap.push(row);
+        continue;
+      }
     }
-  };
-  return PDF17;
-}();
 
-exports.PDF17 = PDF17;
+    row = new Uint8Array(row);
+    bitmap.push(row);
 
-var PDF20 = function PDF20Closure() {
-  function concatArrays(array1, array2) {
-    var t = new Uint8Array(array1.length + array2.length);
-    t.set(array1, 0);
-    t.set(array2, array1.length);
-    return t;
-  }
+    for (j = 0; j < width; j++) {
+      if (useskip && skip[i][j]) {
+        row[j] = 0;
+        continue;
+      }
 
-  function calculatePDF20Hash(password, input, userBytes) {
-    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
-    var e = [0];
-    var i = 0;
+      if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
+        contextLabel = contextLabel << 1 & reuseMask;
 
-    while (i < 64 || e[e.length - 1] > i - 32) {
-      var arrayLength = password.length + k.length + userBytes.length;
-      var k1 = new Uint8Array(arrayLength * 64);
-      var array = concatArrays(password, k);
-      array = concatArrays(array, userBytes);
+        for (k = 0; k < changingEntriesLength; k++) {
+          i0 = i + changingTemplateY[k];
+          j0 = j + changingTemplateX[k];
+          bit = bitmap[i0][j0];
 
-      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
-        k1.set(array, pos);
-      }
+          if (bit) {
+            bit = changingTemplateBit[k];
+            contextLabel |= bit;
+          }
+        }
+      } else {
+        contextLabel = 0;
+        shift = templateLength - 1;
 
-      var cipher = new AES128Cipher(k.subarray(0, 16));
-      e = cipher.encrypt(k1, k.subarray(16, 32));
-      var remainder = 0;
+        for (k = 0; k < templateLength; k++, shift--) {
+          j0 = j + templateX[k];
 
-      for (var z = 0; z < 16; z++) {
-        remainder *= 256 % 3;
-        remainder %= 3;
-        remainder += (e[z] >>> 0) % 3;
-        remainder %= 3;
-      }
+          if (j0 >= 0 && j0 < width) {
+            i0 = i + templateY[k];
 
-      if (remainder === 0) {
-        k = calculateSHA256(e, 0, e.length);
-      } else if (remainder === 1) {
-        k = calculateSHA384(e, 0, e.length);
-      } else if (remainder === 2) {
-        k = calculateSHA512(e, 0, e.length);
+            if (i0 >= 0) {
+              bit = bitmap[i0][j0];
+
+              if (bit) {
+                contextLabel |= bit << shift;
+              }
+            }
+          }
+        }
       }
 
-      i++;
+      const pixel = decoder.readBit(contexts, contextLabel);
+      row[j] = pixel;
     }
-
-    return k.subarray(0, 32);
   }
 
-  function PDF20() {}
+  return bitmap;
+}
 
-  function compareByteArrays(array1, array2) {
-    if (array1.length !== array2.length) {
-      return false;
-    }
+function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, 
decodingContext) {
+  let codingTemplate = RefinementTemplates[templateIndex].coding;
 
-    for (var i = 0; i < array1.length; i++) {
-      if (array1[i] !== array2[i]) {
-        return false;
-      }
-    }
+  if (templateIndex === 0) {
+    codingTemplate = codingTemplate.concat([at[0]]);
+  }
 
-    return true;
+  const codingTemplateLength = codingTemplate.length;
+  const codingTemplateX = new Int32Array(codingTemplateLength);
+  const codingTemplateY = new Int32Array(codingTemplateLength);
+  let k;
+
+  for (k = 0; k < codingTemplateLength; k++) {
+    codingTemplateX[k] = codingTemplate[k].x;
+    codingTemplateY[k] = codingTemplate[k].y;
   }
 
-  PDF20.prototype = {
-    hash: function PDF20_hash(password, concatBytes, userBytes) {
-      return calculatePDF20Hash(password, concatBytes, userBytes);
-    },
-    checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, 
ownerPassword) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerValidationSalt, password.length);
-      hashData.set(userBytes, password.length + ownerValidationSalt.length);
-      var result = calculatePDF20Hash(password, hashData, userBytes);
-      return compareByteArrays(result, ownerPassword);
-    },
-    checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userValidationSalt, password.length);
-      var result = calculatePDF20Hash(password, hashData, []);
-      return compareByteArrays(result, userPassword);
-    },
-    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerKeySalt, password.length);
-      hashData.set(userBytes, password.length + ownerKeySalt.length);
-      var key = calculatePDF20Hash(password, hashData, userBytes);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
-    },
-    getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userKeySalt, password.length);
-      var key = calculatePDF20Hash(password, hashData, []);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
-    }
-  };
-  return PDF20;
-}();
+  let referenceTemplate = RefinementTemplates[templateIndex].reference;
 
-exports.PDF20 = PDF20;
+  if (templateIndex === 0) {
+    referenceTemplate = referenceTemplate.concat([at[1]]);
+  }
 
-var CipherTransform = function CipherTransformClosure() {
-  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
-    this.StringCipherConstructor = stringCipherConstructor;
-    this.StreamCipherConstructor = streamCipherConstructor;
+  const referenceTemplateLength = referenceTemplate.length;
+  const referenceTemplateX = new Int32Array(referenceTemplateLength);
+  const referenceTemplateY = new Int32Array(referenceTemplateLength);
+
+  for (k = 0; k < referenceTemplateLength; k++) {
+    referenceTemplateX[k] = referenceTemplate[k].x;
+    referenceTemplateY[k] = referenceTemplate[k].y;
   }
 
-  CipherTransform.prototype = {
-    createStream: function CipherTransform_createStream(stream, length) {
-      var cipher = new this.StreamCipherConstructor();
-      return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) 
{
-        return cipher.decryptBlock(data, finalize);
-      });
-    },
-    decryptString: function CipherTransform_decryptString(s) {
-      var cipher = new this.StringCipherConstructor();
-      var data = (0, _util.stringToBytes)(s);
-      data = cipher.decryptBlock(data, true);
-      return (0, _util.bytesToString)(data);
-    },
-    encryptString: function CipherTransform_encryptString(s) {
-      const cipher = new this.StringCipherConstructor();
+  const referenceWidth = referenceBitmap[0].length;
+  const referenceHeight = referenceBitmap.length;
+  const pseudoPixelContext = RefinementReusedContexts[templateIndex];
+  const bitmap = [];
+  const decoder = decodingContext.decoder;
+  const contexts = decodingContext.contextCache.getContexts("GR");
+  let ltp = 0;
 
-      if (cipher instanceof AESBaseCipher) {
-        const strLen = s.length;
-        const pad = 16 - strLen % 16;
+  for (let i = 0; i < height; i++) {
+    if (prediction) {
+      const sltp = decoder.readBit(contexts, pseudoPixelContext);
+      ltp ^= sltp;
 
-        if (pad !== 16) {
-          s = s.padEnd(16 * Math.ceil(strLen / 16), String.fromCharCode(pad));
-        }
+      if (ltp) {
+        throw new Jbig2Error("prediction is not supported");
+      }
+    }
+
+    const row = new Uint8Array(width);
+    bitmap.push(row);
 
-        const iv = new Uint8Array(16);
+    for (let j = 0; j < width; j++) {
+      let i0, j0;
+      let contextLabel = 0;
 
-        if (typeof crypto !== "undefined") {
-          crypto.getRandomValues(iv);
+      for (k = 0; k < codingTemplateLength; k++) {
+        i0 = i + codingTemplateY[k];
+        j0 = j + codingTemplateX[k];
+
+        if (i0 < 0 || j0 < 0 || j0 >= width) {
+          contextLabel <<= 1;
         } else {
-          for (let i = 0; i < 16; i++) {
-            iv[i] = Math.floor(256 * Math.random());
-          }
+          contextLabel = contextLabel << 1 | bitmap[i0][j0];
         }
-
-        let data = (0, _util.stringToBytes)(s);
-        data = cipher.encrypt(data, iv);
-        const buf = new Uint8Array(16 + data.length);
-        buf.set(iv);
-        buf.set(data, 16);
-        return (0, _util.bytesToString)(buf);
       }
 
-      let data = (0, _util.stringToBytes)(s);
-      data = cipher.encrypt(data);
-      return (0, _util.bytesToString)(data);
-    }
-  };
-  return CipherTransform;
-}();
+      for (k = 0; k < referenceTemplateLength; k++) {
+        i0 = i + referenceTemplateY[k] - offsetY;
+        j0 = j + referenceTemplateX[k] - offsetX;
 
-var CipherTransformFactory = function CipherTransformFactoryClosure() {
-  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 
0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 
0x64, 0x53, 0x69, 0x7A]);
+        if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
+          contextLabel <<= 1;
+        } else {
+          contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
+        }
+      }
 
-  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, 
uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
-    if (password) {
-      var passwordLength = Math.min(127, password.length);
-      password = password.subarray(0, passwordLength);
-    } else {
-      password = [];
+      const pixel = decoder.readBit(contexts, contextLabel);
+      row[j] = pixel;
     }
+  }
 
-    var pdfAlgorithm;
+  return bitmap;
+}
 
-    if (revision === 6) {
-      pdfAlgorithm = new PDF20();
-    } else {
-      pdfAlgorithm = new PDF17();
-    }
+function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, 
huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
+  if (huffman && refinement) {
+    throw new Jbig2Error("symbol refinement with Huffman is not supported");
+  }
 
-    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
-      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
-    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, 
ownerPassword)) {
-      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
-    }
+  const newSymbols = [];
+  let currentHeight = 0;
+  let symbolCodeLength = (0, _core_utils.log2)(symbols.length + numberOfNewSymbols);
+  const decoder = decodingContext.decoder;
+  const contextCache = decodingContext.contextCache;
+  let tableB1, symbolWidths;
 
-    return null;
+  if (huffman) {
+    tableB1 = getStandardTable(1);
+    symbolWidths = [];
+    symbolCodeLength = Math.max(symbolCodeLength, 1);
   }
 
-  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, 
encryptMetadata) {
-    var hashDataSize = 40 + ownerPassword.length + fileId.length;
-    var hashData = new Uint8Array(hashDataSize),
-        i = 0,
-        j,
-        n;
+  while (newSymbols.length < numberOfNewSymbols) {
+    const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : 
decodeInteger(contextCache, "IADH", decoder);
+    currentHeight += deltaHeight;
+    let currentWidth = 0,
+        totalWidth = 0;
+    const firstSymbol = huffman ? symbolWidths.length : 0;
 
-    if (password) {
-      n = Math.min(32, password.length);
+    while (true) {
+      const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : 
decodeInteger(contextCache, "IADW", decoder);
 
-      for (; i < n; ++i) {
-        hashData[i] = password[i];
+      if (deltaWidth === null) {
+        break;
       }
-    }
-
-    j = 0;
-
-    while (i < 32) {
-      hashData[i++] = defaultPasswordBytes[j++];
-    }
-
-    for (j = 0, n = ownerPassword.length; j < n; ++j) {
-      hashData[i++] = ownerPassword[j];
-    }
-
-    hashData[i++] = flags & 0xff;
-    hashData[i++] = flags >> 8 & 0xff;
-    hashData[i++] = flags >> 16 & 0xff;
-    hashData[i++] = flags >>> 24 & 0xff;
 
-    for (j = 0, n = fileId.length; j < n; ++j) {
-      hashData[i++] = fileId[j];
-    }
+      currentWidth += deltaWidth;
+      totalWidth += currentWidth;
+      let bitmap;
 
-    if (revision >= 4 && !encryptMetadata) {
-      hashData[i++] = 0xff;
-      hashData[i++] = 0xff;
-      hashData[i++] = 0xff;
-      hashData[i++] = 0xff;
-    }
+      if (refinement) {
+        const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder);
 
-    var hash = calculateMD5(hashData, 0, i);
-    var keyLengthInBytes = keyLength >> 3;
+        if (numberOfInstances > 1) {
+          bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 
1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, 
refinementAt, decodingContext, 0, huffmanInput);
+        } else {
+          const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+          const rdx = decodeInteger(contextCache, "IARDX", decoder);
+          const rdy = decodeInteger(contextCache, "IARDY", decoder);
+          const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - 
symbols.length];
+          bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, 
false, refinementAt, decodingContext);
+        }
 
-    if (revision >= 3) {
-      for (j = 0; j < 50; ++j) {
-        hash = calculateMD5(hash, 0, keyLengthInBytes);
+        newSymbols.push(bitmap);
+      } else if (huffman) {
+        symbolWidths.push(currentWidth);
+      } else {
+        bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, 
decodingContext);
+        newSymbols.push(bitmap);
       }
     }
 
-    var encryptionKey = hash.subarray(0, keyLengthInBytes);
-    var cipher, checkData;
+    if (huffman && !refinement) {
+      const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
+      huffmanInput.byteAlign();
+      let collectiveBitmap;
 
-    if (revision >= 3) {
-      for (i = 0; i < 32; ++i) {
-        hashData[i] = defaultPasswordBytes[i];
+      if (bitmapSize === 0) {
+        collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
+      } else {
+        const originalEnd = huffmanInput.end;
+        const bitmapEnd = huffmanInput.position + bitmapSize;
+        huffmanInput.end = bitmapEnd;
+        collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);
+        huffmanInput.end = originalEnd;
+        huffmanInput.position = bitmapEnd;
       }
 
-      for (j = 0, n = fileId.length; j < n; ++j) {
-        hashData[i++] = fileId[j];
-      }
+      const numberOfSymbolsDecoded = symbolWidths.length;
 
-      cipher = new ARCFourCipher(encryptionKey);
-      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
-      n = encryptionKey.length;
-      var derivedKey = new Uint8Array(n),
-          k;
+      if (firstSymbol === numberOfSymbolsDecoded - 1) {
+        newSymbols.push(collectiveBitmap);
+      } else {
+        let i,
+            y,
+            xMin = 0,
+            xMax,
+            bitmapWidth,
+            symbolBitmap;
+
+        for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) {
+          bitmapWidth = symbolWidths[i];
+          xMax = xMin + bitmapWidth;
+          symbolBitmap = [];
+
+          for (y = 0; y < currentHeight; y++) {
+            symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
+          }
 
-      for (j = 1; j <= 19; ++j) {
-        for (k = 0; k < n; ++k) {
-          derivedKey[k] = encryptionKey[k] ^ j;
+          newSymbols.push(symbolBitmap);
+          xMin = xMax;
         }
-
-        cipher = new ARCFourCipher(derivedKey);
-        checkData = cipher.encryptBlock(checkData);
       }
+    }
+  }
 
-      for (j = 0, n = checkData.length; j < n; ++j) {
-        if (userPassword[j] !== checkData[j]) {
-          return null;
-        }
-      }
-    } else {
-      cipher = new ARCFourCipher(encryptionKey);
-      checkData = cipher.encryptBlock(defaultPasswordBytes);
+  const exportedSymbols = [],
+        flags = [];
+  let currentFlag = false,
+      i,
+      ii;
+  const totalSymbolsLength = symbols.length + numberOfNewSymbols;
 
-      for (j = 0, n = checkData.length; j < n; ++j) {
-        if (userPassword[j] !== checkData[j]) {
-          return null;
-        }
-      }
+  while (flags.length < totalSymbolsLength) {
+    let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder);
+
+    while (runLength--) {
+      flags.push(currentFlag);
     }
 
-    return encryptionKey;
+    currentFlag = !currentFlag;
   }
 
-  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
-    var hashData = new Uint8Array(32),
-        i = 0,
-        j,
-        n;
-    n = Math.min(32, password.length);
+  for (i = 0, ii = symbols.length; i < ii; i++) {
+    if (flags[i]) {
+      exportedSymbols.push(symbols[i]);
+    }
+  }
 
-    for (; i < n; ++i) {
-      hashData[i] = password[i];
+  for (let j = 0; j < numberOfNewSymbols; i++, j++) {
+    if (flags[i]) {
+      exportedSymbols.push(newSymbols[j]);
     }
+  }
 
-    j = 0;
+  return exportedSymbols;
+}
 
-    while (i < 32) {
-      hashData[i++] = defaultPasswordBytes[j++];
-    }
+function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, 
stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, 
huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
+  if (huffman && refinement) {
+    throw new Jbig2Error("refinement with Huffman is not supported");
+  }
 
-    var hash = calculateMD5(hashData, 0, i);
-    var keyLengthInBytes = keyLength >> 3;
+  const bitmap = [];
+  let i, row;
 
-    if (revision >= 3) {
-      for (j = 0; j < 50; ++j) {
-        hash = calculateMD5(hash, 0, hash.length);
+  for (i = 0; i < height; i++) {
+    row = new Uint8Array(width);
+
+    if (defaultPixelValue) {
+      for (let j = 0; j < width; j++) {
+        row[j] = defaultPixelValue;
       }
     }
 
-    var cipher, userPassword;
+    bitmap.push(row);
+  }
 
-    if (revision >= 3) {
-      userPassword = ownerPassword;
-      var derivedKey = new Uint8Array(keyLengthInBytes),
-          k;
+  const decoder = decodingContext.decoder;
+  const contextCache = decodingContext.contextCache;
+  let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, 
"IADT", decoder);
+  let firstS = 0;
+  i = 0;
 
-      for (j = 19; j >= 0; j--) {
-        for (k = 0; k < keyLengthInBytes; ++k) {
-          derivedKey[k] = hash[k] ^ j;
-        }
+  while (i < numberOfSymbolInstances) {
+    const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, 
"IADT", decoder);
+    stripT += deltaT;
+    const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : 
decodeInteger(contextCache, "IAFS", decoder);
+    firstS += deltaFirstS;
+    let currentS = firstS;
 
-        cipher = new ARCFourCipher(derivedKey);
-        userPassword = cipher.encryptBlock(userPassword);
+    do {
+      let currentT = 0;
+
+      if (stripSize > 1) {
+        currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", 
decoder);
       }
-    } else {
-      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
-      userPassword = cipher.encryptBlock(ownerPassword);
-    }
 
-    return userPassword;
-  }
+      const t = stripSize * stripT + currentT;
+      const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, 
decoder, symbolCodeLength);
+      const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, 
"IARI", decoder));
+      let symbolBitmap = inputSymbols[symbolId];
+      let symbolWidth = symbolBitmap[0].length;
+      let symbolHeight = symbolBitmap.length;
 
-  var identityName = _primitives.Name.get("Identity");
+      if (applyRefinement) {
+        const rdw = decodeInteger(contextCache, "IARDW", decoder);
+        const rdh = decodeInteger(contextCache, "IARDH", decoder);
+        const rdx = decodeInteger(contextCache, "IARDX", decoder);
+        const rdy = decodeInteger(contextCache, "IARDY", decoder);
+        symbolWidth += rdw;
+        symbolHeight += rdh;
+        symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, 
(rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
+      }
 
-  function CipherTransformFactory(dict, fileId, password) {
-    var filter = dict.get("Filter");
+      const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
+      const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
+      let s2, t2, symbolRow;
 
-    if (!(0, _primitives.isName)(filter, "Standard")) {
-      throw new _util.FormatError("unknown encryption method");
-    }
+      if (transposed) {
+        for (s2 = 0; s2 < symbolHeight; s2++) {
+          row = bitmap[offsetS + s2];
 
-    this.dict = dict;
-    var algorithm = dict.get("V");
+          if (!row) {
+            continue;
+          }
 
-    if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm 
!== 5) {
-      throw new _util.FormatError("unsupported encryption algorithm");
-    }
+          symbolRow = symbolBitmap[s2];
+          const maxWidth = Math.min(width - offsetT, symbolWidth);
 
-    this.algorithm = algorithm;
-    var keyLength = dict.get("Length");
+          switch (combinationOperator) {
+            case 0:
+              for (t2 = 0; t2 < maxWidth; t2++) {
+                row[offsetT + t2] |= symbolRow[t2];
+              }
 
-    if (!keyLength) {
-      if (algorithm <= 3) {
-        keyLength = 40;
-      } else {
-        var cfDict = dict.get("CF");
-        var streamCryptoName = dict.get("StmF");
+              break;
 
-        if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {
-          cfDict.suppressEncryption = true;
-          var handlerDict = cfDict.get(streamCryptoName.name);
-          keyLength = handlerDict && handlerDict.get("Length") || 128;
+            case 2:
+              for (t2 = 0; t2 < maxWidth; t2++) {
+                row[offsetT + t2] ^= symbolRow[t2];
+              }
+
+              break;
 
-          if (keyLength < 40) {
-            keyLength <<= 3;
+            default:
+              throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
           }
         }
-      }
-    }
 
-    if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
-      throw new _util.FormatError("invalid key length");
-    }
+        currentS += symbolHeight - 1;
+      } else {
+        for (t2 = 0; t2 < symbolHeight; t2++) {
+          row = bitmap[offsetT + t2];
 
-    var ownerPassword = (0, _util.stringToBytes)(dict.get("O")).subarray(0, 32);
-    var userPassword = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 32);
-    var flags = dict.get("P");
-    var revision = dict.get("R");
-    var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false;
-    this.encryptMetadata = encryptMetadata;
-    var fileIdBytes = (0, _util.stringToBytes)(fileId);
-    var passwordBytes;
+          if (!row) {
+            continue;
+          }
 
-    if (password) {
-      if (revision === 6) {
-        try {
-          password = (0, _util.utf8StringToString)(password);
-        } catch (ex) {
-          (0, _util.warn)("CipherTransformFactory: " + "Unable to convert UTF8 encoded password.");
-        }
-      }
+          symbolRow = symbolBitmap[t2];
 
-      passwordBytes = (0, _util.stringToBytes)(password);
-    }
+          switch (combinationOperator) {
+            case 0:
+              for (s2 = 0; s2 < symbolWidth; s2++) {
+                row[offsetS + s2] |= symbolRow[s2];
+              }
 
-    var encryptionKey;
+              break;
 
-    if (algorithm !== 5) {
-      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, 
revision, keyLength, encryptMetadata);
-    } else {
-      var ownerValidationSalt = (0, _util.stringToBytes)(dict.get("O")).subarray(32, 40);
-      var ownerKeySalt = (0, _util.stringToBytes)(dict.get("O")).subarray(40, 48);
-      var uBytes = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 48);
-      var userValidationSalt = (0, _util.stringToBytes)(dict.get("U")).subarray(32, 40);
-      var userKeySalt = (0, _util.stringToBytes)(dict.get("U")).subarray(40, 48);
-      var ownerEncryption = (0, _util.stringToBytes)(dict.get("OE"));
-      var userEncryption = (0, _util.stringToBytes)(dict.get("UE"));
-      var perms = (0, _util.stringToBytes)(dict.get("Perms"));
-      encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, 
ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
-    }
+            case 2:
+              for (s2 = 0; s2 < symbolWidth; s2++) {
+                row[offsetS + s2] ^= symbolRow[s2];
+              }
 
-    if (!encryptionKey && !password) {
-      throw new _util.PasswordException("No password given", _util.PasswordResponses.NEED_PASSWORD);
-    } else if (!encryptionKey && password) {
-      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
-      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, 
revision, keyLength, encryptMetadata);
-    }
+              break;
 
-    if (!encryptionKey) {
-      throw new _util.PasswordException("Incorrect Password", _util.PasswordResponses.INCORRECT_PASSWORD);
-    }
+            default:
+              throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
+          }
+        }
 
-    this.encryptionKey = encryptionKey;
+        currentS += symbolWidth - 1;
+      }
 
-    if (algorithm >= 4) {
-      var cf = dict.get("CF");
+      i++;
+      const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, 
"IADS", decoder);
 
-      if ((0, _primitives.isDict)(cf)) {
-        cf.suppressEncryption = true;
+      if (deltaS === null) {
+        break;
       }
 
-      this.cf = cf;
-      this.stmf = dict.get("StmF") || identityName;
-      this.strf = dict.get("StrF") || identityName;
-      this.eff = dict.get("EFF") || this.stmf;
-    }
+      currentS += deltaS + dsOffset;
+    } while (true);
   }
 
-  function buildObjectKey(num, gen, encryptionKey, isAes) {
-    var key = new Uint8Array(encryptionKey.length + 9),
-        i,
-        n;
+  return bitmap;
+}
 
-    for (i = 0, n = encryptionKey.length; i < n; ++i) {
-      key[i] = encryptionKey[i];
+function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, 
decodingContext) {
+  const at = [];
+
+  if (!mmr) {
+    at.push({
+      x: -patternWidth,
+      y: 0
+    });
+
+    if (template === 0) {
+      at.push({
+        x: -3,
+        y: -1
+      }, {
+        x: 2,
+        y: -2
+      }, {
+        x: -2,
+        y: -2
+      });
     }
+  }
 
-    key[i++] = num & 0xff;
-    key[i++] = num >> 8 & 0xff;
-    key[i++] = num >> 16 & 0xff;
-    key[i++] = gen & 0xff;
-    key[i++] = gen >> 8 & 0xff;
+  const collectiveWidth = (maxPatternIndex + 1) * patternWidth;
+  const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, 
decodingContext);
+  const patterns = [];
 
-    if (isAes) {
-      key[i++] = 0x73;
-      key[i++] = 0x41;
-      key[i++] = 0x6c;
-      key[i++] = 0x54;
+  for (let i = 0; i <= maxPatternIndex; i++) {
+    const patternBitmap = [];
+    const xMin = patternWidth * i;
+    const xMax = xMin + patternWidth;
+
+    for (let y = 0; y < patternHeight; y++) {
+      patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
     }
 
-    var hash = calculateMD5(key, 0, i);
-    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+    patterns.push(patternBitmap);
   }
 
-  function buildCipherConstructor(cf, name, num, gen, key) {
-    if (!(0, _primitives.isName)(name)) {
-      throw new _util.FormatError("Invalid crypt filter name.");
-    }
+  return patterns;
+}
 
-    var cryptFilter = cf.get(name.name);
-    var cfm;
+function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, 
enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, 
decodingContext) {
+  const skip = null;
 
-    if (cryptFilter !== null && cryptFilter !== undefined) {
-      cfm = cryptFilter.get("CFM");
-    }
+  if (enableSkip) {
+    throw new Jbig2Error("skip is not supported");
+  }
 
-    if (!cfm || cfm.name === "None") {
-      return function cipherTransformFactoryBuildCipherConstructorNone() {
-        return new NullCipher();
-      };
-    }
+  if (combinationOperator !== 0) {
+    throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`);
+  }
 
-    if (cfm.name === "V2") {
-      return function cipherTransformFactoryBuildCipherConstructorV2() {
-        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
-      };
-    }
+  const regionBitmap = [];
+  let i, j, row;
 
-    if (cfm.name === "AESV2") {
-      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
-        return new AES128Cipher(buildObjectKey(num, gen, key, true));
-      };
-    }
+  for (i = 0; i < regionHeight; i++) {
+    row = new Uint8Array(regionWidth);
 
-    if (cfm.name === "AESV3") {
-      return function cipherTransformFactoryBuildCipherConstructorAESV3() {
-        return new AES256Cipher(key);
-      };
+    if (defaultPixelValue) {
+      for (j = 0; j < regionWidth; j++) {
+        row[j] = defaultPixelValue;
+      }
     }
 
-    throw new _util.FormatError("Unknown crypto method");
+    regionBitmap.push(row);
   }
 
-  CipherTransformFactory.prototype = {
-    createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {
-      if (this.algorithm === 4 || this.algorithm === 5) {
-        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), 
buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));
-      }
+  const numberOfPatterns = patterns.length;
+  const pattern0 = patterns[0];
+  const patternWidth = pattern0[0].length,
+        patternHeight = pattern0.length;
+  const bitsPerValue = (0, _core_utils.log2)(numberOfPatterns);
+  const at = [];
 
-      var key = buildObjectKey(num, gen, this.encryptionKey, false);
+  if (!mmr) {
+    at.push({
+      x: template <= 1 ? 3 : 2,
+      y: -1
+    });
 
-      var cipherConstructor = function buildCipherCipherConstructor() {
-        return new ARCFourCipher(key);
-      };
+    if (template === 0) {
+      at.push({
+        x: -3,
+        y: -1
+      }, {
+        x: 2,
+        y: -2
+      }, {
+        x: -2,
+        y: -2
+      });
+    }
+  }
 
-      return new CipherTransform(cipherConstructor, cipherConstructor);
+  const grayScaleBitPlanes = [];
+  let mmrInput, bitmap;
+
+  if (mmr) {
+    mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
+  }
+
+  for (i = bitsPerValue - 1; i >= 0; i--) {
+    if (mmr) {
+      bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
+    } else {
+      bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
     }
-  };
-  return CipherTransformFactory;
-}();
 
-exports.CipherTransformFactory = CipherTransformFactory;
+    grayScaleBitPlanes[i] = bitmap;
+  }
 
-/***/ }),
-/* 23 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+  let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;
 
-"use strict";
+  for (mg = 0; mg < gridHeight; mg++) {
+    for (ng = 0; ng < gridWidth; ng++) {
+      bit = 0;
+      patternIndex = 0;
 
+      for (j = bitsPerValue - 1; j >= 0; j--) {
+        bit ^= grayScaleBitPlanes[j][mg][ng];
+        patternIndex |= bit << j;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ColorSpace = void 0;
+      patternBitmap = patterns[patternIndex];
+      x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
+      y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;
 
-var _util = __w_pdfjs_require__(2);
+      if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
+        for (i = 0; i < patternHeight; i++) {
+          regionRow = regionBitmap[y + i];
+          patternRow = patternBitmap[i];
 
-var _primitives = __w_pdfjs_require__(5);
+          for (j = 0; j < patternWidth; j++) {
+            regionRow[x + j] |= patternRow[j];
+          }
+        }
+      } else {
+        let regionX, regionY;
 
-var _core_utils = __w_pdfjs_require__(8);
+        for (i = 0; i < patternHeight; i++) {
+          regionY = y + i;
 
-function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
-  const COMPONENTS = 3;
-  alpha01 = alpha01 !== 1 ? 0 : alpha01;
-  const xRatio = w1 / w2;
-  const yRatio = h1 / h2;
-  let newIndex = 0,
-      oldIndex;
-  const xScaled = new Uint16Array(w2);
-  const w1Scanline = w1 * COMPONENTS;
+          if (regionY < 0 || regionY >= regionHeight) {
+            continue;
+          }
 
-  for (let i = 0; i < w2; i++) {
-    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
-  }
+          regionRow = regionBitmap[regionY];
+          patternRow = patternBitmap[i];
 
-  for (let i = 0; i < h2; i++) {
-    const py = Math.floor(i * yRatio) * w1Scanline;
+          for (j = 0; j < patternWidth; j++) {
+            regionX = x + j;
 
-    for (let j = 0; j < w2; j++) {
-      oldIndex = py + xScaled[j];
-      dest[newIndex++] = src[oldIndex++];
-      dest[newIndex++] = src[oldIndex++];
-      dest[newIndex++] = src[oldIndex++];
-      newIndex += alpha01;
+            if (regionX >= 0 && regionX < regionWidth) {
+              regionRow[regionX] |= patternRow[j];
+            }
+          }
+        }
+      }
     }
   }
+
+  return regionBitmap;
 }
 
-class ColorSpace {
-  constructor(name, numComps) {
-    if (this.constructor === ColorSpace) {
-      (0, _util.unreachable)("Cannot initialize ColorSpace.");
-    }
+function readSegmentHeader(data, start) {
+  const segmentHeader = {};
+  segmentHeader.number = (0, _core_utils.readUint32)(data, start);
+  const flags = data[start + 4];
+  const segmentType = flags & 0x3f;
 
-    this.name = name;
-    this.numComps = numComps;
+  if (!SegmentTypes[segmentType]) {
+    throw new Jbig2Error("invalid segment type: " + segmentType);
   }
 
-  getRgb(src, srcOffset) {
-    const rgb = new Uint8ClampedArray(3);
-    this.getRgbItem(src, srcOffset, rgb, 0);
-    return rgb;
-  }
+  segmentHeader.type = segmentType;
+  segmentHeader.typeName = SegmentTypes[segmentType];
+  segmentHeader.deferredNonRetain = !!(flags & 0x80);
+  const pageAssociationFieldSize = !!(flags & 0x40);
+  const referredFlags = data[start + 5];
+  let referredToCount = referredFlags >> 5 & 7;
+  const retainBits = [referredFlags & 31];
+  let position = start + 6;
 
-  getRgbItem(src, srcOffset, dest, destOffset) {
-    (0, _util.unreachable)("Should not call ColorSpace.getRgbItem");
-  }
+  if (referredFlags === 7) {
+    referredToCount = (0, _core_utils.readUint32)(data, position - 1) & 0x1fffffff;
+    position += 3;
+    let bytes = referredToCount + 7 >> 3;
+    retainBits[0] = data[position++];
 
-  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-    (0, _util.unreachable)("Should not call ColorSpace.getRgbBuffer");
+    while (--bytes > 0) {
+      retainBits.push(data[position++]);
+    }
+  } else if (referredFlags === 5 || referredFlags === 6) {
+    throw new Jbig2Error("invalid referred-to flags");
   }
 
-  getOutputLength(inputLength, alpha01) {
-    (0, _util.unreachable)("Should not call ColorSpace.getOutputLength");
+  segmentHeader.retainBits = retainBits;
+  let referredToSegmentNumberSize = 4;
+
+  if (segmentHeader.number <= 256) {
+    referredToSegmentNumberSize = 1;
+  } else if (segmentHeader.number <= 65536) {
+    referredToSegmentNumberSize = 2;
   }
 
-  isPassthrough(bits) {
-    return false;
+  const referredTo = [];
+  let i, ii;
+
+  for (i = 0; i < referredToCount; i++) {
+    let number;
+
+    if (referredToSegmentNumberSize === 1) {
+      number = data[position];
+    } else if (referredToSegmentNumberSize === 2) {
+      number = (0, _core_utils.readUint16)(data, position);
+    } else {
+      number = (0, _core_utils.readUint32)(data, position);
+    }
+
+    referredTo.push(number);
+    position += referredToSegmentNumberSize;
   }
 
-  isDefaultDecode(decodeMap, bpc) {
-    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+  segmentHeader.referredTo = referredTo;
+
+  if (!pageAssociationFieldSize) {
+    segmentHeader.pageAssociation = data[position++];
+  } else {
+    segmentHeader.pageAssociation = (0, _core_utils.readUint32)(data, position);
+    position += 4;
   }
 
-  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
-    const count = originalWidth * originalHeight;
-    let rgbBuf = null;
-    const numComponentColors = 1 << bpc;
-    const needsResizing = originalHeight !== height || originalWidth !== width;
+  segmentHeader.length = (0, _core_utils.readUint32)(data, position);
+  position += 4;
 
-    if (this.isPassthrough(bpc)) {
-      rgbBuf = comps;
-    } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name 
!== "DeviceRGB") {
-      const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);
+  if (segmentHeader.length === 0xffffffff) {
+    if (segmentType === 38) {
+      const genericRegionInfo = readRegionSegmentInformation(data, position);
+      const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];
+      const genericRegionMmr = !!(genericRegionSegmentFlags & 1);
+      const searchPatternLength = 6;
+      const searchPattern = new Uint8Array(searchPatternLength);
 
-      for (let i = 0; i < numComponentColors; i++) {
-        allColors[i] = i;
+      if (!genericRegionMmr) {
+        searchPattern[0] = 0xff;
+        searchPattern[1] = 0xac;
       }
 
-      const colorMap = new Uint8ClampedArray(numComponentColors * 3);
-      this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);
+      searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff;
+      searchPattern[3] = genericRegionInfo.height >> 16 & 0xff;
+      searchPattern[4] = genericRegionInfo.height >> 8 & 0xff;
+      searchPattern[5] = genericRegionInfo.height & 0xff;
 
-      if (!needsResizing) {
-        let destPos = 0;
+      for (i = position, ii = data.length; i < ii; i++) {
+        let j = 0;
 
-        for (let i = 0; i < count; ++i) {
-          const key = comps[i] * 3;
-          dest[destPos++] = colorMap[key];
-          dest[destPos++] = colorMap[key + 1];
-          dest[destPos++] = colorMap[key + 2];
-          destPos += alpha01;
+        while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
+          j++;
         }
-      } else {
-        rgbBuf = new Uint8Array(count * 3);
-        let rgbPos = 0;
 
-        for (let i = 0; i < count; ++i) {
-          const key = comps[i] * 3;
-          rgbBuf[rgbPos++] = colorMap[key];
-          rgbBuf[rgbPos++] = colorMap[key + 1];
-          rgbBuf[rgbPos++] = colorMap[key + 2];
+        if (j === searchPatternLength) {
+          segmentHeader.length = i + searchPatternLength;
+          break;
         }
       }
-    } else {
-      if (!needsResizing) {
-        this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
-      } else {
-        rgbBuf = new Uint8ClampedArray(count * 3);
-        this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
-      }
-    }
-
-    if (rgbBuf) {
-      if (needsResizing) {
-        resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
-      } else {
-        let destPos = 0,
-            rgbPos = 0;
 
-        for (let i = 0, ii = width * actualHeight; i < ii; i++) {
-          dest[destPos++] = rgbBuf[rgbPos++];
-          dest[destPos++] = rgbBuf[rgbPos++];
-          dest[destPos++] = rgbBuf[rgbPos++];
-          destPos += alpha01;
-        }
+      if (segmentHeader.length === 0xffffffff) {
+        throw new Jbig2Error("segment end was not found");
       }
+    } else {
+      throw new Jbig2Error("invalid unknown segment length");
     }
   }
 
-  get usesZeroToOneRange() {
-    return (0, _util.shadow)(this, "usesZeroToOneRange", true);
-  }
-
-  static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) {
-    if (!localColorSpaceCache) {
-      throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.');
-    }
+  segmentHeader.headerEnd = position;
+  return segmentHeader;
+}
 
-    if (!parsedColorSpace) {
-      throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.');
-    }
+function readSegments(header, data, start, end) {
+  const segments = [];
+  let position = start;
 
-    let csName, csRef;
+  while (position < end) {
+    const segmentHeader = readSegmentHeader(data, position);
+    position = segmentHeader.headerEnd;
+    const segment = {
+      header: segmentHeader,
+      data
+    };
 
-    if (cacheKey instanceof _primitives.Ref) {
-      csRef = cacheKey;
-      cacheKey = xref.fetch(cacheKey);
+    if (!header.randomAccess) {
+      segment.start = position;
+      position += segmentHeader.length;
+      segment.end = position;
     }
 
-    if (cacheKey instanceof _primitives.Name) {
-      csName = cacheKey.name;
-    }
+    segments.push(segment);
 
-    if (csName || csRef) {
-      localColorSpaceCache.set(csName, csRef, parsedColorSpace);
+    if (segmentHeader.type === 51) {
+      break;
     }
   }
 
-  static getCached(cacheKey, xref, localColorSpaceCache) {
-    if (!localColorSpaceCache) {
-      throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.');
+  if (header.randomAccess) {
+    for (let i = 0, ii = segments.length; i < ii; i++) {
+      segments[i].start = position;
+      position += segments[i].header.length;
+      segments[i].end = position;
     }
+  }
 
-    if (cacheKey instanceof _primitives.Ref) {
-      const localColorSpace = localColorSpaceCache.getByRef(cacheKey);
+  return segments;
+}
 
-      if (localColorSpace) {
-        return localColorSpace;
-      }
+function readRegionSegmentInformation(data, start) {
+  return {
+    width: (0, _core_utils.readUint32)(data, start),
+    height: (0, _core_utils.readUint32)(data, start + 4),
+    x: (0, _core_utils.readUint32)(data, start + 8),
+    y: (0, _core_utils.readUint32)(data, start + 12),
+    combinationOperator: data[start + 16] & 7
+  };
+}
 
-      try {
-        cacheKey = xref.fetch(cacheKey);
-      } catch (ex) {
-        if (ex instanceof _core_utils.MissingDataException) {
-          throw ex;
-        }
-      }
-    }
+const RegionSegmentInformationFieldLength = 17;
 
-    if (cacheKey instanceof _primitives.Name) {
-      const localColorSpace = localColorSpaceCache.getByName(cacheKey.name);
+function processSegment(segment, visitor) {
+  const header = segment.header;
+  const data = segment.data,
+        end = segment.end;
+  let position = segment.start;
+  let args, at, i, atLength;
+
+  switch (header.type) {
+    case 0:
+      const dictionary = {};
+      const dictionaryFlags = (0, _core_utils.readUint16)(data, position);
+      dictionary.huffman = !!(dictionaryFlags & 1);
+      dictionary.refinement = !!(dictionaryFlags & 2);
+      dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;
+      dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;
+      dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;
+      dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;
+      dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
+      dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
+      dictionary.template = dictionaryFlags >> 10 & 3;
+      dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
+      position += 2;
+
+      if (!dictionary.huffman) {
+        atLength = dictionary.template === 0 ? 4 : 1;
+        at = [];
+
+        for (i = 0; i < atLength; i++) {
+          at.push({
+            x: (0, _core_utils.readInt8)(data, position),
+            y: (0, _core_utils.readInt8)(data, position + 1)
+          });
+          position += 2;
+        }
 
-      if (localColorSpace) {
-        return localColorSpace;
+        dictionary.at = at;
       }
-    }
-
-    return null;
-  }
-
-  static async parseAsync({
-    cs,
-    xref,
-    resources = null,
-    pdfFunctionFactory,
-    localColorSpaceCache
-  }) {
-    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
-
-    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
-
-    return parsedColorSpace;
-  }
-
-  static parse({
-    cs,
-    xref,
-    resources = null,
-    pdfFunctionFactory,
-    localColorSpaceCache
-  }) {
-    const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache);
 
-    if (cachedColorSpace) {
-      return cachedColorSpace;
-    }
+      if (dictionary.refinement && !dictionary.refinementTemplate) {
+        at = [];
 
-    const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
+        for (i = 0; i < 2; i++) {
+          at.push({
+            x: (0, _core_utils.readInt8)(data, position),
+            y: (0, _core_utils.readInt8)(data, position + 1)
+          });
+          position += 2;
+        }
 
-    this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
+        dictionary.refinementAt = at;
+      }
 
-    return parsedColorSpace;
-  }
+      dictionary.numberOfExportedSymbols = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      dictionary.numberOfNewSymbols = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      args = [dictionary, header.number, header.referredTo, data, position, end];
+      break;
 
-  static _parse(cs, xref, resources = null, pdfFunctionFactory) {
-    cs = xref.fetchIfRef(cs);
+    case 6:
+    case 7:
+      const textRegion = {};
+      textRegion.info = readRegionSegmentInformation(data, position);
+      position += RegionSegmentInformationFieldLength;
+      const textRegionSegmentFlags = (0, _core_utils.readUint16)(data, position);
+      position += 2;
+      textRegion.huffman = !!(textRegionSegmentFlags & 1);
+      textRegion.refinement = !!(textRegionSegmentFlags & 2);
+      textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;
+      textRegion.stripSize = 1 << textRegion.logStripSize;
+      textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;
+      textRegion.transposed = !!(textRegionSegmentFlags & 64);
+      textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;
+      textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
+      textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
+      textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;
+
+      if (textRegion.huffman) {
+        const textRegionHuffmanFlags = (0, _core_utils.readUint16)(data, position);
+        position += 2;
+        textRegion.huffmanFS = textRegionHuffmanFlags & 3;
+        textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;
+        textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;
+        textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;
+        textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;
+        textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;
+        textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
+        textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
+      }
+
+      if (textRegion.refinement && !textRegion.refinementTemplate) {
+        at = [];
+
+        for (i = 0; i < 2; i++) {
+          at.push({
+            x: (0, _core_utils.readInt8)(data, position),
+            y: (0, _core_utils.readInt8)(data, position + 1)
+          });
+          position += 2;
+        }
 
-    if ((0, _primitives.isName)(cs)) {
-      switch (cs.name) {
-        case "DeviceGray":
-        case "G":
-          return this.singletons.gray;
+        textRegion.refinementAt = at;
+      }
 
-        case "DeviceRGB":
-        case "RGB":
-          return this.singletons.rgb;
+      textRegion.numberOfSymbolInstances = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      args = [textRegion, header.referredTo, data, position, end];
+      break;
 
-        case "DeviceCMYK":
-        case "CMYK":
-          return this.singletons.cmyk;
+    case 16:
+      const patternDictionary = {};
+      const patternDictionaryFlags = data[position++];
+      patternDictionary.mmr = !!(patternDictionaryFlags & 1);
+      patternDictionary.template = patternDictionaryFlags >> 1 & 3;
+      patternDictionary.patternWidth = data[position++];
+      patternDictionary.patternHeight = data[position++];
+      patternDictionary.maxPatternIndex = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      args = [patternDictionary, header.number, data, position, end];
+      break;
 
-        case "Pattern":
-          return new PatternCS(null);
+    case 22:
+    case 23:
+      const halftoneRegion = {};
+      halftoneRegion.info = readRegionSegmentInformation(data, position);
+      position += RegionSegmentInformationFieldLength;
+      const halftoneRegionFlags = data[position++];
+      halftoneRegion.mmr = !!(halftoneRegionFlags & 1);
+      halftoneRegion.template = halftoneRegionFlags >> 1 & 3;
+      halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);
+      halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;
+      halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;
+      halftoneRegion.gridWidth = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      halftoneRegion.gridHeight = (0, _core_utils.readUint32)(data, position);
+      position += 4;
+      halftoneRegion.gridOffsetX = (0, _core_utils.readUint32)(data, position) & 0xffffffff;
+      position += 4;
+      halftoneRegion.gridOffsetY = (0, _core_utils.readUint32)(data, position) & 0xffffffff;
+      position += 4;
+      halftoneRegion.gridVectorX = (0, _core_utils.readUint16)(data, position);
+      position += 2;
+      halftoneRegion.gridVectorY = (0, _core_utils.readUint16)(data, position);
+      position += 2;
+      args = [halftoneRegion, header.referredTo, data, position, end];
+      break;
 
-        default:
-          if ((0, _primitives.isDict)(resources)) {
-            const colorSpaces = resources.get("ColorSpace");
+    case 38:
+    case 39:
+      const genericRegion = {};
+      genericRegion.info = readRegionSegmentInformation(data, position);
+      position += RegionSegmentInformationFieldLength;
+      const genericRegionSegmentFlags = data[position++];
+      genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
+      genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
+      genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
+
+      if (!genericRegion.mmr) {
+        atLength = genericRegion.template === 0 ? 4 : 1;
+        at = [];
+
+        for (i = 0; i < atLength; i++) {
+          at.push({
+            x: (0, _core_utils.readInt8)(data, position),
+            y: (0, _core_utils.readInt8)(data, position + 1)
+          });
+          position += 2;
+        }
 
-            if ((0, _primitives.isDict)(colorSpaces)) {
-              const resourcesCS = colorSpaces.get(cs.name);
+        genericRegion.at = at;
+      }
 
-              if (resourcesCS) {
-                if ((0, _primitives.isName)(resourcesCS)) {
-                  return this._parse(resourcesCS, xref, resources, pdfFunctionFactory);
-                }
+      args = [genericRegion, data, position, end];
+      break;
 
-                cs = resourcesCS;
-                break;
-              }
-            }
-          }
+    case 48:
+      const pageInfo = {
+        width: (0, _core_utils.readUint32)(data, position),
+        height: (0, _core_utils.readUint32)(data, position + 4),
+        resolutionX: (0, _core_utils.readUint32)(data, position + 8),
+        resolutionY: (0, _core_utils.readUint32)(data, position + 12)
+      };
 
-          throw new _util.FormatError(`Unrecognized ColorSpace: ${cs.name}`);
+      if (pageInfo.height === 0xffffffff) {
+        delete pageInfo.height;
       }
-    }
 
-    if (Array.isArray(cs)) {
-      const mode = xref.fetchIfRef(cs[0]).name;
-      let params, numComps, baseCS, whitePoint, blackPoint, gamma;
+      const pageSegmentFlags = data[position + 16];
+      (0, _core_utils.readUint16)(data, position + 17);
+      pageInfo.lossless = !!(pageSegmentFlags & 1);
+      pageInfo.refinement = !!(pageSegmentFlags & 2);
+      pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;
+      pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;
+      pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
+      pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
+      args = [pageInfo];
+      break;
 
-      switch (mode) {
-        case "DeviceGray":
-        case "G":
-          return this.singletons.gray;
+    case 49:
+      break;
 
-        case "DeviceRGB":
-        case "RGB":
-          return this.singletons.rgb;
+    case 50:
+      break;
 
-        case "DeviceCMYK":
-        case "CMYK":
-          return this.singletons.cmyk;
+    case 51:
+      break;
 
-        case "CalGray":
-          params = xref.fetchIfRef(cs[1]);
-          whitePoint = params.getArray("WhitePoint");
-          blackPoint = params.getArray("BlackPoint");
-          gamma = params.get("Gamma");
-          return new CalGrayCS(whitePoint, blackPoint, gamma);
+    case 53:
+      args = [header.number, data, position, end];
+      break;
 
-        case "CalRGB":
-          params = xref.fetchIfRef(cs[1]);
-          whitePoint = params.getArray("WhitePoint");
-          blackPoint = params.getArray("BlackPoint");
-          gamma = params.getArray("Gamma");
-          const matrix = params.getArray("Matrix");
-          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
+    case 62:
+      break;
 
-        case "ICCBased":
-          const stream = xref.fetchIfRef(cs[1]);
-          const dict = stream.dict;
-          numComps = dict.get("N");
-          const alt = dict.get("Alternate");
+    default:
+      throw new Jbig2Error(`segment type ${header.typeName}(${header.type})` + " is not implemented");
+  }
 
-          if (alt) {
-            const altCS = this._parse(alt, xref, resources, pdfFunctionFactory);
+  const callbackName = "on" + header.typeName;
 
-            if (altCS.numComps === numComps) {
-              return altCS;
-            }
+  if (callbackName in visitor) {
+    visitor[callbackName].apply(visitor, args);
+  }
+}
 
-            (0, _util.warn)("ICCBased color space: Ignoring incorrect /Alternate entry.");
-          }
+function processSegments(segments, visitor) {
+  for (let i = 0, ii = segments.length; i < ii; i++) {
+    processSegment(segments[i], visitor);
+  }
+}
 
-          if (numComps === 1) {
-            return this.singletons.gray;
-          } else if (numComps === 3) {
-            return this.singletons.rgb;
-          } else if (numComps === 4) {
-            return this.singletons.cmyk;
-          }
+function parseJbig2Chunks(chunks) {
+  const visitor = new SimpleSegmentVisitor();
 
-          break;
+  for (let i = 0, ii = chunks.length; i < ii; i++) {
+    const chunk = chunks[i];
+    const segments = readSegments({}, chunk.data, chunk.start, chunk.end);
+    processSegments(segments, visitor);
+  }
 
-        case "Pattern":
-          baseCS = cs[1] || null;
+  return visitor.buffer;
+}
 
-          if (baseCS) {
-            baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory);
-          }
+function parseJbig2(data) {
+  const end = data.length;
+  let position = 0;
 
-          return new PatternCS(baseCS);
+  if (data[position] !== 0x97 || data[position + 1] !== 0x4a || data[position + 2] !== 0x42 || data[position 
+ 3] !== 0x32 || data[position + 4] !== 0x0d || data[position + 5] !== 0x0a || data[position + 6] !== 0x1a || 
data[position + 7] !== 0x0a) {
+    throw new Jbig2Error("parseJbig2 - invalid header.");
+  }
 
-        case "Indexed":
-        case "I":
-          baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory);
-          const hiVal = xref.fetchIfRef(cs[2]) + 1;
-          const lookup = xref.fetchIfRef(cs[3]);
-          return new IndexedCS(baseCS, hiVal, lookup);
+  const header = Object.create(null);
+  position += 8;
+  const flags = data[position++];
+  header.randomAccess = !(flags & 1);
 
-        case "Separation":
-        case "DeviceN":
-          const name = xref.fetchIfRef(cs[1]);
-          numComps = Array.isArray(name) ? name.length : 1;
-          baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory);
-          const tintFn = pdfFunctionFactory.create(cs[3]);
-          return new AlternateCS(numComps, baseCS, tintFn);
+  if (!(flags & 2)) {
+    header.numberOfPages = (0, _core_utils.readUint32)(data, position);
+    position += 4;
+  }
 
-        case "Lab":
-          params = xref.fetchIfRef(cs[1]);
-          whitePoint = params.getArray("WhitePoint");
-          blackPoint = params.getArray("BlackPoint");
-          const range = params.getArray("Range");
-          return new LabCS(whitePoint, blackPoint, range);
+  const segments = readSegments(header, data, position, end);
+  const visitor = new SimpleSegmentVisitor();
+  processSegments(segments, visitor);
+  const {
+    width,
+    height
+  } = visitor.currentPageInfo;
+  const bitPacked = visitor.buffer;
+  const imgData = new Uint8ClampedArray(width * height);
+  let q = 0,
+      k = 0;
+
+  for (let i = 0; i < height; i++) {
+    let mask = 0,
+        buffer;
 
-        default:
-          throw new _util.FormatError(`Unimplemented ColorSpace object: ${mode}`);
+    for (let j = 0; j < width; j++) {
+      if (!mask) {
+        mask = 128;
+        buffer = bitPacked[k++];
       }
-    }
 
-    throw new _util.FormatError(`Unrecognized ColorSpace object: ${cs}`);
+      imgData[q++] = buffer & mask ? 0 : 255;
+      mask >>= 1;
+    }
   }
 
-  static isDefaultDecode(decode, numComps) {
-    if (!Array.isArray(decode)) {
-      return true;
-    }
+  return {
+    imgData,
+    width,
+    height
+  };
+}
 
-    if (numComps * 2 !== decode.length) {
-      (0, _util.warn)("The decode map is not the correct length");
-      return true;
-    }
+class SimpleSegmentVisitor {
+  onPageInformation(info) {
+    this.currentPageInfo = info;
+    const rowSize = info.width + 7 >> 3;
+    const buffer = new Uint8ClampedArray(rowSize * info.height);
 
-    for (let i = 0, ii = decode.length; i < ii; i += 2) {
-      if (decode[i] !== 0 || decode[i + 1] !== 1) {
-        return false;
+    if (info.defaultPixelValue) {
+      for (let i = 0, ii = buffer.length; i < ii; i++) {
+        buffer[i] = 0xff;
       }
     }
 
-    return true;
+    this.buffer = buffer;
   }
 
-  static get singletons() {
-    return (0, _util.shadow)(this, "singletons", {
-      get gray() {
-        return (0, _util.shadow)(this, "gray", new DeviceGrayCS());
-      },
+  drawBitmap(regionInfo, bitmap) {
+    const pageInfo = this.currentPageInfo;
+    const width = regionInfo.width,
+          height = regionInfo.height;
+    const rowSize = pageInfo.width + 7 >> 3;
+    const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : 
pageInfo.combinationOperator;
+    const buffer = this.buffer;
+    const mask0 = 128 >> (regionInfo.x & 7);
+    let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
+    let i, j, mask, offset;
 
-      get rgb() {
-        return (0, _util.shadow)(this, "rgb", new DeviceRgbCS());
-      },
+    switch (combinationOperator) {
+      case 0:
+        for (i = 0; i < height; i++) {
+          mask = mask0;
+          offset = offset0;
 
-      get cmyk() {
-        return (0, _util.shadow)(this, "cmyk", new DeviceCmykCS());
-      }
+          for (j = 0; j < width; j++) {
+            if (bitmap[i][j]) {
+              buffer[offset] |= mask;
+            }
 
-    });
-  }
+            mask >>= 1;
 
-}
+            if (!mask) {
+              mask = 128;
+              offset++;
+            }
+          }
 
-exports.ColorSpace = ColorSpace;
+          offset0 += rowSize;
+        }
 
-class AlternateCS extends ColorSpace {
-  constructor(numComps, base, tintFn) {
-    super("Alternate", numComps);
-    this.base = base;
-    this.tintFn = tintFn;
-    this.tmpBuf = new Float32Array(base.numComps);
-  }
+        break;
 
-  getRgbItem(src, srcOffset, dest, destOffset) {
-    const tmpBuf = this.tmpBuf;
-    this.tintFn(src, srcOffset, tmpBuf, 0);
-    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
-  }
+      case 2:
+        for (i = 0; i < height; i++) {
+          mask = mask0;
+          offset = offset0;
 
-  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-    const tintFn = this.tintFn;
-    const base = this.base;
-    const scale = 1 / ((1 << bits) - 1);
-    const baseNumComps = base.numComps;
-    const usesZeroToOneRange = base.usesZeroToOneRange;
-    const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
-    let pos = isPassthrough ? destOffset : 0;
-    const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
-    const numComps = this.numComps;
-    const scaled = new Float32Array(numComps);
-    const tinted = new Float32Array(baseNumComps);
-    let i, j;
+          for (j = 0; j < width; j++) {
+            if (bitmap[i][j]) {
+              buffer[offset] ^= mask;
+            }
 
-    for (i = 0; i < count; i++) {
-      for (j = 0; j < numComps; j++) {
-        scaled[j] = src[srcOffset++] * scale;
-      }
+            mask >>= 1;
 
-      tintFn(scaled, 0, tinted, 0);
+            if (!mask) {
+              mask = 128;
+              offset++;
+            }
+          }
 
-      if (usesZeroToOneRange) {
-        for (j = 0; j < baseNumComps; j++) {
-          baseBuf[pos++] = tinted[j] * 255;
+          offset0 += rowSize;
         }
-      } else {
-        base.getRgbItem(tinted, 0, baseBuf, pos);
-        pos += baseNumComps;
-      }
-    }
 
-    if (!isPassthrough) {
-      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+        break;
+
+      default:
+        throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
     }
   }
 
-  getOutputLength(inputLength, alpha01) {
-    return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
+  onImmediateGenericRegion(region, data, start, end) {
+    const regionInfo = region.info;
+    const decodingContext = new DecodingContext(data, start, end);
+    const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, 
region.prediction, null, region.at, decodingContext);
+    this.drawBitmap(regionInfo, bitmap);
   }
 
-}
-
-class PatternCS extends ColorSpace {
-  constructor(baseCS) {
-    super("Pattern", null);
-    this.base = baseCS;
+  onImmediateLosslessGenericRegion() {
+    this.onImmediateGenericRegion.apply(this, arguments);
   }
 
-  isDefaultDecode(decodeMap, bpc) {
-    (0, _util.unreachable)("Should not call PatternCS.isDefaultDecode");
-  }
+  onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
+    let huffmanTables, huffmanInput;
 
-}
+    if (dictionary.huffman) {
+      huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
+      huffmanInput = new Reader(data, start, end);
+    }
 
-class IndexedCS extends ColorSpace {
-  constructor(base, highVal, lookup) {
-    super("Indexed", 1);
-    this.base = base;
-    this.highVal = highVal;
-    const length = base.numComps * highVal;
-    this.lookup = new Uint8Array(length);
+    let symbols = this.symbols;
 
-    if ((0, _primitives.isStream)(lookup)) {
-      const bytes = lookup.getBytes(length);
-      this.lookup.set(bytes);
-    } else if (typeof lookup === "string") {
-      for (let i = 0; i < length; ++i) {
-        this.lookup[i] = lookup.charCodeAt(i) & 0xff;
-      }
-    } else {
-      throw new _util.FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);
+    if (!symbols) {
+      this.symbols = symbols = {};
     }
-  }
 
-  getRgbItem(src, srcOffset, dest, destOffset) {
-    const numComps = this.base.numComps;
-    const start = src[srcOffset] * numComps;
-    this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);
-  }
+    let inputSymbols = [];
 
-  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-    const base = this.base;
-    const numComps = base.numComps;
-    const outputDelta = base.getOutputLength(numComps, alpha01);
-    const lookup = this.lookup;
+    for (let i = 0, ii = referredSegments.length; i < ii; i++) {
+      const referredSymbols = symbols[referredSegments[i]];
 
-    for (let i = 0; i < count; ++i) {
-      const lookupPos = src[srcOffset++] * numComps;
-      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
-      destOffset += outputDelta;
+      if (referredSymbols) {
+        inputSymbols = inputSymbols.concat(referredSymbols);
+      }
     }
-  }
 
-  getOutputLength(inputLength, alpha01) {
-    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
+    const decodingContext = new DecodingContext(data, start, end);
+    symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, 
inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, 
dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, 
huffmanInput);
   }
 
-  isDefaultDecode(decodeMap, bpc) {
-    if (!Array.isArray(decodeMap)) {
-      return true;
-    }
+  onImmediateTextRegion(region, referredSegments, data, start, end) {
+    const regionInfo = region.info;
+    let huffmanTables, huffmanInput;
+    const symbols = this.symbols;
+    let inputSymbols = [];
 
-    if (decodeMap.length !== 2) {
-      (0, _util.warn)("Decode map length is not correct");
-      return true;
-    }
+    for (let i = 0, ii = referredSegments.length; i < ii; i++) {
+      const referredSymbols = symbols[referredSegments[i]];
 
-    if (!Number.isInteger(bpc) || bpc < 1) {
-      (0, _util.warn)("Bits per component is not correct");
-      return true;
+      if (referredSymbols) {
+        inputSymbols = inputSymbols.concat(referredSymbols);
+      }
     }
 
-    return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1;
-  }
+    const symbolCodeLength = (0, _core_utils.log2)(inputSymbols.length);
 
-}
+    if (region.huffman) {
+      huffmanInput = new Reader(data, start, end);
+      huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, 
inputSymbols.length, huffmanInput);
+    }
 
-class DeviceGrayCS extends ColorSpace {
-  constructor() {
-    super("DeviceGray", 1);
+    const decodingContext = new DecodingContext(data, start, end);
+    const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, 
region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, 
region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, 
region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
+    this.drawBitmap(regionInfo, bitmap);
   }
 
-  getRgbItem(src, srcOffset, dest, destOffset) {
-    const c = src[srcOffset] * 255;
-    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+  onImmediateLosslessTextRegion() {
+    this.onImmediateTextRegion.apply(this, arguments);
   }
 
-  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-    const scale = 255 / ((1 << bits) - 1);
-    let j = srcOffset,
-        q = destOffset;
+  onPatternDictionary(dictionary, currentSegment, data, start, end) {
+    let patterns = this.patterns;
 
-    for (let i = 0; i < count; ++i) {
-      const c = scale * src[j++];
-      dest[q++] = c;
-      dest[q++] = c;
-      dest[q++] = c;
-      q += alpha01;
+    if (!patterns) {
+      this.patterns = patterns = {};
     }
+
+    const decodingContext = new DecodingContext(data, start, end);
+    patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, 
dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
   }
 
-  getOutputLength(inputLength, alpha01) {
-    return inputLength * (3 + alpha01);
+  onImmediateHalftoneRegion(region, referredSegments, data, start, end) {
+    const patterns = this.patterns[referredSegments[0]];
+    const regionInfo = region.info;
+    const decodingContext = new DecodingContext(data, start, end);
+    const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, 
regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, 
region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, 
decodingContext);
+    this.drawBitmap(regionInfo, bitmap);
   }
 
-}
+  onImmediateLosslessHalftoneRegion() {
+    this.onImmediateHalftoneRegion.apply(this, arguments);
+  }
 
-class DeviceRgbCS extends ColorSpace {
-  constructor() {
-    super("DeviceRGB", 3);
-  }
-
-  getRgbItem(src, srcOffset, dest, destOffset) {
-    dest[destOffset] = src[srcOffset] * 255;
-    dest[destOffset + 1] = src[srcOffset + 1] * 255;
-    dest[destOffset + 2] = src[srcOffset + 2] * 255;
-  }
+  onTables(currentSegment, data, start, end) {
+    let customTables = this.customTables;
 
-  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-    if (bits === 8 && alpha01 === 0) {
-      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
-      return;
+    if (!customTables) {
+      this.customTables = customTables = {};
     }
 
-    const scale = 255 / ((1 << bits) - 1);
-    let j = srcOffset,
-        q = destOffset;
-
-    for (let i = 0; i < count; ++i) {
-      dest[q++] = scale * src[j++];
-      dest[q++] = scale * src[j++];
-      dest[q++] = scale * src[j++];
-      q += alpha01;
-    }
+    customTables[currentSegment] = decodeTablesSegment(data, start, end);
   }
 
-  getOutputLength(inputLength, alpha01) {
-    return inputLength * (3 + alpha01) / 3 | 0;
-  }
+}
 
-  isPassthrough(bits) {
-    return bits === 8;
+class HuffmanLine {
+  constructor(lineData) {
+    if (lineData.length === 2) {
+      this.isOOB = true;
+      this.rangeLow = 0;
+      this.prefixLength = lineData[0];
+      this.rangeLength = 0;
+      this.prefixCode = lineData[1];
+      this.isLowerRange = false;
+    } else {
+      this.isOOB = false;
+      this.rangeLow = lineData[0];
+      this.prefixLength = lineData[1];
+      this.rangeLength = lineData[2];
+      this.prefixCode = lineData[3];
+      this.isLowerRange = lineData[4] === "lower";
+    }
   }
 
 }
 
-const DeviceCmykCS = function DeviceCmykCSClosure() {
-  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
-    const c = src[srcOffset] * srcScale;
-    const m = src[srcOffset + 1] * srcScale;
-    const y = src[srcOffset + 2] * srcScale;
-    const k = src[srcOffset + 3] * srcScale;
-    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 
212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + 
-17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 
17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
-    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y 
+ 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 
131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 
24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
-    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y 
- 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 
50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + 
-193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
-  }
+class HuffmanTreeNode {
+  constructor(line) {
+    this.children = [];
 
-  class DeviceCmykCS extends ColorSpace {
-    constructor() {
-      super("DeviceCMYK", 4);
+    if (line) {
+      this.isLeaf = true;
+      this.rangeLength = line.rangeLength;
+      this.rangeLow = line.rangeLow;
+      this.isLowerRange = line.isLowerRange;
+      this.isOOB = line.isOOB;
+    } else {
+      this.isLeaf = false;
     }
+  }
 
-    getRgbItem(src, srcOffset, dest, destOffset) {
-      convertToRgb(src, srcOffset, 1, dest, destOffset);
-    }
+  buildTree(line, shift) {
+    const bit = line.prefixCode >> shift & 1;
 
-    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-      const scale = 1 / ((1 << bits) - 1);
+    if (shift <= 0) {
+      this.children[bit] = new HuffmanTreeNode(line);
+    } else {
+      let node = this.children[bit];
 
-      for (let i = 0; i < count; i++) {
-        convertToRgb(src, srcOffset, scale, dest, destOffset);
-        srcOffset += 4;
-        destOffset += 3 + alpha01;
+      if (!node) {
+        this.children[bit] = node = new HuffmanTreeNode(null);
       }
+
+      node.buildTree(line, shift - 1);
     }
+  }
 
-    getOutputLength(inputLength, alpha01) {
-      return inputLength / 4 * (3 + alpha01) | 0;
+  decodeNode(reader) {
+    if (this.isLeaf) {
+      if (this.isOOB) {
+        return null;
+      }
+
+      const htOffset = reader.readBits(this.rangeLength);
+      return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
     }
 
-  }
+    const node = this.children[reader.readBit()];
 
-  return DeviceCmykCS;
-}();
+    if (!node) {
+      throw new Jbig2Error("invalid Huffman data");
+    }
 
-const CalGrayCS = function CalGrayCSClosure() {
-  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
-    const A = src[srcOffset] * scale;
-    const AG = A ** cs.G;
-    const L = cs.YW * AG;
-    const val = Math.max(295.8 * L ** 0.333333333333333333 - 40.8, 0);
-    dest[destOffset] = val;
-    dest[destOffset + 1] = val;
-    dest[destOffset + 2] = val;
+    return node.decodeNode(reader);
   }
 
-  class CalGrayCS extends ColorSpace {
-    constructor(whitePoint, blackPoint, gamma) {
-      super("CalGray", 1);
+}
 
-      if (!whitePoint) {
-        throw new _util.FormatError("WhitePoint missing - required for color space CalGray");
-      }
+class HuffmanTable {
+  constructor(lines, prefixCodesDone) {
+    if (!prefixCodesDone) {
+      this.assignPrefixCodes(lines);
+    }
 
-      blackPoint = blackPoint || [0, 0, 0];
-      gamma = gamma || 1;
-      this.XW = whitePoint[0];
-      this.YW = whitePoint[1];
-      this.ZW = whitePoint[2];
-      this.XB = blackPoint[0];
-      this.YB = blackPoint[1];
-      this.ZB = blackPoint[2];
-      this.G = gamma;
+    this.rootNode = new HuffmanTreeNode(null);
 
-      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
-        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback 
available");
-      }
+    for (let i = 0, ii = lines.length; i < ii; i++) {
+      const line = lines[i];
 
-      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
-        (0, _util.info)(`Invalid BlackPoint for ${this.name}, falling back to default.`);
-        this.XB = this.YB = this.ZB = 0;
+      if (line.prefixLength > 0) {
+        this.rootNode.buildTree(line, line.prefixLength - 1);
       }
+    }
+  }
 
-      if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
-        (0, _util.warn)(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only 
default values are supported.`);
-      }
+  decode(reader) {
+    return this.rootNode.decodeNode(reader);
+  }
 
-      if (this.G < 1) {
-        (0, _util.info)(`Invalid Gamma: ${this.G} for ${this.name}, ` + "falling back to default.");
-        this.G = 1;
-      }
+  assignPrefixCodes(lines) {
+    const linesLength = lines.length;
+    let prefixLengthMax = 0;
+
+    for (let i = 0; i < linesLength; i++) {
+      prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
     }
 
-    getRgbItem(src, srcOffset, dest, destOffset) {
-      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+    const histogram = new Uint32Array(prefixLengthMax + 1);
+
+    for (let i = 0; i < linesLength; i++) {
+      histogram[lines[i].prefixLength]++;
     }
 
-    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-      const scale = 1 / ((1 << bits) - 1);
+    let currentLength = 1,
+        firstCode = 0,
+        currentCode,
+        currentTemp,
+        line;
+    histogram[0] = 0;
 
-      for (let i = 0; i < count; ++i) {
-        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
-        srcOffset += 1;
-        destOffset += 3 + alpha01;
+    while (currentLength <= prefixLengthMax) {
+      firstCode = firstCode + histogram[currentLength - 1] << 1;
+      currentCode = firstCode;
+      currentTemp = 0;
+
+      while (currentTemp < linesLength) {
+        line = lines[currentTemp];
+
+        if (line.prefixLength === currentLength) {
+          line.prefixCode = currentCode;
+          currentCode++;
+        }
+
+        currentTemp++;
       }
-    }
 
-    getOutputLength(inputLength, alpha01) {
-      return inputLength * (3 + alpha01);
+      currentLength++;
     }
-
   }
 
-  return CalGrayCS;
-}();
+}
 
-const CalRGBCS = function CalRGBCSClosure() {
-  const BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, 
-0.0685, 1.0296]);
-  const BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 
0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
-  const SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 
1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
-  const FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
-  const tempNormalizeMatrix = new Float32Array(3);
-  const tempConvertMatrix1 = new Float32Array(3);
-  const tempConvertMatrix2 = new Float32Array(3);
-  const DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;
+function decodeTablesSegment(data, start, end) {
+  const flags = data[start];
+  const lowestValue = (0, _core_utils.readUint32)(data, start + 1) & 0xffffffff;
+  const highestValue = (0, _core_utils.readUint32)(data, start + 5) & 0xffffffff;
+  const reader = new Reader(data, start + 9, end);
+  const prefixSizeBits = (flags >> 1 & 7) + 1;
+  const rangeSizeBits = (flags >> 4 & 7) + 1;
+  const lines = [];
+  let prefixLength,
+      rangeLength,
+      currentRangeLow = lowestValue;
+
+  do {
+    prefixLength = reader.readBits(prefixSizeBits);
+    rangeLength = reader.readBits(rangeSizeBits);
+    lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
+    currentRangeLow += 1 << rangeLength;
+  } while (currentRangeLow < highestValue);
 
-  function matrixProduct(a, b, result) {
-    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
-    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
-    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
-  }
+  prefixLength = reader.readBits(prefixSizeBits);
+  lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"]));
+  prefixLength = reader.readBits(prefixSizeBits);
+  lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
 
-  function convertToFlat(sourceWhitePoint, LMS, result) {
-    result[0] = LMS[0] * 1 / sourceWhitePoint[0];
-    result[1] = LMS[1] * 1 / sourceWhitePoint[1];
-    result[2] = LMS[2] * 1 / sourceWhitePoint[2];
+  if (flags & 1) {
+    prefixLength = reader.readBits(prefixSizeBits);
+    lines.push(new HuffmanLine([prefixLength, 0]));
   }
 
-  function convertToD65(sourceWhitePoint, LMS, result) {
-    const D65X = 0.95047;
-    const D65Y = 1;
-    const D65Z = 1.08883;
-    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
-    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
-    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
-  }
+  return new HuffmanTable(lines, false);
+}
 
-  function sRGBTransferFunction(color) {
-    if (color <= 0.0031308) {
-      return adjustToRange(0, 1, 12.92 * color);
-    }
+const standardTablesCache = {};
 
-    if (color >= 0.99554525) {
-      return 1;
-    }
+function getStandardTable(number) {
+  let table = standardTablesCache[number];
 
-    return adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055);
+  if (table) {
+    return table;
   }
 
-  function adjustToRange(min, max, value) {
-    return Math.max(min, Math.min(max, value));
-  }
+  let lines;
 
-  function decodeL(L) {
-    if (L < 0) {
-      return -decodeL(-L);
-    }
+  switch (number) {
+    case 1:
+      lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
+      break;
 
-    if (L > 8.0) {
-      return ((L + 16) / 116) ** 3;
-    }
+    case 2:
+      lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 
0x3e], [6, 0x3f]];
+      break;
 
-    return L * DECODE_L_CONSTANT;
-  }
+    case 3:
+      lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 
6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]];
+      break;
 
-  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
-    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
-      result[0] = XYZ_Flat[0];
-      result[1] = XYZ_Flat[1];
-      result[2] = XYZ_Flat[2];
-      return;
-    }
+    case 4:
+      lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 
0x1f]];
+      break;
 
-    const zeroDecodeL = decodeL(0);
-    const X_DST = zeroDecodeL;
-    const X_SRC = decodeL(sourceBlackPoint[0]);
-    const Y_DST = zeroDecodeL;
-    const Y_SRC = decodeL(sourceBlackPoint[1]);
-    const Z_DST = zeroDecodeL;
-    const Z_SRC = decodeL(sourceBlackPoint[2]);
-    const X_Scale = (1 - X_DST) / (1 - X_SRC);
-    const X_Offset = 1 - X_Scale;
-    const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
-    const Y_Offset = 1 - Y_Scale;
-    const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
-    const Z_Offset = 1 - Z_Scale;
-    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
-    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
-    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
-  }
+    case 5:
+      lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 
6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]];
+      break;
 
-  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
-    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
-      result[0] = XYZ_In[0];
-      result[1] = XYZ_In[1];
-      result[2] = XYZ_In[2];
-      return;
-    }
+    case 6:
+      lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 
0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 
0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]];
+      break;
 
-    const LMS = result;
-    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
-    const LMS_Flat = tempNormalizeMatrix;
-    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
-    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
-  }
+    case 7:
+      lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 
0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 
0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]];
+      break;
 
-  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
-    const LMS = result;
-    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
-    const LMS_D65 = tempNormalizeMatrix;
-    convertToD65(sourceWhitePoint, LMS, LMS_D65);
-    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
-  }
+    case 8:
+      lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], 
[-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 
4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 
10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]];
+      break;
 
-  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
-    const A = adjustToRange(0, 1, src[srcOffset] * scale);
-    const B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
-    const C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
-    const AGR = A === 1 ? 1 : A ** cs.GR;
-    const BGG = B === 1 ? 1 : B ** cs.GG;
-    const CGB = C === 1 ? 1 : C ** cs.GB;
-    const X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
-    const Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
-    const Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
-    const XYZ = tempConvertMatrix1;
-    XYZ[0] = X;
-    XYZ[1] = Y;
-    XYZ[2] = Z;
-    const XYZ_Flat = tempConvertMatrix2;
-    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
-    const XYZ_Black = tempConvertMatrix1;
-    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
-    const XYZ_D65 = tempConvertMatrix2;
-    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
-    const SRGB = tempConvertMatrix1;
-    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
-    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;
-    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;
-    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;
-  }
+    case 9:
+      lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 
0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], 
[39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], 
[779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]];
+      break;
 
-  class CalRGBCS extends ColorSpace {
-    constructor(whitePoint, blackPoint, gamma, matrix) {
-      super("CalRGB", 3);
+    case 10:
+      lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 
5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 
0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], 
[2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]];
+      break;
 
-      if (!whitePoint) {
-        throw new _util.FormatError("WhitePoint missing - required for color space CalRGB");
-      }
+    case 11:
+      lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 
0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 
0x7e], [141, 7, 32, 0x7f]];
+      break;
 
-      blackPoint = blackPoint || new Float32Array(3);
-      gamma = gamma || new Float32Array([1, 1, 1]);
-      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
-      const XW = whitePoint[0];
-      const YW = whitePoint[1];
-      const ZW = whitePoint[2];
-      this.whitePoint = whitePoint;
-      const XB = blackPoint[0];
-      const YB = blackPoint[1];
-      const ZB = blackPoint[2];
-      this.blackPoint = blackPoint;
-      this.GR = gamma[0];
-      this.GG = gamma[1];
-      this.GB = gamma[2];
-      this.MXA = matrix[0];
-      this.MYA = matrix[1];
-      this.MZA = matrix[2];
-      this.MXB = matrix[3];
-      this.MYB = matrix[4];
-      this.MZB = matrix[5];
-      this.MXC = matrix[6];
-      this.MYC = matrix[7];
-      this.MZC = matrix[8];
+    case 12:
+      lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 
0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 
0xfe], [73, 8, 32, 0xff]];
+      break;
 
-      if (XW < 0 || ZW < 0 || YW !== 1) {
-        throw new _util.FormatError(`Invalid WhitePoint components for ${this.name}` + ", no fallback 
available");
-      }
+    case 13:
+      lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 
0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 
0x7e], [141, 7, 32, 0x7f]];
+      break;
 
-      if (XB < 0 || YB < 0 || ZB < 0) {
-        (0, _util.info)(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to 
default.");
-        this.blackPoint = new Float32Array(3);
-      }
+    case 14:
+      lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
+      break;
 
-      if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
-        (0, _util.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling 
back to default.`);
-        this.GR = this.GG = this.GB = 1;
-      }
-    }
+    case 15:
+      lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 
1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 
0x7e, "lower"], [25, 7, 32, 0x7f]];
+      break;
 
-    getRgbItem(src, srcOffset, dest, destOffset) {
-      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
-    }
+    default:
+      throw new Jbig2Error(`standard table B.${number} does not exist`);
+  }
 
-    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-      const scale = 1 / ((1 << bits) - 1);
+  for (let i = 0, ii = lines.length; i < ii; i++) {
+    lines[i] = new HuffmanLine(lines[i]);
+  }
 
-      for (let i = 0; i < count; ++i) {
-        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
-        srcOffset += 3;
-        destOffset += 3 + alpha01;
+  table = new HuffmanTable(lines, true);
+  standardTablesCache[number] = table;
+  return table;
+}
+
+class Reader {
+  constructor(data, start, end) {
+    this.data = data;
+    this.start = start;
+    this.end = end;
+    this.position = start;
+    this.shift = -1;
+    this.currentByte = 0;
+  }
+
+  readBit() {
+    if (this.shift < 0) {
+      if (this.position >= this.end) {
+        throw new Jbig2Error("end of data while reading bit");
       }
-    }
 
-    getOutputLength(inputLength, alpha01) {
-      return inputLength * (3 + alpha01) / 3 | 0;
+      this.currentByte = this.data[this.position++];
+      this.shift = 7;
     }
 
+    const bit = this.currentByte >> this.shift & 1;
+    this.shift--;
+    return bit;
   }
 
-  return CalRGBCS;
-}();
-
-const LabCS = function LabCSClosure() {
-  function fn_g(x) {
-    let result;
+  readBits(numBits) {
+    let result = 0,
+        i;
 
-    if (x >= 6 / 29) {
-      result = x * x * x;
-    } else {
-      result = 108 / 841 * (x - 4 / 29);
+    for (i = numBits - 1; i >= 0; i--) {
+      result |= this.readBit() << i;
     }
 
     return result;
   }
 
-  function decode(value, high1, low2, high2) {
-    return low2 + value * (high2 - low2) / high1;
+  byteAlign() {
+    this.shift = -1;
   }
 
-  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
-    let Ls = src[srcOffset];
-    let as = src[srcOffset + 1];
-    let bs = src[srcOffset + 2];
-
-    if (maxVal !== false) {
-      Ls = decode(Ls, maxVal, 0, 100);
-      as = decode(as, maxVal, cs.amin, cs.amax);
-      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+  next() {
+    if (this.position >= this.end) {
+      return -1;
     }
 
-    if (as > cs.amax) {
-      as = cs.amax;
-    } else if (as < cs.amin) {
-      as = cs.amin;
-    }
+    return this.data[this.position++];
+  }
 
-    if (bs > cs.bmax) {
-      bs = cs.bmax;
-    } else if (bs < cs.bmin) {
-      bs = cs.bmin;
-    }
+}
 
-    const M = (Ls + 16) / 116;
-    const L = M + as / 500;
-    const N = M - bs / 200;
-    const X = cs.XW * fn_g(L);
-    const Y = cs.YW * fn_g(M);
-    const Z = cs.ZW * fn_g(N);
-    let r, g, b;
+function getCustomHuffmanTable(index, referredTo, customTables) {
+  let currentIndex = 0;
 
-    if (cs.ZW < 1) {
-      r = X * 3.1339 + Y * -1.617 + Z * -0.4906;
-      g = X * -0.9785 + Y * 1.916 + Z * 0.0333;
-      b = X * 0.072 + Y * -0.229 + Z * 1.4057;
-    } else {
-      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
-      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
-      b = X * 0.0557 + Y * -0.204 + Z * 1.057;
+  for (let i = 0, ii = referredTo.length; i < ii; i++) {
+    const table = customTables[referredTo[i]];
+
+    if (table) {
+      if (index === currentIndex) {
+        return table;
+      }
+
+      currentIndex++;
     }
+  }
 
-    dest[destOffset] = Math.sqrt(r) * 255;
-    dest[destOffset + 1] = Math.sqrt(g) * 255;
-    dest[destOffset + 2] = Math.sqrt(b) * 255;
+  throw new Jbig2Error("can't find custom Huffman table");
+}
+
+function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
+  const codes = [];
+
+  for (let i = 0; i <= 34; i++) {
+    const codeLength = reader.readBits(4);
+    codes.push(new HuffmanLine([i, codeLength, 0, 0]));
   }
 
-  class LabCS extends ColorSpace {
-    constructor(whitePoint, blackPoint, range) {
-      super("Lab", 3);
+  const runCodesTable = new HuffmanTable(codes, false);
+  codes.length = 0;
 
-      if (!whitePoint) {
-        throw new _util.FormatError("WhitePoint missing - required for color space Lab");
-      }
+  for (let i = 0; i < numberOfSymbols;) {
+    const codeLength = runCodesTable.decode(reader);
 
-      blackPoint = blackPoint || [0, 0, 0];
-      range = range || [-100, 100, -100, 100];
-      this.XW = whitePoint[0];
-      this.YW = whitePoint[1];
-      this.ZW = whitePoint[2];
-      this.amin = range[0];
-      this.amax = range[1];
-      this.bmin = range[2];
-      this.bmax = range[3];
-      this.XB = blackPoint[0];
-      this.YB = blackPoint[1];
-      this.ZB = blackPoint[2];
+    if (codeLength >= 32) {
+      let repeatedLength, numberOfRepeats, j;
 
-      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
-        throw new _util.FormatError("Invalid WhitePoint components, no fallback available");
-      }
+      switch (codeLength) {
+        case 32:
+          if (i === 0) {
+            throw new Jbig2Error("no previous value in symbol ID table");
+          }
 
-      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
-        (0, _util.info)("Invalid BlackPoint, falling back to default");
-        this.XB = this.YB = this.ZB = 0;
-      }
+          numberOfRepeats = reader.readBits(2) + 3;
+          repeatedLength = codes[i - 1].prefixLength;
+          break;
 
-      if (this.amin > this.amax || this.bmin > this.bmax) {
-        (0, _util.info)("Invalid Range, falling back to defaults");
-        this.amin = -100;
-        this.amax = 100;
-        this.bmin = -100;
-        this.bmax = 100;
-      }
-    }
+        case 33:
+          numberOfRepeats = reader.readBits(3) + 3;
+          repeatedLength = 0;
+          break;
 
-    getRgbItem(src, srcOffset, dest, destOffset) {
-      convertToRgb(this, src, srcOffset, false, dest, destOffset);
-    }
+        case 34:
+          numberOfRepeats = reader.readBits(7) + 11;
+          repeatedLength = 0;
+          break;
 
-    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
-      const maxVal = (1 << bits) - 1;
+        default:
+          throw new Jbig2Error("invalid code length in symbol ID table");
+      }
 
-      for (let i = 0; i < count; i++) {
-        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
-        srcOffset += 3;
-        destOffset += 3 + alpha01;
+      for (j = 0; j < numberOfRepeats; j++) {
+        codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
+        i++;
       }
+    } else {
+      codes.push(new HuffmanLine([i, codeLength, 0, 0]));
+      i++;
     }
+  }
 
-    getOutputLength(inputLength, alpha01) {
-      return inputLength * (3 + alpha01) / 3 | 0;
-    }
+  reader.byteAlign();
+  const symbolIDTable = new HuffmanTable(codes, false);
+  let customIndex = 0,
+      tableFirstS,
+      tableDeltaS,
+      tableDeltaT;
 
-    isDefaultDecode(decodeMap, bpc) {
-      return true;
-    }
+  switch (textRegion.huffmanFS) {
+    case 0:
+    case 1:
+      tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
+      break;
 
-    get usesZeroToOneRange() {
-      return (0, _util.shadow)(this, "usesZeroToOneRange", false);
-    }
+    case 3:
+      tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+      break;
 
+    default:
+      throw new Jbig2Error("invalid Huffman FS selector");
   }
 
-  return LabCS;
-}();
+  switch (textRegion.huffmanDS) {
+    case 0:
+    case 1:
+    case 2:
+      tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
+      break;
 
-/***/ }),
-/* 24 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    case 3:
+      tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+      break;
 
-"use strict";
+    default:
+      throw new Jbig2Error("invalid Huffman DS selector");
+  }
 
+  switch (textRegion.huffmanDT) {
+    case 0:
+    case 1:
+    case 2:
+      tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
+      break;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.GlobalImageCache = exports.LocalGStateCache = exports.LocalFunctionCache = 
exports.LocalColorSpaceCache = exports.LocalImageCache = void 0;
+    case 3:
+      tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+      break;
 
-var _util = __w_pdfjs_require__(2);
+    default:
+      throw new Jbig2Error("invalid Huffman DT selector");
+  }
 
-var _primitives = __w_pdfjs_require__(5);
+  if (textRegion.refinement) {
+    throw new Jbig2Error("refinement with Huffman is not supported");
+  }
 
-class BaseLocalCache {
-  constructor(options) {
-    if (this.constructor === BaseLocalCache) {
-      (0, _util.unreachable)("Cannot initialize BaseLocalCache.");
-    }
+  return {
+    symbolIDTable,
+    tableFirstS,
+    tableDeltaS,
+    tableDeltaT
+  };
+}
 
-    if (!options || !options.onlyRefs) {
-      this._nameRefMap = new Map();
-      this._imageMap = new Map();
-    }
+function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
+  let customIndex = 0,
+      tableDeltaHeight,
+      tableDeltaWidth;
 
-    this._imageCache = new _primitives.RefSetCache();
+  switch (dictionary.huffmanDHSelector) {
+    case 0:
+    case 1:
+      tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
+      break;
+
+    case 3:
+      tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+      break;
+
+    default:
+      throw new Jbig2Error("invalid Huffman DH selector");
   }
 
-  getByName(name) {
-    const ref = this._nameRefMap.get(name);
+  switch (dictionary.huffmanDWSelector) {
+    case 0:
+    case 1:
+      tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
+      break;
 
-    if (ref) {
-      return this.getByRef(ref);
-    }
+    case 3:
+      tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+      break;
 
-    return this._imageMap.get(name) || null;
+    default:
+      throw new Jbig2Error("invalid Huffman DW selector");
   }
 
-  getByRef(ref) {
-    return this._imageCache.get(ref) || null;
+  let tableBitmapSize, tableAggregateInstances;
+
+  if (dictionary.bitmapSizeSelector) {
+    tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
+    customIndex++;
+  } else {
+    tableBitmapSize = getStandardTable(1);
   }
 
-  set(name, ref, data) {
-    (0, _util.unreachable)("Abstract method `set` called.");
+  if (dictionary.aggregationInstancesSelector) {
+    tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
+  } else {
+    tableAggregateInstances = getStandardTable(1);
   }
 
+  return {
+    tableDeltaHeight,
+    tableDeltaWidth,
+    tableBitmapSize,
+    tableAggregateInstances
+  };
 }
 
-class LocalImageCache extends BaseLocalCache {
-  set(name, ref = null, data) {
-    if (!name) {
-      throw new Error('LocalImageCache.set - expected "name" argument.');
-    }
-
-    if (ref) {
-      if (this._imageCache.has(ref)) {
-        return;
-      }
-
-      this._nameRefMap.set(name, ref);
-
-      this._imageCache.put(ref, data);
+function readUncompressedBitmap(reader, width, height) {
+  const bitmap = [];
 
-      return;
-    }
+  for (let y = 0; y < height; y++) {
+    const row = new Uint8Array(width);
+    bitmap.push(row);
 
-    if (this._imageMap.has(name)) {
-      return;
+    for (let x = 0; x < width; x++) {
+      row[x] = reader.readBit();
     }
 
-    this._imageMap.set(name, data);
+    reader.byteAlign();
   }
 
+  return bitmap;
 }
 
-exports.LocalImageCache = LocalImageCache;
+function decodeMMRBitmap(input, width, height, endOfBlock) {
+  const params = {
+    K: -1,
+    Columns: width,
+    Rows: height,
+    BlackIs1: true,
+    EndOfBlock: endOfBlock
+  };
+  const decoder = new _ccitt.CCITTFaxDecoder(input, params);
+  const bitmap = [];
+  let currentByte,
+      eof = false;
 
-class LocalColorSpaceCache extends BaseLocalCache {
-  set(name = null, ref = null, data) {
-    if (!name && !ref) {
-      throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');
-    }
+  for (let y = 0; y < height; y++) {
+    const row = new Uint8Array(width);
+    bitmap.push(row);
+    let shift = -1;
 
-    if (ref) {
-      if (this._imageCache.has(ref)) {
-        return;
-      }
+    for (let x = 0; x < width; x++) {
+      if (shift < 0) {
+        currentByte = decoder.readNextChar();
 
-      if (name) {
-        this._nameRefMap.set(name, ref);
-      }
+        if (currentByte === -1) {
+          currentByte = 0;
+          eof = true;
+        }
 
-      this._imageCache.put(ref, data);
+        shift = 7;
+      }
 
-      return;
+      row[x] = currentByte >> shift & 1;
+      shift--;
     }
+  }
 
-    if (this._imageMap.has(name)) {
-      return;
-    }
+  if (endOfBlock && !eof) {
+    const lookForEOFLimit = 5;
 
-    this._imageMap.set(name, data);
+    for (let i = 0; i < lookForEOFLimit; i++) {
+      if (decoder.readNextChar() === -1) {
+        break;
+      }
+    }
   }
 
+  return bitmap;
 }
 
-exports.LocalColorSpaceCache = LocalColorSpaceCache;
+class Jbig2Image {
+  parseChunks(chunks) {
+    return parseJbig2Chunks(chunks);
+  }
 
-class LocalFunctionCache extends BaseLocalCache {
-  constructor(options) {
-    super({
-      onlyRefs: true
-    });
+  parse(data) {
+    const {
+      imgData,
+      width,
+      height
+    } = parseJbig2(data);
+    this.width = width;
+    this.height = height;
+    return imgData;
   }
 
-  getByName(name) {
-    (0, _util.unreachable)("Should not call `getByName` method.");
+}
+
+exports.Jbig2Image = Jbig2Image;
+
+/***/ }),
+/* 26 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ArithmeticDecoder = void 0;
+const QeTable = [{
+  qe: 0x5601,
+  nmps: 1,
+  nlps: 1,
+  switchFlag: 1
+}, {
+  qe: 0x3401,
+  nmps: 2,
+  nlps: 6,
+  switchFlag: 0
+}, {
+  qe: 0x1801,
+  nmps: 3,
+  nlps: 9,
+  switchFlag: 0
+}, {
+  qe: 0x0ac1,
+  nmps: 4,
+  nlps: 12,
+  switchFlag: 0
+}, {
+  qe: 0x0521,
+  nmps: 5,
+  nlps: 29,
+  switchFlag: 0
+}, {
+  qe: 0x0221,
+  nmps: 38,
+  nlps: 33,
+  switchFlag: 0
+}, {
+  qe: 0x5601,
+  nmps: 7,
+  nlps: 6,
+  switchFlag: 1
+}, {
+  qe: 0x5401,
+  nmps: 8,
+  nlps: 14,
+  switchFlag: 0
+}, {
+  qe: 0x4801,
+  nmps: 9,
+  nlps: 14,
+  switchFlag: 0
+}, {
+  qe: 0x3801,
+  nmps: 10,
+  nlps: 14,
+  switchFlag: 0
+}, {
+  qe: 0x3001,
+  nmps: 11,
+  nlps: 17,
+  switchFlag: 0
+}, {
+  qe: 0x2401,
+  nmps: 12,
+  nlps: 18,
+  switchFlag: 0
+}, {
+  qe: 0x1c01,
+  nmps: 13,
+  nlps: 20,
+  switchFlag: 0
+}, {
+  qe: 0x1601,
+  nmps: 29,
+  nlps: 21,
+  switchFlag: 0
+}, {
+  qe: 0x5601,
+  nmps: 15,
+  nlps: 14,
+  switchFlag: 1
+}, {
+  qe: 0x5401,
+  nmps: 16,
+  nlps: 14,
+  switchFlag: 0
+}, {
+  qe: 0x5101,
+  nmps: 17,
+  nlps: 15,
+  switchFlag: 0
+}, {
+  qe: 0x4801,
+  nmps: 18,
+  nlps: 16,
+  switchFlag: 0
+}, {
+  qe: 0x3801,
+  nmps: 19,
+  nlps: 17,
+  switchFlag: 0
+}, {
+  qe: 0x3401,
+  nmps: 20,
+  nlps: 18,
+  switchFlag: 0
+}, {
+  qe: 0x3001,
+  nmps: 21,
+  nlps: 19,
+  switchFlag: 0
+}, {
+  qe: 0x2801,
+  nmps: 22,
+  nlps: 19,
+  switchFlag: 0
+}, {
+  qe: 0x2401,
+  nmps: 23,
+  nlps: 20,
+  switchFlag: 0
+}, {
+  qe: 0x2201,
+  nmps: 24,
+  nlps: 21,
+  switchFlag: 0
+}, {
+  qe: 0x1c01,
+  nmps: 25,
+  nlps: 22,
+  switchFlag: 0
+}, {
+  qe: 0x1801,
+  nmps: 26,
+  nlps: 23,
+  switchFlag: 0
+}, {
+  qe: 0x1601,
+  nmps: 27,
+  nlps: 24,
+  switchFlag: 0
+}, {
+  qe: 0x1401,
+  nmps: 28,
+  nlps: 25,
+  switchFlag: 0
+}, {
+  qe: 0x1201,
+  nmps: 29,
+  nlps: 26,
+  switchFlag: 0
+}, {
+  qe: 0x1101,
+  nmps: 30,
+  nlps: 27,
+  switchFlag: 0
+}, {
+  qe: 0x0ac1,
+  nmps: 31,
+  nlps: 28,
+  switchFlag: 0
+}, {
+  qe: 0x09c1,
+  nmps: 32,
+  nlps: 29,
+  switchFlag: 0
+}, {
+  qe: 0x08a1,
+  nmps: 33,
+  nlps: 30,
+  switchFlag: 0
+}, {
+  qe: 0x0521,
+  nmps: 34,
+  nlps: 31,
+  switchFlag: 0
+}, {
+  qe: 0x0441,
+  nmps: 35,
+  nlps: 32,
+  switchFlag: 0
+}, {
+  qe: 0x02a1,
+  nmps: 36,
+  nlps: 33,
+  switchFlag: 0
+}, {
+  qe: 0x0221,
+  nmps: 37,
+  nlps: 34,
+  switchFlag: 0
+}, {
+  qe: 0x0141,
+  nmps: 38,
+  nlps: 35,
+  switchFlag: 0
+}, {
+  qe: 0x0111,
+  nmps: 39,
+  nlps: 36,
+  switchFlag: 0
+}, {
+  qe: 0x0085,
+  nmps: 40,
+  nlps: 37,
+  switchFlag: 0
+}, {
+  qe: 0x0049,
+  nmps: 41,
+  nlps: 38,
+  switchFlag: 0
+}, {
+  qe: 0x0025,
+  nmps: 42,
+  nlps: 39,
+  switchFlag: 0
+}, {
+  qe: 0x0015,
+  nmps: 43,
+  nlps: 40,
+  switchFlag: 0
+}, {
+  qe: 0x0009,
+  nmps: 44,
+  nlps: 41,
+  switchFlag: 0
+}, {
+  qe: 0x0005,
+  nmps: 45,
+  nlps: 42,
+  switchFlag: 0
+}, {
+  qe: 0x0001,
+  nmps: 45,
+  nlps: 43,
+  switchFlag: 0
+}, {
+  qe: 0x5601,
+  nmps: 46,
+  nlps: 46,
+  switchFlag: 0
+}];
+
+class ArithmeticDecoder {
+  constructor(data, start, end) {
+    this.data = data;
+    this.bp = start;
+    this.dataEnd = end;
+    this.chigh = data[start];
+    this.clow = 0;
+    this.byteIn();
+    this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f;
+    this.clow = this.clow << 7 & 0xffff;
+    this.ct -= 7;
+    this.a = 0x8000;
   }
 
-  set(name = null, ref, data) {
-    if (!ref) {
-      throw new Error('LocalFunctionCache.set - expected "ref" argument.');
-    }
+  byteIn() {
+    const data = this.data;
+    let bp = this.bp;
 
-    if (this._imageCache.has(ref)) {
-      return;
+    if (data[bp] === 0xff) {
+      if (data[bp + 1] > 0x8f) {
+        this.clow += 0xff00;
+        this.ct = 8;
+      } else {
+        bp++;
+        this.clow += data[bp] << 9;
+        this.ct = 7;
+        this.bp = bp;
+      }
+    } else {
+      bp++;
+      this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00;
+      this.ct = 8;
+      this.bp = bp;
     }
 
-    this._imageCache.put(ref, data);
+    if (this.clow > 0xffff) {
+      this.chigh += this.clow >> 16;
+      this.clow &= 0xffff;
+    }
   }
 
-}
+  readBit(contexts, pos) {
+    let cx_index = contexts[pos] >> 1,
+        cx_mps = contexts[pos] & 1;
+    const qeTableIcx = QeTable[cx_index];
+    const qeIcx = qeTableIcx.qe;
+    let d;
+    let a = this.a - qeIcx;
 
-exports.LocalFunctionCache = LocalFunctionCache;
+    if (this.chigh < qeIcx) {
+      if (a < qeIcx) {
+        a = qeIcx;
+        d = cx_mps;
+        cx_index = qeTableIcx.nmps;
+      } else {
+        a = qeIcx;
+        d = 1 ^ cx_mps;
 
-class LocalGStateCache extends BaseLocalCache {
-  set(name, ref = null, data) {
-    if (!name) {
-      throw new Error('LocalGStateCache.set - expected "name" argument.');
-    }
+        if (qeTableIcx.switchFlag === 1) {
+          cx_mps = d;
+        }
 
-    if (ref) {
-      if (this._imageCache.has(ref)) {
-        return;
+        cx_index = qeTableIcx.nlps;
       }
+    } else {
+      this.chigh -= qeIcx;
 
-      this._nameRefMap.set(name, ref);
+      if ((a & 0x8000) !== 0) {
+        this.a = a;
+        return cx_mps;
+      }
 
-      this._imageCache.put(ref, data);
+      if (a < qeIcx) {
+        d = 1 ^ cx_mps;
 
-      return;
-    }
+        if (qeTableIcx.switchFlag === 1) {
+          cx_mps = d;
+        }
 
-    if (this._imageMap.has(name)) {
-      return;
+        cx_index = qeTableIcx.nlps;
+      } else {
+        d = cx_mps;
+        cx_index = qeTableIcx.nmps;
+      }
     }
 
-    this._imageMap.set(name, data);
+    do {
+      if (this.ct === 0) {
+        this.byteIn();
+      }
+
+      a <<= 1;
+      this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1;
+      this.clow = this.clow << 1 & 0xffff;
+      this.ct--;
+    } while ((a & 0x8000) === 0);
+
+    this.a = a;
+    contexts[pos] = cx_index << 1 | cx_mps;
+    return d;
   }
 
 }
 
-exports.LocalGStateCache = LocalGStateCache;
-
-class GlobalImageCache {
-  static get NUM_PAGES_THRESHOLD() {
-    return (0, _util.shadow)(this, "NUM_PAGES_THRESHOLD", 2);
-  }
+exports.ArithmeticDecoder = ArithmeticDecoder;
 
-  static get MAX_IMAGES_TO_CACHE() {
-    return (0, _util.shadow)(this, "MAX_IMAGES_TO_CACHE", 10);
-  }
+/***/ }),
+/* 27 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-  constructor() {
-    this._refCache = new _primitives.RefSetCache();
-    this._imageCache = new _primitives.RefSetCache();
-  }
 
-  shouldCache(ref, pageIndex) {
-    const pageIndexSet = this._refCache.get(ref);
 
-    const numPages = pageIndexSet ? pageIndexSet.size + (pageIndexSet.has(pageIndex) ? 0 : 1) : 1;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.JpegStream = void 0;
 
-    if (numPages < GlobalImageCache.NUM_PAGES_THRESHOLD) {
-      return false;
-    }
+var _decode_stream = __w_pdfjs_require__(19);
 
-    if (!this._imageCache.has(ref) && this._imageCache.size >= GlobalImageCache.MAX_IMAGES_TO_CACHE) {
-      return false;
-    }
+var _primitives = __w_pdfjs_require__(5);
 
-    return true;
-  }
+var _jpg = __w_pdfjs_require__(28);
 
-  addPageIndex(ref, pageIndex) {
-    let pageIndexSet = this._refCache.get(ref);
+var _util = __w_pdfjs_require__(2);
 
-    if (!pageIndexSet) {
-      pageIndexSet = new Set();
+class JpegStream extends _decode_stream.DecodeStream {
+  constructor(stream, maybeLength, params) {
+    let ch;
 
-      this._refCache.put(ref, pageIndexSet);
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === 0xff) {
+        stream.skip(-1);
+        break;
+      }
     }
 
-    pageIndexSet.add(pageIndex);
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+    this.params = params;
   }
 
-  getData(ref, pageIndex) {
-    const pageIndexSet = this._refCache.get(ref);
-
-    if (!pageIndexSet) {
-      return null;
-    }
+  get bytes() {
+    return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
 
-    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
-      return null;
-    }
+  ensureBuffer(requested) {}
 
-    if (!this._imageCache.has(ref)) {
-      return null;
+  readBlock() {
+    if (this.eof) {
+      return;
     }
 
-    pageIndexSet.add(pageIndex);
-    return this._imageCache.get(ref);
-  }
+    const jpegOptions = {
+      decodeTransform: undefined,
+      colorTransform: undefined
+    };
+    const decodeArr = this.dict.getArray("Decode", "D");
 
-  setData(ref, data) {
-    if (!this._refCache.has(ref)) {
-      throw new Error('GlobalImageCache.setData - expected "addPageIndex" to have been called.');
-    }
+    if (this.forceRGB && Array.isArray(decodeArr)) {
+      const bitsPerComponent = this.dict.get("BitsPerComponent") || 8;
+      const decodeArrLength = decodeArr.length;
+      const transform = new Int32Array(decodeArrLength);
+      let transformNeeded = false;
+      const maxValue = (1 << bitsPerComponent) - 1;
 
-    if (this._imageCache.has(ref)) {
-      return;
-    }
+      for (let i = 0; i < decodeArrLength; i += 2) {
+        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
+        transform[i + 1] = decodeArr[i] * maxValue | 0;
 
-    if (this._imageCache.size >= GlobalImageCache.MAX_IMAGES_TO_CACHE) {
-      (0, _util.info)("GlobalImageCache.setData - ignoring image above MAX_IMAGES_TO_CACHE.");
-      return;
+        if (transform[i] !== 256 || transform[i + 1] !== 0) {
+          transformNeeded = true;
+        }
+      }
+
+      if (transformNeeded) {
+        jpegOptions.decodeTransform = transform;
+      }
     }
 
-    this._imageCache.put(ref, data);
-  }
+    if ((0, _primitives.isDict)(this.params)) {
+      const colorTransform = this.params.get("ColorTransform");
 
-  clear(onlyData = false) {
-    if (!onlyData) {
-      this._refCache.clear();
+      if (Number.isInteger(colorTransform)) {
+        jpegOptions.colorTransform = colorTransform;
+      }
     }
 
-    this._imageCache.clear();
+    const jpegImage = new _jpg.JpegImage(jpegOptions);
+    jpegImage.parse(this.bytes);
+    const data = jpegImage.getData({
+      width: this.drawWidth,
+      height: this.drawHeight,
+      forceRGB: this.forceRGB,
+      isSourcePDF: true
+    });
+    this.buffer = data;
+    this.bufferLength = data.length;
+    this.eof = true;
   }
 
 }
 
-exports.GlobalImageCache = GlobalImageCache;
+exports.JpegStream = JpegStream;
 
 /***/ }),
-/* 25 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 28 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.getQuadPoints = getQuadPoints;
-exports.MarkupAnnotation = exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = 
void 0;
+}));
+exports.JpegImage = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _obj = __w_pdfjs_require__(10);
+var _core_utils = __w_pdfjs_require__(9);
 
-var _primitives = __w_pdfjs_require__(5);
+class JpegError extends _util.BaseException {
+  constructor(msg) {
+    super(`JPEG error: ${msg}`);
+  }
 
-var _colorspace = __w_pdfjs_require__(23);
+}
 
-var _core_utils = __w_pdfjs_require__(8);
+class DNLMarkerError extends _util.BaseException {
+  constructor(message, scanLines) {
+    super(message);
+    this.scanLines = scanLines;
+  }
 
-var _operator_list = __w_pdfjs_require__(26);
+}
 
-var _stream = __w_pdfjs_require__(12);
+class EOIMarkerError extends _util.BaseException {}
 
-var _writer = __w_pdfjs_require__(27);
+const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 
40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 
58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
+const dctCos1 = 4017;
+const dctSin1 = 799;
+const dctCos3 = 3406;
+const dctSin3 = 2276;
+const dctCos6 = 1567;
+const dctSin6 = 3784;
+const dctSqrt2 = 5793;
+const dctSqrt1d2 = 2896;
+
+function buildHuffmanTable(codeLengths, values) {
+  let k = 0,
+      i,
+      j,
+      length = 16;
 
-class AnnotationFactory {
-  static create(xref, ref, pdfManager, idFactory) {
-    return pdfManager.ensureCatalog("acroForm").then(acroForm => {
-      return pdfManager.ensure(this, "_create", [xref, ref, pdfManager, idFactory, acroForm]);
-    });
+  while (length > 0 && !codeLengths[length - 1]) {
+    length--;
   }
 
-  static _create(xref, ref, pdfManager, idFactory, acroForm) {
-    const dict = xref.fetchIfRef(ref);
+  const code = [{
+    children: [],
+    index: 0
+  }];
+  let p = code[0],
+      q;
 
-    if (!(0, _primitives.isDict)(dict)) {
-      return undefined;
+  for (i = 0; i < length; i++) {
+    for (j = 0; j < codeLengths[i]; j++) {
+      p = code.pop();
+      p.children[p.index] = values[k];
+
+      while (p.index > 0) {
+        p = code.pop();
+      }
+
+      p.index++;
+      code.push(p);
+
+      while (code.length <= i) {
+        code.push(q = {
+          children: [],
+          index: 0
+        });
+        p.children[p.index] = q.children;
+        p = q;
+      }
+
+      k++;
     }
 
-    const id = (0, _primitives.isRef)(ref) ? ref.toString() : `annot_${idFactory.createObjId()}`;
-    let subtype = dict.get("Subtype");
-    subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;
-    const parameters = {
-      xref,
-      ref,
-      dict,
-      subtype,
-      id,
-      pdfManager,
-      acroForm: acroForm instanceof _primitives.Dict ? acroForm : _primitives.Dict.empty
-    };
+    if (i + 1 < length) {
+      code.push(q = {
+        children: [],
+        index: 0
+      });
+      p.children[p.index] = q.children;
+      p = q;
+    }
+  }
 
-    switch (subtype) {
-      case "Link":
-        return new LinkAnnotation(parameters);
+  return code[0].children;
+}
 
-      case "Text":
-        return new TextAnnotation(parameters);
+function getBlockBufferOffset(component, row, col) {
+  return 64 * ((component.blocksPerLine + 1) * row + col);
+}
 
-      case "Widget":
-        let fieldType = (0, _core_utils.getInheritableProperty)({
-          dict,
-          key: "FT"
-        });
-        fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
+function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, 
successivePrev, successive, parseDNLMarker = false) {
+  const mcusPerLine = frame.mcusPerLine;
+  const progressive = frame.progressive;
+  const startOffset = offset;
+  let bitsData = 0,
+      bitsCount = 0;
 
-        switch (fieldType) {
-          case "Tx":
-            return new TextWidgetAnnotation(parameters);
+  function readBit() {
+    if (bitsCount > 0) {
+      bitsCount--;
+      return bitsData >> bitsCount & 1;
+    }
 
-          case "Btn":
-            return new ButtonWidgetAnnotation(parameters);
+    bitsData = data[offset++];
 
-          case "Ch":
-            return new ChoiceWidgetAnnotation(parameters);
+    if (bitsData === 0xff) {
+      const nextByte = data[offset++];
+
+      if (nextByte) {
+        if (nextByte === 0xdc && parseDNLMarker) {
+          offset += 2;
+          const scanLines = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
+
+          if (scanLines > 0 && scanLines !== frame.scanLines) {
+            throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
+          }
+        } else if (nextByte === 0xd9) {
+          if (parseDNLMarker) {
+            const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
+
+            if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 10) {
+              throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly 
caused by incorrect `scanLines` parameter", maybeScanLines);
+            }
+          }
+
+          throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
         }
 
-        (0, _util.warn)('Unimplemented widget field type "' + fieldType + '", ' + "falling back to base 
field type.");
-        return new WidgetAnnotation(parameters);
+        throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
+      }
+    }
 
-      case "Popup":
-        return new PopupAnnotation(parameters);
+    bitsCount = 7;
+    return bitsData >>> 7;
+  }
 
-      case "FreeText":
-        return new FreeTextAnnotation(parameters);
+  function decodeHuffman(tree) {
+    let node = tree;
 
-      case "Line":
-        return new LineAnnotation(parameters);
+    while (true) {
+      node = node[readBit()];
 
-      case "Square":
-        return new SquareAnnotation(parameters);
+      switch (typeof node) {
+        case "number":
+          return node;
 
-      case "Circle":
-        return new CircleAnnotation(parameters);
+        case "object":
+          continue;
+      }
 
-      case "PolyLine":
-        return new PolylineAnnotation(parameters);
+      throw new JpegError("invalid huffman sequence");
+    }
+  }
 
-      case "Polygon":
-        return new PolygonAnnotation(parameters);
+  function receive(length) {
+    let n = 0;
 
-      case "Caret":
-        return new CaretAnnotation(parameters);
+    while (length > 0) {
+      n = n << 1 | readBit();
+      length--;
+    }
 
-      case "Ink":
-        return new InkAnnotation(parameters);
+    return n;
+  }
 
-      case "Highlight":
-        return new HighlightAnnotation(parameters);
+  function receiveAndExtend(length) {
+    if (length === 1) {
+      return readBit() === 1 ? 1 : -1;
+    }
 
-      case "Underline":
-        return new UnderlineAnnotation(parameters);
+    const n = receive(length);
 
-      case "Squiggly":
-        return new SquigglyAnnotation(parameters);
+    if (n >= 1 << length - 1) {
+      return n;
+    }
 
-      case "StrikeOut":
-        return new StrikeOutAnnotation(parameters);
+    return n + (-1 << length) + 1;
+  }
 
-      case "Stamp":
-        return new StampAnnotation(parameters);
+  function decodeBaseline(component, blockOffset) {
+    const t = decodeHuffman(component.huffmanTableDC);
+    const diff = t === 0 ? 0 : receiveAndExtend(t);
+    component.blockData[blockOffset] = component.pred += diff;
+    let k = 1;
 
-      case "FileAttachment":
-        return new FileAttachmentAnnotation(parameters);
+    while (k < 64) {
+      const rs = decodeHuffman(component.huffmanTableAC);
+      const s = rs & 15,
+            r = rs >> 4;
 
-      default:
-        if (!subtype) {
-          (0, _util.warn)("Annotation is missing the required /Subtype.");
-        } else {
-          (0, _util.warn)('Unimplemented annotation type "' + subtype + '", ' + "falling back to base 
annotation.");
+      if (s === 0) {
+        if (r < 15) {
+          break;
         }
 
-        return new Annotation(parameters);
+        k += 16;
+        continue;
+      }
+
+      k += r;
+      const z = dctZigZag[k];
+      component.blockData[blockOffset + z] = receiveAndExtend(s);
+      k++;
     }
   }
 
-}
-
-exports.AnnotationFactory = AnnotationFactory;
+  function decodeDCFirst(component, blockOffset) {
+    const t = decodeHuffman(component.huffmanTableDC);
+    const diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
+    component.blockData[blockOffset] = component.pred += diff;
+  }
 
-function getQuadPoints(dict, rect) {
-  if (!dict.has("QuadPoints")) {
-    return null;
+  function decodeDCSuccessive(component, blockOffset) {
+    component.blockData[blockOffset] |= readBit() << successive;
   }
 
-  const quadPoints = dict.getArray("QuadPoints");
+  let eobrun = 0;
 
-  if (!Array.isArray(quadPoints) || quadPoints.length % 8 > 0) {
-    return null;
-  }
+  function decodeACFirst(component, blockOffset) {
+    if (eobrun > 0) {
+      eobrun--;
+      return;
+    }
 
-  const quadPointsLists = [];
+    let k = spectralStart;
+    const e = spectralEnd;
 
-  for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) {
-    quadPointsLists.push([]);
+    while (k <= e) {
+      const rs = decodeHuffman(component.huffmanTableAC);
+      const s = rs & 15,
+            r = rs >> 4;
 
-    for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) {
-      const x = quadPoints[j];
-      const y = quadPoints[j + 1];
+      if (s === 0) {
+        if (r < 15) {
+          eobrun = receive(r) + (1 << r) - 1;
+          break;
+        }
 
-      if (x < rect[0] || x > rect[2] || y < rect[1] || y > rect[3]) {
-        return null;
+        k += 16;
+        continue;
       }
 
-      quadPointsLists[i].push({
-        x,
-        y
-      });
+      k += r;
+      const z = dctZigZag[k];
+      component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
+      k++;
     }
   }
 
-  return quadPointsLists;
-}
+  let successiveACState = 0,
+      successiveACNextValue;
 
-function getTransformMatrix(rect, bbox, matrix) {
-  const [minX, minY, maxX, maxY] = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);
+  function decodeACSuccessive(component, blockOffset) {
+    let k = spectralStart;
+    const e = spectralEnd;
+    let r = 0;
+    let s;
+    let rs;
 
-  if (minX === maxX || minY === maxY) {
-    return [1, 0, 0, 1, rect[0], rect[1]];
-  }
+    while (k <= e) {
+      const offsetZ = blockOffset + dctZigZag[k];
+      const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
 
-  const xRatio = (rect[2] - rect[0]) / (maxX - minX);
-  const yRatio = (rect[3] - rect[1]) / (maxY - minY);
-  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
-}
+      switch (successiveACState) {
+        case 0:
+          rs = decodeHuffman(component.huffmanTableAC);
+          s = rs & 15;
+          r = rs >> 4;
+
+          if (s === 0) {
+            if (r < 15) {
+              eobrun = receive(r) + (1 << r);
+              successiveACState = 4;
+            } else {
+              r = 16;
+              successiveACState = 1;
+            }
+          } else {
+            if (s !== 1) {
+              throw new JpegError("invalid ACn encoding");
+            }
 
-class Annotation {
-  constructor(params) {
-    const dict = params.dict;
-    this.setContents(dict.get("Contents"));
-    this.setModificationDate(dict.get("M"));
-    this.setFlags(dict.get("F"));
-    this.setRectangle(dict.getArray("Rect"));
-    this.setColor(dict.getArray("C"));
-    this.setBorderStyle(dict);
-    this.setAppearance(dict);
-    this.data = {
-      annotationFlags: this.flags,
-      borderStyle: this.borderStyle,
-      color: this.color,
-      contents: this.contents,
-      hasAppearance: !!this.appearance,
-      id: params.id,
-      modificationDate: this.modificationDate,
-      rect: this.rectangle,
-      subtype: params.subtype
-    };
-  }
+            successiveACNextValue = receiveAndExtend(s);
+            successiveACState = r ? 2 : 3;
+          }
 
-  _hasFlag(flags, flag) {
-    return !!(flags & flag);
-  }
+          continue;
 
-  _isViewable(flags) {
-    return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, 
_util.AnnotationFlag.HIDDEN) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);
-  }
+        case 1:
+        case 2:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          } else {
+            r--;
 
-  _isPrintable(flags) {
-    return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, 
_util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN);
-  }
+            if (r === 0) {
+              successiveACState = successiveACState === 2 ? 3 : 0;
+            }
+          }
 
-  get viewable() {
-    if (this.flags === 0) {
-      return true;
-    }
+          break;
 
-    return this._isViewable(this.flags);
-  }
+        case 3:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          } else {
+            component.blockData[offsetZ] = successiveACNextValue << successive;
+            successiveACState = 0;
+          }
 
-  get printable() {
-    if (this.flags === 0) {
-      return false;
+          break;
+
+        case 4:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          }
+
+          break;
+      }
+
+      k++;
     }
 
-    return this._isPrintable(this.flags);
-  }
+    if (successiveACState === 4) {
+      eobrun--;
 
-  setContents(contents) {
-    this.contents = (0, _util.stringToPDFString)(contents || "");
+      if (eobrun === 0) {
+        successiveACState = 0;
+      }
+    }
   }
 
-  setModificationDate(modificationDate) {
-    this.modificationDate = (0, _util.isString)(modificationDate) ? modificationDate : null;
-  }
+  let blockRow = 0;
 
-  setFlags(flags) {
-    this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
+  function decodeMcu(component, decode, mcu, row, col) {
+    const mcuRow = mcu / mcusPerLine | 0;
+    const mcuCol = mcu % mcusPerLine;
+    blockRow = mcuRow * component.v + row;
+    const blockCol = mcuCol * component.h + col;
+    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
+    decode(component, blockOffset);
   }
 
-  hasFlag(flag) {
-    return this._hasFlag(this.flags, flag);
+  function decodeBlock(component, decode, mcu) {
+    blockRow = mcu / component.blocksPerLine | 0;
+    const blockCol = mcu % component.blocksPerLine;
+    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
+    decode(component, blockOffset);
   }
 
-  setRectangle(rectangle) {
-    if (Array.isArray(rectangle) && rectangle.length === 4) {
-      this.rectangle = _util.Util.normalizeRect(rectangle);
+  const componentsLength = components.length;
+  let component, i, j, k, n;
+  let decodeFn;
+
+  if (progressive) {
+    if (spectralStart === 0) {
+      decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
     } else {
-      this.rectangle = [0, 0, 0, 0];
+      decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
     }
+  } else {
+    decodeFn = decodeBaseline;
   }
 
-  setColor(color) {
-    const rgbColor = new Uint8ClampedArray(3);
-
-    if (!Array.isArray(color)) {
-      this.color = rgbColor;
-      return;
-    }
+  let mcu = 0,
+      fileMarker;
+  let mcuExpected;
 
-    switch (color.length) {
-      case 0:
-        this.color = null;
-        break;
+  if (componentsLength === 1) {
+    mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+  } else {
+    mcuExpected = mcusPerLine * frame.mcusPerColumn;
+  }
 
-      case 1:
-        _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
+  let h, v;
 
-        this.color = rgbColor;
-        break;
+  while (mcu <= mcuExpected) {
+    const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
 
-      case 3:
-        _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
+    if (mcuToRead > 0) {
+      for (i = 0; i < componentsLength; i++) {
+        components[i].pred = 0;
+      }
 
-        this.color = rgbColor;
-        break;
+      eobrun = 0;
 
-      case 4:
-        _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
+      if (componentsLength === 1) {
+        component = components[0];
 
-        this.color = rgbColor;
-        break;
+        for (n = 0; n < mcuToRead; n++) {
+          decodeBlock(component, decodeFn, mcu);
+          mcu++;
+        }
+      } else {
+        for (n = 0; n < mcuToRead; n++) {
+          for (i = 0; i < componentsLength; i++) {
+            component = components[i];
+            h = component.h;
+            v = component.v;
+
+            for (j = 0; j < v; j++) {
+              for (k = 0; k < h; k++) {
+                decodeMcu(component, decodeFn, mcu, j, k);
+              }
+            }
+          }
 
-      default:
-        this.color = rgbColor;
-        break;
+          mcu++;
+        }
+      }
     }
-  }
 
-  setBorderStyle(borderStyle) {
-    this.borderStyle = new AnnotationBorderStyle();
+    bitsCount = 0;
+    fileMarker = findNextFileMarker(data, offset);
 
-    if (!(0, _primitives.isDict)(borderStyle)) {
-      return;
+    if (!fileMarker) {
+      break;
     }
 
-    if (borderStyle.has("BS")) {
-      const dict = borderStyle.get("BS");
-      const dictType = dict.get("Type");
+    if (fileMarker.invalid) {
+      const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
+      (0, _util.warn)(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
+      offset = fileMarker.offset;
+    }
 
-      if (!dictType || (0, _primitives.isName)(dictType, "Border")) {
-        this.borderStyle.setWidth(dict.get("W"), this.rectangle);
-        this.borderStyle.setStyle(dict.get("S"));
-        this.borderStyle.setDashArray(dict.getArray("D"));
-      }
-    } else if (borderStyle.has("Border")) {
-      const array = borderStyle.getArray("Border");
+    if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
+      offset += 2;
+    } else {
+      break;
+    }
+  }
 
-      if (Array.isArray(array) && array.length >= 3) {
-        this.borderStyle.setHorizontalCornerRadius(array[0]);
-        this.borderStyle.setVerticalCornerRadius(array[1]);
-        this.borderStyle.setWidth(array[2], this.rectangle);
+  return offset - startOffset;
+}
 
-        if (array.length === 4) {
-          this.borderStyle.setDashArray(array[3]);
-        }
-      }
+function quantizeAndInverse(component, blockBufferOffset, p) {
+  const qt = component.quantizationTable,
+        blockData = component.blockData;
+  let v0, v1, v2, v3, v4, v5, v6, v7;
+  let p0, p1, p2, p3, p4, p5, p6, p7;
+  let t;
+
+  if (!qt) {
+    throw new JpegError("missing required Quantization Table.");
+  }
+
+  for (let row = 0; row < 64; row += 8) {
+    p0 = blockData[blockBufferOffset + row];
+    p1 = blockData[blockBufferOffset + row + 1];
+    p2 = blockData[blockBufferOffset + row + 2];
+    p3 = blockData[blockBufferOffset + row + 3];
+    p4 = blockData[blockBufferOffset + row + 4];
+    p5 = blockData[blockBufferOffset + row + 5];
+    p6 = blockData[blockBufferOffset + row + 6];
+    p7 = blockData[blockBufferOffset + row + 7];
+    p0 *= qt[row];
+
+    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+      t = dctSqrt2 * p0 + 512 >> 10;
+      p[row] = t;
+      p[row + 1] = t;
+      p[row + 2] = t;
+      p[row + 3] = t;
+      p[row + 4] = t;
+      p[row + 5] = t;
+      p[row + 6] = t;
+      p[row + 7] = t;
+      continue;
+    }
+
+    p1 *= qt[row + 1];
+    p2 *= qt[row + 2];
+    p3 *= qt[row + 3];
+    p4 *= qt[row + 4];
+    p5 *= qt[row + 5];
+    p6 *= qt[row + 6];
+    p7 *= qt[row + 7];
+    v0 = dctSqrt2 * p0 + 128 >> 8;
+    v1 = dctSqrt2 * p4 + 128 >> 8;
+    v2 = p2;
+    v3 = p6;
+    v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
+    v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
+    v5 = p3 << 4;
+    v6 = p5 << 4;
+    v0 = v0 + v1 + 1 >> 1;
+    v1 = v0 - v1;
+    t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
+    v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
+    v3 = t;
+    v4 = v4 + v6 + 1 >> 1;
+    v6 = v4 - v6;
+    v7 = v7 + v5 + 1 >> 1;
+    v5 = v7 - v5;
+    v0 = v0 + v3 + 1 >> 1;
+    v3 = v0 - v3;
+    v1 = v1 + v2 + 1 >> 1;
+    v2 = v1 - v2;
+    t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+    v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+    v7 = t;
+    t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+    v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+    v6 = t;
+    p[row] = v0 + v7;
+    p[row + 7] = v0 - v7;
+    p[row + 1] = v1 + v6;
+    p[row + 6] = v1 - v6;
+    p[row + 2] = v2 + v5;
+    p[row + 5] = v2 - v5;
+    p[row + 3] = v3 + v4;
+    p[row + 4] = v3 - v4;
+  }
+
+  for (let col = 0; col < 8; ++col) {
+    p0 = p[col];
+    p1 = p[col + 8];
+    p2 = p[col + 16];
+    p3 = p[col + 24];
+    p4 = p[col + 32];
+    p5 = p[col + 40];
+    p6 = p[col + 48];
+    p7 = p[col + 56];
+
+    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+      t = dctSqrt2 * p0 + 8192 >> 14;
+
+      if (t < -2040) {
+        t = 0;
+      } else if (t >= 2024) {
+        t = 255;
+      } else {
+        t = t + 2056 >> 4;
+      }
+
+      blockData[blockBufferOffset + col] = t;
+      blockData[blockBufferOffset + col + 8] = t;
+      blockData[blockBufferOffset + col + 16] = t;
+      blockData[blockBufferOffset + col + 24] = t;
+      blockData[blockBufferOffset + col + 32] = t;
+      blockData[blockBufferOffset + col + 40] = t;
+      blockData[blockBufferOffset + col + 48] = t;
+      blockData[blockBufferOffset + col + 56] = t;
+      continue;
+    }
+
+    v0 = dctSqrt2 * p0 + 2048 >> 12;
+    v1 = dctSqrt2 * p4 + 2048 >> 12;
+    v2 = p2;
+    v3 = p6;
+    v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
+    v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
+    v5 = p3;
+    v6 = p5;
+    v0 = (v0 + v1 + 1 >> 1) + 4112;
+    v1 = v0 - v1;
+    t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
+    v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
+    v3 = t;
+    v4 = v4 + v6 + 1 >> 1;
+    v6 = v4 - v6;
+    v7 = v7 + v5 + 1 >> 1;
+    v5 = v7 - v5;
+    v0 = v0 + v3 + 1 >> 1;
+    v3 = v0 - v3;
+    v1 = v1 + v2 + 1 >> 1;
+    v2 = v1 - v2;
+    t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+    v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+    v7 = t;
+    t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+    v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+    v6 = t;
+    p0 = v0 + v7;
+    p7 = v0 - v7;
+    p1 = v1 + v6;
+    p6 = v1 - v6;
+    p2 = v2 + v5;
+    p5 = v2 - v5;
+    p3 = v3 + v4;
+    p4 = v3 - v4;
+
+    if (p0 < 16) {
+      p0 = 0;
+    } else if (p0 >= 4080) {
+      p0 = 255;
     } else {
-      this.borderStyle.setWidth(0);
+      p0 >>= 4;
     }
-  }
 
-  setAppearance(dict) {
-    this.appearance = null;
-    const appearanceStates = dict.get("AP");
+    if (p1 < 16) {
+      p1 = 0;
+    } else if (p1 >= 4080) {
+      p1 = 255;
+    } else {
+      p1 >>= 4;
+    }
 
-    if (!(0, _primitives.isDict)(appearanceStates)) {
-      return;
+    if (p2 < 16) {
+      p2 = 0;
+    } else if (p2 >= 4080) {
+      p2 = 255;
+    } else {
+      p2 >>= 4;
     }
 
-    const normalAppearanceState = appearanceStates.get("N");
+    if (p3 < 16) {
+      p3 = 0;
+    } else if (p3 >= 4080) {
+      p3 = 255;
+    } else {
+      p3 >>= 4;
+    }
 
-    if ((0, _primitives.isStream)(normalAppearanceState)) {
-      this.appearance = normalAppearanceState;
-      return;
+    if (p4 < 16) {
+      p4 = 0;
+    } else if (p4 >= 4080) {
+      p4 = 255;
+    } else {
+      p4 >>= 4;
     }
 
-    if (!(0, _primitives.isDict)(normalAppearanceState)) {
-      return;
+    if (p5 < 16) {
+      p5 = 0;
+    } else if (p5 >= 4080) {
+      p5 = 255;
+    } else {
+      p5 >>= 4;
     }
 
-    const as = dict.get("AS");
+    if (p6 < 16) {
+      p6 = 0;
+    } else if (p6 >= 4080) {
+      p6 = 255;
+    } else {
+      p6 >>= 4;
+    }
 
-    if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {
-      return;
+    if (p7 < 16) {
+      p7 = 0;
+    } else if (p7 >= 4080) {
+      p7 = 255;
+    } else {
+      p7 >>= 4;
     }
 
-    this.appearance = normalAppearanceState.get(as.name);
+    blockData[blockBufferOffset + col] = p0;
+    blockData[blockBufferOffset + col + 8] = p1;
+    blockData[blockBufferOffset + col + 16] = p2;
+    blockData[blockBufferOffset + col + 24] = p3;
+    blockData[blockBufferOffset + col + 32] = p4;
+    blockData[blockBufferOffset + col + 40] = p5;
+    blockData[blockBufferOffset + col + 48] = p6;
+    blockData[blockBufferOffset + col + 56] = p7;
   }
+}
 
-  loadResources(keys) {
-    return this.appearance.dict.getAsync("Resources").then(resources => {
-      if (!resources) {
-        return undefined;
-      }
+function buildComponentData(frame, component) {
+  const blocksPerLine = component.blocksPerLine;
+  const blocksPerColumn = component.blocksPerColumn;
+  const computationBuffer = new Int16Array(64);
 
-      const objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);
-      return objectLoader.load().then(function () {
-        return resources;
-      });
-    });
+  for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+    for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+      const offset = getBlockBufferOffset(component, blockRow, blockCol);
+      quantizeAndInverse(component, offset, computationBuffer);
+    }
   }
 
-  getOperatorList(evaluator, task, renderForms, annotationStorage) {
-    if (!this.appearance) {
-      return Promise.resolve(new _operator_list.OperatorList());
-    }
+  return component.blockData;
+}
 
-    const appearance = this.appearance;
-    const data = this.data;
-    const appearanceDict = appearance.dict;
-    const resourcesPromise = this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", 
"Font"]);
-    const bbox = appearanceDict.getArray("BBox") || [0, 0, 1, 1];
-    const matrix = appearanceDict.getArray("Matrix") || [1, 0, 0, 1, 0, 0];
-    const transform = getTransformMatrix(data.rect, bbox, matrix);
-    return resourcesPromise.then(resources => {
-      const opList = new _operator_list.OperatorList();
-      opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);
-      return evaluator.getOperatorList({
-        stream: appearance,
-        task,
-        resources,
-        operatorList: opList
-      }).then(() => {
-        opList.addOp(_util.OPS.endAnnotation, []);
-        appearance.reset();
-        return opList;
-      });
-    });
-  }
+function findNextFileMarker(data, currentPos, startPos = currentPos) {
+  const maxPos = data.length - 1;
+  let newPos = startPos < currentPos ? startPos : currentPos;
 
-  async save(evaluator, task, annotationStorage) {
+  if (currentPos >= maxPos) {
     return null;
   }
 
-}
-
-exports.Annotation = Annotation;
+  const currentMarker = (0, _core_utils.readUint16)(data, currentPos);
 
-class AnnotationBorderStyle {
-  constructor() {
-    this.width = 1;
-    this.style = _util.AnnotationBorderStyleType.SOLID;
-    this.dashArray = [3];
-    this.horizontalCornerRadius = 0;
-    this.verticalCornerRadius = 0;
+  if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
+    return {
+      invalid: null,
+      marker: currentMarker,
+      offset: currentPos
+    };
   }
 
-  setWidth(width, rect = [0, 0, 0, 0]) {
-    if ((0, _primitives.isName)(width)) {
-      this.width = 0;
-      return;
+  let newMarker = (0, _core_utils.readUint16)(data, newPos);
+
+  while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
+    if (++newPos >= maxPos) {
+      return null;
     }
 
-    if (Number.isInteger(width)) {
-      if (width > 0) {
-        const maxWidth = (rect[2] - rect[0]) / 2;
-        const maxHeight = (rect[3] - rect[1]) / 2;
+    newMarker = (0, _core_utils.readUint16)(data, newPos);
+  }
 
-        if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {
-          (0, _util.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);
-          width = 1;
-        }
-      }
+  return {
+    invalid: currentMarker.toString(16),
+    marker: newMarker,
+    offset: newPos
+  };
+}
 
-      this.width = width;
-    }
+class JpegImage {
+  constructor({
+    decodeTransform = null,
+    colorTransform = -1
+  } = {}) {
+    this._decodeTransform = decodeTransform;
+    this._colorTransform = colorTransform;
   }
 
-  setStyle(style) {
-    if (!(0, _primitives.isName)(style)) {
-      return;
-    }
-
-    switch (style.name) {
-      case "S":
-        this.style = _util.AnnotationBorderStyleType.SOLID;
-        break;
+  parse(data, {
+    dnlScanLines = null
+  } = {}) {
+    function readDataBlock() {
+      const length = (0, _core_utils.readUint16)(data, offset);
+      offset += 2;
+      let endOffset = offset + length - 2;
+      const fileMarker = findNextFileMarker(data, endOffset, offset);
 
-      case "D":
-        this.style = _util.AnnotationBorderStyleType.DASHED;
-        break;
+      if (fileMarker && fileMarker.invalid) {
+        (0, _util.warn)("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
+        endOffset = fileMarker.offset;
+      }
 
-      case "B":
-        this.style = _util.AnnotationBorderStyleType.BEVELED;
-        break;
+      const array = data.subarray(offset, endOffset);
+      offset += array.length;
+      return array;
+    }
 
-      case "I":
-        this.style = _util.AnnotationBorderStyleType.INSET;
-        break;
+    function prepareComponents(frame) {
+      const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
+      const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
 
-      case "U":
-        this.style = _util.AnnotationBorderStyleType.UNDERLINE;
-        break;
+      for (let i = 0, ii = frame.components.length; i < ii; i++) {
+        const component = frame.components[i];
+        const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
+        const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
+        const blocksPerLineForMcu = mcusPerLine * component.h;
+        const blocksPerColumnForMcu = mcusPerColumn * component.v;
+        const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
+        component.blockData = new Int16Array(blocksBufferSize);
+        component.blocksPerLine = blocksPerLine;
+        component.blocksPerColumn = blocksPerColumn;
+      }
 
-      default:
-        break;
+      frame.mcusPerLine = mcusPerLine;
+      frame.mcusPerColumn = mcusPerColumn;
     }
-  }
 
-  setDashArray(dashArray) {
-    if (Array.isArray(dashArray) && dashArray.length > 0) {
-      let isValid = true;
-      let allZeros = true;
+    let offset = 0;
+    let jfif = null;
+    let adobe = null;
+    let frame, resetInterval;
+    let numSOSMarkers = 0;
+    const quantizationTables = [];
+    const huffmanTablesAC = [],
+          huffmanTablesDC = [];
+    let fileMarker = (0, _core_utils.readUint16)(data, offset);
+    offset += 2;
+
+    if (fileMarker !== 0xffd8) {
+      throw new JpegError("SOI not found");
+    }
+
+    fileMarker = (0, _core_utils.readUint16)(data, offset);
+    offset += 2;
+
+    markerLoop: while (fileMarker !== 0xffd9) {
+      let i, j, l;
+
+      switch (fileMarker) {
+        case 0xffe0:
+        case 0xffe1:
+        case 0xffe2:
+        case 0xffe3:
+        case 0xffe4:
+        case 0xffe5:
+        case 0xffe6:
+        case 0xffe7:
+        case 0xffe8:
+        case 0xffe9:
+        case 0xffea:
+        case 0xffeb:
+        case 0xffec:
+        case 0xffed:
+        case 0xffee:
+        case 0xffef:
+        case 0xfffe:
+          const appData = readDataBlock();
+
+          if (fileMarker === 0xffe0) {
+            if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && 
appData[4] === 0) {
+              jfif = {
+                version: {
+                  major: appData[5],
+                  minor: appData[6]
+                },
+                densityUnits: appData[7],
+                xDensity: appData[8] << 8 | appData[9],
+                yDensity: appData[10] << 8 | appData[11],
+                thumbWidth: appData[12],
+                thumbHeight: appData[13],
+                thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+              };
+            }
+          }
 
-      for (const element of dashArray) {
-        const validNumber = +element >= 0;
+          if (fileMarker === 0xffee) {
+            if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && 
appData[4] === 0x65) {
+              adobe = {
+                version: appData[5] << 8 | appData[6],
+                flags0: appData[7] << 8 | appData[8],
+                flags1: appData[9] << 8 | appData[10],
+                transformCode: appData[11]
+              };
+            }
+          }
 
-        if (!validNumber) {
-          isValid = false;
           break;
-        } else if (element > 0) {
-          allZeros = false;
-        }
-      }
 
-      if (isValid && !allZeros) {
-        this.dashArray = dashArray;
-      } else {
-        this.width = 0;
-      }
-    } else if (dashArray) {
-      this.width = 0;
-    }
-  }
+        case 0xffdb:
+          const quantizationTablesLength = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
+          const quantizationTablesEnd = quantizationTablesLength + offset - 2;
+          let z;
 
-  setHorizontalCornerRadius(radius) {
-    if (Number.isInteger(radius)) {
-      this.horizontalCornerRadius = radius;
-    }
-  }
+          while (offset < quantizationTablesEnd) {
+            const quantizationTableSpec = data[offset++];
+            const tableData = new Uint16Array(64);
 
-  setVerticalCornerRadius(radius) {
-    if (Number.isInteger(radius)) {
-      this.verticalCornerRadius = radius;
-    }
-  }
+            if (quantizationTableSpec >> 4 === 0) {
+              for (j = 0; j < 64; j++) {
+                z = dctZigZag[j];
+                tableData[z] = data[offset++];
+              }
+            } else if (quantizationTableSpec >> 4 === 1) {
+              for (j = 0; j < 64; j++) {
+                z = dctZigZag[j];
+                tableData[z] = (0, _core_utils.readUint16)(data, offset);
+                offset += 2;
+              }
+            } else {
+              throw new JpegError("DQT - invalid table spec");
+            }
 
-}
+            quantizationTables[quantizationTableSpec & 15] = tableData;
+          }
 
-exports.AnnotationBorderStyle = AnnotationBorderStyle;
+          break;
 
-class MarkupAnnotation extends Annotation {
-  constructor(parameters) {
-    super(parameters);
-    const dict = parameters.dict;
+        case 0xffc0:
+        case 0xffc1:
+        case 0xffc2:
+          if (frame) {
+            throw new JpegError("Only single frame JPEGs supported");
+          }
 
-    if (dict.has("IRT")) {
-      const rawIRT = dict.getRaw("IRT");
-      this.data.inReplyTo = (0, _primitives.isRef)(rawIRT) ? rawIRT.toString() : null;
-      const rt = dict.get("RT");
-      this.data.replyType = (0, _primitives.isName)(rt) ? rt.name : _util.AnnotationReplyType.REPLY;
-    }
+          offset += 2;
+          frame = {};
+          frame.extended = fileMarker === 0xffc1;
+          frame.progressive = fileMarker === 0xffc2;
+          frame.precision = data[offset++];
+          const sofScanLines = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
+          frame.scanLines = dnlScanLines || sofScanLines;
+          frame.samplesPerLine = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
+          frame.components = [];
+          frame.componentIds = {};
+          const componentsCount = data[offset++];
+          let maxH = 0,
+              maxV = 0;
+
+          for (i = 0; i < componentsCount; i++) {
+            const componentId = data[offset];
+            const h = data[offset + 1] >> 4;
+            const v = data[offset + 1] & 15;
+
+            if (maxH < h) {
+              maxH = h;
+            }
 
-    if (this.data.replyType === _util.AnnotationReplyType.GROUP) {
-      const parent = dict.get("IRT");
-      this.data.title = (0, _util.stringToPDFString)(parent.get("T") || "");
-      this.setContents(parent.get("Contents"));
-      this.data.contents = this.contents;
+            if (maxV < v) {
+              maxV = v;
+            }
 
-      if (!parent.has("CreationDate")) {
-        this.data.creationDate = null;
-      } else {
-        this.setCreationDate(parent.get("CreationDate"));
-        this.data.creationDate = this.creationDate;
-      }
+            const qId = data[offset + 2];
+            l = frame.components.push({
+              h,
+              v,
+              quantizationId: qId,
+              quantizationTable: null
+            });
+            frame.componentIds[componentId] = l - 1;
+            offset += 3;
+          }
 
-      if (!parent.has("M")) {
-        this.data.modificationDate = null;
-      } else {
-        this.setModificationDate(parent.get("M"));
-        this.data.modificationDate = this.modificationDate;
-      }
+          frame.maxH = maxH;
+          frame.maxV = maxV;
+          prepareComponents(frame);
+          break;
 
-      this.data.hasPopup = parent.has("Popup");
+        case 0xffc4:
+          const huffmanLength = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
 
-      if (!parent.has("C")) {
-        this.data.color = null;
-      } else {
-        this.setColor(parent.getArray("C"));
-        this.data.color = this.color;
-      }
-    } else {
-      this.data.title = (0, _util.stringToPDFString)(dict.get("T") || "");
-      this.setCreationDate(dict.get("CreationDate"));
-      this.data.creationDate = this.creationDate;
-      this.data.hasPopup = dict.has("Popup");
+          for (i = 2; i < huffmanLength;) {
+            const huffmanTableSpec = data[offset++];
+            const codeLengths = new Uint8Array(16);
+            let codeLengthSum = 0;
 
-      if (!dict.has("C")) {
-        this.data.color = null;
-      }
-    }
-  }
+            for (j = 0; j < 16; j++, offset++) {
+              codeLengthSum += codeLengths[j] = data[offset];
+            }
 
-  setCreationDate(creationDate) {
-    this.creationDate = (0, _util.isString)(creationDate) ? creationDate : null;
-  }
+            const huffmanValues = new Uint8Array(codeLengthSum);
 
-}
+            for (j = 0; j < codeLengthSum; j++, offset++) {
+              huffmanValues[j] = data[offset];
+            }
 
-exports.MarkupAnnotation = MarkupAnnotation;
+            i += 17 + codeLengthSum;
+            (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = 
buildHuffmanTable(codeLengths, huffmanValues);
+          }
 
-class WidgetAnnotation extends Annotation {
-  constructor(params) {
-    super(params);
-    const dict = params.dict;
-    const data = this.data;
-    this.ref = params.ref;
-    data.annotationType = _util.AnnotationType.WIDGET;
-    data.fieldName = this._constructFieldName(dict);
-    const fieldValue = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "V",
-      getArray: true
-    });
-    data.fieldValue = this._decodeFormValue(fieldValue);
-    data.alternativeText = (0, _util.stringToPDFString)(dict.get("TU") || "");
-    data.defaultAppearance = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "DA"
-    }) || params.acroForm.get("DA") || "";
-    const fieldType = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "FT"
-    });
-    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
-    this.fieldResources = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "DR"
-    }) || params.acroForm.get("DR") || _primitives.Dict.empty;
-    data.fieldFlags = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "Ff"
-    });
+          break;
 
-    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
-      data.fieldFlags = 0;
-    }
+        case 0xffdd:
+          offset += 2;
+          resetInterval = (0, _core_utils.readUint16)(data, offset);
+          offset += 2;
+          break;
 
-    data.readOnly = this.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);
+        case 0xffda:
+          const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
+          offset += 2;
+          const selectorsCount = data[offset++],
+                components = [];
+
+          for (i = 0; i < selectorsCount; i++) {
+            const index = data[offset++];
+            const componentIndex = frame.componentIds[index];
+            const component = frame.components[componentIndex];
+            component.index = index;
+            const tableSpec = data[offset++];
+            component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+            component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+            components.push(component);
+          }
 
-    if (data.fieldType === "Sig") {
-      data.fieldValue = null;
-      this.setFlags(_util.AnnotationFlag.HIDDEN);
-    }
-  }
+          const spectralStart = data[offset++],
+                spectralEnd = data[offset++],
+                successiveApproximation = data[offset++];
 
-  _constructFieldName(dict) {
-    if (!dict.has("T") && !dict.has("Parent")) {
-      (0, _util.warn)("Unknown field name, falling back to empty field name.");
-      return "";
-    }
+          try {
+            const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, 
spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
+            offset += processed;
+          } catch (ex) {
+            if (ex instanceof DNLMarkerError) {
+              (0, _util.warn)(`${ex.message} -- attempting to re-parse the JPEG image.`);
+              return this.parse(data, {
+                dnlScanLines: ex.scanLines
+              });
+            } else if (ex instanceof EOIMarkerError) {
+              (0, _util.warn)(`${ex.message} -- ignoring the rest of the image data.`);
+              break markerLoop;
+            }
 
-    if (!dict.has("Parent")) {
-      return (0, _util.stringToPDFString)(dict.get("T"));
-    }
+            throw ex;
+          }
 
-    const fieldName = [];
+          break;
 
-    if (dict.has("T")) {
-      fieldName.unshift((0, _util.stringToPDFString)(dict.get("T")));
-    }
+        case 0xffdc:
+          offset += 4;
+          break;
 
-    let loopDict = dict;
+        case 0xffff:
+          if (data[offset] !== 0xff) {
+            offset--;
+          }
 
-    while (loopDict.has("Parent")) {
-      loopDict = loopDict.get("Parent");
+          break;
 
-      if (!(0, _primitives.isDict)(loopDict)) {
-        break;
-      }
+        default:
+          const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
 
-      if (loopDict.has("T")) {
-        fieldName.unshift((0, _util.stringToPDFString)(loopDict.get("T")));
+          if (nextFileMarker && nextFileMarker.invalid) {
+            (0, _util.warn)("JpegImage.parse - unexpected data, current marker is: " + 
nextFileMarker.invalid);
+            offset = nextFileMarker.offset;
+            break;
+          }
+
+          if (!nextFileMarker || offset >= data.length - 1) {
+            (0, _util.warn)("JpegImage.parse - reached the end of the image data " + "without finding an EOI 
marker (0xFFD9).");
+            break markerLoop;
+          }
+
+          throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
       }
+
+      fileMarker = (0, _core_utils.readUint16)(data, offset);
+      offset += 2;
     }
 
-    return fieldName.join(".");
-  }
+    this.width = frame.samplesPerLine;
+    this.height = frame.scanLines;
+    this.jfif = jfif;
+    this.adobe = adobe;
+    this.components = [];
 
-  _decodeFormValue(formValue) {
-    if (Array.isArray(formValue)) {
-      return formValue.filter(item => (0, _util.isString)(item)).map(item => (0, 
_util.stringToPDFString)(item));
-    } else if ((0, _primitives.isName)(formValue)) {
-      return (0, _util.stringToPDFString)(formValue.name);
-    } else if ((0, _util.isString)(formValue)) {
-      return (0, _util.stringToPDFString)(formValue);
+    for (let i = 0, ii = frame.components.length; i < ii; i++) {
+      const component = frame.components[i];
+      const quantizationTable = quantizationTables[component.quantizationId];
+
+      if (quantizationTable) {
+        component.quantizationTable = quantizationTable;
+      }
+
+      this.components.push({
+        index: component.index,
+        output: buildComponentData(frame, component),
+        scaleX: component.h / frame.maxH,
+        scaleY: component.v / frame.maxV,
+        blocksPerLine: component.blocksPerLine,
+        blocksPerColumn: component.blocksPerColumn
+      });
     }
 
-    return null;
+    this.numComponents = this.components.length;
+    return undefined;
   }
 
-  hasFieldFlag(flag) {
-    return !!(this.data.fieldFlags & flag);
-  }
+  _getLinearizedBlockData(width, height, isSourcePDF = false) {
+    const scaleX = this.width / width,
+          scaleY = this.height / height;
+    let component, componentScaleX, componentScaleY, blocksPerScanline;
+    let x, y, i, j, k;
+    let index;
+    let offset = 0;
+    let output;
+    const numComponents = this.components.length;
+    const dataLength = width * height * numComponents;
+    const data = new Uint8ClampedArray(dataLength);
+    const xScaleBlockOffset = new Uint32Array(width);
+    const mask3LSB = 0xfffffff8;
+    let lastComponentScaleX;
 
-  getOperatorList(evaluator, task, renderForms, annotationStorage) {
-    if (renderForms) {
-      return Promise.resolve(new _operator_list.OperatorList());
-    }
+    for (i = 0; i < numComponents; i++) {
+      component = this.components[i];
+      componentScaleX = component.scaleX * scaleX;
+      componentScaleY = component.scaleY * scaleY;
+      offset = i;
+      output = component.output;
+      blocksPerScanline = component.blocksPerLine + 1 << 3;
 
-    if (!this._hasText) {
-      return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
-    }
+      if (componentScaleX !== lastComponentScaleX) {
+        for (x = 0; x < width; x++) {
+          j = 0 | x * componentScaleX;
+          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
+        }
 
-    return this._getAppearance(evaluator, task, annotationStorage).then(content => {
-      if (this.appearance && content === null) {
-        return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
+        lastComponentScaleX = componentScaleX;
       }
 
-      const operatorList = new _operator_list.OperatorList();
+      for (y = 0; y < height; y++) {
+        j = 0 | y * componentScaleY;
+        index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
 
-      if (!this.data.defaultAppearance || content === null) {
-        return operatorList;
+        for (x = 0; x < width; x++) {
+          data[offset] = output[index + xScaleBlockOffset[x]];
+          offset += numComponents;
+        }
       }
+    }
 
-      const matrix = [1, 0, 0, 1, 0, 0];
-      const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];
-      const transform = getTransformMatrix(this.data.rect, bbox, matrix);
-      operatorList.addOp(_util.OPS.beginAnnotation, [this.data.rect, transform, matrix]);
-      const stream = new _stream.StringStream(content);
-      return evaluator.getOperatorList({
-        stream,
-        task,
-        resources: this.fieldResources,
-        operatorList
-      }).then(function () {
-        operatorList.addOp(_util.OPS.endAnnotation, []);
-        return operatorList;
-      });
-    });
-  }
+    let transform = this._decodeTransform;
 
-  async save(evaluator, task, annotationStorage) {
-    if (this.data.fieldValue === annotationStorage[this.data.id]) {
-      return null;
+    if (!isSourcePDF && numComponents === 4 && !transform) {
+      transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
     }
 
-    let appearance = await this._getAppearance(evaluator, task, annotationStorage);
-
-    if (appearance === null) {
-      return null;
+    if (transform) {
+      for (i = 0; i < dataLength;) {
+        for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
+          data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
+        }
+      }
     }
 
-    const dict = evaluator.xref.fetchIfRef(this.ref);
+    return data;
+  }
 
-    if (!(0, _primitives.isDict)(dict)) {
-      return null;
+  get _isColorConversionNeeded() {
+    if (this.adobe) {
+      return !!this.adobe.transformCode;
     }
 
-    const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];
-    const newRef = evaluator.xref.getNewRef();
-    const AP = new _primitives.Dict(evaluator.xref);
-    AP.set("N", newRef);
-    const value = annotationStorage[this.data.id];
-    const encrypt = evaluator.xref.encrypt;
-    let originalTransform = null;
-    let newTransform = null;
+    if (this.numComponents === 3) {
+      if (this._colorTransform === 0) {
+        return false;
+      } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && 
this.components[2].index === 0x42) {
+        return false;
+      }
 
-    if (encrypt) {
-      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
-      newTransform = encrypt.createCipherTransform(newRef.num, newRef.gen);
-      appearance = newTransform.encryptString(appearance);
+      return true;
     }
 
-    dict.set("V", value);
-    dict.set("AP", AP);
-    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
-    const appearanceDict = new _primitives.Dict(evaluator.xref);
-    appearanceDict.set("Length", appearance.length);
-    appearanceDict.set("Subtype", _primitives.Name.get("Form"));
-    appearanceDict.set("Resources", this.fieldResources);
-    appearanceDict.set("BBox", bbox);
-    const bufferOriginal = [`${this.ref.num} ${this.ref.gen} obj\n`];
-    (0, _writer.writeDict)(dict, bufferOriginal, originalTransform);
-    bufferOriginal.push("\nendobj\n");
-    const bufferNew = [`${newRef.num} ${newRef.gen} obj\n`];
-    (0, _writer.writeDict)(appearanceDict, bufferNew, newTransform);
-    bufferNew.push(" stream\n");
-    bufferNew.push(appearance);
-    bufferNew.push("\nendstream\nendobj\n");
-    return [{
-      ref: this.ref,
-      data: bufferOriginal.join("")
-    }, {
-      ref: newRef,
-      data: bufferNew.join("")
-    }];
+    if (this._colorTransform === 1) {
+      return true;
+    }
+
+    return false;
   }
 
-  async _getAppearance(evaluator, task, annotationStorage) {
-    const isPassword = this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD);
+  _convertYccToRgb(data) {
+    let Y, Cb, Cr;
 
-    if (!annotationStorage || isPassword) {
-      return null;
+    for (let i = 0, length = data.length; i < length; i += 3) {
+      Y = data[i];
+      Cb = data[i + 1];
+      Cr = data[i + 2];
+      data[i] = Y - 179.456 + 1.402 * Cr;
+      data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
+      data[i + 2] = Y - 226.816 + 1.772 * Cb;
     }
 
-    const value = annotationStorage[this.data.id];
-
-    if (value === "") {
-      return "";
-    }
+    return data;
+  }
 
-    const defaultPadding = 2;
-    const hPadding = defaultPadding;
-    const totalHeight = this.data.rect[3] - this.data.rect[1];
-    const totalWidth = this.data.rect[2] - this.data.rect[0];
-    const fontInfo = await this._getFontData(evaluator, task);
-    const [font, fontName] = fontInfo;
-    let fontSize = fontInfo[2];
-    fontSize = this._computeFontSize(font, fontName, fontSize, totalHeight);
-    let descent = font.descent;
+  _convertYcckToRgb(data) {
+    let Y, Cb, Cr, k;
+    let offset = 0;
 
-    if (isNaN(descent)) {
-      descent = 0;
+    for (let i = 0, length = data.length; i < length; i += 4) {
+      Y = data[i];
+      Cb = data[i + 1];
+      Cr = data[i + 2];
+      k = data[i + 3];
+      data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 
5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 
0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 
0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
+      data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 
0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 
0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 
0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
+      data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 
0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 
0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 
0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
     }
 
-    const vPadding = defaultPadding + Math.abs(descent) * fontSize;
-    const defaultAppearance = this.data.defaultAppearance;
-    const alignment = this.data.textAlignment;
-
-    if (this.data.comb) {
-      return this._getCombAppearance(defaultAppearance, value, totalWidth, hPadding, vPadding);
-    }
+    return data.subarray(0, offset);
+  }
 
-    if (this.data.multiLine) {
-      return this._getMultilineAppearance(defaultAppearance, value, font, fontSize, totalWidth, totalHeight, 
alignment, hPadding, vPadding);
-    }
+  _convertYcckToCmyk(data) {
+    let Y, Cb, Cr;
 
-    if (alignment === 0 || alignment > 2) {
-      return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm (${(0, 
_util.escapeString)(value)}) Tj` + " ET Q EMC";
+    for (let i = 0, length = data.length; i < length; i += 4) {
+      Y = data[i];
+      Cb = data[i + 1];
+      Cr = data[i + 2];
+      data[i] = 434.456 - Y - 1.402 * Cr;
+      data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
+      data[i + 2] = 481.816 - Y - 1.772 * Cb;
     }
 
-    const renderedText = this._renderText(value, font, fontSize, totalWidth, alignment, hPadding, vPadding);
-
-    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC";
+    return data;
   }
 
-  async _getFontData(evaluator, task) {
-    const operatorList = new _operator_list.OperatorList();
-    const initialState = {
-      fontSize: 0,
-      font: null,
-      fontName: null,
+  _convertCmykToRgb(data) {
+    let c, m, y, k;
+    let offset = 0;
 
-      clone() {
-        return this;
-      }
+    for (let i = 0, length = data.length; i < length; i += 4) {
+      c = data[i];
+      m = data[i + 1];
+      y = data[i + 2];
+      k = data[i + 3];
+      data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 
0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m 
- 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * 
(-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * 
k + 0.7430659151342254);
+      data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 
0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * 
m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 
* y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.00031891311758832814 * k + 
0.7364883807733168);
+      data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 
0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 
* m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * 
(5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k 
+ 0.7063770186160144);
+    }
 
-    };
-    await evaluator.getOperatorList({
-      stream: new _stream.StringStream(this.data.defaultAppearance),
-      task,
-      resources: this.fieldResources,
-      operatorList,
-      initialState
-    });
-    return [initialState.font, initialState.fontName, initialState.fontSize];
+    return data.subarray(0, offset);
   }
 
-  _computeFontSize(font, fontName, fontSize, height) {
-    if (fontSize === null || fontSize === 0) {
-      const em = font.charsToGlyphs("M", true)[0].width / 1000;
-      const capHeight = 0.7 * em;
-      fontSize = Math.max(1, Math.floor(height / (1.5 * capHeight)));
-      let fontRegex = new RegExp(`/${fontName}\\s+[0-9\.]+\\s+Tf`);
-
-      if (this.data.defaultAppearance.search(fontRegex) === -1) {
-        fontRegex = new RegExp(`/${fontName}\\s+Tf`);
-      }
-
-      this.data.defaultAppearance = this.data.defaultAppearance.replace(fontRegex, `/${fontName} ${fontSize} 
Tf`);
+  getData({
+    width,
+    height,
+    forceRGB = false,
+    isSourcePDF = false
+  }) {
+    if (this.numComponents > 4) {
+      throw new JpegError("Unsupported color mode");
     }
 
-    return fontSize;
-  }
+    const data = this._getLinearizedBlockData(width, height, isSourcePDF);
 
-  _renderText(text, font, fontSize, totalWidth, alignment, hPadding, vPadding) {
-    const glyphs = font.charsToGlyphs(text);
-    const scale = fontSize / 1000;
-    let width = 0;
+    if (this.numComponents === 1 && forceRGB) {
+      const dataLength = data.length;
+      const rgbData = new Uint8ClampedArray(dataLength * 3);
+      let offset = 0;
 
-    for (const glyph of glyphs) {
-      width += glyph.width * scale;
-    }
+      for (let i = 0; i < dataLength; i++) {
+        const grayColor = data[i];
+        rgbData[offset++] = grayColor;
+        rgbData[offset++] = grayColor;
+        rgbData[offset++] = grayColor;
+      }
 
-    let shift;
+      return rgbData;
+    } else if (this.numComponents === 3 && this._isColorConversionNeeded) {
+      return this._convertYccToRgb(data);
+    } else if (this.numComponents === 4) {
+      if (this._isColorConversionNeeded) {
+        if (forceRGB) {
+          return this._convertYcckToRgb(data);
+        }
 
-    if (alignment === 1) {
-      shift = (totalWidth - width) / 2;
-    } else if (alignment === 2) {
-      shift = totalWidth - width - hPadding;
-    } else {
-      shift = hPadding;
+        return this._convertYcckToCmyk(data);
+      } else if (forceRGB) {
+        return this._convertCmykToRgb(data);
+      }
     }
 
-    shift = shift.toFixed(2);
-    vPadding = vPadding.toFixed(2);
-    return `${shift} ${vPadding} Td (${(0, _util.escapeString)(text)}) Tj`;
+    return data;
   }
 
 }
 
-class TextWidgetAnnotation extends WidgetAnnotation {
-  constructor(params) {
-    super(params);
-    this._hasText = true;
-    const dict = params.dict;
+exports.JpegImage = JpegImage;
 
-    if (!(0, _util.isString)(this.data.fieldValue)) {
-      this.data.fieldValue = "";
-    }
+/***/ }),
+/* 29 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    let alignment = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "Q"
-    });
 
-    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
-      alignment = null;
-    }
 
-    this.data.textAlignment = alignment;
-    let maximumLength = (0, _core_utils.getInheritableProperty)({
-      dict,
-      key: "MaxLen"
-    });
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.JpxStream = void 0;
 
-    if (!Number.isInteger(maximumLength) || maximumLength < 0) {
-      maximumLength = null;
-    }
+var _decode_stream = __w_pdfjs_require__(19);
 
-    this.data.maxLen = maximumLength;
-    this.data.multiLine = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);
-    this.data.comb = this.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;
+var _jpx = __w_pdfjs_require__(30);
+
+var _util = __w_pdfjs_require__(2);
+
+class JpxStream extends _decode_stream.DecodeStream {
+  constructor(stream, maybeLength, params) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+    this.params = params;
   }
 
-  _getCombAppearance(defaultAppearance, text, width, hPadding, vPadding) {
-    const combWidth = (width / this.data.maxLen).toFixed(2);
-    const buf = [];
+  get bytes() {
+    return (0, _util.shadow)(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
+
+  ensureBuffer(requested) {}
 
-    for (const character of text) {
-      buf.push(`(${(0, _util.escapeString)(character)}) Tj`);
+  readBlock() {
+    if (this.eof) {
+      return;
     }
 
-    const renderedComb = buf.join(` ${combWidth} 0 Td `);
-    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 ${hPadding} ${vPadding} Tm ${renderedComb}` + " 
ET Q EMC";
-  }
+    const jpxImage = new _jpx.JpxImage();
+    jpxImage.parse(this.bytes);
+    const width = jpxImage.width;
+    const height = jpxImage.height;
+    const componentsCount = jpxImage.componentsCount;
+    const tileCount = jpxImage.tiles.length;
 
-  _getMultilineAppearance(defaultAppearance, text, font, fontSize, width, height, alignment, hPadding, 
vPadding) {
-    const lines = text.split(/\r\n|\r|\n/);
-    const buf = [];
-    const totalWidth = width - 2 * hPadding;
+    if (tileCount === 1) {
+      this.buffer = jpxImage.tiles[0].items;
+    } else {
+      const data = new Uint8ClampedArray(width * height * componentsCount);
 
-    for (const line of lines) {
-      const chunks = this._splitLine(line, font, fontSize, totalWidth);
+      for (let k = 0; k < tileCount; k++) {
+        const tileComponents = jpxImage.tiles[k];
+        const tileWidth = tileComponents.width;
+        const tileHeight = tileComponents.height;
+        const tileLeft = tileComponents.left;
+        const tileTop = tileComponents.top;
+        const src = tileComponents.items;
+        let srcPosition = 0;
+        let dataPosition = (width * tileTop + tileLeft) * componentsCount;
+        const imgRowSize = width * componentsCount;
+        const tileRowSize = tileWidth * componentsCount;
 
-      for (const chunk of chunks) {
-        const padding = buf.length === 0 ? hPadding : 0;
-        buf.push(this._renderText(chunk, font, fontSize, width, alignment, padding, -fontSize));
+        for (let j = 0; j < tileHeight; j++) {
+          const rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
+          data.set(rowBytes, dataPosition);
+          srcPosition += tileRowSize;
+          dataPosition += imgRowSize;
+        }
       }
+
+      this.buffer = data;
     }
 
-    const renderedText = buf.join("\n");
-    return "/Tx BMC q BT " + defaultAppearance + ` 1 0 0 1 0 ${height} Tm ${renderedText}` + " ET Q EMC";
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
   }
 
-  _splitLine(line, font, fontSize, width) {
-    if (line.length <= 1) {
-      return [line];
-    }
+}
 
-    const scale = fontSize / 1000;
-    const whitespace = font.charsToGlyphs(" ", true)[0].width * scale;
-    const chunks = [];
-    let lastSpacePos = -1,
-        startChunk = 0,
-        currentWidth = 0;
+exports.JpxStream = JpxStream;
 
-    for (let i = 0, ii = line.length; i < ii; i++) {
-      const character = line.charAt(i);
+/***/ }),
+/* 30 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      if (character === " ") {
-        if (currentWidth + whitespace > width) {
-          chunks.push(line.substring(startChunk, i));
-          startChunk = i;
-          currentWidth = whitespace;
-          lastSpacePos = -1;
-        } else {
-          currentWidth += whitespace;
-          lastSpacePos = i;
-        }
-      } else {
-        const charWidth = font.charsToGlyphs(character, false)[0].width * scale;
 
-        if (currentWidth + charWidth > width) {
-          if (lastSpacePos !== -1) {
-            chunks.push(line.substring(startChunk, lastSpacePos + 1));
-            startChunk = i = lastSpacePos + 1;
-            lastSpacePos = -1;
-            currentWidth = 0;
-          } else {
-            chunks.push(line.substring(startChunk, i));
-            startChunk = i;
-            currentWidth = charWidth;
-          }
-        } else {
-          currentWidth += charWidth;
-        }
-      }
-    }
 
-    if (startChunk < line.length) {
-      chunks.push(line.substring(startChunk, line.length));
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.JpxImage = void 0;
 
-    return chunks;
+var _util = __w_pdfjs_require__(2);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _arithmetic_decoder = __w_pdfjs_require__(26);
+
+class JpxError extends _util.BaseException {
+  constructor(msg) {
+    super(`JPX error: ${msg}`);
   }
 
 }
 
-class ButtonWidgetAnnotation extends WidgetAnnotation {
-  constructor(params) {
-    super(params);
-    this.checkedAppearance = null;
-    this.uncheckedAppearance = null;
-    this.data.checkBox = !this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
-    this.data.radioButton = this.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && 
!this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
-    this.data.pushButton = this.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+const SubbandsGainLog2 = {
+  LL: 0,
+  LH: 1,
+  HL: 1,
+  HH: 2
+};
 
-    if (this.data.checkBox) {
-      this._processCheckBox(params);
-    } else if (this.data.radioButton) {
-      this._processRadioButton(params);
-    } else if (this.data.pushButton) {
-      this._processPushButton(params);
-    } else {
-      (0, _util.warn)("Invalid field flags for button widget annotation");
-    }
+class JpxImage {
+  constructor() {
+    this.failOnCorruptedImage = false;
   }
 
-  getOperatorList(evaluator, task, renderForms, annotationStorage) {
-    if (this.data.pushButton) {
-      return super.getOperatorList(evaluator, task, false, annotationStorage);
+  parse(data) {
+    const head = (0, _core_utils.readUint16)(data, 0);
+
+    if (head === 0xff4f) {
+      this.parseCodestream(data, 0, data.length);
+      return;
     }
 
-    if (annotationStorage) {
-      const value = annotationStorage[this.data.id] || false;
-      let appearance;
+    const length = data.length;
+    let position = 0;
 
-      if (value) {
-        appearance = this.checkedAppearance;
-      } else {
-        appearance = this.uncheckedAppearance;
+    while (position < length) {
+      let headerSize = 8;
+      let lbox = (0, _core_utils.readUint32)(data, position);
+      const tbox = (0, _core_utils.readUint32)(data, position + 4);
+      position += headerSize;
+
+      if (lbox === 1) {
+        lbox = (0, _core_utils.readUint32)(data, position) * 4294967296 + (0, _core_utils.readUint32)(data, 
position + 4);
+        position += 8;
+        headerSize += 8;
       }
 
-      if (appearance) {
-        const savedAppearance = this.appearance;
-        this.appearance = appearance;
-        const operatorList = super.getOperatorList(evaluator, task, renderForms, annotationStorage);
-        this.appearance = savedAppearance;
-        return operatorList;
+      if (lbox === 0) {
+        lbox = length - position + headerSize;
       }
 
-      return Promise.resolve(new _operator_list.OperatorList());
-    }
+      if (lbox < headerSize) {
+        throw new JpxError("Invalid box field size");
+      }
 
-    return super.getOperatorList(evaluator, task, renderForms, annotationStorage);
-  }
+      const dataLength = lbox - headerSize;
+      let jumpDataLength = true;
 
-  async save(evaluator, task, annotationStorage) {
-    if (this.data.checkBox) {
-      return this._saveCheckbox(evaluator, task, annotationStorage);
-    }
+      switch (tbox) {
+        case 0x6a703268:
+          jumpDataLength = false;
+          break;
 
-    if (this.data.radioButton) {
-      return this._saveRadioButton(evaluator, task, annotationStorage);
-    }
+        case 0x636f6c72:
+          const method = data[position];
 
-    return super.save(evaluator, task, annotationStorage);
-  }
+          if (method === 1) {
+            const colorspace = (0, _core_utils.readUint32)(data, position + 3);
 
-  async _saveCheckbox(evaluator, task, annotationStorage) {
-    const defaultValue = this.data.fieldValue && this.data.fieldValue !== "Off";
-    const value = annotationStorage[this.data.id];
+            switch (colorspace) {
+              case 16:
+              case 17:
+              case 18:
+                break;
 
-    if (defaultValue === value) {
-      return null;
-    }
+              default:
+                (0, _util.warn)("Unknown colorspace " + colorspace);
+                break;
+            }
+          } else if (method === 2) {
+            (0, _util.info)("ICC profile not supported");
+          }
 
-    const dict = evaluator.xref.fetchIfRef(this.ref);
+          break;
 
-    if (!(0, _primitives.isDict)(dict)) {
-      return null;
-    }
+        case 0x6a703263:
+          this.parseCodestream(data, position, position + dataLength);
+          break;
 
-    const name = _primitives.Name.get(value ? this.data.exportValue : "Off");
+        case 0x6a502020:
+          if ((0, _core_utils.readUint32)(data, position) !== 0x0d0a870a) {
+            (0, _util.warn)("Invalid JP2 signature");
+          }
 
-    dict.set("V", name);
-    dict.set("AS", name);
-    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
-    const encrypt = evaluator.xref.encrypt;
-    let originalTransform = null;
+          break;
 
-    if (encrypt) {
-      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
-    }
+        case 0x6a501a1a:
+        case 0x66747970:
+        case 0x72726571:
+        case 0x72657320:
+        case 0x69686472:
+          break;
 
-    const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`];
-    (0, _writer.writeDict)(dict, buffer, originalTransform);
-    buffer.push("\nendobj\n");
-    return [{
-      ref: this.ref,
-      data: buffer.join("")
-    }];
+        default:
+          const headerType = String.fromCharCode(tbox >> 24 & 0xff, tbox >> 16 & 0xff, tbox >> 8 & 0xff, 
tbox & 0xff);
+          (0, _util.warn)(`Unsupported header type ${tbox} (${headerType}).`);
+          break;
+      }
+
+      if (jumpDataLength) {
+        position += dataLength;
+      }
+    }
   }
 
-  async _saveRadioButton(evaluator, task, annotationStorage) {
-    const defaultValue = this.data.fieldValue === this.data.buttonValue;
-    const value = annotationStorage[this.data.id];
+  parseImageProperties(stream) {
+    let newByte = stream.getByte();
 
-    if (defaultValue === value) {
-      return null;
+    while (newByte >= 0) {
+      const oldByte = newByte;
+      newByte = stream.getByte();
+      const code = oldByte << 8 | newByte;
+
+      if (code === 0xff51) {
+        stream.skip(4);
+        const Xsiz = stream.getInt32() >>> 0;
+        const Ysiz = stream.getInt32() >>> 0;
+        const XOsiz = stream.getInt32() >>> 0;
+        const YOsiz = stream.getInt32() >>> 0;
+        stream.skip(16);
+        const Csiz = stream.getUint16();
+        this.width = Xsiz - XOsiz;
+        this.height = Ysiz - YOsiz;
+        this.componentsCount = Csiz;
+        this.bitsPerComponent = 8;
+        return;
+      }
     }
 
-    const dict = evaluator.xref.fetchIfRef(this.ref);
+    throw new JpxError("No size marker found in JPX stream");
+  }
 
-    if (!(0, _primitives.isDict)(dict)) {
-      return null;
-    }
+  parseCodestream(data, start, end) {
+    const context = {};
+    let doNotRecover = false;
 
-    const name = _primitives.Name.get(value ? this.data.buttonValue : "Off");
+    try {
+      let position = start;
 
-    let parentBuffer = null;
-    const encrypt = evaluator.xref.encrypt;
+      while (position + 1 < end) {
+        const code = (0, _core_utils.readUint16)(data, position);
+        position += 2;
+        let length = 0,
+            j,
+            sqcd,
+            spqcds,
+            spqcdSize,
+            scalarExpounded,
+            tile;
+
+        switch (code) {
+          case 0xff4f:
+            context.mainHeader = true;
+            break;
 
-    if (value) {
-      if ((0, _primitives.isRef)(this.parent)) {
-        const parent = evaluator.xref.fetch(this.parent);
-        let parentTransform = null;
+          case 0xffd9:
+            break;
 
-        if (encrypt) {
-          parentTransform = encrypt.createCipherTransform(this.parent.num, this.parent.gen);
-        }
+          case 0xff51:
+            length = (0, _core_utils.readUint16)(data, position);
+            const siz = {};
+            siz.Xsiz = (0, _core_utils.readUint32)(data, position + 4);
+            siz.Ysiz = (0, _core_utils.readUint32)(data, position + 8);
+            siz.XOsiz = (0, _core_utils.readUint32)(data, position + 12);
+            siz.YOsiz = (0, _core_utils.readUint32)(data, position + 16);
+            siz.XTsiz = (0, _core_utils.readUint32)(data, position + 20);
+            siz.YTsiz = (0, _core_utils.readUint32)(data, position + 24);
+            siz.XTOsiz = (0, _core_utils.readUint32)(data, position + 28);
+            siz.YTOsiz = (0, _core_utils.readUint32)(data, position + 32);
+            const componentsCount = (0, _core_utils.readUint16)(data, position + 36);
+            siz.Csiz = componentsCount;
+            const components = [];
+            j = position + 38;
+
+            for (let i = 0; i < componentsCount; i++) {
+              const component = {
+                precision: (data[j] & 0x7f) + 1,
+                isSigned: !!(data[j] & 0x80),
+                XRsiz: data[j + 1],
+                YRsiz: data[j + 2]
+              };
+              j += 3;
+              calculateComponentDimensions(component, siz);
+              components.push(component);
+            }
 
-        parent.set("V", name);
-        parentBuffer = [`${this.parent.num} ${this.parent.gen} obj\n`];
-        (0, _writer.writeDict)(parent, parentBuffer, parentTransform);
-        parentBuffer.push("\nendobj\n");
-      } else if ((0, _primitives.isDict)(this.parent)) {
-        this.parent.set("V", name);
-      }
-    }
+            context.SIZ = siz;
+            context.components = components;
+            calculateTileGrids(context, components);
+            context.QCC = [];
+            context.COC = [];
+            break;
 
-    dict.set("AS", name);
-    dict.set("M", `D:${(0, _util.getModificationDate)()}`);
-    let originalTransform = null;
+          case 0xff5c:
+            length = (0, _core_utils.readUint16)(data, position);
+            const qcd = {};
+            j = position + 2;
+            sqcd = data[j++];
 
-    if (encrypt) {
-      originalTransform = encrypt.createCipherTransform(this.ref.num, this.ref.gen);
-    }
+            switch (sqcd & 0x1f) {
+              case 0:
+                spqcdSize = 8;
+                scalarExpounded = true;
+                break;
 
-    const buffer = [`${this.ref.num} ${this.ref.gen} obj\n`];
-    (0, _writer.writeDict)(dict, buffer, originalTransform);
-    buffer.push("\nendobj\n");
-    const newRefs = [{
-      ref: this.ref,
-      data: buffer.join("")
-    }];
+              case 1:
+                spqcdSize = 16;
+                scalarExpounded = false;
+                break;
 
-    if (parentBuffer !== null) {
-      newRefs.push({
-        ref: this.parent,
-        data: parentBuffer.join("")
-      });
-    }
+              case 2:
+                spqcdSize = 16;
+                scalarExpounded = true;
+                break;
 
-    return newRefs;
-  }
+              default:
+                throw new Error("Invalid SQcd value " + sqcd);
+            }
 
-  _processCheckBox(params) {
-    const customAppearance = params.dict.get("AP");
+            qcd.noQuantization = spqcdSize === 8;
+            qcd.scalarExpounded = scalarExpounded;
+            qcd.guardBits = sqcd >> 5;
+            spqcds = [];
 
-    if (!(0, _primitives.isDict)(customAppearance)) {
-      return;
-    }
+            while (j < length + position) {
+              const spqcd = {};
 
-    const normalAppearance = customAppearance.get("N");
+              if (spqcdSize === 8) {
+                spqcd.epsilon = data[j++] >> 3;
+                spqcd.mu = 0;
+              } else {
+                spqcd.epsilon = data[j] >> 3;
+                spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
+                j += 2;
+              }
 
-    if (!(0, _primitives.isDict)(normalAppearance)) {
-      return;
-    }
+              spqcds.push(spqcd);
+            }
 
-    const exportValues = normalAppearance.getKeys();
+            qcd.SPqcds = spqcds;
 
-    if (!exportValues.includes("Off")) {
-      exportValues.push("Off");
-    }
+            if (context.mainHeader) {
+              context.QCD = qcd;
+            } else {
+              context.currentTile.QCD = qcd;
+              context.currentTile.QCC = [];
+            }
 
-    if (exportValues.length !== 2) {
-      return;
-    }
+            break;
 
-    this.data.exportValue = exportValues[0] === "Off" ? exportValues[1] : exportValues[0];
-    this.checkedAppearance = normalAppearance.get(this.data.exportValue);
-    this.uncheckedAppearance = normalAppearance.get("Off") || null;
-  }
+          case 0xff5d:
+            length = (0, _core_utils.readUint16)(data, position);
+            const qcc = {};
+            j = position + 2;
+            let cqcc;
 
-  _processRadioButton(params) {
-    this.data.fieldValue = this.data.buttonValue = null;
-    const fieldParent = params.dict.get("Parent");
+            if (context.SIZ.Csiz < 257) {
+              cqcc = data[j++];
+            } else {
+              cqcc = (0, _core_utils.readUint16)(data, j);
+              j += 2;
+            }
 
-    if ((0, _primitives.isDict)(fieldParent) && fieldParent.has("V")) {
-      const fieldParentValue = fieldParent.get("V");
+            sqcd = data[j++];
 
-      if ((0, _primitives.isName)(fieldParentValue)) {
-        this.parent = params.dict.getRaw("Parent");
-        this.data.fieldValue = this._decodeFormValue(fieldParentValue);
-      }
-    }
+            switch (sqcd & 0x1f) {
+              case 0:
+                spqcdSize = 8;
+                scalarExpounded = true;
+                break;
 
-    const appearanceStates = params.dict.get("AP");
+              case 1:
+                spqcdSize = 16;
+                scalarExpounded = false;
+                break;
 
-    if (!(0, _primitives.isDict)(appearanceStates)) {
-      return;
-    }
+              case 2:
+                spqcdSize = 16;
+                scalarExpounded = true;
+                break;
 
-    const normalAppearance = appearanceStates.get("N");
+              default:
+                throw new Error("Invalid SQcd value " + sqcd);
+            }
 
-    if (!(0, _primitives.isDict)(normalAppearance)) {
-      return;
-    }
+            qcc.noQuantization = spqcdSize === 8;
+            qcc.scalarExpounded = scalarExpounded;
+            qcc.guardBits = sqcd >> 5;
+            spqcds = [];
 
-    for (const key of normalAppearance.getKeys()) {
-      if (key !== "Off") {
-        this.data.buttonValue = key;
-        break;
-      }
-    }
+            while (j < length + position) {
+              const spqcd = {};
 
-    this.checkedAppearance = normalAppearance.get(this.data.buttonValue);
-    this.uncheckedAppearance = normalAppearance.get("Off") || null;
-  }
+              if (spqcdSize === 8) {
+                spqcd.epsilon = data[j++] >> 3;
+                spqcd.mu = 0;
+              } else {
+                spqcd.epsilon = data[j] >> 3;
+                spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
+                j += 2;
+              }
 
-  _processPushButton(params) {
-    if (!params.dict.has("A")) {
-      (0, _util.warn)("Push buttons without action dictionaries are not supported");
-      return;
-    }
+              spqcds.push(spqcd);
+            }
 
-    _obj.Catalog.parseDestDictionary({
-      destDict: params.dict,
-      resultObj: this.data,
-      docBaseUrl: params.pdfManager.docBaseUrl
-    });
-  }
+            qcc.SPqcds = spqcds;
 
-}
+            if (context.mainHeader) {
+              context.QCC[cqcc] = qcc;
+            } else {
+              context.currentTile.QCC[cqcc] = qcc;
+            }
 
-class ChoiceWidgetAnnotation extends WidgetAnnotation {
-  constructor(params) {
-    super(params);
-    this.data.options = [];
-    const options = (0, _core_utils.getInheritableProperty)({
-      dict: params.dict,
-      key: "Opt"
-    });
+            break;
 
-    if (Array.isArray(options)) {
-      const xref = params.xref;
+          case 0xff52:
+            length = (0, _core_utils.readUint16)(data, position);
+            const cod = {};
+            j = position + 2;
+            const scod = data[j++];
+            cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
+            cod.sopMarkerUsed = !!(scod & 2);
+            cod.ephMarkerUsed = !!(scod & 4);
+            cod.progressionOrder = data[j++];
+            cod.layersCount = (0, _core_utils.readUint16)(data, j);
+            j += 2;
+            cod.multipleComponentTransform = data[j++];
+            cod.decompositionLevelsCount = data[j++];
+            cod.xcb = (data[j++] & 0xf) + 2;
+            cod.ycb = (data[j++] & 0xf) + 2;
+            const blockStyle = data[j++];
+            cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
+            cod.resetContextProbabilities = !!(blockStyle & 2);
+            cod.terminationOnEachCodingPass = !!(blockStyle & 4);
+            cod.verticallyStripe = !!(blockStyle & 8);
+            cod.predictableTermination = !!(blockStyle & 16);
+            cod.segmentationSymbolUsed = !!(blockStyle & 32);
+            cod.reversibleTransformation = data[j++];
+
+            if (cod.entropyCoderWithCustomPrecincts) {
+              const precinctsSizes = [];
 
-      for (let i = 0, ii = options.length; i < ii; i++) {
-        const option = xref.fetchIfRef(options[i]);
-        const isOptionArray = Array.isArray(option);
-        this.data.options[i] = {
-          exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option),
-          displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option)
-        };
-      }
-    }
+              while (j < length + position) {
+                const precinctsSize = data[j++];
+                precinctsSizes.push({
+                  PPx: precinctsSize & 0xf,
+                  PPy: precinctsSize >> 4
+                });
+              }
 
-    if ((0, _util.isString)(this.data.fieldValue)) {
-      this.data.fieldValue = [this.data.fieldValue];
-    } else if (!this.data.fieldValue) {
-      this.data.fieldValue = [];
-    }
+              cod.precinctsSizes = precinctsSizes;
+            }
 
-    this.data.combo = this.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);
-    this.data.multiSelect = this.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);
-    this._hasText = true;
-  }
+            const unsupported = [];
 
-}
+            if (cod.selectiveArithmeticCodingBypass) {
+              unsupported.push("selectiveArithmeticCodingBypass");
+            }
 
-class TextAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    const DEFAULT_ICON_SIZE = 22;
-    super(parameters);
-    const dict = parameters.dict;
-    this.data.annotationType = _util.AnnotationType.TEXT;
+            if (cod.resetContextProbabilities) {
+              unsupported.push("resetContextProbabilities");
+            }
 
-    if (this.data.hasAppearance) {
-      this.data.name = "NoIcon";
-    } else {
-      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;
-      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;
-      this.data.name = dict.has("Name") ? dict.get("Name").name : "Note";
-    }
+            if (cod.terminationOnEachCodingPass) {
+              unsupported.push("terminationOnEachCodingPass");
+            }
 
-    if (dict.has("State")) {
-      this.data.state = dict.get("State") || null;
-      this.data.stateModel = dict.get("StateModel") || null;
-    } else {
-      this.data.state = null;
-      this.data.stateModel = null;
-    }
-  }
+            if (cod.verticallyStripe) {
+              unsupported.push("verticallyStripe");
+            }
 
-}
+            if (cod.predictableTermination) {
+              unsupported.push("predictableTermination");
+            }
 
-class LinkAnnotation extends Annotation {
-  constructor(params) {
-    super(params);
-    this.data.annotationType = _util.AnnotationType.LINK;
-    const quadPoints = getQuadPoints(params.dict, this.rectangle);
+            if (unsupported.length > 0) {
+              doNotRecover = true;
+              (0, _util.warn)(`JPX: Unsupported COD options (${unsupported.join(", ")}).`);
+            }
 
-    if (quadPoints) {
-      this.data.quadPoints = quadPoints;
-    }
+            if (context.mainHeader) {
+              context.COD = cod;
+            } else {
+              context.currentTile.COD = cod;
+              context.currentTile.COC = [];
+            }
 
-    _obj.Catalog.parseDestDictionary({
-      destDict: params.dict,
-      resultObj: this.data,
-      docBaseUrl: params.pdfManager.docBaseUrl
-    });
-  }
+            break;
 
-}
+          case 0xff90:
+            length = (0, _core_utils.readUint16)(data, position);
+            tile = {};
+            tile.index = (0, _core_utils.readUint16)(data, position + 2);
+            tile.length = (0, _core_utils.readUint32)(data, position + 4);
+            tile.dataEnd = tile.length + position - 2;
+            tile.partIndex = data[position + 8];
+            tile.partsCount = data[position + 9];
+            context.mainHeader = false;
+
+            if (tile.partIndex === 0) {
+              tile.COD = context.COD;
+              tile.COC = context.COC.slice(0);
+              tile.QCD = context.QCD;
+              tile.QCC = context.QCC.slice(0);
+            }
 
-class PopupAnnotation extends Annotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.POPUP;
-    let parentItem = parameters.dict.get("Parent");
+            context.currentTile = tile;
+            break;
 
-    if (!parentItem) {
-      (0, _util.warn)("Popup annotation has a missing or invalid parent annotation.");
-      return;
-    }
+          case 0xff93:
+            tile = context.currentTile;
 
-    const parentSubtype = parentItem.get("Subtype");
-    this.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;
-    const rawParent = parameters.dict.getRaw("Parent");
-    this.data.parentId = (0, _primitives.isRef)(rawParent) ? rawParent.toString() : null;
-    const rt = parentItem.get("RT");
+            if (tile.partIndex === 0) {
+              initializeTile(context, tile.index);
+              buildPackets(context);
+            }
 
-    if ((0, _primitives.isName)(rt, _util.AnnotationReplyType.GROUP)) {
-      parentItem = parentItem.get("IRT");
-    }
+            length = tile.dataEnd - position;
+            parseTilePackets(context, data, position, length);
+            break;
 
-    if (!parentItem.has("M")) {
-      this.data.modificationDate = null;
-    } else {
-      this.setModificationDate(parentItem.get("M"));
-      this.data.modificationDate = this.modificationDate;
-    }
+          case 0xff53:
+            (0, _util.warn)("JPX: Codestream code 0xFF53 (COC) is not implemented.");
 
-    if (!parentItem.has("C")) {
-      this.data.color = null;
-    } else {
-      this.setColor(parentItem.getArray("C"));
-      this.data.color = this.color;
-    }
+          case 0xff55:
+          case 0xff57:
+          case 0xff58:
+          case 0xff64:
+            length = (0, _core_utils.readUint16)(data, position);
+            break;
 
-    if (!this.viewable) {
-      const parentFlags = parentItem.get("F");
+          default:
+            throw new Error("Unknown codestream code: " + code.toString(16));
+        }
 
-      if (this._isViewable(parentFlags)) {
-        this.setFlags(parentFlags);
+        position += length;
+      }
+    } catch (e) {
+      if (doNotRecover || this.failOnCorruptedImage) {
+        throw new JpxError(e.message);
+      } else {
+        (0, _util.warn)(`JPX: Trying to recover from: "${e.message}".`);
       }
     }
 
-    this.data.title = (0, _util.stringToPDFString)(parentItem.get("T") || "");
-    this.data.contents = (0, _util.stringToPDFString)(parentItem.get("Contents") || "");
+    this.tiles = transformComponents(context);
+    this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
+    this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
+    this.componentsCount = context.SIZ.Csiz;
   }
 
 }
 
-class FreeTextAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.FREETEXT;
-  }
+exports.JpxImage = JpxImage;
 
+function calculateComponentDimensions(component, siz) {
+  component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
+  component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
+  component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
+  component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
+  component.width = component.x1 - component.x0;
+  component.height = component.y1 - component.y0;
 }
 
-class LineAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.LINE;
-    this.data.lineCoordinates = _util.Util.normalizeRect(parameters.dict.getArray("L"));
+function calculateTileGrids(context, components) {
+  const siz = context.SIZ;
+  const tiles = [];
+  let tile;
+  const numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
+  const numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+
+  for (let q = 0; q < numYtiles; q++) {
+    for (let p = 0; p < numXtiles; p++) {
+      tile = {};
+      tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
+      tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
+      tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
+      tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
+      tile.width = tile.tx1 - tile.tx0;
+      tile.height = tile.ty1 - tile.ty0;
+      tile.components = [];
+      tiles.push(tile);
+    }
+  }
+
+  context.tiles = tiles;
+  const componentsCount = siz.Csiz;
+
+  for (let i = 0, ii = componentsCount; i < ii; i++) {
+    const component = components[i];
+
+    for (let j = 0, jj = tiles.length; j < jj; j++) {
+      const tileComponent = {};
+      tile = tiles[j];
+      tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
+      tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
+      tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
+      tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
+      tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
+      tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
+      tile.components[i] = tileComponent;
+    }
   }
-
 }
 
-class SquareAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.SQUARE;
-  }
-
-}
+function getBlocksDimensions(context, component, r) {
+  const codOrCoc = component.codingStyleParameters;
+  const result = {};
 
-class CircleAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.CIRCLE;
+  if (!codOrCoc.entropyCoderWithCustomPrecincts) {
+    result.PPx = 15;
+    result.PPy = 15;
+  } else {
+    result.PPx = codOrCoc.precinctsSizes[r].PPx;
+    result.PPy = codOrCoc.precinctsSizes[r].PPy;
   }
 
+  result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);
+  result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);
+  return result;
 }
 
-class PolylineAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.POLYLINE;
-    const rawVertices = parameters.dict.getArray("Vertices");
-    this.data.vertices = [];
+function buildPrecincts(context, resolution, dimensions) {
+  const precinctWidth = 1 << dimensions.PPx;
+  const precinctHeight = 1 << dimensions.PPy;
+  const isZeroRes = resolution.resLevel === 0;
+  const precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);
+  const precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);
+  const numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - 
Math.floor(resolution.trx0 / precinctWidth) : 0;
+  const numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - 
Math.floor(resolution.try0 / precinctHeight) : 0;
+  const numprecincts = numprecinctswide * numprecinctshigh;
+  resolution.precinctParameters = {
+    precinctWidth,
+    precinctHeight,
+    numprecinctswide,
+    numprecinctshigh,
+    numprecincts,
+    precinctWidthInSubband,
+    precinctHeightInSubband
+  };
+}
 
-    for (let i = 0, ii = rawVertices.length; i < ii; i += 2) {
-      this.data.vertices.push({
-        x: rawVertices[i],
-        y: rawVertices[i + 1]
-      });
-    }
-  }
+function buildCodeblocks(context, subband, dimensions) {
+  const xcb_ = dimensions.xcb_;
+  const ycb_ = dimensions.ycb_;
+  const codeblockWidth = 1 << xcb_;
+  const codeblockHeight = 1 << ycb_;
+  const cbx0 = subband.tbx0 >> xcb_;
+  const cby0 = subband.tby0 >> ycb_;
+  const cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;
+  const cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;
+  const precinctParameters = subband.resolution.precinctParameters;
+  const codeblocks = [];
+  const precincts = [];
+  let i, j, codeblock, precinctNumber;
+
+  for (j = cby0; j < cby1; j++) {
+    for (i = cbx0; i < cbx1; i++) {
+      codeblock = {
+        cbx: i,
+        cby: j,
+        tbx0: codeblockWidth * i,
+        tby0: codeblockHeight * j,
+        tbx1: codeblockWidth * (i + 1),
+        tby1: codeblockHeight * (j + 1)
+      };
+      codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
+      codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
+      codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
+      codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
+      const pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);
+      const pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);
+      precinctNumber = pi + pj * precinctParameters.numprecinctswide;
+      codeblock.precinctNumber = precinctNumber;
+      codeblock.subbandType = subband.type;
+      codeblock.Lblock = 3;
+
+      if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {
+        continue;
+      }
 
-}
+      codeblocks.push(codeblock);
+      let precinct = precincts[precinctNumber];
 
-class PolygonAnnotation extends PolylineAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.POLYGON;
-  }
+      if (precinct !== undefined) {
+        if (i < precinct.cbxMin) {
+          precinct.cbxMin = i;
+        } else if (i > precinct.cbxMax) {
+          precinct.cbxMax = i;
+        }
 
-}
+        if (j < precinct.cbyMin) {
+          precinct.cbxMin = j;
+        } else if (j > precinct.cbyMax) {
+          precinct.cbyMax = j;
+        }
+      } else {
+        precincts[precinctNumber] = precinct = {
+          cbxMin: i,
+          cbyMin: j,
+          cbxMax: i,
+          cbyMax: j
+        };
+      }
 
-class CaretAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.CARET;
+      codeblock.precinct = precinct;
+    }
   }
 
+  subband.codeblockParameters = {
+    codeblockWidth: xcb_,
+    codeblockHeight: ycb_,
+    numcodeblockwide: cbx1 - cbx0 + 1,
+    numcodeblockhigh: cby1 - cby0 + 1
+  };
+  subband.codeblocks = codeblocks;
+  subband.precincts = precincts;
 }
 
-class InkAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.INK;
-    const xref = parameters.xref;
-    const originalInkLists = parameters.dict.getArray("InkList");
-    this.data.inkLists = [];
+function createPacket(resolution, precinctNumber, layerNumber) {
+  const precinctCodeblocks = [];
+  const subbands = resolution.subbands;
 
-    for (let i = 0, ii = originalInkLists.length; i < ii; ++i) {
-      this.data.inkLists.push([]);
+  for (let i = 0, ii = subbands.length; i < ii; i++) {
+    const subband = subbands[i];
+    const codeblocks = subband.codeblocks;
 
-      for (let j = 0, jj = originalInkLists[i].length; j < jj; j += 2) {
-        this.data.inkLists[i].push({
-          x: xref.fetchIfRef(originalInkLists[i][j]),
-          y: xref.fetchIfRef(originalInkLists[i][j + 1])
-        });
+    for (let j = 0, jj = codeblocks.length; j < jj; j++) {
+      const codeblock = codeblocks[j];
+
+      if (codeblock.precinctNumber !== precinctNumber) {
+        continue;
       }
+
+      precinctCodeblocks.push(codeblock);
     }
   }
 
+  return {
+    layerNumber,
+    codeblocks: precinctCodeblocks
+  };
 }
 
-class HighlightAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.HIGHLIGHT;
-    const quadPoints = getQuadPoints(parameters.dict, this.rectangle);
+function LayerResolutionComponentPositionIterator(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const layersCount = tile.codingStyleDefaultParameters.layersCount;
+  const componentsCount = siz.Csiz;
+  let maxDecompositionLevelsCount = 0;
 
-    if (quadPoints) {
-      this.data.quadPoints = quadPoints;
-    }
+  for (let q = 0; q < componentsCount; q++) {
+    maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
tile.components[q].codingStyleParameters.decompositionLevelsCount);
   }
 
-}
-
-class UnderlineAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.UNDERLINE;
-    const quadPoints = getQuadPoints(parameters.dict, this.rectangle);
+  let l = 0,
+      r = 0,
+      i = 0,
+      k = 0;
 
-    if (quadPoints) {
-      this.data.quadPoints = quadPoints;
-    }
-  }
+  this.nextPacket = function JpxImage_nextPacket() {
+    for (; l < layersCount; l++) {
+      for (; r <= maxDecompositionLevelsCount; r++) {
+        for (; i < componentsCount; i++) {
+          const component = tile.components[i];
 
-}
+          if (r > component.codingStyleParameters.decompositionLevelsCount) {
+            continue;
+          }
 
-class SquigglyAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.SQUIGGLY;
-    const quadPoints = getQuadPoints(parameters.dict, this.rectangle);
+          const resolution = component.resolutions[r];
+          const numprecincts = resolution.precinctParameters.numprecincts;
 
-    if (quadPoints) {
-      this.data.quadPoints = quadPoints;
-    }
-  }
+          for (; k < numprecincts;) {
+            const packet = createPacket(resolution, k, l);
+            k++;
+            return packet;
+          }
 
-}
+          k = 0;
+        }
 
-class StrikeOutAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.STRIKEOUT;
-    const quadPoints = getQuadPoints(parameters.dict, this.rectangle);
+        i = 0;
+      }
 
-    if (quadPoints) {
-      this.data.quadPoints = quadPoints;
+      r = 0;
     }
-  }
 
+    throw new JpxError("Out of packets");
+  };
 }
 
-class StampAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    this.data.annotationType = _util.AnnotationType.STAMP;
-  }
-
-}
+function ResolutionLayerComponentPositionIterator(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const layersCount = tile.codingStyleDefaultParameters.layersCount;
+  const componentsCount = siz.Csiz;
+  let maxDecompositionLevelsCount = 0;
 
-class FileAttachmentAnnotation extends MarkupAnnotation {
-  constructor(parameters) {
-    super(parameters);
-    const file = new _obj.FileSpec(parameters.dict.get("FS"), parameters.xref);
-    this.data.annotationType = _util.AnnotationType.FILEATTACHMENT;
-    this.data.file = file.serializable;
+  for (let q = 0; q < componentsCount; q++) {
+    maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
tile.components[q].codingStyleParameters.decompositionLevelsCount);
   }
 
-}
+  let r = 0,
+      l = 0,
+      i = 0,
+      k = 0;
 
-/***/ }),
-/* 26 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+  this.nextPacket = function JpxImage_nextPacket() {
+    for (; r <= maxDecompositionLevelsCount; r++) {
+      for (; l < layersCount; l++) {
+        for (; i < componentsCount; i++) {
+          const component = tile.components[i];
 
-"use strict";
+          if (r > component.codingStyleParameters.decompositionLevelsCount) {
+            continue;
+          }
 
+          const resolution = component.resolutions[r];
+          const numprecincts = resolution.precinctParameters.numprecincts;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.OperatorList = void 0;
+          for (; k < numprecincts;) {
+            const packet = createPacket(resolution, k, l);
+            k++;
+            return packet;
+          }
 
-var _util = __w_pdfjs_require__(2);
+          k = 0;
+        }
 
-var QueueOptimizer = function QueueOptimizerClosure() {
-  function addState(parentState, pattern, checkFn, iterateFn, processFn) {
-    var state = parentState;
+        i = 0;
+      }
 
-    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
-      var item = pattern[i];
-      state = state[item] || (state[item] = []);
+      l = 0;
     }
 
-    state[pattern[pattern.length - 1]] = {
-      checkFn,
-      iterateFn,
-      processFn
-    };
-  }
-
-  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {
-    var iFirstPIMXO = iFirstSave + 2;
-
-    for (var i = 0; i < count; i++) {
-      var arg = argsArray[iFirstPIMXO + 4 * i];
-      var imageMask = arg.length === 1 && arg[0];
-
-      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || 
imageMask.data.length === 1 && imageMask.data[0] === 0)) {
-        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;
-        continue;
-      }
+    throw new JpxError("Out of packets");
+  };
+}
 
-      break;
-    }
+function ResolutionPositionComponentLayerIterator(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const layersCount = tile.codingStyleDefaultParameters.layersCount;
+  const componentsCount = siz.Csiz;
+  let l, r, c, p;
+  let maxDecompositionLevelsCount = 0;
 
-    return count - i;
+  for (c = 0; c < componentsCount; c++) {
+    const component = tile.components[c];
+    maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 
component.codingStyleParameters.decompositionLevelsCount);
   }
 
-  var InitialState = [];
-  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, 
_util.OPS.restore], null, function iterateInlineImageGroup(context, i) {
-    var fnArray = context.fnArray;
-    var iFirstSave = context.iCurr - 3;
-    var pos = (i - iFirstSave) % 4;
-
-    switch (pos) {
-      case 0:
-        return fnArray[i] === _util.OPS.save;
+  const maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);
 
-      case 1:
-        return fnArray[i] === _util.OPS.transform;
+  for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
+    let maxNumPrecincts = 0;
 
-      case 2:
-        return fnArray[i] === _util.OPS.paintInlineImageXObject;
+    for (c = 0; c < componentsCount; ++c) {
+      const resolutions = tile.components[c].resolutions;
 
-      case 3:
-        return fnArray[i] === _util.OPS.restore;
+      if (r < resolutions.length) {
+        maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);
+      }
     }
 
-    throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);
-  }, function foundInlineImageGroup(context, i) {
-    var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
-    var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
-    var MAX_WIDTH = 1000;
-    var IMAGE_PADDING = 1;
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var curr = context.iCurr;
-    var iFirstSave = curr - 3;
-    var iFirstTransform = curr - 2;
-    var iFirstPIIXO = curr - 1;
-    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
-
-    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
-      return i - (i - iFirstSave) % 4;
-    }
-
-    var maxX = 0;
-    var map = [],
-        maxLineHeight = 0;
-    var currentX = IMAGE_PADDING,
-        currentY = IMAGE_PADDING;
-    var q;
-
-    for (q = 0; q < count; q++) {
-      var transform = argsArray[iFirstTransform + (q << 2)];
-      var img = argsArray[iFirstPIIXO + (q << 2)][0];
-
-      if (currentX + img.width > MAX_WIDTH) {
-        maxX = Math.max(maxX, currentX);
-        currentY += maxLineHeight + 2 * IMAGE_PADDING;
-        currentX = 0;
-        maxLineHeight = 0;
-      }
-
-      map.push({
-        transform,
-        x: currentX,
-        y: currentY,
-        w: img.width,
-        h: img.height
-      });
-      currentX += img.width + 2 * IMAGE_PADDING;
-      maxLineHeight = Math.max(maxLineHeight, img.height);
-    }
-
-    var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
-    var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
-    var imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);
-    var imgRowSize = imgWidth << 2;
-
-    for (q = 0; q < count; q++) {
-      var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
-      var rowSize = map[q].w << 2;
-      var dataOffset = 0;
-      var offset = map[q].x + map[q].y * imgWidth << 2;
-      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
-
-      for (var k = 0, kk = map[q].h; k < kk; k++) {
-        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
-        dataOffset += rowSize;
-        offset += imgRowSize;
-      }
-
-      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
-
-      while (offset >= 0) {
-        data[offset - 4] = data[offset];
-        data[offset - 3] = data[offset + 1];
-        data[offset - 2] = data[offset + 2];
-        data[offset - 1] = data[offset + 3];
-        data[offset + rowSize] = data[offset + rowSize - 4];
-        data[offset + rowSize + 1] = data[offset + rowSize - 3];
-        data[offset + rowSize + 2] = data[offset + rowSize - 2];
-        data[offset + rowSize + 3] = data[offset + rowSize - 1];
-        offset -= imgRowSize;
-      }
-    }
-
-    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);
-    argsArray.splice(iFirstSave, count * 4, [{
-      width: imgWidth,
-      height: imgHeight,
-      kind: _util.ImageKind.RGBA_32BPP,
-      data: imgData
-    }, map]);
-    return iFirstSave + 1;
-  });
-  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, 
_util.OPS.restore], null, function iterateImageMaskGroup(context, i) {
-    var fnArray = context.fnArray;
-    var iFirstSave = context.iCurr - 3;
-    var pos = (i - iFirstSave) % 4;
+    maxNumPrecinctsInLevel[r] = maxNumPrecincts;
+  }
 
-    switch (pos) {
-      case 0:
-        return fnArray[i] === _util.OPS.save;
+  l = 0;
+  r = 0;
+  c = 0;
+  p = 0;
 
-      case 1:
-        return fnArray[i] === _util.OPS.transform;
+  this.nextPacket = function JpxImage_nextPacket() {
+    for (; r <= maxDecompositionLevelsCount; r++) {
+      for (; p < maxNumPrecinctsInLevel[r]; p++) {
+        for (; c < componentsCount; c++) {
+          const component = tile.components[c];
 
-      case 2:
-        return fnArray[i] === _util.OPS.paintImageMaskXObject;
+          if (r > component.codingStyleParameters.decompositionLevelsCount) {
+            continue;
+          }
 
-      case 3:
-        return fnArray[i] === _util.OPS.restore;
-    }
+          const resolution = component.resolutions[r];
+          const numprecincts = resolution.precinctParameters.numprecincts;
 
-    throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);
-  }, function foundImageMaskGroup(context, i) {
-    var MIN_IMAGES_IN_MASKS_BLOCK = 10;
-    var MAX_IMAGES_IN_MASKS_BLOCK = 100;
-    var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var curr = context.iCurr;
-    var iFirstSave = curr - 3;
-    var iFirstTransform = curr - 2;
-    var iFirstPIMXO = curr - 1;
-    var count = Math.floor((i - iFirstSave) / 4);
-    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);
-
-    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
-      return i - (i - iFirstSave) % 4;
-    }
-
-    var q;
-    var isSameImage = false;
-    var iTransform, transformArgs;
-    var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
-    const firstTransformArg0 = argsArray[iFirstTransform][0],
-          firstTransformArg1 = argsArray[iFirstTransform][1],
-          firstTransformArg2 = argsArray[iFirstTransform][2],
-          firstTransformArg3 = argsArray[iFirstTransform][3];
-
-    if (firstTransformArg1 === firstTransformArg2) {
-      isSameImage = true;
-      iTransform = iFirstTransform + 4;
-      var iPIMXO = iFirstPIMXO + 4;
-
-      for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
-        transformArgs = argsArray[iTransform];
-
-        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || 
transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== 
firstTransformArg3) {
-          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
-            isSameImage = false;
-          } else {
-            count = q;
+          if (p >= numprecincts) {
+            continue;
           }
 
-          break;
-        }
-      }
-    }
-
-    if (isSameImage) {
-      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
-      var positions = new Float32Array(count * 2);
-      iTransform = iFirstTransform;
+          for (; l < layersCount;) {
+            const packet = createPacket(resolution, p, l);
+            l++;
+            return packet;
+          }
 
-      for (q = 0; q < count; q++, iTransform += 4) {
-        transformArgs = argsArray[iTransform];
-        positions[q << 1] = transformArgs[4];
-        positions[(q << 1) + 1] = transformArgs[5];
-      }
+          l = 0;
+        }
 
-      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);
-      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, 
firstTransformArg2, firstTransformArg3, positions]);
-    } else {
-      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
-      var images = [];
-
-      for (q = 0; q < count; q++) {
-        transformArgs = argsArray[iFirstTransform + (q << 2)];
-        var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
-        images.push({
-          data: maskParams.data,
-          width: maskParams.width,
-          height: maskParams.height,
-          transform: transformArgs
-        });
+        c = 0;
       }
 
-      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);
-      argsArray.splice(iFirstSave, count * 4, [images]);
+      p = 0;
     }
 
-    return iFirstSave + 1;
-  });
-  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, 
_util.OPS.restore], function (context) {
-    var argsArray = context.argsArray;
-    var iFirstTransform = context.iCurr - 2;
-    return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
-  }, function iterateImageGroup(context, i) {
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var iFirstSave = context.iCurr - 3;
-    var pos = (i - iFirstSave) % 4;
+    throw new JpxError("Out of packets");
+  };
+}
 
-    switch (pos) {
-      case 0:
-        return fnArray[i] === _util.OPS.save;
+function PositionComponentResolutionLayerIterator(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const layersCount = tile.codingStyleDefaultParameters.layersCount;
+  const componentsCount = siz.Csiz;
+  const precinctsSizes = getPrecinctSizesInImageScale(tile);
+  const precinctsIterationSizes = precinctsSizes;
+  let l = 0,
+      r = 0,
+      c = 0,
+      px = 0,
+      py = 0;
+
+  this.nextPacket = function JpxImage_nextPacket() {
+    for (; py < precinctsIterationSizes.maxNumHigh; py++) {
+      for (; px < precinctsIterationSizes.maxNumWide; px++) {
+        for (; c < componentsCount; c++) {
+          const component = tile.components[c];
+          const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+
+          for (; r <= decompositionLevelsCount; r++) {
+            const resolution = component.resolutions[r];
+            const sizeInImageScale = precinctsSizes.components[c].resolutions[r];
+            const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
+
+            if (k === null) {
+              continue;
+            }
 
-      case 1:
-        if (fnArray[i] !== _util.OPS.transform) {
-          return false;
-        }
+            for (; l < layersCount;) {
+              const packet = createPacket(resolution, k, l);
+              l++;
+              return packet;
+            }
 
-        var iFirstTransform = context.iCurr - 2;
-        var firstTransformArg0 = argsArray[iFirstTransform][0];
-        var firstTransformArg3 = argsArray[iFirstTransform][3];
+            l = 0;
+          }
 
-        if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || 
argsArray[i][3] !== firstTransformArg3) {
-          return false;
+          r = 0;
         }
 
-        return true;
+        c = 0;
+      }
 
-      case 2:
-        if (fnArray[i] !== _util.OPS.paintImageXObject) {
-          return false;
-        }
+      px = 0;
+    }
 
-        var iFirstPIXO = context.iCurr - 1;
-        var firstPIXOArg0 = argsArray[iFirstPIXO][0];
+    throw new JpxError("Out of packets");
+  };
+}
 
-        if (argsArray[i][0] !== firstPIXOArg0) {
-          return false;
+function ComponentPositionResolutionLayerIterator(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const layersCount = tile.codingStyleDefaultParameters.layersCount;
+  const componentsCount = siz.Csiz;
+  const precinctsSizes = getPrecinctSizesInImageScale(tile);
+  let l = 0,
+      r = 0,
+      c = 0,
+      px = 0,
+      py = 0;
+
+  this.nextPacket = function JpxImage_nextPacket() {
+    for (; c < componentsCount; ++c) {
+      const component = tile.components[c];
+      const precinctsIterationSizes = precinctsSizes.components[c];
+      const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+
+      for (; py < precinctsIterationSizes.maxNumHigh; py++) {
+        for (; px < precinctsIterationSizes.maxNumWide; px++) {
+          for (; r <= decompositionLevelsCount; r++) {
+            const resolution = component.resolutions[r];
+            const sizeInImageScale = precinctsIterationSizes.resolutions[r];
+            const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
+
+            if (k === null) {
+              continue;
+            }
+
+            for (; l < layersCount;) {
+              const packet = createPacket(resolution, k, l);
+              l++;
+              return packet;
+            }
+
+            l = 0;
+          }
+
+          r = 0;
         }
 
-        return true;
+        px = 0;
+      }
 
-      case 3:
-        return fnArray[i] === _util.OPS.restore;
+      py = 0;
     }
 
-    throw new Error(`iterateImageGroup - invalid pos: ${pos}`);
-  }, function (context, i) {
-    var MIN_IMAGES_IN_BLOCK = 3;
-    var MAX_IMAGES_IN_BLOCK = 1000;
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var curr = context.iCurr;
-    var iFirstSave = curr - 3;
-    var iFirstTransform = curr - 2;
-    var iFirstPIXO = curr - 1;
-    var firstPIXOArg0 = argsArray[iFirstPIXO][0];
-    var firstTransformArg0 = argsArray[iFirstTransform][0];
-    var firstTransformArg3 = argsArray[iFirstTransform][3];
-    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);
+    throw new JpxError("Out of packets");
+  };
+}
 
-    if (count < MIN_IMAGES_IN_BLOCK) {
-      return i - (i - iFirstSave) % 4;
-    }
+function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
+  const posX = pxIndex * precinctIterationSizes.minWidth;
+  const posY = pyIndex * precinctIterationSizes.minHeight;
 
-    var positions = new Float32Array(count * 2);
-    var iTransform = iFirstTransform;
+  if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {
+    return null;
+  }
 
-    for (var q = 0; q < count; q++, iTransform += 4) {
-      var transformArgs = argsArray[iTransform];
-      positions[q << 1] = transformArgs[4];
-      positions[(q << 1) + 1] = transformArgs[5];
-    }
+  const startPrecinctRowIndex = posY / sizeInImageScale.width * 
resolution.precinctParameters.numprecinctswide;
+  return posX / sizeInImageScale.height + startPrecinctRowIndex;
+}
 
-    var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
-    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);
-    argsArray.splice(iFirstSave, count * 4, args);
-    return iFirstSave + 1;
-  });
-  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, 
_util.OPS.showText, _util.OPS.endText], null, function iterateShowTextGroup(context, i) {
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var iFirstSave = context.iCurr - 4;
-    var pos = (i - iFirstSave) % 5;
+function getPrecinctSizesInImageScale(tile) {
+  const componentsCount = tile.components.length;
+  let minWidth = Number.MAX_VALUE;
+  let minHeight = Number.MAX_VALUE;
+  let maxNumWide = 0;
+  let maxNumHigh = 0;
+  const sizePerComponent = new Array(componentsCount);
+
+  for (let c = 0; c < componentsCount; c++) {
+    const component = tile.components[c];
+    const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+    const sizePerResolution = new Array(decompositionLevelsCount + 1);
+    let minWidthCurrentComponent = Number.MAX_VALUE;
+    let minHeightCurrentComponent = Number.MAX_VALUE;
+    let maxNumWideCurrentComponent = 0;
+    let maxNumHighCurrentComponent = 0;
+    let scale = 1;
+
+    for (let r = decompositionLevelsCount; r >= 0; --r) {
+      const resolution = component.resolutions[r];
+      const widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;
+      const heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;
+      minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);
+      minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);
+      maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, 
resolution.precinctParameters.numprecinctswide);
+      maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, 
resolution.precinctParameters.numprecinctshigh);
+      sizePerResolution[r] = {
+        width: widthCurrentResolution,
+        height: heightCurrentResolution
+      };
+      scale <<= 1;
+    }
+
+    minWidth = Math.min(minWidth, minWidthCurrentComponent);
+    minHeight = Math.min(minHeight, minHeightCurrentComponent);
+    maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
+    maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);
+    sizePerComponent[c] = {
+      resolutions: sizePerResolution,
+      minWidth: minWidthCurrentComponent,
+      minHeight: minHeightCurrentComponent,
+      maxNumWide: maxNumWideCurrentComponent,
+      maxNumHigh: maxNumHighCurrentComponent
+    };
+  }
 
-    switch (pos) {
-      case 0:
-        return fnArray[i] === _util.OPS.beginText;
+  return {
+    components: sizePerComponent,
+    minWidth,
+    minHeight,
+    maxNumWide,
+    maxNumHigh
+  };
+}
 
-      case 1:
-        return fnArray[i] === _util.OPS.setFont;
+function buildPackets(context) {
+  const siz = context.SIZ;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const componentsCount = siz.Csiz;
+
+  for (let c = 0; c < componentsCount; c++) {
+    const component = tile.components[c];
+    const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+    const resolutions = [];
+    const subbands = [];
+
+    for (let r = 0; r <= decompositionLevelsCount; r++) {
+      const blocksDimensions = getBlocksDimensions(context, component, r);
+      const resolution = {};
+      const scale = 1 << decompositionLevelsCount - r;
+      resolution.trx0 = Math.ceil(component.tcx0 / scale);
+      resolution.try0 = Math.ceil(component.tcy0 / scale);
+      resolution.trx1 = Math.ceil(component.tcx1 / scale);
+      resolution.try1 = Math.ceil(component.tcy1 / scale);
+      resolution.resLevel = r;
+      buildPrecincts(context, resolution, blocksDimensions);
+      resolutions.push(resolution);
+      let subband;
+
+      if (r === 0) {
+        subband = {};
+        subband.type = "LL";
+        subband.tbx0 = Math.ceil(component.tcx0 / scale);
+        subband.tby0 = Math.ceil(component.tcy0 / scale);
+        subband.tbx1 = Math.ceil(component.tcx1 / scale);
+        subband.tby1 = Math.ceil(component.tcy1 / scale);
+        subband.resolution = resolution;
+        buildCodeblocks(context, subband, blocksDimensions);
+        subbands.push(subband);
+        resolution.subbands = [subband];
+      } else {
+        const bscale = 1 << decompositionLevelsCount - r + 1;
+        const resolutionSubbands = [];
+        subband = {};
+        subband.type = "HL";
+        subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+        subband.tby0 = Math.ceil(component.tcy0 / bscale);
+        subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+        subband.tby1 = Math.ceil(component.tcy1 / bscale);
+        subband.resolution = resolution;
+        buildCodeblocks(context, subband, blocksDimensions);
+        subbands.push(subband);
+        resolutionSubbands.push(subband);
+        subband = {};
+        subband.type = "LH";
+        subband.tbx0 = Math.ceil(component.tcx0 / bscale);
+        subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+        subband.tbx1 = Math.ceil(component.tcx1 / bscale);
+        subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+        subband.resolution = resolution;
+        buildCodeblocks(context, subband, blocksDimensions);
+        subbands.push(subband);
+        resolutionSubbands.push(subband);
+        subband = {};
+        subband.type = "HH";
+        subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+        subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+        subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+        subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+        subband.resolution = resolution;
+        buildCodeblocks(context, subband, blocksDimensions);
+        subbands.push(subband);
+        resolutionSubbands.push(subband);
+        resolution.subbands = resolutionSubbands;
+      }
+    }
+
+    component.resolutions = resolutions;
+    component.subbands = subbands;
+  }
+
+  const progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
+
+  switch (progressionOrder) {
+    case 0:
+      tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);
+      break;
 
-      case 2:
-        return fnArray[i] === _util.OPS.setTextMatrix;
+    case 1:
+      tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);
+      break;
 
-      case 3:
-        if (fnArray[i] !== _util.OPS.showText) {
-          return false;
-        }
+    case 2:
+      tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);
+      break;
 
-        var iFirstSetFont = context.iCurr - 3;
-        var firstSetFontArg0 = argsArray[iFirstSetFont][0];
-        var firstSetFontArg1 = argsArray[iFirstSetFont][1];
+    case 3:
+      tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);
+      break;
 
-        if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
-          return false;
-        }
+    case 4:
+      tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);
+      break;
 
-        return true;
+    default:
+      throw new JpxError(`Unsupported progression order ${progressionOrder}`);
+  }
+}
 
-      case 4:
-        return fnArray[i] === _util.OPS.endText;
+function parseTilePackets(context, data, offset, dataLength) {
+  let position = 0;
+  let buffer,
+      bufferSize = 0,
+      skipNextBit = false;
+
+  function readBits(count) {
+    while (bufferSize < count) {
+      const b = data[offset + position];
+      position++;
+
+      if (skipNextBit) {
+        buffer = buffer << 7 | b;
+        bufferSize += 7;
+        skipNextBit = false;
+      } else {
+        buffer = buffer << 8 | b;
+        bufferSize += 8;
+      }
+
+      if (b === 0xff) {
+        skipNextBit = true;
+      }
     }
 
-    throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);
-  }, function (context, i) {
-    var MIN_CHARS_IN_BLOCK = 3;
-    var MAX_CHARS_IN_BLOCK = 1000;
-    var fnArray = context.fnArray,
-        argsArray = context.argsArray;
-    var curr = context.iCurr;
-    var iFirstBeginText = curr - 4;
-    var iFirstSetFont = curr - 3;
-    var iFirstSetTextMatrix = curr - 2;
-    var iFirstShowText = curr - 1;
-    var iFirstEndText = curr;
-    var firstSetFontArg0 = argsArray[iFirstSetFont][0];
-    var firstSetFontArg1 = argsArray[iFirstSetFont][1];
-    var count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
+    bufferSize -= count;
+    return buffer >>> bufferSize & (1 << count) - 1;
+  }
 
-    if (count < MIN_CHARS_IN_BLOCK) {
-      return i - (i - iFirstBeginText) % 5;
+  function skipMarkerIfEqual(value) {
+    if (data[offset + position - 1] === 0xff && data[offset + position] === value) {
+      skipBytes(1);
+      return true;
+    } else if (data[offset + position] === 0xff && data[offset + position + 1] === value) {
+      skipBytes(2);
+      return true;
     }
 
-    var iFirst = iFirstBeginText;
+    return false;
+  }
+
+  function skipBytes(count) {
+    position += count;
+  }
+
+  function alignToByte() {
+    bufferSize = 0;
 
-    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && 
fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === 
fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && 
argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === 
firstSetFontArg1) {
-      count++;
-      iFirst -= 5;
+    if (skipNextBit) {
+      position++;
+      skipNextBit = false;
     }
+  }
 
-    var iEndText = iFirst + 4;
+  function readCodingpasses() {
+    if (readBits(1) === 0) {
+      return 1;
+    }
 
-    for (var q = 1; q < count; q++) {
-      fnArray.splice(iEndText, 3);
-      argsArray.splice(iEndText, 3);
-      iEndText += 2;
+    if (readBits(1) === 0) {
+      return 2;
     }
 
-    return iEndText + 1;
-  });
+    let value = readBits(2);
 
-  function QueueOptimizer(queue) {
-    this.queue = queue;
-    this.state = null;
-    this.context = {
-      iCurr: 0,
-      fnArray: queue.fnArray,
-      argsArray: queue.argsArray
-    };
-    this.match = null;
-    this.lastProcessed = 0;
+    if (value < 3) {
+      return value + 3;
+    }
+
+    value = readBits(5);
+
+    if (value < 31) {
+      return value + 6;
+    }
+
+    value = readBits(7);
+    return value + 37;
   }
 
-  QueueOptimizer.prototype = {
-    _optimize() {
-      const fnArray = this.queue.fnArray;
-      let i = this.lastProcessed,
-          ii = fnArray.length;
-      let state = this.state;
-      let match = this.match;
+  const tileIndex = context.currentTile.index;
+  const tile = context.tiles[tileIndex];
+  const sopMarkerUsed = context.COD.sopMarkerUsed;
+  const ephMarkerUsed = context.COD.ephMarkerUsed;
+  const packetsIterator = tile.packetsIterator;
 
-      if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
-        this.lastProcessed = ii;
-        return;
-      }
+  while (position < dataLength) {
+    alignToByte();
 
-      const context = this.context;
+    if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
+      skipBytes(4);
+    }
 
-      while (i < ii) {
-        if (match) {
-          const iterate = (0, match.iterateFn)(context, i);
+    const packet = packetsIterator.nextPacket();
 
-          if (iterate) {
-            i++;
-            continue;
-          }
+    if (!readBits(1)) {
+      continue;
+    }
 
-          i = (0, match.processFn)(context, i + 1);
-          ii = fnArray.length;
-          match = null;
-          state = null;
+    const layerNumber = packet.layerNumber,
+          queue = [];
+    let codeblock;
 
-          if (i >= ii) {
-            break;
-          }
-        }
+    for (let i = 0, ii = packet.codeblocks.length; i < ii; i++) {
+      codeblock = packet.codeblocks[i];
+      let precinct = codeblock.precinct;
+      const codeblockColumn = codeblock.cbx - precinct.cbxMin;
+      const codeblockRow = codeblock.cby - precinct.cbyMin;
+      let codeblockIncluded = false;
+      let firstTimeInclusion = false;
+      let valueReady, zeroBitPlanesTree;
 
-        state = (state || InitialState)[fnArray[i]];
+      if (codeblock.included !== undefined) {
+        codeblockIncluded = !!readBits(1);
+      } else {
+        precinct = codeblock.precinct;
+        let inclusionTree;
 
-        if (!state || Array.isArray(state)) {
-          i++;
-          continue;
+        if (precinct.inclusionTree !== undefined) {
+          inclusionTree = precinct.inclusionTree;
+        } else {
+          const width = precinct.cbxMax - precinct.cbxMin + 1;
+          const height = precinct.cbyMax - precinct.cbyMin + 1;
+          inclusionTree = new InclusionTree(width, height, layerNumber);
+          zeroBitPlanesTree = new TagTree(width, height);
+          precinct.inclusionTree = inclusionTree;
+          precinct.zeroBitPlanesTree = zeroBitPlanesTree;
         }
 
-        context.iCurr = i;
-        i++;
+        if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
+          while (true) {
+            if (readBits(1)) {
+              valueReady = !inclusionTree.nextLevel();
 
-        if (state.checkFn && !(0, state.checkFn)(context)) {
-          state = null;
-          continue;
+              if (valueReady) {
+                codeblock.included = true;
+                codeblockIncluded = firstTimeInclusion = true;
+                break;
+              }
+            } else {
+              inclusionTree.incrementValue(layerNumber);
+              break;
+            }
+          }
         }
+      }
 
-        match = state;
-        state = null;
+      if (!codeblockIncluded) {
+        continue;
       }
 
-      this.state = state;
-      this.match = match;
-      this.lastProcessed = i;
-    },
+      if (firstTimeInclusion) {
+        zeroBitPlanesTree = precinct.zeroBitPlanesTree;
+        zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
 
-    push(fn, args) {
-      this.queue.fnArray.push(fn);
-      this.queue.argsArray.push(args);
+        while (true) {
+          if (readBits(1)) {
+            valueReady = !zeroBitPlanesTree.nextLevel();
 
-      this._optimize();
-    },
+            if (valueReady) {
+              break;
+            }
+          } else {
+            zeroBitPlanesTree.incrementValue();
+          }
+        }
+
+        codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
+      }
 
-    flush() {
-      while (this.match) {
-        const length = this.queue.fnArray.length;
-        this.lastProcessed = (0, this.match.processFn)(this.context, length);
-        this.match = null;
-        this.state = null;
+      const codingpasses = readCodingpasses();
 
-        this._optimize();
+      while (readBits(1)) {
+        codeblock.Lblock++;
       }
-    },
 
-    reset() {
-      this.state = null;
-      this.match = null;
-      this.lastProcessed = 0;
+      const codingpassesLog2 = (0, _core_utils.log2)(codingpasses);
+      const bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + 
codeblock.Lblock;
+      const codedDataLength = readBits(bits);
+      queue.push({
+        codeblock,
+        codingpasses,
+        dataLength: codedDataLength
+      });
     }
 
-  };
-  return QueueOptimizer;
-}();
+    alignToByte();
 
-var NullOptimizer = function NullOptimizerClosure() {
-  function NullOptimizer(queue) {
-    this.queue = queue;
-  }
+    if (ephMarkerUsed) {
+      skipMarkerIfEqual(0x92);
+    }
 
-  NullOptimizer.prototype = {
-    push(fn, args) {
-      this.queue.fnArray.push(fn);
-      this.queue.argsArray.push(args);
-    },
+    while (queue.length > 0) {
+      const packetItem = queue.shift();
+      codeblock = packetItem.codeblock;
 
-    flush() {},
+      if (codeblock.data === undefined) {
+        codeblock.data = [];
+      }
 
-    reset() {}
+      codeblock.data.push({
+        data,
+        start: offset + position,
+        end: offset + position + packetItem.dataLength,
+        codingpasses: packetItem.codingpasses
+      });
+      position += packetItem.dataLength;
+    }
+  }
 
-  };
-  return NullOptimizer;
-}();
+  return position;
+}
 
-var OperatorList = function OperatorListClosure() {
-  var CHUNK_SIZE = 1000;
-  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;
+function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, 
segmentationSymbolUsed) {
+  const x0 = subband.tbx0;
+  const y0 = subband.tby0;
+  const width = subband.tbx1 - subband.tbx0;
+  const codeblocks = subband.codeblocks;
+  const right = subband.type.charAt(0) === "H" ? 1 : 0;
+  const bottom = subband.type.charAt(1) === "H" ? levelWidth : 0;
 
-  function OperatorList(intent, streamSink) {
-    this._streamSink = streamSink;
-    this.fnArray = [];
-    this.argsArray = [];
+  for (let i = 0, ii = codeblocks.length; i < ii; ++i) {
+    const codeblock = codeblocks[i];
+    const blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
+    const blockHeight = codeblock.tby1_ - codeblock.tby0_;
 
-    if (streamSink && intent !== "oplist") {
-      this.optimizer = new QueueOptimizer(this);
-    } else {
-      this.optimizer = new NullOptimizer(this);
+    if (blockWidth === 0 || blockHeight === 0) {
+      continue;
     }
 
-    this.dependencies = new Set();
-    this._totalLength = 0;
-    this.weight = 0;
-    this._resolved = streamSink ? null : Promise.resolve();
-  }
+    if (codeblock.data === undefined) {
+      continue;
+    }
 
-  OperatorList.prototype = {
-    get length() {
-      return this.argsArray.length;
-    },
+    const bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, 
mb);
+    let currentCodingpassType = 2;
+    const data = codeblock.data;
+    let totalLength = 0,
+        codingpasses = 0;
+    let j, jj, dataItem;
 
-    get ready() {
-      return this._resolved || this._streamSink.ready;
-    },
+    for (j = 0, jj = data.length; j < jj; j++) {
+      dataItem = data[j];
+      totalLength += dataItem.end - dataItem.start;
+      codingpasses += dataItem.codingpasses;
+    }
 
-    get totalLength() {
-      return this._totalLength + this.length;
-    },
+    const encodedData = new Uint8Array(totalLength);
+    let position = 0;
 
-    addOp(fn, args) {
-      this.optimizer.push(fn, args);
-      this.weight++;
+    for (j = 0, jj = data.length; j < jj; j++) {
+      dataItem = data[j];
+      const chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
+      encodedData.set(chunk, position);
+      position += chunk.length;
+    }
 
-      if (this._streamSink) {
-        if (this.weight >= CHUNK_SIZE) {
-          this.flush();
-        } else if (this.weight >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === 
_util.OPS.endText)) {
-          this.flush();
-        }
-      }
-    },
+    const decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);
+    bitModel.setDecoder(decoder);
 
-    addDependency(dependency) {
-      if (this.dependencies.has(dependency)) {
-        return;
-      }
+    for (j = 0; j < codingpasses; j++) {
+      switch (currentCodingpassType) {
+        case 0:
+          bitModel.runSignificancePropagationPass();
+          break;
 
-      this.dependencies.add(dependency);
-      this.addOp(_util.OPS.dependency, [dependency]);
-    },
+        case 1:
+          bitModel.runMagnitudeRefinementPass();
+          break;
 
-    addDependencies(dependencies) {
-      for (const dependency of dependencies) {
-        this.addDependency(dependency);
-      }
-    },
+        case 2:
+          bitModel.runCleanupPass();
 
-    addOpList(opList) {
-      if (!(opList instanceof OperatorList)) {
-        (0, _util.warn)('addOpList - ignoring invalid "opList" parameter.');
-        return;
-      }
+          if (segmentationSymbolUsed) {
+            bitModel.checkSegmentationSymbol();
+          }
 
-      for (const dependency of opList.dependencies) {
-        this.dependencies.add(dependency);
+          break;
       }
 
-      for (var i = 0, ii = opList.length; i < ii; i++) {
-        this.addOp(opList.fnArray[i], opList.argsArray[i]);
-      }
-    },
+      currentCodingpassType = (currentCodingpassType + 1) % 3;
+    }
 
-    getIR() {
-      return {
-        fnArray: this.fnArray,
-        argsArray: this.argsArray,
-        length: this.length
-      };
-    },
+    let offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;
+    const sign = bitModel.coefficentsSign;
+    const magnitude = bitModel.coefficentsMagnitude;
+    const bitsDecoded = bitModel.bitsDecoded;
+    const magnitudeCorrection = reversible ? 0 : 0.5;
+    let k, n, nb;
+    position = 0;
+    const interleave = subband.type !== "LL";
 
-    get _transfers() {
-      const transfers = [];
-      const {
-        fnArray,
-        argsArray,
-        length
-      } = this;
+    for (j = 0; j < blockHeight; j++) {
+      const row = offset / width | 0;
+      const levelOffset = 2 * row * (levelWidth - width) + right + bottom;
 
-      for (let i = 0; i < length; i++) {
-        switch (fnArray[i]) {
-          case _util.OPS.paintInlineImageXObject:
-          case _util.OPS.paintInlineImageXObjectGroup:
-          case _util.OPS.paintImageMaskXObject:
-            const arg = argsArray[i][0];
-            ;
-
-            if (!arg.cached) {
-              transfers.push(arg.data.buffer);
-            }
+      for (k = 0; k < blockWidth; k++) {
+        n = magnitude[position];
 
-            break;
-        }
-      }
+        if (n !== 0) {
+          n = (n + magnitudeCorrection) * delta;
 
-      return transfers;
-    },
+          if (sign[position] !== 0) {
+            n = -n;
+          }
+
+          nb = bitsDecoded[position];
+          const pos = interleave ? levelOffset + (offset << 1) : offset;
 
-    flush(lastChunk = false) {
-      this.optimizer.flush();
-      const length = this.length;
-      this._totalLength += length;
+          if (reversible && nb >= mb) {
+            coefficients[pos] = n;
+          } else {
+            coefficients[pos] = n * (1 << mb - nb);
+          }
+        }
 
-      this._streamSink.enqueue({
-        fnArray: this.fnArray,
-        argsArray: this.argsArray,
-        lastChunk,
-        length
-      }, 1, this._transfers);
+        offset++;
+        position++;
+      }
 
-      this.dependencies.clear();
-      this.fnArray.length = 0;
-      this.argsArray.length = 0;
-      this.weight = 0;
-      this.optimizer.reset();
+      offset += width - blockWidth;
     }
+  }
+}
 
-  };
-  return OperatorList;
-}();
+function transformTile(context, tile, c) {
+  const component = tile.components[c];
+  const codingStyleParameters = component.codingStyleParameters;
+  const quantizationParameters = component.quantizationParameters;
+  const decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;
+  const spqcds = quantizationParameters.SPqcds;
+  const scalarExpounded = quantizationParameters.scalarExpounded;
+  const guardBits = quantizationParameters.guardBits;
+  const segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
+  const precision = context.components[c].precision;
+  const reversible = codingStyleParameters.reversibleTransformation;
+  const transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();
+  const subbandCoefficients = [];
+  let b = 0;
+
+  for (let i = 0; i <= decompositionLevelsCount; i++) {
+    const resolution = component.resolutions[i];
+    const width = resolution.trx1 - resolution.trx0;
+    const height = resolution.try1 - resolution.try0;
+    const coefficients = new Float32Array(width * height);
+
+    for (let j = 0, jj = resolution.subbands.length; j < jj; j++) {
+      let mu, epsilon;
+
+      if (!scalarExpounded) {
+        mu = spqcds[0].mu;
+        epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
+      } else {
+        mu = spqcds[b].mu;
+        epsilon = spqcds[b].epsilon;
+        b++;
+      }
 
-exports.OperatorList = OperatorList;
+      const subband = resolution.subbands[j];
+      const gainLog2 = SubbandsGainLog2[subband.type];
+      const delta = reversible ? 1 : 2 ** (precision + gainLog2 - epsilon) * (1 + mu / 2048);
+      const mb = guardBits + epsilon - 1;
+      copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);
+    }
 
-/***/ }),
-/* 27 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    subbandCoefficients.push({
+      width,
+      height,
+      items: coefficients
+    });
+  }
 
-"use strict";
+  const result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);
+  return {
+    left: component.tcx0,
+    top: component.tcy0,
+    width: result.width,
+    height: result.height,
+    items: result.items
+  };
+}
 
+function transformComponents(context) {
+  const siz = context.SIZ;
+  const components = context.components;
+  const componentsCount = siz.Csiz;
+  const resultImages = [];
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.writeDict = writeDict;
-exports.incrementalUpdate = incrementalUpdate;
+  for (let i = 0, ii = context.tiles.length; i < ii; i++) {
+    const tile = context.tiles[i];
+    const transformedTiles = [];
 
-var _util = __w_pdfjs_require__(2);
+    for (let c = 0; c < componentsCount; c++) {
+      transformedTiles[c] = transformTile(context, tile, c);
+    }
 
-var _primitives = __w_pdfjs_require__(5);
+    const tile0 = transformedTiles[0];
+    const out = new Uint8ClampedArray(tile0.items.length * componentsCount);
+    const result = {
+      left: tile0.left,
+      top: tile0.top,
+      width: tile0.width,
+      height: tile0.height,
+      items: out
+    };
+    let shift, offset;
+    let pos = 0,
+        j,
+        jj,
+        y0,
+        y1,
+        y2;
+
+    if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
+      const fourComponents = componentsCount === 4;
+      const y0items = transformedTiles[0].items;
+      const y1items = transformedTiles[1].items;
+      const y2items = transformedTiles[2].items;
+      const y3items = fourComponents ? transformedTiles[3].items : null;
+      shift = components[0].precision - 8;
+      offset = (128 << shift) + 0.5;
+      const component0 = tile.components[0];
+      const alpha01 = componentsCount - 3;
+      jj = y0items.length;
+
+      if (!component0.codingStyleParameters.reversibleTransformation) {
+        for (j = 0; j < jj; j++, pos += alpha01) {
+          y0 = y0items[j] + offset;
+          y1 = y1items[j];
+          y2 = y2items[j];
+          out[pos++] = y0 + 1.402 * y2 >> shift;
+          out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift;
+          out[pos++] = y0 + 1.772 * y1 >> shift;
+        }
+      } else {
+        for (j = 0; j < jj; j++, pos += alpha01) {
+          y0 = y0items[j] + offset;
+          y1 = y1items[j];
+          y2 = y2items[j];
+          const g = y0 - (y2 + y1 >> 2);
+          out[pos++] = g + y2 >> shift;
+          out[pos++] = g >> shift;
+          out[pos++] = g + y1 >> shift;
+        }
+      }
 
-var _crypto = __w_pdfjs_require__(22);
+      if (fourComponents) {
+        for (j = 0, pos = 3; j < jj; j++, pos += 4) {
+          out[pos] = y3items[j] + offset >> shift;
+        }
+      }
+    } else {
+      for (let c = 0; c < componentsCount; c++) {
+        const items = transformedTiles[c].items;
+        shift = components[c].precision - 8;
+        offset = (128 << shift) + 0.5;
 
-function writeDict(dict, buffer, transform) {
-  buffer.push("<<");
+        for (pos = c, j = 0, jj = items.length; j < jj; j++) {
+          out[pos] = items[j] + offset >> shift;
+          pos += componentsCount;
+        }
+      }
+    }
 
-  for (const key of dict.getKeys()) {
-    buffer.push(` /${key} `);
-    writeValue(dict.getRaw(key), buffer, transform);
+    resultImages.push(result);
   }
 
-  buffer.push(">>");
+  return resultImages;
 }
 
-function writeStream(stream, buffer, transform) {
-  writeDict(stream.dict, buffer, transform);
-  buffer.push(" stream\n");
-  let string = (0, _util.bytesToString)(stream.getBytes());
+function initializeTile(context, tileIndex) {
+  const siz = context.SIZ;
+  const componentsCount = siz.Csiz;
+  const tile = context.tiles[tileIndex];
 
-  if (transform !== null) {
-    string = transform.encryptString(string);
+  for (let c = 0; c < componentsCount; c++) {
+    const component = tile.components[c];
+    const qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : 
context.currentTile.QCD;
+    component.quantizationParameters = qcdOrQcc;
+    const codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : 
context.currentTile.COD;
+    component.codingStyleParameters = codOrCoc;
   }
 
-  buffer.push(string);
-  buffer.push("\nendstream\n");
+  tile.codingStyleDefaultParameters = context.currentTile.COD;
 }
 
-function writeArray(array, buffer, transform) {
-  buffer.push("[");
-  let first = true;
+class TagTree {
+  constructor(width, height) {
+    const levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;
+    this.levels = [];
 
-  for (const val of array) {
-    if (!first) {
-      buffer.push(" ");
-    } else {
-      first = false;
+    for (let i = 0; i < levelsLength; i++) {
+      const level = {
+        width,
+        height,
+        items: []
+      };
+      this.levels.push(level);
+      width = Math.ceil(width / 2);
+      height = Math.ceil(height / 2);
     }
-
-    writeValue(val, buffer, transform);
   }
 
-  buffer.push("]");
-}
+  reset(i, j) {
+    let currentLevel = 0,
+        value = 0,
+        level;
 
-function numberToString(value) {
-  if (Number.isInteger(value)) {
-    return value.toString();
-  }
+    while (currentLevel < this.levels.length) {
+      level = this.levels[currentLevel];
+      const index = i + j * level.width;
 
-  const roundedValue = Math.round(value * 100);
+      if (level.items[index] !== undefined) {
+        value = level.items[index];
+        break;
+      }
 
-  if (roundedValue % 100 === 0) {
-    return (roundedValue / 100).toString();
+      level.index = index;
+      i >>= 1;
+      j >>= 1;
+      currentLevel++;
+    }
+
+    currentLevel--;
+    level = this.levels[currentLevel];
+    level.items[level.index] = value;
+    this.currentLevel = currentLevel;
+    delete this.value;
   }
 
-  if (roundedValue % 10 === 0) {
-    return value.toFixed(1);
+  incrementValue() {
+    const level = this.levels[this.currentLevel];
+    level.items[level.index]++;
   }
 
-  return value.toFixed(2);
-}
+  nextLevel() {
+    let currentLevel = this.currentLevel;
+    let level = this.levels[currentLevel];
+    const value = level.items[level.index];
+    currentLevel--;
 
-function writeValue(value, buffer, transform) {
-  if ((0, _primitives.isName)(value)) {
-    buffer.push(`/${value.name}`);
-  } else if ((0, _primitives.isRef)(value)) {
-    buffer.push(`${value.num} ${value.gen} R`);
-  } else if (Array.isArray(value)) {
-    writeArray(value, buffer, transform);
-  } else if (typeof value === "string") {
-    if (transform !== null) {
-      value = transform.encryptString(value);
+    if (currentLevel < 0) {
+      this.value = value;
+      return false;
     }
 
-    buffer.push(`(${(0, _util.escapeString)(value)})`);
-  } else if (typeof value === "number") {
-    buffer.push(numberToString(value));
-  } else if ((0, _primitives.isDict)(value)) {
-    writeDict(value, buffer, transform);
-  } else if ((0, _primitives.isStream)(value)) {
-    writeStream(value, buffer, transform);
-  }
-}
-
-function writeInt(number, size, offset, buffer) {
-  for (let i = size + offset - 1; i > offset - 1; i--) {
-    buffer[i] = number & 0xff;
-    number >>= 8;
+    this.currentLevel = currentLevel;
+    level = this.levels[currentLevel];
+    level.items[level.index] = value;
+    return true;
   }
 
-  return offset + size;
-}
-
-function writeString(string, offset, buffer) {
-  for (let i = 0, len = string.length; i < len; i++) {
-    buffer[offset + i] = string.charCodeAt(i) & 0xff;
-  }
 }
 
-function computeMD5(filesize, xrefInfo) {
-  const time = Math.floor(Date.now() / 1000);
-  const filename = xrefInfo.filename || "";
-  const md5Buffer = [time.toString(), filename, filesize.toString()];
-  let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);
+class InclusionTree {
+  constructor(width, height, defaultValue) {
+    const levelsLength = (0, _core_utils.log2)(Math.max(width, height)) + 1;
+    this.levels = [];
 
-  for (const value of Object.values(xrefInfo.info)) {
-    md5Buffer.push(value);
-    md5BufferLen += value.length;
-  }
+    for (let i = 0; i < levelsLength; i++) {
+      const items = new Uint8Array(width * height);
 
-  const array = new Uint8Array(md5BufferLen);
-  let offset = 0;
+      for (let j = 0, jj = items.length; j < jj; j++) {
+        items[j] = defaultValue;
+      }
 
-  for (const str of md5Buffer) {
-    writeString(str, offset, array);
-    offset += str.length;
+      const level = {
+        width,
+        height,
+        items
+      };
+      this.levels.push(level);
+      width = Math.ceil(width / 2);
+      height = Math.ceil(height / 2);
+    }
   }
 
-  return (0, _util.bytesToString)((0, _crypto.calculateMD5)(array));
-}
-
-function incrementalUpdate(originalData, xrefInfo, newRefs) {
-  const newXref = new _primitives.Dict(null);
-  const refForXrefTable = xrefInfo.newRef;
-  let buffer, baseOffset;
-  const lastByte = originalData[originalData.length - 1];
+  reset(i, j, stopValue) {
+    let currentLevel = 0;
 
-  if (lastByte === 0x0a || lastByte === 0x0d) {
-    buffer = [];
-    baseOffset = originalData.length;
-  } else {
-    buffer = ["\n"];
-    baseOffset = originalData.length + 1;
-  }
+    while (currentLevel < this.levels.length) {
+      const level = this.levels[currentLevel];
+      const index = i + j * level.width;
+      level.index = index;
+      const value = level.items[index];
 
-  newXref.set("Size", refForXrefTable.num + 1);
-  newXref.set("Prev", xrefInfo.startXRef);
-  newXref.set("Type", _primitives.Name.get("XRef"));
+      if (value === 0xff) {
+        break;
+      }
 
-  if (xrefInfo.rootRef !== null) {
-    newXref.set("Root", xrefInfo.rootRef);
-  }
+      if (value > stopValue) {
+        this.currentLevel = currentLevel;
+        this.propagateValues();
+        return false;
+      }
 
-  if (xrefInfo.infoRef !== null) {
-    newXref.set("Info", xrefInfo.infoRef);
-  }
+      i >>= 1;
+      j >>= 1;
+      currentLevel++;
+    }
 
-  if (xrefInfo.encrypt !== null) {
-    newXref.set("Encrypt", xrefInfo.encrypt);
+    this.currentLevel = currentLevel - 1;
+    return true;
   }
 
-  newRefs.push({
-    ref: refForXrefTable,
-    data: ""
-  });
-  newRefs = newRefs.sort((a, b) => {
-    return a.ref.num - b.ref.num;
-  });
-  const xrefTableData = [[0, 1, 0xffff]];
-  const indexes = [0, 1];
-  let maxOffset = 0;
-
-  for (const {
-    ref,
-    data
-  } of newRefs) {
-    maxOffset = Math.max(maxOffset, baseOffset);
-    xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]);
-    baseOffset += data.length;
-    indexes.push(ref.num);
-    indexes.push(1);
-    buffer.push(data);
+  incrementValue(stopValue) {
+    const level = this.levels[this.currentLevel];
+    level.items[level.index] = stopValue + 1;
+    this.propagateValues();
   }
 
-  newXref.set("Index", indexes);
+  propagateValues() {
+    let levelIndex = this.currentLevel;
+    let level = this.levels[levelIndex];
+    const currentValue = level.items[level.index];
 
-  if (xrefInfo.fileIds.length !== 0) {
-    const md5 = computeMD5(baseOffset, xrefInfo);
-    newXref.set("ID", [xrefInfo.fileIds[0], md5]);
+    while (--levelIndex >= 0) {
+      level = this.levels[levelIndex];
+      level.items[level.index] = currentValue;
+    }
   }
 
-  const offsetSize = Math.ceil(Math.log2(maxOffset) / 8);
-  const sizes = [1, offsetSize, 2];
-  const structSize = sizes[0] + sizes[1] + sizes[2];
-  const tableLength = structSize * xrefTableData.length;
-  newXref.set("W", sizes);
-  newXref.set("Length", tableLength);
-  buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\n`);
-  writeDict(newXref, buffer, null);
-  buffer.push(" stream\n");
-  const bufferLen = buffer.reduce((a, str) => a + str.length, 0);
-  const footer = `\nendstream\nendobj\nstartxref\n${baseOffset}\n%%EOF\n`;
-  const array = new Uint8Array(originalData.length + bufferLen + tableLength + footer.length);
-  array.set(originalData);
-  let offset = originalData.length;
+  nextLevel() {
+    let currentLevel = this.currentLevel;
+    let level = this.levels[currentLevel];
+    const value = level.items[level.index];
+    level.items[level.index] = 0xff;
+    currentLevel--;
 
-  for (const str of buffer) {
-    writeString(str, offset, array);
-    offset += str.length;
-  }
+    if (currentLevel < 0) {
+      return false;
+    }
 
-  for (const [type, objOffset, gen] of xrefTableData) {
-    offset = writeInt(type, sizes[0], offset, array);
-    offset = writeInt(objOffset, sizes[1], offset, array);
-    offset = writeInt(gen, sizes[2], offset, array);
+    this.currentLevel = currentLevel;
+    level = this.levels[currentLevel];
+    level.items[level.index] = value;
+    return true;
   }
 
-  writeString(footer, offset, array);
-  return array;
 }
 
-/***/ }),
-/* 28 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+const BitModel = function BitModelClosure() {
+  const UNIFORM_CONTEXT = 17;
+  const RUNLENGTH_CONTEXT = 18;
+  const LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 
3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 
4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);
+  const HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 
7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 
8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);
+  const HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 
5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 
8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);
 
-"use strict";
+  class BitModel {
+    constructor(width, height, subband, zeroBitPlanes, mb) {
+      this.width = width;
+      this.height = height;
+      let contextLabelTable;
 
+      if (subband === "HH") {
+        contextLabelTable = HHContextLabel;
+      } else if (subband === "HL") {
+        contextLabelTable = HLContextLabel;
+      } else {
+        contextLabelTable = LLAndLHContextsLabel;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PartialEvaluator = void 0;
+      this.contextLabelTable = contextLabelTable;
+      const coefficientCount = width * height;
+      this.neighborsSignificance = new Uint8Array(coefficientCount);
+      this.coefficentsSign = new Uint8Array(coefficientCount);
+      let coefficentsMagnitude;
 
-var _util = __w_pdfjs_require__(2);
+      if (mb > 14) {
+        coefficentsMagnitude = new Uint32Array(coefficientCount);
+      } else if (mb > 6) {
+        coefficentsMagnitude = new Uint16Array(coefficientCount);
+      } else {
+        coefficentsMagnitude = new Uint8Array(coefficientCount);
+      }
 
-var _cmap = __w_pdfjs_require__(29);
+      this.coefficentsMagnitude = coefficentsMagnitude;
+      this.processingFlags = new Uint8Array(coefficientCount);
+      const bitsDecoded = new Uint8Array(coefficientCount);
 
-var _primitives = __w_pdfjs_require__(5);
+      if (zeroBitPlanes !== 0) {
+        for (let i = 0; i < coefficientCount; i++) {
+          bitsDecoded[i] = zeroBitPlanes;
+        }
+      }
 
-var _fonts = __w_pdfjs_require__(30);
+      this.bitsDecoded = bitsDecoded;
+      this.reset();
+    }
 
-var _encodings = __w_pdfjs_require__(33);
+    setDecoder(decoder) {
+      this.decoder = decoder;
+    }
 
-var _core_utils = __w_pdfjs_require__(8);
+    reset() {
+      this.contexts = new Int8Array(19);
+      this.contexts[0] = 4 << 1 | 0;
+      this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;
+      this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;
+    }
 
-var _unicode = __w_pdfjs_require__(36);
+    setNeighborsSignificance(row, column, index) {
+      const neighborsSignificance = this.neighborsSignificance;
+      const width = this.width,
+            height = this.height;
+      const left = column > 0;
+      const right = column + 1 < width;
+      let i;
 
-var _standard_fonts = __w_pdfjs_require__(35);
+      if (row > 0) {
+        i = index - width;
 
-var _pattern = __w_pdfjs_require__(39);
+        if (left) {
+          neighborsSignificance[i - 1] += 0x10;
+        }
 
-var _function = __w_pdfjs_require__(40);
+        if (right) {
+          neighborsSignificance[i + 1] += 0x10;
+        }
 
-var _parser = __w_pdfjs_require__(11);
+        neighborsSignificance[i] += 0x04;
+      }
 
-var _image_utils = __w_pdfjs_require__(24);
+      if (row + 1 < height) {
+        i = index + width;
 
-var _bidi = __w_pdfjs_require__(42);
+        if (left) {
+          neighborsSignificance[i - 1] += 0x10;
+        }
 
-var _colorspace = __w_pdfjs_require__(23);
+        if (right) {
+          neighborsSignificance[i + 1] += 0x10;
+        }
 
-var _stream = __w_pdfjs_require__(12);
+        neighborsSignificance[i] += 0x04;
+      }
 
-var _glyphlist = __w_pdfjs_require__(34);
+      if (left) {
+        neighborsSignificance[index - 1] += 0x01;
+      }
 
-var _metrics = __w_pdfjs_require__(43);
+      if (right) {
+        neighborsSignificance[index + 1] += 0x01;
+      }
 
-var _murmurhash = __w_pdfjs_require__(44);
+      neighborsSignificance[index] |= 0x80;
+    }
 
-var _operator_list = __w_pdfjs_require__(26);
+    runSignificancePropagationPass() {
+      const decoder = this.decoder;
+      const width = this.width,
+            height = this.height;
+      const coefficentsMagnitude = this.coefficentsMagnitude;
+      const coefficentsSign = this.coefficentsSign;
+      const neighborsSignificance = this.neighborsSignificance;
+      const processingFlags = this.processingFlags;
+      const contexts = this.contexts;
+      const labels = this.contextLabelTable;
+      const bitsDecoded = this.bitsDecoded;
+      const processedInverseMask = ~1;
+      const processedMask = 1;
+      const firstMagnitudeBitMask = 2;
+
+      for (let i0 = 0; i0 < height; i0 += 4) {
+        for (let j = 0; j < width; j++) {
+          let index = i0 * width + j;
+
+          for (let i1 = 0; i1 < 4; i1++, index += width) {
+            const i = i0 + i1;
+
+            if (i >= height) {
+              break;
+            }
 
-var _image = __w_pdfjs_require__(45);
+            processingFlags[index] &= processedInverseMask;
 
-const DefaultPartialEvaluatorOptions = Object.freeze({
-  maxImageSize: -1,
-  disableFontFace: false,
-  ignoreErrors: false,
-  isEvalSupported: true,
-  fontExtraProperties: false
-});
-const PatternType = {
-  TILING: 1,
-  SHADING: 2
-};
-const deferred = Promise.resolve();
+            if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {
+              continue;
+            }
 
-function normalizeBlendMode(value, parsingArray = false) {
-  if (Array.isArray(value)) {
-    for (let i = 0, ii = value.length; i < ii; i++) {
-      const maybeBM = normalizeBlendMode(value[i], true);
+            const contextLabel = labels[neighborsSignificance[index]];
+            const decision = decoder.readBit(contexts, contextLabel);
 
-      if (maybeBM) {
-        return maybeBM;
+            if (decision) {
+              const sign = this.decodeSignBit(i, j, index);
+              coefficentsSign[index] = sign;
+              coefficentsMagnitude[index] = 1;
+              this.setNeighborsSignificance(i, j, index);
+              processingFlags[index] |= firstMagnitudeBitMask;
+            }
+
+            bitsDecoded[index]++;
+            processingFlags[index] |= processedMask;
+          }
+        }
       }
     }
 
-    (0, _util.warn)(`Unsupported blend mode Array: ${value}`);
-    return "source-over";
-  }
+    decodeSignBit(row, column, index) {
+      const width = this.width,
+            height = this.height;
+      const coefficentsMagnitude = this.coefficentsMagnitude;
+      const coefficentsSign = this.coefficentsSign;
+      let contribution, sign0, sign1, significance1;
+      let contextLabel, decoded;
+      significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;
 
-  if (!(0, _primitives.isName)(value)) {
-    if (parsingArray) {
-      return null;
-    }
+      if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
+        sign1 = coefficentsSign[index + 1];
 
-    return "source-over";
-  }
+        if (significance1) {
+          sign0 = coefficentsSign[index - 1];
+          contribution = 1 - sign1 - sign0;
+        } else {
+          contribution = 1 - sign1 - sign1;
+        }
+      } else if (significance1) {
+        sign0 = coefficentsSign[index - 1];
+        contribution = 1 - sign0 - sign0;
+      } else {
+        contribution = 0;
+      }
 
-  switch (value.name) {
-    case "Normal":
-    case "Compatible":
-      return "source-over";
+      const horizontalContribution = 3 * contribution;
+      significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;
 
-    case "Multiply":
-      return "multiply";
+      if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
+        sign1 = coefficentsSign[index + width];
 
-    case "Screen":
-      return "screen";
+        if (significance1) {
+          sign0 = coefficentsSign[index - width];
+          contribution = 1 - sign1 - sign0 + horizontalContribution;
+        } else {
+          contribution = 1 - sign1 - sign1 + horizontalContribution;
+        }
+      } else if (significance1) {
+        sign0 = coefficentsSign[index - width];
+        contribution = 1 - sign0 - sign0 + horizontalContribution;
+      } else {
+        contribution = horizontalContribution;
+      }
 
-    case "Overlay":
-      return "overlay";
+      if (contribution >= 0) {
+        contextLabel = 9 + contribution;
+        decoded = this.decoder.readBit(this.contexts, contextLabel);
+      } else {
+        contextLabel = 9 - contribution;
+        decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
+      }
 
-    case "Darken":
-      return "darken";
+      return decoded;
+    }
 
-    case "Lighten":
-      return "lighten";
+    runMagnitudeRefinementPass() {
+      const decoder = this.decoder;
+      const width = this.width,
+            height = this.height;
+      const coefficentsMagnitude = this.coefficentsMagnitude;
+      const neighborsSignificance = this.neighborsSignificance;
+      const contexts = this.contexts;
+      const bitsDecoded = this.bitsDecoded;
+      const processingFlags = this.processingFlags;
+      const processedMask = 1;
+      const firstMagnitudeBitMask = 2;
+      const length = width * height;
+      const width4 = width * 4;
+
+      for (let index0 = 0, indexNext; index0 < length; index0 = indexNext) {
+        indexNext = Math.min(length, index0 + width4);
+
+        for (let j = 0; j < width; j++) {
+          for (let index = index0 + j; index < indexNext; index += width) {
+            if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
+              continue;
+            }
 
-    case "ColorDodge":
-      return "color-dodge";
+            let contextLabel = 16;
 
-    case "ColorBurn":
-      return "color-burn";
+            if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
+              processingFlags[index] ^= firstMagnitudeBitMask;
+              const significance = neighborsSignificance[index] & 127;
+              contextLabel = significance === 0 ? 15 : 14;
+            }
 
-    case "HardLight":
-      return "hard-light";
+            const bit = decoder.readBit(contexts, contextLabel);
+            coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;
+            bitsDecoded[index]++;
+            processingFlags[index] |= processedMask;
+          }
+        }
+      }
+    }
 
-    case "SoftLight":
-      return "soft-light";
+    runCleanupPass() {
+      const decoder = this.decoder;
+      const width = this.width,
+            height = this.height;
+      const neighborsSignificance = this.neighborsSignificance;
+      const coefficentsMagnitude = this.coefficentsMagnitude;
+      const coefficentsSign = this.coefficentsSign;
+      const contexts = this.contexts;
+      const labels = this.contextLabelTable;
+      const bitsDecoded = this.bitsDecoded;
+      const processingFlags = this.processingFlags;
+      const processedMask = 1;
+      const firstMagnitudeBitMask = 2;
+      const oneRowDown = width;
+      const twoRowsDown = width * 2;
+      const threeRowsDown = width * 3;
+      let iNext;
+
+      for (let i0 = 0; i0 < height; i0 = iNext) {
+        iNext = Math.min(i0 + 4, height);
+        const indexBase = i0 * width;
+        const checkAllEmpty = i0 + 3 < height;
+
+        for (let j = 0; j < width; j++) {
+          const index0 = indexBase + j;
+          const allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + 
oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] 
=== 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && 
neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;
+          let i1 = 0,
+              index = index0;
+          let i = i0,
+              sign;
 
-    case "Difference":
-      return "difference";
+          if (allEmpty) {
+            const hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);
 
-    case "Exclusion":
-      return "exclusion";
+            if (!hasSignificantCoefficent) {
+              bitsDecoded[index0]++;
+              bitsDecoded[index0 + oneRowDown]++;
+              bitsDecoded[index0 + twoRowsDown]++;
+              bitsDecoded[index0 + threeRowsDown]++;
+              continue;
+            }
 
-    case "Hue":
-      return "hue";
+            i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, 
UNIFORM_CONTEXT);
 
-    case "Saturation":
-      return "saturation";
+            if (i1 !== 0) {
+              i = i0 + i1;
+              index += i1 * width;
+            }
 
-    case "Color":
-      return "color";
+            sign = this.decodeSignBit(i, j, index);
+            coefficentsSign[index] = sign;
+            coefficentsMagnitude[index] = 1;
+            this.setNeighborsSignificance(i, j, index);
+            processingFlags[index] |= firstMagnitudeBitMask;
+            index = index0;
 
-    case "Luminosity":
-      return "luminosity";
-  }
+            for (let i2 = i0; i2 <= i; i2++, index += width) {
+              bitsDecoded[index]++;
+            }
 
-  if (parsingArray) {
-    return null;
-  }
+            i1++;
+          }
 
-  (0, _util.warn)(`Unsupported blend mode: ${value.name}`);
-  return "source-over";
-}
+          for (i = i0 + i1; i < iNext; i++, index += width) {
+            if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
+              continue;
+            }
 
-class TimeSlotManager {
-  static get TIME_SLOT_DURATION_MS() {
-    return (0, _util.shadow)(this, "TIME_SLOT_DURATION_MS", 20);
-  }
+            const contextLabel = labels[neighborsSignificance[index]];
+            const decision = decoder.readBit(contexts, contextLabel);
 
-  static get CHECK_TIME_EVERY() {
-    return (0, _util.shadow)(this, "CHECK_TIME_EVERY", 100);
-  }
+            if (decision === 1) {
+              sign = this.decodeSignBit(i, j, index);
+              coefficentsSign[index] = sign;
+              coefficentsMagnitude[index] = 1;
+              this.setNeighborsSignificance(i, j, index);
+              processingFlags[index] |= firstMagnitudeBitMask;
+            }
 
-  constructor() {
-    this.reset();
-  }
+            bitsDecoded[index]++;
+          }
+        }
+      }
+    }
 
-  check() {
-    if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {
-      return false;
+    checkSegmentationSymbol() {
+      const decoder = this.decoder;
+      const contexts = this.contexts;
+      const symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, 
UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, 
UNIFORM_CONTEXT);
+
+      if (symbol !== 0xa) {
+        throw new JpxError("Invalid segmentation symbol");
+      }
     }
 
-    this.checked = 0;
-    return this.endTime <= Date.now();
   }
 
-  reset() {
-    this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;
-    this.checked = 0;
+  return BitModel;
+}();
+
+class Transform {
+  constructor() {
+    if (this.constructor === Transform) {
+      (0, _util.unreachable)("Cannot initialize Transform.");
+    }
   }
 
-}
+  calculate(subbands, u0, v0) {
+    let ll = subbands[0];
 
-class PartialEvaluator {
-  constructor({
-    xref,
-    handler,
-    pageIndex,
-    idFactory,
-    fontCache,
-    builtInCMapCache,
-    globalImageCache,
-    options = null
-  }) {
-    this.xref = xref;
-    this.handler = handler;
-    this.pageIndex = pageIndex;
-    this.idFactory = idFactory;
-    this.fontCache = fontCache;
-    this.builtInCMapCache = builtInCMapCache;
-    this.globalImageCache = globalImageCache;
-    this.options = options || DefaultPartialEvaluatorOptions;
-    this.parsingType3Font = false;
-    this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);
+    for (let i = 1, ii = subbands.length; i < ii; i++) {
+      ll = this.iterate(ll, subbands[i], u0, v0);
+    }
+
+    return ll;
   }
 
-  get _pdfFunctionFactory() {
-    const pdfFunctionFactory = new _function.PDFFunctionFactory({
-      xref: this.xref,
-      isEvalSupported: this.options.isEvalSupported
-    });
-    return (0, _util.shadow)(this, "_pdfFunctionFactory", pdfFunctionFactory);
+  extend(buffer, offset, size) {
+    let i1 = offset - 1,
+        j1 = offset + 1;
+    let i2 = offset + size - 2,
+        j2 = offset + size;
+    buffer[i1--] = buffer[j1++];
+    buffer[j2++] = buffer[i2--];
+    buffer[i1--] = buffer[j1++];
+    buffer[j2++] = buffer[i2--];
+    buffer[i1--] = buffer[j1++];
+    buffer[j2++] = buffer[i2--];
+    buffer[i1] = buffer[j1];
+    buffer[j2] = buffer[i2];
   }
 
-  clone(newOptions = DefaultPartialEvaluatorOptions) {
-    var newEvaluator = Object.create(this);
-    newEvaluator.options = newOptions;
-    return newEvaluator;
+  filter(x, offset, length) {
+    (0, _util.unreachable)("Abstract method `filter` called");
   }
 
-  hasBlendModes(resources) {
-    if (!(resources instanceof _primitives.Dict)) {
-      return false;
-    }
+  iterate(ll, hl_lh_hh, u0, v0) {
+    const llWidth = ll.width,
+          llHeight = ll.height;
+    let llItems = ll.items;
+    const width = hl_lh_hh.width;
+    const height = hl_lh_hh.height;
+    const items = hl_lh_hh.items;
+    let i, j, k, l, u, v;
 
-    const processed = new _primitives.RefSet();
+    for (k = 0, i = 0; i < llHeight; i++) {
+      l = i * 2 * width;
 
-    if (resources.objId) {
-      processed.put(resources.objId);
+      for (j = 0; j < llWidth; j++, k++, l += 2) {
+        items[l] = llItems[k];
+      }
     }
 
-    var nodes = [resources],
-        xref = this.xref;
+    llItems = ll.items = null;
+    const bufferPadding = 4;
+    const rowBuffer = new Float32Array(width + 2 * bufferPadding);
 
-    while (nodes.length) {
-      var node = nodes.shift();
-      var graphicStates = node.get("ExtGState");
+    if (width === 1) {
+      if ((u0 & 1) !== 0) {
+        for (v = 0, k = 0; v < height; v++, k += width) {
+          items[k] *= 0.5;
+        }
+      }
+    } else {
+      for (v = 0, k = 0; v < height; v++, k += width) {
+        rowBuffer.set(items.subarray(k, k + width), bufferPadding);
+        this.extend(rowBuffer, bufferPadding, width);
+        this.filter(rowBuffer, bufferPadding, width);
+        items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);
+      }
+    }
 
-      if (graphicStates instanceof _primitives.Dict) {
-        for (let graphicState of graphicStates.getRawValues()) {
-          if (graphicState instanceof _primitives.Ref) {
-            if (processed.has(graphicState)) {
-              continue;
-            }
+    let numBuffers = 16;
+    const colBuffers = [];
 
-            try {
-              graphicState = xref.fetch(graphicState);
-            } catch (ex) {
-              if (ex instanceof _core_utils.MissingDataException) {
-                throw ex;
-              }
+    for (i = 0; i < numBuffers; i++) {
+      colBuffers.push(new Float32Array(height + 2 * bufferPadding));
+    }
 
-              processed.put(graphicState);
-              (0, _util.info)(`hasBlendModes - ignoring ExtGState: "${ex}".`);
-              continue;
-            }
-          }
+    let b,
+        currentBuffer = 0;
+    ll = bufferPadding + height;
 
-          if (!(graphicState instanceof _primitives.Dict)) {
-            continue;
-          }
+    if (height === 1) {
+      if ((v0 & 1) !== 0) {
+        for (u = 0; u < width; u++) {
+          items[u] *= 0.5;
+        }
+      }
+    } else {
+      for (u = 0; u < width; u++) {
+        if (currentBuffer === 0) {
+          numBuffers = Math.min(width - u, numBuffers);
 
-          if (graphicState.objId) {
-            processed.put(graphicState.objId);
+          for (k = u, l = bufferPadding; l < ll; k += width, l++) {
+            for (b = 0; b < numBuffers; b++) {
+              colBuffers[b][l] = items[k + b];
+            }
           }
 
-          const bm = graphicState.get("BM");
+          currentBuffer = numBuffers;
+        }
 
-          if (bm instanceof _primitives.Name) {
-            if (bm.name !== "Normal") {
-              return true;
-            }
+        currentBuffer--;
+        const buffer = colBuffers[currentBuffer];
+        this.extend(buffer, bufferPadding, height);
+        this.filter(buffer, bufferPadding, height);
 
-            continue;
-          }
+        if (currentBuffer === 0) {
+          k = u - numBuffers + 1;
 
-          if (bm !== undefined && Array.isArray(bm)) {
-            for (const element of bm) {
-              if (element instanceof _primitives.Name && element.name !== "Normal") {
-                return true;
-              }
+          for (l = bufferPadding; l < ll; k += width, l++) {
+            for (b = 0; b < numBuffers; b++) {
+              items[k + b] = colBuffers[b][l];
             }
           }
         }
       }
+    }
+
+    return {
+      width,
+      height,
+      items
+    };
+  }
 
-      var xObjects = node.get("XObject");
+}
 
-      if (!(xObjects instanceof _primitives.Dict)) {
-        continue;
+class IrreversibleTransform extends Transform {
+  filter(x, offset, length) {
+    const len = length >> 1;
+    offset |= 0;
+    let j, n, current, next;
+    const alpha = -1.586134342059924;
+    const beta = -0.052980118572961;
+    const gamma = 0.882911075530934;
+    const delta = 0.443506852043971;
+    const K = 1.230174104914001;
+    const K_ = 1 / K;
+    j = offset - 3;
+
+    for (n = len + 4; n--; j += 2) {
+      x[j] *= K_;
+    }
+
+    j = offset - 2;
+    current = delta * x[j - 1];
+
+    for (n = len + 3; n--; j += 2) {
+      next = delta * x[j + 1];
+      x[j] = K * x[j] - current - next;
+
+      if (n--) {
+        j += 2;
+        current = delta * x[j + 1];
+        x[j] = K * x[j] - current - next;
+      } else {
+        break;
       }
+    }
 
-      for (let xObject of xObjects.getRawValues()) {
-        if (xObject instanceof _primitives.Ref) {
-          if (processed.has(xObject)) {
-            continue;
-          }
-
-          try {
-            xObject = xref.fetch(xObject);
-          } catch (ex) {
-            if (ex instanceof _core_utils.MissingDataException) {
-              throw ex;
-            }
+    j = offset - 1;
+    current = gamma * x[j - 1];
 
-            processed.put(xObject);
-            (0, _util.info)(`hasBlendModes - ignoring XObject: "${ex}".`);
-            continue;
-          }
-        }
+    for (n = len + 2; n--; j += 2) {
+      next = gamma * x[j + 1];
+      x[j] -= current + next;
 
-        if (!(0, _primitives.isStream)(xObject)) {
-          continue;
-        }
+      if (n--) {
+        j += 2;
+        current = gamma * x[j + 1];
+        x[j] -= current + next;
+      } else {
+        break;
+      }
+    }
 
-        if (xObject.dict.objId) {
-          processed.put(xObject.dict.objId);
-        }
+    j = offset;
+    current = beta * x[j - 1];
 
-        var xResources = xObject.dict.get("Resources");
+    for (n = len + 1; n--; j += 2) {
+      next = beta * x[j + 1];
+      x[j] -= current + next;
 
-        if (!(xResources instanceof _primitives.Dict)) {
-          continue;
-        }
+      if (n--) {
+        j += 2;
+        current = beta * x[j + 1];
+        x[j] -= current + next;
+      } else {
+        break;
+      }
+    }
 
-        if (xResources.objId && processed.has(xResources.objId)) {
-          continue;
-        }
+    if (len !== 0) {
+      j = offset + 1;
+      current = alpha * x[j - 1];
 
-        nodes.push(xResources);
+      for (n = len; n--; j += 2) {
+        next = alpha * x[j + 1];
+        x[j] -= current + next;
 
-        if (xResources.objId) {
-          processed.put(xResources.objId);
+        if (n--) {
+          j += 2;
+          current = alpha * x[j + 1];
+          x[j] -= current + next;
+        } else {
+          break;
         }
       }
     }
-
-    return false;
   }
 
-  async fetchBuiltInCMap(name) {
-    const cachedData = this.builtInCMapCache.get(name);
+}
 
-    if (cachedData) {
-      return cachedData;
+class ReversibleTransform extends Transform {
+  filter(x, offset, length) {
+    const len = length >> 1;
+    offset |= 0;
+    let j, n;
+
+    for (j = offset, n = len + 1; n--; j += 2) {
+      x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;
     }
 
-    const readableStream = this.handler.sendWithStream("FetchBuiltInCMap", {
-      name
-    });
-    const reader = readableStream.getReader();
-    const data = await new Promise(function (resolve, reject) {
-      function pump() {
-        reader.read().then(function ({
-          value,
-          done
-        }) {
-          if (done) {
-            return;
-          }
+    for (j = offset + 1, n = len; n--; j += 2) {
+      x[j] += x[j - 1] + x[j + 1] >> 1;
+    }
+  }
 
-          resolve(value);
-          pump();
-        }, reject);
-      }
+}
 
-      pump();
-    });
+/***/ }),
+/* 31 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    if (data.compressionType !== _util.CMapCompressionType.NONE) {
-      this.builtInCMapCache.set(name, data);
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.LZWStream = void 0;
+
+var _decode_stream = __w_pdfjs_require__(19);
+
+class LZWStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength, earlyChange) {
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+    this.cachedData = 0;
+    this.bitsCached = 0;
+    const maxLzwDictionarySize = 4096;
+    const lzwState = {
+      earlyChange,
+      codeLength: 9,
+      nextCode: 258,
+      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+      currentSequence: new Uint8Array(maxLzwDictionarySize),
+      currentSequenceLength: 0
+    };
+
+    for (let i = 0; i < 256; ++i) {
+      lzwState.dictionaryValues[i] = i;
+      lzwState.dictionaryLengths[i] = 1;
     }
 
-    return data;
+    this.lzwState = lzwState;
   }
 
-  async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) {
-    var dict = xobj.dict;
-    var matrix = dict.getArray("Matrix");
-    var bbox = dict.getArray("BBox");
+  readBits(n) {
+    let bitsCached = this.bitsCached;
+    let cachedData = this.cachedData;
 
-    if (Array.isArray(bbox) && bbox.length === 4) {
-      bbox = _util.Util.normalizeRect(bbox);
-    } else {
-      bbox = null;
-    }
+    while (bitsCached < n) {
+      const c = this.str.getByte();
 
-    let optionalContent = null;
+      if (c === -1) {
+        this.eof = true;
+        return null;
+      }
 
-    if (dict.has("OC")) {
-      optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
-      operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", optionalContent]);
+      cachedData = cachedData << 8 | c;
+      bitsCached += 8;
     }
 
-    var group = dict.get("Group");
+    this.bitsCached = bitsCached -= n;
+    this.cachedData = cachedData;
+    this.lastCode = null;
+    return cachedData >>> bitsCached & (1 << n) - 1;
+  }
 
-    if (group) {
-      var groupOptions = {
-        matrix,
-        bbox,
-        smask,
-        isolated: false,
-        knockout: false
-      };
-      var groupSubtype = group.get("S");
-      var colorSpace = null;
+  readBlock() {
+    const blockSize = 512,
+          decodedSizeDelta = blockSize;
+    let estimatedDecodedSize = blockSize * 2;
+    let i, j, q;
+    const lzwState = this.lzwState;
 
-      if ((0, _primitives.isName)(groupSubtype, "Transparency")) {
-        groupOptions.isolated = group.get("I") || false;
-        groupOptions.knockout = group.get("K") || false;
+    if (!lzwState) {
+      return;
+    }
 
-        if (group.has("CS")) {
-          const cs = group.getRaw("CS");
+    const earlyChange = lzwState.earlyChange;
+    let nextCode = lzwState.nextCode;
+    const dictionaryValues = lzwState.dictionaryValues;
+    const dictionaryLengths = lzwState.dictionaryLengths;
+    const dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+    let codeLength = lzwState.codeLength;
+    let prevCode = lzwState.prevCode;
+    const currentSequence = lzwState.currentSequence;
+    let currentSequenceLength = lzwState.currentSequenceLength;
+    let decodedLength = 0;
+    let currentBufferLength = this.bufferLength;
+    let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
 
-          const cachedColorSpace = _colorspace.ColorSpace.getCached(cs, this.xref, localColorSpaceCache);
+    for (i = 0; i < blockSize; i++) {
+      const code = this.readBits(codeLength);
+      const hasPrev = currentSequenceLength > 0;
 
-          if (cachedColorSpace) {
-            colorSpace = cachedColorSpace;
-          } else {
-            colorSpace = await this.parseColorSpace({
-              cs,
-              resources,
-              localColorSpaceCache
-            });
+      if (code < 256) {
+        currentSequence[0] = code;
+        currentSequenceLength = 1;
+      } else if (code >= 258) {
+        if (code < nextCode) {
+          currentSequenceLength = dictionaryLengths[code];
+
+          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+            currentSequence[j] = dictionaryValues[q];
+            q = dictionaryPrevCodes[q];
           }
+        } else {
+          currentSequence[currentSequenceLength++] = currentSequence[0];
         }
+      } else if (code === 256) {
+        codeLength = 9;
+        nextCode = 258;
+        currentSequenceLength = 0;
+        continue;
+      } else {
+        this.eof = true;
+        delete this.lzwState;
+        break;
       }
 
-      if (smask && smask.backdrop) {
-        colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;
-        smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
+      if (hasPrev) {
+        dictionaryPrevCodes[nextCode] = prevCode;
+        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+        dictionaryValues[nextCode] = currentSequence[0];
+        nextCode++;
+        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : 
Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
       }
 
-      operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);
-    }
+      prevCode = code;
+      decodedLength += currentSequenceLength;
 
-    operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);
-    return this.getOperatorList({
-      stream: xobj,
-      task,
-      resources: dict.get("Resources") || resources,
-      operatorList,
-      initialState
-    }).then(function () {
-      operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);
+      if (estimatedDecodedSize < decodedLength) {
+        do {
+          estimatedDecodedSize += decodedSizeDelta;
+        } while (estimatedDecodedSize < decodedLength);
 
-      if (group) {
-        operatorList.addOp(_util.OPS.endGroup, [groupOptions]);
+        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
       }
 
-      if (optionalContent) {
-        operatorList.addOp(_util.OPS.endMarkedContent, []);
+      for (j = 0; j < currentSequenceLength; j++) {
+        buffer[currentBufferLength++] = currentSequence[j];
       }
-    });
-  }
-
-  _sendImgData(objId, imgData, cacheGlobally = false) {
-    const transfers = imgData ? [imgData.data.buffer] : null;
-
-    if (this.parsingType3Font || cacheGlobally) {
-      return this.handler.send("commonobj", [objId, "Image", imgData], transfers);
     }
 
-    return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers);
+    lzwState.nextCode = nextCode;
+    lzwState.codeLength = codeLength;
+    lzwState.prevCode = prevCode;
+    lzwState.currentSequenceLength = currentSequenceLength;
+    this.bufferLength = currentBufferLength;
   }
 
-  async buildPaintImageXObject({
-    resources,
-    image,
-    isInline = false,
-    operatorList,
-    cacheKey,
-    localImageCache,
-    localColorSpaceCache
-  }) {
-    var dict = image.dict;
-    const imageRef = dict.objId;
-    var w = dict.get("Width", "W");
-    var h = dict.get("Height", "H");
+}
 
-    if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {
-      (0, _util.warn)("Image dimensions are missing, or not numbers.");
-      return undefined;
-    }
+exports.LZWStream = LZWStream;
 
-    var maxImageSize = this.options.maxImageSize;
+/***/ }),
+/* 32 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    if (maxImageSize !== -1 && w * h > maxImageSize) {
-      (0, _util.warn)("Image exceeded maximum allowed size and was removed.");
-      return undefined;
-    }
 
-    var imageMask = dict.get("ImageMask", "IM") || false;
-    var imgData, args;
 
-    if (imageMask) {
-      var width = dict.get("Width", "W");
-      var height = dict.get("Height", "H");
-      var bitStrideLength = width + 7 >> 3;
-      var imgArray = image.getBytes(bitStrideLength * height, true);
-      var decode = dict.getArray("Decode", "D");
-      imgData = _image.PDFImage.createMask({
-        imgArray,
-        width,
-        height,
-        imageIsFromDecodeStream: image instanceof _stream.DecodeStream,
-        inverseDecode: !!decode && decode[0] > 0
-      });
-      imgData.cached = !!cacheKey;
-      args = [imgData];
-      operatorList.addOp(_util.OPS.paintImageMaskXObject, args);
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PredictorStream = void 0;
 
-      if (cacheKey) {
-        localImageCache.set(cacheKey, imageRef, {
-          fn: _util.OPS.paintImageMaskXObject,
-          args
-        });
-      }
+var _decode_stream = __w_pdfjs_require__(19);
 
-      return undefined;
-    }
+var _util = __w_pdfjs_require__(2);
 
-    var softMask = dict.get("SMask", "SM") || false;
-    var mask = dict.get("Mask") || false;
-    var SMALL_IMAGE_DIMENSIONS = 200;
+var _primitives = __w_pdfjs_require__(5);
 
-    if (isInline && !softMask && !mask && w + h < SMALL_IMAGE_DIMENSIONS) {
-      const imageObj = new _image.PDFImage({
-        xref: this.xref,
-        res: resources,
-        image,
-        isInline,
-        pdfFunctionFactory: this._pdfFunctionFactory,
-        localColorSpaceCache
-      });
-      imgData = imageObj.createImageData(true);
-      operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);
-      return undefined;
+class PredictorStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength, params) {
+    super(maybeLength);
+
+    if (!(0, _primitives.isDict)(params)) {
+      return str;
     }
 
-    let objId = `img_${this.idFactory.createObjId()}`,
-        cacheGlobally = false;
+    const predictor = this.predictor = params.get("Predictor") || 1;
 
-    if (this.parsingType3Font) {
-      objId = `${this.idFactory.getDocId()}_type3_${objId}`;
-    } else if (imageRef) {
-      cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex);
+    if (predictor <= 1) {
+      return str;
+    }
 
-      if (cacheGlobally) {
-        objId = `${this.idFactory.getDocId()}_${objId}`;
-      }
+    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
+      throw new _util.FormatError(`Unsupported predictor: ${predictor}`);
     }
 
-    operatorList.addDependency(objId);
-    args = [objId, w, h];
+    if (predictor === 2) {
+      this.readBlock = this.readBlockTiff;
+    } else {
+      this.readBlock = this.readBlockPng;
+    }
 
-    _image.PDFImage.buildImage({
-      xref: this.xref,
-      res: resources,
-      image,
-      isInline,
-      pdfFunctionFactory: this._pdfFunctionFactory,
-      localColorSpaceCache
-    }).then(imageObj => {
-      imgData = imageObj.createImageData(false);
-      return this._sendImgData(objId, imgData, cacheGlobally);
-    }).catch(reason => {
-      (0, _util.warn)(`Unable to decode image "${objId}": "${reason}".`);
-      return this._sendImgData(objId, null, cacheGlobally);
-    });
+    this.str = str;
+    this.dict = str.dict;
+    const colors = this.colors = params.get("Colors") || 1;
+    const bits = this.bits = params.get("BitsPerComponent") || 8;
+    const columns = this.columns = params.get("Columns") || 1;
+    this.pixBytes = colors * bits + 7 >> 3;
+    this.rowBytes = columns * colors * bits + 7 >> 3;
+    return this;
+  }
 
-    operatorList.addOp(_util.OPS.paintImageXObject, args);
+  readBlockTiff() {
+    const rowBytes = this.rowBytes;
+    const bufferLength = this.bufferLength;
+    const buffer = this.ensureBuffer(bufferLength + rowBytes);
+    const bits = this.bits;
+    const colors = this.colors;
+    const rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
 
-    if (cacheKey) {
-      localImageCache.set(cacheKey, imageRef, {
-        fn: _util.OPS.paintImageXObject,
-        args
-      });
+    if (this.eof) {
+      return;
+    }
 
-      if (imageRef) {
-        (0, _util.assert)(!isInline, "Cannot cache an inline image globally.");
-        this.globalImageCache.addPageIndex(imageRef, this.pageIndex);
+    let inbuf = 0,
+        outbuf = 0;
+    let inbits = 0,
+        outbits = 0;
+    let pos = bufferLength;
+    let i;
 
-        if (cacheGlobally) {
-          this.globalImageCache.setData(imageRef, {
-            objId,
-            fn: _util.OPS.paintImageXObject,
-            args
-          });
-        }
+    if (bits === 1 && colors === 1) {
+      for (i = 0; i < rowBytes; ++i) {
+        let c = rawBytes[i] ^ inbuf;
+        c ^= c >> 1;
+        c ^= c >> 2;
+        c ^= c >> 4;
+        inbuf = (c & 1) << 7;
+        buffer[pos++] = c;
+      }
+    } else if (bits === 8) {
+      for (i = 0; i < colors; ++i) {
+        buffer[pos++] = rawBytes[i];
       }
-    }
 
-    return undefined;
-  }
+      for (; i < rowBytes; ++i) {
+        buffer[pos] = buffer[pos - colors] + rawBytes[i];
+        pos++;
+      }
+    } else if (bits === 16) {
+      const bytesPerPixel = colors * 2;
 
-  handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) {
-    var smaskContent = smask.get("G");
-    var smaskOptions = {
-      subtype: smask.get("S").name,
-      backdrop: smask.get("BC")
-    };
-    var transferObj = smask.get("TR");
+      for (i = 0; i < bytesPerPixel; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
 
-    if ((0, _function.isPDFFunction)(transferObj)) {
-      const transferFn = this._pdfFunctionFactory.create(transferObj);
+      for (; i < rowBytes; i += 2) {
+        const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 
0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff);
+        buffer[pos++] = sum >> 8 & 0xff;
+        buffer[pos++] = sum & 0xff;
+      }
+    } else {
+      const compArray = new Uint8Array(colors + 1);
+      const bitMask = (1 << bits) - 1;
+      let j = 0,
+          k = bufferLength;
+      const columns = this.columns;
 
-      var transferMap = new Uint8Array(256);
-      var tmp = new Float32Array(1);
+      for (i = 0; i < columns; ++i) {
+        for (let kk = 0; kk < colors; ++kk) {
+          if (inbits < bits) {
+            inbuf = inbuf << 8 | rawBytes[j++] & 0xff;
+            inbits += 8;
+          }
 
-      for (var i = 0; i < 256; i++) {
-        tmp[0] = i / 255;
-        transferFn(tmp, 0, tmp, 0);
-        transferMap[i] = tmp[0] * 255 | 0;
+          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
+          inbits -= bits;
+          outbuf = outbuf << bits | compArray[kk];
+          outbits += bits;
+
+          if (outbits >= 8) {
+            buffer[k++] = outbuf >> outbits - 8 & 0xff;
+            outbits -= 8;
+          }
+        }
       }
 
-      smaskOptions.transferMap = transferMap;
+      if (outbits > 0) {
+        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
+      }
     }
 
-    return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, 
stateManager.state.clone(), localColorSpaceCache);
+    this.bufferLength += rowBytes;
   }
 
-  handleTransferFunction(tr) {
-    let transferArray;
+  readBlockPng() {
+    const rowBytes = this.rowBytes;
+    const pixBytes = this.pixBytes;
+    const predictor = this.str.getByte();
+    const rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
 
-    if (Array.isArray(tr)) {
-      transferArray = tr;
-    } else if ((0, _function.isPDFFunction)(tr)) {
-      transferArray = [tr];
-    } else {
-      return null;
+    if (this.eof) {
+      return;
     }
 
-    const transferMaps = [];
-    let numFns = 0,
-        numEffectfulFns = 0;
-
-    for (const entry of transferArray) {
-      const transferObj = this.xref.fetchIfRef(entry);
-      numFns++;
-
-      if ((0, _primitives.isName)(transferObj, "Identity")) {
-        transferMaps.push(null);
-        continue;
-      } else if (!(0, _function.isPDFFunction)(transferObj)) {
-        return null;
-      }
+    const bufferLength = this.bufferLength;
+    const buffer = this.ensureBuffer(bufferLength + rowBytes);
+    let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
 
-      const transferFn = this._pdfFunctionFactory.create(transferObj);
+    if (prevRow.length === 0) {
+      prevRow = new Uint8Array(rowBytes);
+    }
 
-      const transferMap = new Uint8Array(256),
-            tmp = new Float32Array(1);
+    let i,
+        j = bufferLength,
+        up,
+        c;
 
-      for (let j = 0; j < 256; j++) {
-        tmp[0] = j / 255;
-        transferFn(tmp, 0, tmp, 0);
-        transferMap[j] = tmp[0] * 255 | 0;
-      }
+    switch (predictor) {
+      case 0:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
 
-      transferMaps.push(transferMap);
-      numEffectfulFns++;
-    }
+        break;
 
-    if (!(numFns === 1 || numFns === 4)) {
-      return null;
-    }
+      case 1:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
 
-    if (numEffectfulFns === 0) {
-      return null;
-    }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff;
+          j++;
+        }
 
-    return transferMaps;
-  }
+        break;
 
-  handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) {
-    const tilingOpList = new _operator_list.OperatorList();
+      case 2:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = prevRow[i] + rawBytes[i] & 0xff;
+        }
 
-    const patternResources = _primitives.Dict.merge({
-      xref: this.xref,
-      dictArray: [patternDict.get("Resources"), resources]
-    });
+        break;
 
-    return this.getOperatorList({
-      stream: pattern,
-      task,
-      resources: patternResources,
-      operatorList: tilingOpList
-    }).then(function () {
-      return (0, _pattern.getTilingPatternIR)({
-        fnArray: tilingOpList.fnArray,
-        argsArray: tilingOpList.argsArray
-      }, patternDict, args);
-    }).then(function (tilingPatternIR) {
-      operatorList.addDependencies(tilingOpList.dependencies);
-      operatorList.addOp(fn, tilingPatternIR);
-    }, reason => {
-      if (reason instanceof _util.AbortException) {
-        return;
-      }
+      case 3:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        }
 
-      if (this.options.ignoreErrors) {
-        this.handler.send("UnsupportedFeature", {
-          featureId: _util.UNSUPPORTED_FEATURES.errorTilingPattern
-        });
-        (0, _util.warn)(`handleTilingType - ignoring pattern: "${reason}".`);
-        return;
-      }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff;
+          j++;
+        }
 
-      throw reason;
-    });
-  }
+        break;
 
-  handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) {
-    var fontName,
-        fontSize = 0;
+      case 4:
+        for (i = 0; i < pixBytes; ++i) {
+          up = prevRow[i];
+          c = rawBytes[i];
+          buffer[j++] = up + c;
+        }
 
-    if (fontArgs) {
-      fontArgs = fontArgs.slice();
-      fontName = fontArgs[0].name;
-      fontSize = fontArgs[1];
-    }
+        for (; i < rowBytes; ++i) {
+          up = prevRow[i];
+          const upLeft = prevRow[i - pixBytes];
+          const left = buffer[j - pixBytes];
+          const p = left + up - upLeft;
+          let pa = p - left;
 
-    return this.loadFont(fontName, fontRef, resources).then(translated => {
-      if (!translated.font.isType3Font) {
-        return translated;
-      }
+          if (pa < 0) {
+            pa = -pa;
+          }
 
-      return translated.loadType3Data(this, resources, task).then(function () {
-        operatorList.addDependencies(translated.type3Dependencies);
-        return translated;
-      }).catch(reason => {
-        this.handler.send("UnsupportedFeature", {
-          featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadType3
-        });
-        return new TranslatedFont({
-          loadedName: "g_font_error",
-          font: new _fonts.ErrorFont(`Type3 font load error: ${reason}`),
-          dict: translated.font,
-          extraProperties: this.options.fontExtraProperties
-        });
-      });
-    }).then(translated => {
-      state.font = translated.font;
-      state.fontSize = fontSize;
-      state.fontName = fontName;
-      translated.send(this.handler);
-      return translated.loadedName;
-    });
-  }
+          let pb = p - up;
 
-  handleText(chars, state) {
-    const font = state.font;
-    const glyphs = font.charsToGlyphs(chars);
+          if (pb < 0) {
+            pb = -pb;
+          }
 
-    if (font.data) {
-      const isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
+          let pc = p - upLeft;
 
-      if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || 
this.options.disableFontFace) {
-        PartialEvaluator.buildFontPaths(font, glyphs, this.handler);
-      }
-    }
+          if (pc < 0) {
+            pc = -pc;
+          }
 
-    return glyphs;
-  }
+          c = rawBytes[i];
 
-  ensureStateFont(state) {
-    if (state.font) {
-      return;
-    }
+          if (pa <= pb && pa <= pc) {
+            buffer[j++] = left + c;
+          } else if (pb <= pc) {
+            buffer[j++] = up + c;
+          } else {
+            buffer[j++] = upLeft + c;
+          }
+        }
 
-    const reason = new _util.FormatError("Missing setFont (Tf) operator before text rendering operator.");
+        break;
 
-    if (this.options.ignoreErrors) {
-      this.handler.send("UnsupportedFeature", {
-        featureId: _util.UNSUPPORTED_FEATURES.errorFontState
-      });
-      (0, _util.warn)(`ensureStateFont: "${reason}".`);
-      return;
+      default:
+        throw new _util.FormatError(`Unsupported predictor: ${predictor}`);
     }
 
-    throw reason;
+    this.bufferLength += rowBytes;
   }
 
-  async setGState({
-    resources,
-    gState,
-    operatorList,
-    cacheKey,
-    task,
-    stateManager,
-    localGStateCache,
-    localColorSpaceCache
-  }) {
-    const gStateRef = gState.objId;
-    let isSimpleGState = true;
-    var gStateObj = [];
-    var gStateKeys = gState.getKeys();
-    var promise = Promise.resolve();
+}
 
-    for (var i = 0, ii = gStateKeys.length; i < ii; i++) {
-      const key = gStateKeys[i];
-      const value = gState.get(key);
+exports.PredictorStream = PredictorStream;
 
-      switch (key) {
-        case "Type":
-          break;
+/***/ }),
+/* 33 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-        case "LW":
-        case "LC":
-        case "LJ":
-        case "ML":
-        case "D":
-        case "RI":
-        case "FL":
-        case "CA":
-        case "ca":
-          gStateObj.push([key, value]);
-          break;
 
-        case "Font":
-          isSimpleGState = false;
-          promise = promise.then(() => {
-            return this.handleSetFont(resources, null, value[0], operatorList, task, 
stateManager.state).then(function (loadedName) {
-              operatorList.addDependency(loadedName);
-              gStateObj.push([key, [loadedName, value[1]]]);
-            });
-          });
-          break;
 
-        case "BM":
-          gStateObj.push([key, normalizeBlendMode(value)]);
-          break;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.RunLengthStream = void 0;
 
-        case "SMask":
-          if ((0, _primitives.isName)(value, "None")) {
-            gStateObj.push([key, false]);
-            break;
-          }
+var _decode_stream = __w_pdfjs_require__(19);
 
-          if ((0, _primitives.isDict)(value)) {
-            isSimpleGState = false;
-            promise = promise.then(() => {
-              return this.handleSMask(value, resources, operatorList, task, stateManager, 
localColorSpaceCache);
-            });
-            gStateObj.push([key, true]);
-          } else {
-            (0, _util.warn)("Unsupported SMask type");
-          }
+class RunLengthStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength) {
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+  }
 
-          break;
+  readBlock() {
+    const repeatHeader = this.str.getBytes(2);
 
-        case "TR":
-          const transferMaps = this.handleTransferFunction(value);
-          gStateObj.push([key, transferMaps]);
-          break;
+    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
+      this.eof = true;
+      return;
+    }
 
-        case "OP":
-        case "op":
-        case "OPM":
-        case "BG":
-        case "BG2":
-        case "UCR":
-        case "UCR2":
-        case "TR2":
-        case "HT":
-        case "SM":
-        case "SA":
-        case "AIS":
-        case "TK":
-          (0, _util.info)("graphic state operator " + key);
-          break;
+    let buffer;
+    let bufferLength = this.bufferLength;
+    let n = repeatHeader[0];
 
-        default:
-          (0, _util.info)("Unknown graphic state operator " + key);
-          break;
-      }
-    }
+    if (n < 128) {
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer[bufferLength++] = repeatHeader[1];
 
-    return promise.then(function () {
-      if (gStateObj.length > 0) {
-        operatorList.addOp(_util.OPS.setGState, [gStateObj]);
+      if (n > 0) {
+        const source = this.str.getBytes(n);
+        buffer.set(source, bufferLength);
+        bufferLength += n;
       }
+    } else {
+      n = 257 - n;
+      const b = repeatHeader[1];
+      buffer = this.ensureBuffer(bufferLength + n + 1);
 
-      if (isSimpleGState) {
-        localGStateCache.set(cacheKey, gStateRef, gStateObj);
+      for (let i = 0; i < n; i++) {
+        buffer[bufferLength++] = b;
       }
-    });
-  }
+    }
 
-  loadFont(fontName, font, resources) {
-    const errorFont = () => {
-      return Promise.resolve(new TranslatedFont({
-        loadedName: "g_font_error",
-        font: new _fonts.ErrorFont(`Font "${fontName}" is not available.`),
-        dict: font,
-        extraProperties: this.options.fontExtraProperties
-      }));
-    };
+    this.bufferLength = bufferLength;
+  }
 
-    var fontRef,
-        xref = this.xref;
+}
 
-    if (font) {
-      if (!(0, _primitives.isRef)(font)) {
-        throw new _util.FormatError('The "font" object should be a reference.');
-      }
+exports.RunLengthStream = RunLengthStream;
 
-      fontRef = font;
-    } else {
-      var fontRes = resources.get("Font");
+/***/ }),
+/* 34 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-      if (fontRes) {
-        fontRef = fontRes.getRaw(fontName);
-      }
-    }
 
-    if (!fontRef) {
-      const partialMsg = `Font "${fontName || font && font.toString()}" is not available`;
 
-      if (!this.options.ignoreErrors && !this.parsingType3Font) {
-        (0, _util.warn)(`${partialMsg}.`);
-        return errorFont();
-      }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Font = exports.ErrorFont = void 0;
 
-      this.handler.send("UnsupportedFeature", {
-        featureId: _util.UNSUPPORTED_FEATURES.errorFontMissing
-      });
-      (0, _util.warn)(`${partialMsg} -- attempting to fallback to a default font.`);
-      fontRef = PartialEvaluator.fallbackFontDict;
-    }
+var _util = __w_pdfjs_require__(2);
 
-    if (this.fontCache.has(fontRef)) {
-      return this.fontCache.get(fontRef);
-    }
+var _cff_parser = __w_pdfjs_require__(35);
 
-    font = xref.fetchIfRef(fontRef);
+var _fonts_utils = __w_pdfjs_require__(38);
 
-    if (!(0, _primitives.isDict)(font)) {
-      return errorFont();
-    }
+var _glyphlist = __w_pdfjs_require__(39);
 
-    if (font.translated) {
-      return font.translated;
-    }
+var _encodings = __w_pdfjs_require__(37);
 
-    var fontCapability = (0, _util.createPromiseCapability)();
-    var preEvaluatedFont = this.preEvaluateFont(font);
-    const {
-      descriptor,
-      hash
-    } = preEvaluatedFont;
-    var fontRefIsRef = (0, _primitives.isRef)(fontRef),
-        fontID;
+var _standard_fonts = __w_pdfjs_require__(41);
 
-    if (fontRefIsRef) {
-      fontID = `f${fontRef.toString()}`;
-    }
+var _unicode = __w_pdfjs_require__(40);
 
-    if (hash && (0, _primitives.isDict)(descriptor)) {
-      if (!descriptor.fontAliases) {
-        descriptor.fontAliases = Object.create(null);
-      }
+var _to_unicode_map = __w_pdfjs_require__(42);
 
-      var fontAliases = descriptor.fontAliases;
+var _cff_font = __w_pdfjs_require__(43);
 
-      if (fontAliases[hash]) {
-        var aliasFontRef = fontAliases[hash].aliasRef;
+var _font_renderer = __w_pdfjs_require__(44);
 
-        if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
-          this.fontCache.putAlias(fontRef, aliasFontRef);
-          return this.fontCache.get(fontRef);
-        }
-      } else {
-        fontAliases[hash] = {
-          fontID: this.idFactory.createFontId()
-        };
-      }
+var _glyf = __w_pdfjs_require__(45);
 
-      if (fontRefIsRef) {
-        fontAliases[hash].aliasRef = fontRef;
-      }
+var _cmap = __w_pdfjs_require__(16);
 
-      fontID = fontAliases[hash].fontID;
-    }
+var _opentype_file_builder = __w_pdfjs_require__(46);
 
-    if (fontRefIsRef) {
-      this.fontCache.put(fontRef, fontCapability.promise);
-    } else {
-      if (!fontID) {
-        fontID = this.idFactory.createFontId();
-      }
+var _core_utils = __w_pdfjs_require__(9);
 
-      this.fontCache.put(`id_${fontID}`, fontCapability.promise);
-    }
+var _stream = __w_pdfjs_require__(10);
 
-    (0, _util.assert)(fontID && fontID.startsWith("f"), 'The "fontID" must be (correctly) defined.');
-    font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;
-    font.translated = fontCapability.promise;
-    var translatedPromise;
+var _type1_font = __w_pdfjs_require__(47);
 
-    try {
-      translatedPromise = this.translateFont(preEvaluatedFont);
-    } catch (e) {
-      translatedPromise = Promise.reject(e);
-    }
+const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]];
+const PDF_GLYPH_SPACE_UNITS = 1000;
+const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", 
"cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", 
"fontType", "isMonospace", "isSerifFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", 
"name", "remeasure", "subtype", "type", "vertical"];
+const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isSymbolicFont", "seacMap", 
"toFontChar", "toUnicode", "vmetrics", "widths"];
 
-    translatedPromise.then(translatedFont => {
-      if (translatedFont.fontType !== undefined) {
-        var xrefFontStats = xref.stats.fontTypes;
-        xrefFontStats[translatedFont.fontType] = true;
-      }
+function adjustWidths(properties) {
+  if (!properties.fontMatrix) {
+    return;
+  }
 
-      fontCapability.resolve(new TranslatedFont({
-        loadedName: font.loadedName,
-        font: translatedFont,
-        dict: font,
-        extraProperties: this.options.fontExtraProperties
-      }));
-    }).catch(reason => {
-      this.handler.send("UnsupportedFeature", {
-        featureId: _util.UNSUPPORTED_FEATURES.errorFontTranslate
-      });
+  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {
+    return;
+  }
 
-      try {
-        var fontFile3 = descriptor && descriptor.get("FontFile3");
-        var subtype = fontFile3 && fontFile3.get("Subtype");
-        var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);
-        var xrefFontStats = xref.stats.fontTypes;
-        xrefFontStats[fontType] = true;
-      } catch (ex) {}
+  const scale = 0.001 / properties.fontMatrix[0];
+  const glyphsWidths = properties.widths;
 
-      fontCapability.resolve(new TranslatedFont({
-        loadedName: font.loadedName,
-        font: new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason),
-        dict: font,
-        extraProperties: this.options.fontExtraProperties
-      }));
-    });
-    return fontCapability.promise;
+  for (const glyph in glyphsWidths) {
+    glyphsWidths[glyph] *= scale;
   }
 
-  buildPath(operatorList, fn, args, parsingText = false) {
-    var lastIndex = operatorList.length - 1;
+  properties.defaultWidth *= scale;
+}
 
-    if (!args) {
-      args = [];
-    }
+function adjustToUnicode(properties, builtInEncoding) {
+  if (properties.isInternalFont) {
+    return;
+  }
 
-    if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {
-      if (parsingText) {
-        (0, _util.warn)(`Encountered path operator "${fn}" inside of a text object.`);
-        operatorList.addOp(_util.OPS.save, null);
-      }
+  if (builtInEncoding === properties.defaultEncoding) {
+    return;
+  }
 
-      operatorList.addOp(_util.OPS.constructPath, [[fn], args]);
+  if (properties.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) {
+    return;
+  }
 
-      if (parsingText) {
-        operatorList.addOp(_util.OPS.restore, null);
+  const toUnicode = [],
+        glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+
+  for (const charCode in builtInEncoding) {
+    if (properties.hasIncludedToUnicodeMap) {
+      if (properties.toUnicode.has(charCode)) {
+        continue;
       }
     } else {
-      var opArgs = operatorList.argsArray[lastIndex];
-      opArgs[0].push(fn);
-      Array.prototype.push.apply(opArgs[1], args);
+      if (properties.hasEncoding && properties.differences[charCode] !== undefined) {
+        continue;
+      }
     }
-  }
 
-  parseColorSpace({
-    cs,
-    resources,
-    localColorSpaceCache
-  }) {
-    return _colorspace.ColorSpace.parseAsync({
-      cs,
-      xref: this.xref,
-      resources,
-      pdfFunctionFactory: this._pdfFunctionFactory,
-      localColorSpaceCache
-    }).catch(reason => {
-      if (reason instanceof _util.AbortException) {
-        return null;
-      }
+    const glyphName = builtInEncoding[charCode];
+    const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
 
-      if (this.options.ignoreErrors) {
-        this.handler.send("UnsupportedFeature", {
-          featureId: _util.UNSUPPORTED_FEATURES.errorColorSpace
-        });
-        (0, _util.warn)(`parseColorSpace - ignoring ColorSpace: "${reason}".`);
-        return null;
-      }
+    if (unicode !== -1) {
+      toUnicode[charCode] = String.fromCharCode(unicode);
+    }
+  }
 
-      throw reason;
-    });
+  if (toUnicode.length > 0) {
+    properties.toUnicode.amend(toUnicode);
   }
+}
 
-  async handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache) {
-    var patternName = args[args.length - 1];
-    var pattern;
+function amendFallbackToUnicode(properties) {
+  if (!properties.fallbackToUnicode) {
+    return;
+  }
 
-    if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) {
-      var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;
-      var typeNum = dict.get("PatternType");
+  if (properties.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) {
+    return;
+  }
 
-      if (typeNum === PatternType.TILING) {
-        var color = cs.base ? cs.base.getRgb(args, 0) : null;
-        return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);
-      } else if (typeNum === PatternType.SHADING) {
-        var shading = dict.get("Shading");
-        var matrix = dict.getArray("Matrix");
-        pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, 
this._pdfFunctionFactory, localColorSpaceCache);
-        operatorList.addOp(fn, pattern.getIR());
-        return undefined;
-      }
+  const toUnicode = [];
 
-      throw new _util.FormatError(`Unknown PatternType: ${typeNum}`);
+  for (const charCode in properties.fallbackToUnicode) {
+    if (properties.toUnicode.has(charCode)) {
+      continue;
     }
 
-    throw new _util.FormatError(`Unknown PatternName: ${patternName}`);
+    toUnicode[charCode] = properties.fallbackToUnicode[charCode];
   }
 
-  async parseMarkedContentProps(contentProperties, resources) {
-    let optionalContent;
+  if (toUnicode.length > 0) {
+    properties.toUnicode.amend(toUnicode);
+  }
+}
 
-    if ((0, _primitives.isName)(contentProperties)) {
-      const properties = resources.get("Properties");
-      optionalContent = properties.get(contentProperties.name);
-    } else if ((0, _primitives.isDict)(contentProperties)) {
-      optionalContent = contentProperties;
-    } else {
-      throw new _util.FormatError("Optional content properties malformed.");
-    }
+class Glyph {
+  constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, 
isInFont) {
+    this.originalCharCode = originalCharCode;
+    this.fontChar = fontChar;
+    this.unicode = unicode;
+    this.accent = accent;
+    this.width = width;
+    this.vmetric = vmetric;
+    this.operatorListId = operatorListId;
+    this.isSpace = isSpace;
+    this.isInFont = isInFont;
+  }
 
-    const optionalContentType = optionalContent.get("Type").name;
+  matchesForCache(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, 
isInFont) {
+    return this.originalCharCode === originalCharCode && this.fontChar === fontChar && this.unicode === 
unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId 
=== operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;
+  }
 
-    if (optionalContentType === "OCG") {
-      return {
-        type: optionalContentType,
-        id: optionalContent.objId
-      };
-    } else if (optionalContentType === "OCMD") {
-      const optionalContentGroups = optionalContent.get("OCGs");
+}
 
-      if (Array.isArray(optionalContentGroups) || (0, _primitives.isDict)(optionalContentGroups)) {
-        const groupIds = [];
+function int16(b0, b1) {
+  return (b0 << 8) + b1;
+}
 
-        if (Array.isArray(optionalContentGroups)) {
-          optionalContent.get("OCGs").forEach(ocg => {
-            groupIds.push(ocg.toString());
-          });
-        } else {
-          groupIds.push(optionalContentGroups.objId);
-        }
+function writeSignedInt16(bytes, index, value) {
+  bytes[index + 1] = value;
+  bytes[index] = value >>> 8;
+}
 
-        let expression = null;
+function signedInt16(b0, b1) {
+  const value = (b0 << 8) + b1;
+  return value & 1 << 15 ? value - 0x10000 : value;
+}
 
-        if (optionalContent.get("VE")) {
-          expression = true;
-        }
+function int32(b0, b1, b2, b3) {
+  return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+}
 
-        return {
-          type: optionalContentType,
-          ids: groupIds,
-          policy: (0, _primitives.isName)(optionalContent.get("P")) ? optionalContent.get("P").name : null,
-          expression
-        };
-      } else if ((0, _primitives.isRef)(optionalContentGroups)) {
-        return {
-          type: optionalContentType,
-          id: optionalContentGroups.toString()
-        };
-      }
-    }
+function string16(value) {
+  return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
+}
 
-    return null;
+function safeString16(value) {
+  if (value > 0x7fff) {
+    value = 0x7fff;
+  } else if (value < -0x8000) {
+    value = -0x8000;
   }
 
-  getOperatorList({
-    stream,
-    task,
-    resources,
-    operatorList,
-    initialState = null
-  }) {
-    resources = resources || _primitives.Dict.empty;
-    initialState = initialState || new EvalState();
+  return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
+}
 
-    if (!operatorList) {
-      throw new Error('getOperatorList: missing "operatorList" parameter');
-    }
+function isTrueTypeFile(file) {
+  const header = file.peekBytes(4);
+  return (0, _core_utils.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === 
"true";
+}
 
-    var self = this;
-    var xref = this.xref;
-    let parsingText = false;
-    const localImageCache = new _image_utils.LocalImageCache();
-    const localColorSpaceCache = new _image_utils.LocalColorSpaceCache();
-    const localGStateCache = new _image_utils.LocalGStateCache();
+function isTrueTypeCollectionFile(file) {
+  const header = file.peekBytes(4);
+  return (0, _util.bytesToString)(header) === "ttcf";
+}
 
-    var xobjs = resources.get("XObject") || _primitives.Dict.empty;
+function isOpenTypeFile(file) {
+  const header = file.peekBytes(4);
+  return (0, _util.bytesToString)(header) === "OTTO";
+}
 
-    var patterns = resources.get("Pattern") || _primitives.Dict.empty;
+function isType1File(file) {
+  const header = file.peekBytes(2);
 
-    var stateManager = new StateManager(initialState);
-    var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
-    var timeSlotManager = new TimeSlotManager();
+  if (header[0] === 0x25 && header[1] === 0x21) {
+    return true;
+  }
 
-    function closePendingRestoreOPS(argument) {
-      for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
-        operatorList.addOp(_util.OPS.restore, []);
-      }
-    }
+  if (header[0] === 0x80 && header[1] === 0x01) {
+    return true;
+  }
 
-    return new Promise(function promiseBody(resolve, reject) {
-      const next = function (promise) {
-        Promise.all([promise, operatorList.ready]).then(function () {
-          try {
-            promiseBody(resolve, reject);
-          } catch (ex) {
-            reject(ex);
-          }
-        }, reject);
-      };
+  return false;
+}
 
-      task.ensureNotTerminated();
-      timeSlotManager.reset();
-      var stop,
-          operation = {},
-          i,
-          ii,
-          cs,
-          name;
+function isCFFFile(file) {
+  const header = file.peekBytes(4);
 
-      while (!(stop = timeSlotManager.check())) {
-        operation.args = null;
+  if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
+    return true;
+  }
 
-        if (!preprocessor.read(operation)) {
-          break;
-        }
+  return false;
+}
 
-        var args = operation.args;
-        var fn = operation.fn;
+function getFontFileType(file, {
+  type,
+  subtype,
+  composite
+}) {
+  let fileType, fileSubtype;
 
-        switch (fn | 0) {
-          case _util.OPS.paintXObject:
-            name = args[0].name;
+  if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
+    if (composite) {
+      fileType = "CIDFontType2";
+    } else {
+      fileType = "TrueType";
+    }
+  } else if (isOpenTypeFile(file)) {
+    if (composite) {
+      fileType = "CIDFontType2";
+    } else {
+      fileType = "OpenType";
+    }
+  } else if (isType1File(file)) {
+    if (composite) {
+      fileType = "CIDFontType0";
+    } else {
+      fileType = type === "MMType1" ? "MMType1" : "Type1";
+    }
+  } else if (isCFFFile(file)) {
+    if (composite) {
+      fileType = "CIDFontType0";
+      fileSubtype = "CIDFontType0C";
+    } else {
+      fileType = type === "MMType1" ? "MMType1" : "Type1";
+      fileSubtype = "Type1C";
+    }
+  } else {
+    (0, _util.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");
+    fileType = type;
+    fileSubtype = subtype;
+  }
 
-            if (name) {
-              const localImage = localImageCache.getByName(name);
+  return [fileType, fileSubtype];
+}
 
-              if (localImage) {
-                operatorList.addOp(localImage.fn, localImage.args);
-                args = null;
-                continue;
-              }
-            }
+function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
+  const toFontChar = [];
+  let unicode;
 
-            next(new Promise(function (resolveXObject, rejectXObject) {
-              if (!name) {
-                throw new _util.FormatError("XObject must be referred to by name.");
-              }
+  for (let i = 0, ii = encoding.length; i < ii; i++) {
+    unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);
 
-              let xobj = xobjs.getRaw(name);
+    if (unicode !== -1) {
+      toFontChar[i] = unicode;
+    }
+  }
 
-              if (xobj instanceof _primitives.Ref) {
-                const localImage = localImageCache.getByRef(xobj);
+  for (const charCode in differences) {
+    unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);
 
-                if (localImage) {
-                  operatorList.addOp(localImage.fn, localImage.args);
-                  resolveXObject();
-                  return;
-                }
+    if (unicode !== -1) {
+      toFontChar[+charCode] = unicode;
+    }
+  }
 
-                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
+  return toFontChar;
+}
 
-                if (globalImage) {
-                  operatorList.addDependency(globalImage.objId);
-                  operatorList.addOp(globalImage.fn, globalImage.args);
-                  resolveXObject();
-                  return;
-                }
+function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {
+  const newMap = Object.create(null);
+  const toFontChar = [];
+  let privateUseAreaIndex = 0;
+  let nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+  let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
 
-                xobj = xref.fetch(xobj);
-              }
+  for (let originalCharCode in charCodeToGlyphId) {
+    originalCharCode |= 0;
+    let glyphId = charCodeToGlyphId[originalCharCode];
 
-              if (!(0, _primitives.isStream)(xobj)) {
-                throw new _util.FormatError("XObject should be a stream");
-              }
+    if (!hasGlyph(glyphId)) {
+      continue;
+    }
 
-              const type = xobj.dict.get("Subtype");
+    if (nextAvailableFontCharCode > privateUseOffetEnd) {
+      privateUseAreaIndex++;
 
-              if (!(0, _primitives.isName)(type)) {
-                throw new _util.FormatError("XObject should have a Name subtype");
-              }
+      if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
+        (0, _util.warn)("Ran out of space in font private use area.");
+        break;
+      }
 
-              if (type.name === "Form") {
-                stateManager.save();
-                self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), 
localColorSpaceCache).then(function () {
-                  stateManager.restore();
-                  resolveXObject();
-                }, rejectXObject);
-                return;
-              } else if (type.name === "Image") {
-                self.buildPaintImageXObject({
-                  resources,
-                  image: xobj,
-                  operatorList,
-                  cacheKey: name,
-                  localImageCache,
-                  localColorSpaceCache
-                }).then(resolveXObject, rejectXObject);
-                return;
-              } else if (type.name === "PS") {
-                (0, _util.info)("Ignored XObject subtype PS");
-              } else {
-                throw new _util.FormatError(`Unhandled XObject subtype ${type.name}`);
-              }
+      nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+      privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+    }
 
-              resolveXObject();
-            }).catch(function (reason) {
-              if (reason instanceof _util.AbortException) {
-                return;
-              }
+    const fontCharCode = nextAvailableFontCharCode++;
 
-              if (self.options.ignoreErrors) {
-                self.handler.send("UnsupportedFeature", {
-                  featureId: _util.UNSUPPORTED_FEATURES.errorXObject
-                });
-                (0, _util.warn)(`getOperatorList - ignoring XObject: "${reason}".`);
-                return;
-              }
+    if (glyphId === 0) {
+      glyphId = newGlyphZeroId;
+    }
 
-              throw reason;
-            }));
-            return;
+    newMap[fontCharCode] = glyphId;
+    toFontChar[originalCharCode] = fontCharCode;
+  }
 
-          case _util.OPS.setFont:
-            var fontSize = args[1];
-            next(self.handleSetFont(resources, args, null, operatorList, task, 
stateManager.state).then(function (loadedName) {
-              operatorList.addDependency(loadedName);
-              operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);
-            }));
-            return;
+  return {
+    toFontChar,
+    charCodeToGlyphId: newMap,
+    nextAvailableFontCharCode
+  };
+}
 
-          case _util.OPS.beginText:
-            parsingText = true;
-            break;
+function getRanges(glyphs, numGlyphs) {
+  const codes = [];
 
-          case _util.OPS.endText:
-            parsingText = false;
-            break;
+  for (const charCode in glyphs) {
+    if (glyphs[charCode] >= numGlyphs) {
+      continue;
+    }
 
-          case _util.OPS.endInlineImage:
-            var cacheKey = args[0].cacheKey;
+    codes.push({
+      fontCharCode: charCode | 0,
+      glyphId: glyphs[charCode]
+    });
+  }
 
-            if (cacheKey) {
-              const localImage = localImageCache.getByName(cacheKey);
+  if (codes.length === 0) {
+    codes.push({
+      fontCharCode: 0,
+      glyphId: 0
+    });
+  }
 
-              if (localImage) {
-                operatorList.addOp(localImage.fn, localImage.args);
-                args = null;
-                continue;
-              }
-            }
+  codes.sort(function fontGetRangesSort(a, b) {
+    return a.fontCharCode - b.fontCharCode;
+  });
+  const ranges = [];
+  const length = codes.length;
+
+  for (let n = 0; n < length;) {
+    const start = codes[n].fontCharCode;
+    const codeIndices = [codes[n].glyphId];
+    ++n;
+    let end = start;
+
+    while (n < length && end + 1 === codes[n].fontCharCode) {
+      codeIndices.push(codes[n].glyphId);
+      ++end;
+      ++n;
 
-            next(self.buildPaintImageXObject({
-              resources,
-              image: args[0],
-              isInline: true,
-              operatorList,
-              cacheKey,
-              localImageCache,
-              localColorSpaceCache
-            }));
-            return;
+      if (end === 0xffff) {
+        break;
+      }
+    }
 
-          case _util.OPS.showText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+    ranges.push([start, end, codeIndices]);
+  }
 
-            args[0] = self.handleText(args[0], stateManager.state);
-            break;
+  return ranges;
+}
 
-          case _util.OPS.showSpacedText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+function createCmapTable(glyphs, numGlyphs) {
+  const ranges = getRanges(glyphs, numGlyphs);
+  const numTables = ranges[ranges.length - 1][1] > 0xffff ? 2 : 1;
+  let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + (0, _util.string32)(4 + numTables 
* 8);
+  let i, ii, j, jj;
 
-            var arr = args[0];
-            var combinedGlyphs = [];
-            var arrLength = arr.length;
-            var state = stateManager.state;
+  for (i = ranges.length - 1; i >= 0; --i) {
+    if (ranges[i][0] <= 0xffff) {
+      break;
+    }
+  }
 
-            for (i = 0; i < arrLength; ++i) {
-              var arrItem = arr[i];
+  const bmpLength = i + 1;
 
-              if ((0, _util.isString)(arrItem)) {
-                Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));
-              } else if ((0, _util.isNum)(arrItem)) {
-                combinedGlyphs.push(arrItem);
-              }
-            }
+  if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {
+    ranges[i][1] = 0xfffe;
+  }
 
-            args[0] = combinedGlyphs;
-            fn = _util.OPS.showText;
-            break;
+  const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;
+  const segCount = bmpLength + trailingRangesCount;
 
-          case _util.OPS.nextLineShowText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+  const searchParams = _opentype_file_builder.OpenTypeFileBuilder.getSearchParams(segCount, 2);
 
-            operatorList.addOp(_util.OPS.nextLine);
-            args[0] = self.handleText(args[0], stateManager.state);
-            fn = _util.OPS.showText;
-            break;
+  let startCount = "";
+  let endCount = "";
+  let idDeltas = "";
+  let idRangeOffsets = "";
+  let glyphsIds = "";
+  let bias = 0;
+  let range, start, end, codes;
 
-          case _util.OPS.nextLineSetSpacingShowText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+  for (i = 0, ii = bmpLength; i < ii; i++) {
+    range = ranges[i];
+    start = range[0];
+    end = range[1];
+    startCount += string16(start);
+    endCount += string16(end);
+    codes = range[2];
+    let contiguous = true;
 
-            operatorList.addOp(_util.OPS.nextLine);
-            operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);
-            operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);
-            args[0] = self.handleText(args[0], stateManager.state);
-            fn = _util.OPS.showText;
-            break;
+    for (j = 1, jj = codes.length; j < jj; ++j) {
+      if (codes[j] !== codes[j - 1] + 1) {
+        contiguous = false;
+        break;
+      }
+    }
 
-          case _util.OPS.setTextRenderingMode:
-            stateManager.state.textRenderingMode = args[0];
-            break;
+    if (!contiguous) {
+      const offset = (segCount - i) * 2 + bias * 2;
+      bias += end - start + 1;
+      idDeltas += string16(0);
+      idRangeOffsets += string16(offset);
 
-          case _util.OPS.setFillColorSpace:
-            {
-              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);
+      for (j = 0, jj = codes.length; j < jj; ++j) {
+        glyphsIds += string16(codes[j]);
+      }
+    } else {
+      const startCode = codes[0];
+      idDeltas += string16(startCode - start & 0xffff);
+      idRangeOffsets += string16(0);
+    }
+  }
 
-              if (cachedColorSpace) {
-                stateManager.state.fillColorSpace = cachedColorSpace;
-                continue;
-              }
+  if (trailingRangesCount > 0) {
+    endCount += "\xFF\xFF";
+    startCount += "\xFF\xFF";
+    idDeltas += "\x00\x01";
+    idRangeOffsets += "\x00\x00";
+  }
 
-              next(self.parseColorSpace({
-                cs: args[0],
-                resources,
-                localColorSpaceCache
-              }).then(function (colorSpace) {
-                if (colorSpace) {
-                  stateManager.state.fillColorSpace = colorSpace;
-                }
-              }));
-              return;
-            }
+  const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + 
string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + 
idDeltas + idRangeOffsets + glyphsIds;
+  let format31012 = "";
+  let header31012 = "";
 
-          case _util.OPS.setStrokeColorSpace:
-            {
-              const cachedColorSpace = _colorspace.ColorSpace.getCached(args[0], xref, localColorSpaceCache);
+  if (numTables > 1) {
+    cmap += "\x00\x03" + "\x00\x0A" + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);
+    format31012 = "";
 
-              if (cachedColorSpace) {
-                stateManager.state.strokeColorSpace = cachedColorSpace;
-                continue;
-              }
+    for (i = 0, ii = ranges.length; i < ii; i++) {
+      range = ranges[i];
+      start = range[0];
+      codes = range[2];
+      let code = codes[0];
 
-              next(self.parseColorSpace({
-                cs: args[0],
-                resources,
-                localColorSpaceCache
-              }).then(function (colorSpace) {
-                if (colorSpace) {
-                  stateManager.state.strokeColorSpace = colorSpace;
-                }
-              }));
-              return;
-            }
+      for (j = 1, jj = codes.length; j < jj; ++j) {
+        if (codes[j] !== codes[j - 1] + 1) {
+          end = range[0] + j - 1;
+          format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);
+          start = end + 1;
+          code = codes[j];
+        }
+      }
 
-          case _util.OPS.setFillColor:
-            cs = stateManager.state.fillColorSpace;
-            args = cs.getRgb(args, 0);
-            fn = _util.OPS.setFillRGBColor;
-            break;
+      format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);
+    }
 
-          case _util.OPS.setStrokeColor:
-            cs = stateManager.state.strokeColorSpace;
-            args = cs.getRgb(args, 0);
-            fn = _util.OPS.setStrokeRGBColor;
-            break;
+    header31012 = "\x00\x0C" + "\x00\x00" + (0, _util.string32)(format31012.length + 16) + 
"\x00\x00\x00\x00" + (0, _util.string32)(format31012.length / 12);
+  }
 
-          case _util.OPS.setFillGray:
-            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
-            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
-            fn = _util.OPS.setFillRGBColor;
-            break;
+  return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012;
+}
 
-          case _util.OPS.setStrokeGray:
-            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
-            args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
-            fn = _util.OPS.setStrokeRGBColor;
-            break;
+function validateOS2Table(os2, file) {
+  file.pos = (file.start || 0) + os2.offset;
+  const version = file.getUint16();
+  file.skip(60);
+  const selection = file.getUint16();
 
-          case _util.OPS.setFillCMYKColor:
-            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;
-            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
-            fn = _util.OPS.setFillRGBColor;
-            break;
+  if (version < 4 && selection & 0x0300) {
+    return false;
+  }
 
-          case _util.OPS.setStrokeCMYKColor:
-            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;
-            args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
-            fn = _util.OPS.setStrokeRGBColor;
-            break;
+  const firstChar = file.getUint16();
+  const lastChar = file.getUint16();
 
-          case _util.OPS.setFillRGBColor:
-            stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;
-            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
-            break;
+  if (firstChar > lastChar) {
+    return false;
+  }
 
-          case _util.OPS.setStrokeRGBColor:
-            stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;
-            args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
-            break;
+  file.skip(6);
+  const usWinAscent = file.getUint16();
 
-          case _util.OPS.setFillColorN:
-            cs = stateManager.state.fillColorSpace;
+  if (usWinAscent === 0) {
+    return false;
+  }
 
-            if (cs.name === "Pattern") {
-              next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, 
task, localColorSpaceCache));
-              return;
-            }
+  os2.data[8] = os2.data[9] = 0;
+  return true;
+}
 
-            args = cs.getRgb(args, 0);
-            fn = _util.OPS.setFillRGBColor;
-            break;
+function createOS2Table(properties, charstrings, override) {
+  override = override || {
+    unitsPerEm: 0,
+    yMax: 0,
+    yMin: 0,
+    ascent: 0,
+    descent: 0
+  };
+  let ulUnicodeRange1 = 0;
+  let ulUnicodeRange2 = 0;
+  let ulUnicodeRange3 = 0;
+  let ulUnicodeRange4 = 0;
+  let firstCharIndex = null;
+  let lastCharIndex = 0;
 
-          case _util.OPS.setStrokeColorN:
-            cs = stateManager.state.strokeColorSpace;
+  if (charstrings) {
+    for (let code in charstrings) {
+      code |= 0;
 
-            if (cs.name === "Pattern") {
-              next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, 
task, localColorSpaceCache));
-              return;
-            }
+      if (firstCharIndex > code || !firstCharIndex) {
+        firstCharIndex = code;
+      }
 
-            args = cs.getRgb(args, 0);
-            fn = _util.OPS.setStrokeRGBColor;
-            break;
+      if (lastCharIndex < code) {
+        lastCharIndex = code;
+      }
 
-          case _util.OPS.shadingFill:
-            var shadingRes = resources.get("Shading");
+      const position = (0, _unicode.getUnicodeRangeFor)(code);
 
-            if (!shadingRes) {
-              throw new _util.FormatError("No shading resource found");
-            }
+      if (position < 32) {
+        ulUnicodeRange1 |= 1 << position;
+      } else if (position < 64) {
+        ulUnicodeRange2 |= 1 << position - 32;
+      } else if (position < 96) {
+        ulUnicodeRange3 |= 1 << position - 64;
+      } else if (position < 123) {
+        ulUnicodeRange4 |= 1 << position - 96;
+      } else {
+        throw new _util.FormatError("Unicode ranges Bits > 123 are reserved for internal usage");
+      }
+    }
 
-            var shading = shadingRes.get(args[0].name);
+    if (lastCharIndex > 0xffff) {
+      lastCharIndex = 0xffff;
+    }
+  } else {
+    firstCharIndex = 0;
+    lastCharIndex = 255;
+  }
 
-            if (!shading) {
-              throw new _util.FormatError("No shading object found");
-            }
+  const bbox = properties.bbox || [0, 0, 0, 0];
+  const unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
+  const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
+  const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
+  let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));
 
-            var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler, 
self._pdfFunctionFactory, localColorSpaceCache);
+  if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
+    typoDescent = -typoDescent;
+  }
 
-            var patternIR = shadingFill.getIR();
-            args = [patternIR];
-            fn = _util.OPS.shadingFill;
-            break;
+  const winAscent = override.yMax || typoAscent;
+  const winDescent = -override.yMin || -typoDescent;
+  return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + 
"\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + 
"\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + 
"\x00\x00\x00\x00\x00\x00" + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + 
(0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + 
string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + 
string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + 
string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + 
string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || 
properties.firstChar) + "\x00\x03";
+}
 
-          case _util.OPS.setGState:
-            name = args[0].name;
+function createPostTable(properties) {
+  const angle = Math.floor(properties.italicAngle * 2 ** 16);
+  return "\x00\x03\x00\x00" + (0, _util.string32)(angle) + "\x00\x00" + "\x00\x00" + (0, 
_util.string32)(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" 
+ "\x00\x00\x00\x00";
+}
 
-            if (name) {
-              const localGStateObj = localGStateCache.getByName(name);
+function createPostscriptName(name) {
+  return name.replace(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63);
+}
 
-              if (localGStateObj) {
-                if (localGStateObj.length > 0) {
-                  operatorList.addOp(_util.OPS.setGState, [localGStateObj]);
-                }
+function createNameTable(name, proto) {
+  if (!proto) {
+    proto = [[], []];
+  }
 
-                args = null;
-                continue;
-              }
-            }
+  const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", 
proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || 
createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"];
+  const stringsUnicode = [];
+  let i, ii, j, jj, str;
 
-            next(new Promise(function (resolveGState, rejectGState) {
-              if (!name) {
-                throw new _util.FormatError("GState must be referred to by name.");
-              }
+  for (i = 0, ii = strings.length; i < ii; i++) {
+    str = proto[1][i] || strings[i];
+    const strBufUnicode = [];
 
-              const extGState = resources.get("ExtGState");
+    for (j = 0, jj = str.length; j < jj; j++) {
+      strBufUnicode.push(string16(str.charCodeAt(j)));
+    }
 
-              if (!(extGState instanceof _primitives.Dict)) {
-                throw new _util.FormatError("ExtGState should be a dictionary.");
-              }
+    stringsUnicode.push(strBufUnicode.join(""));
+  }
 
-              const gState = extGState.get(name);
+  const names = [strings, stringsUnicode];
+  const platforms = ["\x00\x01", "\x00\x03"];
+  const encodings = ["\x00\x00", "\x00\x01"];
+  const languages = ["\x00\x00", "\x04\x09"];
+  const namesRecordCount = strings.length * platforms.length;
+  let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);
+  let strOffset = 0;
 
-              if (!(gState instanceof _primitives.Dict)) {
-                throw new _util.FormatError("GState should be a dictionary.");
-              }
+  for (i = 0, ii = platforms.length; i < ii; i++) {
+    const strs = names[i];
 
-              self.setGState({
-                resources,
-                gState,
-                operatorList,
-                cacheKey: name,
-                task,
-                stateManager,
-                localGStateCache,
-                localColorSpaceCache
-              }).then(resolveGState, rejectGState);
-            }).catch(function (reason) {
-              if (reason instanceof _util.AbortException) {
-                return;
-              }
+    for (j = 0, jj = strs.length; j < jj; j++) {
+      str = strs[j];
+      const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + 
string16(strOffset);
+      nameTable += nameRecord;
+      strOffset += str.length;
+    }
+  }
 
-              if (self.options.ignoreErrors) {
-                self.handler.send("UnsupportedFeature", {
-                  featureId: _util.UNSUPPORTED_FEATURES.errorExtGState
-                });
-                (0, _util.warn)(`getOperatorList - ignoring ExtGState: "${reason}".`);
-                return;
-              }
+  nameTable += strings.join("") + stringsUnicode.join("");
+  return nameTable;
+}
 
-              throw reason;
-            }));
-            return;
+class Font {
+  constructor(name, file, properties) {
+    this.name = name;
+    this.psName = null;
+    this.mimetype = null;
+    this.disableFontFace = false;
+    this.loadedName = properties.loadedName;
+    this.isType3Font = properties.isType3Font;
+    this.missingFile = false;
+    this.cssFontInfo = properties.cssFontInfo;
+    this._charsCache = Object.create(null);
+    this._glyphCache = Object.create(null);
+    this.isSerifFont = !!(properties.flags & _fonts_utils.FontFlags.Serif);
+    this.isSymbolicFont = !!(properties.flags & _fonts_utils.FontFlags.Symbolic);
+    this.isMonospace = !!(properties.flags & _fonts_utils.FontFlags.FixedPitch);
+    let type = properties.type;
+    let subtype = properties.subtype;
+    this.type = type;
+    this.subtype = subtype;
+    let fallbackName = "sans-serif";
 
-          case _util.OPS.moveTo:
-          case _util.OPS.lineTo:
-          case _util.OPS.curveTo:
-          case _util.OPS.curveTo2:
-          case _util.OPS.curveTo3:
-          case _util.OPS.closePath:
-          case _util.OPS.rectangle:
-            self.buildPath(operatorList, fn, args, parsingText);
-            continue;
+    if (this.isMonospace) {
+      fallbackName = "monospace";
+    } else if (this.isSerifFont) {
+      fallbackName = "serif";
+    }
 
-          case _util.OPS.markPoint:
-          case _util.OPS.markPointProps:
-          case _util.OPS.beginCompat:
-          case _util.OPS.endCompat:
-            continue;
+    this.fallbackName = fallbackName;
+    this.differences = properties.differences;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.composite = properties.composite;
+    this.cMap = properties.cMap;
+    this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS;
+    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
+    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
+    this.lineHeight = this.ascent - this.descent;
+    this.fontMatrix = properties.fontMatrix;
+    this.bbox = properties.bbox;
+    this.defaultEncoding = properties.defaultEncoding;
+    this.toUnicode = properties.toUnicode;
+    this.toFontChar = [];
 
-          case _util.OPS.beginMarkedContentProps:
-            if (!(0, _primitives.isName)(args[0])) {
-              (0, _util.warn)(`Expected name for beginMarkedContentProps arg0=${args[0]}`);
-              continue;
-            }
+    if (properties.type === "Type3") {
+      for (let charCode = 0; charCode < 256; charCode++) {
+        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
+      }
 
-            if (args[0].name === "OC") {
-              next(self.parseMarkedContentProps(args[1], resources).then(data => {
-                operatorList.addOp(_util.OPS.beginMarkedContentProps, ["OC", data]);
-              }).catch(reason => {
-                if (reason instanceof _util.AbortException) {
-                  return;
-                }
+      this.fontType = _util.FontType.TYPE3;
+      return;
+    }
 
-                if (self.options.ignoreErrors) {
-                  self.handler.send("UnsupportedFeature", {
-                    featureId: _util.UNSUPPORTED_FEATURES.errorMarkedContent
-                  });
-                  (0, _util.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`);
-                  return;
-                }
+    this.cidEncoding = properties.cidEncoding;
+    this.vertical = !!properties.vertical;
 
-                throw reason;
-              }));
-              return;
-            }
+    if (this.vertical) {
+      this.vmetrics = properties.vmetrics;
+      this.defaultVMetrics = properties.defaultVMetrics;
+    }
 
-            args = [args[0].name];
-            break;
+    if (!file || file.isEmpty) {
+      if (file) {
+        (0, _util.warn)('Font file is empty in "' + name + '" (' + this.loadedName + ")");
+      }
 
-          case _util.OPS.beginMarkedContent:
-          case _util.OPS.endMarkedContent:
-          default:
-            if (args !== null) {
-              for (i = 0, ii = args.length; i < ii; i++) {
-                if (args[i] instanceof _primitives.Dict) {
-                  break;
-                }
-              }
+      this.fallbackToSystemFont(properties);
+      return;
+    }
 
-              if (i < ii) {
-                (0, _util.warn)("getOperatorList - ignoring operator: " + fn);
-                continue;
-              }
-            }
+    [type, subtype] = getFontFileType(file, properties);
 
-        }
+    if (type !== this.type || subtype !== this.subtype) {
+      (0, _util.info)("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but 
found: ${type}/${subtype}.`);
+    }
 
-        operatorList.addOp(fn, args);
-      }
+    let data;
 
-      if (stop) {
-        next(deferred);
-        return;
-      }
+    try {
+      switch (type) {
+        case "MMType1":
+          (0, _util.info)("MMType1 font (" + name + "), falling back to Type1.");
 
-      closePendingRestoreOPS();
-      resolve();
-    }).catch(reason => {
-      if (reason instanceof _util.AbortException) {
-        return;
-      }
+        case "Type1":
+        case "CIDFontType0":
+          this.mimetype = "font/opentype";
+          const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new _cff_font.CFFFont(file, 
properties) : new _type1_font.Type1Font(name, file, properties);
+          adjustWidths(properties);
+          data = this.convert(name, cff, properties);
+          break;
 
-      if (this.options.ignoreErrors) {
-        this.handler.send("UnsupportedFeature", {
-          featureId: _util.UNSUPPORTED_FEATURES.errorOperatorList
-        });
-        (0, _util.warn)(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
-        closePendingRestoreOPS();
-        return;
+        case "OpenType":
+        case "TrueType":
+        case "CIDFontType2":
+          this.mimetype = "font/opentype";
+          data = this.checkAndRepair(name, file, properties);
+
+          if (this.isOpenType) {
+            adjustWidths(properties);
+            type = "OpenType";
+          }
+
+          break;
+
+        default:
+          throw new _util.FormatError(`Font ${type} is not supported`);
       }
+    } catch (e) {
+      (0, _util.warn)(e);
+      this.fallbackToSystemFont(properties);
+      return;
+    }
 
-      throw reason;
-    });
+    amendFallbackToUnicode(properties);
+    this.data = data;
+    this.fontType = (0, _fonts_utils.getFontType)(type, subtype, properties.isStandardFont);
+    this.fontMatrix = properties.fontMatrix;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.toUnicode = properties.toUnicode;
+    this.seacMap = properties.seacMap;
   }
 
-  getTextContent({
-    stream,
-    task,
-    resources,
-    stateManager = null,
-    normalizeWhitespace = false,
-    combineTextItems = false,
-    sink,
-    seenStyles = Object.create(null)
-  }) {
-    resources = resources || _primitives.Dict.empty;
-    stateManager = stateManager || new StateManager(new TextState());
-    var WhitespaceRegexp = /\s/g;
-    var textContent = {
-      items: [],
-      styles: Object.create(null)
-    };
-    var textContentItem = {
-      initialized: false,
-      str: [],
-      width: 0,
-      height: 0,
-      vertical: false,
-      lastAdvanceWidth: 0,
-      lastAdvanceHeight: 0,
-      textAdvanceScale: 0,
-      spaceWidth: 0,
-      fakeSpaceMin: Infinity,
-      fakeMultiSpaceMin: Infinity,
-      fakeMultiSpaceMax: -0,
-      textRunBreakAllowed: false,
-      transform: null,
-      fontName: null
-    };
-    var SPACE_FACTOR = 0.3;
-    var MULTI_SPACE_FACTOR = 1.5;
-    var MULTI_SPACE_FACTOR_MAX = 4;
-    var self = this;
-    var xref = this.xref;
-    var xobjs = null;
-    const emptyXObjectCache = new _image_utils.LocalImageCache();
-    const emptyGStateCache = new _image_utils.LocalGStateCache();
-    var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
-    var textState;
+  get renderer() {
+    const renderer = _font_renderer.FontRendererFactory.create(this, _fonts_utils.SEAC_ANALYSIS_ENABLED);
 
-    function ensureTextContentItem() {
-      if (textContentItem.initialized) {
-        return textContentItem;
-      }
+    return (0, _util.shadow)(this, "renderer", renderer);
+  }
 
-      var font = textState.font;
+  exportData(extraProperties = false) {
+    const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, 
...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES;
+    const data = Object.create(null);
+    let property, value;
 
-      if (!(font.loadedName in seenStyles)) {
-        seenStyles[font.loadedName] = true;
-        textContent.styles[font.loadedName] = {
-          fontFamily: font.fallbackName,
-          ascent: font.ascent,
-          descent: font.descent,
-          vertical: font.vertical
-        };
+    for (property of exportDataProperties) {
+      value = this[property];
+
+      if (value !== undefined) {
+        data[property] = value;
       }
+    }
 
-      textContentItem.fontName = font.loadedName;
-      var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];
+    return data;
+  }
 
-      if (font.isType3Font && textState.fontSize <= 1 && !(0, _util.isArrayEqual)(textState.fontMatrix, 
_util.FONT_IDENTITY_MATRIX)) {
-        const glyphHeight = font.bbox[3] - font.bbox[1];
+  fallbackToSystemFont(properties) {
+    this.missingFile = true;
+    const name = this.name;
+    const type = this.type;
+    const subtype = this.subtype;
+    let fontName = (0, _fonts_utils.normalizeFontName)(name);
+    const stdFontMap = (0, _standard_fonts.getStdFontMap)(),
+          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();
+    const isStandardFont = !!stdFontMap[fontName];
+    const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
+    fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+    this.bold = fontName.search(/bold/gi) !== -1;
+    this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;
+    this.black = name.search(/Black/g) !== -1;
+    const isNarrow = name.search(/Narrow/g) !== -1;
+    this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0;
 
-        if (glyphHeight > 0) {
-          tsm[3] *= glyphHeight * textState.fontMatrix[3];
-        }
+    if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && 
this.cidEncoding.startsWith("Identity-")) {
+      const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)(),
+            cidToGidMap = properties.cidToGidMap;
+      const map = [];
+
+      for (const charCode in GlyphMapForStandardFonts) {
+        map[+charCode] = GlyphMapForStandardFonts[charCode];
       }
 
-      var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));
+      if (/Arial-?Black/i.test(name)) {
+        const SupplementalGlyphMapForArialBlack = (0, 
_standard_fonts.getSupplementalGlyphMapForArialBlack)();
 
-      textContentItem.transform = trm;
+        for (const charCode in SupplementalGlyphMapForArialBlack) {
+          map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];
+        }
+      } else if (/Calibri/i.test(name)) {
+        const SupplementalGlyphMapForCalibri = (0, _standard_fonts.getSupplementalGlyphMapForCalibri)();
 
-      if (!font.vertical) {
-        textContentItem.width = 0;
-        textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
-        textContentItem.vertical = false;
-      } else {
-        textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
-        textContentItem.height = 0;
-        textContentItem.vertical = true;
+        for (const charCode in SupplementalGlyphMapForCalibri) {
+          map[+charCode] = SupplementalGlyphMapForCalibri[charCode];
+        }
       }
 
-      var a = textState.textLineMatrix[0];
-      var b = textState.textLineMatrix[1];
-      var scaleLineX = Math.sqrt(a * a + b * b);
-      a = textState.ctm[0];
-      b = textState.ctm[1];
-      var scaleCtmX = Math.sqrt(a * a + b * b);
-      textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
-      textContentItem.lastAdvanceWidth = 0;
-      textContentItem.lastAdvanceHeight = 0;
-      var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;
+      if (cidToGidMap) {
+        for (const charCode in map) {
+          const cid = map[charCode];
 
-      if (spaceWidth) {
-        textContentItem.spaceWidth = spaceWidth;
-        textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;
-        textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;
-        textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;
-        textContentItem.textRunBreakAllowed = !font.isMonospace;
-      } else {
-        textContentItem.spaceWidth = 0;
-        textContentItem.fakeSpaceMin = Infinity;
-        textContentItem.fakeMultiSpaceMin = Infinity;
-        textContentItem.fakeMultiSpaceMax = 0;
-        textContentItem.textRunBreakAllowed = false;
+          if (cidToGidMap[cid] !== undefined) {
+            map[+charCode] = cidToGidMap[cid];
+          }
+        }
       }
 
-      textContentItem.initialized = true;
-      return textContentItem;
-    }
-
-    function replaceWhitespace(str) {
-      var i = 0,
-          ii = str.length,
-          code;
+      const isIdentityUnicode = this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap;
 
-      while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7f) {
-        i++;
+      if (!isIdentityUnicode) {
+        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+          map[+charCode] = unicodeCharCode;
+        });
       }
 
-      return i < ii ? str.replace(WhitespaceRegexp, " ") : str;
-    }
+      this.toFontChar = map;
+      this.toUnicode = new _to_unicode_map.ToUnicodeMap(map);
+    } else if (/Symbol/i.test(fontName)) {
+      this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), 
this.differences);
+    } else if (/Dingbats/i.test(fontName)) {
+      if (/Wingdings/i.test(name)) {
+        (0, _util.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats.");
+      }
 
-    function runBidiTransform(textChunk) {
-      var str = textChunk.str.join("");
-      var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);
-      return {
-        str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,
-        dir: bidiResult.dir,
-        width: textChunk.width,
-        height: textChunk.height,
-        transform: textChunk.transform,
-        fontName: textChunk.fontName
-      };
-    }
+      this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, 
_glyphlist.getDingbatsGlyphsUnicode)(), this.differences);
+    } else if (isStandardFont) {
+      this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), 
this.differences);
+    } else {
+      const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+      const map = [];
+      this.toUnicode.forEach((charCode, unicodeCharCode) => {
+        if (!this.composite) {
+          const glyphName = this.differences[charCode] || this.defaultEncoding[charCode];
+          const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
+
+          if (unicode !== -1) {
+            unicodeCharCode = unicode;
+          }
+        }
 
-    function handleSetFont(fontName, fontRef) {
-      return self.loadFont(fontName, fontRef, resources).then(function (translated) {
-        textState.font = translated.font;
-        textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+        map[+charCode] = unicodeCharCode;
       });
-    }
 
-    function buildTextContentItem(chars) {
-      var font = textState.font;
-      var textChunk = ensureTextContentItem();
-      var width = 0;
-      var height = 0;
-      var glyphs = font.charsToGlyphs(chars);
+      if (this.composite && this.toUnicode instanceof _to_unicode_map.IdentityToUnicodeMap) {
+        if (/Verdana/i.test(name)) {
+          const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();
 
-      for (var i = 0; i < glyphs.length; i++) {
-        var glyph = glyphs[i];
-        var glyphWidth = null;
-
-        if (font.vertical && glyph.vmetric) {
-          glyphWidth = glyph.vmetric[0];
-        } else {
-          glyphWidth = glyph.width;
+          for (const charCode in GlyphMapForStandardFonts) {
+            map[+charCode] = GlyphMapForStandardFonts[charCode];
+          }
         }
+      }
 
-        var glyphUnicode = glyph.unicode;
-        var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();
-
-        if (NormalizedUnicodes[glyphUnicode] !== undefined) {
-          glyphUnicode = NormalizedUnicodes[glyphUnicode];
-        }
+      this.toFontChar = map;
+    }
 
-        glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);
-        var charSpacing = textState.charSpacing;
+    amendFallbackToUnicode(properties);
+    this.loadedName = fontName.split("-")[0];
+    this.fontType = (0, _fonts_utils.getFontType)(type, subtype, properties.isStandardFont);
+  }
 
-        if (glyph.isSpace) {
-          var wordSpacing = textState.wordSpacing;
-          charSpacing += wordSpacing;
+  checkAndRepair(name, font, properties) {
+    const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", 
"fpgm", "prep", "cvt ", "CFF "];
 
-          if (wordSpacing > 0) {
-            addFakeSpaces(wordSpacing, textChunk.str);
-          }
-        }
+    function readTables(file, numTables) {
+      const tables = Object.create(null);
+      tables["OS/2"] = null;
+      tables.cmap = null;
+      tables.head = null;
+      tables.hhea = null;
+      tables.hmtx = null;
+      tables.maxp = null;
+      tables.name = null;
+      tables.post = null;
 
-        var tx = 0;
-        var ty = 0;
+      for (let i = 0; i < numTables; i++) {
+        const table = readTableEntry(file);
 
-        if (!font.vertical) {
-          var w0 = glyphWidth * textState.fontMatrix[0];
-          tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;
-          width += tx;
-        } else {
-          var w1 = glyphWidth * textState.fontMatrix[0];
-          ty = w1 * textState.fontSize + charSpacing;
-          height += ty;
+        if (!VALID_TABLES.includes(table.tag)) {
+          continue;
         }
 
-        textState.translateTextMatrix(tx, ty);
-        textChunk.str.push(glyphUnicode);
-      }
+        if (table.length === 0) {
+          continue;
+        }
 
-      if (!font.vertical) {
-        textChunk.lastAdvanceWidth = width;
-        textChunk.width += width;
-      } else {
-        textChunk.lastAdvanceHeight = height;
-        textChunk.height += Math.abs(height);
+        tables[table.tag] = table;
       }
 
-      return textChunk;
+      return tables;
     }
 
-    function addFakeSpaces(width, strBuf) {
-      if (width < textContentItem.fakeSpaceMin) {
-        return;
-      }
+    function readTableEntry(file) {
+      const tag = file.getString(4);
+      const checksum = file.getInt32() >>> 0;
+      const offset = file.getInt32() >>> 0;
+      const length = file.getInt32() >>> 0;
+      const previousPosition = file.pos;
+      file.pos = file.start ? file.start : 0;
+      file.skip(offset);
+      const data = file.getBytes(length);
+      file.pos = previousPosition;
 
-      if (width < textContentItem.fakeMultiSpaceMin) {
-        strBuf.push(" ");
-        return;
+      if (tag === "head") {
+        data[8] = data[9] = data[10] = data[11] = 0;
+        data[17] |= 0x20;
       }
 
-      var fakeSpaces = Math.round(width / textContentItem.spaceWidth);
+      return {
+        tag,
+        checksum,
+        length,
+        offset,
+        data
+      };
+    }
 
-      while (fakeSpaces-- > 0) {
-        strBuf.push(" ");
-      }
+    function readOpenTypeHeader(ttf) {
+      return {
+        version: ttf.getString(4),
+        numTables: ttf.getUint16(),
+        searchRange: ttf.getUint16(),
+        entrySelector: ttf.getUint16(),
+        rangeShift: ttf.getUint16()
+      };
     }
 
-    function flushTextContentItem() {
-      if (!textContentItem.initialized) {
-        return;
-      }
+    function readTrueTypeCollectionHeader(ttc) {
+      const ttcTag = ttc.getString(4);
+      (0, _util.assert)(ttcTag === "ttcf", "Must be a TrueType Collection font.");
+      const majorVersion = ttc.getUint16();
+      const minorVersion = ttc.getUint16();
+      const numFonts = ttc.getInt32() >>> 0;
+      const offsetTable = [];
 
-      if (!textContentItem.vertical) {
-        textContentItem.width *= textContentItem.textAdvanceScale;
-      } else {
-        textContentItem.height *= textContentItem.textAdvanceScale;
+      for (let i = 0; i < numFonts; i++) {
+        offsetTable.push(ttc.getInt32() >>> 0);
       }
 
-      textContent.items.push(runBidiTransform(textContentItem));
-      textContentItem.initialized = false;
-      textContentItem.str.length = 0;
-    }
+      const header = {
+        ttcTag,
+        majorVersion,
+        minorVersion,
+        numFonts,
+        offsetTable
+      };
 
-    function enqueueChunk() {
-      const length = textContent.items.length;
+      switch (majorVersion) {
+        case 1:
+          return header;
 
-      if (length > 0) {
-        sink.enqueue(textContent, length);
-        textContent.items = [];
-        textContent.styles = Object.create(null);
+        case 2:
+          header.dsigTag = ttc.getInt32() >>> 0;
+          header.dsigLength = ttc.getInt32() >>> 0;
+          header.dsigOffset = ttc.getInt32() >>> 0;
+          return header;
       }
-    }
 
-    var timeSlotManager = new TimeSlotManager();
-    return new Promise(function promiseBody(resolve, reject) {
-      const next = function (promise) {
-        enqueueChunk();
-        Promise.all([promise, sink.ready]).then(function () {
-          try {
-            promiseBody(resolve, reject);
-          } catch (ex) {
-            reject(ex);
-          }
-        }, reject);
-      };
+      throw new _util.FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`);
+    }
 
-      task.ensureNotTerminated();
-      timeSlotManager.reset();
-      var stop,
-          operation = {},
-          args = [];
+    function readTrueTypeCollectionData(ttc, fontName) {
+      const {
+        numFonts,
+        offsetTable
+      } = readTrueTypeCollectionHeader(ttc);
+      const fontNameParts = fontName.split("+");
+      let fallbackData;
 
-      while (!(stop = timeSlotManager.check())) {
-        args.length = 0;
-        operation.args = args;
+      for (let i = 0; i < numFonts; i++) {
+        ttc.pos = (ttc.start || 0) + offsetTable[i];
+        const potentialHeader = readOpenTypeHeader(ttc);
+        const potentialTables = readTables(ttc, potentialHeader.numTables);
 
-        if (!preprocessor.read(operation)) {
-          break;
+        if (!potentialTables.name) {
+          throw new _util.FormatError('TrueType Collection font must contain a "name" table.');
         }
 
-        textState = stateManager.state;
-        var fn = operation.fn;
-        args = operation.args;
-        var advance, diff;
+        const nameTable = readNameTable(potentialTables.name);
 
-        switch (fn | 0) {
-          case _util.OPS.setFont:
-            var fontNameArg = args[0].name,
-                fontSizeArg = args[1];
+        for (let j = 0, jj = nameTable.length; j < jj; j++) {
+          for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
+            const nameEntry = nameTable[j][k] && nameTable[j][k].replace(/\s/g, "");
 
-            if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
-              break;
+            if (!nameEntry) {
+              continue;
             }
 
-            flushTextContentItem();
-            textState.fontName = fontNameArg;
-            textState.fontSize = fontSizeArg;
-            next(handleSetFont(fontNameArg, null));
-            return;
-
-          case _util.OPS.setTextRise:
-            flushTextContentItem();
-            textState.textRise = args[0];
-            break;
-
-          case _util.OPS.setHScale:
-            flushTextContentItem();
-            textState.textHScale = args[0] / 100;
-            break;
+            if (nameEntry === fontName) {
+              return {
+                header: potentialHeader,
+                tables: potentialTables
+              };
+            }
 
-          case _util.OPS.setLeading:
-            flushTextContentItem();
-            textState.leading = args[0];
-            break;
+            if (fontNameParts.length < 2) {
+              continue;
+            }
 
-          case _util.OPS.moveText:
-            var isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 
0;
-            advance = args[0] - args[1];
-
-            if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance 
<= textContentItem.fakeMultiSpaceMax) {
-              textState.translateTextLineMatrix(args[0], args[1]);
-              textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;
-              textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;
-              diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - 
textContentItem.lastAdvanceHeight);
-              addFakeSpaces(diff, textContentItem.str);
-              break;
+            for (const part of fontNameParts) {
+              if (nameEntry === part) {
+                fallbackData = {
+                  name: part,
+                  header: potentialHeader,
+                  tables: potentialTables
+                };
+              }
             }
+          }
+        }
+      }
 
-            flushTextContentItem();
-            textState.translateTextLineMatrix(args[0], args[1]);
-            textState.textMatrix = textState.textLineMatrix.slice();
-            break;
+      if (fallbackData) {
+        (0, _util.warn)(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to 
"${fallbackData.name}" font instead.`);
+        return {
+          header: fallbackData.header,
+          tables: fallbackData.tables
+        };
+      }
 
-          case _util.OPS.setLeadingMoveText:
-            flushTextContentItem();
-            textState.leading = -args[1];
-            textState.translateTextLineMatrix(args[0], args[1]);
-            textState.textMatrix = textState.textLineMatrix.slice();
-            break;
+      throw new _util.FormatError(`TrueType Collection does not contain "${fontName}" font.`);
+    }
 
-          case _util.OPS.nextLine:
-            flushTextContentItem();
-            textState.carriageReturn();
-            break;
+    function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {
+      if (!cmap) {
+        (0, _util.warn)("No cmap table available.");
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
 
-          case _util.OPS.setTextMatrix:
-            advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], 
args[5]);
-
-            if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && 
advance.value <= textContentItem.fakeMultiSpaceMax) {
-              textState.translateTextLineMatrix(advance.width, advance.height);
-              textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;
-              textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;
-              diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - 
textContentItem.lastAdvanceHeight);
-              addFakeSpaces(diff, textContentItem.str);
-              break;
-            }
+      let segment;
+      let start = (file.start ? file.start : 0) + cmap.offset;
+      file.pos = start;
+      file.skip(2);
+      const numTables = file.getUint16();
+      let potentialTable;
+      let canBreak = false;
 
-            flushTextContentItem();
-            textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
-            textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
-            break;
+      for (let i = 0; i < numTables; i++) {
+        const platformId = file.getUint16();
+        const encodingId = file.getUint16();
+        const offset = file.getInt32() >>> 0;
+        let useTable = false;
 
-          case _util.OPS.setCharSpacing:
-            textState.charSpacing = args[0];
-            break;
+        if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === 
encodingId) {
+          continue;
+        }
 
-          case _util.OPS.setWordSpacing:
-            textState.wordSpacing = args[0];
-            break;
+        if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) {
+          useTable = true;
+        } else if (platformId === 1 && encodingId === 0) {
+          useTable = true;
+        } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
+          useTable = true;
 
-          case _util.OPS.beginText:
-            flushTextContentItem();
-            textState.textMatrix = _util.IDENTITY_MATRIX.slice();
-            textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();
-            break;
+          if (!isSymbolicFont) {
+            canBreak = true;
+          }
+        } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
+          useTable = true;
+          let correctlySorted = true;
 
-          case _util.OPS.showSpacedText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+          if (i < numTables - 1) {
+            const nextBytes = file.peekBytes(2),
+                  nextPlatformId = int16(nextBytes[0], nextBytes[1]);
 
-            var items = args[0];
-            var offset;
+            if (nextPlatformId < platformId) {
+              correctlySorted = false;
+            }
+          }
 
-            for (var j = 0, jj = items.length; j < jj; j++) {
-              if (typeof items[j] === "string") {
-                buildTextContentItem(items[j]);
-              } else if ((0, _util.isNum)(items[j])) {
-                ensureTextContentItem();
-                advance = items[j] * textState.fontSize / 1000;
-                var breakTextRun = false;
+          if (correctlySorted) {
+            canBreak = true;
+          }
+        }
 
-                if (textState.font.vertical) {
-                  offset = advance;
-                  textState.translateTextMatrix(0, offset);
-                  breakTextRun = textContentItem.textRunBreakAllowed && advance > 
textContentItem.fakeMultiSpaceMax;
+        if (useTable) {
+          potentialTable = {
+            platformId,
+            encodingId,
+            offset
+          };
+        }
 
-                  if (!breakTextRun) {
-                    textContentItem.height += offset;
-                  }
-                } else {
-                  advance = -advance;
-                  offset = advance * textState.textHScale;
-                  textState.translateTextMatrix(offset, 0);
-                  breakTextRun = textContentItem.textRunBreakAllowed && advance > 
textContentItem.fakeMultiSpaceMax;
+        if (canBreak) {
+          break;
+        }
+      }
 
-                  if (!breakTextRun) {
-                    textContentItem.width += offset;
-                  }
-                }
+      if (potentialTable) {
+        file.pos = start + potentialTable.offset;
+      }
 
-                if (breakTextRun) {
-                  flushTextContentItem();
-                } else if (advance > 0) {
-                  addFakeSpaces(advance, textContentItem.str);
-                }
-              }
-            }
+      if (!potentialTable || file.peekByte() === -1) {
+        (0, _util.warn)("Could not find a preferred cmap table.");
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
 
-            break;
+      const format = file.getUint16();
+      file.skip(2 + 2);
+      let hasShortCmap = false;
+      const mappings = [];
+      let j, glyphId;
 
-          case _util.OPS.showText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+      if (format === 0) {
+        for (j = 0; j < 256; j++) {
+          const index = file.getByte();
 
-            buildTextContentItem(args[0]);
-            break;
+          if (!index) {
+            continue;
+          }
 
-          case _util.OPS.nextLineShowText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+          mappings.push({
+            charCode: j,
+            glyphId: index
+          });
+        }
 
-            flushTextContentItem();
-            textState.carriageReturn();
-            buildTextContentItem(args[0]);
-            break;
+        hasShortCmap = true;
+      } else if (format === 4) {
+        const segCount = file.getUint16() >> 1;
+        file.skip(6);
+        const segments = [];
+        let segIndex;
 
-          case _util.OPS.nextLineSetSpacingShowText:
-            if (!stateManager.state.font) {
-              self.ensureStateFont(stateManager.state);
-              continue;
-            }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments.push({
+            end: file.getUint16()
+          });
+        }
 
-            flushTextContentItem();
-            textState.wordSpacing = args[0];
-            textState.charSpacing = args[1];
-            textState.carriageReturn();
-            buildTextContentItem(args[2]);
-            break;
+        file.skip(2);
 
-          case _util.OPS.paintXObject:
-            flushTextContentItem();
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments[segIndex].start = file.getUint16();
+        }
 
-            if (!xobjs) {
-              xobjs = resources.get("XObject") || _primitives.Dict.empty;
-            }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments[segIndex].delta = file.getUint16();
+        }
 
-            var name = args[0].name;
+        let offsetsCount = 0,
+            offsetIndex;
 
-            if (name && emptyXObjectCache.getByName(name)) {
-              break;
-            }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segment = segments[segIndex];
+          const rangeOffset = file.getUint16();
 
-            next(new Promise(function (resolveXObject, rejectXObject) {
-              if (!name) {
-                throw new _util.FormatError("XObject must be referred to by name.");
-              }
+          if (!rangeOffset) {
+            segment.offsetIndex = -1;
+            continue;
+          }
 
-              let xobj = xobjs.getRaw(name);
+          offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+          segment.offsetIndex = offsetIndex;
+          offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
+        }
 
-              if (xobj instanceof _primitives.Ref) {
-                if (emptyXObjectCache.getByRef(xobj)) {
-                  resolveXObject();
-                  return;
-                }
+        const offsets = [];
 
-                xobj = xref.fetch(xobj);
-              }
+        for (j = 0; j < offsetsCount; j++) {
+          offsets.push(file.getUint16());
+        }
 
-              if (!(0, _primitives.isStream)(xobj)) {
-                throw new _util.FormatError("XObject should be a stream");
-              }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segment = segments[segIndex];
+          start = segment.start;
+          const end = segment.end;
+          const delta = segment.delta;
+          offsetIndex = segment.offsetIndex;
 
-              const type = xobj.dict.get("Subtype");
+          for (j = start; j <= end; j++) {
+            if (j === 0xffff) {
+              continue;
+            }
 
-              if (!(0, _primitives.isName)(type)) {
-                throw new _util.FormatError("XObject should have a Name subtype");
-              }
+            glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
+            glyphId = glyphId + delta & 0xffff;
+            mappings.push({
+              charCode: j,
+              glyphId
+            });
+          }
+        }
+      } else if (format === 6) {
+        const firstCode = file.getUint16();
+        const entryCount = file.getUint16();
 
-              if (type.name !== "Form") {
-                emptyXObjectCache.set(name, xobj.dict.objId, true);
-                resolveXObject();
-                return;
-              }
+        for (j = 0; j < entryCount; j++) {
+          glyphId = file.getUint16();
+          const charCode = firstCode + j;
+          mappings.push({
+            charCode,
+            glyphId
+          });
+        }
+      } else {
+        (0, _util.warn)("cmap table has unsupported format: " + format);
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
 
-              const currentState = stateManager.state.clone();
-              const xObjStateManager = new StateManager(currentState);
-              const matrix = xobj.dict.getArray("Matrix");
+      mappings.sort(function (a, b) {
+        return a.charCode - b.charCode;
+      });
 
-              if (Array.isArray(matrix) && matrix.length === 6) {
-                xObjStateManager.transform(matrix);
-              }
+      for (let i = 1; i < mappings.length; i++) {
+        if (mappings[i - 1].charCode === mappings[i].charCode) {
+          mappings.splice(i, 1);
+          i--;
+        }
+      }
 
-              enqueueChunk();
-              const sinkWrapper = {
-                enqueueInvoked: false,
+      return {
+        platformId: potentialTable.platformId,
+        encodingId: potentialTable.encodingId,
+        mappings,
+        hasShortCmap
+      };
+    }
 
-                enqueue(chunk, size) {
-                  this.enqueueInvoked = true;
-                  sink.enqueue(chunk, size);
-                },
+    function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) {
+      if (!header) {
+        if (metrics) {
+          metrics.data = null;
+        }
 
-                get desiredSize() {
-                  return sink.desiredSize;
-                },
+        return;
+      }
 
-                get ready() {
-                  return sink.ready;
-                }
+      file.pos = (file.start ? file.start : 0) + header.offset;
+      file.pos += 4;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      const caretOffset = file.getUint16();
+      file.pos += 8;
+      file.pos += 2;
+      let numOfMetrics = file.getUint16();
 
-              };
-              self.getTextContent({
-                stream: xobj,
-                task,
-                resources: xobj.dict.get("Resources") || resources,
-                stateManager: xObjStateManager,
-                normalizeWhitespace,
-                combineTextItems,
-                sink: sinkWrapper,
-                seenStyles
-              }).then(function () {
-                if (!sinkWrapper.enqueueInvoked) {
-                  emptyXObjectCache.set(name, xobj.dict.objId, true);
-                }
+      if (caretOffset !== 0) {
+        const macStyle = int16(headTable.data[44], headTable.data[45]);
 
-                resolveXObject();
-              }, rejectXObject);
-            }).catch(function (reason) {
-              if (reason instanceof _util.AbortException) {
-                return;
-              }
+        if (!(macStyle & 2)) {
+          header.data[22] = 0;
+          header.data[23] = 0;
+        }
+      }
 
-              if (self.options.ignoreErrors) {
-                (0, _util.warn)(`getTextContent - ignoring XObject: "${reason}".`);
-                return;
-              }
+      if (numOfMetrics > numGlyphs) {
+        (0, _util.info)(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs 
(${numGlyphs}).`);
+        numOfMetrics = numGlyphs;
+        header.data[34] = (numOfMetrics & 0xff00) >> 8;
+        header.data[35] = numOfMetrics & 0x00ff;
+      }
 
-              throw reason;
-            }));
-            return;
+      const numOfSidebearings = numGlyphs - numOfMetrics;
+      const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
 
-          case _util.OPS.setGState:
-            name = args[0].name;
+      if (numMissing > 0) {
+        const entries = new Uint8Array(metrics.length + numMissing * 2);
+        entries.set(metrics.data);
 
-            if (name && emptyGStateCache.getByName(name)) {
-              break;
-            }
+        if (dupFirstEntry) {
+          entries[metrics.length] = metrics.data[2];
+          entries[metrics.length + 1] = metrics.data[3];
+        }
 
-            next(new Promise(function (resolveGState, rejectGState) {
-              if (!name) {
-                throw new _util.FormatError("GState must be referred to by name.");
-              }
+        metrics.data = entries;
+      }
+    }
 
-              const extGState = resources.get("ExtGState");
+    function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
+      const glyphProfile = {
+        length: 0,
+        sizeOfInstructions: 0
+      };
 
-              if (!(extGState instanceof _primitives.Dict)) {
-                throw new _util.FormatError("ExtGState should be a dictionary.");
-              }
+      if (sourceEnd - sourceStart <= 12) {
+        return glyphProfile;
+      }
 
-              const gState = extGState.get(name);
+      const glyf = source.subarray(sourceStart, sourceEnd);
+      let contoursCount = signedInt16(glyf[0], glyf[1]);
 
-              if (!(gState instanceof _primitives.Dict)) {
-                throw new _util.FormatError("GState should be a dictionary.");
-              }
+      if (contoursCount < 0) {
+        contoursCount = -1;
+        writeSignedInt16(glyf, 0, contoursCount);
+        dest.set(glyf, destStart);
+        glyphProfile.length = glyf.length;
+        return glyphProfile;
+      }
 
-              const gStateFont = gState.get("Font");
+      let i,
+          j = 10,
+          flagsCount = 0;
 
-              if (!gStateFont) {
-                emptyGStateCache.set(name, gState.objId, true);
-                resolveGState();
-                return;
-              }
+      for (i = 0; i < contoursCount; i++) {
+        const endPoint = glyf[j] << 8 | glyf[j + 1];
+        flagsCount = endPoint + 1;
+        j += 2;
+      }
 
-              flushTextContentItem();
-              textState.fontName = null;
-              textState.fontSize = gStateFont[1];
-              handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState);
-            }).catch(function (reason) {
-              if (reason instanceof _util.AbortException) {
-                return;
-              }
+      const instructionsStart = j;
+      const instructionsLength = glyf[j] << 8 | glyf[j + 1];
+      glyphProfile.sizeOfInstructions = instructionsLength;
+      j += 2 + instructionsLength;
+      const instructionsEnd = j;
+      let coordinatesLength = 0;
 
-              if (self.options.ignoreErrors) {
-                (0, _util.warn)(`getTextContent - ignoring ExtGState: "${reason}".`);
-                return;
-              }
+      for (i = 0; i < flagsCount; i++) {
+        const flag = glyf[j++];
 
-              throw reason;
-            }));
-            return;
+        if (flag & 0xc0) {
+          glyf[j - 1] = flag & 0x3f;
         }
 
-        if (textContent.items.length >= sink.desiredSize) {
-          stop = true;
-          break;
+        let xLength = 2;
+
+        if (flag & 2) {
+          xLength = 1;
+        } else if (flag & 16) {
+          xLength = 0;
+        }
+
+        let yLength = 2;
+
+        if (flag & 4) {
+          yLength = 1;
+        } else if (flag & 32) {
+          yLength = 0;
+        }
+
+        const xyLength = xLength + yLength;
+        coordinatesLength += xyLength;
+
+        if (flag & 8) {
+          const repeat = glyf[j++];
+          i += repeat;
+          coordinatesLength += repeat * xyLength;
         }
       }
 
-      if (stop) {
-        next(deferred);
-        return;
+      if (coordinatesLength === 0) {
+        return glyphProfile;
       }
 
-      flushTextContentItem();
-      enqueueChunk();
-      resolve();
-    }).catch(reason => {
-      if (reason instanceof _util.AbortException) {
-        return;
+      let glyphDataLength = j + coordinatesLength;
+
+      if (glyphDataLength > glyf.length) {
+        return glyphProfile;
       }
 
-      if (this.options.ignoreErrors) {
-        (0, _util.warn)(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
-        flushTextContentItem();
-        enqueueChunk();
-        return;
+      if (!hintsValid && instructionsLength > 0) {
+        dest.set(glyf.subarray(0, instructionsStart), destStart);
+        dest.set([0, 0], destStart + instructionsStart);
+        dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
+        glyphDataLength -= instructionsLength;
+
+        if (glyf.length - glyphDataLength > 3) {
+          glyphDataLength = glyphDataLength + 3 & ~3;
+        }
+
+        glyphProfile.length = glyphDataLength;
+        return glyphProfile;
       }
 
-      throw reason;
-    });
-  }
+      if (glyf.length - glyphDataLength > 3) {
+        glyphDataLength = glyphDataLength + 3 & ~3;
+        dest.set(glyf.subarray(0, glyphDataLength), destStart);
+        glyphProfile.length = glyphDataLength;
+        return glyphProfile;
+      }
 
-  extractDataStructures(dict, baseDict, properties) {
-    const xref = this.xref;
-    let cidToGidBytes;
-    var toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode");
-    var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);
+      dest.set(glyf, destStart);
+      glyphProfile.length = glyf.length;
+      return glyphProfile;
+    }
 
-    if (properties.composite) {
-      var cidSystemInfo = dict.get("CIDSystemInfo");
+    function sanitizeHead(head, numGlyphs, locaLength) {
+      const data = head.data;
+      const version = int32(data[0], data[1], data[2], data[3]);
 
-      if ((0, _primitives.isDict)(cidSystemInfo)) {
-        properties.cidSystemInfo = {
-          registry: (0, _util.stringToPDFString)(cidSystemInfo.get("Registry")),
-          ordering: (0, _util.stringToPDFString)(cidSystemInfo.get("Ordering")),
-          supplement: cidSystemInfo.get("Supplement")
-        };
+      if (version >> 16 !== 1) {
+        (0, _util.info)("Attempting to fix invalid version in head table: " + version);
+        data[0] = 0;
+        data[1] = 1;
+        data[2] = 0;
+        data[3] = 0;
       }
 
-      var cidToGidMap = dict.get("CIDToGIDMap");
+      const indexToLocFormat = int16(data[50], data[51]);
 
-      if ((0, _primitives.isStream)(cidToGidMap)) {
-        cidToGidBytes = cidToGidMap.getBytes();
+      if (indexToLocFormat < 0 || indexToLocFormat > 1) {
+        (0, _util.info)("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat);
+        const numGlyphsPlusOne = numGlyphs + 1;
+
+        if (locaLength === numGlyphsPlusOne << 1) {
+          data[50] = 0;
+          data[51] = 0;
+        } else if (locaLength === numGlyphsPlusOne << 2) {
+          data[50] = 0;
+          data[51] = 1;
+        } else {
+          throw new _util.FormatError("Could not fix indexToLocFormat: " + indexToLocFormat);
+        }
       }
     }
 
-    var differences = [];
-    var baseEncodingName = null;
-    var encoding;
+    function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, 
maxSizeOfInstructions) {
+      let itemSize, itemDecode, itemEncode;
 
-    if (dict.has("Encoding")) {
-      encoding = dict.get("Encoding");
+      if (isGlyphLocationsLong) {
+        itemSize = 4;
 
-      if ((0, _primitives.isDict)(encoding)) {
-        baseEncodingName = encoding.get("BaseEncoding");
-        baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;
+        itemDecode = function fontItemDecodeLong(data, offset) {
+          return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+        };
 
-        if (encoding.has("Differences")) {
-          var diffEncoding = encoding.get("Differences");
-          var index = 0;
+        itemEncode = function fontItemEncodeLong(data, offset, value) {
+          data[offset] = value >>> 24 & 0xff;
+          data[offset + 1] = value >> 16 & 0xff;
+          data[offset + 2] = value >> 8 & 0xff;
+          data[offset + 3] = value & 0xff;
+        };
+      } else {
+        itemSize = 2;
 
-          for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
-            var data = xref.fetchIfRef(diffEncoding[j]);
+        itemDecode = function fontItemDecode(data, offset) {
+          return data[offset] << 9 | data[offset + 1] << 1;
+        };
 
-            if ((0, _util.isNum)(data)) {
-              index = data;
-            } else if ((0, _primitives.isName)(data)) {
-              differences[index++] = data.name;
-            } else {
-              throw new _util.FormatError(`Invalid entry in 'Differences' array: ${data}`);
-            }
-          }
-        }
-      } else if ((0, _primitives.isName)(encoding)) {
-        baseEncodingName = encoding.name;
-      } else {
-        throw new _util.FormatError("Encoding is not a Name nor a Dict");
+        itemEncode = function fontItemEncode(data, offset, value) {
+          data[offset] = value >> 9 & 0xff;
+          data[offset + 1] = value >> 1 & 0xff;
+        };
       }
 
-      if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && 
baseEncodingName !== "WinAnsiEncoding") {
-        baseEncodingName = null;
-      }
-    }
+      const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
+      const locaDataSize = itemSize * (1 + numGlyphsOut);
+      const locaData = new Uint8Array(locaDataSize);
+      locaData.set(loca.data.subarray(0, locaDataSize));
+      loca.data = locaData;
+      const oldGlyfData = glyf.data;
+      const oldGlyfDataLength = oldGlyfData.length;
+      const newGlyfData = new Uint8Array(oldGlyfDataLength);
+      let i, j;
+      const locaEntries = [];
 
-    if (baseEncodingName) {
-      properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();
-    } else {
-      var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);
-      var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);
-      encoding = _encodings.StandardEncoding;
+      for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {
+        let offset = itemDecode(locaData, j);
 
-      if (properties.type === "TrueType" && !isNonsymbolicFont) {
-        encoding = _encodings.WinAnsiEncoding;
+        if (offset > oldGlyfDataLength) {
+          offset = oldGlyfDataLength;
+        }
+
+        locaEntries.push({
+          index: i,
+          offset,
+          endOffset: 0
+        });
       }
 
-      if (isSymbolicFont) {
-        encoding = _encodings.MacRomanEncoding;
+      locaEntries.sort((a, b) => {
+        return a.offset - b.offset;
+      });
 
-        if (!properties.file) {
-          if (/Symbol/i.test(properties.name)) {
-            encoding = _encodings.SymbolSetEncoding;
-          } else if (/Dingbats|Wingdings/i.test(properties.name)) {
-            encoding = _encodings.ZapfDingbatsEncoding;
-          }
-        }
+      for (i = 0; i < numGlyphs; i++) {
+        locaEntries[i].endOffset = locaEntries[i + 1].offset;
       }
 
-      properties.defaultEncoding = encoding;
-    }
+      locaEntries.sort((a, b) => {
+        return a.index - b.index;
+      });
+      const missingGlyphs = Object.create(null);
+      let writeOffset = 0;
+      itemEncode(locaData, 0, writeOffset);
 
-    properties.differences = differences;
-    properties.baseEncodingName = baseEncodingName;
-    properties.hasEncoding = !!baseEncodingName || differences.length > 0;
-    properties.dict = dict;
-    return toUnicodePromise.then(readToUnicode => {
-      properties.toUnicode = readToUnicode;
-      return this.buildToUnicode(properties);
-    }).then(builtToUnicode => {
-      properties.toUnicode = builtToUnicode;
+      for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+        const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, 
newGlyfData, writeOffset, hintsValid);
+        const newLength = glyphProfile.length;
 
-      if (cidToGidBytes) {
-        properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode);
+        if (newLength === 0) {
+          missingGlyphs[i] = true;
+        }
+
+        if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
+          maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
+        }
+
+        writeOffset += newLength;
+        itemEncode(locaData, j, writeOffset);
       }
 
-      return properties;
-    });
-  }
+      if (writeOffset === 0) {
+        const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
 
-  _buildSimpleFontToUnicode(properties, forceGlyphs = false) {
-    (0, _util.assert)(!properties.composite, "Must be a simple font.");
-    const toUnicode = [];
-    const encoding = properties.defaultEncoding.slice();
-    const baseEncodingName = properties.baseEncodingName;
-    const differences = properties.differences;
+        for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
+          itemEncode(locaData, j, simpleGlyph.length);
+        }
 
-    for (const charcode in differences) {
-      const glyphName = differences[charcode];
+        glyf.data = simpleGlyph;
+      } else if (dupFirstEntry) {
+        const firstEntryLength = itemDecode(locaData, itemSize);
 
-      if (glyphName === ".notdef") {
-        continue;
+        if (newGlyfData.length > firstEntryLength + writeOffset) {
+          glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
+        } else {
+          glyf.data = new Uint8Array(firstEntryLength + writeOffset);
+          glyf.data.set(newGlyfData.subarray(0, writeOffset));
+        }
+
+        glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
+        itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
+      } else {
+        glyf.data = newGlyfData.subarray(0, writeOffset);
       }
 
-      encoding[charcode] = glyphName;
+      return {
+        missingGlyphs,
+        maxSizeOfInstructions
+      };
     }
 
-    const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+    function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {
+      const start = (font.start ? font.start : 0) + post.offset;
+      font.pos = start;
+      const length = post.length,
+            end = start + length;
+      const version = font.getInt32();
+      font.skip(28);
+      let glyphNames;
+      let valid = true;
+      let i;
+
+      switch (version) {
+        case 0x00010000:
+          glyphNames = _fonts_utils.MacStandardGlyphOrdering;
+          break;
 
-    for (const charcode in encoding) {
-      let glyphName = encoding[charcode];
+        case 0x00020000:
+          const numGlyphs = font.getUint16();
 
-      if (glyphName === "") {
-        continue;
-      } else if (glyphsUnicodeMap[glyphName] === undefined) {
-        let code = 0;
+          if (numGlyphs !== maxpNumGlyphs) {
+            valid = false;
+            break;
+          }
 
-        switch (glyphName[0]) {
-          case "G":
-            if (glyphName.length === 3) {
-              code = parseInt(glyphName.substring(1), 16);
-            }
+          const glyphNameIndexes = [];
 
-            break;
+          for (i = 0; i < numGlyphs; ++i) {
+            const index = font.getUint16();
 
-          case "g":
-            if (glyphName.length === 5) {
-              code = parseInt(glyphName.substring(1), 16);
+            if (index >= 32768) {
+              valid = false;
+              break;
             }
 
-            break;
+            glyphNameIndexes.push(index);
+          }
 
-          case "C":
-          case "c":
-            if (glyphName.length >= 3 && glyphName.length <= 4) {
-              const codeStr = glyphName.substring(1);
+          if (!valid) {
+            break;
+          }
 
-              if (forceGlyphs) {
-                code = parseInt(codeStr, 16);
-                break;
-              }
+          const customNames = [],
+                strBuf = [];
 
-              code = +codeStr;
+          while (font.pos < end) {
+            const stringLength = font.getByte();
+            strBuf.length = stringLength;
 
-              if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {
-                return this._buildSimpleFontToUnicode(properties, true);
-              }
+            for (i = 0; i < stringLength; ++i) {
+              strBuf[i] = String.fromCharCode(font.getByte());
             }
 
-            break;
-
-          default:
-            const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
-
-            if (unicode !== -1) {
-              code = unicode;
-            }
+            customNames.push(strBuf.join(""));
+          }
 
-        }
+          glyphNames = [];
 
-        if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {
-          if (baseEncodingName && code === +charcode) {
-            const baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);
+          for (i = 0; i < numGlyphs; ++i) {
+            const j = glyphNameIndexes[i];
 
-            if (baseEncoding && (glyphName = baseEncoding[charcode])) {
-              toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
+            if (j < 258) {
+              glyphNames.push(_fonts_utils.MacStandardGlyphOrdering[j]);
               continue;
             }
-          }
 
-          toUnicode[charcode] = String.fromCodePoint(code);
-        }
+            glyphNames.push(customNames[j - 258]);
+          }
 
-        continue;
-      }
+          break;
 
-      toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
-    }
+        case 0x00030000:
+          break;
 
-    return new _fonts.ToUnicodeMap(toUnicode);
-  }
+        default:
+          (0, _util.warn)("Unknown/unsupported post table version " + version);
+          valid = false;
 
-  buildToUnicode(properties) {
-    properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;
+          if (propertiesObj.defaultEncoding) {
+            glyphNames = propertiesObj.defaultEncoding;
+          }
 
-    if (properties.hasIncludedToUnicodeMap) {
-      if (!properties.composite && properties.hasEncoding) {
-        properties.fallbackToUnicode = this._buildSimpleFontToUnicode(properties);
+          break;
       }
 
-      return Promise.resolve(properties.toUnicode);
-    }
-
-    if (!properties.composite) {
-      return Promise.resolve(this._buildSimpleFontToUnicode(properties));
+      propertiesObj.glyphNames = glyphNames;
+      return valid;
     }
 
-    if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof 
_cmap.IdentityCMap) || properties.cidSystemInfo.registry === "Adobe" && (properties.cidSystemInfo.ordering 
=== "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" 
|| properties.cidSystemInfo.ordering === "Korea1"))) {
-      const registry = properties.cidSystemInfo.registry;
-      const ordering = properties.cidSystemInfo.ordering;
-
-      const ucs2CMapName = _primitives.Name.get(registry + "-" + ordering + "-UCS2");
-
-      return _cmap.CMapFactory.create({
-        encoding: ucs2CMapName,
-        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
-        useCMap: null
-      }).then(function (ucs2CMap) {
-        const cMap = properties.cMap;
-        const toUnicode = [];
-        cMap.forEach(function (charcode, cid) {
-          if (cid > 0xffff) {
-            throw new _util.FormatError("Max size of CID is 65,535");
-          }
+    function readNameTable(nameTable) {
+      const start = (font.start ? font.start : 0) + nameTable.offset;
+      font.pos = start;
+      const names = [[], []];
+      const length = nameTable.length,
+            end = start + length;
+      const format = font.getUint16();
+      const FORMAT_0_HEADER_LENGTH = 6;
 
-          const ucs2 = ucs2CMap.lookup(cid);
+      if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
+        return names;
+      }
 
-          if (ucs2) {
-            toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));
-          }
-        });
-        return new _fonts.ToUnicodeMap(toUnicode);
-      });
-    }
+      const numRecords = font.getUint16();
+      const stringsStart = font.getUint16();
+      const records = [];
+      const NAME_RECORD_LENGTH = 12;
+      let i, ii;
+
+      for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
+        const r = {
+          platform: font.getUint16(),
+          encoding: font.getUint16(),
+          language: font.getUint16(),
+          name: font.getUint16(),
+          length: font.getUint16(),
+          offset: font.getUint16()
+        };
 
-    return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));
-  }
+        if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 
&& r.language === 0x409) {
+          records.push(r);
+        }
+      }
 
-  readToUnicode(toUnicode) {
-    var cmapObj = toUnicode;
+      for (i = 0, ii = records.length; i < ii; i++) {
+        const record = records[i];
 
-    if ((0, _primitives.isName)(cmapObj)) {
-      return _cmap.CMapFactory.create({
-        encoding: cmapObj,
-        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
-        useCMap: null
-      }).then(function (cmap) {
-        if (cmap instanceof _cmap.IdentityCMap) {
-          return new _fonts.IdentityToUnicodeMap(0, 0xffff);
+        if (record.length <= 0) {
+          continue;
         }
 
-        return new _fonts.ToUnicodeMap(cmap.getMap());
-      });
-    } else if ((0, _primitives.isStream)(cmapObj)) {
-      return _cmap.CMapFactory.create({
-        encoding: cmapObj,
-        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
-        useCMap: null
-      }).then(function (cmap) {
-        if (cmap instanceof _cmap.IdentityCMap) {
-          return new _fonts.IdentityToUnicodeMap(0, 0xffff);
-        }
+        const pos = start + stringsStart + record.offset;
 
-        var map = new Array(cmap.length);
-        cmap.forEach(function (charCode, token) {
-          var str = [];
+        if (pos + record.length > end) {
+          continue;
+        }
 
-          for (var k = 0; k < token.length; k += 2) {
-            var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+        font.pos = pos;
+        const nameIndex = record.name;
 
-            if ((w1 & 0xf800) !== 0xd800) {
-              str.push(w1);
-              continue;
-            }
+        if (record.encoding) {
+          let str = "";
 
-            k += 2;
-            var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
-            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+          for (let j = 0, jj = record.length; j < jj; j += 2) {
+            str += String.fromCharCode(font.getUint16());
           }
 
-          map[charCode] = String.fromCodePoint.apply(String, str);
-        });
-        return new _fonts.ToUnicodeMap(map);
-      }, reason => {
-        if (reason instanceof _util.AbortException) {
-          return null;
-        }
-
-        if (this.options.ignoreErrors) {
-          this.handler.send("UnsupportedFeature", {
-            featureId: _util.UNSUPPORTED_FEATURES.errorFontToUnicode
-          });
-          (0, _util.warn)(`readToUnicode - ignoring ToUnicode data: "${reason}".`);
-          return null;
+          names[1][nameIndex] = str;
+        } else {
+          names[0][nameIndex] = font.getString(record.length);
         }
+      }
 
-        throw reason;
-      });
+      return names;
     }
 
-    return Promise.resolve(null);
-  }
+    const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, 
-1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, 
-999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, 
-1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, 
-2, 0, 0, 0, -1, -1, -1, -2];
 
-  readCidToGidMap(glyphsData, toUnicode) {
-    var result = [];
+    function sanitizeTTProgram(table, ttContext) {
+      let data = table.data;
+      let i = 0,
+          j,
+          n,
+          b,
+          funcId,
+          pc,
+          lastEndf = 0,
+          lastDeff = 0;
+      const stack = [];
+      const callstack = [];
+      const functionsCalled = [];
+      let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
+      let inFDEF = false,
+          ifLevel = 0,
+          inELSE = 0;
+
+      for (let ii = data.length; i < ii;) {
+        const op = data[i++];
+
+        if (op === 0x40) {
+          n = data[i++];
+
+          if (inFDEF || inELSE) {
+            i += n;
+          } else {
+            for (j = 0; j < n; j++) {
+              stack.push(data[i++]);
+            }
+          }
+        } else if (op === 0x41) {
+          n = data[i++];
 
-    for (var j = 0, jj = glyphsData.length; j < jj; j++) {
-      var glyphID = glyphsData[j++] << 8 | glyphsData[j];
-      const code = j >> 1;
+          if (inFDEF || inELSE) {
+            i += n * 2;
+          } else {
+            for (j = 0; j < n; j++) {
+              b = data[i++];
+              stack.push(b << 8 | data[i++]);
+            }
+          }
+        } else if ((op & 0xf8) === 0xb0) {
+          n = op - 0xb0 + 1;
 
-      if (glyphID === 0 && !toUnicode.has(code)) {
-        continue;
-      }
+          if (inFDEF || inELSE) {
+            i += n;
+          } else {
+            for (j = 0; j < n; j++) {
+              stack.push(data[i++]);
+            }
+          }
+        } else if ((op & 0xf8) === 0xb8) {
+          n = op - 0xb8 + 1;
 
-      result[code] = glyphID;
-    }
+          if (inFDEF || inELSE) {
+            i += n * 2;
+          } else {
+            for (j = 0; j < n; j++) {
+              b = data[i++];
+              stack.push(b << 8 | data[i++]);
+            }
+          }
+        } else if (op === 0x2b && !tooComplexToFollowFunctions) {
+          if (!inFDEF && !inELSE) {
+            funcId = stack[stack.length - 1];
 
-    return result;
-  }
+            if (isNaN(funcId)) {
+              (0, _util.info)("TT: CALL empty stack (or invalid entry).");
+            } else {
+              ttContext.functionsUsed[funcId] = true;
 
-  extractWidths(dict, descriptor, properties) {
-    var xref = this.xref;
-    var glyphsWidths = [];
-    var defaultWidth = 0;
-    var glyphsVMetrics = [];
-    var defaultVMetrics;
-    var i, ii, j, jj, start, code, widths;
+              if (funcId in ttContext.functionsStackDeltas) {
+                const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];
 
-    if (properties.composite) {
-      defaultWidth = dict.has("DW") ? dict.get("DW") : 1000;
-      widths = dict.get("W");
+                if (newStackLength < 0) {
+                  (0, _util.warn)("TT: CALL invalid functions stack delta.");
+                  ttContext.hintsValid = false;
+                  return;
+                }
 
-      if (widths) {
-        for (i = 0, ii = widths.length; i < ii; i++) {
-          start = xref.fetchIfRef(widths[i++]);
-          code = xref.fetchIfRef(widths[i]);
+                stack.length = newStackLength;
+              } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
+                callstack.push({
+                  data,
+                  i,
+                  stackTop: stack.length - 1
+                });
+                functionsCalled.push(funcId);
+                pc = ttContext.functionsDefined[funcId];
 
-          if (Array.isArray(code)) {
-            for (j = 0, jj = code.length; j < jj; j++) {
-              glyphsWidths[start++] = xref.fetchIfRef(code[j]);
+                if (!pc) {
+                  (0, _util.warn)("TT: CALL non-existent function");
+                  ttContext.hintsValid = false;
+                  return;
+                }
+
+                data = pc.data;
+                i = pc.i;
+              }
             }
+          }
+        } else if (op === 0x2c && !tooComplexToFollowFunctions) {
+          if (inFDEF || inELSE) {
+            (0, _util.warn)("TT: nested FDEFs not allowed");
+            tooComplexToFollowFunctions = true;
+          }
+
+          inFDEF = true;
+          lastDeff = i;
+          funcId = stack.pop();
+          ttContext.functionsDefined[funcId] = {
+            data,
+            i
+          };
+        } else if (op === 0x2d) {
+          if (inFDEF) {
+            inFDEF = false;
+            lastEndf = i;
           } else {
-            var width = xref.fetchIfRef(widths[++i]);
+            pc = callstack.pop();
 
-            for (j = start; j <= code; j++) {
-              glyphsWidths[j] = width;
+            if (!pc) {
+              (0, _util.warn)("TT: ENDF bad stack");
+              ttContext.hintsValid = false;
+              return;
             }
-          }
-        }
-      }
 
-      if (properties.vertical) {
-        var vmetrics = dict.getArray("DW2") || [880, -1000];
-        defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
-        vmetrics = dict.get("W2");
+            funcId = functionsCalled.pop();
+            data = pc.data;
+            i = pc.i;
+            ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
+          }
+        } else if (op === 0x89) {
+          if (inFDEF || inELSE) {
+            (0, _util.warn)("TT: nested IDEFs not allowed");
+            tooComplexToFollowFunctions = true;
+          }
 
-        if (vmetrics) {
-          for (i = 0, ii = vmetrics.length; i < ii; i++) {
-            start = xref.fetchIfRef(vmetrics[i++]);
-            code = xref.fetchIfRef(vmetrics[i]);
+          inFDEF = true;
+          lastDeff = i;
+        } else if (op === 0x58) {
+          ++ifLevel;
+        } else if (op === 0x1b) {
+          inELSE = ifLevel;
+        } else if (op === 0x59) {
+          if (inELSE === ifLevel) {
+            inELSE = 0;
+          }
 
-            if (Array.isArray(code)) {
-              for (j = 0, jj = code.length; j < jj; j++) {
-                glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), 
xref.fetchIfRef(code[j])];
-              }
-            } else {
-              var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), 
xref.fetchIfRef(vmetrics[++i])];
+          --ifLevel;
+        } else if (op === 0x1c) {
+          if (!inFDEF && !inELSE) {
+            const offset = stack[stack.length - 1];
 
-              for (j = start; j <= code; j++) {
-                glyphsVMetrics[j] = vmetric;
-              }
+            if (offset > 0) {
+              i += offset - 1;
             }
           }
         }
-      }
-    } else {
-      var firstChar = properties.firstChar;
-      widths = dict.get("Widths");
 
-      if (widths) {
-        j = firstChar;
+        if (!inFDEF && !inELSE) {
+          let stackDelta = 0;
 
-        for (i = 0, ii = widths.length; i < ii; i++) {
-          glyphsWidths[j++] = xref.fetchIfRef(widths[i]);
-        }
+          if (op <= 0x8e) {
+            stackDelta = TTOpsStackDeltas[op];
+          } else if (op >= 0xc0 && op <= 0xdf) {
+            stackDelta = -1;
+          } else if (op >= 0xe0) {
+            stackDelta = -2;
+          }
 
-        defaultWidth = parseFloat(descriptor.get("MissingWidth")) || 0;
-      } else {
-        var baseFontName = dict.get("BaseFont");
+          if (op >= 0x71 && op <= 0x75) {
+            n = stack.pop();
 
-        if ((0, _primitives.isName)(baseFontName)) {
-          var metrics = this.getBaseFontMetrics(baseFontName.name);
-          glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
-          defaultWidth = metrics.defaultWidth;
+            if (!isNaN(n)) {
+              stackDelta = -n * 2;
+            }
+          }
+
+          while (stackDelta < 0 && stack.length > 0) {
+            stack.pop();
+            stackDelta++;
+          }
+
+          while (stackDelta > 0) {
+            stack.push(NaN);
+            stackDelta--;
+          }
         }
       }
-    }
-
-    var isMonospace = true;
-    var firstWidth = defaultWidth;
 
-    for (var glyph in glyphsWidths) {
-      var glyphWidth = glyphsWidths[glyph];
+      ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
+      const content = [data];
 
-      if (!glyphWidth) {
-        continue;
+      if (i > data.length) {
+        content.push(new Uint8Array(i - data.length));
       }
 
-      if (!firstWidth) {
-        firstWidth = glyphWidth;
-        continue;
+      if (lastDeff > lastEndf) {
+        (0, _util.warn)("TT: complementing a missing function tail");
+        content.push(new Uint8Array([0x22, 0x2d]));
       }
 
-      if (firstWidth !== glyphWidth) {
-        isMonospace = false;
-        break;
-      }
+      foldTTTable(table, content);
     }
 
-    if (isMonospace) {
-      properties.flags |= _fonts.FontFlags.FixedPitch;
-    }
+    function checkInvalidFunctions(ttContext, maxFunctionDefs) {
+      if (ttContext.tooComplexToFollowFunctions) {
+        return;
+      }
 
-    properties.defaultWidth = defaultWidth;
-    properties.widths = glyphsWidths;
-    properties.defaultVMetrics = defaultVMetrics;
-    properties.vmetrics = glyphsVMetrics;
-  }
+      if (ttContext.functionsDefined.length > maxFunctionDefs) {
+        (0, _util.warn)("TT: more functions defined than expected");
+        ttContext.hintsValid = false;
+        return;
+      }
 
-  isSerifFont(baseFontName) {
-    var fontNameWoStyle = baseFontName.split("-")[0];
-    return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== 
-1;
-  }
+      for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
+        if (j > maxFunctionDefs) {
+          (0, _util.warn)("TT: invalid function id: " + j);
+          ttContext.hintsValid = false;
+          return;
+        }
 
-  getBaseFontMetrics(name) {
-    var defaultWidth = 0;
-    var widths = [];
-    var monospace = false;
-    var stdFontMap = (0, _standard_fonts.getStdFontMap)();
-    var lookupName = stdFontMap[name] || name;
-    var Metrics = (0, _metrics.getMetrics)();
+        if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
+          (0, _util.warn)("TT: undefined function: " + j);
+          ttContext.hintsValid = false;
+          return;
+        }
+      }
+    }
 
-    if (!(lookupName in Metrics)) {
-      if (this.isSerifFont(name)) {
-        lookupName = "Times-Roman";
-      } else {
-        lookupName = "Helvetica";
+    function foldTTTable(table, content) {
+      if (content.length > 1) {
+        let newLength = 0;
+        let j, jj;
+
+        for (j = 0, jj = content.length; j < jj; j++) {
+          newLength += content[j].length;
+        }
+
+        newLength = newLength + 3 & ~3;
+        const result = new Uint8Array(newLength);
+        let pos = 0;
+
+        for (j = 0, jj = content.length; j < jj; j++) {
+          result.set(content[j], pos);
+          pos += content[j].length;
+        }
+
+        table.data = result;
+        table.length = newLength;
       }
     }
 
-    var glyphWidths = Metrics[lookupName];
+    function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
+      const ttContext = {
+        functionsDefined: [],
+        functionsUsed: [],
+        functionsStackDeltas: [],
+        tooComplexToFollowFunctions: false,
+        hintsValid: true
+      };
 
-    if ((0, _util.isNum)(glyphWidths)) {
-      defaultWidth = glyphWidths;
-      monospace = true;
+      if (fpgm) {
+        sanitizeTTProgram(fpgm, ttContext);
+      }
+
+      if (prep) {
+        sanitizeTTProgram(prep, ttContext);
+      }
+
+      if (fpgm) {
+        checkInvalidFunctions(ttContext, maxFunctionDefs);
+      }
+
+      if (cvt && cvt.length & 1) {
+        const cvtData = new Uint8Array(cvt.length + 1);
+        cvtData.set(cvt.data);
+        cvt.data = cvtData;
+      }
+
+      return ttContext.hintsValid;
+    }
+
+    font = new _stream.Stream(new Uint8Array(font.getBytes()));
+    let header, tables;
+
+    if (isTrueTypeCollectionFile(font)) {
+      const ttcData = readTrueTypeCollectionData(font, this.name);
+      header = ttcData.header;
+      tables = ttcData.tables;
     } else {
-      widths = glyphWidths();
+      header = readOpenTypeHeader(font);
+      tables = readTables(font, header.numTables);
     }
 
-    return {
-      defaultWidth,
-      monospace,
-      widths
-    };
-  }
+    let cff, cffFile;
+    const isTrueType = !tables["CFF "];
 
-  buildCharCodeToWidth(widthsByGlyphName, properties) {
-    var widths = Object.create(null);
-    var differences = properties.differences;
-    var encoding = properties.defaultEncoding;
+    if (!isTrueType) {
+      const isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || 
!(properties.cMap instanceof _cmap.IdentityCMap));
 
-    for (var charCode = 0; charCode < 256; charCode++) {
-      if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
-        widths[charCode] = widthsByGlyphName[differences[charCode]];
-        continue;
+      if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || 
!tables.post) {
+        cffFile = new _stream.Stream(tables["CFF "].data);
+        cff = new _cff_font.CFFFont(cffFile, properties);
+        adjustWidths(properties);
+        return this.convert(name, cff, properties);
       }
 
-      if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
-        widths[charCode] = widthsByGlyphName[encoding[charCode]];
-        continue;
+      delete tables.glyf;
+      delete tables.loca;
+      delete tables.fpgm;
+      delete tables.prep;
+      delete tables["cvt "];
+      this.isOpenType = true;
+    } else {
+      if (!tables.loca) {
+        throw new _util.FormatError('Required "loca" table is not found');
+      }
+
+      if (!tables.glyf) {
+        (0, _util.warn)('Required "glyf" table is not found -- trying to recover.');
+        tables.glyf = {
+          tag: "glyf",
+          data: new Uint8Array(0)
+        };
       }
+
+      this.isOpenType = false;
     }
 
-    return widths;
-  }
+    if (!tables.maxp) {
+      throw new _util.FormatError('Required "maxp" table is not found');
+    }
 
-  preEvaluateFont(dict) {
-    var baseDict = dict;
-    var type = dict.get("Subtype");
+    font.pos = (font.start || 0) + tables.maxp.offset;
+    const version = font.getInt32();
+    const numGlyphs = font.getUint16();
 
-    if (!(0, _primitives.isName)(type)) {
-      throw new _util.FormatError("invalid font Subtype");
+    if (properties.scaleFactors && properties.scaleFactors.length === numGlyphs && isTrueType) {
+      const {
+        scaleFactors
+      } = properties;
+      const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
+      const glyphs = new _glyf.GlyfTable({
+        glyfTable: tables.glyf.data,
+        isGlyphLocationsLong,
+        locaTable: tables.loca.data,
+        numGlyphs
+      });
+      glyphs.scale(scaleFactors);
+      const {
+        glyf,
+        loca,
+        isLocationLong
+      } = glyphs.write();
+      tables.glyf.data = glyf;
+      tables.loca.data = loca;
+
+      if (isLocationLong !== !!isGlyphLocationsLong) {
+        tables.head.data[50] = 0;
+        tables.head.data[51] = isLocationLong ? 1 : 0;
+      }
+
+      const metrics = tables.hmtx.data;
+
+      for (let i = 0; i < numGlyphs; i++) {
+        const j = 4 * i;
+        const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1]));
+        metrics[j] = advanceWidth >> 8 & 0xff;
+        metrics[j + 1] = advanceWidth & 0xff;
+        const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3]));
+        writeSignedInt16(metrics, j + 2, lsb);
+      }
     }
 
-    var composite = false;
-    var uint8array;
+    let numGlyphsOut = numGlyphs + 1;
+    let dupFirstEntry = true;
 
-    if (type.name === "Type0") {
-      var df = dict.get("DescendantFonts");
+    if (numGlyphsOut > 0xffff) {
+      dupFirstEntry = false;
+      numGlyphsOut = numGlyphs;
+      (0, _util.warn)("Not enough space in glyfs to duplicate first glyph.");
+    }
 
-      if (!df) {
-        throw new _util.FormatError("Descendant fonts are not specified");
+    let maxFunctionDefs = 0;
+    let maxSizeOfInstructions = 0;
+
+    if (version >= 0x00010000 && tables.maxp.length >= 22) {
+      font.pos += 8;
+      const maxZones = font.getUint16();
+
+      if (maxZones > 2) {
+        tables.maxp.data[14] = 0;
+        tables.maxp.data[15] = 2;
       }
 
-      dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
-      type = dict.get("Subtype");
+      font.pos += 4;
+      maxFunctionDefs = font.getUint16();
+      font.pos += 4;
+      maxSizeOfInstructions = font.getUint16();
+    }
 
-      if (!(0, _primitives.isName)(type)) {
-        throw new _util.FormatError("invalid font Subtype");
+    tables.maxp.data[4] = numGlyphsOut >> 8;
+    tables.maxp.data[5] = numGlyphsOut & 255;
+    const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs);
+
+    if (!hintsValid) {
+      delete tables.fpgm;
+      delete tables.prep;
+      delete tables["cvt "];
+    }
+
+    sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry);
+
+    if (!tables.head) {
+      throw new _util.FormatError('Required "head" table is not found');
+    }
+
+    sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
+    let missingGlyphs = Object.create(null);
+
+    if (isTrueType) {
+      const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
+      const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, 
hintsValid, dupFirstEntry, maxSizeOfInstructions);
+      missingGlyphs = glyphsInfo.missingGlyphs;
+
+      if (version >= 0x00010000 && tables.maxp.length >= 22) {
+        tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
+        tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;
       }
+    }
 
-      composite = true;
+    if (!tables.hhea) {
+      throw new _util.FormatError('Required "hhea" table is not found');
     }
 
-    var descriptor = dict.get("FontDescriptor");
+    if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
+      tables.hhea.data[10] = 0xff;
+      tables.hhea.data[11] = 0xff;
+    }
 
-    if (descriptor) {
-      var hash = new _murmurhash.MurmurHash3_64();
-      var encoding = baseDict.getRaw("Encoding");
+    const metricsOverride = {
+      unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
+      yMax: int16(tables.head.data[42], tables.head.data[43]),
+      yMin: signedInt16(tables.head.data[38], tables.head.data[39]),
+      ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]),
+      descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]),
+      lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9])
+    };
+    this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
+    this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;
+    this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm;
 
-      if ((0, _primitives.isName)(encoding)) {
-        hash.update(encoding.name);
-      } else if ((0, _primitives.isRef)(encoding)) {
-        hash.update(encoding.toString());
-      } else if ((0, _primitives.isDict)(encoding)) {
-        for (const entry of encoding.getRawValues()) {
-          if ((0, _primitives.isName)(entry)) {
-            hash.update(entry.name);
-          } else if ((0, _primitives.isRef)(entry)) {
-            hash.update(entry.toString());
-          } else if (Array.isArray(entry)) {
-            var diffLength = entry.length,
-                diffBuf = new Array(diffLength);
+    if (this.cssFontInfo && this.cssFontInfo.lineHeight) {
+      this.lineHeight = this.cssFontInfo.lineHeight;
+    } else {
+      this.lineHeight = this.ascent - this.descent + this.lineGap;
+    }
 
-            for (var j = 0; j < diffLength; j++) {
-              var diffEntry = entry[j];
+    if (tables.post) {
+      readPostScriptTable(tables.post, properties, numGlyphs);
+    }
 
-              if ((0, _primitives.isName)(diffEntry)) {
-                diffBuf[j] = diffEntry.name;
-              } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {
-                diffBuf[j] = diffEntry.toString();
-              }
+    tables.post = {
+      tag: "post",
+      data: createPostTable(properties)
+    };
+    const charCodeToGlyphId = [];
+
+    function hasGlyph(glyphId) {
+      return !missingGlyphs[glyphId];
+    }
+
+    if (properties.composite) {
+      const cidToGidMap = properties.cidToGidMap || [];
+      const isCidToGidMapEmpty = cidToGidMap.length === 0;
+      properties.cMap.forEach(function (charCode, cid) {
+        if (cid > 0xffff) {
+          throw new _util.FormatError("Max size of CID is 65,535");
+        }
+
+        let glyphId = -1;
+
+        if (isCidToGidMapEmpty) {
+          glyphId = cid;
+        } else if (cidToGidMap[cid] !== undefined) {
+          glyphId = cidToGidMap[cid];
+        }
+
+        if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      });
+    } else {
+      const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding);
+      const cmapPlatformId = cmapTable.platformId;
+      const cmapEncodingId = cmapTable.encodingId;
+      const cmapMappings = cmapTable.mappings;
+      const cmapMappingsLength = cmapMappings.length;
+      let baseEncoding = [];
+
+      if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || 
properties.baseEncodingName === "WinAnsiEncoding")) {
+        baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
+      }
+
+      if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || 
cmapPlatformId === 1 && cmapEncodingId === 0)) {
+        const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+
+        for (let charCode = 0; charCode < 256; charCode++) {
+          let glyphName;
+
+          if (this.differences[charCode] !== undefined) {
+            glyphName = this.differences[charCode];
+          } else if (baseEncoding[charCode] !== "") {
+            glyphName = baseEncoding[charCode];
+          } else {
+            glyphName = _encodings.StandardEncoding[charCode];
+          }
+
+          if (!glyphName) {
+            continue;
+          }
+
+          const standardGlyphName = (0, _fonts_utils.recoverGlyphName)(glyphName, glyphsUnicodeMap);
+          let unicodeOrCharCode;
+
+          if (cmapPlatformId === 3 && cmapEncodingId === 1) {
+            unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
+          } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
+            unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);
+          }
+
+          for (let i = 0; i < cmapMappingsLength; ++i) {
+            if (cmapMappings[i].charCode !== unicodeOrCharCode) {
+              continue;
             }
 
-            hash.update(diffBuf.join());
+            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+            break;
           }
         }
-      }
+      } else if (cmapPlatformId === 0) {
+        for (let i = 0; i < cmapMappingsLength; ++i) {
+          charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId;
+        }
+      } else {
+        for (let i = 0; i < cmapMappingsLength; ++i) {
+          let charCode = cmapMappings[i].charCode;
 
-      const firstChar = dict.get("FirstChar") || 0;
-      const lastChar = dict.get("LastChar") || (composite ? 0xffff : 0xff);
-      hash.update(`${firstChar}-${lastChar}`);
-      var toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode");
+          if (cmapPlatformId === 3 && charCode >= 0xf000 && charCode <= 0xf0ff) {
+            charCode &= 0xff;
+          }
 
-      if ((0, _primitives.isStream)(toUnicode)) {
-        var stream = toUnicode.str || toUnicode;
-        uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new 
Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
-        hash.update(uint8array);
-      } else if ((0, _primitives.isName)(toUnicode)) {
-        hash.update(toUnicode.name);
+          charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+        }
       }
 
-      var widths = dict.get("Widths") || baseDict.get("Widths");
+      if (properties.glyphNames && (baseEncoding.length || this.differences.length)) {
+        for (let i = 0; i < 256; ++i) {
+          if (charCodeToGlyphId[i] !== undefined) {
+            continue;
+          }
 
-      if (widths) {
-        uint8array = new Uint8Array(new Uint32Array(widths).buffer);
-        hash.update(uint8array);
+          const glyphName = this.differences[i] || baseEncoding[i];
+
+          if (!glyphName) {
+            continue;
+          }
+
+          const glyphId = properties.glyphNames.indexOf(glyphName);
+
+          if (glyphId > 0 && hasGlyph(glyphId)) {
+            charCodeToGlyphId[i] = glyphId;
+          }
+        }
       }
     }
 
-    return {
-      descriptor,
-      dict,
-      baseDict,
-      composite,
-      type: type.name,
-      hash: hash ? hash.hexdigest() : ""
-    };
-  }
+    if (charCodeToGlyphId.length === 0) {
+      charCodeToGlyphId[0] = 0;
+    }
 
-  translateFont(preEvaluatedFont) {
-    var baseDict = preEvaluatedFont.baseDict;
-    var dict = preEvaluatedFont.dict;
-    var composite = preEvaluatedFont.composite;
-    var descriptor = preEvaluatedFont.descriptor;
-    var type = preEvaluatedFont.type;
-    var maxCharIndex = composite ? 0xffff : 0xff;
-    var properties;
-    const firstChar = dict.get("FirstChar") || 0;
-    const lastChar = dict.get("LastChar") || maxCharIndex;
+    let glyphZeroId = numGlyphsOut - 1;
 
-    if (!descriptor) {
-      if (type === "Type3") {
-        descriptor = new _primitives.Dict(null);
-        descriptor.set("FontName", _primitives.Name.get(type));
-        descriptor.set("FontBBox", dict.getArray("FontBBox") || [0, 0, 0, 0]);
-      } else {
-        var baseFontName = dict.get("BaseFont");
+    if (!dupFirstEntry) {
+      glyphZeroId = 0;
+    }
 
-        if (!(0, _primitives.isName)(baseFontName)) {
-          throw new _util.FormatError("Base font is not specified");
-        }
+    if (!properties.cssFontInfo) {
+      const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);
+      this.toFontChar = newMapping.toFontChar;
+      tables.cmap = {
+        tag: "cmap",
+        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut)
+      };
 
-        baseFontName = baseFontName.name.replace(/[,_]/g, "-");
-        var metrics = this.getBaseFontMetrics(baseFontName);
-        var fontNameWoStyle = baseFontName.split("-")[0];
-        var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? 
_fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? 
_fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);
-        properties = {
-          type,
-          name: baseFontName,
-          widths: metrics.widths,
-          defaultWidth: metrics.defaultWidth,
-          flags,
-          firstChar,
-          lastChar
+      if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) {
+        tables["OS/2"] = {
+          tag: "OS/2",
+          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
         };
-        const widths = dict.get("Widths");
-        return this.extractDataStructures(dict, dict, properties).then(newProperties => {
-          if (widths) {
-            const glyphWidths = [];
-            let j = firstChar;
+      }
+    }
 
-            for (let i = 0, ii = widths.length; i < ii; i++) {
-              glyphWidths[j++] = this.xref.fetchIfRef(widths[i]);
-            }
+    if (!isTrueType) {
+      try {
+        cffFile = new _stream.Stream(tables["CFF "].data);
+        const parser = new _cff_parser.CFFParser(cffFile, properties, _fonts_utils.SEAC_ANALYSIS_ENABLED);
+        cff = parser.parse();
+        cff.duplicateFirstGlyph();
+        const compiler = new _cff_parser.CFFCompiler(cff);
+        tables["CFF "].data = compiler.compile();
+      } catch (e) {
+        (0, _util.warn)("Failed to compile font " + properties.loadedName);
+      }
+    }
 
-            newProperties.widths = glyphWidths;
-          } else {
-            newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties);
-          }
+    if (!tables.name) {
+      tables.name = {
+        tag: "name",
+        data: createNameTable(this.name)
+      };
+    } else {
+      const namePrototype = readNameTable(tables.name);
+      tables.name.data = createNameTable(name, namePrototype);
+      this.psName = namePrototype[0][6] || null;
+    }
 
-          return new _fonts.Font(baseFontName, null, newProperties);
-        });
-      }
+    const builder = new _opentype_file_builder.OpenTypeFileBuilder(header.version);
+
+    for (const tableTag in tables) {
+      builder.addTable(tableTag, tables[tableTag].data);
     }
 
-    var fontName = descriptor.get("FontName");
-    var baseFont = dict.get("BaseFont");
+    return builder.toArray();
+  }
+
+  convert(fontName, font, properties) {
+    properties.fixedPitch = false;
 
-    if ((0, _util.isString)(fontName)) {
-      fontName = _primitives.Name.get(fontName);
+    if (properties.builtInEncoding) {
+      adjustToUnicode(properties, properties.builtInEncoding);
     }
 
-    if ((0, _util.isString)(baseFont)) {
-      baseFont = _primitives.Name.get(baseFont);
+    let glyphZeroId = 1;
+
+    if (font instanceof _cff_font.CFFFont) {
+      glyphZeroId = font.numGlyphs - 1;
     }
 
-    if (type !== "Type3") {
-      var fontNameStr = fontName && fontName.name;
-      var baseFontStr = baseFont && baseFont.name;
+    const mapping = font.getGlyphMapping(properties);
+    let newMapping = null;
+    let newCharCodeToGlyphId = mapping;
 
-      if (fontNameStr !== baseFontStr) {
-        (0, _util.info)(`The FontDescriptor\'s FontName is "${fontNameStr}" but ` + `should be the same as 
the Font\'s BaseFont "${baseFontStr}".`);
+    if (!properties.cssFontInfo) {
+      newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId);
+      this.toFontChar = newMapping.toFontChar;
+      newCharCodeToGlyphId = newMapping.charCodeToGlyphId;
+    }
 
-        if (fontNameStr && baseFontStr && baseFontStr.startsWith(fontNameStr)) {
-          fontName = baseFont;
+    const numGlyphs = font.numGlyphs;
+
+    function getCharCodes(charCodeToGlyphId, glyphId) {
+      let charCodes = null;
+
+      for (const charCode in charCodeToGlyphId) {
+        if (glyphId === charCodeToGlyphId[charCode]) {
+          if (!charCodes) {
+            charCodes = [];
+          }
+
+          charCodes.push(charCode | 0);
         }
       }
+
+      return charCodes;
     }
 
-    fontName = fontName || baseFont;
+    function createCharCode(charCodeToGlyphId, glyphId) {
+      for (const charCode in charCodeToGlyphId) {
+        if (glyphId === charCodeToGlyphId[charCode]) {
+          return charCode | 0;
+        }
+      }
 
-    if (!(0, _primitives.isName)(fontName)) {
-      throw new _util.FormatError("invalid font name");
+      newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
+      return newMapping.nextAvailableFontCharCode++;
     }
 
-    var fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3");
+    const seacs = font.seacs;
 
-    if (fontFile) {
-      if (fontFile.dict) {
-        var subtype = fontFile.dict.get("Subtype");
+    if (newMapping && _fonts_utils.SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
+      const matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+      const charset = font.getCharset();
+      const seacMap = Object.create(null);
+
+      for (let glyphId in seacs) {
+        glyphId |= 0;
+        const seac = seacs[glyphId];
+        const baseGlyphName = _encodings.StandardEncoding[seac[2]];
+        const accentGlyphName = _encodings.StandardEncoding[seac[3]];
+        const baseGlyphId = charset.indexOf(baseGlyphName);
+        const accentGlyphId = charset.indexOf(accentGlyphName);
+
+        if (baseGlyphId < 0 || accentGlyphId < 0) {
+          continue;
+        }
+
+        const accentOffset = {
+          x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
+          y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
+        };
+        const charCodes = getCharCodes(mapping, glyphId);
 
-        if (subtype) {
-          subtype = subtype.name;
+        if (!charCodes) {
+          continue;
         }
 
-        var length1 = fontFile.dict.get("Length1");
-        var length2 = fontFile.dict.get("Length2");
-        var length3 = fontFile.dict.get("Length3");
+        for (let i = 0, ii = charCodes.length; i < ii; i++) {
+          const charCode = charCodes[i];
+          const charCodeToGlyphId = newMapping.charCodeToGlyphId;
+          const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
+          const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
+          seacMap[charCode] = {
+            baseFontCharCode,
+            accentFontCharCode,
+            accentOffset
+          };
+        }
       }
+
+      properties.seacMap = seacMap;
     }
 
-    properties = {
-      type,
-      name: fontName.name,
-      subtype,
-      file: fontFile,
-      length1,
-      length2,
-      length3,
-      loadedName: baseDict.loadedName,
-      composite,
-      fixedPitch: false,
-      fontMatrix: dict.getArray("FontMatrix") || _util.FONT_IDENTITY_MATRIX,
-      firstChar: firstChar || 0,
-      lastChar: lastChar || maxCharIndex,
-      bbox: descriptor.getArray("FontBBox"),
-      ascent: descriptor.get("Ascent"),
-      descent: descriptor.get("Descent"),
-      xHeight: descriptor.get("XHeight"),
-      capHeight: descriptor.get("CapHeight"),
-      flags: descriptor.get("Flags"),
-      italicAngle: descriptor.get("ItalicAngle"),
-      isType3Font: false
-    };
-    var cMapPromise;
+    const unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
+    const builder = new _opentype_file_builder.OpenTypeFileBuilder("\x4F\x54\x54\x4F");
+    builder.addTable("CFF ", font.data);
+    builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId));
+    builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, numGlyphs));
+    builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + 
"\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + 
"\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + 
safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + 
"\x00\x00" + "\x00\x00");
+    builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + 
safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + 
safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + 
"\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs));
+    builder.addTable("hmtx", function fontFieldsHmtx() {
+      const charstrings = font.charstrings;
+      const cffWidths = font.cff ? font.cff.widths : null;
+      let hmtx = "\x00\x00\x00\x00";
 
-    if (composite) {
-      var cidEncoding = baseDict.get("Encoding");
+      for (let i = 1, ii = numGlyphs; i < ii; i++) {
+        let width = 0;
 
-      if ((0, _primitives.isName)(cidEncoding)) {
-        properties.cidEncoding = cidEncoding.name;
+        if (charstrings) {
+          const charstring = charstrings[i - 1];
+          width = "width" in charstring ? charstring.width : 0;
+        } else if (cffWidths) {
+          width = Math.ceil(cffWidths[i] || 0);
+        }
+
+        hmtx += string16(width) + string16(0);
       }
 
-      cMapPromise = _cmap.CMapFactory.create({
-        encoding: cidEncoding,
-        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
-        useCMap: null
-      }).then(function (cMap) {
-        properties.cMap = cMap;
-        properties.vertical = properties.cMap.vertical;
-      });
-    } else {
-      cMapPromise = Promise.resolve(undefined);
-    }
+      return hmtx;
+    }());
+    builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs));
+    builder.addTable("name", createNameTable(fontName));
+    builder.addTable("post", createPostTable(properties));
+    return builder.toArray();
+  }
 
-    return cMapPromise.then(() => {
-      return this.extractDataStructures(dict, baseDict, properties);
-    }).then(newProperties => {
-      this.extractWidths(dict, descriptor, newProperties);
+  get spaceWidth() {
+    const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"];
+    let width;
 
-      if (type === "Type3") {
-        newProperties.isType3Font = true;
+    for (let i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
+      const glyphName = possibleSpaceReplacements[i];
+
+      if (glyphName in this.widths) {
+        width = this.widths[glyphName];
+        break;
       }
 
-      return new _fonts.Font(fontName.name, fontFile, newProperties);
-    });
-  }
+      const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+      const glyphUnicode = glyphsUnicodeMap[glyphName];
+      let charcode = 0;
 
-  static buildFontPaths(font, glyphs, handler) {
-    function buildPath(fontChar) {
-      if (font.renderer.hasBuiltPath(fontChar)) {
-        return;
+      if (this.composite && this.cMap.contains(glyphUnicode)) {
+        charcode = this.cMap.lookup(glyphUnicode);
       }
 
-      handler.send("commonobj", [`${font.loadedName}_path_${fontChar}`, "FontPath", 
font.renderer.getPathJs(fontChar)]);
-    }
+      if (!charcode && this.toUnicode) {
+        charcode = this.toUnicode.charCodeOf(glyphUnicode);
+      }
 
-    for (const glyph of glyphs) {
-      buildPath(glyph.fontChar);
-      const accent = glyph.accent;
+      if (charcode <= 0) {
+        charcode = glyphUnicode;
+      }
 
-      if (accent && accent.fontChar) {
-        buildPath(accent.fontChar);
+      width = this.widths[charcode];
+
+      if (width) {
+        break;
       }
     }
-  }
 
-  static get fallbackFontDict() {
-    const dict = new _primitives.Dict();
-    dict.set("BaseFont", _primitives.Name.get("PDFJS-FallbackFont"));
-    dict.set("Type", _primitives.Name.get("FallbackType"));
-    dict.set("Subtype", _primitives.Name.get("FallbackType"));
-    dict.set("Encoding", _primitives.Name.get("WinAnsiEncoding"));
-    return (0, _util.shadow)(this, "fallbackFontDict", dict);
+    width = width || this.defaultWidth;
+    return (0, _util.shadow)(this, "spaceWidth", width);
   }
 
-}
+  _charToGlyph(charcode, isSpace = false) {
+    let fontCharCode, width, operatorListId;
+    let widthCode = charcode;
 
-exports.PartialEvaluator = PartialEvaluator;
+    if (this.cMap && this.cMap.contains(charcode)) {
+      widthCode = this.cMap.lookup(charcode);
+    }
 
-class TranslatedFont {
-  constructor({
-    loadedName,
-    font,
-    dict,
-    extraProperties = false
-  }) {
-    this.loadedName = loadedName;
-    this.font = font;
-    this.dict = dict;
-    this._extraProperties = extraProperties;
-    this.type3Loaded = null;
-    this.type3Dependencies = font.isType3Font ? new Set() : null;
-    this.sent = false;
-  }
+    width = this.widths[widthCode];
+    width = (0, _util.isNum)(width) ? width : this.defaultWidth;
+    const vmetric = this.vmetrics && this.vmetrics[widthCode];
+    let unicode = this.toUnicode.get(charcode) || charcode;
 
-  send(handler) {
-    if (this.sent) {
-      return;
+    if (typeof unicode === "number") {
+      unicode = String.fromCharCode(unicode);
     }
 
-    this.sent = true;
-    handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._extraProperties)]);
-  }
+    let isInFont = this.toFontChar[charcode] !== undefined;
+    fontCharCode = this.toFontChar[charcode] || charcode;
 
-  fallback(handler) {
-    if (!this.font.data) {
-      return;
-    }
+    if (this.missingFile) {
+      const glyphName = this.differences[charcode] || this.defaultEncoding[charcode];
 
-    this.font.disableFontFace = true;
-    const glyphs = this.font.glyphCacheValues;
-    PartialEvaluator.buildFontPaths(this.font, glyphs, handler);
-  }
+      if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") {
+        fontCharCode = 0x20;
+      }
 
-  loadType3Data(evaluator, resources, task) {
-    if (this.type3Loaded) {
-      return this.type3Loaded;
+      fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);
     }
 
-    if (!this.font.isType3Font) {
-      throw new Error("Must be a Type3 font.");
+    if (this.isType3Font) {
+      operatorListId = fontCharCode;
     }
 
-    var type3Options = Object.create(evaluator.options);
-    type3Options.ignoreErrors = false;
-    var type3Evaluator = evaluator.clone(type3Options);
-    type3Evaluator.parsingType3Font = true;
-    const translatedFont = this.font,
-          type3Dependencies = this.type3Dependencies;
-    var loadCharProcsPromise = Promise.resolve();
-    var charProcs = this.dict.get("CharProcs");
-    var fontResources = this.dict.get("Resources") || resources;
-    var charProcOperatorList = Object.create(null);
+    let accent = null;
 
-    for (const key of charProcs.getKeys()) {
-      loadCharProcsPromise = loadCharProcsPromise.then(function () {
-        var glyphStream = charProcs.get(key);
-        var operatorList = new _operator_list.OperatorList();
-        return type3Evaluator.getOperatorList({
-          stream: glyphStream,
-          task,
-          resources: fontResources,
-          operatorList
-        }).then(function () {
-          charProcOperatorList[key] = operatorList.getIR();
+    if (this.seacMap && this.seacMap[charcode]) {
+      isInFont = true;
+      const seac = this.seacMap[charcode];
+      fontCharCode = seac.baseFontCharCode;
+      accent = {
+        fontChar: String.fromCodePoint(seac.accentFontCharCode),
+        offset: seac.accentOffset
+      };
+    }
 
-          for (const dependency of operatorList.dependencies) {
-            type3Dependencies.add(dependency);
-          }
-        }).catch(function (reason) {
-          (0, _util.warn)(`Type3 font resource "${key}" is not available.`);
-          const dummyOperatorList = new _operator_list.OperatorList();
-          charProcOperatorList[key] = dummyOperatorList.getIR();
-        });
-      });
+    let fontChar = "";
+
+    if (typeof fontCharCode === "number") {
+      if (fontCharCode <= 0x10ffff) {
+        fontChar = String.fromCodePoint(fontCharCode);
+      } else {
+        (0, _util.warn)(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);
+      }
     }
 
-    this.type3Loaded = loadCharProcsPromise.then(function () {
-      translatedFont.charProcOperatorList = charProcOperatorList;
-    });
-    return this.type3Loaded;
-  }
+    let glyph = this._glyphCache[charcode];
 
-}
+    if (!glyph || !glyph.matchesForCache(charcode, fontChar, unicode, accent, width, vmetric, 
operatorListId, isSpace, isInFont)) {
+      glyph = new Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, 
isInFont);
+      this._glyphCache[charcode] = glyph;
+    }
 
-class StateManager {
-  constructor(initialState) {
-    this.state = initialState;
-    this.stateStack = [];
+    return glyph;
   }
 
-  save() {
-    var old = this.state;
-    this.stateStack.push(this.state);
-    this.state = old.clone();
-  }
+  charsToGlyphs(chars) {
+    let glyphs = this._charsCache[chars];
 
-  restore() {
-    var prev = this.stateStack.pop();
+    if (glyphs) {
+      return glyphs;
+    }
 
-    if (prev) {
-      this.state = prev;
+    glyphs = [];
+
+    if (this.cMap) {
+      const c = Object.create(null),
+            ii = chars.length;
+      let i = 0;
+
+      while (i < ii) {
+        this.cMap.readCharCode(chars, i, c);
+        const {
+          charcode,
+          length
+        } = c;
+        i += length;
+
+        const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20);
+
+        glyphs.push(glyph);
+      }
+    } else {
+      for (let i = 0, ii = chars.length; i < ii; ++i) {
+        const charcode = chars.charCodeAt(i);
+
+        const glyph = this._charToGlyph(charcode, charcode === 0x20);
+
+        glyphs.push(glyph);
+      }
     }
-  }
 
-  transform(args) {
-    this.state.ctm = _util.Util.transform(this.state.ctm, args);
+    return this._charsCache[chars] = glyphs;
   }
 
-}
+  getCharPositions(chars) {
+    const positions = [];
 
-class TextState {
-  constructor() {
-    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
-    this.fontName = null;
-    this.fontSize = 0;
-    this.font = null;
-    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
-    this.textMatrix = _util.IDENTITY_MATRIX.slice();
-    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.leading = 0;
-    this.textHScale = 1;
-    this.textRise = 0;
-  }
+    if (this.cMap) {
+      const c = Object.create(null);
+      let i = 0;
 
-  setTextMatrix(a, b, c, d, e, f) {
-    var m = this.textMatrix;
-    m[0] = a;
-    m[1] = b;
-    m[2] = c;
-    m[3] = d;
-    m[4] = e;
-    m[5] = f;
-  }
+      while (i < chars.length) {
+        this.cMap.readCharCode(chars, i, c);
+        const length = c.length;
+        positions.push([i, i + length]);
+        i += length;
+      }
+    } else {
+      for (let i = 0, ii = chars.length; i < ii; ++i) {
+        positions.push([i, i + 1]);
+      }
+    }
 
-  setTextLineMatrix(a, b, c, d, e, f) {
-    var m = this.textLineMatrix;
-    m[0] = a;
-    m[1] = b;
-    m[2] = c;
-    m[3] = d;
-    m[4] = e;
-    m[5] = f;
+    return positions;
   }
 
-  translateTextMatrix(x, y) {
-    var m = this.textMatrix;
-    m[4] = m[0] * x + m[2] * y + m[4];
-    m[5] = m[1] * x + m[3] * y + m[5];
+  get glyphCacheValues() {
+    return Object.values(this._glyphCache);
   }
 
-  translateTextLineMatrix(x, y) {
-    var m = this.textLineMatrix;
-    m[4] = m[0] * x + m[2] * y + m[4];
-    m[5] = m[1] * x + m[3] * y + m[5];
-  }
+  encodeString(str) {
+    const buffers = [];
+    const currentBuf = [];
 
-  calcTextLineMatrixAdvance(a, b, c, d, e, f) {
-    var font = this.font;
+    const hasCurrentBufErrors = () => buffers.length % 2 === 1;
 
-    if (!font) {
-      return null;
-    }
+    for (let i = 0, ii = str.length; i < ii; i++) {
+      const unicode = str.codePointAt(i);
+
+      if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) {
+        i++;
+      }
 
-    var m = this.textLineMatrix;
+      if (this.toUnicode) {
+        const char = String.fromCodePoint(unicode);
+        const charCode = this.toUnicode.charCodeOf(char);
 
-    if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {
-      return null;
-    }
+        if (charCode !== -1) {
+          if (hasCurrentBufErrors()) {
+            buffers.push(currentBuf.join(""));
+            currentBuf.length = 0;
+          }
 
-    var txDiff = e - m[4],
-        tyDiff = f - m[5];
+          const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1;
 
-    if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {
-      return null;
-    }
+          for (let j = charCodeLength - 1; j >= 0; j--) {
+            currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff));
+          }
 
-    var tx,
-        ty,
-        denominator = a * d - b * c;
+          continue;
+        }
+      }
 
-    if (font.vertical) {
-      tx = -tyDiff * c / denominator;
-      ty = tyDiff * a / denominator;
-    } else {
-      tx = txDiff * d / denominator;
-      ty = -txDiff * b / denominator;
+      if (!hasCurrentBufErrors()) {
+        buffers.push(currentBuf.join(""));
+        currentBuf.length = 0;
+      }
+
+      currentBuf.push(String.fromCodePoint(unicode));
     }
 
-    return {
-      width: tx,
-      height: ty,
-      value: font.vertical ? ty : tx
-    };
+    buffers.push(currentBuf.join(""));
+    return buffers;
   }
 
-  calcRenderMatrix(ctm) {
-    var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];
-    return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));
-  }
+}
 
-  carriageReturn() {
-    this.translateTextLineMatrix(0, -this.leading);
-    this.textMatrix = this.textLineMatrix.slice();
-  }
+exports.Font = Font;
 
-  clone() {
-    var clone = Object.create(this);
-    clone.textMatrix = this.textMatrix.slice();
-    clone.textLineMatrix = this.textLineMatrix.slice();
-    clone.fontMatrix = this.fontMatrix.slice();
-    return clone;
+class ErrorFont {
+  constructor(error) {
+    this.error = error;
+    this.loadedName = "g_font_error";
+    this.missingFile = true;
   }
 
-}
+  charsToGlyphs() {
+    return [];
+  }
 
-class EvalState {
-  constructor() {
-    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
-    this.font = null;
-    this.textRenderingMode = _util.TextRenderingMode.FILL;
-    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
-    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
+  encodeString(chars) {
+    return [chars];
   }
 
-  clone() {
-    return Object.create(this);
+  exportData(extraProperties = false) {
+    return {
+      error: this.error
+    };
   }
 
 }
 
-class EvaluatorPreprocessor {
-  static get opMap() {
-    const getOPMap = (0, _core_utils.getLookupTableFactory)(function (t) {
-      t.w = {
-        id: _util.OPS.setLineWidth,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.J = {
-        id: _util.OPS.setLineCap,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.j = {
-        id: _util.OPS.setLineJoin,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.M = {
-        id: _util.OPS.setMiterLimit,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.d = {
-        id: _util.OPS.setDash,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.ri = {
-        id: _util.OPS.setRenderingIntent,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.i = {
-        id: _util.OPS.setFlatness,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.gs = {
-        id: _util.OPS.setGState,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.q = {
-        id: _util.OPS.save,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.Q = {
-        id: _util.OPS.restore,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.cm = {
-        id: _util.OPS.transform,
-        numArgs: 6,
-        variableArgs: false
-      };
-      t.m = {
-        id: _util.OPS.moveTo,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.l = {
-        id: _util.OPS.lineTo,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.c = {
-        id: _util.OPS.curveTo,
-        numArgs: 6,
-        variableArgs: false
-      };
-      t.v = {
-        id: _util.OPS.curveTo2,
-        numArgs: 4,
-        variableArgs: false
-      };
-      t.y = {
-        id: _util.OPS.curveTo3,
-        numArgs: 4,
-        variableArgs: false
-      };
-      t.h = {
-        id: _util.OPS.closePath,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.re = {
-        id: _util.OPS.rectangle,
-        numArgs: 4,
-        variableArgs: false
-      };
-      t.S = {
-        id: _util.OPS.stroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.s = {
-        id: _util.OPS.closeStroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.f = {
-        id: _util.OPS.fill,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.F = {
-        id: _util.OPS.fill,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t["f*"] = {
-        id: _util.OPS.eoFill,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.B = {
-        id: _util.OPS.fillStroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t["B*"] = {
-        id: _util.OPS.eoFillStroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.b = {
-        id: _util.OPS.closeFillStroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t["b*"] = {
-        id: _util.OPS.closeEOFillStroke,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.n = {
-        id: _util.OPS.endPath,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.W = {
-        id: _util.OPS.clip,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t["W*"] = {
-        id: _util.OPS.eoClip,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.BT = {
-        id: _util.OPS.beginText,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.ET = {
-        id: _util.OPS.endText,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.Tc = {
-        id: _util.OPS.setCharSpacing,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Tw = {
-        id: _util.OPS.setWordSpacing,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Tz = {
-        id: _util.OPS.setHScale,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.TL = {
-        id: _util.OPS.setLeading,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Tf = {
-        id: _util.OPS.setFont,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.Tr = {
-        id: _util.OPS.setTextRenderingMode,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Ts = {
-        id: _util.OPS.setTextRise,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Td = {
-        id: _util.OPS.moveText,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.TD = {
-        id: _util.OPS.setLeadingMoveText,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.Tm = {
-        id: _util.OPS.setTextMatrix,
-        numArgs: 6,
-        variableArgs: false
-      };
-      t["T*"] = {
-        id: _util.OPS.nextLine,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.Tj = {
-        id: _util.OPS.showText,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.TJ = {
-        id: _util.OPS.showSpacedText,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t["'"] = {
-        id: _util.OPS.nextLineShowText,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t['"'] = {
-        id: _util.OPS.nextLineSetSpacingShowText,
-        numArgs: 3,
-        variableArgs: false
-      };
-      t.d0 = {
-        id: _util.OPS.setCharWidth,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.d1 = {
-        id: _util.OPS.setCharWidthAndBounds,
-        numArgs: 6,
-        variableArgs: false
-      };
-      t.CS = {
-        id: _util.OPS.setStrokeColorSpace,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.cs = {
-        id: _util.OPS.setFillColorSpace,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.SC = {
-        id: _util.OPS.setStrokeColor,
-        numArgs: 4,
-        variableArgs: true
-      };
-      t.SCN = {
-        id: _util.OPS.setStrokeColorN,
-        numArgs: 33,
-        variableArgs: true
-      };
-      t.sc = {
-        id: _util.OPS.setFillColor,
-        numArgs: 4,
-        variableArgs: true
-      };
-      t.scn = {
-        id: _util.OPS.setFillColorN,
-        numArgs: 33,
-        variableArgs: true
-      };
-      t.G = {
-        id: _util.OPS.setStrokeGray,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.g = {
-        id: _util.OPS.setFillGray,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.RG = {
-        id: _util.OPS.setStrokeRGBColor,
-        numArgs: 3,
-        variableArgs: false
-      };
-      t.rg = {
-        id: _util.OPS.setFillRGBColor,
-        numArgs: 3,
-        variableArgs: false
-      };
-      t.K = {
-        id: _util.OPS.setStrokeCMYKColor,
-        numArgs: 4,
-        variableArgs: false
-      };
-      t.k = {
-        id: _util.OPS.setFillCMYKColor,
-        numArgs: 4,
-        variableArgs: false
-      };
-      t.sh = {
-        id: _util.OPS.shadingFill,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.BI = {
-        id: _util.OPS.beginInlineImage,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.ID = {
-        id: _util.OPS.beginImageData,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.EI = {
-        id: _util.OPS.endInlineImage,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.Do = {
-        id: _util.OPS.paintXObject,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.MP = {
-        id: _util.OPS.markPoint,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.DP = {
-        id: _util.OPS.markPointProps,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.BMC = {
-        id: _util.OPS.beginMarkedContent,
-        numArgs: 1,
-        variableArgs: false
-      };
-      t.BDC = {
-        id: _util.OPS.beginMarkedContentProps,
-        numArgs: 2,
-        variableArgs: false
-      };
-      t.EMC = {
-        id: _util.OPS.endMarkedContent,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.BX = {
-        id: _util.OPS.beginCompat,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.EX = {
-        id: _util.OPS.endCompat,
-        numArgs: 0,
-        variableArgs: false
-      };
-      t.BM = null;
-      t.BD = null;
-      t.true = null;
-      t.fa = null;
-      t.fal = null;
-      t.fals = null;
-      t.false = null;
-      t.nu = null;
-      t.nul = null;
-      t.null = null;
-    });
-    return (0, _util.shadow)(this, "opMap", getOPMap());
-  }
-
-  static get MAX_INVALID_PATH_OPS() {
-    return (0, _util.shadow)(this, "MAX_INVALID_PATH_OPS", 20);
-  }
-
-  constructor(stream, xref, stateManager) {
-    this.parser = new _parser.Parser({
-      lexer: new _parser.Lexer(stream, EvaluatorPreprocessor.opMap),
-      xref
-    });
-    this.stateManager = stateManager;
-    this.nonProcessedArgs = [];
-    this._numInvalidPathOPS = 0;
-  }
-
-  get savedStatesDepth() {
-    return this.stateManager.stateStack.length;
-  }
-
-  read(operation) {
-    var args = operation.args;
-
-    while (true) {
-      var obj = this.parser.getObj();
-
-      if (obj instanceof _primitives.Cmd) {
-        var cmd = obj.cmd;
-        var opSpec = EvaluatorPreprocessor.opMap[cmd];
-
-        if (!opSpec) {
-          (0, _util.warn)(`Unknown command "${cmd}".`);
-          continue;
-        }
-
-        var fn = opSpec.id;
-        var numArgs = opSpec.numArgs;
-        var argsLength = args !== null ? args.length : 0;
-
-        if (!opSpec.variableArgs) {
-          if (argsLength !== numArgs) {
-            var nonProcessedArgs = this.nonProcessedArgs;
-
-            while (argsLength > numArgs) {
-              nonProcessedArgs.push(args.shift());
-              argsLength--;
-            }
-
-            while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
-              if (args === null) {
-                args = [];
-              }
-
-              args.unshift(nonProcessedArgs.pop());
-              argsLength++;
-            }
-          }
-
-          if (argsLength < numArgs) {
-            const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} 
args.`;
-
-            if (fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath && ++this._numInvalidPathOPS > 
EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) {
-              throw new _util.FormatError(`Invalid ${partialMsg}`);
-            }
-
-            (0, _util.warn)(`Skipping ${partialMsg}`);
-
-            if (args !== null) {
-              args.length = 0;
-            }
-
-            continue;
-          }
-        } else if (argsLength > numArgs) {
-          (0, _util.info)(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} 
args.`);
-        }
-
-        this.preprocessCommand(fn, args);
-        operation.fn = fn;
-        operation.args = args;
-        return true;
-      }
-
-      if (obj === _primitives.EOF) {
-        return false;
-      }
-
-      if (obj !== null) {
-        if (args === null) {
-          args = [];
-        }
-
-        args.push(obj);
-
-        if (args.length > 33) {
-          throw new _util.FormatError("Too many arguments");
-        }
-      }
-    }
-  }
-
-  preprocessCommand(fn, args) {
-    switch (fn | 0) {
-      case _util.OPS.save:
-        this.stateManager.save();
-        break;
-
-      case _util.OPS.restore:
-        this.stateManager.restore();
-        break;
-
-      case _util.OPS.transform:
-        this.stateManager.transform(args);
-        break;
-    }
-  }
-
-}
+exports.ErrorFont = ErrorFont;
 
 /***/ }),
-/* 29 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 35 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.CMapFactory = exports.IdentityCMap = exports.CMap = void 0;
+}));
+exports.CFFTopDict = exports.CFFStrings = exports.CFFStandardStrings = exports.CFFPrivateDict = 
exports.CFFParser = exports.CFFIndex = exports.CFFHeader = exports.CFFFDSelect = exports.CFFCompiler = 
exports.CFFCharset = exports.CFF = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _primitives = __w_pdfjs_require__(5);
-
-var _parser = __w_pdfjs_require__(11);
-
-var _core_utils = __w_pdfjs_require__(8);
-
-var _stream = __w_pdfjs_require__(12);
-
-var BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", 
"78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", 
"83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", 
"Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", 
"Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", 
"Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", 
"Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", 
"B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", 
"ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", 
"Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-E
 UC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", 
"GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", 
"HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", 
"HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", 
"KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", 
"KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", 
"RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", 
"UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", 
"UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", 
"UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "
 UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", 
"UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", 
"UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", 
"UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", 
"UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"];
-const MAX_MAP_RANGE = 2 ** 24 - 1;
-
-class CMap {
-  constructor(builtInCMap = false) {
-    this.codespaceRanges = [[], [], [], []];
-    this.numCodespaceRanges = 0;
-    this._map = [];
-    this.name = "";
-    this.vertical = false;
-    this.useCMap = null;
-    this.builtInCMap = builtInCMap;
-  }
+var _charsets = __w_pdfjs_require__(36);
 
-  addCodespaceRange(n, low, high) {
-    this.codespaceRanges[n - 1].push(low, high);
-    this.numCodespaceRanges++;
-  }
+var _encodings = __w_pdfjs_require__(37);
 
-  mapCidRange(low, high, dstLow) {
-    if (high - low > MAX_MAP_RANGE) {
-      throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");
-    }
+const MAX_SUBR_NESTING = 10;
+const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", 
"currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", 
"endash", "dagger", "daggerdbl", "periodcentered", "parag
 raph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", 
"perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", 
"dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", 
"Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", 
"logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", 
"degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", 
"copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", 
"Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", 
"Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", 
"Yacute", "Ydieresis", "Zcaron", "aacute", "acirc
 umflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", 
"egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", 
"ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", 
"zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", 
"Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", 
"oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", 
"questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", 
"lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", 
"ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphen
 superior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", 
"Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", 
"Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", 
"Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", 
"Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", 
"Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", 
"seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", 
"sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", 
"threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", 
"nineinferior", "centinferior", "dollarinferior", "periodinfe
 rior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", 
"Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", 
"Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", 
"Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", 
"Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", 
"001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", 
"Semibold"];
+exports.CFFStandardStrings = CFFStandardStrings;
+const NUM_STANDARD_CFF_STRINGS = 391;
 
-    while (low <= high) {
-      this._map[low++] = dstLow++;
+const CFFParser = function CFFParserClosure() {
+  const CharstringValidationData = [null, {
+    id: "hstem",
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, null, {
+    id: "vstem",
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: "vmoveto",
+    min: 1,
+    stackClearing: true
+  }, {
+    id: "rlineto",
+    min: 2,
+    resetStack: true
+  }, {
+    id: "hlineto",
+    min: 1,
+    resetStack: true
+  }, {
+    id: "vlineto",
+    min: 1,
+    resetStack: true
+  }, {
+    id: "rrcurveto",
+    min: 6,
+    resetStack: true
+  }, null, {
+    id: "callsubr",
+    min: 1,
+    undefStack: true
+  }, {
+    id: "return",
+    min: 0,
+    undefStack: true
+  }, null, null, {
+    id: "endchar",
+    min: 0,
+    stackClearing: true
+  }, null, null, null, {
+    id: "hstemhm",
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: "hintmask",
+    min: 0,
+    stackClearing: true
+  }, {
+    id: "cntrmask",
+    min: 0,
+    stackClearing: true
+  }, {
+    id: "rmoveto",
+    min: 2,
+    stackClearing: true
+  }, {
+    id: "hmoveto",
+    min: 1,
+    stackClearing: true
+  }, {
+    id: "vstemhm",
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: "rcurveline",
+    min: 8,
+    resetStack: true
+  }, {
+    id: "rlinecurve",
+    min: 8,
+    resetStack: true
+  }, {
+    id: "vvcurveto",
+    min: 4,
+    resetStack: true
+  }, {
+    id: "hhcurveto",
+    min: 4,
+    resetStack: true
+  }, null, {
+    id: "callgsubr",
+    min: 1,
+    undefStack: true
+  }, {
+    id: "vhcurveto",
+    min: 4,
+    resetStack: true
+  }, {
+    id: "hvcurveto",
+    min: 4,
+    resetStack: true
+  }];
+  const CharstringValidationData12 = [null, null, null, {
+    id: "and",
+    min: 2,
+    stackDelta: -1
+  }, {
+    id: "or",
+    min: 2,
+    stackDelta: -1
+  }, {
+    id: "not",
+    min: 1,
+    stackDelta: 0
+  }, null, null, null, {
+    id: "abs",
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: "add",
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] + stack[index - 1];
     }
-  }
-
-  mapBfRange(low, high, dstLow) {
-    if (high - low > MAX_MAP_RANGE) {
-      throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");
+  }, {
+    id: "sub",
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] - stack[index - 1];
     }
-
-    var lastByte = dstLow.length - 1;
-
-    while (low <= high) {
-      this._map[low++] = dstLow;
-      dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
+  }, {
+    id: "div",
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] / stack[index - 1];
     }
-  }
+  }, null, {
+    id: "neg",
+    min: 1,
+    stackDelta: 0,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 1] = -stack[index - 1];
+    }
+  }, {
+    id: "eq",
+    min: 2,
+    stackDelta: -1
+  }, null, null, {
+    id: "drop",
+    min: 1,
+    stackDelta: -1
+  }, null, {
+    id: "put",
+    min: 2,
+    stackDelta: -2
+  }, {
+    id: "get",
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: "ifelse",
+    min: 4,
+    stackDelta: -3
+  }, {
+    id: "random",
+    min: 0,
+    stackDelta: 1
+  }, {
+    id: "mul",
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] * stack[index - 1];
+    }
+  }, null, {
+    id: "sqrt",
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: "dup",
+    min: 1,
+    stackDelta: 1
+  }, {
+    id: "exch",
+    min: 2,
+    stackDelta: 0
+  }, {
+    id: "index",
+    min: 2,
+    stackDelta: 0
+  }, {
+    id: "roll",
+    min: 3,
+    stackDelta: -2
+  }, null, null, null, {
+    id: "hflex",
+    min: 7,
+    resetStack: true
+  }, {
+    id: "flex",
+    min: 13,
+    resetStack: true
+  }, {
+    id: "hflex1",
+    min: 9,
+    resetStack: true
+  }, {
+    id: "flex1",
+    min: 11,
+    resetStack: true
+  }];
 
-  mapBfRangeToArray(low, high, array) {
-    if (high - low > MAX_MAP_RANGE) {
-      throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");
+  class CFFParser {
+    constructor(file, properties, seacAnalysisEnabled) {
+      this.bytes = file.getBytes();
+      this.properties = properties;
+      this.seacAnalysisEnabled = !!seacAnalysisEnabled;
     }
 
-    const ii = array.length;
-    let i = 0;
+    parse() {
+      const properties = this.properties;
+      const cff = new CFF();
+      this.cff = cff;
+      const header = this.parseHeader();
+      const nameIndex = this.parseIndex(header.endPos);
+      const topDictIndex = this.parseIndex(nameIndex.endPos);
+      const stringIndex = this.parseIndex(topDictIndex.endPos);
+      const globalSubrIndex = this.parseIndex(stringIndex.endPos);
+      const topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+      const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+      cff.header = header.obj;
+      cff.names = this.parseNameIndex(nameIndex.obj);
+      cff.strings = this.parseStringIndex(stringIndex.obj);
+      cff.topDict = topDict;
+      cff.globalSubrIndex = globalSubrIndex.obj;
+      this.parsePrivateDict(cff.topDict);
+      cff.isCIDFont = topDict.hasName("ROS");
+      const charStringOffset = topDict.getByName("CharStrings");
+      const charStringIndex = this.parseIndex(charStringOffset).obj;
+      const fontMatrix = topDict.getByName("FontMatrix");
 
-    while (low <= high && i < ii) {
-      this._map[low] = array[i++];
-      ++low;
-    }
-  }
+      if (fontMatrix) {
+        properties.fontMatrix = fontMatrix;
+      }
 
-  mapOne(src, dst) {
-    this._map[src] = dst;
-  }
+      const fontBBox = topDict.getByName("FontBBox");
 
-  lookup(code) {
-    return this._map[code];
-  }
+      if (fontBBox) {
+        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+        properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+        properties.ascentScaled = true;
+      }
 
-  contains(code) {
-    return this._map[code] !== undefined;
-  }
+      let charset, encoding;
 
-  forEach(callback) {
-    const map = this._map;
-    const length = map.length;
+      if (cff.isCIDFont) {
+        const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj;
 
-    if (length <= 0x10000) {
-      for (let i = 0; i < length; i++) {
-        if (map[i] !== undefined) {
-          callback(i, map[i]);
+        for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+          const dictRaw = fdArrayIndex.get(i);
+          const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
+          this.parsePrivateDict(fontDict);
+          cff.fdArray.push(fontDict);
         }
-      }
-    } else {
-      for (const i in map) {
-        callback(i, map[i]);
-      }
-    }
-  }
 
-  charCodeOf(value) {
-    const map = this._map;
+        encoding = null;
+        charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true);
+        cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count);
+      } else {
+        charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, 
false);
+        encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, 
charset.charset);
+      }
 
-    if (map.length <= 0x10000) {
-      return map.indexOf(value);
+      cff.charset = charset;
+      cff.encoding = encoding;
+      const charStringsAndSeacs = this.parseCharStrings({
+        charStrings: charStringIndex,
+        localSubrIndex: topDict.privateDict.subrsIndex,
+        globalSubrIndex: globalSubrIndex.obj,
+        fdSelect: cff.fdSelect,
+        fdArray: cff.fdArray,
+        privateDict: topDict.privateDict
+      });
+      cff.charStrings = charStringsAndSeacs.charStrings;
+      cff.seacs = charStringsAndSeacs.seacs;
+      cff.widths = charStringsAndSeacs.widths;
+      return cff;
     }
 
-    for (const charCode in map) {
-      if (map[charCode] === value) {
-        return charCode | 0;
+    parseHeader() {
+      let bytes = this.bytes;
+      const bytesLength = bytes.length;
+      let offset = 0;
+
+      while (offset < bytesLength && bytes[offset] !== 1) {
+        ++offset;
       }
-    }
 
-    return -1;
-  }
+      if (offset >= bytesLength) {
+        throw new _util.FormatError("Invalid CFF header");
+      }
 
-  getMap() {
-    return this._map;
-  }
+      if (offset !== 0) {
+        (0, _util.info)("cff data is shifted");
+        bytes = bytes.subarray(offset);
+        this.bytes = bytes;
+      }
 
-  readCharCode(str, offset, out) {
-    let c = 0;
-    const codespaceRanges = this.codespaceRanges;
+      const major = bytes[0];
+      const minor = bytes[1];
+      const hdrSize = bytes[2];
+      const offSize = bytes[3];
+      const header = new CFFHeader(major, minor, hdrSize, offSize);
+      return {
+        obj: header,
+        endPos: hdrSize
+      };
+    }
 
-    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
-      c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
-      const codespaceRange = codespaceRanges[n];
+    parseDict(dict) {
+      let pos = 0;
 
-      for (let k = 0, kk = codespaceRange.length; k < kk;) {
-        const low = codespaceRange[k++];
-        const high = codespaceRange[k++];
+      function parseOperand() {
+        let value = dict[pos++];
 
-        if (c >= low && c <= high) {
-          out.charcode = c;
-          out.length = n + 1;
-          return;
+        if (value === 30) {
+          return parseFloatOperand();
+        } else if (value === 28) {
+          value = dict[pos++];
+          value = (value << 24 | dict[pos++] << 16) >> 16;
+          return value;
+        } else if (value === 29) {
+          value = dict[pos++];
+          value = value << 8 | dict[pos++];
+          value = value << 8 | dict[pos++];
+          value = value << 8 | dict[pos++];
+          return value;
+        } else if (value >= 32 && value <= 246) {
+          return value - 139;
+        } else if (value >= 247 && value <= 250) {
+          return (value - 247) * 256 + dict[pos++] + 108;
+        } else if (value >= 251 && value <= 254) {
+          return -((value - 251) * 256) - dict[pos++] - 108;
         }
+
+        (0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.');
+        return NaN;
       }
-    }
 
-    out.charcode = 0;
-    out.length = 1;
-  }
+      function parseFloatOperand() {
+        let str = "";
+        const eof = 15;
+        const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"];
+        const length = dict.length;
 
-  get length() {
-    return this._map.length;
-  }
+        while (pos < length) {
+          const b = dict[pos++];
+          const b1 = b >> 4;
+          const b2 = b & 15;
 
-  get isIdentityCMap() {
-    if (!(this.name === "Identity-H" || this.name === "Identity-V")) {
-      return false;
-    }
+          if (b1 === eof) {
+            break;
+          }
 
-    if (this._map.length !== 0x10000) {
-      return false;
-    }
+          str += lookup[b1];
 
-    for (let i = 0; i < 0x10000; i++) {
-      if (this._map[i] !== i) {
-        return false;
-      }
-    }
+          if (b2 === eof) {
+            break;
+          }
 
-    return true;
-  }
+          str += lookup[b2];
+        }
 
-}
+        return parseFloat(str);
+      }
 
-exports.CMap = CMap;
+      let operands = [];
+      const entries = [];
+      pos = 0;
+      const end = dict.length;
 
-class IdentityCMap extends CMap {
-  constructor(vertical, n) {
-    super();
-    this.vertical = vertical;
-    this.addCodespaceRange(n, 0, 0xffff);
-  }
+      while (pos < end) {
+        let b = dict[pos];
 
-  mapCidRange(low, high, dstLow) {
-    (0, _util.unreachable)("should not call mapCidRange");
-  }
+        if (b <= 21) {
+          if (b === 12) {
+            b = b << 8 | dict[++pos];
+          }
 
-  mapBfRange(low, high, dstLow) {
-    (0, _util.unreachable)("should not call mapBfRange");
-  }
+          entries.push([b, operands]);
+          operands = [];
+          ++pos;
+        } else {
+          operands.push(parseOperand());
+        }
+      }
 
-  mapBfRangeToArray(low, high, array) {
-    (0, _util.unreachable)("should not call mapBfRangeToArray");
-  }
+      return entries;
+    }
 
-  mapOne(src, dst) {
-    (0, _util.unreachable)("should not call mapCidOne");
-  }
+    parseIndex(pos) {
+      const cffIndex = new CFFIndex();
+      const bytes = this.bytes;
+      const count = bytes[pos++] << 8 | bytes[pos++];
+      const offsets = [];
+      let end = pos;
+      let i, ii;
 
-  lookup(code) {
-    return Number.isInteger(code) && code <= 0xffff ? code : undefined;
-  }
+      if (count !== 0) {
+        const offsetSize = bytes[pos++];
+        const startPos = pos + (count + 1) * offsetSize - 1;
 
-  contains(code) {
-    return Number.isInteger(code) && code <= 0xffff;
-  }
+        for (i = 0, ii = count + 1; i < ii; ++i) {
+          let offset = 0;
 
-  forEach(callback) {
-    for (let i = 0; i <= 0xffff; i++) {
-      callback(i, i);
-    }
-  }
+          for (let j = 0; j < offsetSize; ++j) {
+            offset <<= 8;
+            offset += bytes[pos++];
+          }
 
-  charCodeOf(value) {
-    return Number.isInteger(value) && value <= 0xffff ? value : -1;
-  }
+          offsets.push(startPos + offset);
+        }
 
-  getMap() {
-    const map = new Array(0x10000);
+        end = offsets[count];
+      }
 
-    for (let i = 0; i <= 0xffff; i++) {
-      map[i] = i;
-    }
+      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
+        const offsetStart = offsets[i];
+        const offsetEnd = offsets[i + 1];
+        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+      }
 
-    return map;
-  }
+      return {
+        obj: cffIndex,
+        endPos: end
+      };
+    }
 
-  get length() {
-    return 0x10000;
-  }
+    parseNameIndex(index) {
+      const names = [];
 
-  get isIdentityCMap() {
-    (0, _util.unreachable)("should not access .isIdentityCMap");
-  }
+      for (let i = 0, ii = index.count; i < ii; ++i) {
+        const name = index.get(i);
+        names.push((0, _util.bytesToString)(name));
+      }
 
-}
+      return names;
+    }
 
-exports.IdentityCMap = IdentityCMap;
+    parseStringIndex(index) {
+      const strings = new CFFStrings();
 
-var BinaryCMapReader = function BinaryCMapReaderClosure() {
-  function hexToInt(a, size) {
-    var n = 0;
+      for (let i = 0, ii = index.count; i < ii; ++i) {
+        const data = index.get(i);
+        strings.add((0, _util.bytesToString)(data));
+      }
 
-    for (var i = 0; i <= size; i++) {
-      n = n << 8 | a[i];
+      return strings;
     }
 
-    return n >>> 0;
-  }
+    createDict(Type, dict, strings) {
+      const cffDict = new Type(strings);
 
-  function hexToStr(a, size) {
-    if (size === 1) {
-      return String.fromCharCode(a[0], a[1]);
-    }
+      for (let i = 0, ii = dict.length; i < ii; ++i) {
+        const pair = dict[i];
+        const key = pair[0];
+        const value = pair[1];
+        cffDict.setByKey(key, value);
+      }
 
-    if (size === 3) {
-      return String.fromCharCode(a[0], a[1], a[2], a[3]);
+      return cffDict;
     }
 
-    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
-  }
+    parseCharString(state, data, localSubrIndex, globalSubrIndex) {
+      if (!data || state.callDepth > MAX_SUBR_NESTING) {
+        return false;
+      }
 
-  function addHex(a, b, size) {
-    var c = 0;
+      let stackSize = state.stackSize;
+      const stack = state.stack;
+      const length = data.length;
 
-    for (var i = size; i >= 0; i--) {
-      c += a[i] + b[i];
-      a[i] = c & 255;
-      c >>= 8;
-    }
-  }
-
-  function incHex(a, size) {
-    var c = 1;
+      for (let j = 0; j < length;) {
+        const value = data[j++];
+        let validationCommand = null;
 
-    for (var i = size; i >= 0 && c > 0; i--) {
-      c += a[i];
-      a[i] = c & 255;
-      c >>= 8;
-    }
-  }
+        if (value === 12) {
+          const q = data[j++];
 
-  var MAX_NUM_SIZE = 16;
-  var MAX_ENCODED_NUM_SIZE = 19;
+          if (q === 0) {
+            data[j - 2] = 139;
+            data[j - 1] = 22;
+            stackSize = 0;
+          } else {
+            validationCommand = CharstringValidationData12[q];
+          }
+        } else if (value === 28) {
+          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;
+          j += 2;
+          stackSize++;
+        } else if (value === 14) {
+          if (stackSize >= 4) {
+            stackSize -= 4;
 
-  function BinaryCMapStream(data) {
-    this.buffer = data;
-    this.pos = 0;
-    this.end = data.length;
-    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
-  }
+            if (this.seacAnalysisEnabled) {
+              state.seac = stack.slice(stackSize, stackSize + 4);
+              return false;
+            }
+          }
 
-  BinaryCMapStream.prototype = {
-    readByte() {
-      if (this.pos >= this.end) {
-        return -1;
-      }
+          validationCommand = CharstringValidationData[value];
+        } else if (value >= 32 && value <= 246) {
+          stack[stackSize] = value - 139;
+          stackSize++;
+        } else if (value >= 247 && value <= 254) {
+          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - 
data[j] - 108;
+          j++;
+          stackSize++;
+        } else if (value === 255) {
+          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;
+          j += 4;
+          stackSize++;
+        } else if (value === 19 || value === 20) {
+          state.hints += stackSize >> 1;
+          j += state.hints + 7 >> 3;
+          stackSize %= 2;
+          validationCommand = CharstringValidationData[value];
+        } else if (value === 10 || value === 29) {
+          let subrsIndex;
 
-      return this.buffer[this.pos++];
-    },
+          if (value === 10) {
+            subrsIndex = localSubrIndex;
+          } else {
+            subrsIndex = globalSubrIndex;
+          }
 
-    readNumber() {
-      var n = 0;
-      var last;
+          if (!subrsIndex) {
+            validationCommand = CharstringValidationData[value];
+            (0, _util.warn)("Missing subrsIndex for " + validationCommand.id);
+            return false;
+          }
 
-      do {
-        var b = this.readByte();
+          let bias = 32768;
 
-        if (b < 0) {
-          throw new _util.FormatError("unexpected EOF in bcmap");
-        }
+          if (subrsIndex.count < 1240) {
+            bias = 107;
+          } else if (subrsIndex.count < 33900) {
+            bias = 1131;
+          }
 
-        last = !(b & 0x80);
-        n = n << 7 | b & 0x7f;
-      } while (!last);
+          const subrNumber = stack[--stackSize] + bias;
 
-      return n;
-    },
+          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
+            validationCommand = CharstringValidationData[value];
+            (0, _util.warn)("Out of bounds subrIndex for " + validationCommand.id);
+            return false;
+          }
 
-    readSigned() {
-      var n = this.readNumber();
-      return n & 1 ? ~(n >>> 1) : n >>> 1;
-    },
+          state.stackSize = stackSize;
+          state.callDepth++;
+          const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, 
globalSubrIndex);
 
-    readHex(num, size) {
-      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));
-      this.pos += size + 1;
-    },
+          if (!valid) {
+            return false;
+          }
 
-    readHexNumber(num, size) {
-      var last;
-      var stack = this.tmpBuf,
-          sp = 0;
+          state.callDepth--;
+          stackSize = state.stackSize;
+          continue;
+        } else if (value === 11) {
+          state.stackSize = stackSize;
+          return true;
+        } else if (value === 0 && j === data.length) {
+          data[j - 1] = 14;
+          validationCommand = CharstringValidationData[14];
+        } else {
+          validationCommand = CharstringValidationData[value];
+        }
 
-      do {
-        var b = this.readByte();
+        if (validationCommand) {
+          if (validationCommand.stem) {
+            state.hints += stackSize >> 1;
 
-        if (b < 0) {
-          throw new _util.FormatError("unexpected EOF in bcmap");
-        }
+            if (value === 3 || value === 23) {
+              state.hasVStems = true;
+            } else if (state.hasVStems && (value === 1 || value === 18)) {
+              (0, _util.warn)("CFF stem hints are in wrong order");
+              data[j - 1] = value === 1 ? 3 : 23;
+            }
+          }
 
-        last = !(b & 0x80);
-        stack[sp++] = b & 0x7f;
-      } while (!last);
+          if ("min" in validationCommand) {
+            if (!state.undefStack && stackSize < validationCommand.min) {
+              (0, _util.warn)("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize 
+ ", expected: " + validationCommand.min);
 
-      var i = size,
-          buffer = 0,
-          bufferSize = 0;
+              if (stackSize === 0) {
+                data[j - 1] = 14;
+                return true;
+              }
 
-      while (i >= 0) {
-        while (bufferSize < 8 && stack.length > 0) {
-          buffer = stack[--sp] << bufferSize | buffer;
-          bufferSize += 7;
-        }
+              return false;
+            }
+          }
 
-        num[i] = buffer & 255;
-        i--;
-        buffer >>= 8;
-        bufferSize -= 8;
-      }
-    },
+          if (state.firstStackClearing && validationCommand.stackClearing) {
+            state.firstStackClearing = false;
+            stackSize -= validationCommand.min;
 
-    readHexSigned(num, size) {
-      this.readHexNumber(num, size);
-      var sign = num[size] & 1 ? 255 : 0;
-      var c = 0;
+            if (stackSize >= 2 && validationCommand.stem) {
+              stackSize %= 2;
+            } else if (stackSize > 1) {
+              (0, _util.warn)("Found too many parameters for stack-clearing command");
+            }
 
-      for (var i = 0; i <= size; i++) {
-        c = (c & 1) << 8 | num[i];
-        num[i] = c >> 1 ^ sign;
-      }
-    },
+            if (stackSize > 0) {
+              state.width = stack[stackSize - 1];
+            }
+          }
 
-    readString() {
-      var len = this.readNumber();
-      var s = "";
+          if ("stackDelta" in validationCommand) {
+            if ("stackFn" in validationCommand) {
+              validationCommand.stackFn(stack, stackSize);
+            }
 
-      for (var i = 0; i < len; i++) {
-        s += String.fromCharCode(this.readNumber());
+            stackSize += validationCommand.stackDelta;
+          } else if (validationCommand.stackClearing) {
+            stackSize = 0;
+          } else if (validationCommand.resetStack) {
+            stackSize = 0;
+            state.undefStack = false;
+          } else if (validationCommand.undefStack) {
+            stackSize = 0;
+            state.undefStack = true;
+            state.firstStackClearing = false;
+          }
+        }
       }
 
-      return s;
+      state.stackSize = stackSize;
+      return true;
     }
 
-  };
+    parseCharStrings({
+      charStrings,
+      localSubrIndex,
+      globalSubrIndex,
+      fdSelect,
+      fdArray,
+      privateDict
+    }) {
+      const seacs = [];
+      const widths = [];
+      const count = charStrings.count;
 
-  function processBinaryCMap(data, cMap, extend) {
-    return new Promise(function (resolve, reject) {
-      var stream = new BinaryCMapStream(data);
-      var header = stream.readByte();
-      cMap.vertical = !!(header & 1);
-      var useCMap = null;
-      var start = new Uint8Array(MAX_NUM_SIZE);
-      var end = new Uint8Array(MAX_NUM_SIZE);
-      var char = new Uint8Array(MAX_NUM_SIZE);
-      var charCode = new Uint8Array(MAX_NUM_SIZE);
-      var tmp = new Uint8Array(MAX_NUM_SIZE);
-      var code;
-      var b;
+      for (let i = 0; i < count; i++) {
+        const charstring = charStrings.get(i);
+        const state = {
+          callDepth: 0,
+          stackSize: 0,
+          stack: [],
+          undefStack: true,
+          hints: 0,
+          firstStackClearing: true,
+          seac: null,
+          width: null,
+          hasVStems: false
+        };
+        let valid = true;
+        let localSubrToUse = null;
+        let privateDictToUse = privateDict;
 
-      while ((b = stream.readByte()) >= 0) {
-        var type = b >> 5;
+        if (fdSelect && fdArray.length) {
+          const fdIndex = fdSelect.getFDIndex(i);
 
-        if (type === 7) {
-          switch (b & 0x1f) {
-            case 0:
-              stream.readString();
-              break;
+          if (fdIndex === -1) {
+            (0, _util.warn)("Glyph index is not in fd select.");
+            valid = false;
+          }
 
-            case 1:
-              useCMap = stream.readString();
-              break;
+          if (fdIndex >= fdArray.length) {
+            (0, _util.warn)("Invalid fd index for glyph index.");
+            valid = false;
           }
 
-          continue;
+          if (valid) {
+            privateDictToUse = fdArray[fdIndex].privateDict;
+            localSubrToUse = privateDictToUse.subrsIndex;
+          }
+        } else if (localSubrIndex) {
+          localSubrToUse = localSubrIndex;
         }
 
-        var sequence = !!(b & 0x10);
-        var dataSize = b & 15;
+        if (valid) {
+          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
+        }
 
-        if (dataSize + 1 > MAX_NUM_SIZE) {
-          throw new Error("processBinaryCMap: Invalid dataSize.");
+        if (state.width !== null) {
+          const nominalWidth = privateDictToUse.getByName("nominalWidthX");
+          widths[i] = nominalWidth + state.width;
+        } else {
+          const defaultWidth = privateDictToUse.getByName("defaultWidthX");
+          widths[i] = defaultWidth;
         }
 
-        var ucs2DataSize = 1;
-        var subitemsCount = stream.readNumber();
-        var i;
+        if (state.seac !== null) {
+          seacs[i] = state.seac;
+        }
 
-        switch (type) {
-          case 0:
-            stream.readHex(start, dataSize);
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+        if (!valid) {
+          charStrings.set(i, new Uint8Array([14]));
+        }
+      }
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(end, dataSize);
-              stream.readHexNumber(start, dataSize);
-              addHex(start, end, dataSize);
-              stream.readHexNumber(end, dataSize);
-              addHex(end, start, dataSize);
-              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
-            }
+      return {
+        charStrings,
+        seacs,
+        widths
+      };
+    }
 
-            break;
+    emptyPrivateDictionary(parentDict) {
+      const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
+      parentDict.setByKey(18, [0, 0]);
+      parentDict.privateDict = privateDict;
+    }
 
-          case 1:
-            stream.readHex(start, dataSize);
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            stream.readNumber();
+    parsePrivateDict(parentDict) {
+      if (!parentDict.hasName("Private")) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(end, dataSize);
-              stream.readHexNumber(start, dataSize);
-              addHex(start, end, dataSize);
-              stream.readHexNumber(end, dataSize);
-              addHex(end, start, dataSize);
-              stream.readNumber();
-            }
+      const privateOffset = parentDict.getByName("Private");
 
-            break;
+      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
+        parentDict.removeByName("Private");
+        return;
+      }
 
-          case 2:
-            stream.readHex(char, dataSize);
-            code = stream.readNumber();
-            cMap.mapOne(hexToInt(char, dataSize), code);
+      const size = privateOffset[0];
+      const offset = privateOffset[1];
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(char, dataSize);
+      if (size === 0 || offset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
 
-              if (!sequence) {
-                stream.readHexNumber(tmp, dataSize);
-                addHex(char, tmp, dataSize);
-              }
+      const privateDictEnd = offset + size;
+      const dictData = this.bytes.subarray(offset, privateDictEnd);
+      const dict = this.parseDict(dictData);
+      const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
+      parentDict.privateDict = privateDict;
 
-              code = stream.readSigned() + (code + 1);
-              cMap.mapOne(hexToInt(char, dataSize), code);
-            }
+      if (!privateDict.getByName("Subrs")) {
+        return;
+      }
 
-            break;
+      const subrsOffset = privateDict.getByName("Subrs");
+      const relativeOffset = offset + subrsOffset;
 
-          case 3:
-            stream.readHex(start, dataSize);
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            code = stream.readNumber();
-            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(end, dataSize);
+      const subrsIndex = this.parseIndex(relativeOffset);
+      privateDict.subrsIndex = subrsIndex.obj;
+    }
 
-              if (!sequence) {
-                stream.readHexNumber(start, dataSize);
-                addHex(start, end, dataSize);
-              } else {
-                start.set(end);
-              }
+    parseCharsets(pos, length, strings, cid) {
+      if (pos === 0) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);
+      } else if (pos === 1) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);
+      } else if (pos === 2) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);
+      }
 
-              stream.readHexNumber(end, dataSize);
-              addHex(end, start, dataSize);
-              code = stream.readNumber();
-              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+      const bytes = this.bytes;
+      const start = pos;
+      const format = bytes[pos++];
+      const charset = [cid ? 0 : ".notdef"];
+      let id, count, i;
+      length -= 1;
+
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; i++) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            charset.push(cid ? id : strings.get(id));
+          }
+
+          break;
+
+        case 1:
+          while (charset.length <= length) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            count = bytes[pos++];
+
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
             }
+          }
 
-            break;
+          break;
 
-          case 4:
-            stream.readHex(char, ucs2DataSize);
-            stream.readHex(charCode, dataSize);
-            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+        case 2:
+          while (charset.length <= length) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            count = bytes[pos++] << 8 | bytes[pos++];
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(char, ucs2DataSize);
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
+            }
+          }
 
-              if (!sequence) {
-                stream.readHexNumber(tmp, ucs2DataSize);
-                addHex(char, tmp, ucs2DataSize);
-              }
+          break;
 
-              incHex(charCode, dataSize);
-              stream.readHexSigned(tmp, dataSize);
-              addHex(charCode, tmp, dataSize);
-              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+        default:
+          throw new _util.FormatError("Unknown charset format");
+      }
+
+      const end = pos;
+      const raw = bytes.subarray(start, end);
+      return new CFFCharset(false, format, charset, raw);
+    }
+
+    parseEncoding(pos, properties, strings, charset) {
+      const encoding = Object.create(null);
+      const bytes = this.bytes;
+      let predefined = false;
+      let format, i, ii;
+      let raw = null;
+
+      function readSupplement() {
+        const supplementsCount = bytes[pos++];
+
+        for (i = 0; i < supplementsCount; i++) {
+          const code = bytes[pos++];
+          const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+          encoding[code] = charset.indexOf(strings.get(sid));
+        }
+      }
+
+      if (pos === 0 || pos === 1) {
+        predefined = true;
+        format = pos;
+        const baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;
+
+        for (i = 0, ii = charset.length; i < ii; i++) {
+          const index = baseEncoding.indexOf(charset[i]);
+
+          if (index !== -1) {
+            encoding[index] = i;
+          }
+        }
+      } else {
+        const dataStart = pos;
+        format = bytes[pos++];
+
+        switch (format & 0x7f) {
+          case 0:
+            const glyphsCount = bytes[pos++];
+
+            for (i = 1; i <= glyphsCount; i++) {
+              encoding[bytes[pos++]] = i;
             }
 
             break;
 
-          case 5:
-            stream.readHex(start, ucs2DataSize);
-            stream.readHexNumber(end, ucs2DataSize);
-            addHex(end, start, ucs2DataSize);
-            stream.readHex(charCode, dataSize);
-            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, 
dataSize));
+          case 1:
+            const rangesCount = bytes[pos++];
+            let gid = 1;
 
-            for (i = 1; i < subitemsCount; i++) {
-              incHex(end, ucs2DataSize);
+            for (i = 0; i < rangesCount; i++) {
+              const start = bytes[pos++];
+              const left = bytes[pos++];
 
-              if (!sequence) {
-                stream.readHexNumber(start, ucs2DataSize);
-                addHex(start, end, ucs2DataSize);
-              } else {
-                start.set(end);
+              for (let j = start; j <= start + left; j++) {
+                encoding[j] = gid++;
               }
-
-              stream.readHexNumber(end, ucs2DataSize);
-              addHex(end, start, ucs2DataSize);
-              stream.readHex(charCode, dataSize);
-              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, 
dataSize));
             }
 
             break;
 
           default:
-            reject(new Error("processBinaryCMap: Unknown type: " + type));
-            return;
+            throw new _util.FormatError(`Unknown encoding format: ${format} in CFF`);
         }
-      }
 
-      if (useCMap) {
-        resolve(extend(useCMap));
-        return;
+        const dataEnd = pos;
+
+        if (format & 0x80) {
+          bytes[dataStart] &= 0x7f;
+          readSupplement();
+        }
+
+        raw = bytes.subarray(dataStart, dataEnd);
       }
 
-      resolve(cMap);
-    });
-  }
+      format &= 0x7f;
+      return new CFFEncoding(predefined, format, encoding, raw);
+    }
 
-  function BinaryCMapReader() {}
+    parseFDSelect(pos, length) {
+      const bytes = this.bytes;
+      const format = bytes[pos++];
+      const fdSelect = [];
+      let i;
 
-  BinaryCMapReader.prototype = {
-    process: processBinaryCMap
-  };
-  return BinaryCMapReader;
-}();
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; ++i) {
+            const id = bytes[pos++];
+            fdSelect.push(id);
+          }
 
-var CMapFactory = function CMapFactoryClosure() {
-  function strToInt(str) {
-    var a = 0;
+          break;
 
-    for (var i = 0; i < str.length; i++) {
-      a = a << 8 | str.charCodeAt(i);
-    }
+        case 3:
+          const rangesCount = bytes[pos++] << 8 | bytes[pos++];
 
-    return a >>> 0;
-  }
+          for (i = 0; i < rangesCount; ++i) {
+            let first = bytes[pos++] << 8 | bytes[pos++];
 
-  function expectString(obj) {
-    if (!(0, _util.isString)(obj)) {
-      throw new _util.FormatError("Malformed CMap: expected string.");
-    }
-  }
+            if (i === 0 && first !== 0) {
+              (0, _util.warn)("parseFDSelect: The first range must have a first GID of 0" + " -- trying to 
recover.");
+              first = 0;
+            }
 
-  function expectInt(obj) {
-    if (!Number.isInteger(obj)) {
-      throw new _util.FormatError("Malformed CMap: expected int.");
-    }
-  }
+            const fdIndex = bytes[pos++];
+            const next = bytes[pos] << 8 | bytes[pos + 1];
 
-  function parseBfChar(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
+            for (let j = first; j < next; ++j) {
+              fdSelect.push(fdIndex);
+            }
+          }
 
-      if ((0, _primitives.isEOF)(obj)) {
-        break;
+          pos += 2;
+          break;
+
+        default:
+          throw new _util.FormatError(`parseFDSelect: Unknown format "${format}".`);
       }
 
-      if ((0, _primitives.isCmd)(obj, "endbfchar")) {
-        return;
+      if (fdSelect.length !== length) {
+        throw new _util.FormatError("parseFDSelect: Invalid font data.");
       }
 
-      expectString(obj);
-      var src = strToInt(obj);
-      obj = lexer.getObj();
-      expectString(obj);
-      var dst = obj;
-      cMap.mapOne(src, dst);
+      return new CFFFDSelect(format, fdSelect);
     }
+
   }
 
-  function parseBfRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
+  return CFFParser;
+}();
 
-      if ((0, _primitives.isEOF)(obj)) {
-        break;
-      }
+exports.CFFParser = CFFParser;
 
-      if ((0, _primitives.isCmd)(obj, "endbfrange")) {
-        return;
-      }
+class CFF {
+  constructor() {
+    this.header = null;
+    this.names = [];
+    this.topDict = null;
+    this.strings = new CFFStrings();
+    this.globalSubrIndex = null;
+    this.encoding = null;
+    this.charset = null;
+    this.charStrings = null;
+    this.fdArray = [];
+    this.fdSelect = null;
+    this.isCIDFont = false;
+  }
 
-      expectString(obj);
-      var low = strToInt(obj);
-      obj = lexer.getObj();
-      expectString(obj);
-      var high = strToInt(obj);
-      obj = lexer.getObj();
+  duplicateFirstGlyph() {
+    if (this.charStrings.count >= 65535) {
+      (0, _util.warn)("Not enough space in charstrings to duplicate first glyph.");
+      return;
+    }
 
-      if (Number.isInteger(obj) || (0, _util.isString)(obj)) {
-        var dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
-        cMap.mapBfRange(low, high, dstLow);
-      } else if ((0, _primitives.isCmd)(obj, "[")) {
-        obj = lexer.getObj();
-        var array = [];
+    const glyphZero = this.charStrings.get(0);
+    this.charStrings.add(glyphZero);
 
-        while (!(0, _primitives.isCmd)(obj, "]") && !(0, _primitives.isEOF)(obj)) {
-          array.push(obj);
-          obj = lexer.getObj();
-        }
+    if (this.isCIDFont) {
+      this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
+    }
+  }
 
-        cMap.mapBfRangeToArray(low, high, array);
-      } else {
-        break;
-      }
+  hasGlyphId(id) {
+    if (id < 0 || id >= this.charStrings.count) {
+      return false;
     }
 
-    throw new _util.FormatError("Invalid bf range.");
+    const glyph = this.charStrings.get(id);
+    return glyph.length > 0;
   }
 
-  function parseCidChar(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-
-      if ((0, _primitives.isEOF)(obj)) {
-        break;
-      }
+}
 
-      if ((0, _primitives.isCmd)(obj, "endcidchar")) {
-        return;
-      }
+exports.CFF = CFF;
 
-      expectString(obj);
-      var src = strToInt(obj);
-      obj = lexer.getObj();
-      expectInt(obj);
-      var dst = obj;
-      cMap.mapOne(src, dst);
-    }
+class CFFHeader {
+  constructor(major, minor, hdrSize, offSize) {
+    this.major = major;
+    this.minor = minor;
+    this.hdrSize = hdrSize;
+    this.offSize = offSize;
   }
 
-  function parseCidRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-
-      if ((0, _primitives.isEOF)(obj)) {
-        break;
-      }
+}
 
-      if ((0, _primitives.isCmd)(obj, "endcidrange")) {
-        return;
-      }
+exports.CFFHeader = CFFHeader;
 
-      expectString(obj);
-      var low = strToInt(obj);
-      obj = lexer.getObj();
-      expectString(obj);
-      var high = strToInt(obj);
-      obj = lexer.getObj();
-      expectInt(obj);
-      var dstLow = obj;
-      cMap.mapCidRange(low, high, dstLow);
-    }
+class CFFStrings {
+  constructor() {
+    this.strings = [];
   }
 
-  function parseCodespaceRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
+  get(index) {
+    if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
+      return CFFStandardStrings[index];
+    }
 
-      if ((0, _primitives.isEOF)(obj)) {
-        break;
-      }
+    if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
+      return this.strings[index - NUM_STANDARD_CFF_STRINGS];
+    }
 
-      if ((0, _primitives.isCmd)(obj, "endcodespacerange")) {
-        return;
-      }
+    return CFFStandardStrings[0];
+  }
 
-      if (!(0, _util.isString)(obj)) {
-        break;
-      }
+  getSID(str) {
+    let index = CFFStandardStrings.indexOf(str);
 
-      var low = strToInt(obj);
-      obj = lexer.getObj();
+    if (index !== -1) {
+      return index;
+    }
 
-      if (!(0, _util.isString)(obj)) {
-        break;
-      }
+    index = this.strings.indexOf(str);
 
-      var high = strToInt(obj);
-      cMap.addCodespaceRange(obj.length, low, high);
+    if (index !== -1) {
+      return index + NUM_STANDARD_CFF_STRINGS;
     }
 
-    throw new _util.FormatError("Invalid codespace range.");
+    return -1;
   }
 
-  function parseWMode(cMap, lexer) {
-    var obj = lexer.getObj();
+  add(value) {
+    this.strings.push(value);
+  }
 
-    if (Number.isInteger(obj)) {
-      cMap.vertical = !!obj;
-    }
+  get count() {
+    return this.strings.length;
   }
 
-  function parseCMapName(cMap, lexer) {
-    var obj = lexer.getObj();
+}
 
-    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {
-      cMap.name = obj.name;
-    }
-  }
+exports.CFFStrings = CFFStrings;
 
-  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
-    var previous;
-    var embeddedUseCMap;
+class CFFIndex {
+  constructor() {
+    this.objects = [];
+    this.length = 0;
+  }
 
-    objLoop: while (true) {
-      try {
-        var obj = lexer.getObj();
+  add(data) {
+    this.length += data.length;
+    this.objects.push(data);
+  }
 
-        if ((0, _primitives.isEOF)(obj)) {
-          break;
-        } else if ((0, _primitives.isName)(obj)) {
-          if (obj.name === "WMode") {
-            parseWMode(cMap, lexer);
-          } else if (obj.name === "CMapName") {
-            parseCMapName(cMap, lexer);
-          }
+  set(index, data) {
+    this.length += data.length - this.objects[index].length;
+    this.objects[index] = data;
+  }
 
-          previous = obj;
-        } else if ((0, _primitives.isCmd)(obj)) {
-          switch (obj.cmd) {
-            case "endcmap":
-              break objLoop;
+  get(index) {
+    return this.objects[index];
+  }
 
-            case "usecmap":
-              if ((0, _primitives.isName)(previous)) {
-                embeddedUseCMap = previous.name;
-              }
+  get count() {
+    return this.objects.length;
+  }
 
-              break;
+}
 
-            case "begincodespacerange":
-              parseCodespaceRange(cMap, lexer);
-              break;
+exports.CFFIndex = CFFIndex;
 
-            case "beginbfchar":
-              parseBfChar(cMap, lexer);
-              break;
+class CFFDict {
+  constructor(tables, strings) {
+    this.keyToNameMap = tables.keyToNameMap;
+    this.nameToKeyMap = tables.nameToKeyMap;
+    this.defaults = tables.defaults;
+    this.types = tables.types;
+    this.opcodes = tables.opcodes;
+    this.order = tables.order;
+    this.strings = strings;
+    this.values = Object.create(null);
+  }
 
-            case "begincidchar":
-              parseCidChar(cMap, lexer);
-              break;
+  setByKey(key, value) {
+    if (!(key in this.keyToNameMap)) {
+      return false;
+    }
 
-            case "beginbfrange":
-              parseBfRange(cMap, lexer);
-              break;
+    const valueLength = value.length;
 
-            case "begincidrange":
-              parseCidRange(cMap, lexer);
-              break;
-          }
-        }
-      } catch (ex) {
-        if (ex instanceof _core_utils.MissingDataException) {
-          throw ex;
-        }
+    if (valueLength === 0) {
+      return true;
+    }
 
-        (0, _util.warn)("Invalid cMap data: " + ex);
-        continue;
+    for (let i = 0; i < valueLength; i++) {
+      if (isNaN(value[i])) {
+        (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
+        return true;
       }
     }
 
-    if (!useCMap && embeddedUseCMap) {
-      useCMap = embeddedUseCMap;
-    }
+    const type = this.types[key];
 
-    if (useCMap) {
-      return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+    if (type === "num" || type === "sid" || type === "offset") {
+      value = value[0];
     }
 
-    return Promise.resolve(cMap);
+    this.values[key] = value;
+    return true;
   }
 
-  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
-    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) {
-      cMap.useCMap = newCMap;
-
-      if (cMap.numCodespaceRanges === 0) {
-        var useCodespaceRanges = cMap.useCMap.codespaceRanges;
-
-        for (var i = 0; i < useCodespaceRanges.length; i++) {
-          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
-        }
+  setByName(name, value) {
+    if (!(name in this.nameToKeyMap)) {
+      throw new _util.FormatError(`Invalid dictionary name "${name}"`);
+    }
 
-        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
-      }
+    this.values[this.nameToKeyMap[name]] = value;
+  }
 
-      cMap.useCMap.forEach(function (key, value) {
-        if (!cMap.contains(key)) {
-          cMap.mapOne(key, cMap.useCMap.lookup(key));
-        }
-      });
-      return cMap;
-    });
+  hasName(name) {
+    return this.nameToKeyMap[name] in this.values;
   }
 
-  function createBuiltInCMap(name, fetchBuiltInCMap) {
-    if (name === "Identity-H") {
-      return Promise.resolve(new IdentityCMap(false, 2));
-    } else if (name === "Identity-V") {
-      return Promise.resolve(new IdentityCMap(true, 2));
+  getByName(name) {
+    if (!(name in this.nameToKeyMap)) {
+      throw new _util.FormatError(`Invalid dictionary name ${name}"`);
     }
 
-    if (!BUILT_IN_CMAPS.includes(name)) {
-      return Promise.reject(new Error("Unknown CMap name: " + name));
-    }
+    const key = this.nameToKeyMap[name];
 
-    if (!fetchBuiltInCMap) {
-      return Promise.reject(new Error("Built-in CMap parameters are not provided."));
+    if (!(key in this.values)) {
+      return this.defaults[key];
     }
 
-    return fetchBuiltInCMap(name).then(function (data) {
-      var cMapData = data.cMapData,
-          compressionType = data.compressionType;
-      var cMap = new CMap(true);
-
-      if (compressionType === _util.CMapCompressionType.BINARY) {
-        return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) {
-          return extendCMap(cMap, fetchBuiltInCMap, useCMap);
-        });
-      }
-
-      if (compressionType === _util.CMapCompressionType.NONE) {
-        var lexer = new _parser.Lexer(new _stream.Stream(cMapData));
-        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
-      }
-
-      return Promise.reject(new Error("TODO: Only BINARY/NONE CMap compression is currently supported."));
-    });
+    return this.values[key];
   }
 
-  return {
-    async create(params) {
-      var encoding = params.encoding;
-      var fetchBuiltInCMap = params.fetchBuiltInCMap;
-      var useCMap = params.useCMap;
-
-      if ((0, _primitives.isName)(encoding)) {
-        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
-      } else if ((0, _primitives.isStream)(encoding)) {
-        var cMap = new CMap();
-        var lexer = new _parser.Lexer(encoding);
-        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) {
-          if (parsedCMap.isIdentityCMap) {
-            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
-          }
+  removeByName(name) {
+    delete this.values[this.nameToKeyMap[name]];
+  }
 
-          return parsedCMap;
-        });
-      }
+  static createTables(layout) {
+    const tables = {
+      keyToNameMap: {},
+      nameToKeyMap: {},
+      defaults: {},
+      types: {},
+      opcodes: {},
+      order: []
+    };
 
-      throw new Error("Encoding required.");
+    for (let i = 0, ii = layout.length; i < ii; ++i) {
+      const entry = layout[i];
+      const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+      tables.keyToNameMap[key] = entry[1];
+      tables.nameToKeyMap[entry[1]] = key;
+      tables.types[key] = entry[2];
+      tables.defaults[key] = entry[3];
+      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
+      tables.order.push(key);
     }
 
-  };
-}();
-
-exports.CMapFactory = CMapFactory;
-
-/***/ }),
-/* 30 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getFontType = getFontType;
-exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = 
exports.SEAC_ANALYSIS_ENABLED = void 0;
-
-var _util = __w_pdfjs_require__(2);
-
-var _cff_parser = __w_pdfjs_require__(31);
+    return tables;
+  }
 
-var _glyphlist = __w_pdfjs_require__(34);
+}
 
-var _encodings = __w_pdfjs_require__(33);
+const CFFTopDict = function CFFTopDictClosure() {
+  const layout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], 
[0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", 
"sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 
0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], 
"UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], 
[[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, 
"UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], 
"StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", 
"offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], 
"PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", nul
 l], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], 
"CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 
35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], 
[[12, 38], "FontName", "sid", null]];
+  let tables = null;
 
-var _standard_fonts = __w_pdfjs_require__(35);
+  class CFFTopDict extends CFFDict {
+    constructor(strings) {
+      if (tables === null) {
+        tables = CFFDict.createTables(layout);
+      }
 
-var _unicode = __w_pdfjs_require__(36);
+      super(tables, strings);
+      this.privateDict = null;
+    }
 
-var _core_utils = __w_pdfjs_require__(8);
+  }
 
-var _font_renderer = __w_pdfjs_require__(37);
+  return CFFTopDict;
+}();
 
-var _cmap = __w_pdfjs_require__(29);
+exports.CFFTopDict = CFFTopDict;
 
-var _stream = __w_pdfjs_require__(12);
+const CFFPrivateDict = function CFFPrivateDictClosure() {
+  const layout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", 
"delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], 
"BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", 
null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], 
"ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], 
[[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], 
[19, "Subrs", "offset", null]];
+  let tables = null;
 
-var _type1_parser = __w_pdfjs_require__(38);
+  class CFFPrivateDict extends CFFDict {
+    constructor(strings) {
+      if (tables === null) {
+        tables = CFFDict.createTables(layout);
+      }
 
-const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]];
-var PDF_GLYPH_SPACE_UNITS = 1000;
-var SEAC_ANALYSIS_ENABLED = true;
-exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;
-const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", 
"data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "fontType", 
"isMonospace", "isSerifFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", 
"remeasure", "subtype", "type", "vertical"];
-const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isSymbolicFont", "seacMap", 
"toFontChar", "toUnicode", "vmetrics", "widths"];
-var FontFlags = {
-  FixedPitch: 1,
-  Serif: 2,
-  Symbolic: 4,
-  Script: 8,
-  Nonsymbolic: 32,
-  Italic: 64,
-  AllCap: 65536,
-  SmallCap: 131072,
-  ForceBold: 262144
-};
-exports.FontFlags = FontFlags;
-var MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", 
"numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", 
"comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", 
"nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", 
"G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
"bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", 
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
"braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", 
"Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", 
"eacute", "egrave", "ecircumflex", "edieresis", "
 iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", 
"otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", 
"bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", 
"AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", 
"summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", 
"questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", 
"guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", 
"emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", 
"Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", 
"periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "
 Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", 
"Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", 
"circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", 
"Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", 
"Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", 
"onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", 
"cacute", "Ccaron", "ccaron", "dcroat"];
+      super(tables, strings);
+      this.subrsIndex = null;
+    }
 
-function adjustWidths(properties) {
-  if (!properties.fontMatrix) {
-    return;
   }
 
-  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {
-    return;
-  }
+  return CFFPrivateDict;
+}();
 
-  var scale = 0.001 / properties.fontMatrix[0];
-  var glyphsWidths = properties.widths;
+exports.CFFPrivateDict = CFFPrivateDict;
+const CFFCharsetPredefinedTypes = {
+  ISO_ADOBE: 0,
+  EXPERT: 1,
+  EXPERT_SUBSET: 2
+};
 
-  for (var glyph in glyphsWidths) {
-    glyphsWidths[glyph] *= scale;
+class CFFCharset {
+  constructor(predefined, format, charset, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.charset = charset;
+    this.raw = raw;
   }
 
-  properties.defaultWidth *= scale;
 }
 
-function adjustToUnicode(properties, builtInEncoding) {
-  if (properties.hasIncludedToUnicodeMap) {
-    return;
-  }
+exports.CFFCharset = CFFCharset;
 
-  if (properties.hasEncoding) {
-    return;
+class CFFEncoding {
+  constructor(predefined, format, encoding, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.encoding = encoding;
+    this.raw = raw;
   }
 
-  if (builtInEncoding === properties.defaultEncoding) {
-    return;
-  }
+}
 
-  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
-    return;
+class CFFFDSelect {
+  constructor(format, fdSelect) {
+    this.format = format;
+    this.fdSelect = fdSelect;
   }
 
-  var toUnicode = [],
-      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
-
-  for (var charCode in builtInEncoding) {
-    var glyphName = builtInEncoding[charCode];
-    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
-
-    if (unicode !== -1) {
-      toUnicode[charCode] = String.fromCharCode(unicode);
+  getFDIndex(glyphIndex) {
+    if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
+      return -1;
     }
+
+    return this.fdSelect[glyphIndex];
   }
 
-  properties.toUnicode.amend(toUnicode);
 }
 
-function getFontType(type, subtype) {
-  switch (type) {
-    case "Type1":
-      return subtype === "Type1C" ? _util.FontType.TYPE1C : _util.FontType.TYPE1;
-
-    case "CIDFontType0":
-      return subtype === "CIDFontType0C" ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;
-
-    case "OpenType":
-      return _util.FontType.OPENTYPE;
-
-    case "TrueType":
-      return _util.FontType.TRUETYPE;
+exports.CFFFDSelect = CFFFDSelect;
 
-    case "CIDFontType2":
-      return _util.FontType.CIDFONTTYPE2;
+class CFFOffsetTracker {
+  constructor() {
+    this.offsets = Object.create(null);
+  }
 
-    case "MMType1":
-      return _util.FontType.MMTYPE1;
+  isTracking(key) {
+    return key in this.offsets;
+  }
 
-    case "Type0":
-      return _util.FontType.TYPE0;
+  track(key, location) {
+    if (key in this.offsets) {
+      throw new _util.FormatError(`Already tracking location of ${key}`);
+    }
 
-    default:
-      return _util.FontType.UNKNOWN;
+    this.offsets[key] = location;
   }
-}
 
-function recoverGlyphName(name, glyphsUnicodeMap) {
-  if (glyphsUnicodeMap[name] !== undefined) {
-    return name;
+  offset(value) {
+    for (const key in this.offsets) {
+      this.offsets[key] += value;
+    }
   }
 
-  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);
+  setEntryLocation(key, values, output) {
+    if (!(key in this.offsets)) {
+      throw new _util.FormatError(`Not tracking location of ${key}`);
+    }
+
+    const data = output.data;
+    const dataOffset = this.offsets[key];
+    const size = 5;
 
-  if (unicode !== -1) {
-    for (var key in glyphsUnicodeMap) {
-      if (glyphsUnicodeMap[key] === unicode) {
-        return key;
+    for (let i = 0, ii = values.length; i < ii; ++i) {
+      const offset0 = i * size + dataOffset;
+      const offset1 = offset0 + 1;
+      const offset2 = offset0 + 2;
+      const offset3 = offset0 + 3;
+      const offset4 = offset0 + 4;
+
+      if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || 
data[offset4] !== 0) {
+        throw new _util.FormatError("writing to an offset that is not empty");
       }
+
+      const value = values[i];
+      data[offset0] = 0x1d;
+      data[offset1] = value >> 24 & 0xff;
+      data[offset2] = value >> 16 & 0xff;
+      data[offset3] = value >> 8 & 0xff;
+      data[offset4] = value & 0xff;
     }
   }
 
-  (0, _util.info)("Unable to recover a standard glyph name for: " + name);
-  return name;
 }
 
-var Glyph = function GlyphClosure() {
-  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
-    this.fontChar = fontChar;
-    this.unicode = unicode;
-    this.accent = accent;
-    this.width = width;
-    this.vmetric = vmetric;
-    this.operatorListId = operatorListId;
-    this.isSpace = isSpace;
-    this.isInFont = isInFont;
-  }
-
-  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, 
isSpace, isInFont) {
-    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width 
=== width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace 
&& this.isInFont === isInFont;
-  };
-
-  return Glyph;
-}();
-
-var ToUnicodeMap = function ToUnicodeMapClosure() {
-  function ToUnicodeMap(cmap = []) {
-    this._map = cmap;
+class CFFCompiler {
+  constructor(cff) {
+    this.cff = cff;
   }
 
-  ToUnicodeMap.prototype = {
-    get length() {
-      return this._map.length;
-    },
-
-    forEach(callback) {
-      for (var charCode in this._map) {
-        callback(charCode, this._map[charCode].charCodeAt(0));
+  compile() {
+    const cff = this.cff;
+    const output = {
+      data: [],
+      length: 0,
+      add: function CFFCompiler_add(data) {
+        this.data = this.data.concat(data);
+        this.length = this.data.length;
       }
-    },
-
-    has(i) {
-      return this._map[i] !== undefined;
-    },
+    };
+    const header = this.compileHeader(cff.header);
+    output.add(header);
+    const nameIndex = this.compileNameIndex(cff.names);
+    output.add(nameIndex);
 
-    get(i) {
-      return this._map[i];
-    },
+    if (cff.isCIDFont) {
+      if (cff.topDict.hasName("FontMatrix")) {
+        const base = cff.topDict.getByName("FontMatrix");
+        cff.topDict.removeByName("FontMatrix");
 
-    charCodeOf(value) {
-      const map = this._map;
+        for (let i = 0, ii = cff.fdArray.length; i < ii; i++) {
+          const subDict = cff.fdArray[i];
+          let matrix = base.slice(0);
 
-      if (map.length <= 0x10000) {
-        return map.indexOf(value);
-      }
+          if (subDict.hasName("FontMatrix")) {
+            matrix = _util.Util.transform(matrix, subDict.getByName("FontMatrix"));
+          }
 
-      for (const charCode in map) {
-        if (map[charCode] === value) {
-          return charCode | 0;
+          subDict.setByName("FontMatrix", matrix);
         }
       }
+    }
 
-      return -1;
-    },
+    const xuid = cff.topDict.getByName("XUID");
 
-    amend(map) {
-      for (var charCode in map) {
-        this._map[charCode] = map[charCode];
-      }
+    if (xuid && xuid.length > 16) {
+      cff.topDict.removeByName("XUID");
     }
 
-  };
-  return ToUnicodeMap;
-}();
-
-exports.ToUnicodeMap = ToUnicodeMap;
-
-var IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {
-  function IdentityToUnicodeMap(firstChar, lastChar) {
-    this.firstChar = firstChar;
-    this.lastChar = lastChar;
-  }
-
-  IdentityToUnicodeMap.prototype = {
-    get length() {
-      return this.lastChar + 1 - this.firstChar;
-    },
-
-    forEach(callback) {
-      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
-        callback(i, i);
-      }
-    },
-
-    has(i) {
-      return this.firstChar <= i && i <= this.lastChar;
-    },
+    cff.topDict.setByName("charset", 0);
+    let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
+    output.add(compiled.output);
+    const topDictTracker = compiled.trackers[0];
+    const stringIndex = this.compileStringIndex(cff.strings.strings);
+    output.add(stringIndex);
+    const globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+    output.add(globalSubrIndex);
 
-    get(i) {
-      if (this.firstChar <= i && i <= this.lastChar) {
-        return String.fromCharCode(i);
+    if (cff.encoding && cff.topDict.hasName("Encoding")) {
+      if (cff.encoding.predefined) {
+        topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
+      } else {
+        const encoding = this.compileEncoding(cff.encoding);
+        topDictTracker.setEntryLocation("Encoding", [output.length], output);
+        output.add(encoding);
       }
-
-      return undefined;
-    },
-
-    charCodeOf(v) {
-      return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
-    },
-
-    amend(map) {
-      (0, _util.unreachable)("Should not call amend()");
     }
 
-  };
-  return IdentityToUnicodeMap;
-}();
-
-exports.IdentityToUnicodeMap = IdentityToUnicodeMap;
-
-var OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {
-  function writeInt16(dest, offset, num) {
-    dest[offset] = num >> 8 & 0xff;
-    dest[offset + 1] = num & 0xff;
-  }
-
-  function writeInt32(dest, offset, num) {
-    dest[offset] = num >> 24 & 0xff;
-    dest[offset + 1] = num >> 16 & 0xff;
-    dest[offset + 2] = num >> 8 & 0xff;
-    dest[offset + 3] = num & 0xff;
-  }
-
-  function writeData(dest, offset, data) {
-    var i, ii;
+    const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
+    topDictTracker.setEntryLocation("charset", [output.length], output);
+    output.add(charset);
+    const charStrings = this.compileCharStrings(cff.charStrings);
+    topDictTracker.setEntryLocation("CharStrings", [output.length], output);
+    output.add(charStrings);
 
-    if (data instanceof Uint8Array) {
-      dest.set(data, offset);
-    } else if (typeof data === "string") {
-      for (i = 0, ii = data.length; i < ii; i++) {
-        dest[offset++] = data.charCodeAt(i) & 0xff;
-      }
-    } else {
-      for (i = 0, ii = data.length; i < ii; i++) {
-        dest[offset++] = data[i] & 0xff;
-      }
+    if (cff.isCIDFont) {
+      topDictTracker.setEntryLocation("FDSelect", [output.length], output);
+      const fdSelect = this.compileFDSelect(cff.fdSelect);
+      output.add(fdSelect);
+      compiled = this.compileTopDicts(cff.fdArray, output.length, true);
+      topDictTracker.setEntryLocation("FDArray", [output.length], output);
+      output.add(compiled.output);
+      const fontDictTrackers = compiled.trackers;
+      this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
     }
-  }
 
-  function OpenTypeFileBuilder(sfnt) {
-    this.sfnt = sfnt;
-    this.tables = Object.create(null);
+    this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+    output.add([0]);
+    return output.data;
   }
 
-  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, 
entrySize) {
-    var maxPower2 = 1,
-        log2 = 0;
-
-    while ((maxPower2 ^ entriesCount) > maxPower2) {
-      maxPower2 <<= 1;
-      log2++;
-    }
-
-    var searchRange = maxPower2 * entrySize;
-    return {
-      range: searchRange,
-      entry: log2,
-      rangeShift: entrySize * entriesCount - searchRange
-    };
-  };
-
-  var OTF_HEADER_SIZE = 12;
-  var OTF_TABLE_ENTRY_SIZE = 16;
-  OpenTypeFileBuilder.prototype = {
-    toArray: function OpenTypeFileBuilder_toArray() {
-      var sfnt = this.sfnt;
-      var tables = this.tables;
-      var tablesNames = Object.keys(tables);
-      tablesNames.sort();
-      var numTables = tablesNames.length;
-      var i, j, jj, table, tableName;
-      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
-      var tableOffsets = [offset];
-
-      for (i = 0; i < numTables; i++) {
-        table = tables[tablesNames[i]];
-        var paddedLength = (table.length + 3 & ~3) >>> 0;
-        offset += paddedLength;
-        tableOffsets.push(offset);
-      }
-
-      var file = new Uint8Array(offset);
-
-      for (i = 0; i < numTables; i++) {
-        table = tables[tablesNames[i]];
-        writeData(file, tableOffsets[i], table);
-      }
-
-      if (sfnt === "true") {
-        sfnt = (0, _util.string32)(0x00010000);
-      }
-
-      file[0] = sfnt.charCodeAt(0) & 0xff;
-      file[1] = sfnt.charCodeAt(1) & 0xff;
-      file[2] = sfnt.charCodeAt(2) & 0xff;
-      file[3] = sfnt.charCodeAt(3) & 0xff;
-      writeInt16(file, 4, numTables);
-      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
-      writeInt16(file, 6, searchParams.range);
-      writeInt16(file, 8, searchParams.entry);
-      writeInt16(file, 10, searchParams.rangeShift);
-      offset = OTF_HEADER_SIZE;
-
-      for (i = 0; i < numTables; i++) {
-        tableName = tablesNames[i];
-        file[offset] = tableName.charCodeAt(0) & 0xff;
-        file[offset + 1] = tableName.charCodeAt(1) & 0xff;
-        file[offset + 2] = tableName.charCodeAt(2) & 0xff;
-        file[offset + 3] = tableName.charCodeAt(3) & 0xff;
-        var checksum = 0;
-
-        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
-          var quad = (0, _core_utils.readUint32)(file, j);
-          checksum = checksum + quad >>> 0;
-        }
-
-        writeInt32(file, offset + 4, checksum);
-        writeInt32(file, offset + 8, tableOffsets[i]);
-        writeInt32(file, offset + 12, tables[tableName].length);
-        offset += OTF_TABLE_ENTRY_SIZE;
-      }
-
-      return file;
-    },
-    addTable: function OpenTypeFileBuilder_addTable(tag, data) {
-      if (tag in this.tables) {
-        throw new Error("Table " + tag + " already exists");
-      }
-
-      this.tables[tag] = data;
+  encodeNumber(value) {
+    if (Number.isInteger(value)) {
+      return this.encodeInteger(value);
     }
-  };
-  return OpenTypeFileBuilder;
-}();
 
-var Font = function FontClosure() {
-  function Font(name, file, properties) {
-    var charCode;
-    this.name = name;
-    this.loadedName = properties.loadedName;
-    this.isType3Font = properties.isType3Font;
-    this.missingFile = false;
-    this.glyphCache = Object.create(null);
-    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
-    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
-    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
-    var type = properties.type;
-    var subtype = properties.subtype;
-    this.type = type;
-    this.subtype = subtype;
-    let fallbackName = "sans-serif";
-
-    if (this.isMonospace) {
-      fallbackName = "monospace";
-    } else if (this.isSerifFont) {
-      fallbackName = "serif";
-    }
+    return this.encodeFloat(value);
+  }
 
-    this.fallbackName = fallbackName;
-    this.differences = properties.differences;
-    this.widths = properties.widths;
-    this.defaultWidth = properties.defaultWidth;
-    this.composite = properties.composite;
-    this.cMap = properties.cMap;
-    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
-    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
-    this.fontMatrix = properties.fontMatrix;
-    this.bbox = properties.bbox;
-    this.defaultEncoding = properties.defaultEncoding;
-    this.toUnicode = properties.toUnicode;
-    this.fallbackToUnicode = properties.fallbackToUnicode || new ToUnicodeMap();
-    this.toFontChar = [];
+  static get EncodeFloatRegExp() {
+    return (0, _util.shadow)(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/);
+  }
 
-    if (properties.type === "Type3") {
-      for (charCode = 0; charCode < 256; charCode++) {
-        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
-      }
+  encodeFloat(num) {
+    let value = num.toString();
+    const m = CFFCompiler.EncodeFloatRegExp.exec(value);
 
-      this.fontType = _util.FontType.TYPE3;
-      return;
+    if (m) {
+      const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
+      value = (Math.round(num * epsilon) / epsilon).toString();
     }
 
-    this.cidEncoding = properties.cidEncoding;
-    this.vertical = !!properties.vertical;
+    let nibbles = "";
+    let i, ii;
 
-    if (this.vertical) {
-      this.vmetrics = properties.vmetrics;
-      this.defaultVMetrics = properties.defaultVMetrics;
-    }
+    for (i = 0, ii = value.length; i < ii; ++i) {
+      const a = value[i];
 
-    if (!file || file.isEmpty) {
-      if (file) {
-        (0, _util.warn)('Font file is empty in "' + name + '" (' + this.loadedName + ")");
+      if (a === "e") {
+        nibbles += value[++i] === "-" ? "c" : "b";
+      } else if (a === ".") {
+        nibbles += "a";
+      } else if (a === "-") {
+        nibbles += "e";
+      } else {
+        nibbles += a;
       }
-
-      this.fallbackToSystemFont();
-      return;
     }
 
-    [type, subtype] = getFontFileType(file, properties);
+    nibbles += nibbles.length & 1 ? "f" : "ff";
+    const out = [30];
 
-    if (type !== this.type || subtype !== this.subtype) {
-      (0, _util.info)("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but 
found: ${type}/${subtype}.`);
+    for (i = 0, ii = nibbles.length; i < ii; i += 2) {
+      out.push(parseInt(nibbles.substring(i, i + 2), 16));
     }
 
-    try {
-      var data;
-
-      switch (type) {
-        case "MMType1":
-          (0, _util.info)("MMType1 font (" + name + "), falling back to Type1.");
-
-        case "Type1":
-        case "CIDFontType0":
-          this.mimetype = "font/opentype";
-          var cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : 
new Type1Font(name, file, properties);
-          adjustWidths(properties);
-          data = this.convert(name, cff, properties);
-          break;
-
-        case "OpenType":
-        case "TrueType":
-        case "CIDFontType2":
-          this.mimetype = "font/opentype";
-          data = this.checkAndRepair(name, file, properties);
-
-          if (this.isOpenType) {
-            adjustWidths(properties);
-            type = "OpenType";
-          }
+    return out;
+  }
 
-          break;
+  encodeInteger(value) {
+    let code;
 
-        default:
-          throw new _util.FormatError(`Font ${type} is not supported`);
-      }
-    } catch (e) {
-      (0, _util.warn)(e);
-      this.fallbackToSystemFont();
-      return;
+    if (value >= -107 && value <= 107) {
+      code = [value + 139];
+    } else if (value >= 108 && value <= 1131) {
+      value -= 108;
+      code = [(value >> 8) + 247, value & 0xff];
+    } else if (value >= -1131 && value <= -108) {
+      value = -value - 108;
+      code = [(value >> 8) + 251, value & 0xff];
+    } else if (value >= -32768 && value <= 32767) {
+      code = [0x1c, value >> 8 & 0xff, value & 0xff];
+    } else {
+      code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
     }
 
-    this.data = data;
-    this.fontType = getFontType(type, subtype);
-    this.fontMatrix = properties.fontMatrix;
-    this.widths = properties.widths;
-    this.defaultWidth = properties.defaultWidth;
-    this.toUnicode = properties.toUnicode;
-    this.seacMap = properties.seacMap;
+    return code;
   }
 
-  function int16(b0, b1) {
-    return (b0 << 8) + b1;
+  compileHeader(header) {
+    return [header.major, header.minor, 4, header.offSize];
   }
 
-  function writeSignedInt16(bytes, index, value) {
-    bytes[index + 1] = value;
-    bytes[index] = value >>> 8;
-  }
+  compileNameIndex(names) {
+    const nameIndex = new CFFIndex();
 
-  function signedInt16(b0, b1) {
-    var value = (b0 << 8) + b1;
-    return value & 1 << 15 ? value - 0x10000 : value;
-  }
+    for (let i = 0, ii = names.length; i < ii; ++i) {
+      const name = names[i];
+      const length = Math.min(name.length, 127);
+      let sanitizedName = new Array(length);
 
-  function int32(b0, b1, b2, b3) {
-    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-  }
+      for (let j = 0; j < length; j++) {
+        let char = name[j];
 
-  function string16(value) {
-    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
-  }
+        if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char 
=== "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
+          char = "_";
+        }
 
-  function safeString16(value) {
-    if (value > 0x7fff) {
-      value = 0x7fff;
-    } else if (value < -0x8000) {
-      value = -0x8000;
-    }
+        sanitizedName[j] = char;
+      }
 
-    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
-  }
+      sanitizedName = sanitizedName.join("");
 
-  function isTrueTypeFile(file) {
-    var header = file.peekBytes(4);
-    return (0, _core_utils.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === 
"true";
-  }
+      if (sanitizedName === "") {
+        sanitizedName = "Bad_Font_Name";
+      }
 
-  function isTrueTypeCollectionFile(file) {
-    const header = file.peekBytes(4);
-    return (0, _util.bytesToString)(header) === "ttcf";
-  }
+      nameIndex.add((0, _util.stringToBytes)(sanitizedName));
+    }
 
-  function isOpenTypeFile(file) {
-    var header = file.peekBytes(4);
-    return (0, _util.bytesToString)(header) === "OTTO";
+    return this.compileIndex(nameIndex);
   }
 
-  function isType1File(file) {
-    var header = file.peekBytes(2);
-
-    if (header[0] === 0x25 && header[1] === 0x21) {
-      return true;
-    }
-
-    if (header[0] === 0x80 && header[1] === 0x01) {
-      return true;
-    }
+  compileTopDicts(dicts, length, removeCidKeys) {
+    const fontDictTrackers = [];
+    let fdArrayIndex = new CFFIndex();
 
-    return false;
-  }
+    for (let i = 0, ii = dicts.length; i < ii; ++i) {
+      const fontDict = dicts[i];
 
-  function isCFFFile(file) {
-    const header = file.peekBytes(4);
+      if (removeCidKeys) {
+        fontDict.removeByName("CIDFontVersion");
+        fontDict.removeByName("CIDFontRevision");
+        fontDict.removeByName("CIDFontType");
+        fontDict.removeByName("CIDCount");
+        fontDict.removeByName("UIDBase");
+      }
 
-    if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
-      return true;
+      const fontDictTracker = new CFFOffsetTracker();
+      const fontDictData = this.compileDict(fontDict, fontDictTracker);
+      fontDictTrackers.push(fontDictTracker);
+      fdArrayIndex.add(fontDictData);
+      fontDictTracker.offset(length);
     }
 
-    return false;
+    fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+    return {
+      trackers: fontDictTrackers,
+      output: fdArrayIndex
+    };
   }
 
-  function getFontFileType(file, {
-    type,
-    subtype,
-    composite
-  }) {
-    let fileType, fileSubtype;
+  compilePrivateDicts(dicts, trackers, output) {
+    for (let i = 0, ii = dicts.length; i < ii; ++i) {
+      const fontDict = dicts[i];
+      const privateDict = fontDict.privateDict;
 
-    if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
-      if (composite) {
-        fileType = "CIDFontType2";
-      } else {
-        fileType = "TrueType";
-      }
-    } else if (isOpenTypeFile(file)) {
-      if (composite) {
-        fileType = "CIDFontType2";
-      } else {
-        fileType = "OpenType";
-      }
-    } else if (isType1File(file)) {
-      if (composite) {
-        fileType = "CIDFontType0";
-      } else {
-        fileType = type === "MMType1" ? "MMType1" : "Type1";
-      }
-    } else if (isCFFFile(file)) {
-      if (composite) {
-        fileType = "CIDFontType0";
-        fileSubtype = "CIDFontType0C";
-      } else {
-        fileType = type === "MMType1" ? "MMType1" : "Type1";
-        fileSubtype = "Type1C";
+      if (!privateDict || !fontDict.hasName("Private")) {
+        throw new _util.FormatError("There must be a private dictionary.");
       }
-    } else {
-      (0, _util.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");
-      fileType = type;
-      fileSubtype = subtype;
-    }
-
-    return [fileType, fileSubtype];
-  }
-
-  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
-    var toFontChar = [],
-        unicode;
 
-    for (var i = 0, ii = encoding.length; i < ii; i++) {
-      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);
+      const privateDictTracker = new CFFOffsetTracker();
+      const privateDictData = this.compileDict(privateDict, privateDictTracker);
+      let outputLength = output.length;
+      privateDictTracker.offset(outputLength);
 
-      if (unicode !== -1) {
-        toFontChar[i] = unicode;
+      if (!privateDictData.length) {
+        outputLength = 0;
       }
-    }
 
-    for (var charCode in differences) {
-      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);
+      trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
+      output.add(privateDictData);
 
-      if (unicode !== -1) {
-        toFontChar[+charCode] = unicode;
+      if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
+        const subrs = this.compileIndex(privateDict.subrsIndex);
+        privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
+        output.add(subrs);
       }
     }
-
-    return toFontChar;
   }
 
-  function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {
-    var newMap = Object.create(null);
-    var toFontChar = [];
-    var privateUseAreaIndex = 0;
-    var nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
-    var privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+  compileDict(dict, offsetTracker) {
+    let out = [];
+    const order = dict.order;
 
-    for (var originalCharCode in charCodeToGlyphId) {
-      originalCharCode |= 0;
-      var glyphId = charCodeToGlyphId[originalCharCode];
+    for (let i = 0; i < order.length; ++i) {
+      const key = order[i];
 
-      if (!hasGlyph(glyphId)) {
+      if (!(key in dict.values)) {
         continue;
       }
 
-      if (nextAvailableFontCharCode > privateUseOffetEnd) {
-        privateUseAreaIndex++;
+      let values = dict.values[key];
+      let types = dict.types[key];
 
-        if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
-          (0, _util.warn)("Ran out of space in font private use area.");
-          break;
-        }
-
-        nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
-        privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+      if (!Array.isArray(types)) {
+        types = [types];
       }
 
-      var fontCharCode = nextAvailableFontCharCode++;
-
-      if (glyphId === 0) {
-        glyphId = newGlyphZeroId;
+      if (!Array.isArray(values)) {
+        values = [values];
       }
 
-      newMap[fontCharCode] = glyphId;
-      toFontChar[originalCharCode] = fontCharCode;
-    }
+      if (values.length === 0) {
+        continue;
+      }
 
-    return {
-      toFontChar,
-      charCodeToGlyphId: newMap,
-      nextAvailableFontCharCode
-    };
-  }
+      for (let j = 0, jj = types.length; j < jj; ++j) {
+        const type = types[j];
+        const value = values[j];
 
-  function getRanges(glyphs, numGlyphs) {
-    var codes = [];
+        switch (type) {
+          case "num":
+          case "sid":
+            out = out.concat(this.encodeNumber(value));
+            break;
 
-    for (var charCode in glyphs) {
-      if (glyphs[charCode] >= numGlyphs) {
-        continue;
-      }
+          case "offset":
+            const name = dict.keyToNameMap[key];
 
-      codes.push({
-        fontCharCode: charCode | 0,
-        glyphId: glyphs[charCode]
-      });
-    }
+            if (!offsetTracker.isTracking(name)) {
+              offsetTracker.track(name, out.length);
+            }
 
-    if (codes.length === 0) {
-      codes.push({
-        fontCharCode: 0,
-        glyphId: 0
-      });
-    }
+            out = out.concat([0x1d, 0, 0, 0, 0]);
+            break;
 
-    codes.sort(function fontGetRangesSort(a, b) {
-      return a.fontCharCode - b.fontCharCode;
-    });
-    var ranges = [];
-    var length = codes.length;
+          case "array":
+          case "delta":
+            out = out.concat(this.encodeNumber(value));
 
-    for (var n = 0; n < length;) {
-      var start = codes[n].fontCharCode;
-      var codeIndices = [codes[n].glyphId];
-      ++n;
-      var end = start;
+            for (let k = 1, kk = values.length; k < kk; ++k) {
+              out = out.concat(this.encodeNumber(values[k]));
+            }
 
-      while (n < length && end + 1 === codes[n].fontCharCode) {
-        codeIndices.push(codes[n].glyphId);
-        ++end;
-        ++n;
+            break;
 
-        if (end === 0xffff) {
-          break;
+          default:
+            throw new _util.FormatError(`Unknown data type of ${type}`);
         }
       }
 
-      ranges.push([start, end, codeIndices]);
+      out = out.concat(dict.opcodes[key]);
     }
 
-    return ranges;
+    return out;
   }
 
-  function createCmapTable(glyphs, numGlyphs) {
-    var ranges = getRanges(glyphs, numGlyphs);
-    var numTables = ranges[ranges.length - 1][1] > 0xffff ? 2 : 1;
-    var cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + (0, _util.string32)(4 + 
numTables * 8);
-    var i, ii, j, jj;
+  compileStringIndex(strings) {
+    const stringIndex = new CFFIndex();
 
-    for (i = ranges.length - 1; i >= 0; --i) {
-      if (ranges[i][0] <= 0xffff) {
-        break;
-      }
+    for (let i = 0, ii = strings.length; i < ii; ++i) {
+      stringIndex.add((0, _util.stringToBytes)(strings[i]));
     }
 
-    var bmpLength = i + 1;
+    return this.compileIndex(stringIndex);
+  }
 
-    if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {
-      ranges[i][1] = 0xfffe;
-    }
+  compileGlobalSubrIndex() {
+    const globalSubrIndex = this.cff.globalSubrIndex;
+    this.out.writeByteArray(this.compileIndex(globalSubrIndex));
+  }
 
-    var trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;
-    var segCount = bmpLength + trailingRangesCount;
-    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
-    var startCount = "";
-    var endCount = "";
-    var idDeltas = "";
-    var idRangeOffsets = "";
-    var glyphsIds = "";
-    var bias = 0;
-    var range, start, end, codes;
+  compileCharStrings(charStrings) {
+    const charStringsIndex = new CFFIndex();
 
-    for (i = 0, ii = bmpLength; i < ii; i++) {
-      range = ranges[i];
-      start = range[0];
-      end = range[1];
-      startCount += string16(start);
-      endCount += string16(end);
-      codes = range[2];
-      var contiguous = true;
+    for (let i = 0; i < charStrings.count; i++) {
+      const glyph = charStrings.get(i);
 
-      for (j = 1, jj = codes.length; j < jj; ++j) {
-        if (codes[j] !== codes[j - 1] + 1) {
-          contiguous = false;
-          break;
-        }
+      if (glyph.length === 0) {
+        charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
+        continue;
       }
 
-      if (!contiguous) {
-        var offset = (segCount - i) * 2 + bias * 2;
-        bias += end - start + 1;
-        idDeltas += string16(0);
-        idRangeOffsets += string16(offset);
-
-        for (j = 0, jj = codes.length; j < jj; ++j) {
-          glyphsIds += string16(codes[j]);
-        }
-      } else {
-        var startCode = codes[0];
-        idDeltas += string16(startCode - start & 0xffff);
-        idRangeOffsets += string16(0);
-      }
+      charStringsIndex.add(glyph);
     }
 
-    if (trailingRangesCount > 0) {
-      endCount += "\xFF\xFF";
-      startCount += "\xFF\xFF";
-      idDeltas += "\x00\x01";
-      idRangeOffsets += "\x00\x00";
-    }
+    return this.compileIndex(charStringsIndex);
+  }
+
+  compileCharset(charset, numGlyphs, strings, isCIDFont) {
+    let out;
+    const numGlyphsLessNotDef = numGlyphs - 1;
+
+    if (isCIDFont) {
+      out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);
+    } else {
+      const length = 1 + numGlyphsLessNotDef * 2;
+      out = new Uint8Array(length);
+      out[0] = 0;
+      let charsetIndex = 0;
+      const numCharsets = charset.charset.length;
+      let warned = false;
 
-    var format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + 
string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + 
idDeltas + idRangeOffsets + glyphsIds;
-    var format31012 = "";
-    var header31012 = "";
+      for (let i = 1; i < out.length; i += 2) {
+        let sid = 0;
 
-    if (numTables > 1) {
-      cmap += "\x00\x03" + "\x00\x0A" + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);
-      format31012 = "";
+        if (charsetIndex < numCharsets) {
+          const name = charset.charset[charsetIndex++];
+          sid = strings.getSID(name);
 
-      for (i = 0, ii = ranges.length; i < ii; i++) {
-        range = ranges[i];
-        start = range[0];
-        codes = range[2];
-        var code = codes[0];
+          if (sid === -1) {
+            sid = 0;
 
-        for (j = 1, jj = codes.length; j < jj; ++j) {
-          if (codes[j] !== codes[j - 1] + 1) {
-            end = range[0] + j - 1;
-            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);
-            start = end + 1;
-            code = codes[j];
+            if (!warned) {
+              warned = true;
+              (0, _util.warn)(`Couldn't find ${name} in CFF strings`);
+            }
           }
         }
 
-        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, 
_util.string32)(code);
+        out[i] = sid >> 8 & 0xff;
+        out[i + 1] = sid & 0xff;
       }
-
-      header31012 = "\x00\x0C" + "\x00\x00" + (0, _util.string32)(format31012.length + 16) + 
"\x00\x00\x00\x00" + (0, _util.string32)(format31012.length / 12);
     }
 
-    return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012;
+    return this.compileTypedArray(out);
   }
 
-  function validateOS2Table(os2, file) {
-    file.pos = (file.start || 0) + os2.offset;
-    var version = file.getUint16();
-    file.skip(60);
-    var selection = file.getUint16();
-
-    if (version < 4 && selection & 0x0300) {
-      return false;
-    }
-
-    var firstChar = file.getUint16();
-    var lastChar = file.getUint16();
-
-    if (firstChar > lastChar) {
-      return false;
-    }
-
-    file.skip(6);
-    var usWinAscent = file.getUint16();
-
-    if (usWinAscent === 0) {
-      return false;
-    }
-
-    os2.data[8] = os2.data[9] = 0;
-    return true;
+  compileEncoding(encoding) {
+    return this.compileTypedArray(encoding.raw);
   }
 
-  function createOS2Table(properties, charstrings, override) {
-    override = override || {
-      unitsPerEm: 0,
-      yMax: 0,
-      yMin: 0,
-      ascent: 0,
-      descent: 0
-    };
-    var ulUnicodeRange1 = 0;
-    var ulUnicodeRange2 = 0;
-    var ulUnicodeRange3 = 0;
-    var ulUnicodeRange4 = 0;
-    var firstCharIndex = null;
-    var lastCharIndex = 0;
+  compileFDSelect(fdSelect) {
+    const format = fdSelect.format;
+    let out, i;
 
-    if (charstrings) {
-      for (var code in charstrings) {
-        code |= 0;
+    switch (format) {
+      case 0:
+        out = new Uint8Array(1 + fdSelect.fdSelect.length);
+        out[0] = format;
 
-        if (firstCharIndex > code || !firstCharIndex) {
-          firstCharIndex = code;
+        for (i = 0; i < fdSelect.fdSelect.length; i++) {
+          out[i + 1] = fdSelect.fdSelect[i];
         }
 
-        if (lastCharIndex < code) {
-          lastCharIndex = code;
-        }
+        break;
 
-        var position = (0, _unicode.getUnicodeRangeFor)(code);
+      case 3:
+        const start = 0;
+        let lastFD = fdSelect.fdSelect[0];
+        const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
 
-        if (position < 32) {
-          ulUnicodeRange1 |= 1 << position;
-        } else if (position < 64) {
-          ulUnicodeRange2 |= 1 << position - 32;
-        } else if (position < 96) {
-          ulUnicodeRange3 |= 1 << position - 64;
-        } else if (position < 123) {
-          ulUnicodeRange4 |= 1 << position - 96;
-        } else {
-          throw new _util.FormatError("Unicode ranges Bits > 123 are reserved for internal usage");
+        for (i = 1; i < fdSelect.fdSelect.length; i++) {
+          const currentFD = fdSelect.fdSelect[i];
+
+          if (currentFD !== lastFD) {
+            ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
+            lastFD = currentFD;
+          }
         }
-      }
 
-      if (lastCharIndex > 0xffff) {
-        lastCharIndex = 0xffff;
-      }
-    } else {
-      firstCharIndex = 0;
-      lastCharIndex = 255;
+        const numRanges = (ranges.length - 3) / 3;
+        ranges[1] = numRanges >> 8 & 0xff;
+        ranges[2] = numRanges & 0xff;
+        ranges.push(i >> 8 & 0xff, i & 0xff);
+        out = new Uint8Array(ranges);
+        break;
     }
 
-    var bbox = properties.bbox || [0, 0, 0, 0];
-    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
-    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
-    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
-    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));
+    return this.compileTypedArray(out);
+  }
+
+  compileTypedArray(data) {
+    const out = [];
 
-    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
-      typoDescent = -typoDescent;
+    for (let i = 0, ii = data.length; i < ii; ++i) {
+      out[i] = data[i];
     }
 
-    var winAscent = override.yMax || typoAscent;
-    var winDescent = -override.yMin || -typoDescent;
-    return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + 
"\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + 
"\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + 
"\x00\x00\x00\x00\x00\x00" + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + 
(0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + 
string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + 
string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + 
string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + 
string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || 
properties.firstChar) + "\x00\x03";
+    return out;
   }
 
-  function createPostTable(properties) {
-    var angle = Math.floor(properties.italicAngle * 2 ** 16);
-    return "\x00\x03\x00\x00" + (0, _util.string32)(angle) + "\x00\x00" + "\x00\x00" + (0, 
_util.string32)(properties.fixedPitch) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + 
"\x00\x00\x00\x00";
-  }
+  compileIndex(index, trackers = []) {
+    const objects = index.objects;
+    const count = objects.length;
 
-  function createNameTable(name, proto) {
-    if (!proto) {
-      proto = [[], []];
+    if (count === 0) {
+      return [0, 0, 0];
     }
 
-    var strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", 
proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || "", proto[0][7] 
|| "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"];
-    var stringsUnicode = [];
-    var i, ii, j, jj, str;
+    const data = [count >> 8 & 0xff, count & 0xff];
+    let lastOffset = 1,
+        i;
 
-    for (i = 0, ii = strings.length; i < ii; i++) {
-      str = proto[1][i] || strings[i];
-      var strBufUnicode = [];
+    for (i = 0; i < count; ++i) {
+      lastOffset += objects[i].length;
+    }
 
-      for (j = 0, jj = str.length; j < jj; j++) {
-        strBufUnicode.push(string16(str.charCodeAt(j)));
-      }
+    let offsetSize;
 
-      stringsUnicode.push(strBufUnicode.join(""));
+    if (lastOffset < 0x100) {
+      offsetSize = 1;
+    } else if (lastOffset < 0x10000) {
+      offsetSize = 2;
+    } else if (lastOffset < 0x1000000) {
+      offsetSize = 3;
+    } else {
+      offsetSize = 4;
     }
 
-    var names = [strings, stringsUnicode];
-    var platforms = ["\x00\x01", "\x00\x03"];
-    var encodings = ["\x00\x00", "\x00\x01"];
-    var languages = ["\x00\x00", "\x04\x09"];
-    var namesRecordCount = strings.length * platforms.length;
-    var nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);
-    var strOffset = 0;
+    data.push(offsetSize);
+    let relativeOffset = 1;
 
-    for (i = 0, ii = platforms.length; i < ii; i++) {
-      var strs = names[i];
+    for (i = 0; i < count + 1; i++) {
+      if (offsetSize === 1) {
+        data.push(relativeOffset & 0xff);
+      } else if (offsetSize === 2) {
+        data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
+      } else if (offsetSize === 3) {
+        data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
+      } else {
+        data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, 
relativeOffset & 0xff);
+      }
 
-      for (j = 0, jj = strs.length; j < jj; j++) {
-        str = strs[j];
-        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + 
string16(strOffset);
-        nameTable += nameRecord;
-        strOffset += str.length;
+      if (objects[i]) {
+        relativeOffset += objects[i].length;
       }
     }
 
-    nameTable += strings.join("") + stringsUnicode.join("");
-    return nameTable;
-  }
-
-  Font.prototype = {
-    name: null,
-    font: null,
-    mimetype: null,
-    disableFontFace: false,
-
-    get renderer() {
-      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);
-
-      return (0, _util.shadow)(this, "renderer", renderer);
-    },
-
-    exportData(extraProperties = false) {
-      const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, 
...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES;
-      const data = Object.create(null);
-      let property, value;
-
-      for (property of exportDataProperties) {
-        value = this[property];
-
-        if (value !== undefined) {
-          data[property] = value;
-        }
+    for (i = 0; i < count; i++) {
+      if (trackers[i]) {
+        trackers[i].offset(data.length);
       }
 
-      return data;
-    },
+      for (let j = 0, jj = objects[i].length; j < jj; j++) {
+        data.push(objects[i][j]);
+      }
+    }
 
-    fallbackToSystemFont: function Font_fallbackToSystemFont() {
-      this.missingFile = true;
-      var name = this.name;
-      var type = this.type;
-      var subtype = this.subtype;
-      let fontName = name.replace(/[,_]/g, "-").replace(/\s/g, "");
-      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),
-          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();
-      var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && 
stdFontMap[nonStdFontMap[fontName]]);
-      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
-      this.bold = fontName.search(/bold/gi) !== -1;
-      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;
-      this.black = name.search(/Black/g) !== -1;
-      this.remeasure = Object.keys(this.widths).length > 0;
+    return data;
+  }
 
-      if (isStandardFont && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) {
-        const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();
-        const map = [];
+}
 
-        for (const charCode in GlyphMapForStandardFonts) {
-          map[+charCode] = GlyphMapForStandardFonts[charCode];
-        }
+exports.CFFCompiler = CFFCompiler;
 
-        if (/Arial-?Black/i.test(name)) {
-          var SupplementalGlyphMapForArialBlack = (0, 
_standard_fonts.getSupplementalGlyphMapForArialBlack)();
+/***/ }),
+/* 36 */
+/***/ ((__unused_webpack_module, exports) => {
 
-          for (const charCode in SupplementalGlyphMapForArialBlack) {
-            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];
-          }
-        } else if (/Calibri/i.test(name)) {
-          const SupplementalGlyphMapForCalibri = (0, _standard_fonts.getSupplementalGlyphMapForCalibri)();
 
-          for (const charCode in SupplementalGlyphMapForCalibri) {
-            map[+charCode] = SupplementalGlyphMapForCalibri[charCode];
-          }
-        }
 
-        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;
-
-        if (!isIdentityUnicode) {
-          this.toUnicode.forEach(function (charCode, unicodeCharCode) {
-            map[+charCode] = unicodeCharCode;
-          });
-        }
-
-        this.toFontChar = map;
-        this.toUnicode = new ToUnicodeMap(map);
-      } else if (/Symbol/i.test(fontName)) {
-        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), 
this.differences);
-      } else if (/Dingbats/i.test(fontName)) {
-        if (/Wingdings/i.test(name)) {
-          (0, _util.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats.");
-        }
-
-        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, 
_glyphlist.getDingbatsGlyphsUnicode)(), this.differences);
-      } else if (isStandardFont) {
-        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), 
this.differences);
-      } else {
-        const glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
-        const map = [];
-        this.toUnicode.forEach((charCode, unicodeCharCode) => {
-          if (!this.composite) {
-            var glyphName = this.differences[charCode] || this.defaultEncoding[charCode];
-            const unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
-
-            if (unicode !== -1) {
-              unicodeCharCode = unicode;
-            }
-          }
-
-          map[+charCode] = unicodeCharCode;
-        });
-
-        if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) {
-          if (/Verdana/i.test(name)) {
-            const GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();
-
-            for (const charCode in GlyphMapForStandardFonts) {
-              map[+charCode] = GlyphMapForStandardFonts[charCode];
-            }
-          }
-        }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ISOAdobeCharset = exports.ExpertSubsetCharset = exports.ExpertCharset = void 0;
+const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", 
"currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", 
"endash", "dagger", "daggerdbl", "periodcentered", "paragrap
 h", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", 
"perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", 
"dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", 
"Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", 
"logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", 
"degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", 
"copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", 
"Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", 
"Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", 
"Yacute", "Ydieresis", "Zcaron", "aacute", "acircumf
 lex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", 
"iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", 
"otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"];
+exports.ISOAdobeCharset = ISOAdobeCharset;
+const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", 
"dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", 
"twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", 
"twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", 
"eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", 
"periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", 
"isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", 
"fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", 
"Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", 
"Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsma
 ll", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", 
"onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", 
"Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", 
"hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", 
"questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", 
"zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", 
"sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", 
"threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", 
"nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", 
"Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Ari
 ngsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", 
"Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", 
"Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", 
"Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
+exports.ExpertCharset = ExpertCharset;
+const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", 
"threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", 
"isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", 
"fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", 
"onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", 
"threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", 
"zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursupe
 rior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", 
"oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", 
"seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", 
"commainferior"];
+exports.ExpertSubsetCharset = ExpertSubsetCharset;
 
-        this.toFontChar = map;
-      }
+/***/ }),
+/* 37 */
+/***/ ((__unused_webpack_module, exports) => {
 
-      this.loadedName = fontName.split("-")[0];
-      this.fontType = getFontType(type, subtype);
-    },
-    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
-      const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", 
"fpgm", "prep", "cvt ", "CFF "];
-
-      function readTables(file, numTables) {
-        const tables = Object.create(null);
-        tables["OS/2"] = null;
-        tables.cmap = null;
-        tables.head = null;
-        tables.hhea = null;
-        tables.hmtx = null;
-        tables.maxp = null;
-        tables.name = null;
-        tables.post = null;
-
-        for (let i = 0; i < numTables; i++) {
-          const table = readTableEntry(file);
-
-          if (!VALID_TABLES.includes(table.tag)) {
-            continue;
-          }
 
-          if (table.length === 0) {
-            continue;
-          }
 
-          tables[table.tag] = table;
-        }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getEncoding = getEncoding;
+exports.ZapfDingbatsEncoding = exports.WinAnsiEncoding = exports.SymbolSetEncoding = 
exports.StandardEncoding = exports.MacRomanEncoding = exports.ExpertEncoding = void 0;
+const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", 
"dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", 
"threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", 
"dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", 
"osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", 
"parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", 
"Bs
 mall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", 
"Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", 
"Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", 
"Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", 
"hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", 
"threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", 
"twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", 
"fivesuperior", "sixsuperior", "sevensuperi
 or", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", 
"fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", 
"centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", 
"Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", 
"Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", 
"Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", 
"Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", 
"Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
+exports.ExpertEncoding = ExpertEncoding;
+const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", 
"dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", 
"questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", 
"threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", 
"fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", 
"Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmal
 l", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", 
"Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", 
"colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", 
"Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", 
"Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", 
"Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", 
"Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", 
"Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", 
"seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", 
"osuperior", "fiveinferior", "", "commainferior", "periodinferior", 
 "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", 
"Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", 
"", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", 
"exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", 
"fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", 
"tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", 
"Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", 
"Dotaccentsmall", "Ringsmall", "", "", "", ""];
+const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", 
"percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", 
"asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", 
"agrave", "acircumflex", "adiere
 sis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", 
"icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", 
"ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", 
"paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", 
"Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", 
"product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", 
"exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", 
"ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", 
"quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", 
"currency", "guilsinglleft", "guilsinglright", "fi", "fl", "dagge
 rdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", 
"Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", 
"apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", 
"dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"];
+exports.MacRomanEncoding = MacRomanEncoding;
+const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", 
"percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "",
  "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", 
"quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", 
"dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", 
"quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", 
"circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", 
"ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", 
"ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", 
"", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""];
+exports.StandardEncoding = StandardEncoding;
+const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", 
"asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", 
"daggerdbl", "circumflex", "perth
 ousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", 
"quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", 
"guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", 
"currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", 
"logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", 
"acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", 
"onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", 
"Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", 
"Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", 
"multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", 
 "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", 
"ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", 
"eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", 
"uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"];
+exports.WinAnsiEncoding = WinAnsiEncoding;
+const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", 
"percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", 
"Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", 
"Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", 
"bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", 
"phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", 
"sigma", "tau", "upsilon", "omega1", "omega", "xi",
  "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", 
"minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", 
"arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", 
"multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", 
"ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", 
"circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", 
"notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", 
"copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", 
"arrowdblboth", "arrowdblleft", "arrowdb
 lup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", 
"trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", 
"bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", 
"integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", 
"bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""];
+exports.SymbolSetEncoding = SymbolSetEncoding;
+const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", 
"a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", 
"a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", 
"a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", 
"a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", 
"a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", 
"a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", 
"a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "
 ", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", 
"a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", 
"a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", 
"a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", 
"a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", 
"a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", 
"a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", 
"a189", "a190", "a191", ""];
+exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;
 
-        return tables;
-      }
+function getEncoding(encodingName) {
+  switch (encodingName) {
+    case "WinAnsiEncoding":
+      return WinAnsiEncoding;
 
-      function readTableEntry(file) {
-        var tag = (0, _util.bytesToString)(file.getBytes(4));
-        var checksum = file.getInt32() >>> 0;
-        var offset = file.getInt32() >>> 0;
-        var length = file.getInt32() >>> 0;
-        var previousPosition = file.pos;
-        file.pos = file.start ? file.start : 0;
-        file.skip(offset);
-        var data = file.getBytes(length);
-        file.pos = previousPosition;
+    case "StandardEncoding":
+      return StandardEncoding;
 
-        if (tag === "head") {
-          data[8] = data[9] = data[10] = data[11] = 0;
-          data[17] |= 0x20;
-        }
+    case "MacRomanEncoding":
+      return MacRomanEncoding;
 
-        return {
-          tag,
-          checksum,
-          length,
-          offset,
-          data
-        };
-      }
+    case "SymbolSetEncoding":
+      return SymbolSetEncoding;
 
-      function readOpenTypeHeader(ttf) {
-        return {
-          version: (0, _util.bytesToString)(ttf.getBytes(4)),
-          numTables: ttf.getUint16(),
-          searchRange: ttf.getUint16(),
-          entrySelector: ttf.getUint16(),
-          rangeShift: ttf.getUint16()
-        };
-      }
+    case "ZapfDingbatsEncoding":
+      return ZapfDingbatsEncoding;
 
-      function readTrueTypeCollectionHeader(ttc) {
-        const ttcTag = (0, _util.bytesToString)(ttc.getBytes(4));
-        (0, _util.assert)(ttcTag === "ttcf", "Must be a TrueType Collection font.");
-        const majorVersion = ttc.getUint16();
-        const minorVersion = ttc.getUint16();
-        const numFonts = ttc.getInt32() >>> 0;
-        const offsetTable = [];
+    case "ExpertEncoding":
+      return ExpertEncoding;
 
-        for (let i = 0; i < numFonts; i++) {
-          offsetTable.push(ttc.getInt32() >>> 0);
-        }
+    case "MacExpertEncoding":
+      return MacExpertEncoding;
 
-        const header = {
-          ttcTag,
-          majorVersion,
-          minorVersion,
-          numFonts,
-          offsetTable
-        };
+    default:
+      return null;
+  }
+}
 
-        switch (majorVersion) {
-          case 1:
-            return header;
+/***/ }),
+/* 38 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-          case 2:
-            header.dsigTag = ttc.getInt32() >>> 0;
-            header.dsigLength = ttc.getInt32() >>> 0;
-            header.dsigOffset = ttc.getInt32() >>> 0;
-            return header;
-        }
 
-        throw new _util.FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`);
-      }
 
-      function readTrueTypeCollectionData(ttc, fontName) {
-        const {
-          numFonts,
-          offsetTable
-        } = readTrueTypeCollectionHeader(ttc);
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getFontType = getFontType;
+exports.normalizeFontName = normalizeFontName;
+exports.recoverGlyphName = recoverGlyphName;
+exports.type1FontGlyphMapping = type1FontGlyphMapping;
+exports.SEAC_ANALYSIS_ENABLED = exports.MacStandardGlyphOrdering = exports.FontFlags = void 0;
 
-        for (let i = 0; i < numFonts; i++) {
-          ttc.pos = (ttc.start || 0) + offsetTable[i];
-          const potentialHeader = readOpenTypeHeader(ttc);
-          const potentialTables = readTables(ttc, potentialHeader.numTables);
+var _util = __w_pdfjs_require__(2);
 
-          if (!potentialTables.name) {
-            throw new _util.FormatError('TrueType Collection font must contain a "name" table.');
-          }
+var _encodings = __w_pdfjs_require__(37);
 
-          const nameTable = readNameTable(potentialTables.name);
+var _glyphlist = __w_pdfjs_require__(39);
 
-          for (let j = 0, jj = nameTable.length; j < jj; j++) {
-            for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
-              const nameEntry = nameTable[j][k];
+var _unicode = __w_pdfjs_require__(40);
 
-              if (nameEntry && nameEntry.replace(/\s/g, "") === fontName) {
-                return {
-                  header: potentialHeader,
-                  tables: potentialTables
-                };
-              }
-            }
-          }
-        }
+const SEAC_ANALYSIS_ENABLED = true;
+exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;
+const FontFlags = {
+  FixedPitch: 1,
+  Serif: 2,
+  Symbolic: 4,
+  Script: 8,
+  Nonsymbolic: 32,
+  Italic: 64,
+  AllCap: 65536,
+  SmallCap: 131072,
+  ForceBold: 262144
+};
+exports.FontFlags = FontFlags;
+const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", 
"numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", 
"comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", 
"nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", 
"G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
"bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", 
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
"braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", 
"Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", 
"eacute", "egrave", "ecircumflex", "edieresis",
  "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", 
"otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", 
"bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", 
"AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", 
"summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", 
"questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", 
"guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", 
"emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", 
"Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", 
"periodcentered", "quotesinglbase", "quotedblbase", "perthousand",
  "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", 
"Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", 
"circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", 
"Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", 
"Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", 
"onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", 
"cacute", "Ccaron", "ccaron", "dcroat"];
+exports.MacStandardGlyphOrdering = MacStandardGlyphOrdering;
 
-        throw new _util.FormatError(`TrueType Collection does not contain "${fontName}" font.`);
+function getFontType(type, subtype, isStandardFont = false) {
+  switch (type) {
+    case "Type1":
+      if (isStandardFont) {
+        return _util.FontType.TYPE1STANDARD;
       }
 
-      function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {
-        if (!cmap) {
-          (0, _util.warn)("No cmap table available.");
-          return {
-            platformId: -1,
-            encodingId: -1,
-            mappings: [],
-            hasShortCmap: false
-          };
-        }
-
-        var segment;
-        var start = (file.start ? file.start : 0) + cmap.offset;
-        file.pos = start;
-        file.skip(2);
-        var numTables = file.getUint16();
-        var potentialTable;
-        var canBreak = false;
-
-        for (var i = 0; i < numTables; i++) {
-          var platformId = file.getUint16();
-          var encodingId = file.getUint16();
-          var offset = file.getInt32() >>> 0;
-          var useTable = false;
-
-          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === 
encodingId) {
-            continue;
-          }
-
-          if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) {
-            useTable = true;
-          } else if (platformId === 1 && encodingId === 0) {
-            useTable = true;
-          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
-            useTable = true;
-
-            if (!isSymbolicFont) {
-              canBreak = true;
-            }
-          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
-            useTable = true;
-            canBreak = true;
-          }
-
-          if (useTable) {
-            potentialTable = {
-              platformId,
-              encodingId,
-              offset
-            };
-          }
-
-          if (canBreak) {
-            break;
-          }
-        }
-
-        if (potentialTable) {
-          file.pos = start + potentialTable.offset;
-        }
-
-        if (!potentialTable || file.peekByte() === -1) {
-          (0, _util.warn)("Could not find a preferred cmap table.");
-          return {
-            platformId: -1,
-            encodingId: -1,
-            mappings: [],
-            hasShortCmap: false
-          };
-        }
-
-        var format = file.getUint16();
-        file.skip(2 + 2);
-        var hasShortCmap = false;
-        var mappings = [];
-        var j, glyphId;
-
-        if (format === 0) {
-          for (j = 0; j < 256; j++) {
-            var index = file.getByte();
-
-            if (!index) {
-              continue;
-            }
-
-            mappings.push({
-              charCode: j,
-              glyphId: index
-            });
-          }
-
-          hasShortCmap = true;
-        } else if (format === 4) {
-          var segCount = file.getUint16() >> 1;
-          file.skip(6);
-          var segIndex,
-              segments = [];
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments.push({
-              end: file.getUint16()
-            });
-          }
-
-          file.skip(2);
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments[segIndex].start = file.getUint16();
-          }
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments[segIndex].delta = file.getUint16();
-          }
-
-          var offsetsCount = 0;
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segment = segments[segIndex];
-            var rangeOffset = file.getUint16();
-
-            if (!rangeOffset) {
-              segment.offsetIndex = -1;
-              continue;
-            }
+      return subtype === "Type1C" ? _util.FontType.TYPE1C : _util.FontType.TYPE1;
 
-            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
-            segment.offsetIndex = offsetIndex;
-            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
-          }
+    case "CIDFontType0":
+      return subtype === "CIDFontType0C" ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;
 
-          var offsets = [];
+    case "OpenType":
+      return _util.FontType.OPENTYPE;
 
-          for (j = 0; j < offsetsCount; j++) {
-            offsets.push(file.getUint16());
-          }
+    case "TrueType":
+      return _util.FontType.TRUETYPE;
 
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segment = segments[segIndex];
-            start = segment.start;
-            var end = segment.end;
-            var delta = segment.delta;
-            offsetIndex = segment.offsetIndex;
+    case "CIDFontType2":
+      return _util.FontType.CIDFONTTYPE2;
 
-            for (j = start; j <= end; j++) {
-              if (j === 0xffff) {
-                continue;
-              }
+    case "MMType1":
+      return _util.FontType.MMTYPE1;
 
-              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
-              glyphId = glyphId + delta & 0xffff;
-              mappings.push({
-                charCode: j,
-                glyphId
-              });
-            }
-          }
-        } else if (format === 6) {
-          var firstCode = file.getUint16();
-          var entryCount = file.getUint16();
+    case "Type0":
+      return _util.FontType.TYPE0;
 
-          for (j = 0; j < entryCount; j++) {
-            glyphId = file.getUint16();
-            var charCode = firstCode + j;
-            mappings.push({
-              charCode,
-              glyphId
-            });
-          }
-        } else {
-          (0, _util.warn)("cmap table has unsupported format: " + format);
-          return {
-            platformId: -1,
-            encodingId: -1,
-            mappings: [],
-            hasShortCmap: false
-          };
-        }
+    default:
+      return _util.FontType.UNKNOWN;
+  }
+}
 
-        mappings.sort(function (a, b) {
-          return a.charCode - b.charCode;
-        });
+function recoverGlyphName(name, glyphsUnicodeMap) {
+  if (glyphsUnicodeMap[name] !== undefined) {
+    return name;
+  }
 
-        for (i = 1; i < mappings.length; i++) {
-          if (mappings[i - 1].charCode === mappings[i].charCode) {
-            mappings.splice(i, 1);
-            i--;
-          }
-        }
+  const unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);
 
-        return {
-          platformId: potentialTable.platformId,
-          encodingId: potentialTable.encodingId,
-          mappings,
-          hasShortCmap
-        };
+  if (unicode !== -1) {
+    for (const key in glyphsUnicodeMap) {
+      if (glyphsUnicodeMap[key] === unicode) {
+        return key;
       }
+    }
+  }
 
-      function sanitizeMetrics(file, header, metrics, numGlyphs, dupFirstEntry) {
-        if (!header) {
-          if (metrics) {
-            metrics.data = null;
-          }
-
-          return;
-        }
-
-        file.pos = (file.start ? file.start : 0) + header.offset;
-        file.pos += 4;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 2;
-        file.pos += 8;
-        file.pos += 2;
-        var numOfMetrics = file.getUint16();
-
-        if (numOfMetrics > numGlyphs) {
-          (0, _util.info)("The numOfMetrics (" + numOfMetrics + ") should not be " + "greater than the 
numGlyphs (" + numGlyphs + ")");
-          numOfMetrics = numGlyphs;
-          header.data[34] = (numOfMetrics & 0xff00) >> 8;
-          header.data[35] = numOfMetrics & 0x00ff;
-        }
+  (0, _util.info)("Unable to recover a standard glyph name for: " + name);
+  return name;
+}
 
-        var numOfSidebearings = numGlyphs - numOfMetrics;
-        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
+function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
+  const charCodeToGlyphId = Object.create(null);
+  let glyphId, charCode, baseEncoding;
+  const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
 
-        if (numMissing > 0) {
-          var entries = new Uint8Array(metrics.length + numMissing * 2);
-          entries.set(metrics.data);
+  if (properties.isInternalFont) {
+    baseEncoding = builtInEncoding;
 
-          if (dupFirstEntry) {
-            entries[metrics.length] = metrics.data[2];
-            entries[metrics.length + 1] = metrics.data[3];
-          }
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
 
-          metrics.data = entries;
-        }
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
       }
+    }
+  } else if (properties.baseEncodingName) {
+    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
 
-      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
-        var glyphProfile = {
-          length: 0,
-          sizeOfInstructions: 0
-        };
-
-        if (sourceEnd - sourceStart <= 12) {
-          return glyphProfile;
-        }
-
-        var glyf = source.subarray(sourceStart, sourceEnd);
-        var contoursCount = signedInt16(glyf[0], glyf[1]);
-
-        if (contoursCount < 0) {
-          contoursCount = -1;
-          writeSignedInt16(glyf, 0, contoursCount);
-          dest.set(glyf, destStart);
-          glyphProfile.length = glyf.length;
-          return glyphProfile;
-        }
-
-        var i,
-            j = 10,
-            flagsCount = 0;
-
-        for (i = 0; i < contoursCount; i++) {
-          var endPoint = glyf[j] << 8 | glyf[j + 1];
-          flagsCount = endPoint + 1;
-          j += 2;
-        }
-
-        var instructionsStart = j;
-        var instructionsLength = glyf[j] << 8 | glyf[j + 1];
-        glyphProfile.sizeOfInstructions = instructionsLength;
-        j += 2 + instructionsLength;
-        var instructionsEnd = j;
-        var coordinatesLength = 0;
-
-        for (i = 0; i < flagsCount; i++) {
-          var flag = glyf[j++];
-
-          if (flag & 0xc0) {
-            glyf[j - 1] = flag & 0x3f;
-          }
-
-          let xLength = 2;
-
-          if (flag & 2) {
-            xLength = 1;
-          } else if (flag & 16) {
-            xLength = 0;
-          }
-
-          let yLength = 2;
-
-          if (flag & 4) {
-            yLength = 1;
-          } else if (flag & 32) {
-            yLength = 0;
-          }
-
-          const xyLength = xLength + yLength;
-          coordinatesLength += xyLength;
-
-          if (flag & 8) {
-            var repeat = glyf[j++];
-            i += repeat;
-            coordinatesLength += repeat * xyLength;
-          }
-        }
-
-        if (coordinatesLength === 0) {
-          return glyphProfile;
-        }
-
-        var glyphDataLength = j + coordinatesLength;
-
-        if (glyphDataLength > glyf.length) {
-          return glyphProfile;
-        }
-
-        if (!hintsValid && instructionsLength > 0) {
-          dest.set(glyf.subarray(0, instructionsStart), destStart);
-          dest.set([0, 0], destStart + instructionsStart);
-          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
-          glyphDataLength -= instructionsLength;
-
-          if (glyf.length - glyphDataLength > 3) {
-            glyphDataLength = glyphDataLength + 3 & ~3;
-          }
-
-          glyphProfile.length = glyphDataLength;
-          return glyphProfile;
-        }
-
-        if (glyf.length - glyphDataLength > 3) {
-          glyphDataLength = glyphDataLength + 3 & ~3;
-          dest.set(glyf.subarray(0, glyphDataLength), destStart);
-          glyphProfile.length = glyphDataLength;
-          return glyphProfile;
-        }
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
 
-        dest.set(glyf, destStart);
-        glyphProfile.length = glyf.length;
-        return glyphProfile;
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
       }
+    }
+  } else if (isSymbolicFont) {
+    for (charCode in builtInEncoding) {
+      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
+    }
+  } else {
+    baseEncoding = _encodings.StandardEncoding;
 
-      function sanitizeHead(head, numGlyphs, locaLength) {
-        var data = head.data;
-        var version = int32(data[0], data[1], data[2], data[3]);
-
-        if (version >> 16 !== 1) {
-          (0, _util.info)("Attempting to fix invalid version in head table: " + version);
-          data[0] = 0;
-          data[1] = 1;
-          data[2] = 0;
-          data[3] = 0;
-        }
-
-        var indexToLocFormat = int16(data[50], data[51]);
-
-        if (indexToLocFormat < 0 || indexToLocFormat > 1) {
-          (0, _util.info)("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat);
-          var numGlyphsPlusOne = numGlyphs + 1;
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
 
-          if (locaLength === numGlyphsPlusOne << 1) {
-            data[50] = 0;
-            data[51] = 0;
-          } else if (locaLength === numGlyphsPlusOne << 2) {
-            data[50] = 0;
-            data[51] = 1;
-          } else {
-            throw new _util.FormatError("Could not fix indexToLocFormat: " + indexToLocFormat);
-          }
-        }
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
       }
+    }
+  }
 
-      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, 
dupFirstEntry, maxSizeOfInstructions) {
-        var itemSize, itemDecode, itemEncode;
-
-        if (isGlyphLocationsLong) {
-          itemSize = 4;
-
-          itemDecode = function fontItemDecodeLong(data, offset) {
-            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
-          };
-
-          itemEncode = function fontItemEncodeLong(data, offset, value) {
-            data[offset] = value >>> 24 & 0xff;
-            data[offset + 1] = value >> 16 & 0xff;
-            data[offset + 2] = value >> 8 & 0xff;
-            data[offset + 3] = value & 0xff;
-          };
-        } else {
-          itemSize = 2;
-
-          itemDecode = function fontItemDecode(data, offset) {
-            return data[offset] << 9 | data[offset + 1] << 1;
-          };
-
-          itemEncode = function fontItemEncode(data, offset, value) {
-            data[offset] = value >> 9 & 0xff;
-            data[offset + 1] = value >> 1 & 0xff;
-          };
-        }
-
-        var numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
-        var locaDataSize = itemSize * (1 + numGlyphsOut);
-        var locaData = new Uint8Array(locaDataSize);
-        locaData.set(loca.data.subarray(0, locaDataSize));
-        loca.data = locaData;
-        var oldGlyfData = glyf.data;
-        var oldGlyfDataLength = oldGlyfData.length;
-        var newGlyfData = new Uint8Array(oldGlyfDataLength);
-        var i, j;
-        const locaEntries = [];
-
-        for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {
-          let offset = itemDecode(locaData, j);
-
-          if (offset > oldGlyfDataLength) {
-            offset = oldGlyfDataLength;
-          }
-
-          locaEntries.push({
-            index: i,
-            offset,
-            endOffset: 0
-          });
-        }
-
-        locaEntries.sort((a, b) => {
-          return a.offset - b.offset;
-        });
-
-        for (i = 0; i < numGlyphs; i++) {
-          locaEntries[i].endOffset = locaEntries[i + 1].offset;
-        }
-
-        locaEntries.sort((a, b) => {
-          return a.index - b.index;
-        });
-        var missingGlyphs = Object.create(null);
-        var writeOffset = 0;
-        itemEncode(locaData, 0, writeOffset);
-
-        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
-          var glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, 
newGlyfData, writeOffset, hintsValid);
-          var newLength = glyphProfile.length;
-
-          if (newLength === 0) {
-            missingGlyphs[i] = true;
-          }
-
-          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
-            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
-          }
-
-          writeOffset += newLength;
-          itemEncode(locaData, j, writeOffset);
-        }
-
-        if (writeOffset === 0) {
-          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
-
-          for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
-            itemEncode(locaData, j, simpleGlyph.length);
-          }
-
-          glyf.data = simpleGlyph;
-        } else if (dupFirstEntry) {
-          var firstEntryLength = itemDecode(locaData, itemSize);
+  const differences = properties.differences;
+  let glyphsUnicodeMap;
 
-          if (newGlyfData.length > firstEntryLength + writeOffset) {
-            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
-          } else {
-            glyf.data = new Uint8Array(firstEntryLength + writeOffset);
-            glyf.data.set(newGlyfData.subarray(0, writeOffset));
-          }
+  if (differences) {
+    for (charCode in differences) {
+      const glyphName = differences[charCode];
+      glyphId = glyphNames.indexOf(glyphName);
 
-          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
-          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
-        } else {
-          glyf.data = newGlyfData.subarray(0, writeOffset);
+      if (glyphId === -1) {
+        if (!glyphsUnicodeMap) {
+          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
         }
 
-        return {
-          missingGlyphs,
-          maxSizeOfInstructions
-        };
-      }
-
-      function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {
-        var start = (font.start ? font.start : 0) + post.offset;
-        font.pos = start;
-        var length = post.length,
-            end = start + length;
-        var version = font.getInt32();
-        font.skip(28);
-        var glyphNames;
-        var valid = true;
-        var i;
-
-        switch (version) {
-          case 0x00010000:
-            glyphNames = MacStandardGlyphOrdering;
-            break;
-
-          case 0x00020000:
-            var numGlyphs = font.getUint16();
-
-            if (numGlyphs !== maxpNumGlyphs) {
-              valid = false;
-              break;
-            }
-
-            var glyphNameIndexes = [];
-
-            for (i = 0; i < numGlyphs; ++i) {
-              var index = font.getUint16();
-
-              if (index >= 32768) {
-                valid = false;
-                break;
-              }
-
-              glyphNameIndexes.push(index);
-            }
-
-            if (!valid) {
-              break;
-            }
-
-            var customNames = [];
-            var strBuf = [];
-
-            while (font.pos < end) {
-              var stringLength = font.getByte();
-              strBuf.length = stringLength;
-
-              for (i = 0; i < stringLength; ++i) {
-                strBuf[i] = String.fromCharCode(font.getByte());
-              }
-
-              customNames.push(strBuf.join(""));
-            }
-
-            glyphNames = [];
-
-            for (i = 0; i < numGlyphs; ++i) {
-              var j = glyphNameIndexes[i];
-
-              if (j < 258) {
-                glyphNames.push(MacStandardGlyphOrdering[j]);
-                continue;
-              }
-
-              glyphNames.push(customNames[j - 258]);
-            }
-
-            break;
-
-          case 0x00030000:
-            break;
-
-          default:
-            (0, _util.warn)("Unknown/unsupported post table version " + version);
-            valid = false;
-
-            if (propertiesObj.defaultEncoding) {
-              glyphNames = propertiesObj.defaultEncoding;
-            }
+        const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
 
-            break;
+        if (standardGlyphName !== glyphName) {
+          glyphId = glyphNames.indexOf(standardGlyphName);
         }
-
-        propertiesObj.glyphNames = glyphNames;
-        return valid;
       }
 
-      function readNameTable(nameTable) {
-        var start = (font.start ? font.start : 0) + nameTable.offset;
-        font.pos = start;
-        var names = [[], []];
-        var length = nameTable.length,
-            end = start + length;
-        var format = font.getUint16();
-        var FORMAT_0_HEADER_LENGTH = 6;
-
-        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
-          return names;
-        }
-
-        var numRecords = font.getUint16();
-        var stringsStart = font.getUint16();
-        var records = [];
-        var NAME_RECORD_LENGTH = 12;
-        var i, ii;
-
-        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
-          var r = {
-            platform: font.getUint16(),
-            encoding: font.getUint16(),
-            language: font.getUint16(),
-            name: font.getUint16(),
-            length: font.getUint16(),
-            offset: font.getUint16()
-          };
-
-          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 
1 && r.language === 0x409) {
-            records.push(r);
-          }
-        }
-
-        for (i = 0, ii = records.length; i < ii; i++) {
-          var record = records[i];
-
-          if (record.length <= 0) {
-            continue;
-          }
-
-          var pos = start + stringsStart + record.offset;
-
-          if (pos + record.length > end) {
-            continue;
-          }
-
-          font.pos = pos;
-          var nameIndex = record.name;
-
-          if (record.encoding) {
-            var str = "";
-
-            for (var j = 0, jj = record.length; j < jj; j += 2) {
-              str += String.fromCharCode(font.getUint16());
-            }
-
-            names[1][nameIndex] = str;
-          } else {
-            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));
-          }
-        }
-
-        return names;
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
       }
+    }
+  }
 
-      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, 
-1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, 
-999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, 
-1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, 
-2, 0, 0, 0, -1, -1, -1, -2];
-
-      function sanitizeTTProgram(table, ttContext) {
-        var data = table.data;
-        var i = 0,
-            j,
-            n,
-            b,
-            funcId,
-            pc,
-            lastEndf = 0,
-            lastDeff = 0;
-        var stack = [];
-        var callstack = [];
-        var functionsCalled = [];
-        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
-        var inFDEF = false,
-            ifLevel = 0,
-            inELSE = 0;
-
-        for (var ii = data.length; i < ii;) {
-          var op = data[i++];
-
-          if (op === 0x40) {
-            n = data[i++];
-
-            if (inFDEF || inELSE) {
-              i += n;
-            } else {
-              for (j = 0; j < n; j++) {
-                stack.push(data[i++]);
-              }
-            }
-          } else if (op === 0x41) {
-            n = data[i++];
-
-            if (inFDEF || inELSE) {
-              i += n * 2;
-            } else {
-              for (j = 0; j < n; j++) {
-                b = data[i++];
-                stack.push(b << 8 | data[i++]);
-              }
-            }
-          } else if ((op & 0xf8) === 0xb0) {
-            n = op - 0xb0 + 1;
-
-            if (inFDEF || inELSE) {
-              i += n;
-            } else {
-              for (j = 0; j < n; j++) {
-                stack.push(data[i++]);
-              }
-            }
-          } else if ((op & 0xf8) === 0xb8) {
-            n = op - 0xb8 + 1;
-
-            if (inFDEF || inELSE) {
-              i += n * 2;
-            } else {
-              for (j = 0; j < n; j++) {
-                b = data[i++];
-                stack.push(b << 8 | data[i++]);
-              }
-            }
-          } else if (op === 0x2b && !tooComplexToFollowFunctions) {
-            if (!inFDEF && !inELSE) {
-              funcId = stack[stack.length - 1];
-
-              if (isNaN(funcId)) {
-                (0, _util.info)("TT: CALL empty stack (or invalid entry).");
-              } else {
-                ttContext.functionsUsed[funcId] = true;
-
-                if (funcId in ttContext.functionsStackDeltas) {
-                  const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];
-
-                  if (newStackLength < 0) {
-                    (0, _util.warn)("TT: CALL invalid functions stack delta.");
-                    ttContext.hintsValid = false;
-                    return;
-                  }
-
-                  stack.length = newStackLength;
-                } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
-                  callstack.push({
-                    data,
-                    i,
-                    stackTop: stack.length - 1
-                  });
-                  functionsCalled.push(funcId);
-                  pc = ttContext.functionsDefined[funcId];
-
-                  if (!pc) {
-                    (0, _util.warn)("TT: CALL non-existent function");
-                    ttContext.hintsValid = false;
-                    return;
-                  }
-
-                  data = pc.data;
-                  i = pc.i;
-                }
-              }
-            }
-          } else if (op === 0x2c && !tooComplexToFollowFunctions) {
-            if (inFDEF || inELSE) {
-              (0, _util.warn)("TT: nested FDEFs not allowed");
-              tooComplexToFollowFunctions = true;
-            }
-
-            inFDEF = true;
-            lastDeff = i;
-            funcId = stack.pop();
-            ttContext.functionsDefined[funcId] = {
-              data,
-              i
-            };
-          } else if (op === 0x2d) {
-            if (inFDEF) {
-              inFDEF = false;
-              lastEndf = i;
-            } else {
-              pc = callstack.pop();
-
-              if (!pc) {
-                (0, _util.warn)("TT: ENDF bad stack");
-                ttContext.hintsValid = false;
-                return;
-              }
-
-              funcId = functionsCalled.pop();
-              data = pc.data;
-              i = pc.i;
-              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
-            }
-          } else if (op === 0x89) {
-            if (inFDEF || inELSE) {
-              (0, _util.warn)("TT: nested IDEFs not allowed");
-              tooComplexToFollowFunctions = true;
-            }
-
-            inFDEF = true;
-            lastDeff = i;
-          } else if (op === 0x58) {
-            ++ifLevel;
-          } else if (op === 0x1b) {
-            inELSE = ifLevel;
-          } else if (op === 0x59) {
-            if (inELSE === ifLevel) {
-              inELSE = 0;
-            }
-
-            --ifLevel;
-          } else if (op === 0x1c) {
-            if (!inFDEF && !inELSE) {
-              var offset = stack[stack.length - 1];
-
-              if (offset > 0) {
-                i += offset - 1;
-              }
-            }
-          }
-
-          if (!inFDEF && !inELSE) {
-            let stackDelta = 0;
-
-            if (op <= 0x8e) {
-              stackDelta = TTOpsStackDeltas[op];
-            } else if (op >= 0xc0 && op <= 0xdf) {
-              stackDelta = -1;
-            } else if (op >= 0xe0) {
-              stackDelta = -2;
-            }
-
-            if (op >= 0x71 && op <= 0x75) {
-              n = stack.pop();
-
-              if (!isNaN(n)) {
-                stackDelta = -n * 2;
-              }
-            }
-
-            while (stackDelta < 0 && stack.length > 0) {
-              stack.pop();
-              stackDelta++;
-            }
-
-            while (stackDelta > 0) {
-              stack.push(NaN);
-              stackDelta--;
-            }
-          }
-        }
-
-        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
-        var content = [data];
-
-        if (i > data.length) {
-          content.push(new Uint8Array(i - data.length));
-        }
-
-        if (lastDeff > lastEndf) {
-          (0, _util.warn)("TT: complementing a missing function tail");
-          content.push(new Uint8Array([0x22, 0x2d]));
-        }
-
-        foldTTTable(table, content);
-      }
+  return charCodeToGlyphId;
+}
 
-      function checkInvalidFunctions(ttContext, maxFunctionDefs) {
-        if (ttContext.tooComplexToFollowFunctions) {
-          return;
-        }
+function normalizeFontName(name) {
+  return name.replace(/[,_]/g, "-").replace(/\s/g, "");
+}
 
-        if (ttContext.functionsDefined.length > maxFunctionDefs) {
-          (0, _util.warn)("TT: more functions defined than expected");
-          ttContext.hintsValid = false;
-          return;
-        }
+/***/ }),
+/* 39 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => {
+
+__w_pdfjs_require__.r(__webpack_exports__);
+/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, {
+/* harmony export */   "getDingbatsGlyphsUnicode": () => (/* binding */ getDingbatsGlyphsUnicode),
+/* harmony export */   "getGlyphsUnicode": () => (/* binding */ getGlyphsUnicode)
+/* harmony export */ });
+/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(9);
+
+const getGlyphsUnicode = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function 
() {
+ return [
+  "A",
+  0x0041,
+  "AE",
+  0x00c6,
+  "AEacute",
+  0x01fc,
+  "AEmacron",
+  0x01e2,
+  "AEsmall",
+  0xf7e6,
+  "Aacute",
+  0x00c1,
+  "Aacutesmall",
+  0xf7e1,
+  "Abreve",
+  0x0102,
+  "Abreveacute",
+  0x1eae,
+  "Abrevecyrillic",
+  0x04d0,
+  "Abrevedotbelow",
+  0x1eb6,
+  "Abrevegrave",
+  0x1eb0,
+  "Abrevehookabove",
+  0x1eb2,
+  "Abrevetilde",
+  0x1eb4,
+  "Acaron",
+  0x01cd,
+  "Acircle",
+  0x24b6,
+  "Acircumflex",
+  0x00c2,
+  "Acircumflexacute",
+  0x1ea4,
+  "Acircumflexdotbelow",
+  0x1eac,
+  "Acircumflexgrave",
+  0x1ea6,
+  "Acircumflexhookabove",
+  0x1ea8,
+  "Acircumflexsmall",
+  0xf7e2,
+  "Acircumflextilde",
+  0x1eaa,
+  "Acute",
+  0xf6c9,
+  "Acutesmall",
+  0xf7b4,
+  "Acyrillic",
+  0x0410,
+  "Adblgrave",
+  0x0200,
+  "Adieresis",
+  0x00c4,
+  "Adieresiscyrillic",
+  0x04d2,
+  "Adieresismacron",
+  0x01de,
+  "Adieresissmall",
+  0xf7e4,
+  "Adotbelow",
+  0x1ea0,
+  "Adotmacron",
+  0x01e0,
+  "Agrave",
+  0x00c0,
+  "Agravesmall",
+  0xf7e0,
+  "Ahookabove",
+  0x1ea2,
+  "Aiecyrillic",
+  0x04d4,
+  "Ainvertedbreve",
+  0x0202,
+  "Alpha",
+  0x0391,
+  "Alphatonos",
+  0x0386,
+  "Amacron",
+  0x0100,
+  "Amonospace",
+  0xff21,
+  "Aogonek",
+  0x0104,
+  "Aring",
+  0x00c5,
+  "Aringacute",
+  0x01fa,
+  "Aringbelow",
+  0x1e00,
+  "Aringsmall",
+  0xf7e5,
+  "Asmall",
+  0xf761,
+  "Atilde",
+  0x00c3,
+  "Atildesmall",
+  0xf7e3,
+  "Aybarmenian",
+  0x0531,
+  "B",
+  0x0042,
+  "Bcircle",
+  0x24b7,
+  "Bdotaccent",
+  0x1e02,
+  "Bdotbelow",
+  0x1e04,
+  "Becyrillic",
+  0x0411,
+  "Benarmenian",
+  0x0532,
+  "Beta",
+  0x0392,
+  "Bhook",
+  0x0181,
+  "Blinebelow",
+  0x1e06,
+  "Bmonospace",
+  0xff22,
+  "Brevesmall",
+  0xf6f4,
+  "Bsmall",
+  0xf762,
+  "Btopbar",
+  0x0182,
+  "C",
+  0x0043,
+  "Caarmenian",
+  0x053e,
+  "Cacute",
+  0x0106,
+  "Caron",
+  0xf6ca,
+  "Caronsmall",
+  0xf6f5,
+  "Ccaron",
+  0x010c,
+  "Ccedilla",
+  0x00c7,
+  "Ccedillaacute",
+  0x1e08,
+  "Ccedillasmall",
+  0xf7e7,
+  "Ccircle",
+  0x24b8,
+  "Ccircumflex",
+  0x0108,
+  "Cdot",
+  0x010a,
+  "Cdotaccent",
+  0x010a,
+  "Cedillasmall",
+  0xf7b8,
+  "Chaarmenian",
+  0x0549,
+  "Cheabkhasiancyrillic",
+  0x04bc,
+  "Checyrillic",
+  0x0427,
+  "Chedescenderabkhasiancyrillic",
+  0x04be,
+  "Chedescendercyrillic",
+  0x04b6,
+  "Chedieresiscyrillic",
+  0x04f4,
+  "Cheharmenian",
+  0x0543,
+  "Chekhakassiancyrillic",
+  0x04cb,
+  "Cheverticalstrokecyrillic",
+  0x04b8,
+  "Chi",
+  0x03a7,
+  "Chook",
+  0x0187,
+  "Circumflexsmall",
+  0xf6f6,
+  "Cmonospace",
+  0xff23,
+  "Coarmenian",
+  0x0551,
+  "Csmall",
+  0xf763,
+  "D",
+  0x0044,
+  "DZ",
+  0x01f1,
+  "DZcaron",
+  0x01c4,
+  "Daarmenian",
+  0x0534,
+  "Dafrican",
+  0x0189,
+  "Dcaron",
+  0x010e,
+  "Dcedilla",
+  0x1e10,
+  "Dcircle",
+  0x24b9,
+  "Dcircumflexbelow",
+  0x1e12,
+  "Dcroat",
+  0x0110,
+  "Ddotaccent",
+  0x1e0a,
+  "Ddotbelow",
+  0x1e0c,
+  "Decyrillic",
+  0x0414,
+  "Deicoptic",
+  0x03ee,
+  "Delta",
+  0x2206,
+  "Deltagreek",
+  0x0394,
+  "Dhook",
+  0x018a,
+  "Dieresis",
+  0xf6cb,
+  "DieresisAcute",
+  0xf6cc,
+  "DieresisGrave",
+  0xf6cd,
+  "Dieresissmall",
+  0xf7a8,
+  "Digammagreek",
+  0x03dc,
+  "Djecyrillic",
+  0x0402,
+  "Dlinebelow",
+  0x1e0e,
+  "Dmonospace",
+  0xff24,
+  "Dotaccentsmall",
+  0xf6f7,
+  "Dslash",
+  0x0110,
+  "Dsmall",
+  0xf764,
+  "Dtopbar",
+  0x018b,
+  "Dz",
+  0x01f2,
+  "Dzcaron",
+  0x01c5,
+  "Dzeabkhasiancyrillic",
+  0x04e0,
+  "Dzecyrillic",
+  0x0405,
+  "Dzhecyrillic",
+  0x040f,
+  "E",
+  0x0045,
+  "Eacute",
+  0x00c9,
+  "Eacutesmall",
+  0xf7e9,
+  "Ebreve",
+  0x0114,
+  "Ecaron",
+  0x011a,
+  "Ecedillabreve",
+  0x1e1c,
+  "Echarmenian",
+  0x0535,
+  "Ecircle",
+  0x24ba,
+  "Ecircumflex",
+  0x00ca,
+  "Ecircumflexacute",
+  0x1ebe,
+  "Ecircumflexbelow",
+  0x1e18,
+  "Ecircumflexdotbelow",
+  0x1ec6,
+  "Ecircumflexgrave",
+  0x1ec0,
+  "Ecircumflexhookabove",
+  0x1ec2,
+  "Ecircumflexsmall",
+  0xf7ea,
+  "Ecircumflextilde",
+  0x1ec4,
+  "Ecyrillic",
+  0x0404,
+  "Edblgrave",
+  0x0204,
+  "Edieresis",
+  0x00cb,
+  "Edieresissmall",
+  0xf7eb,
+  "Edot",
+  0x0116,
+  "Edotaccent",
+  0x0116,
+  "Edotbelow",
+  0x1eb8,
+  "Efcyrillic",
+  0x0424,
+  "Egrave",
+  0x00c8,
+  "Egravesmall",
+  0xf7e8,
+  "Eharmenian",
+  0x0537,
+  "Ehookabove",
+  0x1eba,
+  "Eightroman",
+  0x2167,
+  "Einvertedbreve",
+  0x0206,
+  "Eiotifiedcyrillic",
+  0x0464,
+  "Elcyrillic",
+  0x041b,
+  "Elevenroman",
+  0x216a,
+  "Emacron",
+  0x0112,
+  "Emacronacute",
+  0x1e16,
+  "Emacrongrave",
+  0x1e14,
+  "Emcyrillic",
+  0x041c,
+  "Emonospace",
+  0xff25,
+  "Encyrillic",
+  0x041d,
+  "Endescendercyrillic",
+  0x04a2,
+  "Eng",
+  0x014a,
+  "Enghecyrillic",
+  0x04a4,
+  "Enhookcyrillic",
+  0x04c7,
+  "Eogonek",
+  0x0118,
+  "Eopen",
+  0x0190,
+  "Epsilon",
+  0x0395,
+  "Epsilontonos",
+  0x0388,
+  "Ercyrillic",
+  0x0420,
+  "Ereversed",
+  0x018e,
+  "Ereversedcyrillic",
+  0x042d,
+  "Escyrillic",
+  0x0421,
+  "Esdescendercyrillic",
+  0x04aa,
+  "Esh",
+  0x01a9,
+  "Esmall",
+  0xf765,
+  "Eta",
+  0x0397,
+  "Etarmenian",
+  0x0538,
+  "Etatonos",
+  0x0389,
+  "Eth",
+  0x00d0,
+  "Ethsmall",
+  0xf7f0,
+  "Etilde",
+  0x1ebc,
+  "Etildebelow",
+  0x1e1a,
+  "Euro",
+  0x20ac,
+  "Ezh",
+  0x01b7,
+  "Ezhcaron",
+  0x01ee,
+  "Ezhreversed",
+  0x01b8,
+  "F",
+  0x0046,
+  "Fcircle",
+  0x24bb,
+  "Fdotaccent",
+  0x1e1e,
+  "Feharmenian",
+  0x0556,
+  "Feicoptic",
+  0x03e4,
+  "Fhook",
+  0x0191,
+  "Fitacyrillic",
+  0x0472,
+  "Fiveroman",
+  0x2164,
+  "Fmonospace",
+  0xff26,
+  "Fourroman",
+  0x2163,
+  "Fsmall",
+  0xf766,
+  "G",
+  0x0047,
+  "GBsquare",
+  0x3387,
+  "Gacute",
+  0x01f4,
+  "Gamma",
+  0x0393,
+  "Gammaafrican",
+  0x0194,
+  "Gangiacoptic",
+  0x03ea,
+  "Gbreve",
+  0x011e,
+  "Gcaron",
+  0x01e6,
+  "Gcedilla",
+  0x0122,
+  "Gcircle",
+  0x24bc,
+  "Gcircumflex",
+  0x011c,
+  "Gcommaaccent",
+  0x0122,
+  "Gdot",
+  0x0120,
+  "Gdotaccent",
+  0x0120,
+  "Gecyrillic",
+  0x0413,
+  "Ghadarmenian",
+  0x0542,
+  "Ghemiddlehookcyrillic",
+  0x0494,
+  "Ghestrokecyrillic",
+  0x0492,
+  "Gheupturncyrillic",
+  0x0490,
+  "Ghook",
+  0x0193,
+  "Gimarmenian",
+  0x0533,
+  "Gjecyrillic",
+  0x0403,
+  "Gmacron",
+  0x1e20,
+  "Gmonospace",
+  0xff27,
+  "Grave",
+  0xf6ce,
+  "Gravesmall",
+  0xf760,
+  "Gsmall",
+  0xf767,
+  "Gsmallhook",
+  0x029b,
+  "Gstroke",
+  0x01e4,
+  "H",
+  0x0048,
+  "H18533",
+  0x25cf,
+  "H18543",
+  0x25aa,
+  "H18551",
+  0x25ab,
+  "H22073",
+  0x25a1,
+  "HPsquare",
+  0x33cb,
+  "Haabkhasiancyrillic",
+  0x04a8,
+  "Hadescendercyrillic",
+  0x04b2,
+  "Hardsigncyrillic",
+  0x042a,
+  "Hbar",
+  0x0126,
+  "Hbrevebelow",
+  0x1e2a,
+  "Hcedilla",
+  0x1e28,
+  "Hcircle",
+  0x24bd,
+  "Hcircumflex",
+  0x0124,
+  "Hdieresis",
+  0x1e26,
+  "Hdotaccent",
+  0x1e22,
+  "Hdotbelow",
+  0x1e24,
+  "Hmonospace",
+  0xff28,
+  "Hoarmenian",
+  0x0540,
+  "Horicoptic",
+  0x03e8,
+  "Hsmall",
+  0xf768,
+  "Hungarumlaut",
+  0xf6cf,
+  "Hungarumlautsmall",
+  0xf6f8,
+  "Hzsquare",
+  0x3390,
+  "I",
+  0x0049,
+  "IAcyrillic",
+  0x042f,
+  "IJ",
+  0x0132,
+  "IUcyrillic",
+  0x042e,
+  "Iacute",
+  0x00cd,
+  "Iacutesmall",
+  0xf7ed,
+  "Ibreve",
+  0x012c,
+  "Icaron",
+  0x01cf,
+  "Icircle",
+  0x24be,
+  "Icircumflex",
+  0x00ce,
+  "Icircumflexsmall",
+  0xf7ee,
+  "Icyrillic",
+  0x0406,
+  "Idblgrave",
+  0x0208,
+  "Idieresis",
+  0x00cf,
+  "Idieresisacute",
+  0x1e2e,
+  "Idieresiscyrillic",
+  0x04e4,
+  "Idieresissmall",
+  0xf7ef,
+  "Idot",
+  0x0130,
+  "Idotaccent",
+  0x0130,
+  "Idotbelow",
+  0x1eca,
+  "Iebrevecyrillic",
+  0x04d6,
+  "Iecyrillic",
+  0x0415,
+  "Ifraktur",
+  0x2111,
+  "Igrave",
+  0x00cc,
+  "Igravesmall",
+  0xf7ec,
+  "Ihookabove",
+  0x1ec8,
+  "Iicyrillic",
+  0x0418,
+  "Iinvertedbreve",
+  0x020a,
+  "Iishortcyrillic",
+  0x0419,
+  "Imacron",
+  0x012a,
+  "Imacroncyrillic",
+  0x04e2,
+  "Imonospace",
+  0xff29,
+  "Iniarmenian",
+  0x053b,
+  "Iocyrillic",
+  0x0401,
+  "Iogonek",
+  0x012e,
+  "Iota",
+  0x0399,
+  "Iotaafrican",
+  0x0196,
+  "Iotadieresis",
+  0x03aa,
+  "Iotatonos",
+  0x038a,
+  "Ismall",
+  0xf769,
+  "Istroke",
+  0x0197,
+  "Itilde",
+  0x0128,
+  "Itildebelow",
+  0x1e2c,
+  "Izhitsacyrillic",
+  0x0474,
+  "Izhitsadblgravecyrillic",
+  0x0476,
+  "J",
+  0x004a,
+  "Jaarmenian",
+  0x0541,
+  "Jcircle",
+  0x24bf,
+  "Jcircumflex",
+  0x0134,
+  "Jecyrillic",
+  0x0408,
+  "Jheharmenian",
+  0x054b,
+  "Jmonospace",
+  0xff2a,
+  "Jsmall",
+  0xf76a,
+  "K",
+  0x004b,
+  "KBsquare",
+  0x3385,
+  "KKsquare",
+  0x33cd,
+  "Kabashkircyrillic",
+  0x04a0,
+  "Kacute",
+  0x1e30,
+  "Kacyrillic",
+  0x041a,
+  "Kadescendercyrillic",
+  0x049a,
+  "Kahookcyrillic",
+  0x04c3,
+  "Kappa",
+  0x039a,
+  "Kastrokecyrillic",
+  0x049e,
+  "Kaverticalstrokecyrillic",
+  0x049c,
+  "Kcaron",
+  0x01e8,
+  "Kcedilla",
+  0x0136,
+  "Kcircle",
+  0x24c0,
+  "Kcommaaccent",
+  0x0136,
+  "Kdotbelow",
+  0x1e32,
+  "Keharmenian",
+  0x0554,
+  "Kenarmenian",
+  0x053f,
+  "Khacyrillic",
+  0x0425,
+  "Kheicoptic",
+  0x03e6,
+  "Khook",
+  0x0198,
+  "Kjecyrillic",
+  0x040c,
+  "Klinebelow",
+  0x1e34,
+  "Kmonospace",
+  0xff2b,
+  "Koppacyrillic",
+  0x0480,
+  "Koppagreek",
+  0x03de,
+  "Ksicyrillic",
+  0x046e,
+  "Ksmall",
+  0xf76b,
+  "L",
+  0x004c,
+  "LJ",
+  0x01c7,
+  "LL",
+  0xf6bf,
+  "Lacute",
+  0x0139,
+  "Lambda",
+  0x039b,
+  "Lcaron",
+  0x013d,
+  "Lcedilla",
+  0x013b,
+  "Lcircle",
+  0x24c1,
+  "Lcircumflexbelow",
+  0x1e3c,
+  "Lcommaaccent",
+  0x013b,
+  "Ldot",
+  0x013f,
+  "Ldotaccent",
+  0x013f,
+  "Ldotbelow",
+  0x1e36,
+  "Ldotbelowmacron",
+  0x1e38,
+  "Liwnarmenian",
+  0x053c,
+  "Lj",
+  0x01c8,
+  "Ljecyrillic",
+  0x0409,
+  "Llinebelow",
+  0x1e3a,
+  "Lmonospace",
+  0xff2c,
+  "Lslash",
+  0x0141,
+  "Lslashsmall",
+  0xf6f9,
+  "Lsmall",
+  0xf76c,
+  "M",
+  0x004d,
+  "MBsquare",
+  0x3386,
+  "Macron",
+  0xf6d0,
+  "Macronsmall",
+  0xf7af,
+  "Macute",
+  0x1e3e,
+  "Mcircle",
+  0x24c2,
+  "Mdotaccent",
+  0x1e40,
+  "Mdotbelow",
+  0x1e42,
+  "Menarmenian",
+  0x0544,
+  "Mmonospace",
+  0xff2d,
+  "Msmall",
+  0xf76d,
+  "Mturned",
+  0x019c,
+  "Mu",
+  0x039c,
+  "N",
+  0x004e,
+  "NJ",
+  0x01ca,
+  "Nacute",
+  0x0143,
+  "Ncaron",
+  0x0147,
+  "Ncedilla",
+  0x0145,
+  "Ncircle",
+  0x24c3,
+  "Ncircumflexbelow",
+  0x1e4a,
+  "Ncommaaccent",
+  0x0145,
+  "Ndotaccent",
+  0x1e44,
+  "Ndotbelow",
+  0x1e46,
+  "Nhookleft",
+  0x019d,
+  "Nineroman",
+  0x2168,
+  "Nj",
+  0x01cb,
+  "Njecyrillic",
+  0x040a,
+  "Nlinebelow",
+  0x1e48,
+  "Nmonospace",
+  0xff2e,
+  "Nowarmenian",
+  0x0546,
+  "Nsmall",
+  0xf76e,
+  "Ntilde",
+  0x00d1,
+  "Ntildesmall",
+  0xf7f1,
+  "Nu",
+  0x039d,
+  "O",
+  0x004f,
+  "OE",
+  0x0152,
+  "OEsmall",
+  0xf6fa,
+  "Oacute",
+  0x00d3,
+  "Oacutesmall",
+  0xf7f3,
+  "Obarredcyrillic",
+  0x04e8,
+  "Obarreddieresiscyrillic",
+  0x04ea,
+  "Obreve",
+  0x014e,
+  "Ocaron",
+  0x01d1,
+  "Ocenteredtilde",
+  0x019f,
+  "Ocircle",
+  0x24c4,
+  "Ocircumflex",
+  0x00d4,
+  "Ocircumflexacute",
+  0x1ed0,
+  "Ocircumflexdotbelow",
+  0x1ed8,
+  "Ocircumflexgrave",
+  0x1ed2,
+  "Ocircumflexhookabove",
+  0x1ed4,
+  "Ocircumflexsmall",
+  0xf7f4,
+  "Ocircumflextilde",
+  0x1ed6,
+  "Ocyrillic",
+  0x041e,
+  "Odblacute",
+  0x0150,
+  "Odblgrave",
+  0x020c,
+  "Odieresis",
+  0x00d6,
+  "Odieresiscyrillic",
+  0x04e6,
+  "Odieresissmall",
+  0xf7f6,
+  "Odotbelow",
+  0x1ecc,
+  "Ogoneksmall",
+  0xf6fb,
+  "Ograve",
+  0x00d2,
+  "Ogravesmall",
+  0xf7f2,
+  "Oharmenian",
+  0x0555,
+  "Ohm",
+  0x2126,
+  "Ohookabove",
+  0x1ece,
+  "Ohorn",
+  0x01a0,
+  "Ohornacute",
+  0x1eda,
+  "Ohorndotbelow",
+  0x1ee2,
+  "Ohorngrave",
+  0x1edc,
+  "Ohornhookabove",
+  0x1ede,
+  "Ohorntilde",
+  0x1ee0,
+  "Ohungarumlaut",
+  0x0150,
+  "Oi",
+  0x01a2,
+  "Oinvertedbreve",
+  0x020e,
+  "Omacron",
+  0x014c,
+  "Omacronacute",
+  0x1e52,
+  "Omacrongrave",
+  0x1e50,
+  "Omega",
+  0x2126,
+  "Omegacyrillic",
+  0x0460,
+  "Omegagreek",
+  0x03a9,
+  "Omegaroundcyrillic",
+  0x047a,
+  "Omegatitlocyrillic",
+  0x047c,
+  "Omegatonos",
+  0x038f,
+  "Omicron",
+  0x039f,
+  "Omicrontonos",
+  0x038c,
+  "Omonospace",
+  0xff2f,
+  "Oneroman",
+  0x2160,
+  "Oogonek",
+  0x01ea,
+  "Oogonekmacron",
+  0x01ec,
+  "Oopen",
+  0x0186,
+  "Oslash",
+  0x00d8,
+  "Oslashacute",
+  0x01fe,
+  "Oslashsmall",
+  0xf7f8,
+  "Osmall",
+  0xf76f,
+  "Ostrokeacute",
+  0x01fe,
+  "Otcyrillic",
+  0x047e,
+  "Otilde",
+  0x00d5,
+  "Otildeacute",
+  0x1e4c,
+  "Otildedieresis",
+  0x1e4e,
+  "Otildesmall",
+  0xf7f5,
+  "P",
+  0x0050,
+  "Pacute",
+  0x1e54,
+  "Pcircle",
+  0x24c5,
+  "Pdotaccent",
+  0x1e56,
+  "Pecyrillic",
+  0x041f,
+  "Peharmenian",
+  0x054a,
+  "Pemiddlehookcyrillic",
+  0x04a6,
+  "Phi",
+  0x03a6,
+  "Phook",
+  0x01a4,
+  "Pi",
+  0x03a0,
+  "Piwrarmenian",
+  0x0553,
+  "Pmonospace",
+  0xff30,
+  "Psi",
+  0x03a8,
+  "Psicyrillic",
+  0x0470,
+  "Psmall",
+  0xf770,
+  "Q",
+  0x0051,
+  "Qcircle",
+  0x24c6,
+  "Qmonospace",
+  0xff31,
+  "Qsmall",
+  0xf771,
+  "R",
+  0x0052,
+  "Raarmenian",
+  0x054c,
+  "Racute",
+  0x0154,
+  "Rcaron",
+  0x0158,
+  "Rcedilla",
+  0x0156,
+  "Rcircle",
+  0x24c7,
+  "Rcommaaccent",
+  0x0156,
+  "Rdblgrave",
+  0x0210,
+  "Rdotaccent",
+  0x1e58,
+  "Rdotbelow",
+  0x1e5a,
+  "Rdotbelowmacron",
+  0x1e5c,
+  "Reharmenian",
+  0x0550,
+  "Rfraktur",
+  0x211c,
+  "Rho",
+  0x03a1,
+  "Ringsmall",
+  0xf6fc,
+  "Rinvertedbreve",
+  0x0212,
+  "Rlinebelow",
+  0x1e5e,
+  "Rmonospace",
+  0xff32,
+  "Rsmall",
+  0xf772,
+  "Rsmallinverted",
+  0x0281,
+  "Rsmallinvertedsuperior",
+  0x02b6,
+  "S",
+  0x0053,
+  "SF010000",
+  0x250c,
+  "SF020000",
+  0x2514,
+  "SF030000",
+  0x2510,
+  "SF040000",
+  0x2518,
+  "SF050000",
+  0x253c,
+  "SF060000",
+  0x252c,
+  "SF070000",
+  0x2534,
+  "SF080000",
+  0x251c,
+  "SF090000",
+  0x2524,
+  "SF100000",
+  0x2500,
+  "SF110000",
+  0x2502,
+  "SF190000",
+  0x2561,
+  "SF200000",
+  0x2562,
+  "SF210000",
+  0x2556,
+  "SF220000",
+  0x2555,
+  "SF230000",
+  0x2563,
+  "SF240000",
+  0x2551,
+  "SF250000",
+  0x2557,
+  "SF260000",
+  0x255d,
+  "SF270000",
+  0x255c,
+  "SF280000",
+  0x255b,
+  "SF360000",
+  0x255e,
+  "SF370000",
+  0x255f,
+  "SF380000",
+  0x255a,
+  "SF390000",
+  0x2554,
+  "SF400000",
+  0x2569,
+  "SF410000",
+  0x2566,
+  "SF420000",
+  0x2560,
+  "SF430000",
+  0x2550,
+  "SF440000",
+  0x256c,
+  "SF450000",
+  0x2567,
+  "SF460000",
+  0x2568,
+  "SF470000",
+  0x2564,
+  "SF480000",
+  0x2565,
+  "SF490000",
+  0x2559,
+  "SF500000",
+  0x2558,
+  "SF510000",
+  0x2552,
+  "SF520000",
+  0x2553,
+  "SF530000",
+  0x256b,
+  "SF540000",
+  0x256a,
+  "Sacute",
+  0x015a,
+  "Sacutedotaccent",
+  0x1e64,
+  "Sampigreek",
+  0x03e0,
+  "Scaron",
+  0x0160,
+  "Scarondotaccent",
+  0x1e66,
+  "Scaronsmall",
+  0xf6fd,
+  "Scedilla",
+  0x015e,
+  "Schwa",
+  0x018f,
+  "Schwacyrillic",
+  0x04d8,
+  "Schwadieresiscyrillic",
+  0x04da,
+  "Scircle",
+  0x24c8,
+  "Scircumflex",
+  0x015c,
+  "Scommaaccent",
+  0x0218,
+  "Sdotaccent",
+  0x1e60,
+  "Sdotbelow",
+  0x1e62,
+  "Sdotbelowdotaccent",
+  0x1e68,
+  "Seharmenian",
+  0x054d,
+  "Sevenroman",
+  0x2166,
+  "Shaarmenian",
+  0x0547,
+  "Shacyrillic",
+  0x0428,
+  "Shchacyrillic",
+  0x0429,
+  "Sheicoptic",
+  0x03e2,
+  "Shhacyrillic",
+  0x04ba,
+  "Shimacoptic",
+  0x03ec,
+  "Sigma",
+  0x03a3,
+  "Sixroman",
+  0x2165,
+  "Smonospace",
+  0xff33,
+  "Softsigncyrillic",
+  0x042c,
+  "Ssmall",
+  0xf773,
+  "Stigmagreek",
+  0x03da,
+  "T",
+  0x0054,
+  "Tau",
+  0x03a4,
+  "Tbar",
+  0x0166,
+  "Tcaron",
+  0x0164,
+  "Tcedilla",
+  0x0162,
+  "Tcircle",
+  0x24c9,
+  "Tcircumflexbelow",
+  0x1e70,
+  "Tcommaaccent",
+  0x0162,
+  "Tdotaccent",
+  0x1e6a,
+  "Tdotbelow",
+  0x1e6c,
+  "Tecyrillic",
+  0x0422,
+  "Tedescendercyrillic",
+  0x04ac,
+  "Tenroman",
+  0x2169,
+  "Tetsecyrillic",
+  0x04b4,
+  "Theta",
+  0x0398,
+  "Thook",
+  0x01ac,
+  "Thorn",
+  0x00de,
+  "Thornsmall",
+  0xf7fe,
+  "Threeroman",
+  0x2162,
+  "Tildesmall",
+  0xf6fe,
+  "Tiwnarmenian",
+  0x054f,
+  "Tlinebelow",
+  0x1e6e,
+  "Tmonospace",
+  0xff34,
+  "Toarmenian",
+  0x0539,
+  "Tonefive",
+  0x01bc,
+  "Tonesix",
+  0x0184,
+  "Tonetwo",
+  0x01a7,
+  "Tretroflexhook",
+  0x01ae,
+  "Tsecyrillic",
+  0x0426,
+  "Tshecyrillic",
+  0x040b,
+  "Tsmall",
+  0xf774,
+  "Twelveroman",
+  0x216b,
+  "Tworoman",
+  0x2161,
+  "U",
+  0x0055,
+  "Uacute",
+  0x00da,
+  "Uacutesmall",
+  0xf7fa,
+  "Ubreve",
+  0x016c,
+  "Ucaron",
+  0x01d3,
+  "Ucircle",
+  0x24ca,
+  "Ucircumflex",
+  0x00db,
+  "Ucircumflexbelow",
+  0x1e76,
+  "Ucircumflexsmall",
+  0xf7fb,
+  "Ucyrillic",
+  0x0423,
+  "Udblacute",
+  0x0170,
+  "Udblgrave",
+  0x0214,
+  "Udieresis",
+  0x00dc,
+  "Udieresisacute",
+  0x01d7,
+  "Udieresisbelow",
+  0x1e72,
+  "Udieresiscaron",
+  0x01d9,
+  "Udieresiscyrillic",
+  0x04f0,
+  "Udieresisgrave",
+  0x01db,
+  "Udieresismacron",
+  0x01d5,
+  "Udieresissmall",
+  0xf7fc,
+  "Udotbelow",
+  0x1ee4,
+  "Ugrave",
+  0x00d9,
+  "Ugravesmall",
+  0xf7f9,
+  "Uhookabove",
+  0x1ee6,
+  "Uhorn",
+  0x01af,
+  "Uhornacute",
+  0x1ee8,
+  "Uhorndotbelow",
+  0x1ef0,
+  "Uhorngrave",
+  0x1eea,
+  "Uhornhookabove",
+  0x1eec,
+  "Uhorntilde",
+  0x1eee,
+  "Uhungarumlaut",
+  0x0170,
+  "Uhungarumlautcyrillic",
+  0x04f2,
+  "Uinvertedbreve",
+  0x0216,
+  "Ukcyrillic",
+  0x0478,
+  "Umacron",
+  0x016a,
+  "Umacroncyrillic",
+  0x04ee,
+  "Umacrondieresis",
+  0x1e7a,
+  "Umonospace",
+  0xff35,
+  "Uogonek",
+  0x0172,
+  "Upsilon",
+  0x03a5,
+  "Upsilon1",
+  0x03d2,
+  "Upsilonacutehooksymbolgreek",
+  0x03d3,
+  "Upsilonafrican",
+  0x01b1,
+  "Upsilondieresis",
+  0x03ab,
+  "Upsilondieresishooksymbolgreek",
+  0x03d4,
+  "Upsilonhooksymbol",
+  0x03d2,
+  "Upsilontonos",
+  0x038e,
+  "Uring",
+  0x016e,
+  "Ushortcyrillic",
+  0x040e,
+  "Usmall",
+  0xf775,
+  "Ustraightcyrillic",
+  0x04ae,
+  "Ustraightstrokecyrillic",
+  0x04b0,
+  "Utilde",
+  0x0168,
+  "Utildeacute",
+  0x1e78,
+  "Utildebelow",
+  0x1e74,
+  "V",
+  0x0056,
+  "Vcircle",
+  0x24cb,
+  "Vdotbelow",
+  0x1e7e,
+  "Vecyrillic",
+  0x0412,
+  "Vewarmenian",
+  0x054e,
+  "Vhook",
+  0x01b2,
+  "Vmonospace",
+  0xff36,
+  "Voarmenian",
+  0x0548,
+  "Vsmall",
+  0xf776,
+  "Vtilde",
+  0x1e7c,
+  "W",
+  0x0057,
+  "Wacute",
+  0x1e82,
+  "Wcircle",
+  0x24cc,
+  "Wcircumflex",
+  0x0174,
+  "Wdieresis",
+  0x1e84,
+  "Wdotaccent",
+  0x1e86,
+  "Wdotbelow",
+  0x1e88,
+  "Wgrave",
+  0x1e80,
+  "Wmonospace",
+  0xff37,
+  "Wsmall",
+  0xf777,
+  "X",
+  0x0058,
+  "Xcircle",
+  0x24cd,
+  "Xdieresis",
+  0x1e8c,
+  "Xdotaccent",
+  0x1e8a,
+  "Xeharmenian",
+  0x053d,
+  "Xi",
+  0x039e,
+  "Xmonospace",
+  0xff38,
+  "Xsmall",
+  0xf778,
+  "Y",
+  0x0059,
+  "Yacute",
+  0x00dd,
+  "Yacutesmall",
+  0xf7fd,
+  "Yatcyrillic",
+  0x0462,
+  "Ycircle",
+  0x24ce,
+  "Ycircumflex",
+  0x0176,
+  "Ydieresis",
+  0x0178,
+  "Ydieresissmall",
+  0xf7ff,
+  "Ydotaccent",
+  0x1e8e,
+  "Ydotbelow",
+  0x1ef4,
+  "Yericyrillic",
+  0x042b,
+  "Yerudieresiscyrillic",
+  0x04f8,
+  "Ygrave",
+  0x1ef2,
+  "Yhook",
+  0x01b3,
+  "Yhookabove",
+  0x1ef6,
+  "Yiarmenian",
+  0x0545,
+  "Yicyrillic",
+  0x0407,
+  "Yiwnarmenian",
+  0x0552,
+  "Ymonospace",
+  0xff39,
+  "Ysmall",
+  0xf779,
+  "Ytilde",
+  0x1ef8,
+  "Yusbigcyrillic",
+  0x046a,
+  "Yusbigiotifiedcyrillic",
+  0x046c,
+  "Yuslittlecyrillic",
+  0x0466,
+  "Yuslittleiotifiedcyrillic",
+  0x0468,
+  "Z",
+  0x005a,
+  "Zaarmenian",
+  0x0536,
+  "Zacute",
+  0x0179,
+  "Zcaron",
+  0x017d,
+  "Zcaronsmall",
+  0xf6ff,
+  "Zcircle",
+  0x24cf,
+  "Zcircumflex",
+  0x1e90,
+  "Zdot",
+  0x017b,
+  "Zdotaccent",
+  0x017b,
+  "Zdotbelow",
+  0x1e92,
+  "Zecyrillic",
+  0x0417,
+  "Zedescendercyrillic",
+  0x0498,
+  "Zedieresiscyrillic",
+  0x04de,
+  "Zeta",
+  0x0396,
+  "Zhearmenian",
+  0x053a,
+  "Zhebrevecyrillic",
+  0x04c1,
+  "Zhecyrillic",
+  0x0416,
+  "Zhedescendercyrillic",
+  0x0496,
+  "Zhedieresiscyrillic",
+  0x04dc,
+  "Zlinebelow",
+  0x1e94,
+  "Zmonospace",
+  0xff3a,
+  "Zsmall",
+  0xf77a,
+  "Zstroke",
+  0x01b5,
+  "a",
+  0x0061,
+  "aabengali",
+  0x0986,
+  "aacute",
+  0x00e1,
+  "aadeva",
+  0x0906,
+  "aagujarati",
+  0x0a86,
+  "aagurmukhi",
+  0x0a06,
+  "aamatragurmukhi",
+  0x0a3e,
+  "aarusquare",
+  0x3303,
+  "aavowelsignbengali",
+  0x09be,
+  "aavowelsigndeva",
+  0x093e,
+  "aavowelsigngujarati",
+  0x0abe,
+  "abbreviationmarkarmenian",
+  0x055f,
+  "abbreviationsigndeva",
+  0x0970,
+  "abengali",
+  0x0985,
+  "abopomofo",
+  0x311a,
+  "abreve",
+  0x0103,
+  "abreveacute",
+  0x1eaf,
+  "abrevecyrillic",
+  0x04d1,
+  "abrevedotbelow",
+  0x1eb7,
+  "abrevegrave",
+  0x1eb1,
+  "abrevehookabove",
+  0x1eb3,
+  "abrevetilde",
+  0x1eb5,
+  "acaron",
+  0x01ce,
+  "acircle",
+  0x24d0,
+  "acircumflex",
+  0x00e2,
+  "acircumflexacute",
+  0x1ea5,
+  "acircumflexdotbelow",
+  0x1ead,
+  "acircumflexgrave",
+  0x1ea7,
+  "acircumflexhookabove",
+  0x1ea9,
+  "acircumflextilde",
+  0x1eab,
+  "acute",
+  0x00b4,
+  "acutebelowcmb",
+  0x0317,
+  "acutecmb",
+  0x0301,
+  "acutecomb",
+  0x0301,
+  "acutedeva",
+  0x0954,
+  "acutelowmod",
+  0x02cf,
+  "acutetonecmb",
+  0x0341,
+  "acyrillic",
+  0x0430,
+  "adblgrave",
+  0x0201,
+  "addakgurmukhi",
+  0x0a71,
+  "adeva",
+  0x0905,
+  "adieresis",
+  0x00e4,
+  "adieresiscyrillic",
+  0x04d3,
+  "adieresismacron",
+  0x01df,
+  "adotbelow",
+  0x1ea1,
+  "adotmacron",
+  0x01e1,
+  "ae",
+  0x00e6,
+  "aeacute",
+  0x01fd,
+  "aekorean",
+  0x3150,
+  "aemacron",
+  0x01e3,
+  "afii00208",
+  0x2015,
+  "afii08941",
+  0x20a4,
+  "afii10017",
+  0x0410,
+  "afii10018",
+  0x0411,
+  "afii10019",
+  0x0412,
+  "afii10020",
+  0x0413,
+  "afii10021",
+  0x0414,
+  "afii10022",
+  0x0415,
+  "afii10023",
+  0x0401,
+  "afii10024",
+  0x0416,
+  "afii10025",
+  0x0417,
+  "afii10026",
+  0x0418,
+  "afii10027",
+  0x0419,
+  "afii10028",
+  0x041a,
+  "afii10029",
+  0x041b,
+  "afii10030",
+  0x041c,
+  "afii10031",
+  0x041d,
+  "afii10032",
+  0x041e,
+  "afii10033",
+  0x041f,
+  "afii10034",
+  0x0420,
+  "afii10035",
+  0x0421,
+  "afii10036",
+  0x0422,
+  "afii10037",
+  0x0423,
+  "afii10038",
+  0x0424,
+  "afii10039",
+  0x0425,
+  "afii10040",
+  0x0426,
+  "afii10041",
+  0x0427,
+  "afii10042",
+  0x0428,
+  "afii10043",
+  0x0429,
+  "afii10044",
+  0x042a,
+  "afii10045",
+  0x042b,
+  "afii10046",
+  0x042c,
+  "afii10047",
+  0x042d,
+  "afii10048",
+  0x042e,
+  "afii10049",
+  0x042f,
+  "afii10050",
+  0x0490,
+  "afii10051",
+  0x0402,
+  "afii10052",
+  0x0403,
+  "afii10053",
+  0x0404,
+  "afii10054",
+  0x0405,
+  "afii10055",
+  0x0406,
+  "afii10056",
+  0x0407,
+  "afii10057",
+  0x0408,
+  "afii10058",
+  0x0409,
+  "afii10059",
+  0x040a,
+  "afii10060",
+  0x040b,
+  "afii10061",
+  0x040c,
+  "afii10062",
+  0x040e,
+  "afii10063",
+  0xf6c4,
+  "afii10064",
+  0xf6c5,
+  "afii10065",
+  0x0430,
+  "afii10066",
+  0x0431,
+  "afii10067",
+  0x0432,
+  "afii10068",
+  0x0433,
+  "afii10069",
+  0x0434,
+  "afii10070",
+  0x0435,
+  "afii10071",
+  0x0451,
+  "afii10072",
+  0x0436,
+  "afii10073",
+  0x0437,
+  "afii10074",
+  0x0438,
+  "afii10075",
+  0x0439,
+  "afii10076",
+  0x043a,
+  "afii10077",
+  0x043b,
+  "afii10078",
+  0x043c,
+  "afii10079",
+  0x043d,
+  "afii10080",
+  0x043e,
+  "afii10081",
+  0x043f,
+  "afii10082",
+  0x0440,
+  "afii10083",
+  0x0441,
+  "afii10084",
+  0x0442,
+  "afii10085",
+  0x0443,
+  "afii10086",
+  0x0444,
+  "afii10087",
+  0x0445,
+  "afii10088",
+  0x0446,
+  "afii10089",
+  0x0447,
+  "afii10090",
+  0x0448,
+  "afii10091",
+  0x0449,
+  "afii10092",
+  0x044a,
+  "afii10093",
+  0x044b,
+  "afii10094",
+  0x044c,
+  "afii10095",
+  0x044d,
+  "afii10096",
+  0x044e,
+  "afii10097",
+  0x044f,
+  "afii10098",
+  0x0491,
+  "afii10099",
+  0x0452,
+  "afii10100",
+  0x0453,
+  "afii10101",
+  0x0454,
+  "afii10102",
+  0x0455,
+  "afii10103",
+  0x0456,
+  "afii10104",
+  0x0457,
+  "afii10105",
+  0x0458,
+  "afii10106",
+  0x0459,
+  "afii10107",
+  0x045a,
+  "afii10108",
+  0x045b,
+  "afii10109",
+  0x045c,
+  "afii10110",
+  0x045e,
+  "afii10145",
+  0x040f,
+  "afii10146",
+  0x0462,
+  "afii10147",
+  0x0472,
+  "afii10148",
+  0x0474,
+  "afii10192",
+  0xf6c6,
+  "afii10193",
+  0x045f,
+  "afii10194",
+  0x0463,
+  "afii10195",
+  0x0473,
+  "afii10196",
+  0x0475,
+  "afii10831",
+  0xf6c7,
+  "afii10832",
+  0xf6c8,
+  "afii10846",
+  0x04d9,
+  "afii299",
+  0x200e,
+  "afii300",
+  0x200f,
+  "afii301",
+  0x200d,
+  "afii57381",
+  0x066a,
+  "afii57388",
+  0x060c,
+  "afii57392",
+  0x0660,
+  "afii57393",
+  0x0661,
+  "afii57394",
+  0x0662,
+  "afii57395",
+  0x0663,
+  "afii57396",
+  0x0664,
+  "afii57397",
+  0x0665,
+  "afii57398",
+  0x0666,
+  "afii57399",
+  0x0667,
+  "afii57400",
+  0x0668,
+  "afii57401",
+  0x0669,
+  "afii57403",
+  0x061b,
+  "afii57407",
+  0x061f,
+  "afii57409",
+  0x0621,
+  "afii57410",
+  0x0622,
+  "afii57411",
+  0x0623,
+  "afii57412",
+  0x0624,
+  "afii57413",
+  0x0625,
+  "afii57414",
+  0x0626,
+  "afii57415",
+  0x0627,
+  "afii57416",
+  0x0628,
+  "afii57417",
+  0x0629,
+  "afii57418",
+  0x062a,
+  "afii57419",
+  0x062b,
+  "afii57420",
+  0x062c,
+  "afii57421",
+  0x062d,
+  "afii57422",
+  0x062e,
+  "afii57423",
+  0x062f,
+  "afii57424",
+  0x0630,
+  "afii57425",
+  0x0631,
+  "afii57426",
+  0x0632,
+  "afii57427",
+  0x0633,
+  "afii57428",
+  0x0634,
+  "afii57429",
+  0x0635,
+  "afii57430",
+  0x0636,
+  "afii57431",
+  0x0637,
+  "afii57432",
+  0x0638,
+  "afii57433",
+  0x0639,
+  "afii57434",
+  0x063a,
+  "afii57440",
+  0x0640,
+  "afii57441",
+  0x0641,
+  "afii57442",
+  0x0642,
+  "afii57443",
+  0x0643,
+  "afii57444",
+  0x0644,
+  "afii57445",
+  0x0645,
+  "afii57446",
+  0x0646,
+  "afii57448",
+  0x0648,
+  "afii57449",
+  0x0649,
+  "afii57450",
+  0x064a,
+  "afii57451",
+  0x064b,
+  "afii57452",
+  0x064c,
+  "afii57453",
+  0x064d,
+  "afii57454",
+  0x064e,
+  "afii57455",
+  0x064f,
+  "afii57456",
+  0x0650,
+  "afii57457",
+  0x0651,
+  "afii57458",
+  0x0652,
+  "afii57470",
+  0x0647,
+  "afii57505",
+  0x06a4,
+  "afii57506",
+  0x067e,
+  "afii57507",
+  0x0686,
+  "afii57508",
+  0x0698,
+  "afii57509",
+  0x06af,
+  "afii57511",
+  0x0679,
+  "afii57512",
+  0x0688,
+  "afii57513",
+  0x0691,
+  "afii57514",
+  0x06ba,
+  "afii57519",
+  0x06d2,
+  "afii57534",
+  0x06d5,
+  "afii57636",
+  0x20aa,
+  "afii57645",
+  0x05be,
+  "afii57658",
+  0x05c3,
+  "afii57664",
+  0x05d0,
+  "afii57665",
+  0x05d1,
+  "afii57666",
+  0x05d2,
+  "afii57667",
+  0x05d3,
+  "afii57668",
+  0x05d4,
+  "afii57669",
+  0x05d5,
+  "afii57670",
+  0x05d6,
+  "afii57671",
+  0x05d7,
+  "afii57672",
+  0x05d8,
+  "afii57673",
+  0x05d9,
+  "afii57674",
+  0x05da,
+  "afii57675",
+  0x05db,
+  "afii57676",
+  0x05dc,
+  "afii57677",
+  0x05dd,
+  "afii57678",
+  0x05de,
+  "afii57679",
+  0x05df,
+  "afii57680",
+  0x05e0,
+  "afii57681",
+  0x05e1,
+  "afii57682",
+  0x05e2,
+  "afii57683",
+  0x05e3,
+  "afii57684",
+  0x05e4,
+  "afii57685",
+  0x05e5,
+  "afii57686",
+  0x05e6,
+  "afii57687",
+  0x05e7,
+  "afii57688",
+  0x05e8,
+  "afii57689",
+  0x05e9,
+  "afii57690",
+  0x05ea,
+  "afii57694",
+  0xfb2a,
+  "afii57695",
+  0xfb2b,
+  "afii57700",
+  0xfb4b,
+  "afii57705",
+  0xfb1f,
+  "afii57716",
+  0x05f0,
+  "afii57717",
+  0x05f1,
+  "afii57718",
+  0x05f2,
+  "afii57723",
+  0xfb35,
+  "afii57793",
+  0x05b4,
+  "afii57794",
+  0x05b5,
+  "afii57795",
+  0x05b6,
+  "afii57796",
+  0x05bb,
+  "afii57797",
+  0x05b8,
+  "afii57798",
+  0x05b7,
+  "afii57799",
+  0x05b0,
+  "afii57800",
+  0x05b2,
+  "afii57801",
+  0x05b1,
+  "afii57802",
+  0x05b3,
+  "afii57803",
+  0x05c2,
+  "afii57804",
+  0x05c1,
+  "afii57806",
+  0x05b9,
+  "afii57807",
+  0x05bc,
+  "afii57839",
+  0x05bd,
+  "afii57841",
+  0x05bf,
+  "afii57842",
+  0x05c0,
+  "afii57929",
+  0x02bc,
+  "afii61248",
+  0x2105,
+  "afii61289",
+  0x2113,
+  "afii61352",
+  0x2116,
+  "afii61573",
+  0x202c,
+  "afii61574",
+  0x202d,
+  "afii61575",
+  0x202e,
+  "afii61664",
+  0x200c,
+  "afii63167",
+  0x066d,
+  "afii64937",
+  0x02bd,
+  "agrave",
+  0x00e0,
+  "agujarati",
+  0x0a85,
+  "agurmukhi",
+  0x0a05,
+  "ahiragana",
+  0x3042,
+  "ahookabove",
+  0x1ea3,
+  "aibengali",
+  0x0990,
+  "aibopomofo",
+  0x311e,
+  "aideva",
+  0x0910,
+  "aiecyrillic",
+  0x04d5,
+  "aigujarati",
+  0x0a90,
+  "aigurmukhi",
+  0x0a10,
+  "aimatragurmukhi",
+  0x0a48,
+  "ainarabic",
+  0x0639,
+  "ainfinalarabic",
+  0xfeca,
+  "aininitialarabic",
+  0xfecb,
+  "ainmedialarabic",
+  0xfecc,
+  "ainvertedbreve",
+  0x0203,
+  "aivowelsignbengali",
+  0x09c8,
+  "aivowelsigndeva",
+  0x0948,
+  "aivowelsigngujarati",
+  0x0ac8,
+  "akatakana",
+  0x30a2,
+  "akatakanahalfwidth",
+  0xff71,
+  "akorean",
+  0x314f,
+  "alef",
+  0x05d0,
+  "alefarabic",
+  0x0627,
+  "alefdageshhebrew",
+  0xfb30,
+  "aleffinalarabic",
+  0xfe8e,
+  "alefhamzaabovearabic",
+  0x0623,
+  "alefhamzaabovefinalarabic",
+  0xfe84,
+  "alefhamzabelowarabic",
+  0x0625,
+  "alefhamzabelowfinalarabic",
+  0xfe88,
+  "alefhebrew",
+  0x05d0,
+  "aleflamedhebrew",
+  0xfb4f,
+  "alefmaddaabovearabic",
+  0x0622,
+  "alefmaddaabovefinalarabic",
+  0xfe82,
+  "alefmaksuraarabic",
+  0x0649,
+  "alefmaksurafinalarabic",
+  0xfef0,
+  "alefmaksurainitialarabic",
+  0xfef3,
+  "alefmaksuramedialarabic",
+  0xfef4,
+  "alefpatahhebrew",
+  0xfb2e,
+  "alefqamatshebrew",
+  0xfb2f,
+  "aleph",
+  0x2135,
+  "allequal",
+  0x224c,
+  "alpha",
+  0x03b1,
+  "alphatonos",
+  0x03ac,
+  "amacron",
+  0x0101,
+  "amonospace",
+  0xff41,
+  "ampersand",
+  0x0026,
+  "ampersandmonospace",
+  0xff06,
+  "ampersandsmall",
+  0xf726,
+  "amsquare",
+  0x33c2,
+  "anbopomofo",
+  0x3122,
+  "angbopomofo",
+  0x3124,
+  "angbracketleft",
+  0x3008,
+  "angbracketright",
+  0x3009,
+  "angkhankhuthai",
+  0x0e5a,
+  "angle",
+  0x2220,
+  "anglebracketleft",
+  0x3008,
+  "anglebracketleftvertical",
+  0xfe3f,
+  "anglebracketright",
+  0x3009,
+  "anglebracketrightvertical",
+  0xfe40,
+  "angleleft",
+  0x2329,
+  "angleright",
+  0x232a,
+  "angstrom",
+  0x212b,
+  "anoteleia",
+  0x0387,
+  "anudattadeva",
+  0x0952,
+  "anusvarabengali",
+  0x0982,
+  "anusvaradeva",
+  0x0902,
+  "anusvaragujarati",
+  0x0a82,
+  "aogonek",
+  0x0105,
+  "apaatosquare",
+  0x3300,
+  "aparen",
+  0x249c,
+  "apostrophearmenian",
+  0x055a,
+  "apostrophemod",
+  0x02bc,
+  "apple",
+  0xf8ff,
+  "approaches",
+  0x2250,
+  "approxequal",
+  0x2248,
+  "approxequalorimage",
+  0x2252,
+  "approximatelyequal",
+  0x2245,
+  "araeaekorean",
+  0x318e,
+  "araeakorean",
+  0x318d,
+  "arc",
+  0x2312,
+  "arighthalfring",
+  0x1e9a,
+  "aring",
+  0x00e5,
+  "aringacute",
+  0x01fb,
+  "aringbelow",
+  0x1e01,
+  "arrowboth",
+  0x2194,
+  "arrowdashdown",
+  0x21e3,
+  "arrowdashleft",
+  0x21e0,
+  "arrowdashright",
+  0x21e2,
+  "arrowdashup",
+  0x21e1,
+  "arrowdblboth",
+  0x21d4,
+  "arrowdbldown",
+  0x21d3,
+  "arrowdblleft",
+  0x21d0,
+  "arrowdblright",
+  0x21d2,
+  "arrowdblup",
+  0x21d1,
+  "arrowdown",
+  0x2193,
+  "arrowdownleft",
+  0x2199,
+  "arrowdownright",
+  0x2198,
+  "arrowdownwhite",
+  0x21e9,
+  "arrowheaddownmod",
+  0x02c5,
+  "arrowheadleftmod",
+  0x02c2,
+  "arrowheadrightmod",
+  0x02c3,
+  "arrowheadupmod",
+  0x02c4,
+  "arrowhorizex",
+  0xf8e7,
+  "arrowleft",
+  0x2190,
+  "arrowleftdbl",
+  0x21d0,
+  "arrowleftdblstroke",
+  0x21cd,
+  "arrowleftoverright",
+  0x21c6,
+  "arrowleftwhite",
+  0x21e6,
+  "arrowright",
+  0x2192,
+  "arrowrightdblstroke",
+  0x21cf,
+  "arrowrightheavy",
+  0x279e,
+  "arrowrightoverleft",
+  0x21c4,
+  "arrowrightwhite",
+  0x21e8,
+  "arrowtableft",
+  0x21e4,
+  "arrowtabright",
+  0x21e5,
+  "arrowup",
+  0x2191,
+  "arrowupdn",
+  0x2195,
+  "arrowupdnbse",
+  0x21a8,
+  "arrowupdownbase",
+  0x21a8,
+  "arrowupleft",
+  0x2196,
+  "arrowupleftofdown",
+  0x21c5,
+  "arrowupright",
+  0x2197,
+  "arrowupwhite",
+  0x21e7,
+  "arrowvertex",
+  0xf8e6,
+  "asciicircum",
+  0x005e,
+  "asciicircummonospace",
+  0xff3e,
+  "asciitilde",
+  0x007e,
+  "asciitildemonospace",
+  0xff5e,
+  "ascript",
+  0x0251,
+  "ascriptturned",
+  0x0252,
+  "asmallhiragana",
+  0x3041,
+  "asmallkatakana",
+  0x30a1,
+  "asmallkatakanahalfwidth",
+  0xff67,
+  "asterisk",
+  0x002a,
+  "asteriskaltonearabic",
+  0x066d,
+  "asteriskarabic",
+  0x066d,
+  "asteriskmath",
+  0x2217,
+  "asteriskmonospace",
+  0xff0a,
+  "asterisksmall",
+  0xfe61,
+  "asterism",
+  0x2042,
+  "asuperior",
+  0xf6e9,
+  "asymptoticallyequal",
+  0x2243,
+  "at",
+  0x0040,
+  "atilde",
+  0x00e3,
+  "atmonospace",
+  0xff20,
+  "atsmall",
+  0xfe6b,
+  "aturned",
+  0x0250,
+  "aubengali",
+  0x0994,
+  "aubopomofo",
+  0x3120,
+  "audeva",
+  0x0914,
+  "augujarati",
+  0x0a94,
+  "augurmukhi",
+  0x0a14,
+  "aulengthmarkbengali",
+  0x09d7,
+  "aumatragurmukhi",
+  0x0a4c,
+  "auvowelsignbengali",
+  0x09cc,
+  "auvowelsigndeva",
+  0x094c,
+  "auvowelsigngujarati",
+  0x0acc,
+  "avagrahadeva",
+  0x093d,
+  "aybarmenian",
+  0x0561,
+  "ayin",
+  0x05e2,
+  "ayinaltonehebrew",
+  0xfb20,
+  "ayinhebrew",
+  0x05e2,
+  "b",
+  0x0062,
+  "babengali",
+  0x09ac,
+  "backslash",
+  0x005c,
+  "backslashmonospace",
+  0xff3c,
+  "badeva",
+  0x092c,
+  "bagujarati",
+  0x0aac,
+  "bagurmukhi",
+  0x0a2c,
+  "bahiragana",
+  0x3070,
+  "bahtthai",
+  0x0e3f,
+  "bakatakana",
+  0x30d0,
+  "bar",
+  0x007c,
+  "barmonospace",
+  0xff5c,
+  "bbopomofo",
+  0x3105,
+  "bcircle",
+  0x24d1,
+  "bdotaccent",
+  0x1e03,
+  "bdotbelow",
+  0x1e05,
+  "beamedsixteenthnotes",
+  0x266c,
+  "because",
+  0x2235,
+  "becyrillic",
+  0x0431,
+  "beharabic",
+  0x0628,
+  "behfinalarabic",
+  0xfe90,
+  "behinitialarabic",
+  0xfe91,
+  "behiragana",
+  0x3079,
+  "behmedialarabic",
+  0xfe92,
+  "behmeeminitialarabic",
+  0xfc9f,
+  "behmeemisolatedarabic",
+  0xfc08,
+  "behnoonfinalarabic",
+  0xfc6d,
+  "bekatakana",
+  0x30d9,
+  "benarmenian",
+  0x0562,
+  "bet",
+  0x05d1,
+  "beta",
+  0x03b2,
+  "betasymbolgreek",
+  0x03d0,
+  "betdagesh",
+  0xfb31,
+  "betdageshhebrew",
+  0xfb31,
+  "bethebrew",
+  0x05d1,
+  "betrafehebrew",
+  0xfb4c,
+  "bhabengali",
+  0x09ad,
+  "bhadeva",
+  0x092d,
+  "bhagujarati",
+  0x0aad,
+  "bhagurmukhi",
+  0x0a2d,
+  "bhook",
+  0x0253,
+  "bihiragana",
+  0x3073,
+  "bikatakana",
+  0x30d3,
+  "bilabialclick",
+  0x0298,
+  "bindigurmukhi",
+  0x0a02,
+  "birusquare",
+  0x3331,
+  "blackcircle",
+  0x25cf,
+  "blackdiamond",
+  0x25c6,
+  "blackdownpointingtriangle",
+  0x25bc,
+  "blackleftpointingpointer",
+  0x25c4,
+  "blackleftpointingtriangle",
+  0x25c0,
+  "blacklenticularbracketleft",
+  0x3010,
+  "blacklenticularbracketleftvertical",
+  0xfe3b,
+  "blacklenticularbracketright",
+  0x3011,
+  "blacklenticularbracketrightvertical",
+  0xfe3c,
+  "blacklowerlefttriangle",
+  0x25e3,
+  "blacklowerrighttriangle",
+  0x25e2,
+  "blackrectangle",
+  0x25ac,
+  "blackrightpointingpointer",
+  0x25ba,
+  "blackrightpointingtriangle",
+  0x25b6,
+  "blacksmallsquare",
+  0x25aa,
+  "blacksmilingface",
+  0x263b,
+  "blacksquare",
+  0x25a0,
+  "blackstar",
+  0x2605,
+  "blackupperlefttriangle",
+  0x25e4,
+  "blackupperrighttriangle",
+  0x25e5,
+  "blackuppointingsmalltriangle",
+  0x25b4,
+  "blackuppointingtriangle",
+  0x25b2,
+  "blank",
+  0x2423,
+  "blinebelow",
+  0x1e07,
+  "block",
+  0x2588,
+  "bmonospace",
+  0xff42,
+  "bobaimaithai",
+  0x0e1a,
+  "bohiragana",
+  0x307c,
+  "bokatakana",
+  0x30dc,
+  "bparen",
+  0x249d,
+  "bqsquare",
+  0x33c3,
+  "braceex",
+  0xf8f4,
+  "braceleft",
+  0x007b,
+  "braceleftbt",
+  0xf8f3,
+  "braceleftmid",
+  0xf8f2,
+  "braceleftmonospace",
+  0xff5b,
+  "braceleftsmall",
+  0xfe5b,
+  "bracelefttp",
+  0xf8f1,
+  "braceleftvertical",
+  0xfe37,
+  "braceright",
+  0x007d,
+  "bracerightbt",
+  0xf8fe,
+  "bracerightmid",
+  0xf8fd,
+  "bracerightmonospace",
+  0xff5d,
+  "bracerightsmall",
+  0xfe5c,
+  "bracerighttp",
+  0xf8fc,
+  "bracerightvertical",
+  0xfe38,
+  "bracketleft",
+  0x005b,
+  "bracketleftbt",
+  0xf8f0,
+  "bracketleftex",
+  0xf8ef,
+  "bracketleftmonospace",
+  0xff3b,
+  "bracketlefttp",
+  0xf8ee,
+  "bracketright",
+  0x005d,
+  "bracketrightbt",
+  0xf8fb,
+  "bracketrightex",
+  0xf8fa,
+  "bracketrightmonospace",
+  0xff3d,
+  "bracketrighttp",
+  0xf8f9,
+  "breve",
+  0x02d8,
+  "brevebelowcmb",
+  0x032e,
+  "brevecmb",
+  0x0306,
+  "breveinvertedbelowcmb",
+  0x032f,
+  "breveinvertedcmb",
+  0x0311,
+  "breveinverteddoublecmb",
+  0x0361,
+  "bridgebelowcmb",
+  0x032a,
+  "bridgeinvertedbelowcmb",
+  0x033a,
+  "brokenbar",
+  0x00a6,
+  "bstroke",
+  0x0180,
+  "bsuperior",
+  0xf6ea,
+  "btopbar",
+  0x0183,
+  "buhiragana",
+  0x3076,
+  "bukatakana",
+  0x30d6,
+  "bullet",
+  0x2022,
+  "bulletinverse",
+  0x25d8,
+  "bulletoperator",
+  0x2219,
+  "bullseye",
+  0x25ce,
+  "c",
+  0x0063,
+  "caarmenian",
+  0x056e,
+  "cabengali",
+  0x099a,
+  "cacute",
+  0x0107,
+  "cadeva",
+  0x091a,
+  "cagujarati",
+  0x0a9a,
+  "cagurmukhi",
+  0x0a1a,
+  "calsquare",
+  0x3388,
+  "candrabindubengali",
+  0x0981,
+  "candrabinducmb",
+  0x0310,
+  "candrabindudeva",
+  0x0901,
+  "candrabindugujarati",
+  0x0a81,
+  "capslock",
+  0x21ea,
+  "careof",
+  0x2105,
+  "caron",
+  0x02c7,
+  "caronbelowcmb",
+  0x032c,
+  "caroncmb",
+  0x030c,
+  "carriagereturn",
+  0x21b5,
+  "cbopomofo",
+  0x3118,
+  "ccaron",
+  0x010d,
+  "ccedilla",
+  0x00e7,
+  "ccedillaacute",
+  0x1e09,
+  "ccircle",
+  0x24d2,
+  "ccircumflex",
+  0x0109,
+  "ccurl",
+  0x0255,
+  "cdot",
+  0x010b,
+  "cdotaccent",
+  0x010b,
+  "cdsquare",
+  0x33c5,
+  "cedilla",
+  0x00b8,
+  "cedillacmb",
+  0x0327,
+  "cent",
+  0x00a2,
+  "centigrade",
+  0x2103,
+  "centinferior",
+  0xf6df,
+  "centmonospace",
+  0xffe0,
+  "centoldstyle",
+  0xf7a2,
+  "centsuperior",
+  0xf6e0,
+  "chaarmenian",
+  0x0579,
+  "chabengali",
+  0x099b,
+  "chadeva",
+  0x091b,
+  "chagujarati",
+  0x0a9b,
+  "chagurmukhi",
+  0x0a1b,
+  "chbopomofo",
+  0x3114,
+  "cheabkhasiancyrillic",
+  0x04bd,
+  "checkmark",
+  0x2713,
+  "checyrillic",
+  0x0447,
+  "chedescenderabkhasiancyrillic",
+  0x04bf,
+  "chedescendercyrillic",
+  0x04b7,
+  "chedieresiscyrillic",
+  0x04f5,
+  "cheharmenian",
+  0x0573,
+  "chekhakassiancyrillic",
+  0x04cc,
+  "cheverticalstrokecyrillic",
+  0x04b9,
+  "chi",
+  0x03c7,
+  "chieuchacirclekorean",
+  0x3277,
+  "chieuchaparenkorean",
+  0x3217,
+  "chieuchcirclekorean",
+  0x3269,
+  "chieuchkorean",
+  0x314a,
+  "chieuchparenkorean",
+  0x3209,
+  "chochangthai",
+  0x0e0a,
+  "chochanthai",
+  0x0e08,
+  "chochingthai",
+  0x0e09,
+  "chochoethai",
+  0x0e0c,
+  "chook",
+  0x0188,
+  "cieucacirclekorean",
+  0x3276,
+  "cieucaparenkorean",
+  0x3216,
+  "cieuccirclekorean",
+  0x3268,
+  "cieuckorean",
+  0x3148,
+  "cieucparenkorean",
+  0x3208,
+  "cieucuparenkorean",
+  0x321c,
+  "circle",
+  0x25cb,
+  "circlecopyrt",
+  0x00a9,
+  "circlemultiply",
+  0x2297,
+  "circleot",
+  0x2299,
+  "circleplus",
+  0x2295,
+  "circlepostalmark",
+  0x3036,
+  "circlewithlefthalfblack",
+  0x25d0,
+  "circlewithrighthalfblack",
+  0x25d1,
+  "circumflex",
+  0x02c6,
+  "circumflexbelowcmb",
+  0x032d,
+  "circumflexcmb",
+  0x0302,
+  "clear",
+  0x2327,
+  "clickalveolar",
+  0x01c2,
+  "clickdental",
+  0x01c0,
+  "clicklateral",
+  0x01c1,
+  "clickretroflex",
+  0x01c3,
+  "club",
+  0x2663,
+  "clubsuitblack",
+  0x2663,
+  "clubsuitwhite",
+  0x2667,
+  "cmcubedsquare",
+  0x33a4,
+  "cmonospace",
+  0xff43,
+  "cmsquaredsquare",
+  0x33a0,
+  "coarmenian",
+  0x0581,
+  "colon",
+  0x003a,
+  "colonmonetary",
+  0x20a1,
+  "colonmonospace",
+  0xff1a,
+  "colonsign",
+  0x20a1,
+  "colonsmall",
+  0xfe55,
+  "colontriangularhalfmod",
+  0x02d1,
+  "colontriangularmod",
+  0x02d0,
+  "comma",
+  0x002c,
+  "commaabovecmb",
+  0x0313,
+  "commaaboverightcmb",
+  0x0315,
+  "commaaccent",
+  0xf6c3,
+  "commaarabic",
+  0x060c,
+  "commaarmenian",
+  0x055d,
+  "commainferior",
+  0xf6e1,
+  "commamonospace",
+  0xff0c,
+  "commareversedabovecmb",
+  0x0314,
+  "commareversedmod",
+  0x02bd,
+  "commasmall",
+  0xfe50,
+  "commasuperior",
+  0xf6e2,
+  "commaturnedabovecmb",
+  0x0312,
+  "commaturnedmod",
+  0x02bb,
+  "compass",
+  0x263c,
+  "congruent",
+  0x2245,
+  "contourintegral",
+  0x222e,
+  "control",
+  0x2303,
+  "controlACK",
+  0x0006,
+  "controlBEL",
+  0x0007,
+  "controlBS",
+  0x0008,
+  "controlCAN",
+  0x0018,
+  "controlCR",
+  0x000d,
+  "controlDC1",
+  0x0011,
+  "controlDC2",
+  0x0012,
+  "controlDC3",
+  0x0013,
+  "controlDC4",
+  0x0014,
+  "controlDEL",
+  0x007f,
+  "controlDLE",
+  0x0010,
+  "controlEM",
+  0x0019,
+  "controlENQ",
+  0x0005,
+  "controlEOT",
+  0x0004,
+  "controlESC",
+  0x001b,
+  "controlETB",
+  0x0017,
+  "controlETX",
+  0x0003,
+  "controlFF",
+  0x000c,
+  "controlFS",
+  0x001c,
+  "controlGS",
+  0x001d,
+  "controlHT",
+  0x0009,
+  "controlLF",
+  0x000a,
+  "controlNAK",
+  0x0015,
+  "controlNULL",
+  0x0000,
+  "controlRS",
+  0x001e,
+  "controlSI",
+  0x000f,
+  "controlSO",
+  0x000e,
+  "controlSOT",
+  0x0002,
+  "controlSTX",
+  0x0001,
+  "controlSUB",
+  0x001a,
+  "controlSYN",
+  0x0016,
+  "controlUS",
+  0x001f,
+  "controlVT",
+  0x000b,
+  "copyright",
+  0x00a9,
+  "copyrightsans",
+  0xf8e9,
+  "copyrightserif",
+  0xf6d9,
+  "cornerbracketleft",
+  0x300c,
+  "cornerbracketlefthalfwidth",
+  0xff62,
+  "cornerbracketleftvertical",
+  0xfe41,
+  "cornerbracketright",
+  0x300d,
+  "cornerbracketrighthalfwidth",
+  0xff63,
+  "cornerbracketrightvertical",
+  0xfe42,
+  "corporationsquare",
+  0x337f,
+  "cosquare",
+  0x33c7,
+  "coverkgsquare",
+  0x33c6,
+  "cparen",
+  0x249e,
+  "cruzeiro",
+  0x20a2,
+  "cstretched",
+  0x0297,
+  "curlyand",
+  0x22cf,
+  "curlyor",
+  0x22ce,
+  "currency",
+  0x00a4,
+  "cyrBreve",
+  0xf6d1,
+  "cyrFlex",
+  0xf6d2,
+  "cyrbreve",
+  0xf6d4,
+  "cyrflex",
+  0xf6d5,
+  "d",
+  0x0064,
+  "daarmenian",
+  0x0564,
+  "dabengali",
+  0x09a6,
+  "dadarabic",
+  0x0636,
+  "dadeva",
+  0x0926,
+  "dadfinalarabic",
+  0xfebe,
+  "dadinitialarabic",
+  0xfebf,
+  "dadmedialarabic",
+  0xfec0,
+  "dagesh",
+  0x05bc,
+  "dageshhebrew",
+  0x05bc,
+  "dagger",
+  0x2020,
+  "daggerdbl",
+  0x2021,
+  "dagujarati",
+  0x0aa6,
+  "dagurmukhi",
+  0x0a26,
+  "dahiragana",
+  0x3060,
+  "dakatakana",
+  0x30c0,
+  "dalarabic",
+  0x062f,
+  "dalet",
+  0x05d3,
+  "daletdagesh",
+  0xfb33,
+  "daletdageshhebrew",
+  0xfb33,
+  "dalethebrew",
+  0x05d3,
+  "dalfinalarabic",
+  0xfeaa,
+  "dammaarabic",
+  0x064f,
+  "dammalowarabic",
+  0x064f,
+  "dammatanaltonearabic",
+  0x064c,
+  "dammatanarabic",
+  0x064c,
+  "danda",
+  0x0964,
+  "dargahebrew",
+  0x05a7,
+  "dargalefthebrew",
+  0x05a7,
+  "dasiapneumatacyrilliccmb",
+  0x0485,
+  "dblGrave",
+  0xf6d3,
+  "dblanglebracketleft",
+  0x300a,
+  "dblanglebracketleftvertical",
+  0xfe3d,
+  "dblanglebracketright",
+  0x300b,
+  "dblanglebracketrightvertical",
+  0xfe3e,
+  "dblarchinvertedbelowcmb",
+  0x032b,
+  "dblarrowleft",
+  0x21d4,
+  "dblarrowright",
+  0x21d2,
+  "dbldanda",
+  0x0965,
+  "dblgrave",
+  0xf6d6,
+  "dblgravecmb",
+  0x030f,
+  "dblintegral",
+  0x222c,
+  "dbllowline",
+  0x2017,
+  "dbllowlinecmb",
+  0x0333,
+  "dbloverlinecmb",
+  0x033f,
+  "dblprimemod",
+  0x02ba,
+  "dblverticalbar",
+  0x2016,
+  "dblverticallineabovecmb",
+  0x030e,
+  "dbopomofo",
+  0x3109,
+  "dbsquare",
+  0x33c8,
+  "dcaron",
+  0x010f,
+  "dcedilla",
+  0x1e11,
+  "dcircle",
+  0x24d3,
+  "dcircumflexbelow",
+  0x1e13,
+  "dcroat",
+  0x0111,
+  "ddabengali",
+  0x09a1,
+  "ddadeva",
+  0x0921,
+  "ddagujarati",
+  0x0aa1,
+  "ddagurmukhi",
+  0x0a21,
+  "ddalarabic",
+  0x0688,
+  "ddalfinalarabic",
+  0xfb89,
+  "dddhadeva",
+  0x095c,
+  "ddhabengali",
+  0x09a2,
+  "ddhadeva",
+  0x0922,
+  "ddhagujarati",
+  0x0aa2,
+  "ddhagurmukhi",
+  0x0a22,
+  "ddotaccent",
+  0x1e0b,
+  "ddotbelow",
+  0x1e0d,
+  "decimalseparatorarabic",
+  0x066b,
+  "decimalseparatorpersian",
+  0x066b,
+  "decyrillic",
+  0x0434,
+  "degree",
+  0x00b0,
+  "dehihebrew",
+  0x05ad,
+  "dehiragana",
+  0x3067,
+  "deicoptic",
+  0x03ef,
+  "dekatakana",
+  0x30c7,
+  "deleteleft",
+  0x232b,
+  "deleteright",
+  0x2326,
+  "delta",
+  0x03b4,
+  "deltaturned",
+  0x018d,
+  "denominatorminusonenumeratorbengali",
+  0x09f8,
+  "dezh",
+  0x02a4,
+  "dhabengali",
+  0x09a7,
+  "dhadeva",
+  0x0927,
+  "dhagujarati",
+  0x0aa7,
+  "dhagurmukhi",
+  0x0a27,
+  "dhook",
+  0x0257,
+  "dialytikatonos",
+  0x0385,
+  "dialytikatonoscmb",
+  0x0344,
+  "diamond",
+  0x2666,
+  "diamondsuitwhite",
+  0x2662,
+  "dieresis",
+  0x00a8,
+  "dieresisacute",
+  0xf6d7,
+  "dieresisbelowcmb",
+  0x0324,
+  "dieresiscmb",
+  0x0308,
+  "dieresisgrave",
+  0xf6d8,
+  "dieresistonos",
+  0x0385,
+  "dihiragana",
+  0x3062,
+  "dikatakana",
+  0x30c2,
+  "dittomark",
+  0x3003,
+  "divide",
+  0x00f7,
+  "divides",
+  0x2223,
+  "divisionslash",
+  0x2215,
+  "djecyrillic",
+  0x0452,
+  "dkshade",
+  0x2593,
+  "dlinebelow",
+  0x1e0f,
+  "dlsquare",
+  0x3397,
+  "dmacron",
+  0x0111,
+  "dmonospace",
+  0xff44,
+  "dnblock",
+  0x2584,
+  "dochadathai",
+  0x0e0e,
+  "dodekthai",
+  0x0e14,
+  "dohiragana",
+  0x3069,
+  "dokatakana",
+  0x30c9,
+  "dollar",
+  0x0024,
+  "dollarinferior",
+  0xf6e3,
+  "dollarmonospace",
+  0xff04,
+  "dollaroldstyle",
+  0xf724,
+  "dollarsmall",
+  0xfe69,
+  "dollarsuperior",
+  0xf6e4,
+  "dong",
+  0x20ab,
+  "dorusquare",
+  0x3326,
+  "dotaccent",
+  0x02d9,
+  "dotaccentcmb",
+  0x0307,
+  "dotbelowcmb",
+  0x0323,
+  "dotbelowcomb",
+  0x0323,
+  "dotkatakana",
+  0x30fb,
+  "dotlessi",
+  0x0131,
+  "dotlessj",
+  0xf6be,
+  "dotlessjstrokehook",
+  0x0284,
+  "dotmath",
+  0x22c5,
+  "dottedcircle",
+  0x25cc,
+  "doubleyodpatah",
+  0xfb1f,
+  "doubleyodpatahhebrew",
+  0xfb1f,
+  "downtackbelowcmb",
+  0x031e,
+  "downtackmod",
+  0x02d5,
+  "dparen",
+  0x249f,
+  "dsuperior",
+  0xf6eb,
+  "dtail",
+  0x0256,
+  "dtopbar",
+  0x018c,
+  "duhiragana",
+  0x3065,
+  "dukatakana",
+  0x30c5,
+  "dz",
+  0x01f3,
+  "dzaltone",
+  0x02a3,
+  "dzcaron",
+  0x01c6,
+  "dzcurl",
+  0x02a5,
+  "dzeabkhasiancyrillic",
+  0x04e1,
+  "dzecyrillic",
+  0x0455,
+  "dzhecyrillic",
+  0x045f,
+  "e",
+  0x0065,
+  "eacute",
+  0x00e9,
+  "earth",
+  0x2641,
+  "ebengali",
+  0x098f,
+  "ebopomofo",
+  0x311c,
+  "ebreve",
+  0x0115,
+  "ecandradeva",
+  0x090d,
+  "ecandragujarati",
+  0x0a8d,
+  "ecandravowelsigndeva",
+  0x0945,
+  "ecandravowelsigngujarati",
+  0x0ac5,
+  "ecaron",
+  0x011b,
+  "ecedillabreve",
+  0x1e1d,
+  "echarmenian",
+  0x0565,
+  "echyiwnarmenian",
+  0x0587,
+  "ecircle",
+  0x24d4,
+  "ecircumflex",
+  0x00ea,
+  "ecircumflexacute",
+  0x1ebf,
+  "ecircumflexbelow",
+  0x1e19,
+  "ecircumflexdotbelow",
+  0x1ec7,
+  "ecircumflexgrave",
+  0x1ec1,
+  "ecircumflexhookabove",
+  0x1ec3,
+  "ecircumflextilde",
+  0x1ec5,
+  "ecyrillic",
+  0x0454,
+  "edblgrave",
+  0x0205,
+  "edeva",
+  0x090f,
+  "edieresis",
+  0x00eb,
+  "edot",
+  0x0117,
+  "edotaccent",
+  0x0117,
+  "edotbelow",
+  0x1eb9,
+  "eegurmukhi",
+  0x0a0f,
+  "eematragurmukhi",
+  0x0a47,
+  "efcyrillic",
+  0x0444,
+  "egrave",
+  0x00e8,
+  "egujarati",
+  0x0a8f,
+  "eharmenian",
+  0x0567,
+  "ehbopomofo",
+  0x311d,
+  "ehiragana",
+  0x3048,
+  "ehookabove",
+  0x1ebb,
+  "eibopomofo",
+  0x311f,
+  "eight",
+  0x0038,
+  "eightarabic",
+  0x0668,
+  "eightbengali",
+  0x09ee,
+  "eightcircle",
+  0x2467,
+  "eightcircleinversesansserif",
+  0x2791,
+  "eightdeva",
+  0x096e,
+  "eighteencircle",
+  0x2471,
+  "eighteenparen",
+  0x2485,
+  "eighteenperiod",
+  0x2499,
+  "eightgujarati",
+  0x0aee,
+  "eightgurmukhi",
+  0x0a6e,
+  "eighthackarabic",
+  0x0668,
+  "eighthangzhou",
+  0x3028,
+  "eighthnotebeamed",
+  0x266b,
+  "eightideographicparen",
+  0x3227,
+  "eightinferior",
+  0x2088,
+  "eightmonospace",
+  0xff18,
+  "eightoldstyle",
+  0xf738,
+  "eightparen",
+  0x247b,
+  "eightperiod",
+  0x248f,
+  "eightpersian",
+  0x06f8,
+  "eightroman",
+  0x2177,
+  "eightsuperior",
+  0x2078,
+  "eightthai",
+  0x0e58,
+  "einvertedbreve",
+  0x0207,
+  "eiotifiedcyrillic",
+  0x0465,
+  "ekatakana",
+  0x30a8,
+  "ekatakanahalfwidth",
+  0xff74,
+  "ekonkargurmukhi",
+  0x0a74,
+  "ekorean",
+  0x3154,
+  "elcyrillic",
+  0x043b,
+  "element",
+  0x2208,
+  "elevencircle",
+  0x246a,
+  "elevenparen",
+  0x247e,
+  "elevenperiod",
+  0x2492,
+  "elevenroman",
+  0x217a,
+  "ellipsis",
+  0x2026,
+  "ellipsisvertical",
+  0x22ee,
+  "emacron",
+  0x0113,
+  "emacronacute",
+  0x1e17,
+  "emacrongrave",
+  0x1e15,
+  "emcyrillic",
+  0x043c,
+  "emdash",
+  0x2014,
+  "emdashvertical",
+  0xfe31,
+  "emonospace",
+  0xff45,
+  "emphasismarkarmenian",
+  0x055b,
+  "emptyset",
+  0x2205,
+  "enbopomofo",
+  0x3123,
+  "encyrillic",
+  0x043d,
+  "endash",
+  0x2013,
+  "endashvertical",
+  0xfe32,
+  "endescendercyrillic",
+  0x04a3,
+  "eng",
+  0x014b,
+  "engbopomofo",
+  0x3125,
+  "enghecyrillic",
+  0x04a5,
+  "enhookcyrillic",
+  0x04c8,
+  "enspace",
+  0x2002,
+  "eogonek",
+  0x0119,
+  "eokorean",
+  0x3153,
+  "eopen",
+  0x025b,
+  "eopenclosed",
+  0x029a,
+  "eopenreversed",
+  0x025c,
+  "eopenreversedclosed",
+  0x025e,
+  "eopenreversedhook",
+  0x025d,
+  "eparen",
+  0x24a0,
+  "epsilon",
+  0x03b5,
+  "epsilontonos",
+  0x03ad,
+  "equal",
+  0x003d,
+  "equalmonospace",
+  0xff1d,
+  "equalsmall",
+  0xfe66,
+  "equalsuperior",
+  0x207c,
+  "equivalence",
+  0x2261,
+  "erbopomofo",
+  0x3126,
+  "ercyrillic",
+  0x0440,
+  "ereversed",
+  0x0258,
+  "ereversedcyrillic",
+  0x044d,
+  "escyrillic",
+  0x0441,
+  "esdescendercyrillic",
+  0x04ab,
+  "esh",
+  0x0283,
+  "eshcurl",
+  0x0286,
+  "eshortdeva",
+  0x090e,
+  "eshortvowelsigndeva",
+  0x0946,
+  "eshreversedloop",
+  0x01aa,
+  "eshsquatreversed",
+  0x0285,
+  "esmallhiragana",
+  0x3047,
+  "esmallkatakana",
+  0x30a7,
+  "esmallkatakanahalfwidth",
+  0xff6a,
+  "estimated",
+  0x212e,
+  "esuperior",
+  0xf6ec,
+  "eta",
+  0x03b7,
+  "etarmenian",
+  0x0568,
+  "etatonos",
+  0x03ae,
+  "eth",
+  0x00f0,
+  "etilde",
+  0x1ebd,
+  "etildebelow",
+  0x1e1b,
+  "etnahtafoukhhebrew",
+  0x0591,
+  "etnahtafoukhlefthebrew",
+  0x0591,
+  "etnahtahebrew",
+  0x0591,
+  "etnahtalefthebrew",
+  0x0591,
+  "eturned",
+  0x01dd,
+  "eukorean",
+  0x3161,
+  "euro",
+  0x20ac,
+  "evowelsignbengali",
+  0x09c7,
+  "evowelsigndeva",
+  0x0947,
+  "evowelsigngujarati",
+  0x0ac7,
+  "exclam",
+  0x0021,
+  "exclamarmenian",
+  0x055c,
+  "exclamdbl",
+  0x203c,
+  "exclamdown",
+  0x00a1,
+  "exclamdownsmall",
+  0xf7a1,
+  "exclammonospace",
+  0xff01,
+  "exclamsmall",
+  0xf721,
+  "existential",
+  0x2203,
+  "ezh",
+  0x0292,
+  "ezhcaron",
+  0x01ef,
+  "ezhcurl",
+  0x0293,
+  "ezhreversed",
+  0x01b9,
+  "ezhtail",
+  0x01ba,
+  "f",
+  0x0066,
+  "fadeva",
+  0x095e,
+  "fagurmukhi",
+  0x0a5e,
+  "fahrenheit",
+  0x2109,
+  "fathaarabic",
+  0x064e,
+  "fathalowarabic",
+  0x064e,
+  "fathatanarabic",
+  0x064b,
+  "fbopomofo",
+  0x3108,
+  "fcircle",
+  0x24d5,
+  "fdotaccent",
+  0x1e1f,
+  "feharabic",
+  0x0641,
+  "feharmenian",
+  0x0586,
+  "fehfinalarabic",
+  0xfed2,
+  "fehinitialarabic",
+  0xfed3,
+  "fehmedialarabic",
+  0xfed4,
+  "feicoptic",
+  0x03e5,
+  "female",
+  0x2640,
+  "ff",
+  0xfb00,
+  "f_f",
+  0xfb00,
+  "ffi",
+  0xfb03,
+  "ffl",
+  0xfb04,
+  "fi",
+  0xfb01,
+  "fifteencircle",
+  0x246e,
+  "fifteenparen",
+  0x2482,
+  "fifteenperiod",
+  0x2496,
+  "figuredash",
+  0x2012,
+  "filledbox",
+  0x25a0,
+  "filledrect",
+  0x25ac,
+  "finalkaf",
+  0x05da,
+  "finalkafdagesh",
+  0xfb3a,
+  "finalkafdageshhebrew",
+  0xfb3a,
+  "finalkafhebrew",
+  0x05da,
+  "finalmem",
+  0x05dd,
+  "finalmemhebrew",
+  0x05dd,
+  "finalnun",
+  0x05df,
+  "finalnunhebrew",
+  0x05df,
+  "finalpe",
+  0x05e3,
+  "finalpehebrew",
+  0x05e3,
+  "finaltsadi",
+  0x05e5,
+  "finaltsadihebrew",
+  0x05e5,
+  "firsttonechinese",
+  0x02c9,
+  "fisheye",
+  0x25c9,
+  "fitacyrillic",
+  0x0473,
+  "five",
+  0x0035,
+  "fivearabic",
+  0x0665,
+  "fivebengali",
+  0x09eb,
+  "fivecircle",
+  0x2464,
+  "fivecircleinversesansserif",
+  0x278e,
+  "fivedeva",
+  0x096b,
+  "fiveeighths",
+  0x215d,
+  "fivegujarati",
+  0x0aeb,
+  "fivegurmukhi",
+  0x0a6b,
+  "fivehackarabic",
+  0x0665,
+  "fivehangzhou",
+  0x3025,
+  "fiveideographicparen",
+  0x3224,
+  "fiveinferior",
+  0x2085,
+  "fivemonospace",
+  0xff15,
+  "fiveoldstyle",
+  0xf735,
+  "fiveparen",
+  0x2478,
+  "fiveperiod",
+  0x248c,
+  "fivepersian",
+  0x06f5,
+  "fiveroman",
+  0x2174,
+  "fivesuperior",
+  0x2075,
+  "fivethai",
+  0x0e55,
+  "fl",
+  0xfb02,
+  "florin",
+  0x0192,
+  "fmonospace",
+  0xff46,
+  "fmsquare",
+  0x3399,
+  "fofanthai",
+  0x0e1f,
+  "fofathai",
+  0x0e1d,
+  "fongmanthai",
+  0x0e4f,
+  "forall",
+  0x2200,
+  "four",
+  0x0034,
+  "fourarabic",
+  0x0664,
+  "fourbengali",
+  0x09ea,
+  "fourcircle",
+  0x2463,
+  "fourcircleinversesansserif",
+  0x278d,
+  "fourdeva",
+  0x096a,
+  "fourgujarati",
+  0x0aea,
+  "fourgurmukhi",
+  0x0a6a,
+  "fourhackarabic",
+  0x0664,
+  "fourhangzhou",
+  0x3024,
+  "fourideographicparen",
+  0x3223,
+  "fourinferior",
+  0x2084,
+  "fourmonospace",
+  0xff14,
+  "fournumeratorbengali",
+  0x09f7,
+  "fouroldstyle",
+  0xf734,
+  "fourparen",
+  0x2477,
+  "fourperiod",
+  0x248b,
+  "fourpersian",
+  0x06f4,
+  "fourroman",
+  0x2173,
+  "foursuperior",
+  0x2074,
+  "fourteencircle",
+  0x246d,
+  "fourteenparen",
+  0x2481,
+  "fourteenperiod",
+  0x2495,
+  "fourthai",
+  0x0e54,
+  "fourthtonechinese",
+  0x02cb,
+  "fparen",
+  0x24a1,
+  "fraction",
+  0x2044,
+  "franc",
+  0x20a3,
+  "g",
+  0x0067,
+  "gabengali",
+  0x0997,
+  "gacute",
+  0x01f5,
+  "gadeva",
+  0x0917,
+  "gafarabic",
+  0x06af,
+  "gaffinalarabic",
+  0xfb93,
+  "gafinitialarabic",
+  0xfb94,
+  "gafmedialarabic",
+  0xfb95,
+  "gagujarati",
+  0x0a97,
+  "gagurmukhi",
+  0x0a17,
+  "gahiragana",
+  0x304c,
+  "gakatakana",
+  0x30ac,
+  "gamma",
+  0x03b3,
+  "gammalatinsmall",
+  0x0263,
+  "gammasuperior",
+  0x02e0,
+  "gangiacoptic",
+  0x03eb,
+  "gbopomofo",
+  0x310d,
+  "gbreve",
+  0x011f,
+  "gcaron",
+  0x01e7,
+  "gcedilla",
+  0x0123,
+  "gcircle",
+  0x24d6,
+  "gcircumflex",
+  0x011d,
+  "gcommaaccent",
+  0x0123,
+  "gdot",
+  0x0121,
+  "gdotaccent",
+  0x0121,
+  "gecyrillic",
+  0x0433,
+  "gehiragana",
+  0x3052,
+  "gekatakana",
+  0x30b2,
+  "geometricallyequal",
+  0x2251,
+  "gereshaccenthebrew",
+  0x059c,
+  "gereshhebrew",
+  0x05f3,
+  "gereshmuqdamhebrew",
+  0x059d,
+  "germandbls",
+  0x00df,
+  "gershayimaccenthebrew",
+  0x059e,
+  "gershayimhebrew",
+  0x05f4,
+  "getamark",
+  0x3013,
+  "ghabengali",
+  0x0998,
+  "ghadarmenian",
+  0x0572,
+  "ghadeva",
+  0x0918,
+  "ghagujarati",
+  0x0a98,
+  "ghagurmukhi",
+  0x0a18,
+  "ghainarabic",
+  0x063a,
+  "ghainfinalarabic",
+  0xfece,
+  "ghaininitialarabic",
+  0xfecf,
+  "ghainmedialarabic",
+  0xfed0,
+  "ghemiddlehookcyrillic",
+  0x0495,
+  "ghestrokecyrillic",
+  0x0493,
+  "gheupturncyrillic",
+  0x0491,
+  "ghhadeva",
+  0x095a,
+  "ghhagurmukhi",
+  0x0a5a,
+  "ghook",
+  0x0260,
+  "ghzsquare",
+  0x3393,
+  "gihiragana",
+  0x304e,
+  "gikatakana",
+  0x30ae,
+  "gimarmenian",
+  0x0563,
+  "gimel",
+  0x05d2,
+  "gimeldagesh",
+  0xfb32,
+  "gimeldageshhebrew",
+  0xfb32,
+  "gimelhebrew",
+  0x05d2,
+  "gjecyrillic",
+  0x0453,
+  "glottalinvertedstroke",
+  0x01be,
+  "glottalstop",
+  0x0294,
+  "glottalstopinverted",
+  0x0296,
+  "glottalstopmod",
+  0x02c0,
+  "glottalstopreversed",
+  0x0295,
+  "glottalstopreversedmod",
+  0x02c1,
+  "glottalstopreversedsuperior",
+  0x02e4,
+  "glottalstopstroke",
+  0x02a1,
+  "glottalstopstrokereversed",
+  0x02a2,
+  "gmacron",
+  0x1e21,
+  "gmonospace",
+  0xff47,
+  "gohiragana",
+  0x3054,
+  "gokatakana",
+  0x30b4,
+  "gparen",
+  0x24a2,
+  "gpasquare",
+  0x33ac,
+  "gradient",
+  0x2207,
+  "grave",
+  0x0060,
+  "gravebelowcmb",
+  0x0316,
+  "gravecmb",
+  0x0300,
+  "gravecomb",
+  0x0300,
+  "gravedeva",
+  0x0953,
+  "gravelowmod",
+  0x02ce,
+  "gravemonospace",
+  0xff40,
+  "gravetonecmb",
+  0x0340,
+  "greater",
+  0x003e,
+  "greaterequal",
+  0x2265,
+  "greaterequalorless",
+  0x22db,
+  "greatermonospace",
+  0xff1e,
+  "greaterorequivalent",
+  0x2273,
+  "greaterorless",
+  0x2277,
+  "greateroverequal",
+  0x2267,
+  "greatersmall",
+  0xfe65,
+  "gscript",
+  0x0261,
+  "gstroke",
+  0x01e5,
+  "guhiragana",
+  0x3050,
+  "guillemotleft",
+  0x00ab,
+  "guillemotright",
+  0x00bb,
+  "guilsinglleft",
+  0x2039,
+  "guilsinglright",
+  0x203a,
+  "gukatakana",
+  0x30b0,
+  "guramusquare",
+  0x3318,
+  "gysquare",
+  0x33c9,
+  "h",
+  0x0068,
+  "haabkhasiancyrillic",
+  0x04a9,
+  "haaltonearabic",
+  0x06c1,
+  "habengali",
+  0x09b9,
+  "hadescendercyrillic",
+  0x04b3,
+  "hadeva",
+  0x0939,
+  "hagujarati",
+  0x0ab9,
+  "hagurmukhi",
+  0x0a39,
+  "haharabic",
+  0x062d,
+  "hahfinalarabic",
+  0xfea2,
+  "hahinitialarabic",
+  0xfea3,
+  "hahiragana",
+  0x306f,
+  "hahmedialarabic",
+  0xfea4,
+  "haitusquare",
+  0x332a,
+  "hakatakana",
+  0x30cf,
+  "hakatakanahalfwidth",
+  0xff8a,
+  "halantgurmukhi",
+  0x0a4d,
+  "hamzaarabic",
+  0x0621,
+  "hamzalowarabic",
+  0x0621,
+  "hangulfiller",
+  0x3164,
+  "hardsigncyrillic",
+  0x044a,
+  "harpoonleftbarbup",
+  0x21bc,
+  "harpoonrightbarbup",
+  0x21c0,
+  "hasquare",
+  0x33ca,
+  "hatafpatah",
+  0x05b2,
+  "hatafpatah16",
+  0x05b2,
+  "hatafpatah23",
+  0x05b2,
+  "hatafpatah2f",
+  0x05b2,
+  "hatafpatahhebrew",
+  0x05b2,
+  "hatafpatahnarrowhebrew",
+  0x05b2,
+  "hatafpatahquarterhebrew",
+  0x05b2,
+  "hatafpatahwidehebrew",
+  0x05b2,
+  "hatafqamats",
+  0x05b3,
+  "hatafqamats1b",
+  0x05b3,
+  "hatafqamats28",
+  0x05b3,
+  "hatafqamats34",
+  0x05b3,
+  "hatafqamatshebrew",
+  0x05b3,
+  "hatafqamatsnarrowhebrew",
+  0x05b3,
+  "hatafqamatsquarterhebrew",
+  0x05b3,
+  "hatafqamatswidehebrew",
+  0x05b3,
+  "hatafsegol",
+  0x05b1,
+  "hatafsegol17",
+  0x05b1,
+  "hatafsegol24",
+  0x05b1,
+  "hatafsegol30",
+  0x05b1,
+  "hatafsegolhebrew",
+  0x05b1,
+  "hatafsegolnarrowhebrew",
+  0x05b1,
+  "hatafsegolquarterhebrew",
+  0x05b1,
+  "hatafsegolwidehebrew",
+  0x05b1,
+  "hbar",
+  0x0127,
+  "hbopomofo",
+  0x310f,
+  "hbrevebelow",
+  0x1e2b,
+  "hcedilla",
+  0x1e29,
+  "hcircle",
+  0x24d7,
+  "hcircumflex",
+  0x0125,
+  "hdieresis",
+  0x1e27,
+  "hdotaccent",
+  0x1e23,
+  "hdotbelow",
+  0x1e25,
+  "he",
+  0x05d4,
+  "heart",
+  0x2665,
+  "heartsuitblack",
+  0x2665,
+  "heartsuitwhite",
+  0x2661,
+  "hedagesh",
+  0xfb34,
+  "hedageshhebrew",
+  0xfb34,
+  "hehaltonearabic",
+  0x06c1,
+  "heharabic",
+  0x0647,
+  "hehebrew",
+  0x05d4,
+  "hehfinalaltonearabic",
+  0xfba7,
+  "hehfinalalttwoarabic",
+  0xfeea,
+  "hehfinalarabic",
+  0xfeea,
+  "hehhamzaabovefinalarabic",
+  0xfba5,
+  "hehhamzaaboveisolatedarabic",
+  0xfba4,
+  "hehinitialaltonearabic",
+  0xfba8,
+  "hehinitialarabic",
+  0xfeeb,
+  "hehiragana",
+  0x3078,
+  "hehmedialaltonearabic",
+  0xfba9,
+  "hehmedialarabic",
+  0xfeec,
+  "heiseierasquare",
+  0x337b,
+  "hekatakana",
+  0x30d8,
+  "hekatakanahalfwidth",
+  0xff8d,
+  "hekutaarusquare",
+  0x3336,
+  "henghook",
+  0x0267,
+  "herutusquare",
+  0x3339,
+  "het",
+  0x05d7,
+  "hethebrew",
+  0x05d7,
+  "hhook",
+  0x0266,
+  "hhooksuperior",
+  0x02b1,
+  "hieuhacirclekorean",
+  0x327b,
+  "hieuhaparenkorean",
+  0x321b,
+  "hieuhcirclekorean",
+  0x326d,
+  "hieuhkorean",
+  0x314e,
+  "hieuhparenkorean",
+  0x320d,
+  "hihiragana",
+  0x3072,
+  "hikatakana",
+  0x30d2,
+  "hikatakanahalfwidth",
+  0xff8b,
+  "hiriq",
+  0x05b4,
+  "hiriq14",
+  0x05b4,
+  "hiriq21",
+  0x05b4,
+  "hiriq2d",
+  0x05b4,
+  "hiriqhebrew",
+  0x05b4,
+  "hiriqnarrowhebrew",
+  0x05b4,
+  "hiriqquarterhebrew",
+  0x05b4,
+  "hiriqwidehebrew",
+  0x05b4,
+  "hlinebelow",
+  0x1e96,
+  "hmonospace",
+  0xff48,
+  "hoarmenian",
+  0x0570,
+  "hohipthai",
+  0x0e2b,
+  "hohiragana",
+  0x307b,
+  "hokatakana",
+  0x30db,
+  "hokatakanahalfwidth",
+  0xff8e,
+  "holam",
+  0x05b9,
+  "holam19",
+  0x05b9,
+  "holam26",
+  0x05b9,
+  "holam32",
+  0x05b9,
+  "holamhebrew",
+  0x05b9,
+  "holamnarrowhebrew",
+  0x05b9,
+  "holamquarterhebrew",
+  0x05b9,
+  "holamwidehebrew",
+  0x05b9,
+  "honokhukthai",
+  0x0e2e,
+  "hookabovecomb",
+  0x0309,
+  "hookcmb",
+  0x0309,
+  "hookpalatalizedbelowcmb",
+  0x0321,
+  "hookretroflexbelowcmb",
+  0x0322,
+  "hoonsquare",
+  0x3342,
+  "horicoptic",
+  0x03e9,
+  "horizontalbar",
+  0x2015,
+  "horncmb",
+  0x031b,
+  "hotsprings",
+  0x2668,
+  "house",
+  0x2302,
+  "hparen",
+  0x24a3,
+  "hsuperior",
+  0x02b0,
+  "hturned",
+  0x0265,
+  "huhiragana",
+  0x3075,
+  "huiitosquare",
+  0x3333,
+  "hukatakana",
+  0x30d5,
+  "hukatakanahalfwidth",
+  0xff8c,
+  "hungarumlaut",
+  0x02dd,
+  "hungarumlautcmb",
+  0x030b,
+  "hv",
+  0x0195,
+  "hyphen",
+  0x002d,
+  "hypheninferior",
+  0xf6e5,
+  "hyphenmonospace",
+  0xff0d,
+  "hyphensmall",
+  0xfe63,
+  "hyphensuperior",
+  0xf6e6,
+  "hyphentwo",
+  0x2010,
+  "i",
+  0x0069,
+  "iacute",
+  0x00ed,
+  "iacyrillic",
+  0x044f,
+  "ibengali",
+  0x0987,
+  "ibopomofo",
+  0x3127,
+  "ibreve",
+  0x012d,
+  "icaron",
+  0x01d0,
+  "icircle",
+  0x24d8,
+  "icircumflex",
+  0x00ee,
+  "icyrillic",
+  0x0456,
+  "idblgrave",
+  0x0209,
+  "ideographearthcircle",
+  0x328f,
+  "ideographfirecircle",
+  0x328b,
+  "ideographicallianceparen",
+  0x323f,
+  "ideographiccallparen",
+  0x323a,
+  "ideographiccentrecircle",
+  0x32a5,
+  "ideographicclose",
+  0x3006,
+  "ideographiccomma",
+  0x3001,
+  "ideographiccommaleft",
+  0xff64,
+  "ideographiccongratulationparen",
+  0x3237,
+  "ideographiccorrectcircle",
+  0x32a3,
+  "ideographicearthparen",
+  0x322f,
+  "ideographicenterpriseparen",
+  0x323d,
+  "ideographicexcellentcircle",
+  0x329d,
+  "ideographicfestivalparen",
+  0x3240,
+  "ideographicfinancialcircle",
+  0x3296,
+  "ideographicfinancialparen",
+  0x3236,
+  "ideographicfireparen",
+  0x322b,
+  "ideographichaveparen",
+  0x3232,
+  "ideographichighcircle",
+  0x32a4,
+  "ideographiciterationmark",
+  0x3005,
+  "ideographiclaborcircle",
+  0x3298,
+  "ideographiclaborparen",
+  0x3238,
+  "ideographicleftcircle",
+  0x32a7,
+  "ideographiclowcircle",
+  0x32a6,
+  "ideographicmedicinecircle",
+  0x32a9,
+  "ideographicmetalparen",
+  0x322e,
+  "ideographicmoonparen",
+  0x322a,
+  "ideographicnameparen",
+  0x3234,
+  "ideographicperiod",
+  0x3002,
+  "ideographicprintcircle",
+  0x329e,
+  "ideographicreachparen",
+  0x3243,
+  "ideographicrepresentparen",
+  0x3239,
+  "ideographicresourceparen",
+  0x323e,
+  "ideographicrightcircle",
+  0x32a8,
+  "ideographicsecretcircle",
+  0x3299,
+  "ideographicselfparen",
+  0x3242,
+  "ideographicsocietyparen",
+  0x3233,
+  "ideographicspace",
+  0x3000,
+  "ideographicspecialparen",
+  0x3235,
+  "ideographicstockparen",
+  0x3231,
+  "ideographicstudyparen",
+  0x323b,
+  "ideographicsunparen",
+  0x3230,
+  "ideographicsuperviseparen",
+  0x323c,
+  "ideographicwaterparen",
+  0x322c,
+  "ideographicwoodparen",
+  0x322d,
+  "ideographiczero",
+  0x3007,
+  "ideographmetalcircle",
+  0x328e,
+  "ideographmooncircle",
+  0x328a,
+  "ideographnamecircle",
+  0x3294,
+  "ideographsuncircle",
+  0x3290,
+  "ideographwatercircle",
+  0x328c,
+  "ideographwoodcircle",
+  0x328d,
+  "ideva",
+  0x0907,
+  "idieresis",
+  0x00ef,
+  "idieresisacute",
+  0x1e2f,
+  "idieresiscyrillic",
+  0x04e5,
+  "idotbelow",
+  0x1ecb,
+  "iebrevecyrillic",
+  0x04d7,
+  "iecyrillic",
+  0x0435,
+  "ieungacirclekorean",
+  0x3275,
+  "ieungaparenkorean",
+  0x3215,
+  "ieungcirclekorean",
+  0x3267,
+  "ieungkorean",
+  0x3147,
+  "ieungparenkorean",
+  0x3207,
+  "igrave",
+  0x00ec,
+  "igujarati",
+  0x0a87,
+  "igurmukhi",
+  0x0a07,
+  "ihiragana",
+  0x3044,
+  "ihookabove",
+  0x1ec9,
+  "iibengali",
+  0x0988,
+  "iicyrillic",
+  0x0438,
+  "iideva",
+  0x0908,
+  "iigujarati",
+  0x0a88,
+  "iigurmukhi",
+  0x0a08,
+  "iimatragurmukhi",
+  0x0a40,
+  "iinvertedbreve",
+  0x020b,
+  "iishortcyrillic",
+  0x0439,
+  "iivowelsignbengali",
+  0x09c0,
+  "iivowelsigndeva",
+  0x0940,
+  "iivowelsigngujarati",
+  0x0ac0,
+  "ij",
+  0x0133,
+  "ikatakana",
+  0x30a4,
+  "ikatakanahalfwidth",
+  0xff72,
+  "ikorean",
+  0x3163,
+  "ilde",
+  0x02dc,
+  "iluyhebrew",
+  0x05ac,
+  "imacron",
+  0x012b,
+  "imacroncyrillic",
+  0x04e3,
+  "imageorapproximatelyequal",
+  0x2253,
+  "imatragurmukhi",
+  0x0a3f,
+  "imonospace",
+  0xff49,
+  "increment",
+  0x2206,
+  "infinity",
+  0x221e,
+  "iniarmenian",
+  0x056b,
+  "integral",
+  0x222b,
+  "integralbottom",
+  0x2321,
+  "integralbt",
+  0x2321,
+  "integralex",
+  0xf8f5,
+  "integraltop",
+  0x2320,
+  "integraltp",
+  0x2320,
+  "intersection",
+  0x2229,
+  "intisquare",
+  0x3305,
+  "invbullet",
+  0x25d8,
+  "invcircle",
+  0x25d9,
+  "invsmileface",
+  0x263b,
+  "iocyrillic",
+  0x0451,
+  "iogonek",
+  0x012f,
+  "iota",
+  0x03b9,
+  "iotadieresis",
+  0x03ca,
+  "iotadieresistonos",
+  0x0390,
+  "iotalatin",
+  0x0269,
+  "iotatonos",
+  0x03af,
+  "iparen",
+  0x24a4,
+  "irigurmukhi",
+  0x0a72,
+  "ismallhiragana",
+  0x3043,
+  "ismallkatakana",
+  0x30a3,
+  "ismallkatakanahalfwidth",
+  0xff68,
+  "issharbengali",
+  0x09fa,
+  "istroke",
+  0x0268,
+  "isuperior",
+  0xf6ed,
+  "iterationhiragana",
+  0x309d,
+  "iterationkatakana",
+  0x30fd,
+  "itilde",
+  0x0129,
+  "itildebelow",
+  0x1e2d,
+  "iubopomofo",
+  0x3129,
+  "iucyrillic",
+  0x044e,
+  "ivowelsignbengali",
+  0x09bf,
+  "ivowelsigndeva",
+  0x093f,
+  "ivowelsigngujarati",
+  0x0abf,
+  "izhitsacyrillic",
+  0x0475,
+  "izhitsadblgravecyrillic",
+  0x0477,
+  "j",
+  0x006a,
+  "jaarmenian",
+  0x0571,
+  "jabengali",
+  0x099c,
+  "jadeva",
+  0x091c,
+  "jagujarati",
+  0x0a9c,
+  "jagurmukhi",
+  0x0a1c,
+  "jbopomofo",
+  0x3110,
+  "jcaron",
+  0x01f0,
+  "jcircle",
+  0x24d9,
+  "jcircumflex",
+  0x0135,
+  "jcrossedtail",
+  0x029d,
+  "jdotlessstroke",
+  0x025f,
+  "jecyrillic",
+  0x0458,
+  "jeemarabic",
+  0x062c,
+  "jeemfinalarabic",
+  0xfe9e,
+  "jeeminitialarabic",
+  0xfe9f,
+  "jeemmedialarabic",
+  0xfea0,
+  "jeharabic",
+  0x0698,
+  "jehfinalarabic",
+  0xfb8b,
+  "jhabengali",
+  0x099d,
+  "jhadeva",
+  0x091d,
+  "jhagujarati",
+  0x0a9d,
+  "jhagurmukhi",
+  0x0a1d,
+  "jheharmenian",
+  0x057b,
+  "jis",
+  0x3004,
+  "jmonospace",
+  0xff4a,
+  "jparen",
+  0x24a5,
+  "jsuperior",
+  0x02b2,
+  "k",
+  0x006b,
+  "kabashkircyrillic",
+  0x04a1,
+  "kabengali",
+  0x0995,
+  "kacute",
+  0x1e31,
+  "kacyrillic",
+  0x043a,
+  "kadescendercyrillic",
+  0x049b,
+  "kadeva",
+  0x0915,
+  "kaf",
+  0x05db,
+  "kafarabic",
+  0x0643,
+  "kafdagesh",
+  0xfb3b,
+  "kafdageshhebrew",
+  0xfb3b,
+  "kaffinalarabic",
+  0xfeda,
+  "kafhebrew",
+  0x05db,
+  "kafinitialarabic",
+  0xfedb,
+  "kafmedialarabic",
+  0xfedc,
+  "kafrafehebrew",
+  0xfb4d,
+  "kagujarati",
+  0x0a95,
+  "kagurmukhi",
+  0x0a15,
+  "kahiragana",
+  0x304b,
+  "kahookcyrillic",
+  0x04c4,
+  "kakatakana",
+  0x30ab,
+  "kakatakanahalfwidth",
+  0xff76,
+  "kappa",
+  0x03ba,
+  "kappasymbolgreek",
+  0x03f0,
+  "kapyeounmieumkorean",
+  0x3171,
+  "kapyeounphieuphkorean",
+  0x3184,
+  "kapyeounpieupkorean",
+  0x3178,
+  "kapyeounssangpieupkorean",
+  0x3179,
+  "karoriisquare",
+  0x330d,
+  "kashidaautoarabic",
+  0x0640,
+  "kashidaautonosidebearingarabic",
+  0x0640,
+  "kasmallkatakana",
+  0x30f5,
+  "kasquare",
+  0x3384,
+  "kasraarabic",
+  0x0650,
+  "kasratanarabic",
+  0x064d,
+  "kastrokecyrillic",
+  0x049f,
+  "katahiraprolongmarkhalfwidth",
+  0xff70,
+  "kaverticalstrokecyrillic",
+  0x049d,
+  "kbopomofo",
+  0x310e,
+  "kcalsquare",
+  0x3389,
+  "kcaron",
+  0x01e9,
+  "kcedilla",
+  0x0137,
+  "kcircle",
+  0x24da,
+  "kcommaaccent",
+  0x0137,
+  "kdotbelow",
+  0x1e33,
+  "keharmenian",
+  0x0584,
+  "kehiragana",
+  0x3051,
+  "kekatakana",
+  0x30b1,
+  "kekatakanahalfwidth",
+  0xff79,
+  "kenarmenian",
+  0x056f,
+  "kesmallkatakana",
+  0x30f6,
+  "kgreenlandic",
+  0x0138,
+  "khabengali",
+  0x0996,
+  "khacyrillic",
+  0x0445,
+  "khadeva",
+  0x0916,
+  "khagujarati",
+  0x0a96,
+  "khagurmukhi",
+  0x0a16,
+  "khaharabic",
+  0x062e,
+  "khahfinalarabic",
+  0xfea6,
+  "khahinitialarabic",
+  0xfea7,
+  "khahmedialarabic",
+  0xfea8,
+  "kheicoptic",
+  0x03e7,
+  "khhadeva",
+  0x0959,
+  "khhagurmukhi",
+  0x0a59,
+  "khieukhacirclekorean",
+  0x3278,
+  "khieukhaparenkorean",
+  0x3218,
+  "khieukhcirclekorean",
+  0x326a,
+  "khieukhkorean",
+  0x314b,
+  "khieukhparenkorean",
+  0x320a,
+  "khokhaithai",
+  0x0e02,
+  "khokhonthai",
+  0x0e05,
+  "khokhuatthai",
+  0x0e03,
+  "khokhwaithai",
+  0x0e04,
+  "khomutthai",
+  0x0e5b,
+  "khook",
+  0x0199,
+  "khorakhangthai",
+  0x0e06,
+  "khzsquare",
+  0x3391,
+  "kihiragana",
+  0x304d,
+  "kikatakana",
+  0x30ad,
+  "kikatakanahalfwidth",
+  0xff77,
+  "kiroguramusquare",
+  0x3315,
+  "kiromeetorusquare",
+  0x3316,
+  "kirosquare",
+  0x3314,
+  "kiyeokacirclekorean",
+  0x326e,
+  "kiyeokaparenkorean",
+  0x320e,
+  "kiyeokcirclekorean",
+  0x3260,
+  "kiyeokkorean",
+  0x3131,
+  "kiyeokparenkorean",
+  0x3200,
+  "kiyeoksioskorean",
+  0x3133,
+  "kjecyrillic",
+  0x045c,
+  "klinebelow",
+  0x1e35,
+  "klsquare",
+  0x3398,
+  "kmcubedsquare",
+  0x33a6,
+  "kmonospace",
+  0xff4b,
+  "kmsquaredsquare",
+  0x33a2,
+  "kohiragana",
+  0x3053,
+  "kohmsquare",
+  0x33c0,
+  "kokaithai",
+  0x0e01,
+  "kokatakana",
+  0x30b3,
+  "kokatakanahalfwidth",
+  0xff7a,
+  "kooposquare",
+  0x331e,
+  "koppacyrillic",
+  0x0481,
+  "koreanstandardsymbol",
+  0x327f,
+  "koroniscmb",
+  0x0343,
+  "kparen",
+  0x24a6,
+  "kpasquare",
+  0x33aa,
+  "ksicyrillic",
+  0x046f,
+  "ktsquare",
+  0x33cf,
+  "kturned",
+  0x029e,
+  "kuhiragana",
+  0x304f,
+  "kukatakana",
+  0x30af,
+  "kukatakanahalfwidth",
+  0xff78,
+  "kvsquare",
+  0x33b8,
+  "kwsquare",
+  0x33be,
+  "l",
+  0x006c,
+  "labengali",
+  0x09b2,
+  "lacute",
+  0x013a,
+  "ladeva",
+  0x0932,
+  "lagujarati",
+  0x0ab2,
+  "lagurmukhi",
+  0x0a32,
+  "lakkhangyaothai",
+  0x0e45,
+  "lamaleffinalarabic",
+  0xfefc,
+  "lamalefhamzaabovefinalarabic",
+  0xfef8,
+  "lamalefhamzaaboveisolatedarabic",
+  0xfef7,
+  "lamalefhamzabelowfinalarabic",
+  0xfefa,
+  "lamalefhamzabelowisolatedarabic",
+  0xfef9,
+  "lamalefisolatedarabic",
+  0xfefb,
+  "lamalefmaddaabovefinalarabic",
+  0xfef6,
+  "lamalefmaddaaboveisolatedarabic",
+  0xfef5,
+  "lamarabic",
+  0x0644,
+  "lambda",
+  0x03bb,
+  "lambdastroke",
+  0x019b,
+  "lamed",
+  0x05dc,
+  "lameddagesh",
+  0xfb3c,
+  "lameddageshhebrew",
+  0xfb3c,
+  "lamedhebrew",
+  0x05dc,
+  "lamfinalarabic",
+  0xfede,
+  "lamhahinitialarabic",
+  0xfcca,
+  "laminitialarabic",
+  0xfedf,
+  "lamjeeminitialarabic",
+  0xfcc9,
+  "lamkhahinitialarabic",
+  0xfccb,
+  "lamlamhehisolatedarabic",
+  0xfdf2,
+  "lammedialarabic",
+  0xfee0,
+  "lammeemhahinitialarabic",
+  0xfd88,
+  "lammeeminitialarabic",
+  0xfccc,
+  "largecircle",
+  0x25ef,
+  "lbar",
+  0x019a,
+  "lbelt",
+  0x026c,
+  "lbopomofo",
+  0x310c,
+  "lcaron",
+  0x013e,
+  "lcedilla",
+  0x013c,
+  "lcircle",
+  0x24db,
+  "lcircumflexbelow",
+  0x1e3d,
+  "lcommaaccent",
+  0x013c,
+  "ldot",
+  0x0140,
+  "ldotaccent",
+  0x0140,
+  "ldotbelow",
+  0x1e37,
+  "ldotbelowmacron",
+  0x1e39,
+  "leftangleabovecmb",
+  0x031a,
+  "lefttackbelowcmb",
+  0x0318,
+  "less",
+  0x003c,
+  "lessequal",
+  0x2264,
+  "lessequalorgreater",
+  0x22da,
+  "lessmonospace",
+  0xff1c,
+  "lessorequivalent",
+  0x2272,
+  "lessorgreater",
+  0x2276,
+  "lessoverequal",
+  0x2266,
+  "lesssmall",
+  0xfe64,
+  "lezh",
+  0x026e,
+  "lfblock",
+  0x258c,
+  "lhookretroflex",
+  0x026d,
+  "lira",
+  0x20a4,
+  "liwnarmenian",
+  0x056c,
+  "lj",
+  0x01c9,
+  "ljecyrillic",
+  0x0459,
+  "ll",
+  0xf6c0,
+  "lladeva",
+  0x0933,
+  "llagujarati",
+  0x0ab3,
+  "llinebelow",
+  0x1e3b,
+  "llladeva",
+  0x0934,
+  "llvocalicbengali",
+  0x09e1,
+  "llvocalicdeva",
+  0x0961,
+  "llvocalicvowelsignbengali",
+  0x09e3,
+  "llvocalicvowelsigndeva",
+  0x0963,
+  "lmiddletilde",
+  0x026b,
+  "lmonospace",
+  0xff4c,
+  "lmsquare",
+  0x33d0,
+  "lochulathai",
+  0x0e2c,
+  "logicaland",
+  0x2227,
+  "logicalnot",
+  0x00ac,
+  "logicalnotreversed",
+  0x2310,
+  "logicalor",
+  0x2228,
+  "lolingthai",
+  0x0e25,
+  "longs",
+  0x017f,
+  "lowlinecenterline",
+  0xfe4e,
+  "lowlinecmb",
+  0x0332,
+  "lowlinedashed",
+  0xfe4d,
+  "lozenge",
+  0x25ca,
+  "lparen",
+  0x24a7,
+  "lslash",
+  0x0142,
+  "lsquare",
+  0x2113,
+  "lsuperior",
+  0xf6ee,
+  "ltshade",
+  0x2591,
+  "luthai",
+  0x0e26,
+  "lvocalicbengali",
+  0x098c,
+  "lvocalicdeva",
+  0x090c,
+  "lvocalicvowelsignbengali",
+  0x09e2,
+  "lvocalicvowelsigndeva",
+  0x0962,
+  "lxsquare",
+  0x33d3,
+  "m",
+  0x006d,
+  "mabengali",
+  0x09ae,
+  "macron",
+  0x00af,
+  "macronbelowcmb",
+  0x0331,
+  "macroncmb",
+  0x0304,
+  "macronlowmod",
+  0x02cd,
+  "macronmonospace",
+  0xffe3,
+  "macute",
+  0x1e3f,
+  "madeva",
+  0x092e,
+  "magujarati",
+  0x0aae,
+  "magurmukhi",
+  0x0a2e,
+  "mahapakhhebrew",
+  0x05a4,
+  "mahapakhlefthebrew",
+  0x05a4,
+  "mahiragana",
+  0x307e,
+  "maichattawalowleftthai",
+  0xf895,
+  "maichattawalowrightthai",
+  0xf894,
+  "maichattawathai",
+  0x0e4b,
+  "maichattawaupperleftthai",
+  0xf893,
+  "maieklowleftthai",
+  0xf88c,
+  "maieklowrightthai",
+  0xf88b,
+  "maiekthai",
+  0x0e48,
+  "maiekupperleftthai",
+  0xf88a,
+  "maihanakatleftthai",
+  0xf884,
+  "maihanakatthai",
+  0x0e31,
+  "maitaikhuleftthai",
+  0xf889,
+  "maitaikhuthai",
+  0x0e47,
+  "maitholowleftthai",
+  0xf88f,
+  "maitholowrightthai",
+  0xf88e,
+  "maithothai",
+  0x0e49,
+  "maithoupperleftthai",
+  0xf88d,
+  "maitrilowleftthai",
+  0xf892,
+  "maitrilowrightthai",
+  0xf891,
+  "maitrithai",
+  0x0e4a,
+  "maitriupperleftthai",
+  0xf890,
+  "maiyamokthai",
+  0x0e46,
+  "makatakana",
+  0x30de,
+  "makatakanahalfwidth",
+  0xff8f,
+  "male",
+  0x2642,
+  "mansyonsquare",
+  0x3347,
+  "maqafhebrew",
+  0x05be,
+  "mars",
+  0x2642,
+  "masoracirclehebrew",
+  0x05af,
+  "masquare",
+  0x3383,
+  "mbopomofo",
+  0x3107,
+  "mbsquare",
+  0x33d4,
+  "mcircle",
+  0x24dc,
+  "mcubedsquare",
+  0x33a5,
+  "mdotaccent",
+  0x1e41,
+  "mdotbelow",
+  0x1e43,
+  "meemarabic",
+  0x0645,
+  "meemfinalarabic",
+  0xfee2,
+  "meeminitialarabic",
+  0xfee3,
+  "meemmedialarabic",
+  0xfee4,
+  "meemmeeminitialarabic",
+  0xfcd1,
+  "meemmeemisolatedarabic",
+  0xfc48,
+  "meetorusquare",
+  0x334d,
+  "mehiragana",
+  0x3081,
+  "meizierasquare",
+  0x337e,
+  "mekatakana",
+  0x30e1,
+  "mekatakanahalfwidth",
+  0xff92,
+  "mem",
+  0x05de,
+  "memdagesh",
+  0xfb3e,
+  "memdageshhebrew",
+  0xfb3e,
+  "memhebrew",
+  0x05de,
+  "menarmenian",
+  0x0574,
+  "merkhahebrew",
+  0x05a5,
+  "merkhakefulahebrew",
+  0x05a6,
+  "merkhakefulalefthebrew",
+  0x05a6,
+  "merkhalefthebrew",
+  0x05a5,
+  "mhook",
+  0x0271,
+  "mhzsquare",
+  0x3392,
+  "middledotkatakanahalfwidth",
+  0xff65,
+  "middot",
+  0x00b7,
+  "mieumacirclekorean",
+  0x3272,
+  "mieumaparenkorean",
+  0x3212,
+  "mieumcirclekorean",
+  0x3264,
+  "mieumkorean",
+  0x3141,
+  "mieumpansioskorean",
+  0x3170,
+  "mieumparenkorean",
+  0x3204,
+  "mieumpieupkorean",
+  0x316e,
+  "mieumsioskorean",
+  0x316f,
+  "mihiragana",
+  0x307f,
+  "mikatakana",
+  0x30df,
+  "mikatakanahalfwidth",
+  0xff90,
+  "minus",
+  0x2212,
+  "minusbelowcmb",
+  0x0320,
+  "minuscircle",
+  0x2296,
+  "minusmod",
+  0x02d7,
+  "minusplus",
+  0x2213,
+  "minute",
+  0x2032,
+  "miribaarusquare",
+  0x334a,
+  "mirisquare",
+  0x3349,
+  "mlonglegturned",
+  0x0270,
+  "mlsquare",
+  0x3396,
+  "mmcubedsquare",
+  0x33a3,
+  "mmonospace",
+  0xff4d,
+  "mmsquaredsquare",
+  0x339f,
+  "mohiragana",
+  0x3082,
+  "mohmsquare",
+  0x33c1,
+  "mokatakana",
+  0x30e2,
+  "mokatakanahalfwidth",
+  0xff93,
+  "molsquare",
+  0x33d6,
+  "momathai",
+  0x0e21,
+  "moverssquare",
+  0x33a7,
+  "moverssquaredsquare",
+  0x33a8,
+  "mparen",
+  0x24a8,
+  "mpasquare",
+  0x33ab,
+  "mssquare",
+  0x33b3,
+  "msuperior",
+  0xf6ef,
+  "mturned",
+  0x026f,
+  "mu",
+  0x00b5,
+  "mu1",
+  0x00b5,
+  "muasquare",
+  0x3382,
+  "muchgreater",
+  0x226b,
+  "muchless",
+  0x226a,
+  "mufsquare",
+  0x338c,
+  "mugreek",
+  0x03bc,
+  "mugsquare",
+  0x338d,
+  "muhiragana",
+  0x3080,
+  "mukatakana",
+  0x30e0,
+  "mukatakanahalfwidth",
+  0xff91,
+  "mulsquare",
+  0x3395,
+  "multiply",
+  0x00d7,
+  "mumsquare",
+  0x339b,
+  "munahhebrew",
+  0x05a3,
+  "munahlefthebrew",
+  0x05a3,
+  "musicalnote",
+  0x266a,
+  "musicalnotedbl",
+  0x266b,
+  "musicflatsign",
+  0x266d,
+  "musicsharpsign",
+  0x266f,
+  "mussquare",
+  0x33b2,
+  "muvsquare",
+  0x33b6,
+  "muwsquare",
+  0x33bc,
+  "mvmegasquare",
+  0x33b9,
+  "mvsquare",
+  0x33b7,
+  "mwmegasquare",
+  0x33bf,
+  "mwsquare",
+  0x33bd,
+  "n",
+  0x006e,
+  "nabengali",
+  0x09a8,
+  "nabla",
+  0x2207,
+  "nacute",
+  0x0144,
+  "nadeva",
+  0x0928,
+  "nagujarati",
+  0x0aa8,
+  "nagurmukhi",
+  0x0a28,
+  "nahiragana",
+  0x306a,
+  "nakatakana",
+  0x30ca,
+  "nakatakanahalfwidth",
+  0xff85,
+  "napostrophe",
+  0x0149,
+  "nasquare",
+  0x3381,
+  "nbopomofo",
+  0x310b,
+  "nbspace",
+  0x00a0,
+  "ncaron",
+  0x0148,
+  "ncedilla",
+  0x0146,
+  "ncircle",
+  0x24dd,
+  "ncircumflexbelow",
+  0x1e4b,
+  "ncommaaccent",
+  0x0146,
+  "ndotaccent",
+  0x1e45,
+  "ndotbelow",
+  0x1e47,
+  "nehiragana",
+  0x306d,
+  "nekatakana",
+  0x30cd,
+  "nekatakanahalfwidth",
+  0xff88,
+  "newsheqelsign",
+  0x20aa,
+  "nfsquare",
+  0x338b,
+  "ngabengali",
+  0x0999,
+  "ngadeva",
+  0x0919,
+  "ngagujarati",
+  0x0a99,
+  "ngagurmukhi",
+  0x0a19,
+  "ngonguthai",
+  0x0e07,
+  "nhiragana",
+  0x3093,
+  "nhookleft",
+  0x0272,
+  "nhookretroflex",
+  0x0273,
+  "nieunacirclekorean",
+  0x326f,
+  "nieunaparenkorean",
+  0x320f,
+  "nieuncieuckorean",
+  0x3135,
+  "nieuncirclekorean",
+  0x3261,
+  "nieunhieuhkorean",
+  0x3136,
+  "nieunkorean",
+  0x3134,
+  "nieunpansioskorean",
+  0x3168,
+  "nieunparenkorean",
+  0x3201,
+  "nieunsioskorean",
+  0x3167,
+  "nieuntikeutkorean",
+  0x3166,
+  "nihiragana",
+  0x306b,
+  "nikatakana",
+  0x30cb,
+  "nikatakanahalfwidth",
+  0xff86,
+  "nikhahitleftthai",
+  0xf899,
+  "nikhahitthai",
+  0x0e4d,
+  "nine",
+  0x0039,
+  "ninearabic",
+  0x0669,
+  "ninebengali",
+  0x09ef,
+  "ninecircle",
+  0x2468,
+  "ninecircleinversesansserif",
+  0x2792,
+  "ninedeva",
+  0x096f,
+  "ninegujarati",
+  0x0aef,
+  "ninegurmukhi",
+  0x0a6f,
+  "ninehackarabic",
+  0x0669,
+  "ninehangzhou",
+  0x3029,
+  "nineideographicparen",
+  0x3228,
+  "nineinferior",
+  0x2089,
+  "ninemonospace",
+  0xff19,
+  "nineoldstyle",
+  0xf739,
+  "nineparen",
+  0x247c,
+  "nineperiod",
+  0x2490,
+  "ninepersian",
+  0x06f9,
+  "nineroman",
+  0x2178,
+  "ninesuperior",
+  0x2079,
+  "nineteencircle",
+  0x2472,
+  "nineteenparen",
+  0x2486,
+  "nineteenperiod",
+  0x249a,
+  "ninethai",
+  0x0e59,
+  "nj",
+  0x01cc,
+  "njecyrillic",
+  0x045a,
+  "nkatakana",
+  0x30f3,
+  "nkatakanahalfwidth",
+  0xff9d,
+  "nlegrightlong",
+  0x019e,
+  "nlinebelow",
+  0x1e49,
+  "nmonospace",
+  0xff4e,
+  "nmsquare",
+  0x339a,
+  "nnabengali",
+  0x09a3,
+  "nnadeva",
+  0x0923,
+  "nnagujarati",
+  0x0aa3,
+  "nnagurmukhi",
+  0x0a23,
+  "nnnadeva",
+  0x0929,
+  "nohiragana",
+  0x306e,
+  "nokatakana",
+  0x30ce,
+  "nokatakanahalfwidth",
+  0xff89,
+  "nonbreakingspace",
+  0x00a0,
+  "nonenthai",
+  0x0e13,
+  "nonuthai",
+  0x0e19,
+  "noonarabic",
+  0x0646,
+  "noonfinalarabic",
+  0xfee6,
+  "noonghunnaarabic",
+  0x06ba,
+  "noonghunnafinalarabic",
+  0xfb9f,
+  "nooninitialarabic",
+  0xfee7,
+  "noonjeeminitialarabic",
+  0xfcd2,
+  "noonjeemisolatedarabic",
+  0xfc4b,
+  "noonmedialarabic",
+  0xfee8,
+  "noonmeeminitialarabic",
+  0xfcd5,
+  "noonmeemisolatedarabic",
+  0xfc4e,
+  "noonnoonfinalarabic",
+  0xfc8d,
+  "notcontains",
+  0x220c,
+  "notelement",
+  0x2209,
+  "notelementof",
+  0x2209,
+  "notequal",
+  0x2260,
+  "notgreater",
+  0x226f,
+  "notgreaternorequal",
+  0x2271,
+  "notgreaternorless",
+  0x2279,
+  "notidentical",
+  0x2262,
+  "notless",
+  0x226e,
+  "notlessnorequal",
+  0x2270,
+  "notparallel",
+  0x2226,
+  "notprecedes",
+  0x2280,
+  "notsubset",
+  0x2284,
+  "notsucceeds",
+  0x2281,
+  "notsuperset",
+  0x2285,
+  "nowarmenian",
+  0x0576,
+  "nparen",
+  0x24a9,
+  "nssquare",
+  0x33b1,
+  "nsuperior",
+  0x207f,
+  "ntilde",
+  0x00f1,
+  "nu",
+  0x03bd,
+  "nuhiragana",
+  0x306c,
+  "nukatakana",
+  0x30cc,
+  "nukatakanahalfwidth",
+  0xff87,
+  "nuktabengali",
+  0x09bc,
+  "nuktadeva",
+  0x093c,
+  "nuktagujarati",
+  0x0abc,
+  "nuktagurmukhi",
+  0x0a3c,
+  "numbersign",
+  0x0023,
+  "numbersignmonospace",
+  0xff03,
+  "numbersignsmall",
+  0xfe5f,
+  "numeralsigngreek",
+  0x0374,
+  "numeralsignlowergreek",
+  0x0375,
+  "numero",
+  0x2116,
+  "nun",
+  0x05e0,
+  "nundagesh",
+  0xfb40,
+  "nundageshhebrew",
+  0xfb40,
+  "nunhebrew",
+  0x05e0,
+  "nvsquare",
+  0x33b5,
+  "nwsquare",
+  0x33bb,
+  "nyabengali",
+  0x099e,
+  "nyadeva",
+  0x091e,
+  "nyagujarati",
+  0x0a9e,
+  "nyagurmukhi",
+  0x0a1e,
+  "o",
+  0x006f,
+  "oacute",
+  0x00f3,
+  "oangthai",
+  0x0e2d,
+  "obarred",
+  0x0275,
+  "obarredcyrillic",
+  0x04e9,
+  "obarreddieresiscyrillic",
+  0x04eb,
+  "obengali",
+  0x0993,
+  "obopomofo",
+  0x311b,
+  "obreve",
+  0x014f,
+  "ocandradeva",
+  0x0911,
+  "ocandragujarati",
+  0x0a91,
+  "ocandravowelsigndeva",
+  0x0949,
+  "ocandravowelsigngujarati",
+  0x0ac9,
+  "ocaron",
+  0x01d2,
+  "ocircle",
+  0x24de,
+  "ocircumflex",
+  0x00f4,
+  "ocircumflexacute",
+  0x1ed1,
+  "ocircumflexdotbelow",
+  0x1ed9,
+  "ocircumflexgrave",
+  0x1ed3,
+  "ocircumflexhookabove",
+  0x1ed5,
+  "ocircumflextilde",
+  0x1ed7,
+  "ocyrillic",
+  0x043e,
+  "odblacute",
+  0x0151,
+  "odblgrave",
+  0x020d,
+  "odeva",
+  0x0913,
+  "odieresis",
+  0x00f6,
+  "odieresiscyrillic",
+  0x04e7,
+  "odotbelow",
+  0x1ecd,
+  "oe",
+  0x0153,
+  "oekorean",
+  0x315a,
+  "ogonek",
+  0x02db,
+  "ogonekcmb",
+  0x0328,
+  "ograve",
+  0x00f2,
+  "ogujarati",
+  0x0a93,
+  "oharmenian",
+  0x0585,
+  "ohiragana",
+  0x304a,
+  "ohookabove",
+  0x1ecf,
+  "ohorn",
+  0x01a1,
+  "ohornacute",
+  0x1edb,
+  "ohorndotbelow",
+  0x1ee3,
+  "ohorngrave",
+  0x1edd,
+  "ohornhookabove",
+  0x1edf,
+  "ohorntilde",
+  0x1ee1,
+  "ohungarumlaut",
+  0x0151,
+  "oi",
+  0x01a3,
+  "oinvertedbreve",
+  0x020f,
+  "okatakana",
+  0x30aa,
+  "okatakanahalfwidth",
+  0xff75,
+  "okorean",
+  0x3157,
+  "olehebrew",
+  0x05ab,
+  "omacron",
+  0x014d,
+  "omacronacute",
+  0x1e53,
+  "omacrongrave",
+  0x1e51,
+  "omdeva",
+  0x0950,
+  "omega",
+  0x03c9,
+  "omega1",
+  0x03d6,
+  "omegacyrillic",
+  0x0461,
+  "omegalatinclosed",
+  0x0277,
+  "omegaroundcyrillic",
+  0x047b,
+  "omegatitlocyrillic",
+  0x047d,
+  "omegatonos",
+  0x03ce,
+  "omgujarati",
+  0x0ad0,
+  "omicron",
+  0x03bf,
+  "omicrontonos",
+  0x03cc,
+  "omonospace",
+  0xff4f,
+  "one",
+  0x0031,
+  "onearabic",
+  0x0661,
+  "onebengali",
+  0x09e7,
+  "onecircle",
+  0x2460,
+  "onecircleinversesansserif",
+  0x278a,
+  "onedeva",
+  0x0967,
+  "onedotenleader",
+  0x2024,
+  "oneeighth",
+  0x215b,
+  "onefitted",
+  0xf6dc,
+  "onegujarati",
+  0x0ae7,
+  "onegurmukhi",
+  0x0a67,
+  "onehackarabic",
+  0x0661,
+  "onehalf",
+  0x00bd,
+  "onehangzhou",
+  0x3021,
+  "oneideographicparen",
+  0x3220,
+  "oneinferior",
+  0x2081,
+  "onemonospace",
+  0xff11,
+  "onenumeratorbengali",
+  0x09f4,
+  "oneoldstyle",
+  0xf731,
+  "oneparen",
+  0x2474,
+  "oneperiod",
+  0x2488,
+  "onepersian",
+  0x06f1,
+  "onequarter",
+  0x00bc,
+  "oneroman",
+  0x2170,
+  "onesuperior",
+  0x00b9,
+  "onethai",
+  0x0e51,
+  "onethird",
+  0x2153,
+  "oogonek",
+  0x01eb,
+  "oogonekmacron",
+  0x01ed,
+  "oogurmukhi",
+  0x0a13,
+  "oomatragurmukhi",
+  0x0a4b,
+  "oopen",
+  0x0254,
+  "oparen",
+  0x24aa,
+  "openbullet",
+  0x25e6,
+  "option",
+  0x2325,
+  "ordfeminine",
+  0x00aa,
+  "ordmasculine",
+  0x00ba,
+  "orthogonal",
+  0x221f,
+  "oshortdeva",
+  0x0912,
+  "oshortvowelsigndeva",
+  0x094a,
+  "oslash",
+  0x00f8,
+  "oslashacute",
+  0x01ff,
+  "osmallhiragana",
+  0x3049,
+  "osmallkatakana",
+  0x30a9,
+  "osmallkatakanahalfwidth",
+  0xff6b,
+  "ostrokeacute",
+  0x01ff,
+  "osuperior",
+  0xf6f0,
+  "otcyrillic",
+  0x047f,
+  "otilde",
+  0x00f5,
+  "otildeacute",
+  0x1e4d,
+  "otildedieresis",
+  0x1e4f,
+  "oubopomofo",
+  0x3121,
+  "overline",
+  0x203e,
+  "overlinecenterline",
+  0xfe4a,
+  "overlinecmb",
+  0x0305,
+  "overlinedashed",
+  0xfe49,
+  "overlinedblwavy",
+  0xfe4c,
+  "overlinewavy",
+  0xfe4b,
+  "overscore",
+  0x00af,
+  "ovowelsignbengali",
+  0x09cb,
+  "ovowelsigndeva",
+  0x094b,
+  "ovowelsigngujarati",
+  0x0acb,
+  "p",
+  0x0070,
+  "paampssquare",
+  0x3380,
+  "paasentosquare",
+  0x332b,
+  "pabengali",
+  0x09aa,
+  "pacute",
+  0x1e55,
+  "padeva",
+  0x092a,
+  "pagedown",
+  0x21df,
+  "pageup",
+  0x21de,
+  "pagujarati",
+  0x0aaa,
+  "pagurmukhi",
+  0x0a2a,
+  "pahiragana",
+  0x3071,
+  "paiyannoithai",
+  0x0e2f,
+  "pakatakana",
+  0x30d1,
+  "palatalizationcyrilliccmb",
+  0x0484,
+  "palochkacyrillic",
+  0x04c0,
+  "pansioskorean",
+  0x317f,
+  "paragraph",
+  0x00b6,
+  "parallel",
+  0x2225,
+  "parenleft",
+  0x0028,
+  "parenleftaltonearabic",
+  0xfd3e,
+  "parenleftbt",
+  0xf8ed,
+  "parenleftex",
+  0xf8ec,
+  "parenleftinferior",
+  0x208d,
+  "parenleftmonospace",
+  0xff08,
+  "parenleftsmall",
+  0xfe59,
+  "parenleftsuperior",
+  0x207d,
+  "parenlefttp",
+  0xf8eb,
+  "parenleftvertical",
+  0xfe35,
+  "parenright",
+  0x0029,
+  "parenrightaltonearabic",
+  0xfd3f,
+  "parenrightbt",
+  0xf8f8,
+  "parenrightex",
+  0xf8f7,
+  "parenrightinferior",
+  0x208e,
+  "parenrightmonospace",
+  0xff09,
+  "parenrightsmall",
+  0xfe5a,
+  "parenrightsuperior",
+  0x207e,
+  "parenrighttp",
+  0xf8f6,
+  "parenrightvertical",
+  0xfe36,
+  "partialdiff",
+  0x2202,
+  "paseqhebrew",
+  0x05c0,
+  "pashtahebrew",
+  0x0599,
+  "pasquare",
+  0x33a9,
+  "patah",
+  0x05b7,
+  "patah11",
+  0x05b7,
+  "patah1d",
+  0x05b7,
+  "patah2a",
+  0x05b7,
+  "patahhebrew",
+  0x05b7,
+  "patahnarrowhebrew",
+  0x05b7,
+  "patahquarterhebrew",
+  0x05b7,
+  "patahwidehebrew",
+  0x05b7,
+  "pazerhebrew",
+  0x05a1,
+  "pbopomofo",
+  0x3106,
+  "pcircle",
+  0x24df,
+  "pdotaccent",
+  0x1e57,
+  "pe",
+  0x05e4,
+  "pecyrillic",
+  0x043f,
+  "pedagesh",
+  0xfb44,
+  "pedageshhebrew",
+  0xfb44,
+  "peezisquare",
+  0x333b,
+  "pefinaldageshhebrew",
+  0xfb43,
+  "peharabic",
+  0x067e,
+  "peharmenian",
+  0x057a,
+  "pehebrew",
+  0x05e4,
+  "pehfinalarabic",
+  0xfb57,
+  "pehinitialarabic",
+  0xfb58,
+  "pehiragana",
+  0x307a,
+  "pehmedialarabic",
+  0xfb59,
+  "pekatakana",
+  0x30da,
+  "pemiddlehookcyrillic",
+  0x04a7,
+  "perafehebrew",
+  0xfb4e,
+  "percent",
+  0x0025,
+  "percentarabic",
+  0x066a,
+  "percentmonospace",
+  0xff05,
+  "percentsmall",
+  0xfe6a,
+  "period",
+  0x002e,
+  "periodarmenian",
+  0x0589,
+  "periodcentered",
+  0x00b7,
+  "periodhalfwidth",
+  0xff61,
+  "periodinferior",
+  0xf6e7,
+  "periodmonospace",
+  0xff0e,
+  "periodsmall",
+  0xfe52,
+  "periodsuperior",
+  0xf6e8,
+  "perispomenigreekcmb",
+  0x0342,
+  "perpendicular",
+  0x22a5,
+  "perthousand",
+  0x2030,
+  "peseta",
+  0x20a7,
+  "pfsquare",
+  0x338a,
+  "phabengali",
+  0x09ab,
+  "phadeva",
+  0x092b,
+  "phagujarati",
+  0x0aab,
+  "phagurmukhi",
+  0x0a2b,
+  "phi",
+  0x03c6,
+  "phi1",
+  0x03d5,
+  "phieuphacirclekorean",
+  0x327a,
+  "phieuphaparenkorean",
+  0x321a,
+  "phieuphcirclekorean",
+  0x326c,
+  "phieuphkorean",
+  0x314d,
+  "phieuphparenkorean",
+  0x320c,
+  "philatin",
+  0x0278,
+  "phinthuthai",
+  0x0e3a,
+  "phisymbolgreek",
+  0x03d5,
+  "phook",
+  0x01a5,
+  "phophanthai",
+  0x0e1e,
+  "phophungthai",
+  0x0e1c,
+  "phosamphaothai",
+  0x0e20,
+  "pi",
+  0x03c0,
+  "pieupacirclekorean",
+  0x3273,
+  "pieupaparenkorean",
+  0x3213,
+  "pieupcieuckorean",
+  0x3176,
+  "pieupcirclekorean",
+  0x3265,
+  "pieupkiyeokkorean",
+  0x3172,
+  "pieupkorean",
+  0x3142,
+  "pieupparenkorean",
+  0x3205,
+  "pieupsioskiyeokkorean",
+  0x3174,
+  "pieupsioskorean",
+  0x3144,
+  "pieupsiostikeutkorean",
+  0x3175,
+  "pieupthieuthkorean",
+  0x3177,
+  "pieuptikeutkorean",
+  0x3173,
+  "pihiragana",
+  0x3074,
+  "pikatakana",
+  0x30d4,
+  "pisymbolgreek",
+  0x03d6,
+  "piwrarmenian",
+  0x0583,
+  "plus",
+  0x002b,
+  "plusbelowcmb",
+  0x031f,
+  "pluscircle",
+  0x2295,
+  "plusminus",
+  0x00b1,
+  "plusmod",
+  0x02d6,
+  "plusmonospace",
+  0xff0b,
+  "plussmall",
+  0xfe62,
+  "plussuperior",
+  0x207a,
+  "pmonospace",
+  0xff50,
+  "pmsquare",
+  0x33d8,
+  "pohiragana",
+  0x307d,
+  "pointingindexdownwhite",
+  0x261f,
+  "pointingindexleftwhite",
+  0x261c,
+  "pointingindexrightwhite",
+  0x261e,
+  "pointingindexupwhite",
+  0x261d,
+  "pokatakana",
+  0x30dd,
+  "poplathai",
+  0x0e1b,
+  "postalmark",
+  0x3012,
+  "postalmarkface",
+  0x3020,
+  "pparen",
+  0x24ab,
+  "precedes",
+  0x227a,
+  "prescription",
+  0x211e,
+  "primemod",
+  0x02b9,
+  "primereversed",
+  0x2035,
+  "product",
+  0x220f,
+  "projective",
+  0x2305,
+  "prolongedkana",
+  0x30fc,
+  "propellor",
+  0x2318,
+  "propersubset",
+  0x2282,
+  "propersuperset",
+  0x2283,
+  "proportion",
+  0x2237,
+  "proportional",
+  0x221d,
+  "psi",
+  0x03c8,
+  "psicyrillic",
+  0x0471,
+  "psilipneumatacyrilliccmb",
+  0x0486,
+  "pssquare",
+  0x33b0,
+  "puhiragana",
+  0x3077,
+  "pukatakana",
+  0x30d7,
+  "pvsquare",
+  0x33b4,
+  "pwsquare",
+  0x33ba,
+  "q",
+  0x0071,
+  "qadeva",
+  0x0958,
+  "qadmahebrew",
+  0x05a8,
+  "qafarabic",
+  0x0642,
+  "qaffinalarabic",
+  0xfed6,
+  "qafinitialarabic",
+  0xfed7,
+  "qafmedialarabic",
+  0xfed8,
+  "qamats",
+  0x05b8,
+  "qamats10",
+  0x05b8,
+  "qamats1a",
+  0x05b8,
+  "qamats1c",
+  0x05b8,
+  "qamats27",
+  0x05b8,
+  "qamats29",
+  0x05b8,
+  "qamats33",
+  0x05b8,
+  "qamatsde",
+  0x05b8,
+  "qamatshebrew",
+  0x05b8,
+  "qamatsnarrowhebrew",
+  0x05b8,
+  "qamatsqatanhebrew",
+  0x05b8,
+  "qamatsqatannarrowhebrew",
+  0x05b8,
+  "qamatsqatanquarterhebrew",
+  0x05b8,
+  "qamatsqatanwidehebrew",
+  0x05b8,
+  "qamatsquarterhebrew",
+  0x05b8,
+  "qamatswidehebrew",
+  0x05b8,
+  "qarneyparahebrew",
+  0x059f,
+  "qbopomofo",
+  0x3111,
+  "qcircle",
+  0x24e0,
+  "qhook",
+  0x02a0,
+  "qmonospace",
+  0xff51,
+  "qof",
+  0x05e7,
+  "qofdagesh",
+  0xfb47,
+  "qofdageshhebrew",
+  0xfb47,
+  "qofhebrew",
+  0x05e7,
+  "qparen",
+  0x24ac,
+  "quarternote",
+  0x2669,
+  "qubuts",
+  0x05bb,
+  "qubuts18",
+  0x05bb,
+  "qubuts25",
+  0x05bb,
+  "qubuts31",
+  0x05bb,
+  "qubutshebrew",
+  0x05bb,
+  "qubutsnarrowhebrew",
+  0x05bb,
+  "qubutsquarterhebrew",
+  0x05bb,
+  "qubutswidehebrew",
+  0x05bb,
+  "question",
+  0x003f,
+  "questionarabic",
+  0x061f,
+  "questionarmenian",
+  0x055e,
+  "questiondown",
+  0x00bf,
+  "questiondownsmall",
+  0xf7bf,
+  "questiongreek",
+  0x037e,
+  "questionmonospace",
+  0xff1f,
+  "questionsmall",
+  0xf73f,
+  "quotedbl",
+  0x0022,
+  "quotedblbase",
+  0x201e,
+  "quotedblleft",
+  0x201c,
+  "quotedblmonospace",
+  0xff02,
+  "quotedblprime",
+  0x301e,
+  "quotedblprimereversed",
+  0x301d,
+  "quotedblright",
+  0x201d,
+  "quoteleft",
+  0x2018,
+  "quoteleftreversed",
+  0x201b,
+  "quotereversed",
+  0x201b,
+  "quoteright",
+  0x2019,
+  "quoterightn",
+  0x0149,
+  "quotesinglbase",
+  0x201a,
+  "quotesingle",
+  0x0027,
+  "quotesinglemonospace",
+  0xff07,
+  "r",
+  0x0072,
+  "raarmenian",
+  0x057c,
+  "rabengali",
+  0x09b0,
+  "racute",
+  0x0155,
+  "radeva",
+  0x0930,
+  "radical",
+  0x221a,
+  "radicalex",
+  0xf8e5,
+  "radoverssquare",
+  0x33ae,
+  "radoverssquaredsquare",
+  0x33af,
+  "radsquare",
+  0x33ad,
+  "rafe",
+  0x05bf,
+  "rafehebrew",
+  0x05bf,
+  "ragujarati",
+  0x0ab0,
+  "ragurmukhi",
+  0x0a30,
+  "rahiragana",
+  0x3089,
+  "rakatakana",
+  0x30e9,
+  "rakatakanahalfwidth",
+  0xff97,
+  "ralowerdiagonalbengali",
+  0x09f1,
+  "ramiddlediagonalbengali",
+  0x09f0,
+  "ramshorn",
+  0x0264,
+  "ratio",
+  0x2236,
+  "rbopomofo",
+  0x3116,
+  "rcaron",
+  0x0159,
+  "rcedilla",
+  0x0157,
+  "rcircle",
+  0x24e1,
+  "rcommaaccent",
+  0x0157,
+  "rdblgrave",
+  0x0211,
+  "rdotaccent",
+  0x1e59,
+  "rdotbelow",
+  0x1e5b,
+  "rdotbelowmacron",
+  0x1e5d,
+  "referencemark",
+  0x203b,
+  "reflexsubset",
+  0x2286,
+  "reflexsuperset",
+  0x2287,
+  "registered",
+  0x00ae,
+  "registersans",
+  0xf8e8,
+  "registerserif",
+  0xf6da,
+  "reharabic",
+  0x0631,
+  "reharmenian",
+  0x0580,
+  "rehfinalarabic",
+  0xfeae,
+  "rehiragana",
+  0x308c,
+  "rekatakana",
+  0x30ec,
+  "rekatakanahalfwidth",
+  0xff9a,
+  "resh",
+  0x05e8,
+  "reshdageshhebrew",
+  0xfb48,
+  "reshhebrew",
+  0x05e8,
+  "reversedtilde",
+  0x223d,
+  "reviahebrew",
+  0x0597,
+  "reviamugrashhebrew",
+  0x0597,
+  "revlogicalnot",
+  0x2310,
+  "rfishhook",
+  0x027e,
+  "rfishhookreversed",
+  0x027f,
+  "rhabengali",
+  0x09dd,
+  "rhadeva",
+  0x095d,
+  "rho",
+  0x03c1,
+  "rhook",
+  0x027d,
+  "rhookturned",
+  0x027b,
+  "rhookturnedsuperior",
+  0x02b5,
+  "rhosymbolgreek",
+  0x03f1,
+  "rhotichookmod",
+  0x02de,
+  "rieulacirclekorean",
+  0x3271,
+  "rieulaparenkorean",
+  0x3211,
+  "rieulcirclekorean",
+  0x3263,
+  "rieulhieuhkorean",
+  0x3140,
+  "rieulkiyeokkorean",
+  0x313a,
+  "rieulkiyeoksioskorean",
+  0x3169,
+  "rieulkorean",
+  0x3139,
+  "rieulmieumkorean",
+  0x313b,
+  "rieulpansioskorean",
+  0x316c,
+  "rieulparenkorean",
+  0x3203,
+  "rieulphieuphkorean",
+  0x313f,
+  "rieulpieupkorean",
+  0x313c,
+  "rieulpieupsioskorean",
+  0x316b,
+  "rieulsioskorean",
+  0x313d,
+  "rieulthieuthkorean",
+  0x313e,
+  "rieultikeutkorean",
+  0x316a,
+  "rieulyeorinhieuhkorean",
+  0x316d,
+  "rightangle",
+  0x221f,
+  "righttackbelowcmb",
+  0x0319,
+  "righttriangle",
+  0x22bf,
+  "rihiragana",
+  0x308a,
+  "rikatakana",
+  0x30ea,
+  "rikatakanahalfwidth",
+  0xff98,
+  "ring",
+  0x02da,
+  "ringbelowcmb",
+  0x0325,
+  "ringcmb",
+  0x030a,
+  "ringhalfleft",
+  0x02bf,
+  "ringhalfleftarmenian",
+  0x0559,
+  "ringhalfleftbelowcmb",
+  0x031c,
+  "ringhalfleftcentered",
+  0x02d3,
+  "ringhalfright",
+  0x02be,
+  "ringhalfrightbelowcmb",
+  0x0339,
+  "ringhalfrightcentered",
+  0x02d2,
+  "rinvertedbreve",
+  0x0213,
+  "rittorusquare",
+  0x3351,
+  "rlinebelow",
+  0x1e5f,
+  "rlongleg",
+  0x027c,
+  "rlonglegturned",
+  0x027a,
+  "rmonospace",
+  0xff52,
+  "rohiragana",
+  0x308d,
+  "rokatakana",
+  0x30ed,
+  "rokatakanahalfwidth",
+  0xff9b,
+  "roruathai",
+  0x0e23,
+  "rparen",
+  0x24ad,
+  "rrabengali",
+  0x09dc,
+  "rradeva",
+  0x0931,
+  "rragurmukhi",
+  0x0a5c,
+  "rreharabic",
+  0x0691,
+  "rrehfinalarabic",
+  0xfb8d,
+  "rrvocalicbengali",
+  0x09e0,
+  "rrvocalicdeva",
+  0x0960,
+  "rrvocalicgujarati",
+  0x0ae0,
+  "rrvocalicvowelsignbengali",
+  0x09c4,
+  "rrvocalicvowelsigndeva",
+  0x0944,
+  "rrvocalicvowelsigngujarati",
+  0x0ac4,
+  "rsuperior",
+  0xf6f1,
+  "rtblock",
+  0x2590,
+  "rturned",
+  0x0279,
+  "rturnedsuperior",
+  0x02b4,
+  "ruhiragana",
+  0x308b,
+  "rukatakana",
+  0x30eb,
+  "rukatakanahalfwidth",
+  0xff99,
+  "rupeemarkbengali",
+  0x09f2,
+  "rupeesignbengali",
+  0x09f3,
+  "rupiah",
+  0xf6dd,
+  "ruthai",
+  0x0e24,
+  "rvocalicbengali",
+  0x098b,
+  "rvocalicdeva",
+  0x090b,
+  "rvocalicgujarati",
+  0x0a8b,
+  "rvocalicvowelsignbengali",
+  0x09c3,
+  "rvocalicvowelsigndeva",
+  0x0943,
+  "rvocalicvowelsigngujarati",
+  0x0ac3,
+  "s",
+  0x0073,
+  "sabengali",
+  0x09b8,
+  "sacute",
+  0x015b,
+  "sacutedotaccent",
+  0x1e65,
+  "sadarabic",
+  0x0635,
+  "sadeva",
+  0x0938,
+  "sadfinalarabic",
+  0xfeba,
+  "sadinitialarabic",
+  0xfebb,
+  "sadmedialarabic",
+  0xfebc,
+  "sagujarati",
+  0x0ab8,
+  "sagurmukhi",
+  0x0a38,
+  "sahiragana",
+  0x3055,
+  "sakatakana",
+  0x30b5,
+  "sakatakanahalfwidth",
+  0xff7b,
+  "sallallahoualayhewasallamarabic",
+  0xfdfa,
+  "samekh",
+  0x05e1,
+  "samekhdagesh",
+  0xfb41,
+  "samekhdageshhebrew",
+  0xfb41,
+  "samekhhebrew",
+  0x05e1,
+  "saraaathai",
+  0x0e32,
+  "saraaethai",
+  0x0e41,
+  "saraaimaimalaithai",
+  0x0e44,
+  "saraaimaimuanthai",
+  0x0e43,
+  "saraamthai",
+  0x0e33,
+  "saraathai",
+  0x0e30,
+  "saraethai",
+  0x0e40,
+  "saraiileftthai",
+  0xf886,
+  "saraiithai",
+  0x0e35,
+  "saraileftthai",
+  0xf885,
+  "saraithai",
+  0x0e34,
+  "saraothai",
+  0x0e42,
+  "saraueeleftthai",
+  0xf888,
+  "saraueethai",
+  0x0e37,
+  "saraueleftthai",
+  0xf887,
+  "sarauethai",
+  0x0e36,
+  "sarauthai",
+  0x0e38,
+  "sarauuthai",
+  0x0e39,
+  "sbopomofo",
+  0x3119,
+  "scaron",
+  0x0161,
+  "scarondotaccent",
+  0x1e67,
+  "scedilla",
+  0x015f,
+  "schwa",
+  0x0259,
+  "schwacyrillic",
+  0x04d9,
+  "schwadieresiscyrillic",
+  0x04db,
+  "schwahook",
+  0x025a,
+  "scircle",
+  0x24e2,
+  "scircumflex",
+  0x015d,
+  "scommaaccent",
+  0x0219,
+  "sdotaccent",
+  0x1e61,
+  "sdotbelow",
+  0x1e63,
+  "sdotbelowdotaccent",
+  0x1e69,
+  "seagullbelowcmb",
+  0x033c,
+  "second",
+  0x2033,
+  "secondtonechinese",
+  0x02ca,
+  "section",
+  0x00a7,
+  "seenarabic",
+  0x0633,
+  "seenfinalarabic",
+  0xfeb2,
+  "seeninitialarabic",
+  0xfeb3,
+  "seenmedialarabic",
+  0xfeb4,
+  "segol",
+  0x05b6,
+  "segol13",
+  0x05b6,
+  "segol1f",
+  0x05b6,
+  "segol2c",
+  0x05b6,
+  "segolhebrew",
+  0x05b6,
+  "segolnarrowhebrew",
+  0x05b6,
+  "segolquarterhebrew",
+  0x05b6,
+  "segoltahebrew",
+  0x0592,
+  "segolwidehebrew",
+  0x05b6,
+  "seharmenian",
+  0x057d,
+  "sehiragana",
+  0x305b,
+  "sekatakana",
+  0x30bb,
+  "sekatakanahalfwidth",
+  0xff7e,
+  "semicolon",
+  0x003b,
+  "semicolonarabic",
+  0x061b,
+  "semicolonmonospace",
+  0xff1b,
+  "semicolonsmall",
+  0xfe54,
+  "semivoicedmarkkana",
+  0x309c,
+  "semivoicedmarkkanahalfwidth",
+  0xff9f,
+  "sentisquare",
+  0x3322,
+  "sentosquare",
+  0x3323,
+  "seven",
+  0x0037,
+  "sevenarabic",
+  0x0667,
+  "sevenbengali",
+  0x09ed,
+  "sevencircle",
+  0x2466,
+  "sevencircleinversesansserif",
+  0x2790,
+  "sevendeva",
+  0x096d,
+  "seveneighths",
+  0x215e,
+  "sevengujarati",
+  0x0aed,
+  "sevengurmukhi",
+  0x0a6d,
+  "sevenhackarabic",
+  0x0667,
+  "sevenhangzhou",
+  0x3027,
+  "sevenideographicparen",
+  0x3226,
+  "seveninferior",
+  0x2087,
+  "sevenmonospace",
+  0xff17,
+  "sevenoldstyle",
+  0xf737,
+  "sevenparen",
+  0x247a,
+  "sevenperiod",
+  0x248e,
+  "sevenpersian",
+  0x06f7,
+  "sevenroman",
+  0x2176,
+  "sevensuperior",
+  0x2077,
+  "seventeencircle",
+  0x2470,
+  "seventeenparen",
+  0x2484,
+  "seventeenperiod",
+  0x2498,
+  "seventhai",
+  0x0e57,
+  "sfthyphen",
+  0x00ad,
+  "shaarmenian",
+  0x0577,
+  "shabengali",
+  0x09b6,
+  "shacyrillic",
+  0x0448,
+  "shaddaarabic",
+  0x0651,
+  "shaddadammaarabic",
+  0xfc61,
+  "shaddadammatanarabic",
+  0xfc5e,
+  "shaddafathaarabic",
+  0xfc60,
+  "shaddakasraarabic",
+  0xfc62,
+  "shaddakasratanarabic",
+  0xfc5f,
+  "shade",
+  0x2592,
+  "shadedark",
+  0x2593,
+  "shadelight",
+  0x2591,
+  "shademedium",
+  0x2592,
+  "shadeva",
+  0x0936,
+  "shagujarati",
+  0x0ab6,
+  "shagurmukhi",
+  0x0a36,
+  "shalshelethebrew",
+  0x0593,
+  "shbopomofo",
+  0x3115,
+  "shchacyrillic",
+  0x0449,
+  "sheenarabic",
+  0x0634,
+  "sheenfinalarabic",
+  0xfeb6,
+  "sheeninitialarabic",
+  0xfeb7,
+  "sheenmedialarabic",
+  0xfeb8,
+  "sheicoptic",
+  0x03e3,
+  "sheqel",
+  0x20aa,
+  "sheqelhebrew",
+  0x20aa,
+  "sheva",
+  0x05b0,
+  "sheva115",
+  0x05b0,
+  "sheva15",
+  0x05b0,
+  "sheva22",
+  0x05b0,
+  "sheva2e",
+  0x05b0,
+  "shevahebrew",
+  0x05b0,
+  "shevanarrowhebrew",
+  0x05b0,
+  "shevaquarterhebrew",
+  0x05b0,
+  "shevawidehebrew",
+  0x05b0,
+  "shhacyrillic",
+  0x04bb,
+  "shimacoptic",
+  0x03ed,
+  "shin",
+  0x05e9,
+  "shindagesh",
+  0xfb49,
+  "shindageshhebrew",
+  0xfb49,
+  "shindageshshindot",
+  0xfb2c,
+  "shindageshshindothebrew",
+  0xfb2c,
+  "shindageshsindot",
+  0xfb2d,
+  "shindageshsindothebrew",
+  0xfb2d,
+  "shindothebrew",
+  0x05c1,
+  "shinhebrew",
+  0x05e9,
+  "shinshindot",
+  0xfb2a,
+  "shinshindothebrew",
+  0xfb2a,
+  "shinsindot",
+  0xfb2b,
+  "shinsindothebrew",
+  0xfb2b,
+  "shook",
+  0x0282,
+  "sigma",
+  0x03c3,
+  "sigma1",
+  0x03c2,
+  "sigmafinal",
+  0x03c2,
+  "sigmalunatesymbolgreek",
+  0x03f2,
+  "sihiragana",
+  0x3057,
+  "sikatakana",
+  0x30b7,
+  "sikatakanahalfwidth",
+  0xff7c,
+  "siluqhebrew",
+  0x05bd,
+  "siluqlefthebrew",
+  0x05bd,
+  "similar",
+  0x223c,
+  "sindothebrew",
+  0x05c2,
+  "siosacirclekorean",
+  0x3274,
+  "siosaparenkorean",
+  0x3214,
+  "sioscieuckorean",
+  0x317e,
+  "sioscirclekorean",
+  0x3266,
+  "sioskiyeokkorean",
+  0x317a,
+  "sioskorean",
+  0x3145,
+  "siosnieunkorean",
+  0x317b,
+  "siosparenkorean",
+  0x3206,
+  "siospieupkorean",
+  0x317d,
+  "siostikeutkorean",
+  0x317c,
+  "six",
+  0x0036,
+  "sixarabic",
+  0x0666,
+  "sixbengali",
+  0x09ec,
+  "sixcircle",
+  0x2465,
+  "sixcircleinversesansserif",
+  0x278f,
+  "sixdeva",
+  0x096c,
+  "sixgujarati",
+  0x0aec,
+  "sixgurmukhi",
+  0x0a6c,
+  "sixhackarabic",
+  0x0666,
+  "sixhangzhou",
+  0x3026,
+  "sixideographicparen",
+  0x3225,
+  "sixinferior",
+  0x2086,
+  "sixmonospace",
+  0xff16,
+  "sixoldstyle",
+  0xf736,
+  "sixparen",
+  0x2479,
+  "sixperiod",
+  0x248d,
+  "sixpersian",
+  0x06f6,
+  "sixroman",
+  0x2175,
+  "sixsuperior",
+  0x2076,
+  "sixteencircle",
+  0x246f,
+  "sixteencurrencydenominatorbengali",
+  0x09f9,
+  "sixteenparen",
+  0x2483,
+  "sixteenperiod",
+  0x2497,
+  "sixthai",
+  0x0e56,
+  "slash",
+  0x002f,
+  "slashmonospace",
+  0xff0f,
+  "slong",
+  0x017f,
+  "slongdotaccent",
+  0x1e9b,
+  "smileface",
+  0x263a,
+  "smonospace",
+  0xff53,
+  "sofpasuqhebrew",
+  0x05c3,
+  "softhyphen",
+  0x00ad,
+  "softsigncyrillic",
+  0x044c,
+  "sohiragana",
+  0x305d,
+  "sokatakana",
+  0x30bd,
+  "sokatakanahalfwidth",
+  0xff7f,
+  "soliduslongoverlaycmb",
+  0x0338,
+  "solidusshortoverlaycmb",
+  0x0337,
+  "sorusithai",
+  0x0e29,
+  "sosalathai",
+  0x0e28,
+  "sosothai",
+  0x0e0b,
+  "sosuathai",
+  0x0e2a,
+  "space",
+  0x0020,
+  "spacehackarabic",
+  0x0020,
+  "spade",
+  0x2660,
+  "spadesuitblack",
+  0x2660,
+  "spadesuitwhite",
+  0x2664,
+  "sparen",
+  0x24ae,
+  "squarebelowcmb",
+  0x033b,
+  "squarecc",
+  0x33c4,
+  "squarecm",
+  0x339d,
+  "squarediagonalcrosshatchfill",
+  0x25a9,
+  "squarehorizontalfill",
+  0x25a4,
+  "squarekg",
+  0x338f,
+  "squarekm",
+  0x339e,
+  "squarekmcapital",
+  0x33ce,
+  "squareln",
+  0x33d1,
+  "squarelog",
+  0x33d2,
+  "squaremg",
+  0x338e,
+  "squaremil",
+  0x33d5,
+  "squaremm",
+  0x339c,
+  "squaremsquared",
+  0x33a1,
+  "squareorthogonalcrosshatchfill",
+  0x25a6,
+  "squareupperlefttolowerrightfill",
+  0x25a7,
+  "squareupperrighttolowerleftfill",
+  0x25a8,
+  "squareverticalfill",
+  0x25a5,
+  "squarewhitewithsmallblack",
+  0x25a3,
+  "srsquare",
+  0x33db,
+  "ssabengali",
+  0x09b7,
+  "ssadeva",
+  0x0937,
+  "ssagujarati",
+  0x0ab7,
+  "ssangcieuckorean",
+  0x3149,
+  "ssanghieuhkorean",
+  0x3185,
+  "ssangieungkorean",
+  0x3180,
+  "ssangkiyeokkorean",
+  0x3132,
+  "ssangnieunkorean",
+  0x3165,
+  "ssangpieupkorean",
+  0x3143,
+  "ssangsioskorean",
+  0x3146,
+  "ssangtikeutkorean",
+  0x3138,
+  "ssuperior",
+  0xf6f2,
+  "sterling",
+  0x00a3,
+  "sterlingmonospace",
+  0xffe1,
+  "strokelongoverlaycmb",
+  0x0336,
+  "strokeshortoverlaycmb",
+  0x0335,
+  "subset",
+  0x2282,
+  "subsetnotequal",
+  0x228a,
+  "subsetorequal",
+  0x2286,
+  "succeeds",
+  0x227b,
+  "suchthat",
+  0x220b,
+  "suhiragana",
+  0x3059,
+  "sukatakana",
+  0x30b9,
+  "sukatakanahalfwidth",
+  0xff7d,
+  "sukunarabic",
+  0x0652,
+  "summation",
+  0x2211,
+  "sun",
+  0x263c,
+  "superset",
+  0x2283,
+  "supersetnotequal",
+  0x228b,
+  "supersetorequal",
+  0x2287,
+  "svsquare",
+  0x33dc,
+  "syouwaerasquare",
+  0x337c,
+  "t",
+  0x0074,
+  "tabengali",
+  0x09a4,
+  "tackdown",
+  0x22a4,
+  "tackleft",
+  0x22a3,
+  "tadeva",
+  0x0924,
+  "tagujarati",
+  0x0aa4,
+  "tagurmukhi",
+  0x0a24,
+  "taharabic",
+  0x0637,
+  "tahfinalarabic",
+  0xfec2,
+  "tahinitialarabic",
+  0xfec3,
+  "tahiragana",
+  0x305f,
+  "tahmedialarabic",
+  0xfec4,
+  "taisyouerasquare",
+  0x337d,
+  "takatakana",
+  0x30bf,
+  "takatakanahalfwidth",
+  0xff80,
+  "tatweelarabic",
+  0x0640,
+  "tau",
+  0x03c4,
+  "tav",
+  0x05ea,
+  "tavdages",
+  0xfb4a,
+  "tavdagesh",
+  0xfb4a,
+  "tavdageshhebrew",
+  0xfb4a,
+  "tavhebrew",
+  0x05ea,
+  "tbar",
+  0x0167,
+  "tbopomofo",
+  0x310a,
+  "tcaron",
+  0x0165,
+  "tccurl",
+  0x02a8,
+  "tcedilla",
+  0x0163,
+  "tcheharabic",
+  0x0686,
+  "tchehfinalarabic",
+  0xfb7b,
+  "tchehinitialarabic",
+  0xfb7c,
+  "tchehmedialarabic",
+  0xfb7d,
+  "tcircle",
+  0x24e3,
+  "tcircumflexbelow",
+  0x1e71,
+  "tcommaaccent",
+  0x0163,
+  "tdieresis",
+  0x1e97,
+  "tdotaccent",
+  0x1e6b,
+  "tdotbelow",
+  0x1e6d,
+  "tecyrillic",
+  0x0442,
+  "tedescendercyrillic",
+  0x04ad,
+  "teharabic",
+  0x062a,
+  "tehfinalarabic",
+  0xfe96,
+  "tehhahinitialarabic",
+  0xfca2,
+  "tehhahisolatedarabic",
+  0xfc0c,
+  "tehinitialarabic",
+  0xfe97,
+  "tehiragana",
+  0x3066,
+  "tehjeeminitialarabic",
+  0xfca1,
+  "tehjeemisolatedarabic",
+  0xfc0b,
+  "tehmarbutaarabic",
+  0x0629,
+  "tehmarbutafinalarabic",
+  0xfe94,
+  "tehmedialarabic",
+  0xfe98,
+  "tehmeeminitialarabic",
+  0xfca4,
+  "tehmeemisolatedarabic",
+  0xfc0e,
+  "tehnoonfinalarabic",
+  0xfc73,
+  "tekatakana",
+  0x30c6,
+  "tekatakanahalfwidth",
+  0xff83,
+  "telephone",
+  0x2121,
+  "telephoneblack",
+  0x260e,
+  "telishagedolahebrew",
+  0x05a0,
+  "telishaqetanahebrew",
+  0x05a9,
+  "tencircle",
+  0x2469,
+  "tenideographicparen",
+  0x3229,
+  "tenparen",
+  0x247d,
+  "tenperiod",
+  0x2491,
+  "tenroman",
+  0x2179,
+  "tesh",
+  0x02a7,
+  "tet",
+  0x05d8,
+  "tetdagesh",
+  0xfb38,
+  "tetdageshhebrew",
+  0xfb38,
+  "tethebrew",
+  0x05d8,
+  "tetsecyrillic",
+  0x04b5,
+  "tevirhebrew",
+  0x059b,
+  "tevirlefthebrew",
+  0x059b,
+  "thabengali",
+  0x09a5,
+  "thadeva",
+  0x0925,
+  "thagujarati",
+  0x0aa5,
+  "thagurmukhi",
+  0x0a25,
+  "thalarabic",
+  0x0630,
+  "thalfinalarabic",
+  0xfeac,
+  "thanthakhatlowleftthai",
+  0xf898,
+  "thanthakhatlowrightthai",
+  0xf897,
+  "thanthakhatthai",
+  0x0e4c,
+  "thanthakhatupperleftthai",
+  0xf896,
+  "theharabic",
+  0x062b,
+  "thehfinalarabic",
+  0xfe9a,
+  "thehinitialarabic",
+  0xfe9b,
+  "thehmedialarabic",
+  0xfe9c,
+  "thereexists",
+  0x2203,
+  "therefore",
+  0x2234,
+  "theta",
+  0x03b8,
+  "theta1",
+  0x03d1,
+  "thetasymbolgreek",
+  0x03d1,
+  "thieuthacirclekorean",
+  0x3279,
+  "thieuthaparenkorean",
+  0x3219,
+  "thieuthcirclekorean",
+  0x326b,
+  "thieuthkorean",
+  0x314c,
+  "thieuthparenkorean",
+  0x320b,
+  "thirteencircle",
+  0x246c,
+  "thirteenparen",
+  0x2480,
+  "thirteenperiod",
+  0x2494,
+  "thonangmonthothai",
+  0x0e11,
+  "thook",
+  0x01ad,
+  "thophuthaothai",
+  0x0e12,
+  "thorn",
+  0x00fe,
+  "thothahanthai",
+  0x0e17,
+  "thothanthai",
+  0x0e10,
+  "thothongthai",
+  0x0e18,
+  "thothungthai",
+  0x0e16,
+  "thousandcyrillic",
+  0x0482,
+  "thousandsseparatorarabic",
+  0x066c,
+  "thousandsseparatorpersian",
+  0x066c,
+  "three",
+  0x0033,
+  "threearabic",
+  0x0663,
+  "threebengali",
+  0x09e9,
+  "threecircle",
+  0x2462,
+  "threecircleinversesansserif",
+  0x278c,
+  "threedeva",
+  0x0969,
+  "threeeighths",
+  0x215c,
+  "threegujarati",
+  0x0ae9,
+  "threegurmukhi",
+  0x0a69,
+  "threehackarabic",
+  0x0663,
+  "threehangzhou",
+  0x3023,
+  "threeideographicparen",
+  0x3222,
+  "threeinferior",
+  0x2083,
+  "threemonospace",
+  0xff13,
+  "threenumeratorbengali",
+  0x09f6,
+  "threeoldstyle",
+  0xf733,
+  "threeparen",
+  0x2476,
+  "threeperiod",
+  0x248a,
+  "threepersian",
+  0x06f3,
+  "threequarters",
+  0x00be,
+  "threequartersemdash",
+  0xf6de,
+  "threeroman",
+  0x2172,
+  "threesuperior",
+  0x00b3,
+  "threethai",
+  0x0e53,
+  "thzsquare",
+  0x3394,
+  "tihiragana",
+  0x3061,
+  "tikatakana",
+  0x30c1,
+  "tikatakanahalfwidth",
+  0xff81,
+  "tikeutacirclekorean",
+  0x3270,
+  "tikeutaparenkorean",
+  0x3210,
+  "tikeutcirclekorean",
+  0x3262,
+  "tikeutkorean",
+  0x3137,
+  "tikeutparenkorean",
+  0x3202,
+  "tilde",
+  0x02dc,
+  "tildebelowcmb",
+  0x0330,
+  "tildecmb",
+  0x0303,
+  "tildecomb",
+  0x0303,
+  "tildedoublecmb",
+  0x0360,
+  "tildeoperator",
+  0x223c,
+  "tildeoverlaycmb",
+  0x0334,
+  "tildeverticalcmb",
+  0x033e,
+  "timescircle",
+  0x2297,
+  "tipehahebrew",
+  0x0596,
+  "tipehalefthebrew",
+  0x0596,
+  "tippigurmukhi",
+  0x0a70,
+  "titlocyrilliccmb",
+  0x0483,
+  "tiwnarmenian",
+  0x057f,
+  "tlinebelow",
+  0x1e6f,
+  "tmonospace",
+  0xff54,
+  "toarmenian",
+  0x0569,
+  "tohiragana",
+  0x3068,
+  "tokatakana",
+  0x30c8,
+  "tokatakanahalfwidth",
+  0xff84,
+  "tonebarextrahighmod",
+  0x02e5,
+  "tonebarextralowmod",
+  0x02e9,
+  "tonebarhighmod",
+  0x02e6,
+  "tonebarlowmod",
+  0x02e8,
+  "tonebarmidmod",
+  0x02e7,
+  "tonefive",
+  0x01bd,
+  "tonesix",
+  0x0185,
+  "tonetwo",
+  0x01a8,
+  "tonos",
+  0x0384,
+  "tonsquare",
+  0x3327,
+  "topatakthai",
+  0x0e0f,
+  "tortoiseshellbracketleft",
+  0x3014,
+  "tortoiseshellbracketleftsmall",
+  0xfe5d,
+  "tortoiseshellbracketleftvertical",
+  0xfe39,
+  "tortoiseshellbracketright",
+  0x3015,
+  "tortoiseshellbracketrightsmall",
+  0xfe5e,
+  "tortoiseshellbracketrightvertical",
+  0xfe3a,
+  "totaothai",
+  0x0e15,
+  "tpalatalhook",
+  0x01ab,
+  "tparen",
+  0x24af,
+  "trademark",
+  0x2122,
+  "trademarksans",
+  0xf8ea,
+  "trademarkserif",
+  0xf6db,
+  "tretroflexhook",
+  0x0288,
+  "triagdn",
+  0x25bc,
+  "triaglf",
+  0x25c4,
+  "triagrt",
+  0x25ba,
+  "triagup",
+  0x25b2,
+  "ts",
+  0x02a6,
+  "tsadi",
+  0x05e6,
+  "tsadidagesh",
+  0xfb46,
+  "tsadidageshhebrew",
+  0xfb46,
+  "tsadihebrew",
+  0x05e6,
+  "tsecyrillic",
+  0x0446,
+  "tsere",
+  0x05b5,
+  "tsere12",
+  0x05b5,
+  "tsere1e",
+  0x05b5,
+  "tsere2b",
+  0x05b5,
+  "tserehebrew",
+  0x05b5,
+  "tserenarrowhebrew",
+  0x05b5,
+  "tserequarterhebrew",
+  0x05b5,
+  "tserewidehebrew",
+  0x05b5,
+  "tshecyrillic",
+  0x045b,
+  "tsuperior",
+  0xf6f3,
+  "ttabengali",
+  0x099f,
+  "ttadeva",
+  0x091f,
+  "ttagujarati",
+  0x0a9f,
+  "ttagurmukhi",
+  0x0a1f,
+  "tteharabic",
+  0x0679,
+  "ttehfinalarabic",
+  0xfb67,
+  "ttehinitialarabic",
+  0xfb68,
+  "ttehmedialarabic",
+  0xfb69,
+  "tthabengali",
+  0x09a0,
+  "tthadeva",
+  0x0920,
+  "tthagujarati",
+  0x0aa0,
+  "tthagurmukhi",
+  0x0a20,
+  "tturned",
+  0x0287,
+  "tuhiragana",
+  0x3064,
+  "tukatakana",
+  0x30c4,
+  "tukatakanahalfwidth",
+  0xff82,
+  "tusmallhiragana",
+  0x3063,
+  "tusmallkatakana",
+  0x30c3,
+  "tusmallkatakanahalfwidth",
+  0xff6f,
+  "twelvecircle",
+  0x246b,
+  "twelveparen",
+  0x247f,
+  "twelveperiod",
+  0x2493,
+  "twelveroman",
+  0x217b,
+  "twentycircle",
+  0x2473,
+  "twentyhangzhou",
+  0x5344,
+  "twentyparen",
+  0x2487,
+  "twentyperiod",
+  0x249b,
+  "two",
+  0x0032,
+  "twoarabic",
+  0x0662,
+  "twobengali",
+  0x09e8,
+  "twocircle",
+  0x2461,
+  "twocircleinversesansserif",
+  0x278b,
+  "twodeva",
+  0x0968,
+  "twodotenleader",
+  0x2025,
+  "twodotleader",
+  0x2025,
+  "twodotleadervertical",
+  0xfe30,
+  "twogujarati",
+  0x0ae8,
+  "twogurmukhi",
+  0x0a68,
+  "twohackarabic",
+  0x0662,
+  "twohangzhou",
+  0x3022,
+  "twoideographicparen",
+  0x3221,
+  "twoinferior",
+  0x2082,
+  "twomonospace",
+  0xff12,
+  "twonumeratorbengali",
+  0x09f5,
+  "twooldstyle",
+  0xf732,
+  "twoparen",
+  0x2475,
+  "twoperiod",
+  0x2489,
+  "twopersian",
+  0x06f2,
+  "tworoman",
+  0x2171,
+  "twostroke",
+  0x01bb,
+  "twosuperior",
+  0x00b2,
+  "twothai",
+  0x0e52,
+  "twothirds",
+  0x2154,
+  "u",
+  0x0075,
+  "uacute",
+  0x00fa,
+  "ubar",
+  0x0289,
+  "ubengali",
+  0x0989,
+  "ubopomofo",
+  0x3128,
+  "ubreve",
+  0x016d,
+  "ucaron",
+  0x01d4,
+  "ucircle",
+  0x24e4,
+  "ucircumflex",
+  0x00fb,
+  "ucircumflexbelow",
+  0x1e77,
+  "ucyrillic",
+  0x0443,
+  "udattadeva",
+  0x0951,
+  "udblacute",
+  0x0171,
+  "udblgrave",
+  0x0215,
+  "udeva",
+  0x0909,
+  "udieresis",
+  0x00fc,
+  "udieresisacute",
+  0x01d8,
+  "udieresisbelow",
+  0x1e73,
+  "udieresiscaron",
+  0x01da,
+  "udieresiscyrillic",
+  0x04f1,
+  "udieresisgrave",
+  0x01dc,
+  "udieresismacron",
+  0x01d6,
+  "udotbelow",
+  0x1ee5,
+  "ugrave",
+  0x00f9,
+  "ugujarati",
+  0x0a89,
+  "ugurmukhi",
+  0x0a09,
+  "uhiragana",
+  0x3046,
+  "uhookabove",
+  0x1ee7,
+  "uhorn",
+  0x01b0,
+  "uhornacute",
+  0x1ee9,
+  "uhorndotbelow",
+  0x1ef1,
+  "uhorngrave",
+  0x1eeb,
+  "uhornhookabove",
+  0x1eed,
+  "uhorntilde",
+  0x1eef,
+  "uhungarumlaut",
+  0x0171,
+  "uhungarumlautcyrillic",
+  0x04f3,
+  "uinvertedbreve",
+  0x0217,
+  "ukatakana",
+  0x30a6,
+  "ukatakanahalfwidth",
+  0xff73,
+  "ukcyrillic",
+  0x0479,
+  "ukorean",
+  0x315c,
+  "umacron",
+  0x016b,
+  "umacroncyrillic",
+  0x04ef,
+  "umacrondieresis",
+  0x1e7b,
+  "umatragurmukhi",
+  0x0a41,
+  "umonospace",
+  0xff55,
+  "underscore",
+  0x005f,
+  "underscoredbl",
+  0x2017,
+  "underscoremonospace",
+  0xff3f,
+  "underscorevertical",
+  0xfe33,
+  "underscorewavy",
+  0xfe4f,
+  "union",
+  0x222a,
+  "universal",
+  0x2200,
+  "uogonek",
+  0x0173,
+  "uparen",
+  0x24b0,
+  "upblock",
+  0x2580,
+  "upperdothebrew",
+  0x05c4,
+  "upsilon",
+  0x03c5,
+  "upsilondieresis",
+  0x03cb,
+  "upsilondieresistonos",
+  0x03b0,
+  "upsilonlatin",
+  0x028a,
+  "upsilontonos",
+  0x03cd,
+  "uptackbelowcmb",
+  0x031d,
+  "uptackmod",
+  0x02d4,
+  "uragurmukhi",
+  0x0a73,
+  "uring",
+  0x016f,
+  "ushortcyrillic",
+  0x045e,
+  "usmallhiragana",
+  0x3045,
+  "usmallkatakana",
+  0x30a5,
+  "usmallkatakanahalfwidth",
+  0xff69,
+  "ustraightcyrillic",
+  0x04af,
+  "ustraightstrokecyrillic",
+  0x04b1,
+  "utilde",
+  0x0169,
+  "utildeacute",
+  0x1e79,
+  "utildebelow",
+  0x1e75,
+  "uubengali",
+  0x098a,
+  "uudeva",
+  0x090a,
+  "uugujarati",
+  0x0a8a,
+  "uugurmukhi",
+  0x0a0a,
+  "uumatragurmukhi",
+  0x0a42,
+  "uuvowelsignbengali",
+  0x09c2,
+  "uuvowelsigndeva",
+  0x0942,
+  "uuvowelsigngujarati",
+  0x0ac2,
+  "uvowelsignbengali",
+  0x09c1,
+  "uvowelsigndeva",
+  0x0941,
+  "uvowelsigngujarati",
+  0x0ac1,
+  "v",
+  0x0076,
+  "vadeva",
+  0x0935,
+  "vagujarati",
+  0x0ab5,
+  "vagurmukhi",
+  0x0a35,
+  "vakatakana",
+  0x30f7,
+  "vav",
+  0x05d5,
+  "vavdagesh",
+  0xfb35,
+  "vavdagesh65",
+  0xfb35,
+  "vavdageshhebrew",
+  0xfb35,
+  "vavhebrew",
+  0x05d5,
+  "vavholam",
+  0xfb4b,
+  "vavholamhebrew",
+  0xfb4b,
+  "vavvavhebrew",
+  0x05f0,
+  "vavyodhebrew",
+  0x05f1,
+  "vcircle",
+  0x24e5,
+  "vdotbelow",
+  0x1e7f,
+  "vecyrillic",
+  0x0432,
+  "veharabic",
+  0x06a4,
+  "vehfinalarabic",
+  0xfb6b,
+  "vehinitialarabic",
+  0xfb6c,
+  "vehmedialarabic",
+  0xfb6d,
+  "vekatakana",
+  0x30f9,
+  "venus",
+  0x2640,
+  "verticalbar",
+  0x007c,
+  "verticallineabovecmb",
+  0x030d,
+  "verticallinebelowcmb",
+  0x0329,
+  "verticallinelowmod",
+  0x02cc,
+  "verticallinemod",
+  0x02c8,
+  "vewarmenian",
+  0x057e,
+  "vhook",
+  0x028b,
+  "vikatakana",
+  0x30f8,
+  "viramabengali",
+  0x09cd,
+  "viramadeva",
+  0x094d,
+  "viramagujarati",
+  0x0acd,
+  "visargabengali",
+  0x0983,
+  "visargadeva",
+  0x0903,
+  "visargagujarati",
+  0x0a83,
+  "vmonospace",
+  0xff56,
+  "voarmenian",
+  0x0578,
+  "voicediterationhiragana",
+  0x309e,
+  "voicediterationkatakana",
+  0x30fe,
+  "voicedmarkkana",
+  0x309b,
+  "voicedmarkkanahalfwidth",
+  0xff9e,
+  "vokatakana",
+  0x30fa,
+  "vparen",
+  0x24b1,
+  "vtilde",
+  0x1e7d,
+  "vturned",
+  0x028c,
+  "vuhiragana",
+  0x3094,
+  "vukatakana",
+  0x30f4,
+  "w",
+  0x0077,
+  "wacute",
+  0x1e83,
+  "waekorean",
+  0x3159,
+  "wahiragana",
+  0x308f,
+  "wakatakana",
+  0x30ef,
+  "wakatakanahalfwidth",
+  0xff9c,
+  "wakorean",
+  0x3158,
+  "wasmallhiragana",
+  0x308e,
+  "wasmallkatakana",
+  0x30ee,
+  "wattosquare",
+  0x3357,
+  "wavedash",
+  0x301c,
+  "wavyunderscorevertical",
+  0xfe34,
+  "wawarabic",
+  0x0648,
+  "wawfinalarabic",
+  0xfeee,
+  "wawhamzaabovearabic",
+  0x0624,
+  "wawhamzaabovefinalarabic",
+  0xfe86,
+  "wbsquare",
+  0x33dd,
+  "wcircle",
+  0x24e6,
+  "wcircumflex",
+  0x0175,
+  "wdieresis",
+  0x1e85,
+  "wdotaccent",
+  0x1e87,
+  "wdotbelow",
+  0x1e89,
+  "wehiragana",
+  0x3091,
+  "weierstrass",
+  0x2118,
+  "wekatakana",
+  0x30f1,
+  "wekorean",
+  0x315e,
+  "weokorean",
+  0x315d,
+  "wgrave",
+  0x1e81,
+  "whitebullet",
+  0x25e6,
+  "whitecircle",
+  0x25cb,
+  "whitecircleinverse",
+  0x25d9,
+  "whitecornerbracketleft",
+  0x300e,
+  "whitecornerbracketleftvertical",
+  0xfe43,
+  "whitecornerbracketright",
+  0x300f,
+  "whitecornerbracketrightvertical",
+  0xfe44,
+  "whitediamond",
+  0x25c7,
+  "whitediamondcontainingblacksmalldiamond",
+  0x25c8,
+  "whitedownpointingsmalltriangle",
+  0x25bf,
+  "whitedownpointingtriangle",
+  0x25bd,
+  "whiteleftpointingsmalltriangle",
+  0x25c3,
+  "whiteleftpointingtriangle",
+  0x25c1,
+  "whitelenticularbracketleft",
+  0x3016,
+  "whitelenticularbracketright",
+  0x3017,
+  "whiterightpointingsmalltriangle",
+  0x25b9,
+  "whiterightpointingtriangle",
+  0x25b7,
+  "whitesmallsquare",
+  0x25ab,
+  "whitesmilingface",
+  0x263a,
+  "whitesquare",
+  0x25a1,
+  "whitestar",
+  0x2606,
+  "whitetelephone",
+  0x260f,
+  "whitetortoiseshellbracketleft",
+  0x3018,
+  "whitetortoiseshellbracketright",
+  0x3019,
+  "whiteuppointingsmalltriangle",
+  0x25b5,
+  "whiteuppointingtriangle",
+  0x25b3,
+  "wihiragana",
+  0x3090,
+  "wikatakana",
+  0x30f0,
+  "wikorean",
+  0x315f,
+  "wmonospace",
+  0xff57,
+  "wohiragana",
+  0x3092,
+  "wokatakana",
+  0x30f2,
+  "wokatakanahalfwidth",
+  0xff66,
+  "won",
+  0x20a9,
+  "wonmonospace",
+  0xffe6,
+  "wowaenthai",
+  0x0e27,
+  "wparen",
+  0x24b2,
+  "wring",
+  0x1e98,
+  "wsuperior",
+  0x02b7,
+  "wturned",
+  0x028d,
+  "wynn",
+  0x01bf,
+  "x",
+  0x0078,
+  "xabovecmb",
+  0x033d,
+  "xbopomofo",
+  0x3112,
+  "xcircle",
+  0x24e7,
+  "xdieresis",
+  0x1e8d,
+  "xdotaccent",
+  0x1e8b,
+  "xeharmenian",
+  0x056d,
+  "xi",
+  0x03be,
+  "xmonospace",
+  0xff58,
+  "xparen",
+  0x24b3,
+  "xsuperior",
+  0x02e3,
+  "y",
+  0x0079,
+  "yaadosquare",
+  0x334e,
+  "yabengali",
+  0x09af,
+  "yacute",
+  0x00fd,
+  "yadeva",
+  0x092f,
+  "yaekorean",
+  0x3152,
+  "yagujarati",
+  0x0aaf,
+  "yagurmukhi",
+  0x0a2f,
+  "yahiragana",
+  0x3084,
+  "yakatakana",
+  0x30e4,
+  "yakatakanahalfwidth",
+  0xff94,
+  "yakorean",
+  0x3151,
+  "yamakkanthai",
+  0x0e4e,
+  "yasmallhiragana",
+  0x3083,
+  "yasmallkatakana",
+  0x30e3,
+  "yasmallkatakanahalfwidth",
+  0xff6c,
+  "yatcyrillic",
+  0x0463,
+  "ycircle",
+  0x24e8,
+  "ycircumflex",
+  0x0177,
+  "ydieresis",
+  0x00ff,
+  "ydotaccent",
+  0x1e8f,
+  "ydotbelow",
+  0x1ef5,
+  "yeharabic",
+  0x064a,
+  "yehbarreearabic",
+  0x06d2,
+  "yehbarreefinalarabic",
+  0xfbaf,
+  "yehfinalarabic",
+  0xfef2,
+  "yehhamzaabovearabic",
+  0x0626,
+  "yehhamzaabovefinalarabic",
+  0xfe8a,
+  "yehhamzaaboveinitialarabic",
+  0xfe8b,
+  "yehhamzaabovemedialarabic",
+  0xfe8c,
+  "yehinitialarabic",
+  0xfef3,
+  "yehmedialarabic",
+  0xfef4,
+  "yehmeeminitialarabic",
+  0xfcdd,
+  "yehmeemisolatedarabic",
+  0xfc58,
+  "yehnoonfinalarabic",
+  0xfc94,
+  "yehthreedotsbelowarabic",
+  0x06d1,
+  "yekorean",
+  0x3156,
+  "yen",
+  0x00a5,
+  "yenmonospace",
+  0xffe5,
+  "yeokorean",
+  0x3155,
+  "yeorinhieuhkorean",
+  0x3186,
+  "yerahbenyomohebrew",
+  0x05aa,
+  "yerahbenyomolefthebrew",
+  0x05aa,
+  "yericyrillic",
+  0x044b,
+  "yerudieresiscyrillic",
+  0x04f9,
+  "yesieungkorean",
+  0x3181,
+  "yesieungpansioskorean",
+  0x3183,
+  "yesieungsioskorean",
+  0x3182,
+  "yetivhebrew",
+  0x059a,
+  "ygrave",
+  0x1ef3,
+  "yhook",
+  0x01b4,
+  "yhookabove",
+  0x1ef7,
+  "yiarmenian",
+  0x0575,
+  "yicyrillic",
+  0x0457,
+  "yikorean",
+  0x3162,
+  "yinyang",
+  0x262f,
+  "yiwnarmenian",
+  0x0582,
+  "ymonospace",
+  0xff59,
+  "yod",
+  0x05d9,
+  "yoddagesh",
+  0xfb39,
+  "yoddageshhebrew",
+  0xfb39,
+  "yodhebrew",
+  0x05d9,
+  "yodyodhebrew",
+  0x05f2,
+  "yodyodpatahhebrew",
+  0xfb1f,
+  "yohiragana",
+  0x3088,
+  "yoikorean",
+  0x3189,
+  "yokatakana",
+  0x30e8,
+  "yokatakanahalfwidth",
+  0xff96,
+  "yokorean",
+  0x315b,
+  "yosmallhiragana",
+  0x3087,
+  "yosmallkatakana",
+  0x30e7,
+  "yosmallkatakanahalfwidth",
+  0xff6e,
+  "yotgreek",
+  0x03f3,
+  "yoyaekorean",
+  0x3188,
+  "yoyakorean",
+  0x3187,
+  "yoyakthai",
+  0x0e22,
+  "yoyingthai",
+  0x0e0d,
+  "yparen",
+  0x24b4,
+  "ypogegrammeni",
+  0x037a,
+  "ypogegrammenigreekcmb",
+  0x0345,
+  "yr",
+  0x01a6,
+  "yring",
+  0x1e99,
+  "ysuperior",
+  0x02b8,
+  "ytilde",
+  0x1ef9,
+  "yturned",
+  0x028e,
+  "yuhiragana",
+  0x3086,
+  "yuikorean",
+  0x318c,
+  "yukatakana",
+  0x30e6,
+  "yukatakanahalfwidth",
+  0xff95,
+  "yukorean",
+  0x3160,
+  "yusbigcyrillic",
+  0x046b,
+  "yusbigiotifiedcyrillic",
+  0x046d,
+  "yuslittlecyrillic",
+  0x0467,
+  "yuslittleiotifiedcyrillic",
+  0x0469,
+  "yusmallhiragana",
+  0x3085,
+  "yusmallkatakana",
+  0x30e5,
+  "yusmallkatakanahalfwidth",
+  0xff6d,
+  "yuyekorean",
+  0x318b,
+  "yuyeokorean",
+  0x318a,
+  "yyabengali",
+  0x09df,
+  "yyadeva",
+  0x095f,
+  "z",
+  0x007a,
+  "zaarmenian",
+  0x0566,
+  "zacute",
+  0x017a,
+  "zadeva",
+  0x095b,
+  "zagurmukhi",
+  0x0a5b,
+  "zaharabic",
+  0x0638,
+  "zahfinalarabic",
+  0xfec6,
+  "zahinitialarabic",
+  0xfec7,
+  "zahiragana",
+  0x3056,
+  "zahmedialarabic",
+  0xfec8,
+  "zainarabic",
+  0x0632,
+  "zainfinalarabic",
+  0xfeb0,
+  "zakatakana",
+  0x30b6,
+  "zaqefgadolhebrew",
+  0x0595,
+  "zaqefqatanhebrew",
+  0x0594,
+  "zarqahebrew",
+  0x0598,
+  "zayin",
+  0x05d6,
+  "zayindagesh",
+  0xfb36,
+  "zayindageshhebrew",
+  0xfb36,
+  "zayinhebrew",
+  0x05d6,
+  "zbopomofo",
+  0x3117,
+  "zcaron",
+  0x017e,
+  "zcircle",
+  0x24e9,
+  "zcircumflex",
+  0x1e91,
+  "zcurl",
+  0x0291,
+  "zdot",
+  0x017c,
+  "zdotaccent",
+  0x017c,
+  "zdotbelow",
+  0x1e93,
+  "zecyrillic",
+  0x0437,
+  "zedescendercyrillic",
+  0x0499,
+  "zedieresiscyrillic",
+  0x04df,
+  "zehiragana",
+  0x305c,
+  "zekatakana",
+  0x30bc,
+  "zero",
+  0x0030,
+  "zeroarabic",
+  0x0660,
+  "zerobengali",
+  0x09e6,
+  "zerodeva",
+  0x0966,
+  "zerogujarati",
+  0x0ae6,
+  "zerogurmukhi",
+  0x0a66,
+  "zerohackarabic",
+  0x0660,
+  "zeroinferior",
+  0x2080,
+  "zeromonospace",
+  0xff10,
+  "zerooldstyle",
+  0xf730,
+  "zeropersian",
+  0x06f0,
+  "zerosuperior",
+  0x2070,
+  "zerothai",
+  0x0e50,
+  "zerowidthjoiner",
+  0xfeff,
+  "zerowidthnonjoiner",
+  0x200c,
+  "zerowidthspace",
+  0x200b,
+  "zeta",
+  0x03b6,
+  "zhbopomofo",
+  0x3113,
+  "zhearmenian",
+  0x056a,
+  "zhebrevecyrillic",
+  0x04c2,
+  "zhecyrillic",
+  0x0436,
+  "zhedescendercyrillic",
+  0x0497,
+  "zhedieresiscyrillic",
+  0x04dd,
+  "zihiragana",
+  0x3058,
+  "zikatakana",
+  0x30b8,
+  "zinorhebrew",
+  0x05ae,
+  "zlinebelow",
+  0x1e95,
+  "zmonospace",
+  0xff5a,
+  "zohiragana",
+  0x305e,
+  "zokatakana",
+  0x30be,
+  "zparen",
+  0x24b5,
+  "zretroflexhook",
+  0x0290,
+  "zstroke",
+  0x01b6,
+  "zuhiragana",
+  0x305a,
+  "zukatakana",
+  0x30ba,
+  ".notdef",
+  0x0000,
+  "angbracketleftbig",
+  0x2329,
+  "angbracketleftBig",
+  0x2329,
+  "angbracketleftbigg",
+  0x2329,
+  "angbracketleftBigg",
+  0x2329,
+  "angbracketrightBig",
+  0x232a,
+  "angbracketrightbig",
+  0x232a,
+  "angbracketrightBigg",
+  0x232a,
+  "angbracketrightbigg",
+  0x232a,
+  "arrowhookleft",
+  0x21aa,
+  "arrowhookright",
+  0x21a9,
+  "arrowlefttophalf",
+  0x21bc,
+  "arrowleftbothalf",
+  0x21bd,
+  "arrownortheast",
+  0x2197,
+  "arrownorthwest",
+  0x2196,
+  "arrowrighttophalf",
+  0x21c0,
+  "arrowrightbothalf",
+  0x21c1,
+  "arrowsoutheast",
+  0x2198,
+  "arrowsouthwest",
+  0x2199,
+  "backslashbig",
+  0x2216,
+  "backslashBig",
+  0x2216,
+  "backslashBigg",
+  0x2216,
+  "backslashbigg",
+  0x2216,
+  "bardbl",
+  0x2016,
+  "bracehtipdownleft",
+  0xfe37,
+  "bracehtipdownright",
+  0xfe37,
+  "bracehtipupleft",
+  0xfe38,
+  "bracehtipupright",
+  0xfe38,
+  "braceleftBig",
+  0x007b,
+  "braceleftbig",
+  0x007b,
+  "braceleftbigg",
+  0x007b,
+  "braceleftBigg",
+  0x007b,
+  "bracerightBig",
+  0x007d,
+  "bracerightbig",
+  0x007d,
+  "bracerightbigg",
+  0x007d,
+  "bracerightBigg",
+  0x007d,
+  "bracketleftbig",
+  0x005b,
+  "bracketleftBig",
+  0x005b,
+  "bracketleftbigg",
+  0x005b,
+  "bracketleftBigg",
+  0x005b,
+  "bracketrightBig",
+  0x005d,
+  "bracketrightbig",
+  0x005d,
+  "bracketrightbigg",
+  0x005d,
+  "bracketrightBigg",
+  0x005d,
+  "ceilingleftbig",
+  0x2308,
+  "ceilingleftBig",
+  0x2308,
+  "ceilingleftBigg",
+  0x2308,
+  "ceilingleftbigg",
+  0x2308,
+  "ceilingrightbig",
+  0x2309,
+  "ceilingrightBig",
+  0x2309,
+  "ceilingrightbigg",
+  0x2309,
+  "ceilingrightBigg",
+  0x2309,
+  "circledotdisplay",
+  0x2299,
+  "circledottext",
+  0x2299,
+  "circlemultiplydisplay",
+  0x2297,
+  "circlemultiplytext",
+  0x2297,
+  "circleplusdisplay",
+  0x2295,
+  "circleplustext",
+  0x2295,
+  "contintegraldisplay",
+  0x222e,
+  "contintegraltext",
+  0x222e,
+  "coproductdisplay",
+  0x2210,
+  "coproducttext",
+  0x2210,
+  "floorleftBig",
+  0x230a,
+  "floorleftbig",
+  0x230a,
+  "floorleftbigg",
+  0x230a,
+  "floorleftBigg",
+  0x230a,
+  "floorrightbig",
+  0x230b,
+  "floorrightBig",
+  0x230b,
+  "floorrightBigg",
+  0x230b,
+  "floorrightbigg",
+  0x230b,
+  "hatwide",
+  0x0302,
+  "hatwider",
+  0x0302,
+  "hatwidest",
+  0x0302,
+  "intercal",
+  0x1d40,
+  "integraldisplay",
+  0x222b,
+  "integraltext",
+  0x222b,
+  "intersectiondisplay",
+  0x22c2,
+  "intersectiontext",
+  0x22c2,
+  "logicalanddisplay",
+  0x2227,
+  "logicalandtext",
+  0x2227,
+  "logicalordisplay",
+  0x2228,
+  "logicalortext",
+  0x2228,
+  "parenleftBig",
+  0x0028,
+  "parenleftbig",
+  0x0028,
+  "parenleftBigg",
+  0x0028,
+  "parenleftbigg",
+  0x0028,
+  "parenrightBig",
+  0x0029,
+  "parenrightbig",
+  0x0029,
+  "parenrightBigg",
+  0x0029,
+  "parenrightbigg",
+  0x0029,
+  "prime",
+  0x2032,
+  "productdisplay",
+  0x220f,
+  "producttext",
+  0x220f,
+  "radicalbig",
+  0x221a,
+  "radicalBig",
+  0x221a,
+  "radicalBigg",
+  0x221a,
+  "radicalbigg",
+  0x221a,
+  "radicalbt",
+  0x221a,
+  "radicaltp",
+  0x221a,
+  "radicalvertex",
+  0x221a,
+  "slashbig",
+  0x002f,
+  "slashBig",
+  0x002f,
+  "slashBigg",
+  0x002f,
+  "slashbigg",
+  0x002f,
+  "summationdisplay",
+  0x2211,
+  "summationtext",
+  0x2211,
+  "tildewide",
+  0x02dc,
+  "tildewider",
+  0x02dc,
+  "tildewidest",
+  0x02dc,
+  "uniondisplay",
+  0x22c3,
+  "unionmultidisplay",
+  0x228e,
+  "unionmultitext",
+  0x228e,
+  "unionsqdisplay",
+  0x2294,
+  "unionsqtext",
+  0x2294,
+  "uniontext",
+  0x22c3,
+  "vextenddouble",
+  0x2225,
+  "vextendsingle",
+  0x2223
+ ];
+});
+const getDingbatsGlyphsUnicode = 
(0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () {
+ return [
+  "space",
+  0x0020,
+  "a1",
+  0x2701,
+  "a2",
+  0x2702,
+  "a202",
+  0x2703,
+  "a3",
+  0x2704,
+  "a4",
+  0x260e,
+  "a5",
+  0x2706,
+  "a119",
+  0x2707,
+  "a118",
+  0x2708,
+  "a117",
+  0x2709,
+  "a11",
+  0x261b,
+  "a12",
+  0x261e,
+  "a13",
+  0x270c,
+  "a14",
+  0x270d,
+  "a15",
+  0x270e,
+  "a16",
+  0x270f,
+  "a105",
+  0x2710,
+  "a17",
+  0x2711,
+  "a18",
+  0x2712,
+  "a19",
+  0x2713,
+  "a20",
+  0x2714,
+  "a21",
+  0x2715,
+  "a22",
+  0x2716,
+  "a23",
+  0x2717,
+  "a24",
+  0x2718,
+  "a25",
+  0x2719,
+  "a26",
+  0x271a,
+  "a27",
+  0x271b,
+  "a28",
+  0x271c,
+  "a6",
+  0x271d,
+  "a7",
+  0x271e,
+  "a8",
+  0x271f,
+  "a9",
+  0x2720,
+  "a10",
+  0x2721,
+  "a29",
+  0x2722,
+  "a30",
+  0x2723,
+  "a31",
+  0x2724,
+  "a32",
+  0x2725,
+  "a33",
+  0x2726,
+  "a34",
+  0x2727,
+  "a35",
+  0x2605,
+  "a36",
+  0x2729,
+  "a37",
+  0x272a,
+  "a38",
+  0x272b,
+  "a39",
+  0x272c,
+  "a40",
+  0x272d,
+  "a41",
+  0x272e,
+  "a42",
+  0x272f,
+  "a43",
+  0x2730,
+  "a44",
+  0x2731,
+  "a45",
+  0x2732,
+  "a46",
+  0x2733,
+  "a47",
+  0x2734,
+  "a48",
+  0x2735,
+  "a49",
+  0x2736,
+  "a50",
+  0x2737,
+  "a51",
+  0x2738,
+  "a52",
+  0x2739,
+  "a53",
+  0x273a,
+  "a54",
+  0x273b,
+  "a55",
+  0x273c,
+  "a56",
+  0x273d,
+  "a57",
+  0x273e,
+  "a58",
+  0x273f,
+  "a59",
+  0x2740,
+  "a60",
+  0x2741,
+  "a61",
+  0x2742,
+  "a62",
+  0x2743,
+  "a63",
+  0x2744,
+  "a64",
+  0x2745,
+  "a65",
+  0x2746,
+  "a66",
+  0x2747,
+  "a67",
+  0x2748,
+  "a68",
+  0x2749,
+  "a69",
+  0x274a,
+  "a70",
+  0x274b,
+  "a71",
+  0x25cf,
+  "a72",
+  0x274d,
+  "a73",
+  0x25a0,
+  "a74",
+  0x274f,
+  "a203",
+  0x2750,
+  "a75",
+  0x2751,
+  "a204",
+  0x2752,
+  "a76",
+  0x25b2,
+  "a77",
+  0x25bc,
+  "a78",
+  0x25c6,
+  "a79",
+  0x2756,
+  "a81",
+  0x25d7,
+  "a82",
+  0x2758,
+  "a83",
+  0x2759,
+  "a84",
+  0x275a,
+  "a97",
+  0x275b,
+  "a98",
+  0x275c,
+  "a99",
+  0x275d,
+  "a100",
+  0x275e,
+  "a101",
+  0x2761,
+  "a102",
+  0x2762,
+  "a103",
+  0x2763,
+  "a104",
+  0x2764,
+  "a106",
+  0x2765,
+  "a107",
+  0x2766,
+  "a108",
+  0x2767,
+  "a112",
+  0x2663,
+  "a111",
+  0x2666,
+  "a110",
+  0x2665,
+  "a109",
+  0x2660,
+  "a120",
+  0x2460,
+  "a121",
+  0x2461,
+  "a122",
+  0x2462,
+  "a123",
+  0x2463,
+  "a124",
+  0x2464,
+  "a125",
+  0x2465,
+  "a126",
+  0x2466,
+  "a127",
+  0x2467,
+  "a128",
+  0x2468,
+  "a129",
+  0x2469,
+  "a130",
+  0x2776,
+  "a131",
+  0x2777,
+  "a132",
+  0x2778,
+  "a133",
+  0x2779,
+  "a134",
+  0x277a,
+  "a135",
+  0x277b,
+  "a136",
+  0x277c,
+  "a137",
+  0x277d,
+  "a138",
+  0x277e,
+  "a139",
+  0x277f,
+  "a140",
+  0x2780,
+  "a141",
+  0x2781,
+  "a142",
+  0x2782,
+  "a143",
+  0x2783,
+  "a144",
+  0x2784,
+  "a145",
+  0x2785,
+  "a146",
+  0x2786,
+  "a147",
+  0x2787,
+  "a148",
+  0x2788,
+  "a149",
+  0x2789,
+  "a150",
+  0x278a,
+  "a151",
+  0x278b,
+  "a152",
+  0x278c,
+  "a153",
+  0x278d,
+  "a154",
+  0x278e,
+  "a155",
+  0x278f,
+  "a156",
+  0x2790,
+  "a157",
+  0x2791,
+  "a158",
+  0x2792,
+  "a159",
+  0x2793,
+  "a160",
+  0x2794,
+  "a161",
+  0x2192,
+  "a163",
+  0x2194,
+  "a164",
+  0x2195,
+  "a196",
+  0x2798,
+  "a165",
+  0x2799,
+  "a192",
+  0x279a,
+  "a166",
+  0x279b,
+  "a167",
+  0x279c,
+  "a168",
+  0x279d,
+  "a169",
+  0x279e,
+  "a170",
+  0x279f,
+  "a171",
+  0x27a0,
+  "a172",
+  0x27a1,
+  "a173",
+  0x27a2,
+  "a162",
+  0x27a3,
+  "a174",
+  0x27a4,
+  "a175",
+  0x27a5,
+  "a176",
+  0x27a6,
+  "a177",
+  0x27a7,
+  "a178",
+  0x27a8,
+  "a179",
+  0x27a9,
+  "a193",
+  0x27aa,
+  "a180",
+  0x27ab,
+  "a199",
+  0x27ac,
+  "a181",
+  0x27ad,
+  "a200",
+  0x27ae,
+  "a182",
+  0x27af,
+  "a201",
+  0x27b1,
+  "a183",
+  0x27b2,
+  "a184",
+  0x27b3,
+  "a197",
+  0x27b4,
+  "a185",
+  0x27b5,
+  "a194",
+  0x27b6,
+  "a198",
+  0x27b7,
+  "a186",
+  0x27b8,
+  "a195",
+  0x27b9,
+  "a187",
+  0x27ba,
+  "a188",
+  0x27bb,
+  "a189",
+  0x27bc,
+  "a190",
+  0x27bd,
+  "a191",
+  0x27be,
+  "a89",
+  0x2768,
+  "a90",
+  0x2769,
+  "a93",
+  0x276a,
+  "a94",
+  0x276b,
+  "a91",
+  0x276c,
+  "a92",
+  0x276d,
+  "a205",
+  0x276e,
+  "a85",
+  0x276f,
+  "a206",
+  0x2770,
+  "a86",
+  0x2771,
+  "a87",
+  0x2772,
+  "a88",
+  0x2773,
+  "a95",
+  0x2774,
+  "a96",
+  0x2775,
+  ".notdef",
+  0x0000
+ ];
+});
 
-        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
-          if (j > maxFunctionDefs) {
-            (0, _util.warn)("TT: invalid function id: " + j);
-            ttContext.hintsValid = false;
-            return;
-          }
 
-          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
-            (0, _util.warn)("TT: undefined function: " + j);
-            ttContext.hintsValid = false;
-            return;
-          }
-        }
-      }
-
-      function foldTTTable(table, content) {
-        if (content.length > 1) {
-          var newLength = 0;
-          var j, jj;
-
-          for (j = 0, jj = content.length; j < jj; j++) {
-            newLength += content[j].length;
-          }
-
-          newLength = newLength + 3 & ~3;
-          var result = new Uint8Array(newLength);
-          var pos = 0;
-
-          for (j = 0, jj = content.length; j < jj; j++) {
-            result.set(content[j], pos);
-            pos += content[j].length;
-          }
-
-          table.data = result;
-          table.length = newLength;
-        }
-      }
-
-      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
-        var ttContext = {
-          functionsDefined: [],
-          functionsUsed: [],
-          functionsStackDeltas: [],
-          tooComplexToFollowFunctions: false,
-          hintsValid: true
-        };
-
-        if (fpgm) {
-          sanitizeTTProgram(fpgm, ttContext);
-        }
-
-        if (prep) {
-          sanitizeTTProgram(prep, ttContext);
-        }
-
-        if (fpgm) {
-          checkInvalidFunctions(ttContext, maxFunctionDefs);
-        }
-
-        if (cvt && cvt.length & 1) {
-          var cvtData = new Uint8Array(cvt.length + 1);
-          cvtData.set(cvt.data);
-          cvt.data = cvtData;
-        }
-
-        return ttContext.hintsValid;
-      }
-
-      font = new _stream.Stream(new Uint8Array(font.getBytes()));
-      let header, tables;
-
-      if (isTrueTypeCollectionFile(font)) {
-        const ttcData = readTrueTypeCollectionData(font, this.name);
-        header = ttcData.header;
-        tables = ttcData.tables;
-      } else {
-        header = readOpenTypeHeader(font);
-        tables = readTables(font, header.numTables);
-      }
-
-      let cff, cffFile;
-      var isTrueType = !tables["CFF "];
-
-      if (!isTrueType) {
-        const isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || 
!(properties.cMap instanceof _cmap.IdentityCMap));
-
-        if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || 
!tables.post) {
-          cffFile = new _stream.Stream(tables["CFF "].data);
-          cff = new CFFFont(cffFile, properties);
-          adjustWidths(properties);
-          return this.convert(name, cff, properties);
-        }
-
-        delete tables.glyf;
-        delete tables.loca;
-        delete tables.fpgm;
-        delete tables.prep;
-        delete tables["cvt "];
-        this.isOpenType = true;
-      } else {
-        if (!tables.loca) {
-          throw new _util.FormatError('Required "loca" table is not found');
-        }
-
-        if (!tables.glyf) {
-          (0, _util.warn)('Required "glyf" table is not found -- trying to recover.');
-          tables.glyf = {
-            tag: "glyf",
-            data: new Uint8Array(0)
-          };
-        }
-
-        this.isOpenType = false;
-      }
-
-      if (!tables.maxp) {
-        throw new _util.FormatError('Required "maxp" table is not found');
-      }
-
-      font.pos = (font.start || 0) + tables.maxp.offset;
-      var version = font.getInt32();
-      const numGlyphs = font.getUint16();
-      let numGlyphsOut = numGlyphs + 1;
-      let dupFirstEntry = true;
-
-      if (numGlyphsOut > 0xffff) {
-        dupFirstEntry = false;
-        numGlyphsOut = numGlyphs;
-        (0, _util.warn)("Not enough space in glyfs to duplicate first glyph.");
-      }
-
-      var maxFunctionDefs = 0;
-      var maxSizeOfInstructions = 0;
-
-      if (version >= 0x00010000 && tables.maxp.length >= 22) {
-        font.pos += 8;
-        var maxZones = font.getUint16();
-
-        if (maxZones > 2) {
-          tables.maxp.data[14] = 0;
-          tables.maxp.data[15] = 2;
-        }
-
-        font.pos += 4;
-        maxFunctionDefs = font.getUint16();
-        font.pos += 4;
-        maxSizeOfInstructions = font.getUint16();
-      }
-
-      tables.maxp.data[4] = numGlyphsOut >> 8;
-      tables.maxp.data[5] = numGlyphsOut & 255;
-      var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs);
-
-      if (!hintsValid) {
-        delete tables.fpgm;
-        delete tables.prep;
-        delete tables["cvt "];
-      }
-
-      sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphsOut, dupFirstEntry);
-
-      if (!tables.head) {
-        throw new _util.FormatError('Required "head" table is not found');
-      }
-
-      sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
-      var missingGlyphs = Object.create(null);
-
-      if (isTrueType) {
-        var isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
-        var glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, 
hintsValid, dupFirstEntry, maxSizeOfInstructions);
-        missingGlyphs = glyphsInfo.missingGlyphs;
-
-        if (version >= 0x00010000 && tables.maxp.length >= 22) {
-          tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
-          tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;
-        }
-      }
-
-      if (!tables.hhea) {
-        throw new _util.FormatError('Required "hhea" table is not found');
-      }
-
-      if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
-        tables.hhea.data[10] = 0xff;
-        tables.hhea.data[11] = 0xff;
-      }
-
-      var metricsOverride = {
-        unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
-        yMax: int16(tables.head.data[42], tables.head.data[43]),
-        yMin: signedInt16(tables.head.data[38], tables.head.data[39]),
-        ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),
-        descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7])
-      };
-      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
-      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;
-
-      if (tables.post) {
-        readPostScriptTable(tables.post, properties, numGlyphs);
-      }
-
-      tables.post = {
-        tag: "post",
-        data: createPostTable(properties)
-      };
-      const charCodeToGlyphId = [];
-
-      function hasGlyph(glyphId) {
-        return !missingGlyphs[glyphId];
-      }
-
-      if (properties.composite) {
-        var cidToGidMap = properties.cidToGidMap || [];
-        var isCidToGidMapEmpty = cidToGidMap.length === 0;
-        properties.cMap.forEach(function (charCode, cid) {
-          if (cid > 0xffff) {
-            throw new _util.FormatError("Max size of CID is 65,535");
-          }
-
-          var glyphId = -1;
-
-          if (isCidToGidMapEmpty) {
-            glyphId = cid;
-          } else if (cidToGidMap[cid] !== undefined) {
-            glyphId = cidToGidMap[cid];
-          }
-
-          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
-            charCodeToGlyphId[charCode] = glyphId;
-          }
-        });
-      } else {
-        var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding);
-        var cmapPlatformId = cmapTable.platformId;
-        var cmapEncodingId = cmapTable.encodingId;
-        var cmapMappings = cmapTable.mappings;
-        var cmapMappingsLength = cmapMappings.length;
-        let baseEncoding = [];
-
-        if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || 
properties.baseEncodingName === "WinAnsiEncoding")) {
-          baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
-        }
-
-        if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 
|| cmapPlatformId === 1 && cmapEncodingId === 0)) {
-          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
-
-          for (let charCode = 0; charCode < 256; charCode++) {
-            var glyphName, standardGlyphName;
-
-            if (this.differences && charCode in this.differences) {
-              glyphName = this.differences[charCode];
-            } else if (charCode in baseEncoding && baseEncoding[charCode] !== "") {
-              glyphName = baseEncoding[charCode];
-            } else {
-              glyphName = _encodings.StandardEncoding[charCode];
-            }
-
-            if (!glyphName) {
-              continue;
-            }
-
-            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
-            var unicodeOrCharCode;
-
-            if (cmapPlatformId === 3 && cmapEncodingId === 1) {
-              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
-            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
-              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);
-            }
-
-            for (let i = 0; i < cmapMappingsLength; ++i) {
-              if (cmapMappings[i].charCode !== unicodeOrCharCode) {
-                continue;
-              }
-
-              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
-              break;
-            }
-          }
-        } else if (cmapPlatformId === 0) {
-          for (let i = 0; i < cmapMappingsLength; ++i) {
-            charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId;
-          }
-        } else {
-          for (let i = 0; i < cmapMappingsLength; ++i) {
-            let charCode = cmapMappings[i].charCode;
-
-            if (cmapPlatformId === 3 && charCode >= 0xf000 && charCode <= 0xf0ff) {
-              charCode &= 0xff;
-            }
-
-            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
-          }
-        }
-
-        if (properties.glyphNames && baseEncoding.length) {
-          for (let i = 0; i < 256; ++i) {
-            if (charCodeToGlyphId[i] === undefined && baseEncoding[i]) {
-              glyphName = baseEncoding[i];
-              const glyphId = properties.glyphNames.indexOf(glyphName);
-
-              if (glyphId > 0 && hasGlyph(glyphId)) {
-                charCodeToGlyphId[i] = glyphId;
-              }
-            }
-          }
-        }
-      }
-
-      if (charCodeToGlyphId.length === 0) {
-        charCodeToGlyphId[0] = 0;
-      }
-
-      let glyphZeroId = numGlyphsOut - 1;
-
-      if (!dupFirstEntry) {
-        glyphZeroId = 0;
-      }
-
-      var newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);
-      this.toFontChar = newMapping.toFontChar;
-      tables.cmap = {
-        tag: "cmap",
-        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut)
-      };
-
-      if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) {
-        tables["OS/2"] = {
-          tag: "OS/2",
-          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
-        };
-      }
-
-      if (!isTrueType) {
-        try {
-          cffFile = new _stream.Stream(tables["CFF "].data);
-          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);
-          cff = parser.parse();
-          cff.duplicateFirstGlyph();
-          var compiler = new _cff_parser.CFFCompiler(cff);
-          tables["CFF "].data = compiler.compile();
-        } catch (e) {
-          (0, _util.warn)("Failed to compile font " + properties.loadedName);
-        }
-      }
-
-      if (!tables.name) {
-        tables.name = {
-          tag: "name",
-          data: createNameTable(this.name)
-        };
-      } else {
-        var namePrototype = readNameTable(tables.name);
-        tables.name.data = createNameTable(name, namePrototype);
-      }
-
-      var builder = new OpenTypeFileBuilder(header.version);
-
-      for (var tableTag in tables) {
-        builder.addTable(tableTag, tables[tableTag].data);
-      }
-
-      return builder.toArray();
-    },
-    convert: function Font_convert(fontName, font, properties) {
-      properties.fixedPitch = false;
-
-      if (properties.builtInEncoding) {
-        adjustToUnicode(properties, properties.builtInEncoding);
-      }
-
-      let glyphZeroId = 1;
-
-      if (font instanceof CFFFont) {
-        glyphZeroId = font.numGlyphs - 1;
-      }
-
-      var mapping = font.getGlyphMapping(properties);
-      var newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId);
-      this.toFontChar = newMapping.toFontChar;
-      var numGlyphs = font.numGlyphs;
-
-      function getCharCodes(charCodeToGlyphId, glyphId) {
-        var charCodes = null;
-
-        for (var charCode in charCodeToGlyphId) {
-          if (glyphId === charCodeToGlyphId[charCode]) {
-            if (!charCodes) {
-              charCodes = [];
-            }
-
-            charCodes.push(charCode | 0);
-          }
-        }
-
-        return charCodes;
-      }
-
-      function createCharCode(charCodeToGlyphId, glyphId) {
-        for (var charCode in charCodeToGlyphId) {
-          if (glyphId === charCodeToGlyphId[charCode]) {
-            return charCode | 0;
-          }
-        }
-
-        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
-        return newMapping.nextAvailableFontCharCode++;
-      }
-
-      var seacs = font.seacs;
-
-      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
-        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;
-        var charset = font.getCharset();
-        var seacMap = Object.create(null);
-
-        for (var glyphId in seacs) {
-          glyphId |= 0;
-          var seac = seacs[glyphId];
-          var baseGlyphName = _encodings.StandardEncoding[seac[2]];
-          var accentGlyphName = _encodings.StandardEncoding[seac[3]];
-          var baseGlyphId = charset.indexOf(baseGlyphName);
-          var accentGlyphId = charset.indexOf(accentGlyphName);
-
-          if (baseGlyphId < 0 || accentGlyphId < 0) {
-            continue;
-          }
-
-          var accentOffset = {
-            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
-            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
-          };
-          var charCodes = getCharCodes(mapping, glyphId);
-
-          if (!charCodes) {
-            continue;
-          }
-
-          for (let i = 0, ii = charCodes.length; i < ii; i++) {
-            var charCode = charCodes[i];
-            var charCodeToGlyphId = newMapping.charCodeToGlyphId;
-            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
-            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
-            seacMap[charCode] = {
-              baseFontCharCode,
-              accentFontCharCode,
-              accentOffset
-            };
-          }
-        }
-
-        properties.seacMap = seacMap;
-      }
-
-      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
-      var builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F");
-      builder.addTable("CFF ", font.data);
-      builder.addTable("OS/2", createOS2Table(properties, newMapping.charCodeToGlyphId));
-      builder.addTable("cmap", createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));
-      builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + 
"\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + 
"\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + 
safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + 
"\x00\x00" + "\x00\x00");
-      builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + 
safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + 
safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + 
"\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs));
-      builder.addTable("hmtx", function fontFieldsHmtx() {
-        var charstrings = font.charstrings;
-        var cffWidths = font.cff ? font.cff.widths : null;
-        var hmtx = "\x00\x00\x00\x00";
-
-        for (let i = 1, ii = numGlyphs; i < ii; i++) {
-          var width = 0;
-
-          if (charstrings) {
-            var charstring = charstrings[i - 1];
-            width = "width" in charstring ? charstring.width : 0;
-          } else if (cffWidths) {
-            width = Math.ceil(cffWidths[i] || 0);
-          }
-
-          hmtx += string16(width) + string16(0);
-        }
-
-        return hmtx;
-      }());
-      builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs));
-      builder.addTable("name", createNameTable(fontName));
-      builder.addTable("post", createPostTable(properties));
-      return builder.toArray();
-    },
-
-    get spaceWidth() {
-      var possibleSpaceReplacements = ["space", "minus", "one", "i", "I"];
-      var width;
-
-      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
-        var glyphName = possibleSpaceReplacements[i];
-
-        if (glyphName in this.widths) {
-          width = this.widths[glyphName];
-          break;
-        }
-
-        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
-        var glyphUnicode = glyphsUnicodeMap[glyphName];
-        var charcode = 0;
-
-        if (this.composite && this.cMap.contains(glyphUnicode)) {
-          charcode = this.cMap.lookup(glyphUnicode);
-        }
-
-        if (!charcode && this.toUnicode) {
-          charcode = this.toUnicode.charCodeOf(glyphUnicode);
-        }
-
-        if (charcode <= 0) {
-          charcode = glyphUnicode;
-        }
-
-        width = this.widths[charcode];
-
-        if (width) {
-          break;
-        }
-      }
-
-      width = width || this.defaultWidth;
-      return (0, _util.shadow)(this, "spaceWidth", width);
-    },
-
-    charToGlyph: function Font_charToGlyph(charcode, isSpace) {
-      var fontCharCode, width, operatorListId;
-      var widthCode = charcode;
-
-      if (this.cMap && this.cMap.contains(charcode)) {
-        widthCode = this.cMap.lookup(charcode);
-      }
-
-      width = this.widths[widthCode];
-      width = (0, _util.isNum)(width) ? width : this.defaultWidth;
-      var vmetric = this.vmetrics && this.vmetrics[widthCode];
-      let unicode = this.toUnicode.get(charcode) || this.fallbackToUnicode.get(charcode) || charcode;
-
-      if (typeof unicode === "number") {
-        unicode = String.fromCharCode(unicode);
-      }
-
-      var isInFont = (charcode in this.toFontChar);
-      fontCharCode = this.toFontChar[charcode] || charcode;
-
-      if (this.missingFile) {
-        const glyphName = this.differences[charcode] || this.defaultEncoding[charcode];
-
-        if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") {
-          fontCharCode = 0x20;
-        }
-
-        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);
-      }
-
-      if (this.isType3Font) {
-        operatorListId = fontCharCode;
-      }
-
-      var accent = null;
-
-      if (this.seacMap && this.seacMap[charcode]) {
-        isInFont = true;
-        var seac = this.seacMap[charcode];
-        fontCharCode = seac.baseFontCharCode;
-        accent = {
-          fontChar: String.fromCodePoint(seac.accentFontCharCode),
-          offset: seac.accentOffset
-        };
-      }
-
-      let fontChar = "";
-
-      if (typeof fontCharCode === "number") {
-        if (fontCharCode <= 0x10ffff) {
-          fontChar = String.fromCodePoint(fontCharCode);
-        } else {
-          (0, _util.warn)(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);
-        }
-      }
-
-      var glyph = this.glyphCache[charcode];
-
-      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, 
isSpace, isInFont)) {
-        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);
-        this.glyphCache[charcode] = glyph;
-      }
-
-      return glyph;
-    },
-    charsToGlyphs: function Font_charsToGlyphs(chars) {
-      var charsCache = this.charsCache;
-      var glyphs, glyph, charcode;
-
-      if (charsCache) {
-        glyphs = charsCache[chars];
-
-        if (glyphs) {
-          return glyphs;
-        }
-      }
-
-      if (!charsCache) {
-        charsCache = this.charsCache = Object.create(null);
-      }
-
-      glyphs = [];
-      var charsCacheKey = chars;
-      var i = 0,
-          ii;
-
-      if (this.cMap) {
-        var c = Object.create(null);
-
-        while (i < chars.length) {
-          this.cMap.readCharCode(chars, i, c);
-          charcode = c.charcode;
-          var length = c.length;
-          i += length;
-          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;
-          glyph = this.charToGlyph(charcode, isSpace);
-          glyphs.push(glyph);
-        }
-      } else {
-        for (i = 0, ii = chars.length; i < ii; ++i) {
-          charcode = chars.charCodeAt(i);
-          glyph = this.charToGlyph(charcode, charcode === 0x20);
-          glyphs.push(glyph);
-        }
-      }
-
-      return charsCache[charsCacheKey] = glyphs;
-    },
-
-    get glyphCacheValues() {
-      return Object.values(this.glyphCache);
-    }
-
-  };
-  return Font;
-}();
-
-exports.Font = Font;
-
-var ErrorFont = function ErrorFontClosure() {
-  function ErrorFont(error) {
-    this.error = error;
-    this.loadedName = "g_font_error";
-    this.missingFile = true;
-  }
-
-  ErrorFont.prototype = {
-    charsToGlyphs: function ErrorFont_charsToGlyphs() {
-      return [];
-    },
-
-    exportData(extraProperties = false) {
-      return {
-        error: this.error
-      };
-    }
-
-  };
-  return ErrorFont;
-}();
-
-exports.ErrorFont = ErrorFont;
-
-function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
-  var charCodeToGlyphId = Object.create(null);
-  var glyphId, charCode, baseEncoding;
-  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
-
-  if (properties.baseEncodingName) {
-    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
-
-    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
-      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
-
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0;
-      }
-    }
-  } else if (isSymbolicFont) {
-    for (charCode in builtInEncoding) {
-      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
-    }
+/***/ }),
+/* 40 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __w_pdfjs_require__) => {
+
+__w_pdfjs_require__.r(__webpack_exports__);
+/* harmony export */ __w_pdfjs_require__.d(__webpack_exports__, {
+/* harmony export */   "getNormalizedUnicodes": () => (/* binding */ getNormalizedUnicodes),
+/* harmony export */   "getUnicodeForGlyph": () => (/* binding */ getUnicodeForGlyph),
+/* harmony export */   "getUnicodeRangeFor": () => (/* binding */ getUnicodeRangeFor),
+/* harmony export */   "mapSpecialUnicodeValues": () => (/* binding */ mapSpecialUnicodeValues),
+/* harmony export */   "reverseIfRtl": () => (/* binding */ reverseIfRtl)
+/* harmony export */ });
+/* harmony import */ var _core_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __w_pdfjs_require__(9);
+
+const getSpecialPUASymbols = (0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getLookupTableFactory)(function 
(t) {
+ t[63721] = 0x00a9;
+ t[63193] = 0x00a9;
+ t[63720] = 0x00ae;
+ t[63194] = 0x00ae;
+ t[63722] = 0x2122;
+ t[63195] = 0x2122;
+ t[63729] = 0x23a7;
+ t[63730] = 0x23a8;
+ t[63731] = 0x23a9;
+ t[63740] = 0x23ab;
+ t[63741] = 0x23ac;
+ t[63742] = 0x23ad;
+ t[63726] = 0x23a1;
+ t[63727] = 0x23a2;
+ t[63728] = 0x23a3;
+ t[63737] = 0x23a4;
+ t[63738] = 0x23a5;
+ t[63739] = 0x23a6;
+ t[63723] = 0x239b;
+ t[63724] = 0x239c;
+ t[63725] = 0x239d;
+ t[63734] = 0x239e;
+ t[63735] = 0x239f;
+ t[63736] = 0x23a0;
+});
+function mapSpecialUnicodeValues(code) {
+ if (code >= 0xfff0 && code <= 0xffff) {
+  return 0;
+ } else if (code >= 0xf600 && code <= 0xf8ff) {
+  return getSpecialPUASymbols()[code] || code;
+ } else if (code === 0x00ad) {
+  return 0x002d;
+ }
+ return code;
+}
+function getUnicodeForGlyph(name, glyphsUnicodeMap) {
+ let unicode = glyphsUnicodeMap[name];
+ if (unicode !== undefined) {
+  return unicode;
+ }
+ if (!name) {
+  return -1;
+ }
+ if (name[0] === "u") {
+  const nameLen = name.length;
+  let hexStr;
+  if (nameLen === 7 && name[1] === "n" && name[2] === "i") {
+   hexStr = name.substring(3);
+  } else if (nameLen >= 5 && nameLen <= 7) {
+   hexStr = name.substring(1);
   } else {
-    baseEncoding = _encodings.StandardEncoding;
-
-    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
-      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
-
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0;
-      }
-    }
+   return -1;
   }
-
-  var differences = properties.differences,
-      glyphsUnicodeMap;
-
-  if (differences) {
-    for (charCode in differences) {
-      var glyphName = differences[charCode];
-      glyphId = glyphNames.indexOf(glyphName);
-
-      if (glyphId === -1) {
-        if (!glyphsUnicodeMap) {
-          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
-        }
-
-        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
-
-        if (standardGlyphName !== glyphName) {
-          glyphId = glyphNames.indexOf(standardGlyphName);
-        }
-      }
-
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0;
-      }
-    }
+  if (hexStr === hexStr.toUpperCase()) {
+   unicode = parseInt(hexStr, 16);
+   if (unicode >= 0) {
+    return unicode;
+   }
   }
-
-  return charCodeToGlyphId;
+ }
+ return -1;
 }
-
-var Type1Font = function Type1FontClosure() {
-  function findBlock(streamBytes, signature, startIndex) {
-    var streamBytesLength = streamBytes.length;
-    var signatureLength = signature.length;
-    var scanLength = streamBytesLength - signatureLength;
-    var i = startIndex,
-        j,
-        found = false;
-
-    while (i < scanLength) {
-      j = 0;
-
-      while (j < signatureLength && streamBytes[i + j] === signature[j]) {
-        j++;
-      }
-
-      if (j >= signatureLength) {
-        i += j;
-
-        while (i < streamBytesLength && (0, _core_utils.isWhiteSpace)(streamBytes[i])) {
-          i++;
-        }
-
-        found = true;
-        break;
-      }
-
-      i++;
-    }
-
-    return {
-      found,
-      length: i
-    };
-  }
-
-  function getHeaderBlock(stream, suggestedLength) {
-    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
-    var streamStartPos = stream.pos;
-    var headerBytes, headerBytesLength, block;
-
-    try {
-      headerBytes = stream.getBytes(suggestedLength);
-      headerBytesLength = headerBytes.length;
-    } catch (ex) {
-      if (ex instanceof _core_utils.MissingDataException) {
-        throw ex;
-      }
-    }
-
-    if (headerBytesLength === suggestedLength) {
-      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);
-
-      if (block.found && block.length === suggestedLength) {
-        return {
-          stream: new _stream.Stream(headerBytes),
-          length: suggestedLength
-        };
-      }
-    }
-
-    (0, _util.warn)('Invalid "Length1" property in Type1 font -- trying to recover.');
-    stream.pos = streamStartPos;
-    var SCAN_BLOCK_LENGTH = 2048;
-    var actualLength;
-
-    while (true) {
-      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
-      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);
-
-      if (block.length === 0) {
-        break;
-      }
-
-      stream.pos += block.length;
-
-      if (block.found) {
-        actualLength = stream.pos - streamStartPos;
-        break;
-      }
-    }
-
-    stream.pos = streamStartPos;
-
-    if (actualLength) {
-      return {
-        stream: new _stream.Stream(stream.getBytes(actualLength)),
-        length: actualLength
-      };
-    }
-
-    (0, _util.warn)('Unable to recover "Length1" property in Type1 font -- using as is.');
-    return {
-      stream: new _stream.Stream(stream.getBytes(suggestedLength)),
-      length: suggestedLength
-    };
-  }
-
-  function getEexecBlock(stream, suggestedLength) {
-    var eexecBytes = stream.getBytes();
-    return {
-      stream: new _stream.Stream(eexecBytes),
-      length: eexecBytes.length
-    };
-  }
-
-  function Type1Font(name, file, properties) {
-    var PFB_HEADER_SIZE = 6;
-    var headerBlockLength = properties.length1;
-    var eexecBlockLength = properties.length2;
-    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
-    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
-
-    if (pfbHeaderPresent) {
-      file.skip(PFB_HEADER_SIZE);
-      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
-    }
-
-    var headerBlock = getHeaderBlock(file, headerBlockLength);
-    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);
-    headerBlockParser.extractFontHeader(properties);
-
-    if (pfbHeaderPresent) {
-      pfbHeader = file.getBytes(PFB_HEADER_SIZE);
-      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
-    }
-
-    var eexecBlock = getEexecBlock(file, eexecBlockLength);
-    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
-    var data = eexecBlockParser.extractFontProgram(properties);
-
-    for (const key in data.properties) {
-      properties[key] = data.properties[key];
-    }
-
-    var charstrings = data.charstrings;
-    var type2Charstrings = this.getType2Charstrings(charstrings);
-    var subrs = this.getType2Subrs(data.subrs);
-    this.charstrings = charstrings;
-    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
-    this.seacs = this.getSeacs(data.charstrings);
-  }
-
-  Type1Font.prototype = {
-    get numGlyphs() {
-      return this.charstrings.length + 1;
-    },
-
-    getCharset: function Type1Font_getCharset() {
-      var charset = [".notdef"];
-      var charstrings = this.charstrings;
-
-      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
-        charset.push(charstrings[glyphId].glyphName);
-      }
-
-      return charset;
-    },
-    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
-      var charstrings = this.charstrings;
-
-      if (properties.composite) {
-        const charCodeToGlyphId = Object.create(null);
-
-        for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) {
-          const charCode = properties.cMap.charCodeOf(glyphId);
-          charCodeToGlyphId[charCode] = glyphId + 1;
-        }
-
-        return charCodeToGlyphId;
-      }
-
-      var glyphNames = [".notdef"],
-          glyphId;
-
-      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
-        glyphNames.push(charstrings[glyphId].glyphName);
-      }
-
-      var encoding = properties.builtInEncoding;
-
-      if (encoding) {
-        var builtInEncoding = Object.create(null);
-
-        for (var charCode in encoding) {
-          glyphId = glyphNames.indexOf(encoding[charCode]);
-
-          if (glyphId >= 0) {
-            builtInEncoding[charCode] = glyphId;
-          }
-        }
-      }
-
-      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
-    },
-    hasGlyphId: function Type1Font_hasGlyphID(id) {
-      if (id < 0 || id >= this.numGlyphs) {
-        return false;
-      }
-
-      if (id === 0) {
-        return true;
-      }
-
-      var glyph = this.charstrings[id - 1];
-      return glyph.charstring.length > 0;
-    },
-    getSeacs: function Type1Font_getSeacs(charstrings) {
-      var i, ii;
-      var seacMap = [];
-
-      for (i = 0, ii = charstrings.length; i < ii; i++) {
-        var charstring = charstrings[i];
-
-        if (charstring.seac) {
-          seacMap[i + 1] = charstring.seac;
-        }
-      }
-
-      return seacMap;
-    },
-    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {
-      var type2Charstrings = [];
-
-      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
-        type2Charstrings.push(type1Charstrings[i].charstring);
-      }
-
-      return type2Charstrings;
-    },
-    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
-      var bias = 0;
-      var count = type1Subrs.length;
-
-      if (count < 1133) {
-        bias = 107;
-      } else if (count < 33769) {
-        bias = 1131;
-      } else {
-        bias = 32768;
-      }
-
-      var type2Subrs = [];
-      var i;
-
-      for (i = 0; i < bias; i++) {
-        type2Subrs.push([0x0b]);
-      }
-
-      for (i = 0; i < count; i++) {
-        type2Subrs.push(type1Subrs[i]);
-      }
-
-      return type2Subrs;
-    },
-    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
-      var cff = new _cff_parser.CFF();
-      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);
-      cff.names = [name];
-      var topDict = new _cff_parser.CFFTopDict();
-      topDict.setByName("version", 391);
-      topDict.setByName("Notice", 392);
-      topDict.setByName("FullName", 393);
-      topDict.setByName("FamilyName", 394);
-      topDict.setByName("Weight", 395);
-      topDict.setByName("Encoding", null);
-      topDict.setByName("FontMatrix", properties.fontMatrix);
-      topDict.setByName("FontBBox", properties.bbox);
-      topDict.setByName("charset", null);
-      topDict.setByName("CharStrings", null);
-      topDict.setByName("Private", null);
-      cff.topDict = topDict;
-      var strings = new _cff_parser.CFFStrings();
-      strings.add("Version 0.11");
-      strings.add("See original notice");
-      strings.add(name);
-      strings.add(name);
-      strings.add("Medium");
-      cff.strings = strings;
-      cff.globalSubrIndex = new _cff_parser.CFFIndex();
-      var count = glyphs.length;
-      var charsetArray = [".notdef"];
-      var i, ii;
-
-      for (i = 0; i < count; i++) {
-        const glyphName = charstrings[i].glyphName;
-
-        const index = _cff_parser.CFFStandardStrings.indexOf(glyphName);
-
-        if (index === -1) {
-          strings.add(glyphName);
-        }
-
-        charsetArray.push(glyphName);
-      }
-
-      cff.charset = new _cff_parser.CFFCharset(false, 0, charsetArray);
-      var charStringsIndex = new _cff_parser.CFFIndex();
-      charStringsIndex.add([0x8b, 0x0e]);
-
-      for (i = 0; i < count; i++) {
-        charStringsIndex.add(glyphs[i]);
-      }
-
-      cff.charStrings = charStringsIndex;
-      var privateDict = new _cff_parser.CFFPrivateDict();
-      privateDict.setByName("Subrs", null);
-      var fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", 
"BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"];
-
-      for (i = 0, ii = fields.length; i < ii; i++) {
-        var field = fields[i];
-
-        if (!(field in properties.privateData)) {
-          continue;
-        }
-
-        var value = properties.privateData[field];
-
-        if (Array.isArray(value)) {
-          for (var j = value.length - 1; j > 0; j--) {
-            value[j] -= value[j - 1];
-          }
-        }
-
-        privateDict.setByName(field, value);
-      }
-
-      cff.topDict.privateDict = privateDict;
-      var subrIndex = new _cff_parser.CFFIndex();
-
-      for (i = 0, ii = subrs.length; i < ii; i++) {
-        subrIndex.add(subrs[i]);
-      }
-
-      privateDict.subrsIndex = subrIndex;
-      var compiler = new _cff_parser.CFFCompiler(cff);
-      return compiler.compile();
-    }
-  };
-  return Type1Font;
-}();
-
-var CFFFont = function CFFFontClosure() {
-  function CFFFont(file, properties) {
-    this.properties = properties;
-    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);
-    this.cff = parser.parse();
-    this.cff.duplicateFirstGlyph();
-    var compiler = new _cff_parser.CFFCompiler(this.cff);
-    this.seacs = this.cff.seacs;
-
-    try {
-      this.data = compiler.compile();
-    } catch (e) {
-      (0, _util.warn)("Failed to compile font " + properties.loadedName);
-      this.data = file;
-    }
-  }
-
-  CFFFont.prototype = {
-    get numGlyphs() {
-      return this.cff.charStrings.count;
-    },
-
-    getCharset: function CFFFont_getCharset() {
-      return this.cff.charset.charset;
-    },
-    getGlyphMapping: function CFFFont_getGlyphMapping() {
-      var cff = this.cff;
-      var properties = this.properties;
-      var charsets = cff.charset.charset;
-      var charCodeToGlyphId;
-      var glyphId;
-
-      if (properties.composite) {
-        charCodeToGlyphId = Object.create(null);
-        let charCode;
-
-        if (cff.isCIDFont) {
-          for (glyphId = 0; glyphId < charsets.length; glyphId++) {
-            var cid = charsets[glyphId];
-            charCode = properties.cMap.charCodeOf(cid);
-            charCodeToGlyphId[charCode] = glyphId;
-          }
-        } else {
-          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
-            charCode = properties.cMap.charCodeOf(glyphId);
-            charCodeToGlyphId[charCode] = glyphId;
-          }
-        }
-
-        return charCodeToGlyphId;
-      }
-
-      var encoding = cff.encoding ? cff.encoding.encoding : null;
-      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
-      return charCodeToGlyphId;
-    },
-    hasGlyphId: function CFFFont_hasGlyphID(id) {
-      return this.cff.hasGlyphId(id);
-    }
-  };
-  return CFFFont;
-}();
-
-/***/ }),
-/* 31 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset 
= exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = 
exports.CFFStandardStrings = void 0;
-
-var _util = __w_pdfjs_require__(2);
-
-var _charsets = __w_pdfjs_require__(32);
-
-var _encodings = __w_pdfjs_require__(33);
-
-var MAX_SUBR_NESTING = 10;
-var CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", 
"currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", 
"endash", "dagger", "daggerdbl", "periodcentered", "paragra
 ph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", 
"perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", 
"dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", 
"Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", 
"logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", 
"degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", 
"copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", 
"Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", 
"Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", 
"Yacute", "Ydieresis", "Zcaron", "aacute", "acircum
 flex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", 
"iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", 
"otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", 
"exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", 
"parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", 
"twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", 
"eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", 
"asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", 
"nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", 
"parenrightinferior", "Circumflexsmall", "hyphensu
 perior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", 
"Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", 
"Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", 
"Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", 
"Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", 
"Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", 
"seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", 
"sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", 
"threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", 
"nineinferior", "centinferior", "dollarinferior", "periodinferi
 or", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", 
"Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", 
"Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", 
"Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", 
"Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", 
"001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", 
"Semibold"];
-exports.CFFStandardStrings = CFFStandardStrings;
-const NUM_STANDARD_CFF_STRINGS = 391;
-
-var CFFParser = function CFFParserClosure() {
-  var CharstringValidationData = [null, {
-    id: "hstem",
-    min: 2,
-    stackClearing: true,
-    stem: true
-  }, null, {
-    id: "vstem",
-    min: 2,
-    stackClearing: true,
-    stem: true
-  }, {
-    id: "vmoveto",
-    min: 1,
-    stackClearing: true
-  }, {
-    id: "rlineto",
-    min: 2,
-    resetStack: true
-  }, {
-    id: "hlineto",
-    min: 1,
-    resetStack: true
-  }, {
-    id: "vlineto",
-    min: 1,
-    resetStack: true
-  }, {
-    id: "rrcurveto",
-    min: 6,
-    resetStack: true
-  }, null, {
-    id: "callsubr",
-    min: 1,
-    undefStack: true
-  }, {
-    id: "return",
-    min: 0,
-    undefStack: true
-  }, null, null, {
-    id: "endchar",
-    min: 0,
-    stackClearing: true
-  }, null, null, null, {
-    id: "hstemhm",
-    min: 2,
-    stackClearing: true,
-    stem: true
-  }, {
-    id: "hintmask",
-    min: 0,
-    stackClearing: true
-  }, {
-    id: "cntrmask",
-    min: 0,
-    stackClearing: true
-  }, {
-    id: "rmoveto",
-    min: 2,
-    stackClearing: true
-  }, {
-    id: "hmoveto",
-    min: 1,
-    stackClearing: true
-  }, {
-    id: "vstemhm",
-    min: 2,
-    stackClearing: true,
-    stem: true
-  }, {
-    id: "rcurveline",
-    min: 8,
-    resetStack: true
-  }, {
-    id: "rlinecurve",
-    min: 8,
-    resetStack: true
-  }, {
-    id: "vvcurveto",
-    min: 4,
-    resetStack: true
-  }, {
-    id: "hhcurveto",
-    min: 4,
-    resetStack: true
-  }, null, {
-    id: "callgsubr",
-    min: 1,
-    undefStack: true
-  }, {
-    id: "vhcurveto",
-    min: 4,
-    resetStack: true
-  }, {
-    id: "hvcurveto",
-    min: 4,
-    resetStack: true
-  }];
-  var CharstringValidationData12 = [null, null, null, {
-    id: "and",
-    min: 2,
-    stackDelta: -1
-  }, {
-    id: "or",
-    min: 2,
-    stackDelta: -1
-  }, {
-    id: "not",
-    min: 1,
-    stackDelta: 0
-  }, null, null, null, {
-    id: "abs",
-    min: 1,
-    stackDelta: 0
-  }, {
-    id: "add",
-    min: 2,
-    stackDelta: -1,
-    stackFn: function stack_div(stack, index) {
-      stack[index - 2] = stack[index - 2] + stack[index - 1];
-    }
-  }, {
-    id: "sub",
-    min: 2,
-    stackDelta: -1,
-    stackFn: function stack_div(stack, index) {
-      stack[index - 2] = stack[index - 2] - stack[index - 1];
-    }
-  }, {
-    id: "div",
-    min: 2,
-    stackDelta: -1,
-    stackFn: function stack_div(stack, index) {
-      stack[index - 2] = stack[index - 2] / stack[index - 1];
-    }
-  }, null, {
-    id: "neg",
-    min: 1,
-    stackDelta: 0,
-    stackFn: function stack_div(stack, index) {
-      stack[index - 1] = -stack[index - 1];
-    }
-  }, {
-    id: "eq",
-    min: 2,
-    stackDelta: -1
-  }, null, null, {
-    id: "drop",
-    min: 1,
-    stackDelta: -1
-  }, null, {
-    id: "put",
-    min: 2,
-    stackDelta: -2
-  }, {
-    id: "get",
-    min: 1,
-    stackDelta: 0
-  }, {
-    id: "ifelse",
-    min: 4,
-    stackDelta: -3
-  }, {
-    id: "random",
-    min: 0,
-    stackDelta: 1
-  }, {
-    id: "mul",
-    min: 2,
-    stackDelta: -1,
-    stackFn: function stack_div(stack, index) {
-      stack[index - 2] = stack[index - 2] * stack[index - 1];
-    }
-  }, null, {
-    id: "sqrt",
-    min: 1,
-    stackDelta: 0
-  }, {
-    id: "dup",
-    min: 1,
-    stackDelta: 1
-  }, {
-    id: "exch",
-    min: 2,
-    stackDelta: 0
-  }, {
-    id: "index",
-    min: 2,
-    stackDelta: 0
-  }, {
-    id: "roll",
-    min: 3,
-    stackDelta: -2
-  }, null, null, null, {
-    id: "hflex",
-    min: 7,
-    resetStack: true
-  }, {
-    id: "flex",
-    min: 13,
-    resetStack: true
-  }, {
-    id: "hflex1",
-    min: 9,
-    resetStack: true
-  }, {
-    id: "flex1",
-    min: 11,
-    resetStack: true
-  }];
-
-  class CFFParser {
-    constructor(file, properties, seacAnalysisEnabled) {
-      this.bytes = file.getBytes();
-      this.properties = properties;
-      this.seacAnalysisEnabled = !!seacAnalysisEnabled;
-    }
-
-    parse() {
-      var properties = this.properties;
-      var cff = new CFF();
-      this.cff = cff;
-      var header = this.parseHeader();
-      var nameIndex = this.parseIndex(header.endPos);
-      var topDictIndex = this.parseIndex(nameIndex.endPos);
-      var stringIndex = this.parseIndex(topDictIndex.endPos);
-      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
-      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
-      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
-      cff.header = header.obj;
-      cff.names = this.parseNameIndex(nameIndex.obj);
-      cff.strings = this.parseStringIndex(stringIndex.obj);
-      cff.topDict = topDict;
-      cff.globalSubrIndex = globalSubrIndex.obj;
-      this.parsePrivateDict(cff.topDict);
-      cff.isCIDFont = topDict.hasName("ROS");
-      var charStringOffset = topDict.getByName("CharStrings");
-      var charStringIndex = this.parseIndex(charStringOffset).obj;
-      var fontMatrix = topDict.getByName("FontMatrix");
-
-      if (fontMatrix) {
-        properties.fontMatrix = fontMatrix;
-      }
-
-      var fontBBox = topDict.getByName("FontBBox");
-
-      if (fontBBox) {
-        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
-        properties.descent = Math.min(fontBBox[1], fontBBox[3]);
-        properties.ascentScaled = true;
-      }
-
-      var charset, encoding;
-
-      if (cff.isCIDFont) {
-        var fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj;
-
-        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
-          var dictRaw = fdArrayIndex.get(i);
-          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
-          this.parsePrivateDict(fontDict);
-          cff.fdArray.push(fontDict);
-        }
-
-        encoding = null;
-        charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true);
-        cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count);
-      } else {
-        charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, 
false);
-        encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, 
charset.charset);
-      }
-
-      cff.charset = charset;
-      cff.encoding = encoding;
-      var charStringsAndSeacs = this.parseCharStrings({
-        charStrings: charStringIndex,
-        localSubrIndex: topDict.privateDict.subrsIndex,
-        globalSubrIndex: globalSubrIndex.obj,
-        fdSelect: cff.fdSelect,
-        fdArray: cff.fdArray,
-        privateDict: topDict.privateDict
-      });
-      cff.charStrings = charStringsAndSeacs.charStrings;
-      cff.seacs = charStringsAndSeacs.seacs;
-      cff.widths = charStringsAndSeacs.widths;
-      return cff;
-    }
-
-    parseHeader() {
-      var bytes = this.bytes;
-      var bytesLength = bytes.length;
-      var offset = 0;
-
-      while (offset < bytesLength && bytes[offset] !== 1) {
-        ++offset;
-      }
-
-      if (offset >= bytesLength) {
-        throw new _util.FormatError("Invalid CFF header");
-      }
-
-      if (offset !== 0) {
-        (0, _util.info)("cff data is shifted");
-        bytes = bytes.subarray(offset);
-        this.bytes = bytes;
-      }
-
-      var major = bytes[0];
-      var minor = bytes[1];
-      var hdrSize = bytes[2];
-      var offSize = bytes[3];
-      var header = new CFFHeader(major, minor, hdrSize, offSize);
-      return {
-        obj: header,
-        endPos: hdrSize
-      };
-    }
-
-    parseDict(dict) {
-      var pos = 0;
-
-      function parseOperand() {
-        var value = dict[pos++];
-
-        if (value === 30) {
-          return parseFloatOperand();
-        } else if (value === 28) {
-          value = dict[pos++];
-          value = (value << 24 | dict[pos++] << 16) >> 16;
-          return value;
-        } else if (value === 29) {
-          value = dict[pos++];
-          value = value << 8 | dict[pos++];
-          value = value << 8 | dict[pos++];
-          value = value << 8 | dict[pos++];
-          return value;
-        } else if (value >= 32 && value <= 246) {
-          return value - 139;
-        } else if (value >= 247 && value <= 250) {
-          return (value - 247) * 256 + dict[pos++] + 108;
-        } else if (value >= 251 && value <= 254) {
-          return -((value - 251) * 256) - dict[pos++] - 108;
-        }
-
-        (0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.');
-        return NaN;
-      }
-
-      function parseFloatOperand() {
-        var str = "";
-        var eof = 15;
-        const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"];
-        var length = dict.length;
-
-        while (pos < length) {
-          var b = dict[pos++];
-          var b1 = b >> 4;
-          var b2 = b & 15;
-
-          if (b1 === eof) {
-            break;
-          }
-
-          str += lookup[b1];
-
-          if (b2 === eof) {
-            break;
-          }
-
-          str += lookup[b2];
-        }
-
-        return parseFloat(str);
-      }
-
-      var operands = [];
-      var entries = [];
-      pos = 0;
-      var end = dict.length;
-
-      while (pos < end) {
-        var b = dict[pos];
-
-        if (b <= 21) {
-          if (b === 12) {
-            b = b << 8 | dict[++pos];
-          }
-
-          entries.push([b, operands]);
-          operands = [];
-          ++pos;
-        } else {
-          operands.push(parseOperand());
-        }
-      }
-
-      return entries;
-    }
-
-    parseIndex(pos) {
-      var cffIndex = new CFFIndex();
-      var bytes = this.bytes;
-      var count = bytes[pos++] << 8 | bytes[pos++];
-      var offsets = [];
-      var end = pos;
-      var i, ii;
-
-      if (count !== 0) {
-        var offsetSize = bytes[pos++];
-        var startPos = pos + (count + 1) * offsetSize - 1;
-
-        for (i = 0, ii = count + 1; i < ii; ++i) {
-          var offset = 0;
-
-          for (var j = 0; j < offsetSize; ++j) {
-            offset <<= 8;
-            offset += bytes[pos++];
-          }
-
-          offsets.push(startPos + offset);
-        }
-
-        end = offsets[count];
-      }
-
-      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
-        var offsetStart = offsets[i];
-        var offsetEnd = offsets[i + 1];
-        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
-      }
-
-      return {
-        obj: cffIndex,
-        endPos: end
-      };
-    }
-
-    parseNameIndex(index) {
-      var names = [];
-
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var name = index.get(i);
-        names.push((0, _util.bytesToString)(name));
-      }
-
-      return names;
-    }
-
-    parseStringIndex(index) {
-      var strings = new CFFStrings();
-
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var data = index.get(i);
-        strings.add((0, _util.bytesToString)(data));
-      }
-
-      return strings;
-    }
-
-    createDict(Type, dict, strings) {
-      var cffDict = new Type(strings);
-
-      for (var i = 0, ii = dict.length; i < ii; ++i) {
-        var pair = dict[i];
-        var key = pair[0];
-        var value = pair[1];
-        cffDict.setByKey(key, value);
-      }
-
-      return cffDict;
-    }
-
-    parseCharString(state, data, localSubrIndex, globalSubrIndex) {
-      if (!data || state.callDepth > MAX_SUBR_NESTING) {
-        return false;
-      }
-
-      var stackSize = state.stackSize;
-      var stack = state.stack;
-      var length = data.length;
-
-      for (var j = 0; j < length;) {
-        var value = data[j++];
-        var validationCommand = null;
-
-        if (value === 12) {
-          var q = data[j++];
-
-          if (q === 0) {
-            data[j - 2] = 139;
-            data[j - 1] = 22;
-            stackSize = 0;
-          } else {
-            validationCommand = CharstringValidationData12[q];
-          }
-        } else if (value === 28) {
-          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;
-          j += 2;
-          stackSize++;
-        } else if (value === 14) {
-          if (stackSize >= 4) {
-            stackSize -= 4;
-
-            if (this.seacAnalysisEnabled) {
-              state.seac = stack.slice(stackSize, stackSize + 4);
-              return false;
-            }
-          }
-
-          validationCommand = CharstringValidationData[value];
-        } else if (value >= 32 && value <= 246) {
-          stack[stackSize] = value - 139;
-          stackSize++;
-        } else if (value >= 247 && value <= 254) {
-          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - 
data[j] - 108;
-          j++;
-          stackSize++;
-        } else if (value === 255) {
-          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;
-          j += 4;
-          stackSize++;
-        } else if (value === 19 || value === 20) {
-          state.hints += stackSize >> 1;
-          j += state.hints + 7 >> 3;
-          stackSize %= 2;
-          validationCommand = CharstringValidationData[value];
-        } else if (value === 10 || value === 29) {
-          var subrsIndex;
-
-          if (value === 10) {
-            subrsIndex = localSubrIndex;
-          } else {
-            subrsIndex = globalSubrIndex;
-          }
-
-          if (!subrsIndex) {
-            validationCommand = CharstringValidationData[value];
-            (0, _util.warn)("Missing subrsIndex for " + validationCommand.id);
-            return false;
-          }
-
-          var bias = 32768;
-
-          if (subrsIndex.count < 1240) {
-            bias = 107;
-          } else if (subrsIndex.count < 33900) {
-            bias = 1131;
-          }
-
-          var subrNumber = stack[--stackSize] + bias;
-
-          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
-            validationCommand = CharstringValidationData[value];
-            (0, _util.warn)("Out of bounds subrIndex for " + validationCommand.id);
-            return false;
-          }
-
-          state.stackSize = stackSize;
-          state.callDepth++;
-          var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, 
globalSubrIndex);
-
-          if (!valid) {
-            return false;
-          }
-
-          state.callDepth--;
-          stackSize = state.stackSize;
-          continue;
-        } else if (value === 11) {
-          state.stackSize = stackSize;
-          return true;
-        } else {
-          validationCommand = CharstringValidationData[value];
-        }
-
-        if (validationCommand) {
-          if (validationCommand.stem) {
-            state.hints += stackSize >> 1;
-
-            if (value === 3 || value === 23) {
-              state.hasVStems = true;
-            } else if (state.hasVStems && (value === 1 || value === 18)) {
-              (0, _util.warn)("CFF stem hints are in wrong order");
-              data[j - 1] = value === 1 ? 3 : 23;
-            }
-          }
-
-          if ("min" in validationCommand) {
-            if (!state.undefStack && stackSize < validationCommand.min) {
-              (0, _util.warn)("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize 
+ ", expected: " + validationCommand.min);
-              return false;
-            }
-          }
-
-          if (state.firstStackClearing && validationCommand.stackClearing) {
-            state.firstStackClearing = false;
-            stackSize -= validationCommand.min;
-
-            if (stackSize >= 2 && validationCommand.stem) {
-              stackSize %= 2;
-            } else if (stackSize > 1) {
-              (0, _util.warn)("Found too many parameters for stack-clearing command");
-            }
-
-            if (stackSize > 0 && stack[stackSize - 1] >= 0) {
-              state.width = stack[stackSize - 1];
-            }
-          }
-
-          if ("stackDelta" in validationCommand) {
-            if ("stackFn" in validationCommand) {
-              validationCommand.stackFn(stack, stackSize);
-            }
-
-            stackSize += validationCommand.stackDelta;
-          } else if (validationCommand.stackClearing) {
-            stackSize = 0;
-          } else if (validationCommand.resetStack) {
-            stackSize = 0;
-            state.undefStack = false;
-          } else if (validationCommand.undefStack) {
-            stackSize = 0;
-            state.undefStack = true;
-            state.firstStackClearing = false;
-          }
-        }
-      }
-
-      state.stackSize = stackSize;
-      return true;
-    }
-
-    parseCharStrings({
-      charStrings,
-      localSubrIndex,
-      globalSubrIndex,
-      fdSelect,
-      fdArray,
-      privateDict
-    }) {
-      var seacs = [];
-      var widths = [];
-      var count = charStrings.count;
-
-      for (var i = 0; i < count; i++) {
-        var charstring = charStrings.get(i);
-        var state = {
-          callDepth: 0,
-          stackSize: 0,
-          stack: [],
-          undefStack: true,
-          hints: 0,
-          firstStackClearing: true,
-          seac: null,
-          width: null,
-          hasVStems: false
-        };
-        var valid = true;
-        var localSubrToUse = null;
-        var privateDictToUse = privateDict;
-
-        if (fdSelect && fdArray.length) {
-          var fdIndex = fdSelect.getFDIndex(i);
-
-          if (fdIndex === -1) {
-            (0, _util.warn)("Glyph index is not in fd select.");
-            valid = false;
-          }
-
-          if (fdIndex >= fdArray.length) {
-            (0, _util.warn)("Invalid fd index for glyph index.");
-            valid = false;
-          }
-
-          if (valid) {
-            privateDictToUse = fdArray[fdIndex].privateDict;
-            localSubrToUse = privateDictToUse.subrsIndex;
-          }
-        } else if (localSubrIndex) {
-          localSubrToUse = localSubrIndex;
-        }
-
-        if (valid) {
-          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
-        }
-
-        if (state.width !== null) {
-          const nominalWidth = privateDictToUse.getByName("nominalWidthX");
-          widths[i] = nominalWidth + state.width;
-        } else {
-          const defaultWidth = privateDictToUse.getByName("defaultWidthX");
-          widths[i] = defaultWidth;
-        }
-
-        if (state.seac !== null) {
-          seacs[i] = state.seac;
-        }
-
-        if (!valid) {
-          charStrings.set(i, new Uint8Array([14]));
-        }
-      }
-
-      return {
-        charStrings,
-        seacs,
-        widths
-      };
-    }
-
-    emptyPrivateDictionary(parentDict) {
-      var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
-      parentDict.setByKey(18, [0, 0]);
-      parentDict.privateDict = privateDict;
-    }
-
-    parsePrivateDict(parentDict) {
-      if (!parentDict.hasName("Private")) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-
-      var privateOffset = parentDict.getByName("Private");
-
-      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
-        parentDict.removeByName("Private");
-        return;
-      }
-
-      var size = privateOffset[0];
-      var offset = privateOffset[1];
-
-      if (size === 0 || offset >= this.bytes.length) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-
-      var privateDictEnd = offset + size;
-      var dictData = this.bytes.subarray(offset, privateDictEnd);
-      var dict = this.parseDict(dictData);
-      var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
-      parentDict.privateDict = privateDict;
-
-      if (!privateDict.getByName("Subrs")) {
-        return;
-      }
-
-      var subrsOffset = privateDict.getByName("Subrs");
-      var relativeOffset = offset + subrsOffset;
-
-      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-
-      var subrsIndex = this.parseIndex(relativeOffset);
-      privateDict.subrsIndex = subrsIndex.obj;
-    }
-
-    parseCharsets(pos, length, strings, cid) {
-      if (pos === 0) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);
-      } else if (pos === 1) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);
-      } else if (pos === 2) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);
-      }
-
-      var bytes = this.bytes;
-      var start = pos;
-      var format = bytes[pos++];
-      const charset = [cid ? 0 : ".notdef"];
-      var id, count, i;
-      length -= 1;
-
-      switch (format) {
-        case 0:
-          for (i = 0; i < length; i++) {
-            id = bytes[pos++] << 8 | bytes[pos++];
-            charset.push(cid ? id : strings.get(id));
-          }
-
-          break;
-
-        case 1:
-          while (charset.length <= length) {
-            id = bytes[pos++] << 8 | bytes[pos++];
-            count = bytes[pos++];
-
-            for (i = 0; i <= count; i++) {
-              charset.push(cid ? id++ : strings.get(id++));
-            }
-          }
-
-          break;
-
-        case 2:
-          while (charset.length <= length) {
-            id = bytes[pos++] << 8 | bytes[pos++];
-            count = bytes[pos++] << 8 | bytes[pos++];
-
-            for (i = 0; i <= count; i++) {
-              charset.push(cid ? id++ : strings.get(id++));
-            }
-          }
-
-          break;
-
-        default:
-          throw new _util.FormatError("Unknown charset format");
-      }
-
-      var end = pos;
-      var raw = bytes.subarray(start, end);
-      return new CFFCharset(false, format, charset, raw);
-    }
-
-    parseEncoding(pos, properties, strings, charset) {
-      var encoding = Object.create(null);
-      var bytes = this.bytes;
-      var predefined = false;
-      var format, i, ii;
-      var raw = null;
-
-      function readSupplement() {
-        var supplementsCount = bytes[pos++];
-
-        for (i = 0; i < supplementsCount; i++) {
-          var code = bytes[pos++];
-          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
-          encoding[code] = charset.indexOf(strings.get(sid));
-        }
-      }
-
-      if (pos === 0 || pos === 1) {
-        predefined = true;
-        format = pos;
-        var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;
-
-        for (i = 0, ii = charset.length; i < ii; i++) {
-          var index = baseEncoding.indexOf(charset[i]);
-
-          if (index !== -1) {
-            encoding[index] = i;
-          }
-        }
-      } else {
-        var dataStart = pos;
-        format = bytes[pos++];
-
-        switch (format & 0x7f) {
-          case 0:
-            var glyphsCount = bytes[pos++];
-
-            for (i = 1; i <= glyphsCount; i++) {
-              encoding[bytes[pos++]] = i;
-            }
-
-            break;
-
-          case 1:
-            var rangesCount = bytes[pos++];
-            var gid = 1;
-
-            for (i = 0; i < rangesCount; i++) {
-              var start = bytes[pos++];
-              var left = bytes[pos++];
-
-              for (var j = start; j <= start + left; j++) {
-                encoding[j] = gid++;
-              }
-            }
-
-            break;
-
-          default:
-            throw new _util.FormatError(`Unknown encoding format: ${format} in CFF`);
-        }
-
-        var dataEnd = pos;
-
-        if (format & 0x80) {
-          bytes[dataStart] &= 0x7f;
-          readSupplement();
-        }
-
-        raw = bytes.subarray(dataStart, dataEnd);
-      }
-
-      format = format & 0x7f;
-      return new CFFEncoding(predefined, format, encoding, raw);
-    }
-
-    parseFDSelect(pos, length) {
-      var bytes = this.bytes;
-      var format = bytes[pos++];
-      var fdSelect = [];
-      var i;
-
-      switch (format) {
-        case 0:
-          for (i = 0; i < length; ++i) {
-            var id = bytes[pos++];
-            fdSelect.push(id);
-          }
-
-          break;
-
-        case 3:
-          var rangesCount = bytes[pos++] << 8 | bytes[pos++];
-
-          for (i = 0; i < rangesCount; ++i) {
-            var first = bytes[pos++] << 8 | bytes[pos++];
-
-            if (i === 0 && first !== 0) {
-              (0, _util.warn)("parseFDSelect: The first range must have a first GID of 0" + " -- trying to 
recover.");
-              first = 0;
-            }
-
-            var fdIndex = bytes[pos++];
-            var next = bytes[pos] << 8 | bytes[pos + 1];
-
-            for (var j = first; j < next; ++j) {
-              fdSelect.push(fdIndex);
-            }
-          }
-
-          pos += 2;
-          break;
-
-        default:
-          throw new _util.FormatError(`parseFDSelect: Unknown format "${format}".`);
-      }
-
-      if (fdSelect.length !== length) {
-        throw new _util.FormatError("parseFDSelect: Invalid font data.");
-      }
-
-      return new CFFFDSelect(format, fdSelect);
-    }
-
-  }
-
-  return CFFParser;
-}();
-
-exports.CFFParser = CFFParser;
-
-class CFF {
-  constructor() {
-    this.header = null;
-    this.names = [];
-    this.topDict = null;
-    this.strings = new CFFStrings();
-    this.globalSubrIndex = null;
-    this.encoding = null;
-    this.charset = null;
-    this.charStrings = null;
-    this.fdArray = [];
-    this.fdSelect = null;
-    this.isCIDFont = false;
-  }
-
-  duplicateFirstGlyph() {
-    if (this.charStrings.count >= 65535) {
-      (0, _util.warn)("Not enough space in charstrings to duplicate first glyph.");
-      return;
-    }
-
-    var glyphZero = this.charStrings.get(0);
-    this.charStrings.add(glyphZero);
-
-    if (this.isCIDFont) {
-      this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
-    }
-  }
-
-  hasGlyphId(id) {
-    if (id < 0 || id >= this.charStrings.count) {
-      return false;
-    }
-
-    var glyph = this.charStrings.get(id);
-    return glyph.length > 0;
-  }
-
-}
-
-exports.CFF = CFF;
-
-class CFFHeader {
-  constructor(major, minor, hdrSize, offSize) {
-    this.major = major;
-    this.minor = minor;
-    this.hdrSize = hdrSize;
-    this.offSize = offSize;
-  }
-
-}
-
-exports.CFFHeader = CFFHeader;
-
-class CFFStrings {
-  constructor() {
-    this.strings = [];
-  }
-
-  get(index) {
-    if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
-      return CFFStandardStrings[index];
-    }
-
-    if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
-      return this.strings[index - NUM_STANDARD_CFF_STRINGS];
-    }
-
-    return CFFStandardStrings[0];
-  }
-
-  getSID(str) {
-    let index = CFFStandardStrings.indexOf(str);
-
-    if (index !== -1) {
-      return index;
-    }
-
-    index = this.strings.indexOf(str);
-
-    if (index !== -1) {
-      return index + NUM_STANDARD_CFF_STRINGS;
-    }
-
-    return -1;
-  }
-
-  add(value) {
-    this.strings.push(value);
-  }
-
-  get count() {
-    return this.strings.length;
-  }
-
-}
-
-exports.CFFStrings = CFFStrings;
-
-class CFFIndex {
-  constructor() {
-    this.objects = [];
-    this.length = 0;
-  }
-
-  add(data) {
-    this.length += data.length;
-    this.objects.push(data);
-  }
-
-  set(index, data) {
-    this.length += data.length - this.objects[index].length;
-    this.objects[index] = data;
-  }
-
-  get(index) {
-    return this.objects[index];
-  }
-
-  get count() {
-    return this.objects.length;
-  }
-
-}
-
-exports.CFFIndex = CFFIndex;
-
-class CFFDict {
-  constructor(tables, strings) {
-    this.keyToNameMap = tables.keyToNameMap;
-    this.nameToKeyMap = tables.nameToKeyMap;
-    this.defaults = tables.defaults;
-    this.types = tables.types;
-    this.opcodes = tables.opcodes;
-    this.order = tables.order;
-    this.strings = strings;
-    this.values = Object.create(null);
-  }
-
-  setByKey(key, value) {
-    if (!(key in this.keyToNameMap)) {
-      return false;
-    }
-
-    var valueLength = value.length;
-
-    if (valueLength === 0) {
-      return true;
-    }
-
-    for (var i = 0; i < valueLength; i++) {
-      if (isNaN(value[i])) {
-        (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
-        return true;
-      }
-    }
-
-    var type = this.types[key];
-
-    if (type === "num" || type === "sid" || type === "offset") {
-      value = value[0];
-    }
-
-    this.values[key] = value;
-    return true;
-  }
-
-  setByName(name, value) {
-    if (!(name in this.nameToKeyMap)) {
-      throw new _util.FormatError(`Invalid dictionary name "${name}"`);
-    }
-
-    this.values[this.nameToKeyMap[name]] = value;
-  }
-
-  hasName(name) {
-    return this.nameToKeyMap[name] in this.values;
-  }
-
-  getByName(name) {
-    if (!(name in this.nameToKeyMap)) {
-      throw new _util.FormatError(`Invalid dictionary name ${name}"`);
-    }
-
-    var key = this.nameToKeyMap[name];
-
-    if (!(key in this.values)) {
-      return this.defaults[key];
-    }
-
-    return this.values[key];
-  }
-
-  removeByName(name) {
-    delete this.values[this.nameToKeyMap[name]];
-  }
-
-  static createTables(layout) {
-    var tables = {
-      keyToNameMap: {},
-      nameToKeyMap: {},
-      defaults: {},
-      types: {},
-      opcodes: {},
-      order: []
-    };
-
-    for (var i = 0, ii = layout.length; i < ii; ++i) {
-      var entry = layout[i];
-      var key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
-      tables.keyToNameMap[key] = entry[1];
-      tables.nameToKeyMap[entry[1]] = key;
-      tables.types[key] = entry[2];
-      tables.defaults[key] = entry[3];
-      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
-      tables.order.push(key);
-    }
-
-    return tables;
-  }
-
-}
-
-var CFFTopDict = function CFFTopDictClosure() {
-  var layout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], 
[0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", 
"sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 
0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], 
"UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], 
[[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, 
"UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], 
"StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", 
"offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], 
"PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null]
 , [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], 
"CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 
35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], 
[[12, 38], "FontName", "sid", null]];
-  var tables = null;
-
-  class CFFTopDict extends CFFDict {
-    constructor(strings) {
-      if (tables === null) {
-        tables = CFFDict.createTables(layout);
-      }
-
-      super(tables, strings);
-      this.privateDict = null;
-    }
-
-  }
-
-  return CFFTopDict;
-}();
-
-exports.CFFTopDict = CFFTopDict;
-
-var CFFPrivateDict = function CFFPrivateDictClosure() {
-  var layout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", 
"delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], 
"BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", 
null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], 
"ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], 
[[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], 
[19, "Subrs", "offset", null]];
-  var tables = null;
-
-  class CFFPrivateDict extends CFFDict {
-    constructor(strings) {
-      if (tables === null) {
-        tables = CFFDict.createTables(layout);
-      }
-
-      super(tables, strings);
-      this.subrsIndex = null;
-    }
-
-  }
-
-  return CFFPrivateDict;
-}();
-
-exports.CFFPrivateDict = CFFPrivateDict;
-var CFFCharsetPredefinedTypes = {
-  ISO_ADOBE: 0,
-  EXPERT: 1,
-  EXPERT_SUBSET: 2
-};
-
-class CFFCharset {
-  constructor(predefined, format, charset, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.charset = charset;
-    this.raw = raw;
-  }
-
-}
-
-exports.CFFCharset = CFFCharset;
-
-class CFFEncoding {
-  constructor(predefined, format, encoding, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.encoding = encoding;
-    this.raw = raw;
-  }
-
-}
-
-class CFFFDSelect {
-  constructor(format, fdSelect) {
-    this.format = format;
-    this.fdSelect = fdSelect;
-  }
-
-  getFDIndex(glyphIndex) {
-    if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
-      return -1;
-    }
-
-    return this.fdSelect[glyphIndex];
-  }
-
-}
-
-exports.CFFFDSelect = CFFFDSelect;
-
-class CFFOffsetTracker {
-  constructor() {
-    this.offsets = Object.create(null);
-  }
-
-  isTracking(key) {
-    return key in this.offsets;
-  }
-
-  track(key, location) {
-    if (key in this.offsets) {
-      throw new _util.FormatError(`Already tracking location of ${key}`);
-    }
-
-    this.offsets[key] = location;
-  }
-
-  offset(value) {
-    for (var key in this.offsets) {
-      this.offsets[key] += value;
-    }
-  }
-
-  setEntryLocation(key, values, output) {
-    if (!(key in this.offsets)) {
-      throw new _util.FormatError(`Not tracking location of ${key}`);
-    }
-
-    var data = output.data;
-    var dataOffset = this.offsets[key];
-    var size = 5;
-
-    for (var i = 0, ii = values.length; i < ii; ++i) {
-      var offset0 = i * size + dataOffset;
-      var offset1 = offset0 + 1;
-      var offset2 = offset0 + 2;
-      var offset3 = offset0 + 3;
-      var offset4 = offset0 + 4;
-
-      if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || 
data[offset4] !== 0) {
-        throw new _util.FormatError("writing to an offset that is not empty");
-      }
-
-      var value = values[i];
-      data[offset0] = 0x1d;
-      data[offset1] = value >> 24 & 0xff;
-      data[offset2] = value >> 16 & 0xff;
-      data[offset3] = value >> 8 & 0xff;
-      data[offset4] = value & 0xff;
-    }
-  }
-
-}
-
-class CFFCompiler {
-  constructor(cff) {
-    this.cff = cff;
-  }
-
-  compile() {
-    var cff = this.cff;
-    var output = {
-      data: [],
-      length: 0,
-      add: function CFFCompiler_add(data) {
-        this.data = this.data.concat(data);
-        this.length = this.data.length;
-      }
-    };
-    var header = this.compileHeader(cff.header);
-    output.add(header);
-    var nameIndex = this.compileNameIndex(cff.names);
-    output.add(nameIndex);
-
-    if (cff.isCIDFont) {
-      if (cff.topDict.hasName("FontMatrix")) {
-        var base = cff.topDict.getByName("FontMatrix");
-        cff.topDict.removeByName("FontMatrix");
-
-        for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
-          var subDict = cff.fdArray[i];
-          var matrix = base.slice(0);
-
-          if (subDict.hasName("FontMatrix")) {
-            matrix = _util.Util.transform(matrix, subDict.getByName("FontMatrix"));
-          }
-
-          subDict.setByName("FontMatrix", matrix);
-        }
-      }
-    }
-
-    cff.topDict.setByName("charset", 0);
-    var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
-    output.add(compiled.output);
-    var topDictTracker = compiled.trackers[0];
-    var stringIndex = this.compileStringIndex(cff.strings.strings);
-    output.add(stringIndex);
-    var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
-    output.add(globalSubrIndex);
-
-    if (cff.encoding && cff.topDict.hasName("Encoding")) {
-      if (cff.encoding.predefined) {
-        topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
-      } else {
-        var encoding = this.compileEncoding(cff.encoding);
-        topDictTracker.setEntryLocation("Encoding", [output.length], output);
-        output.add(encoding);
-      }
-    }
-
-    var charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
-    topDictTracker.setEntryLocation("charset", [output.length], output);
-    output.add(charset);
-    var charStrings = this.compileCharStrings(cff.charStrings);
-    topDictTracker.setEntryLocation("CharStrings", [output.length], output);
-    output.add(charStrings);
-
-    if (cff.isCIDFont) {
-      topDictTracker.setEntryLocation("FDSelect", [output.length], output);
-      var fdSelect = this.compileFDSelect(cff.fdSelect);
-      output.add(fdSelect);
-      compiled = this.compileTopDicts(cff.fdArray, output.length, true);
-      topDictTracker.setEntryLocation("FDArray", [output.length], output);
-      output.add(compiled.output);
-      var fontDictTrackers = compiled.trackers;
-      this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
-    }
-
-    this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
-    output.add([0]);
-    return output.data;
-  }
-
-  encodeNumber(value) {
-    if (Number.isInteger(value)) {
-      return this.encodeInteger(value);
-    }
-
-    return this.encodeFloat(value);
-  }
-
-  static get EncodeFloatRegExp() {
-    return (0, _util.shadow)(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/);
-  }
-
-  encodeFloat(num) {
-    var value = num.toString();
-    var m = CFFCompiler.EncodeFloatRegExp.exec(value);
-
-    if (m) {
-      var epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
-      value = (Math.round(num * epsilon) / epsilon).toString();
-    }
-
-    var nibbles = "";
-    var i, ii;
-
-    for (i = 0, ii = value.length; i < ii; ++i) {
-      var a = value[i];
-
-      if (a === "e") {
-        nibbles += value[++i] === "-" ? "c" : "b";
-      } else if (a === ".") {
-        nibbles += "a";
-      } else if (a === "-") {
-        nibbles += "e";
-      } else {
-        nibbles += a;
-      }
-    }
-
-    nibbles += nibbles.length & 1 ? "f" : "ff";
-    var out = [30];
-
-    for (i = 0, ii = nibbles.length; i < ii; i += 2) {
-      out.push(parseInt(nibbles.substring(i, i + 2), 16));
-    }
-
-    return out;
-  }
-
-  encodeInteger(value) {
-    var code;
-
-    if (value >= -107 && value <= 107) {
-      code = [value + 139];
-    } else if (value >= 108 && value <= 1131) {
-      value = value - 108;
-      code = [(value >> 8) + 247, value & 0xff];
-    } else if (value >= -1131 && value <= -108) {
-      value = -value - 108;
-      code = [(value >> 8) + 251, value & 0xff];
-    } else if (value >= -32768 && value <= 32767) {
-      code = [0x1c, value >> 8 & 0xff, value & 0xff];
-    } else {
-      code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
-    }
-
-    return code;
-  }
-
-  compileHeader(header) {
-    return [header.major, header.minor, header.hdrSize, header.offSize];
-  }
-
-  compileNameIndex(names) {
-    var nameIndex = new CFFIndex();
-
-    for (var i = 0, ii = names.length; i < ii; ++i) {
-      var name = names[i];
-      var length = Math.min(name.length, 127);
-      var sanitizedName = new Array(length);
-
-      for (var j = 0; j < length; j++) {
-        var char = name[j];
-
-        if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char 
=== "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
-          char = "_";
-        }
-
-        sanitizedName[j] = char;
-      }
-
-      sanitizedName = sanitizedName.join("");
-
-      if (sanitizedName === "") {
-        sanitizedName = "Bad_Font_Name";
-      }
-
-      nameIndex.add((0, _util.stringToBytes)(sanitizedName));
-    }
-
-    return this.compileIndex(nameIndex);
-  }
-
-  compileTopDicts(dicts, length, removeCidKeys) {
-    var fontDictTrackers = [];
-    var fdArrayIndex = new CFFIndex();
-
-    for (var i = 0, ii = dicts.length; i < ii; ++i) {
-      var fontDict = dicts[i];
-
-      if (removeCidKeys) {
-        fontDict.removeByName("CIDFontVersion");
-        fontDict.removeByName("CIDFontRevision");
-        fontDict.removeByName("CIDFontType");
-        fontDict.removeByName("CIDCount");
-        fontDict.removeByName("UIDBase");
-      }
-
-      var fontDictTracker = new CFFOffsetTracker();
-      var fontDictData = this.compileDict(fontDict, fontDictTracker);
-      fontDictTrackers.push(fontDictTracker);
-      fdArrayIndex.add(fontDictData);
-      fontDictTracker.offset(length);
-    }
-
-    fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
-    return {
-      trackers: fontDictTrackers,
-      output: fdArrayIndex
-    };
-  }
-
-  compilePrivateDicts(dicts, trackers, output) {
-    for (var i = 0, ii = dicts.length; i < ii; ++i) {
-      var fontDict = dicts[i];
-      var privateDict = fontDict.privateDict;
-
-      if (!privateDict || !fontDict.hasName("Private")) {
-        throw new _util.FormatError("There must be a private dictionary.");
-      }
-
-      var privateDictTracker = new CFFOffsetTracker();
-      var privateDictData = this.compileDict(privateDict, privateDictTracker);
-      var outputLength = output.length;
-      privateDictTracker.offset(outputLength);
-
-      if (!privateDictData.length) {
-        outputLength = 0;
-      }
-
-      trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
-      output.add(privateDictData);
-
-      if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
-        var subrs = this.compileIndex(privateDict.subrsIndex);
-        privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
-        output.add(subrs);
-      }
-    }
-  }
-
-  compileDict(dict, offsetTracker) {
-    var out = [];
-    var order = dict.order;
-
-    for (var i = 0; i < order.length; ++i) {
-      var key = order[i];
-
-      if (!(key in dict.values)) {
-        continue;
-      }
-
-      var values = dict.values[key];
-      var types = dict.types[key];
-
-      if (!Array.isArray(types)) {
-        types = [types];
-      }
-
-      if (!Array.isArray(values)) {
-        values = [values];
-      }
-
-      if (values.length === 0) {
-        continue;
-      }
-
-      for (var j = 0, jj = types.length; j < jj; ++j) {
-        var type = types[j];
-        var value = values[j];
-
-        switch (type) {
-          case "num":
-          case "sid":
-            out = out.concat(this.encodeNumber(value));
-            break;
-
-          case "offset":
-            var name = dict.keyToNameMap[key];
-
-            if (!offsetTracker.isTracking(name)) {
-              offsetTracker.track(name, out.length);
-            }
-
-            out = out.concat([0x1d, 0, 0, 0, 0]);
-            break;
-
-          case "array":
-          case "delta":
-            out = out.concat(this.encodeNumber(value));
-
-            for (var k = 1, kk = values.length; k < kk; ++k) {
-              out = out.concat(this.encodeNumber(values[k]));
-            }
-
-            break;
-
-          default:
-            throw new _util.FormatError(`Unknown data type of ${type}`);
-        }
-      }
-
-      out = out.concat(dict.opcodes[key]);
-    }
-
-    return out;
-  }
-
-  compileStringIndex(strings) {
-    var stringIndex = new CFFIndex();
-
-    for (var i = 0, ii = strings.length; i < ii; ++i) {
-      stringIndex.add((0, _util.stringToBytes)(strings[i]));
-    }
-
-    return this.compileIndex(stringIndex);
-  }
-
-  compileGlobalSubrIndex() {
-    var globalSubrIndex = this.cff.globalSubrIndex;
-    this.out.writeByteArray(this.compileIndex(globalSubrIndex));
-  }
-
-  compileCharStrings(charStrings) {
-    var charStringsIndex = new CFFIndex();
-
-    for (var i = 0; i < charStrings.count; i++) {
-      var glyph = charStrings.get(i);
-
-      if (glyph.length === 0) {
-        charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
-        continue;
-      }
-
-      charStringsIndex.add(glyph);
-    }
-
-    return this.compileIndex(charStringsIndex);
-  }
-
-  compileCharset(charset, numGlyphs, strings, isCIDFont) {
-    let out;
-    const numGlyphsLessNotDef = numGlyphs - 1;
-
-    if (isCIDFont) {
-      out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);
-    } else {
-      const length = 1 + numGlyphsLessNotDef * 2;
-      out = new Uint8Array(length);
-      out[0] = 0;
-      let charsetIndex = 0;
-      const numCharsets = charset.charset.length;
-      let warned = false;
-
-      for (let i = 1; i < out.length; i += 2) {
-        let sid = 0;
-
-        if (charsetIndex < numCharsets) {
-          const name = charset.charset[charsetIndex++];
-          sid = strings.getSID(name);
-
-          if (sid === -1) {
-            sid = 0;
-
-            if (!warned) {
-              warned = true;
-              (0, _util.warn)(`Couldn't find ${name} in CFF strings`);
-            }
-          }
-        }
-
-        out[i] = sid >> 8 & 0xff;
-        out[i + 1] = sid & 0xff;
-      }
-    }
-
-    return this.compileTypedArray(out);
-  }
-
-  compileEncoding(encoding) {
-    return this.compileTypedArray(encoding.raw);
-  }
-
-  compileFDSelect(fdSelect) {
-    const format = fdSelect.format;
-    let out, i;
-
-    switch (format) {
-      case 0:
-        out = new Uint8Array(1 + fdSelect.fdSelect.length);
-        out[0] = format;
-
-        for (i = 0; i < fdSelect.fdSelect.length; i++) {
-          out[i + 1] = fdSelect.fdSelect[i];
-        }
-
-        break;
-
-      case 3:
-        const start = 0;
-        let lastFD = fdSelect.fdSelect[0];
-        const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
-
-        for (i = 1; i < fdSelect.fdSelect.length; i++) {
-          const currentFD = fdSelect.fdSelect[i];
-
-          if (currentFD !== lastFD) {
-            ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
-            lastFD = currentFD;
-          }
-        }
-
-        const numRanges = (ranges.length - 3) / 3;
-        ranges[1] = numRanges >> 8 & 0xff;
-        ranges[2] = numRanges & 0xff;
-        ranges.push(i >> 8 & 0xff, i & 0xff);
-        out = new Uint8Array(ranges);
-        break;
-    }
-
-    return this.compileTypedArray(out);
-  }
-
-  compileTypedArray(data) {
-    var out = [];
-
-    for (var i = 0, ii = data.length; i < ii; ++i) {
-      out[i] = data[i];
-    }
-
-    return out;
-  }
-
-  compileIndex(index, trackers = []) {
-    var objects = index.objects;
-    var count = objects.length;
-
-    if (count === 0) {
-      return [0, 0, 0];
-    }
-
-    var data = [count >> 8 & 0xff, count & 0xff];
-    var lastOffset = 1,
-        i;
-
-    for (i = 0; i < count; ++i) {
-      lastOffset += objects[i].length;
-    }
-
-    var offsetSize;
-
-    if (lastOffset < 0x100) {
-      offsetSize = 1;
-    } else if (lastOffset < 0x10000) {
-      offsetSize = 2;
-    } else if (lastOffset < 0x1000000) {
-      offsetSize = 3;
-    } else {
-      offsetSize = 4;
-    }
-
-    data.push(offsetSize);
-    var relativeOffset = 1;
-
-    for (i = 0; i < count + 1; i++) {
-      if (offsetSize === 1) {
-        data.push(relativeOffset & 0xff);
-      } else if (offsetSize === 2) {
-        data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
-      } else if (offsetSize === 3) {
-        data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
-      } else {
-        data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, 
relativeOffset & 0xff);
-      }
-
-      if (objects[i]) {
-        relativeOffset += objects[i].length;
-      }
-    }
-
-    for (i = 0; i < count; i++) {
-      if (trackers[i]) {
-        trackers[i].offset(data.length);
-      }
-
-      for (var j = 0, jj = objects[i].length; j < jj; j++) {
-        data.push(objects[i][j]);
-      }
-    }
-
-    return data;
-  }
-
-}
-
-exports.CFFCompiler = CFFCompiler;
-
-/***/ }),
-/* 32 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ExpertSubsetCharset = exports.ExpertCharset = exports.ISOAdobeCharset = void 0;
-const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", 
"currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", 
"endash", "dagger", "daggerdbl", "periodcentered", "paragrap
 h", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", 
"perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", 
"dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", 
"Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", 
"logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", 
"degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", 
"copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", 
"Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", 
"Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", 
"Yacute", "Ydieresis", "Zcaron", "aacute", "acircumf
 lex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", 
"iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", 
"otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"];
-exports.ISOAdobeCharset = ISOAdobeCharset;
-const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", 
"dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", 
"twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", 
"twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", 
"eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", 
"periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", 
"isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", 
"fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", 
"Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", 
"Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsma
 ll", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", 
"onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", 
"Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", 
"hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", 
"questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", 
"zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", 
"sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", 
"threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", 
"nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", 
"Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Ari
 ngsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", 
"Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", 
"Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", 
"Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
-exports.ExpertCharset = ExpertCharset;
-const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", 
"threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", 
"isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", 
"fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", 
"onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", 
"threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", 
"zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursupe
 rior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", 
"oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", 
"seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", 
"commainferior"];
-exports.ExpertSubsetCharset = ExpertSubsetCharset;
-
-/***/ }),
-/* 33 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getEncoding = getEncoding;
-exports.ExpertEncoding = exports.ZapfDingbatsEncoding = exports.SymbolSetEncoding = exports.MacRomanEncoding 
= exports.StandardEncoding = exports.WinAnsiEncoding = void 0;
-const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", 
"dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", 
"threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", 
"dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", 
"osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", 
"parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", 
"Bs
 mall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", 
"Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", 
"Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", 
"Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", 
"hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", 
"threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", 
"twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", 
"fivesuperior", "sixsuperior", "sevensuperi
 or", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", 
"fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", 
"centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", 
"Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", 
"Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", 
"Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", 
"Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", 
"Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
-exports.ExpertEncoding = ExpertEncoding;
-const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", 
"dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", 
"parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", 
"zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", 
"sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", 
"questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", 
"threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", 
"fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", 
"Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmal
 l", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", 
"Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", 
"colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", 
"Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", 
"Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", 
"Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", 
"Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", 
"Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", 
"seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", 
"osuperior", "fiveinferior", "", "commainferior", "periodinferior", 
 "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", 
"Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", 
"", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", 
"exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", 
"fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", 
"tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", 
"Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", 
"Dotaccentsmall", "Ringsmall", "", "", "", ""];
-const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", 
"percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", 
"asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", 
"agrave", "acircumflex", "adiere
 sis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", 
"icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", 
"ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", 
"paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", 
"Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", 
"product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", 
"exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", 
"ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", 
"quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", 
"currency", "guilsinglleft", "guilsinglright", "fi", "fl", "dagge
 rdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", 
"Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", 
"apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", 
"dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"];
-exports.MacRomanEncoding = MacRomanEncoding;
-const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", 
"percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", 
"braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "",
  "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", 
"quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", 
"dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", 
"quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", 
"circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", 
"ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", 
"ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", 
"", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""];
-exports.StandardEncoding = StandardEncoding;
-const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", 
"ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", 
"slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", 
"bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", 
"asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", 
"daggerdbl", "circumflex", "perth
 ousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", 
"quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", 
"guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", 
"currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", 
"logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", 
"acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", 
"onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", 
"Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", 
"Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", 
"multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", 
 "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", 
"ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", 
"eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", 
"uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"];
-exports.WinAnsiEncoding = WinAnsiEncoding;
-const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", 
"percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", 
"period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", 
"semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", 
"Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", 
"Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", 
"bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", 
"phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", 
"sigma", "tau", "upsilon", "omega1", "omega", "xi",
  "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", 
"minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", 
"arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", 
"multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", 
"ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", 
"circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", 
"notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", 
"copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", 
"arrowdblboth", "arrowdblleft", "arrowdb
 lup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", 
"trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", 
"bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", 
"integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", 
"bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""];
-exports.SymbolSetEncoding = SymbolSetEncoding;
-const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", 
"a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", 
"a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", 
"a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", 
"a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", 
"a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", 
"a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", 
"a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "
 ", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", 
"a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", 
"a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", 
"a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", 
"a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", 
"a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", 
"a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", 
"a189", "a190", "a191", ""];
-exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;
-
-function getEncoding(encodingName) {
-  switch (encodingName) {
-    case "WinAnsiEncoding":
-      return WinAnsiEncoding;
-
-    case "StandardEncoding":
-      return StandardEncoding;
-
-    case "MacRomanEncoding":
-      return MacRomanEncoding;
-
-    case "SymbolSetEncoding":
-      return SymbolSetEncoding;
-
-    case "ZapfDingbatsEncoding":
-      return ZapfDingbatsEncoding;
-
-    case "ExpertEncoding":
-      return ExpertEncoding;
-
-    case "MacExpertEncoding":
-      return MacExpertEncoding;
-
-    default:
-      return null;
-  }
-}
-
-/***/ }),
-/* 34 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-var getLookupTableFactory = __w_pdfjs_require__(8).getLookupTableFactory;
-var getGlyphsUnicode = getLookupTableFactory(function (t) {
- t.A = 0x0041;
- t.AE = 0x00c6;
- t.AEacute = 0x01fc;
- t.AEmacron = 0x01e2;
- t.AEsmall = 0xf7e6;
- t.Aacute = 0x00c1;
- t.Aacutesmall = 0xf7e1;
- t.Abreve = 0x0102;
- t.Abreveacute = 0x1eae;
- t.Abrevecyrillic = 0x04d0;
- t.Abrevedotbelow = 0x1eb6;
- t.Abrevegrave = 0x1eb0;
- t.Abrevehookabove = 0x1eb2;
- t.Abrevetilde = 0x1eb4;
- t.Acaron = 0x01cd;
- t.Acircle = 0x24b6;
- t.Acircumflex = 0x00c2;
- t.Acircumflexacute = 0x1ea4;
- t.Acircumflexdotbelow = 0x1eac;
- t.Acircumflexgrave = 0x1ea6;
- t.Acircumflexhookabove = 0x1ea8;
- t.Acircumflexsmall = 0xf7e2;
- t.Acircumflextilde = 0x1eaa;
- t.Acute = 0xf6c9;
- t.Acutesmall = 0xf7b4;
- t.Acyrillic = 0x0410;
- t.Adblgrave = 0x0200;
- t.Adieresis = 0x00c4;
- t.Adieresiscyrillic = 0x04d2;
- t.Adieresismacron = 0x01de;
- t.Adieresissmall = 0xf7e4;
- t.Adotbelow = 0x1ea0;
- t.Adotmacron = 0x01e0;
- t.Agrave = 0x00c0;
- t.Agravesmall = 0xf7e0;
- t.Ahookabove = 0x1ea2;
- t.Aiecyrillic = 0x04d4;
- t.Ainvertedbreve = 0x0202;
- t.Alpha = 0x0391;
- t.Alphatonos = 0x0386;
- t.Amacron = 0x0100;
- t.Amonospace = 0xff21;
- t.Aogonek = 0x0104;
- t.Aring = 0x00c5;
- t.Aringacute = 0x01fa;
- t.Aringbelow = 0x1e00;
- t.Aringsmall = 0xf7e5;
- t.Asmall = 0xf761;
- t.Atilde = 0x00c3;
- t.Atildesmall = 0xf7e3;
- t.Aybarmenian = 0x0531;
- t.B = 0x0042;
- t.Bcircle = 0x24b7;
- t.Bdotaccent = 0x1e02;
- t.Bdotbelow = 0x1e04;
- t.Becyrillic = 0x0411;
- t.Benarmenian = 0x0532;
- t.Beta = 0x0392;
- t.Bhook = 0x0181;
- t.Blinebelow = 0x1e06;
- t.Bmonospace = 0xff22;
- t.Brevesmall = 0xf6f4;
- t.Bsmall = 0xf762;
- t.Btopbar = 0x0182;
- t.C = 0x0043;
- t.Caarmenian = 0x053e;
- t.Cacute = 0x0106;
- t.Caron = 0xf6ca;
- t.Caronsmall = 0xf6f5;
- t.Ccaron = 0x010c;
- t.Ccedilla = 0x00c7;
- t.Ccedillaacute = 0x1e08;
- t.Ccedillasmall = 0xf7e7;
- t.Ccircle = 0x24b8;
- t.Ccircumflex = 0x0108;
- t.Cdot = 0x010a;
- t.Cdotaccent = 0x010a;
- t.Cedillasmall = 0xf7b8;
- t.Chaarmenian = 0x0549;
- t.Cheabkhasiancyrillic = 0x04bc;
- t.Checyrillic = 0x0427;
- t.Chedescenderabkhasiancyrillic = 0x04be;
- t.Chedescendercyrillic = 0x04b6;
- t.Chedieresiscyrillic = 0x04f4;
- t.Cheharmenian = 0x0543;
- t.Chekhakassiancyrillic = 0x04cb;
- t.Cheverticalstrokecyrillic = 0x04b8;
- t.Chi = 0x03a7;
- t.Chook = 0x0187;
- t.Circumflexsmall = 0xf6f6;
- t.Cmonospace = 0xff23;
- t.Coarmenian = 0x0551;
- t.Csmall = 0xf763;
- t.D = 0x0044;
- t.DZ = 0x01f1;
- t.DZcaron = 0x01c4;
- t.Daarmenian = 0x0534;
- t.Dafrican = 0x0189;
- t.Dcaron = 0x010e;
- t.Dcedilla = 0x1e10;
- t.Dcircle = 0x24b9;
- t.Dcircumflexbelow = 0x1e12;
- t.Dcroat = 0x0110;
- t.Ddotaccent = 0x1e0a;
- t.Ddotbelow = 0x1e0c;
- t.Decyrillic = 0x0414;
- t.Deicoptic = 0x03ee;
- t.Delta = 0x2206;
- t.Deltagreek = 0x0394;
- t.Dhook = 0x018a;
- t.Dieresis = 0xf6cb;
- t.DieresisAcute = 0xf6cc;
- t.DieresisGrave = 0xf6cd;
- t.Dieresissmall = 0xf7a8;
- t.Digammagreek = 0x03dc;
- t.Djecyrillic = 0x0402;
- t.Dlinebelow = 0x1e0e;
- t.Dmonospace = 0xff24;
- t.Dotaccentsmall = 0xf6f7;
- t.Dslash = 0x0110;
- t.Dsmall = 0xf764;
- t.Dtopbar = 0x018b;
- t.Dz = 0x01f2;
- t.Dzcaron = 0x01c5;
- t.Dzeabkhasiancyrillic = 0x04e0;
- t.Dzecyrillic = 0x0405;
- t.Dzhecyrillic = 0x040f;
- t.E = 0x0045;
- t.Eacute = 0x00c9;
- t.Eacutesmall = 0xf7e9;
- t.Ebreve = 0x0114;
- t.Ecaron = 0x011a;
- t.Ecedillabreve = 0x1e1c;
- t.Echarmenian = 0x0535;
- t.Ecircle = 0x24ba;
- t.Ecircumflex = 0x00ca;
- t.Ecircumflexacute = 0x1ebe;
- t.Ecircumflexbelow = 0x1e18;
- t.Ecircumflexdotbelow = 0x1ec6;
- t.Ecircumflexgrave = 0x1ec0;
- t.Ecircumflexhookabove = 0x1ec2;
- t.Ecircumflexsmall = 0xf7ea;
- t.Ecircumflextilde = 0x1ec4;
- t.Ecyrillic = 0x0404;
- t.Edblgrave = 0x0204;
- t.Edieresis = 0x00cb;
- t.Edieresissmall = 0xf7eb;
- t.Edot = 0x0116;
- t.Edotaccent = 0x0116;
- t.Edotbelow = 0x1eb8;
- t.Efcyrillic = 0x0424;
- t.Egrave = 0x00c8;
- t.Egravesmall = 0xf7e8;
- t.Eharmenian = 0x0537;
- t.Ehookabove = 0x1eba;
- t.Eightroman = 0x2167;
- t.Einvertedbreve = 0x0206;
- t.Eiotifiedcyrillic = 0x0464;
- t.Elcyrillic = 0x041b;
- t.Elevenroman = 0x216a;
- t.Emacron = 0x0112;
- t.Emacronacute = 0x1e16;
- t.Emacrongrave = 0x1e14;
- t.Emcyrillic = 0x041c;
- t.Emonospace = 0xff25;
- t.Encyrillic = 0x041d;
- t.Endescendercyrillic = 0x04a2;
- t.Eng = 0x014a;
- t.Enghecyrillic = 0x04a4;
- t.Enhookcyrillic = 0x04c7;
- t.Eogonek = 0x0118;
- t.Eopen = 0x0190;
- t.Epsilon = 0x0395;
- t.Epsilontonos = 0x0388;
- t.Ercyrillic = 0x0420;
- t.Ereversed = 0x018e;
- t.Ereversedcyrillic = 0x042d;
- t.Escyrillic = 0x0421;
- t.Esdescendercyrillic = 0x04aa;
- t.Esh = 0x01a9;
- t.Esmall = 0xf765;
- t.Eta = 0x0397;
- t.Etarmenian = 0x0538;
- t.Etatonos = 0x0389;
- t.Eth = 0x00d0;
- t.Ethsmall = 0xf7f0;
- t.Etilde = 0x1ebc;
- t.Etildebelow = 0x1e1a;
- t.Euro = 0x20ac;
- t.Ezh = 0x01b7;
- t.Ezhcaron = 0x01ee;
- t.Ezhreversed = 0x01b8;
- t.F = 0x0046;
- t.Fcircle = 0x24bb;
- t.Fdotaccent = 0x1e1e;
- t.Feharmenian = 0x0556;
- t.Feicoptic = 0x03e4;
- t.Fhook = 0x0191;
- t.Fitacyrillic = 0x0472;
- t.Fiveroman = 0x2164;
- t.Fmonospace = 0xff26;
- t.Fourroman = 0x2163;
- t.Fsmall = 0xf766;
- t.G = 0x0047;
- t.GBsquare = 0x3387;
- t.Gacute = 0x01f4;
- t.Gamma = 0x0393;
- t.Gammaafrican = 0x0194;
- t.Gangiacoptic = 0x03ea;
- t.Gbreve = 0x011e;
- t.Gcaron = 0x01e6;
- t.Gcedilla = 0x0122;
- t.Gcircle = 0x24bc;
- t.Gcircumflex = 0x011c;
- t.Gcommaaccent = 0x0122;
- t.Gdot = 0x0120;
- t.Gdotaccent = 0x0120;
- t.Gecyrillic = 0x0413;
- t.Ghadarmenian = 0x0542;
- t.Ghemiddlehookcyrillic = 0x0494;
- t.Ghestrokecyrillic = 0x0492;
- t.Gheupturncyrillic = 0x0490;
- t.Ghook = 0x0193;
- t.Gimarmenian = 0x0533;
- t.Gjecyrillic = 0x0403;
- t.Gmacron = 0x1e20;
- t.Gmonospace = 0xff27;
- t.Grave = 0xf6ce;
- t.Gravesmall = 0xf760;
- t.Gsmall = 0xf767;
- t.Gsmallhook = 0x029b;
- t.Gstroke = 0x01e4;
- t.H = 0x0048;
- t.H18533 = 0x25cf;
- t.H18543 = 0x25aa;
- t.H18551 = 0x25ab;
- t.H22073 = 0x25a1;
- t.HPsquare = 0x33cb;
- t.Haabkhasiancyrillic = 0x04a8;
- t.Hadescendercyrillic = 0x04b2;
- t.Hardsigncyrillic = 0x042a;
- t.Hbar = 0x0126;
- t.Hbrevebelow = 0x1e2a;
- t.Hcedilla = 0x1e28;
- t.Hcircle = 0x24bd;
- t.Hcircumflex = 0x0124;
- t.Hdieresis = 0x1e26;
- t.Hdotaccent = 0x1e22;
- t.Hdotbelow = 0x1e24;
- t.Hmonospace = 0xff28;
- t.Hoarmenian = 0x0540;
- t.Horicoptic = 0x03e8;
- t.Hsmall = 0xf768;
- t.Hungarumlaut = 0xf6cf;
- t.Hungarumlautsmall = 0xf6f8;
- t.Hzsquare = 0x3390;
- t.I = 0x0049;
- t.IAcyrillic = 0x042f;
- t.IJ = 0x0132;
- t.IUcyrillic = 0x042e;
- t.Iacute = 0x00cd;
- t.Iacutesmall = 0xf7ed;
- t.Ibreve = 0x012c;
- t.Icaron = 0x01cf;
- t.Icircle = 0x24be;
- t.Icircumflex = 0x00ce;
- t.Icircumflexsmall = 0xf7ee;
- t.Icyrillic = 0x0406;
- t.Idblgrave = 0x0208;
- t.Idieresis = 0x00cf;
- t.Idieresisacute = 0x1e2e;
- t.Idieresiscyrillic = 0x04e4;
- t.Idieresissmall = 0xf7ef;
- t.Idot = 0x0130;
- t.Idotaccent = 0x0130;
- t.Idotbelow = 0x1eca;
- t.Iebrevecyrillic = 0x04d6;
- t.Iecyrillic = 0x0415;
- t.Ifraktur = 0x2111;
- t.Igrave = 0x00cc;
- t.Igravesmall = 0xf7ec;
- t.Ihookabove = 0x1ec8;
- t.Iicyrillic = 0x0418;
- t.Iinvertedbreve = 0x020a;
- t.Iishortcyrillic = 0x0419;
- t.Imacron = 0x012a;
- t.Imacroncyrillic = 0x04e2;
- t.Imonospace = 0xff29;
- t.Iniarmenian = 0x053b;
- t.Iocyrillic = 0x0401;
- t.Iogonek = 0x012e;
- t.Iota = 0x0399;
- t.Iotaafrican = 0x0196;
- t.Iotadieresis = 0x03aa;
- t.Iotatonos = 0x038a;
- t.Ismall = 0xf769;
- t.Istroke = 0x0197;
- t.Itilde = 0x0128;
- t.Itildebelow = 0x1e2c;
- t.Izhitsacyrillic = 0x0474;
- t.Izhitsadblgravecyrillic = 0x0476;
- t.J = 0x004a;
- t.Jaarmenian = 0x0541;
- t.Jcircle = 0x24bf;
- t.Jcircumflex = 0x0134;
- t.Jecyrillic = 0x0408;
- t.Jheharmenian = 0x054b;
- t.Jmonospace = 0xff2a;
- t.Jsmall = 0xf76a;
- t.K = 0x004b;
- t.KBsquare = 0x3385;
- t.KKsquare = 0x33cd;
- t.Kabashkircyrillic = 0x04a0;
- t.Kacute = 0x1e30;
- t.Kacyrillic = 0x041a;
- t.Kadescendercyrillic = 0x049a;
- t.Kahookcyrillic = 0x04c3;
- t.Kappa = 0x039a;
- t.Kastrokecyrillic = 0x049e;
- t.Kaverticalstrokecyrillic = 0x049c;
- t.Kcaron = 0x01e8;
- t.Kcedilla = 0x0136;
- t.Kcircle = 0x24c0;
- t.Kcommaaccent = 0x0136;
- t.Kdotbelow = 0x1e32;
- t.Keharmenian = 0x0554;
- t.Kenarmenian = 0x053f;
- t.Khacyrillic = 0x0425;
- t.Kheicoptic = 0x03e6;
- t.Khook = 0x0198;
- t.Kjecyrillic = 0x040c;
- t.Klinebelow = 0x1e34;
- t.Kmonospace = 0xff2b;
- t.Koppacyrillic = 0x0480;
- t.Koppagreek = 0x03de;
- t.Ksicyrillic = 0x046e;
- t.Ksmall = 0xf76b;
- t.L = 0x004c;
- t.LJ = 0x01c7;
- t.LL = 0xf6bf;
- t.Lacute = 0x0139;
- t.Lambda = 0x039b;
- t.Lcaron = 0x013d;
- t.Lcedilla = 0x013b;
- t.Lcircle = 0x24c1;
- t.Lcircumflexbelow = 0x1e3c;
- t.Lcommaaccent = 0x013b;
- t.Ldot = 0x013f;
- t.Ldotaccent = 0x013f;
- t.Ldotbelow = 0x1e36;
- t.Ldotbelowmacron = 0x1e38;
- t.Liwnarmenian = 0x053c;
- t.Lj = 0x01c8;
- t.Ljecyrillic = 0x0409;
- t.Llinebelow = 0x1e3a;
- t.Lmonospace = 0xff2c;
- t.Lslash = 0x0141;
- t.Lslashsmall = 0xf6f9;
- t.Lsmall = 0xf76c;
- t.M = 0x004d;
- t.MBsquare = 0x3386;
- t.Macron = 0xf6d0;
- t.Macronsmall = 0xf7af;
- t.Macute = 0x1e3e;
- t.Mcircle = 0x24c2;
- t.Mdotaccent = 0x1e40;
- t.Mdotbelow = 0x1e42;
- t.Menarmenian = 0x0544;
- t.Mmonospace = 0xff2d;
- t.Msmall = 0xf76d;
- t.Mturned = 0x019c;
- t.Mu = 0x039c;
- t.N = 0x004e;
- t.NJ = 0x01ca;
- t.Nacute = 0x0143;
- t.Ncaron = 0x0147;
- t.Ncedilla = 0x0145;
- t.Ncircle = 0x24c3;
- t.Ncircumflexbelow = 0x1e4a;
- t.Ncommaaccent = 0x0145;
- t.Ndotaccent = 0x1e44;
- t.Ndotbelow = 0x1e46;
- t.Nhookleft = 0x019d;
- t.Nineroman = 0x2168;
- t.Nj = 0x01cb;
- t.Njecyrillic = 0x040a;
- t.Nlinebelow = 0x1e48;
- t.Nmonospace = 0xff2e;
- t.Nowarmenian = 0x0546;
- t.Nsmall = 0xf76e;
- t.Ntilde = 0x00d1;
- t.Ntildesmall = 0xf7f1;
- t.Nu = 0x039d;
- t.O = 0x004f;
- t.OE = 0x0152;
- t.OEsmall = 0xf6fa;
- t.Oacute = 0x00d3;
- t.Oacutesmall = 0xf7f3;
- t.Obarredcyrillic = 0x04e8;
- t.Obarreddieresiscyrillic = 0x04ea;
- t.Obreve = 0x014e;
- t.Ocaron = 0x01d1;
- t.Ocenteredtilde = 0x019f;
- t.Ocircle = 0x24c4;
- t.Ocircumflex = 0x00d4;
- t.Ocircumflexacute = 0x1ed0;
- t.Ocircumflexdotbelow = 0x1ed8;
- t.Ocircumflexgrave = 0x1ed2;
- t.Ocircumflexhookabove = 0x1ed4;
- t.Ocircumflexsmall = 0xf7f4;
- t.Ocircumflextilde = 0x1ed6;
- t.Ocyrillic = 0x041e;
- t.Odblacute = 0x0150;
- t.Odblgrave = 0x020c;
- t.Odieresis = 0x00d6;
- t.Odieresiscyrillic = 0x04e6;
- t.Odieresissmall = 0xf7f6;
- t.Odotbelow = 0x1ecc;
- t.Ogoneksmall = 0xf6fb;
- t.Ograve = 0x00d2;
- t.Ogravesmall = 0xf7f2;
- t.Oharmenian = 0x0555;
- t.Ohm = 0x2126;
- t.Ohookabove = 0x1ece;
- t.Ohorn = 0x01a0;
- t.Ohornacute = 0x1eda;
- t.Ohorndotbelow = 0x1ee2;
- t.Ohorngrave = 0x1edc;
- t.Ohornhookabove = 0x1ede;
- t.Ohorntilde = 0x1ee0;
- t.Ohungarumlaut = 0x0150;
- t.Oi = 0x01a2;
- t.Oinvertedbreve = 0x020e;
- t.Omacron = 0x014c;
- t.Omacronacute = 0x1e52;
- t.Omacrongrave = 0x1e50;
- t.Omega = 0x2126;
- t.Omegacyrillic = 0x0460;
- t.Omegagreek = 0x03a9;
- t.Omegaroundcyrillic = 0x047a;
- t.Omegatitlocyrillic = 0x047c;
- t.Omegatonos = 0x038f;
- t.Omicron = 0x039f;
- t.Omicrontonos = 0x038c;
- t.Omonospace = 0xff2f;
- t.Oneroman = 0x2160;
- t.Oogonek = 0x01ea;
- t.Oogonekmacron = 0x01ec;
- t.Oopen = 0x0186;
- t.Oslash = 0x00d8;
- t.Oslashacute = 0x01fe;
- t.Oslashsmall = 0xf7f8;
- t.Osmall = 0xf76f;
- t.Ostrokeacute = 0x01fe;
- t.Otcyrillic = 0x047e;
- t.Otilde = 0x00d5;
- t.Otildeacute = 0x1e4c;
- t.Otildedieresis = 0x1e4e;
- t.Otildesmall = 0xf7f5;
- t.P = 0x0050;
- t.Pacute = 0x1e54;
- t.Pcircle = 0x24c5;
- t.Pdotaccent = 0x1e56;
- t.Pecyrillic = 0x041f;
- t.Peharmenian = 0x054a;
- t.Pemiddlehookcyrillic = 0x04a6;
- t.Phi = 0x03a6;
- t.Phook = 0x01a4;
- t.Pi = 0x03a0;
- t.Piwrarmenian = 0x0553;
- t.Pmonospace = 0xff30;
- t.Psi = 0x03a8;
- t.Psicyrillic = 0x0470;
- t.Psmall = 0xf770;
- t.Q = 0x0051;
- t.Qcircle = 0x24c6;
- t.Qmonospace = 0xff31;
- t.Qsmall = 0xf771;
- t.R = 0x0052;
- t.Raarmenian = 0x054c;
- t.Racute = 0x0154;
- t.Rcaron = 0x0158;
- t.Rcedilla = 0x0156;
- t.Rcircle = 0x24c7;
- t.Rcommaaccent = 0x0156;
- t.Rdblgrave = 0x0210;
- t.Rdotaccent = 0x1e58;
- t.Rdotbelow = 0x1e5a;
- t.Rdotbelowmacron = 0x1e5c;
- t.Reharmenian = 0x0550;
- t.Rfraktur = 0x211c;
- t.Rho = 0x03a1;
- t.Ringsmall = 0xf6fc;
- t.Rinvertedbreve = 0x0212;
- t.Rlinebelow = 0x1e5e;
- t.Rmonospace = 0xff32;
- t.Rsmall = 0xf772;
- t.Rsmallinverted = 0x0281;
- t.Rsmallinvertedsuperior = 0x02b6;
- t.S = 0x0053;
- t.SF010000 = 0x250c;
- t.SF020000 = 0x2514;
- t.SF030000 = 0x2510;
- t.SF040000 = 0x2518;
- t.SF050000 = 0x253c;
- t.SF060000 = 0x252c;
- t.SF070000 = 0x2534;
- t.SF080000 = 0x251c;
- t.SF090000 = 0x2524;
- t.SF100000 = 0x2500;
- t.SF110000 = 0x2502;
- t.SF190000 = 0x2561;
- t.SF200000 = 0x2562;
- t.SF210000 = 0x2556;
- t.SF220000 = 0x2555;
- t.SF230000 = 0x2563;
- t.SF240000 = 0x2551;
- t.SF250000 = 0x2557;
- t.SF260000 = 0x255d;
- t.SF270000 = 0x255c;
- t.SF280000 = 0x255b;
- t.SF360000 = 0x255e;
- t.SF370000 = 0x255f;
- t.SF380000 = 0x255a;
- t.SF390000 = 0x2554;
- t.SF400000 = 0x2569;
- t.SF410000 = 0x2566;
- t.SF420000 = 0x2560;
- t.SF430000 = 0x2550;
- t.SF440000 = 0x256c;
- t.SF450000 = 0x2567;
- t.SF460000 = 0x2568;
- t.SF470000 = 0x2564;
- t.SF480000 = 0x2565;
- t.SF490000 = 0x2559;
- t.SF500000 = 0x2558;
- t.SF510000 = 0x2552;
- t.SF520000 = 0x2553;
- t.SF530000 = 0x256b;
- t.SF540000 = 0x256a;
- t.Sacute = 0x015a;
- t.Sacutedotaccent = 0x1e64;
- t.Sampigreek = 0x03e0;
- t.Scaron = 0x0160;
- t.Scarondotaccent = 0x1e66;
- t.Scaronsmall = 0xf6fd;
- t.Scedilla = 0x015e;
- t.Schwa = 0x018f;
- t.Schwacyrillic = 0x04d8;
- t.Schwadieresiscyrillic = 0x04da;
- t.Scircle = 0x24c8;
- t.Scircumflex = 0x015c;
- t.Scommaaccent = 0x0218;
- t.Sdotaccent = 0x1e60;
- t.Sdotbelow = 0x1e62;
- t.Sdotbelowdotaccent = 0x1e68;
- t.Seharmenian = 0x054d;
- t.Sevenroman = 0x2166;
- t.Shaarmenian = 0x0547;
- t.Shacyrillic = 0x0428;
- t.Shchacyrillic = 0x0429;
- t.Sheicoptic = 0x03e2;
- t.Shhacyrillic = 0x04ba;
- t.Shimacoptic = 0x03ec;
- t.Sigma = 0x03a3;
- t.Sixroman = 0x2165;
- t.Smonospace = 0xff33;
- t.Softsigncyrillic = 0x042c;
- t.Ssmall = 0xf773;
- t.Stigmagreek = 0x03da;
- t.T = 0x0054;
- t.Tau = 0x03a4;
- t.Tbar = 0x0166;
- t.Tcaron = 0x0164;
- t.Tcedilla = 0x0162;
- t.Tcircle = 0x24c9;
- t.Tcircumflexbelow = 0x1e70;
- t.Tcommaaccent = 0x0162;
- t.Tdotaccent = 0x1e6a;
- t.Tdotbelow = 0x1e6c;
- t.Tecyrillic = 0x0422;
- t.Tedescendercyrillic = 0x04ac;
- t.Tenroman = 0x2169;
- t.Tetsecyrillic = 0x04b4;
- t.Theta = 0x0398;
- t.Thook = 0x01ac;
- t.Thorn = 0x00de;
- t.Thornsmall = 0xf7fe;
- t.Threeroman = 0x2162;
- t.Tildesmall = 0xf6fe;
- t.Tiwnarmenian = 0x054f;
- t.Tlinebelow = 0x1e6e;
- t.Tmonospace = 0xff34;
- t.Toarmenian = 0x0539;
- t.Tonefive = 0x01bc;
- t.Tonesix = 0x0184;
- t.Tonetwo = 0x01a7;
- t.Tretroflexhook = 0x01ae;
- t.Tsecyrillic = 0x0426;
- t.Tshecyrillic = 0x040b;
- t.Tsmall = 0xf774;
- t.Twelveroman = 0x216b;
- t.Tworoman = 0x2161;
- t.U = 0x0055;
- t.Uacute = 0x00da;
- t.Uacutesmall = 0xf7fa;
- t.Ubreve = 0x016c;
- t.Ucaron = 0x01d3;
- t.Ucircle = 0x24ca;
- t.Ucircumflex = 0x00db;
- t.Ucircumflexbelow = 0x1e76;
- t.Ucircumflexsmall = 0xf7fb;
- t.Ucyrillic = 0x0423;
- t.Udblacute = 0x0170;
- t.Udblgrave = 0x0214;
- t.Udieresis = 0x00dc;
- t.Udieresisacute = 0x01d7;
- t.Udieresisbelow = 0x1e72;
- t.Udieresiscaron = 0x01d9;
- t.Udieresiscyrillic = 0x04f0;
- t.Udieresisgrave = 0x01db;
- t.Udieresismacron = 0x01d5;
- t.Udieresissmall = 0xf7fc;
- t.Udotbelow = 0x1ee4;
- t.Ugrave = 0x00d9;
- t.Ugravesmall = 0xf7f9;
- t.Uhookabove = 0x1ee6;
- t.Uhorn = 0x01af;
- t.Uhornacute = 0x1ee8;
- t.Uhorndotbelow = 0x1ef0;
- t.Uhorngrave = 0x1eea;
- t.Uhornhookabove = 0x1eec;
- t.Uhorntilde = 0x1eee;
- t.Uhungarumlaut = 0x0170;
- t.Uhungarumlautcyrillic = 0x04f2;
- t.Uinvertedbreve = 0x0216;
- t.Ukcyrillic = 0x0478;
- t.Umacron = 0x016a;
- t.Umacroncyrillic = 0x04ee;
- t.Umacrondieresis = 0x1e7a;
- t.Umonospace = 0xff35;
- t.Uogonek = 0x0172;
- t.Upsilon = 0x03a5;
- t.Upsilon1 = 0x03d2;
- t.Upsilonacutehooksymbolgreek = 0x03d3;
- t.Upsilonafrican = 0x01b1;
- t.Upsilondieresis = 0x03ab;
- t.Upsilondieresishooksymbolgreek = 0x03d4;
- t.Upsilonhooksymbol = 0x03d2;
- t.Upsilontonos = 0x038e;
- t.Uring = 0x016e;
- t.Ushortcyrillic = 0x040e;
- t.Usmall = 0xf775;
- t.Ustraightcyrillic = 0x04ae;
- t.Ustraightstrokecyrillic = 0x04b0;
- t.Utilde = 0x0168;
- t.Utildeacute = 0x1e78;
- t.Utildebelow = 0x1e74;
- t.V = 0x0056;
- t.Vcircle = 0x24cb;
- t.Vdotbelow = 0x1e7e;
- t.Vecyrillic = 0x0412;
- t.Vewarmenian = 0x054e;
- t.Vhook = 0x01b2;
- t.Vmonospace = 0xff36;
- t.Voarmenian = 0x0548;
- t.Vsmall = 0xf776;
- t.Vtilde = 0x1e7c;
- t.W = 0x0057;
- t.Wacute = 0x1e82;
- t.Wcircle = 0x24cc;
- t.Wcircumflex = 0x0174;
- t.Wdieresis = 0x1e84;
- t.Wdotaccent = 0x1e86;
- t.Wdotbelow = 0x1e88;
- t.Wgrave = 0x1e80;
- t.Wmonospace = 0xff37;
- t.Wsmall = 0xf777;
- t.X = 0x0058;
- t.Xcircle = 0x24cd;
- t.Xdieresis = 0x1e8c;
- t.Xdotaccent = 0x1e8a;
- t.Xeharmenian = 0x053d;
- t.Xi = 0x039e;
- t.Xmonospace = 0xff38;
- t.Xsmall = 0xf778;
- t.Y = 0x0059;
- t.Yacute = 0x00dd;
- t.Yacutesmall = 0xf7fd;
- t.Yatcyrillic = 0x0462;
- t.Ycircle = 0x24ce;
- t.Ycircumflex = 0x0176;
- t.Ydieresis = 0x0178;
- t.Ydieresissmall = 0xf7ff;
- t.Ydotaccent = 0x1e8e;
- t.Ydotbelow = 0x1ef4;
- t.Yericyrillic = 0x042b;
- t.Yerudieresiscyrillic = 0x04f8;
- t.Ygrave = 0x1ef2;
- t.Yhook = 0x01b3;
- t.Yhookabove = 0x1ef6;
- t.Yiarmenian = 0x0545;
- t.Yicyrillic = 0x0407;
- t.Yiwnarmenian = 0x0552;
- t.Ymonospace = 0xff39;
- t.Ysmall = 0xf779;
- t.Ytilde = 0x1ef8;
- t.Yusbigcyrillic = 0x046a;
- t.Yusbigiotifiedcyrillic = 0x046c;
- t.Yuslittlecyrillic = 0x0466;
- t.Yuslittleiotifiedcyrillic = 0x0468;
- t.Z = 0x005a;
- t.Zaarmenian = 0x0536;
- t.Zacute = 0x0179;
- t.Zcaron = 0x017d;
- t.Zcaronsmall = 0xf6ff;
- t.Zcircle = 0x24cf;
- t.Zcircumflex = 0x1e90;
- t.Zdot = 0x017b;
- t.Zdotaccent = 0x017b;
- t.Zdotbelow = 0x1e92;
- t.Zecyrillic = 0x0417;
- t.Zedescendercyrillic = 0x0498;
- t.Zedieresiscyrillic = 0x04de;
- t.Zeta = 0x0396;
- t.Zhearmenian = 0x053a;
- t.Zhebrevecyrillic = 0x04c1;
- t.Zhecyrillic = 0x0416;
- t.Zhedescendercyrillic = 0x0496;
- t.Zhedieresiscyrillic = 0x04dc;
- t.Zlinebelow = 0x1e94;
- t.Zmonospace = 0xff3a;
- t.Zsmall = 0xf77a;
- t.Zstroke = 0x01b5;
- t.a = 0x0061;
- t.aabengali = 0x0986;
- t.aacute = 0x00e1;
- t.aadeva = 0x0906;
- t.aagujarati = 0x0a86;
- t.aagurmukhi = 0x0a06;
- t.aamatragurmukhi = 0x0a3e;
- t.aarusquare = 0x3303;
- t.aavowelsignbengali = 0x09be;
- t.aavowelsigndeva = 0x093e;
- t.aavowelsigngujarati = 0x0abe;
- t.abbreviationmarkarmenian = 0x055f;
- t.abbreviationsigndeva = 0x0970;
- t.abengali = 0x0985;
- t.abopomofo = 0x311a;
- t.abreve = 0x0103;
- t.abreveacute = 0x1eaf;
- t.abrevecyrillic = 0x04d1;
- t.abrevedotbelow = 0x1eb7;
- t.abrevegrave = 0x1eb1;
- t.abrevehookabove = 0x1eb3;
- t.abrevetilde = 0x1eb5;
- t.acaron = 0x01ce;
- t.acircle = 0x24d0;
- t.acircumflex = 0x00e2;
- t.acircumflexacute = 0x1ea5;
- t.acircumflexdotbelow = 0x1ead;
- t.acircumflexgrave = 0x1ea7;
- t.acircumflexhookabove = 0x1ea9;
- t.acircumflextilde = 0x1eab;
- t.acute = 0x00b4;
- t.acutebelowcmb = 0x0317;
- t.acutecmb = 0x0301;
- t.acutecomb = 0x0301;
- t.acutedeva = 0x0954;
- t.acutelowmod = 0x02cf;
- t.acutetonecmb = 0x0341;
- t.acyrillic = 0x0430;
- t.adblgrave = 0x0201;
- t.addakgurmukhi = 0x0a71;
- t.adeva = 0x0905;
- t.adieresis = 0x00e4;
- t.adieresiscyrillic = 0x04d3;
- t.adieresismacron = 0x01df;
- t.adotbelow = 0x1ea1;
- t.adotmacron = 0x01e1;
- t.ae = 0x00e6;
- t.aeacute = 0x01fd;
- t.aekorean = 0x3150;
- t.aemacron = 0x01e3;
- t.afii00208 = 0x2015;
- t.afii08941 = 0x20a4;
- t.afii10017 = 0x0410;
- t.afii10018 = 0x0411;
- t.afii10019 = 0x0412;
- t.afii10020 = 0x0413;
- t.afii10021 = 0x0414;
- t.afii10022 = 0x0415;
- t.afii10023 = 0x0401;
- t.afii10024 = 0x0416;
- t.afii10025 = 0x0417;
- t.afii10026 = 0x0418;
- t.afii10027 = 0x0419;
- t.afii10028 = 0x041a;
- t.afii10029 = 0x041b;
- t.afii10030 = 0x041c;
- t.afii10031 = 0x041d;
- t.afii10032 = 0x041e;
- t.afii10033 = 0x041f;
- t.afii10034 = 0x0420;
- t.afii10035 = 0x0421;
- t.afii10036 = 0x0422;
- t.afii10037 = 0x0423;
- t.afii10038 = 0x0424;
- t.afii10039 = 0x0425;
- t.afii10040 = 0x0426;
- t.afii10041 = 0x0427;
- t.afii10042 = 0x0428;
- t.afii10043 = 0x0429;
- t.afii10044 = 0x042a;
- t.afii10045 = 0x042b;
- t.afii10046 = 0x042c;
- t.afii10047 = 0x042d;
- t.afii10048 = 0x042e;
- t.afii10049 = 0x042f;
- t.afii10050 = 0x0490;
- t.afii10051 = 0x0402;
- t.afii10052 = 0x0403;
- t.afii10053 = 0x0404;
- t.afii10054 = 0x0405;
- t.afii10055 = 0x0406;
- t.afii10056 = 0x0407;
- t.afii10057 = 0x0408;
- t.afii10058 = 0x0409;
- t.afii10059 = 0x040a;
- t.afii10060 = 0x040b;
- t.afii10061 = 0x040c;
- t.afii10062 = 0x040e;
- t.afii10063 = 0xf6c4;
- t.afii10064 = 0xf6c5;
- t.afii10065 = 0x0430;
- t.afii10066 = 0x0431;
- t.afii10067 = 0x0432;
- t.afii10068 = 0x0433;
- t.afii10069 = 0x0434;
- t.afii10070 = 0x0435;
- t.afii10071 = 0x0451;
- t.afii10072 = 0x0436;
- t.afii10073 = 0x0437;
- t.afii10074 = 0x0438;
- t.afii10075 = 0x0439;
- t.afii10076 = 0x043a;
- t.afii10077 = 0x043b;
- t.afii10078 = 0x043c;
- t.afii10079 = 0x043d;
- t.afii10080 = 0x043e;
- t.afii10081 = 0x043f;
- t.afii10082 = 0x0440;
- t.afii10083 = 0x0441;
- t.afii10084 = 0x0442;
- t.afii10085 = 0x0443;
- t.afii10086 = 0x0444;
- t.afii10087 = 0x0445;
- t.afii10088 = 0x0446;
- t.afii10089 = 0x0447;
- t.afii10090 = 0x0448;
- t.afii10091 = 0x0449;
- t.afii10092 = 0x044a;
- t.afii10093 = 0x044b;
- t.afii10094 = 0x044c;
- t.afii10095 = 0x044d;
- t.afii10096 = 0x044e;
- t.afii10097 = 0x044f;
- t.afii10098 = 0x0491;
- t.afii10099 = 0x0452;
- t.afii10100 = 0x0453;
- t.afii10101 = 0x0454;
- t.afii10102 = 0x0455;
- t.afii10103 = 0x0456;
- t.afii10104 = 0x0457;
- t.afii10105 = 0x0458;
- t.afii10106 = 0x0459;
- t.afii10107 = 0x045a;
- t.afii10108 = 0x045b;
- t.afii10109 = 0x045c;
- t.afii10110 = 0x045e;
- t.afii10145 = 0x040f;
- t.afii10146 = 0x0462;
- t.afii10147 = 0x0472;
- t.afii10148 = 0x0474;
- t.afii10192 = 0xf6c6;
- t.afii10193 = 0x045f;
- t.afii10194 = 0x0463;
- t.afii10195 = 0x0473;
- t.afii10196 = 0x0475;
- t.afii10831 = 0xf6c7;
- t.afii10832 = 0xf6c8;
- t.afii10846 = 0x04d9;
- t.afii299 = 0x200e;
- t.afii300 = 0x200f;
- t.afii301 = 0x200d;
- t.afii57381 = 0x066a;
- t.afii57388 = 0x060c;
- t.afii57392 = 0x0660;
- t.afii57393 = 0x0661;
- t.afii57394 = 0x0662;
- t.afii57395 = 0x0663;
- t.afii57396 = 0x0664;
- t.afii57397 = 0x0665;
- t.afii57398 = 0x0666;
- t.afii57399 = 0x0667;
- t.afii57400 = 0x0668;
- t.afii57401 = 0x0669;
- t.afii57403 = 0x061b;
- t.afii57407 = 0x061f;
- t.afii57409 = 0x0621;
- t.afii57410 = 0x0622;
- t.afii57411 = 0x0623;
- t.afii57412 = 0x0624;
- t.afii57413 = 0x0625;
- t.afii57414 = 0x0626;
- t.afii57415 = 0x0627;
- t.afii57416 = 0x0628;
- t.afii57417 = 0x0629;
- t.afii57418 = 0x062a;
- t.afii57419 = 0x062b;
- t.afii57420 = 0x062c;
- t.afii57421 = 0x062d;
- t.afii57422 = 0x062e;
- t.afii57423 = 0x062f;
- t.afii57424 = 0x0630;
- t.afii57425 = 0x0631;
- t.afii57426 = 0x0632;
- t.afii57427 = 0x0633;
- t.afii57428 = 0x0634;
- t.afii57429 = 0x0635;
- t.afii57430 = 0x0636;
- t.afii57431 = 0x0637;
- t.afii57432 = 0x0638;
- t.afii57433 = 0x0639;
- t.afii57434 = 0x063a;
- t.afii57440 = 0x0640;
- t.afii57441 = 0x0641;
- t.afii57442 = 0x0642;
- t.afii57443 = 0x0643;
- t.afii57444 = 0x0644;
- t.afii57445 = 0x0645;
- t.afii57446 = 0x0646;
- t.afii57448 = 0x0648;
- t.afii57449 = 0x0649;
- t.afii57450 = 0x064a;
- t.afii57451 = 0x064b;
- t.afii57452 = 0x064c;
- t.afii57453 = 0x064d;
- t.afii57454 = 0x064e;
- t.afii57455 = 0x064f;
- t.afii57456 = 0x0650;
- t.afii57457 = 0x0651;
- t.afii57458 = 0x0652;
- t.afii57470 = 0x0647;
- t.afii57505 = 0x06a4;
- t.afii57506 = 0x067e;
- t.afii57507 = 0x0686;
- t.afii57508 = 0x0698;
- t.afii57509 = 0x06af;
- t.afii57511 = 0x0679;
- t.afii57512 = 0x0688;
- t.afii57513 = 0x0691;
- t.afii57514 = 0x06ba;
- t.afii57519 = 0x06d2;
- t.afii57534 = 0x06d5;
- t.afii57636 = 0x20aa;
- t.afii57645 = 0x05be;
- t.afii57658 = 0x05c3;
- t.afii57664 = 0x05d0;
- t.afii57665 = 0x05d1;
- t.afii57666 = 0x05d2;
- t.afii57667 = 0x05d3;
- t.afii57668 = 0x05d4;
- t.afii57669 = 0x05d5;
- t.afii57670 = 0x05d6;
- t.afii57671 = 0x05d7;
- t.afii57672 = 0x05d8;
- t.afii57673 = 0x05d9;
- t.afii57674 = 0x05da;
- t.afii57675 = 0x05db;
- t.afii57676 = 0x05dc;
- t.afii57677 = 0x05dd;
- t.afii57678 = 0x05de;
- t.afii57679 = 0x05df;
- t.afii57680 = 0x05e0;
- t.afii57681 = 0x05e1;
- t.afii57682 = 0x05e2;
- t.afii57683 = 0x05e3;
- t.afii57684 = 0x05e4;
- t.afii57685 = 0x05e5;
- t.afii57686 = 0x05e6;
- t.afii57687 = 0x05e7;
- t.afii57688 = 0x05e8;
- t.afii57689 = 0x05e9;
- t.afii57690 = 0x05ea;
- t.afii57694 = 0xfb2a;
- t.afii57695 = 0xfb2b;
- t.afii57700 = 0xfb4b;
- t.afii57705 = 0xfb1f;
- t.afii57716 = 0x05f0;
- t.afii57717 = 0x05f1;
- t.afii57718 = 0x05f2;
- t.afii57723 = 0xfb35;
- t.afii57793 = 0x05b4;
- t.afii57794 = 0x05b5;
- t.afii57795 = 0x05b6;
- t.afii57796 = 0x05bb;
- t.afii57797 = 0x05b8;
- t.afii57798 = 0x05b7;
- t.afii57799 = 0x05b0;
- t.afii57800 = 0x05b2;
- t.afii57801 = 0x05b1;
- t.afii57802 = 0x05b3;
- t.afii57803 = 0x05c2;
- t.afii57804 = 0x05c1;
- t.afii57806 = 0x05b9;
- t.afii57807 = 0x05bc;
- t.afii57839 = 0x05bd;
- t.afii57841 = 0x05bf;
- t.afii57842 = 0x05c0;
- t.afii57929 = 0x02bc;
- t.afii61248 = 0x2105;
- t.afii61289 = 0x2113;
- t.afii61352 = 0x2116;
- t.afii61573 = 0x202c;
- t.afii61574 = 0x202d;
- t.afii61575 = 0x202e;
- t.afii61664 = 0x200c;
- t.afii63167 = 0x066d;
- t.afii64937 = 0x02bd;
- t.agrave = 0x00e0;
- t.agujarati = 0x0a85;
- t.agurmukhi = 0x0a05;
- t.ahiragana = 0x3042;
- t.ahookabove = 0x1ea3;
- t.aibengali = 0x0990;
- t.aibopomofo = 0x311e;
- t.aideva = 0x0910;
- t.aiecyrillic = 0x04d5;
- t.aigujarati = 0x0a90;
- t.aigurmukhi = 0x0a10;
- t.aimatragurmukhi = 0x0a48;
- t.ainarabic = 0x0639;
- t.ainfinalarabic = 0xfeca;
- t.aininitialarabic = 0xfecb;
- t.ainmedialarabic = 0xfecc;
- t.ainvertedbreve = 0x0203;
- t.aivowelsignbengali = 0x09c8;
- t.aivowelsigndeva = 0x0948;
- t.aivowelsigngujarati = 0x0ac8;
- t.akatakana = 0x30a2;
- t.akatakanahalfwidth = 0xff71;
- t.akorean = 0x314f;
- t.alef = 0x05d0;
- t.alefarabic = 0x0627;
- t.alefdageshhebrew = 0xfb30;
- t.aleffinalarabic = 0xfe8e;
- t.alefhamzaabovearabic = 0x0623;
- t.alefhamzaabovefinalarabic = 0xfe84;
- t.alefhamzabelowarabic = 0x0625;
- t.alefhamzabelowfinalarabic = 0xfe88;
- t.alefhebrew = 0x05d0;
- t.aleflamedhebrew = 0xfb4f;
- t.alefmaddaabovearabic = 0x0622;
- t.alefmaddaabovefinalarabic = 0xfe82;
- t.alefmaksuraarabic = 0x0649;
- t.alefmaksurafinalarabic = 0xfef0;
- t.alefmaksurainitialarabic = 0xfef3;
- t.alefmaksuramedialarabic = 0xfef4;
- t.alefpatahhebrew = 0xfb2e;
- t.alefqamatshebrew = 0xfb2f;
- t.aleph = 0x2135;
- t.allequal = 0x224c;
- t.alpha = 0x03b1;
- t.alphatonos = 0x03ac;
- t.amacron = 0x0101;
- t.amonospace = 0xff41;
- t.ampersand = 0x0026;
- t.ampersandmonospace = 0xff06;
- t.ampersandsmall = 0xf726;
- t.amsquare = 0x33c2;
- t.anbopomofo = 0x3122;
- t.angbopomofo = 0x3124;
- t.angbracketleft = 0x3008;
- t.angbracketright = 0x3009;
- t.angkhankhuthai = 0x0e5a;
- t.angle = 0x2220;
- t.anglebracketleft = 0x3008;
- t.anglebracketleftvertical = 0xfe3f;
- t.anglebracketright = 0x3009;
- t.anglebracketrightvertical = 0xfe40;
- t.angleleft = 0x2329;
- t.angleright = 0x232a;
- t.angstrom = 0x212b;
- t.anoteleia = 0x0387;
- t.anudattadeva = 0x0952;
- t.anusvarabengali = 0x0982;
- t.anusvaradeva = 0x0902;
- t.anusvaragujarati = 0x0a82;
- t.aogonek = 0x0105;
- t.apaatosquare = 0x3300;
- t.aparen = 0x249c;
- t.apostrophearmenian = 0x055a;
- t.apostrophemod = 0x02bc;
- t.apple = 0xf8ff;
- t.approaches = 0x2250;
- t.approxequal = 0x2248;
- t.approxequalorimage = 0x2252;
- t.approximatelyequal = 0x2245;
- t.araeaekorean = 0x318e;
- t.araeakorean = 0x318d;
- t.arc = 0x2312;
- t.arighthalfring = 0x1e9a;
- t.aring = 0x00e5;
- t.aringacute = 0x01fb;
- t.aringbelow = 0x1e01;
- t.arrowboth = 0x2194;
- t.arrowdashdown = 0x21e3;
- t.arrowdashleft = 0x21e0;
- t.arrowdashright = 0x21e2;
- t.arrowdashup = 0x21e1;
- t.arrowdblboth = 0x21d4;
- t.arrowdbldown = 0x21d3;
- t.arrowdblleft = 0x21d0;
- t.arrowdblright = 0x21d2;
- t.arrowdblup = 0x21d1;
- t.arrowdown = 0x2193;
- t.arrowdownleft = 0x2199;
- t.arrowdownright = 0x2198;
- t.arrowdownwhite = 0x21e9;
- t.arrowheaddownmod = 0x02c5;
- t.arrowheadleftmod = 0x02c2;
- t.arrowheadrightmod = 0x02c3;
- t.arrowheadupmod = 0x02c4;
- t.arrowhorizex = 0xf8e7;
- t.arrowleft = 0x2190;
- t.arrowleftdbl = 0x21d0;
- t.arrowleftdblstroke = 0x21cd;
- t.arrowleftoverright = 0x21c6;
- t.arrowleftwhite = 0x21e6;
- t.arrowright = 0x2192;
- t.arrowrightdblstroke = 0x21cf;
- t.arrowrightheavy = 0x279e;
- t.arrowrightoverleft = 0x21c4;
- t.arrowrightwhite = 0x21e8;
- t.arrowtableft = 0x21e4;
- t.arrowtabright = 0x21e5;
- t.arrowup = 0x2191;
- t.arrowupdn = 0x2195;
- t.arrowupdnbse = 0x21a8;
- t.arrowupdownbase = 0x21a8;
- t.arrowupleft = 0x2196;
- t.arrowupleftofdown = 0x21c5;
- t.arrowupright = 0x2197;
- t.arrowupwhite = 0x21e7;
- t.arrowvertex = 0xf8e6;
- t.asciicircum = 0x005e;
- t.asciicircummonospace = 0xff3e;
- t.asciitilde = 0x007e;
- t.asciitildemonospace = 0xff5e;
- t.ascript = 0x0251;
- t.ascriptturned = 0x0252;
- t.asmallhiragana = 0x3041;
- t.asmallkatakana = 0x30a1;
- t.asmallkatakanahalfwidth = 0xff67;
- t.asterisk = 0x002a;
- t.asteriskaltonearabic = 0x066d;
- t.asteriskarabic = 0x066d;
- t.asteriskmath = 0x2217;
- t.asteriskmonospace = 0xff0a;
- t.asterisksmall = 0xfe61;
- t.asterism = 0x2042;
- t.asuperior = 0xf6e9;
- t.asymptoticallyequal = 0x2243;
- t.at = 0x0040;
- t.atilde = 0x00e3;
- t.atmonospace = 0xff20;
- t.atsmall = 0xfe6b;
- t.aturned = 0x0250;
- t.aubengali = 0x0994;
- t.aubopomofo = 0x3120;
- t.audeva = 0x0914;
- t.augujarati = 0x0a94;
- t.augurmukhi = 0x0a14;
- t.aulengthmarkbengali = 0x09d7;
- t.aumatragurmukhi = 0x0a4c;
- t.auvowelsignbengali = 0x09cc;
- t.auvowelsigndeva = 0x094c;
- t.auvowelsigngujarati = 0x0acc;
- t.avagrahadeva = 0x093d;
- t.aybarmenian = 0x0561;
- t.ayin = 0x05e2;
- t.ayinaltonehebrew = 0xfb20;
- t.ayinhebrew = 0x05e2;
- t.b = 0x0062;
- t.babengali = 0x09ac;
- t.backslash = 0x005c;
- t.backslashmonospace = 0xff3c;
- t.badeva = 0x092c;
- t.bagujarati = 0x0aac;
- t.bagurmukhi = 0x0a2c;
- t.bahiragana = 0x3070;
- t.bahtthai = 0x0e3f;
- t.bakatakana = 0x30d0;
- t.bar = 0x007c;
- t.barmonospace = 0xff5c;
- t.bbopomofo = 0x3105;
- t.bcircle = 0x24d1;
- t.bdotaccent = 0x1e03;
- t.bdotbelow = 0x1e05;
- t.beamedsixteenthnotes = 0x266c;
- t.because = 0x2235;
- t.becyrillic = 0x0431;
- t.beharabic = 0x0628;
- t.behfinalarabic = 0xfe90;
- t.behinitialarabic = 0xfe91;
- t.behiragana = 0x3079;
- t.behmedialarabic = 0xfe92;
- t.behmeeminitialarabic = 0xfc9f;
- t.behmeemisolatedarabic = 0xfc08;
- t.behnoonfinalarabic = 0xfc6d;
- t.bekatakana = 0x30d9;
- t.benarmenian = 0x0562;
- t.bet = 0x05d1;
- t.beta = 0x03b2;
- t.betasymbolgreek = 0x03d0;
- t.betdagesh = 0xfb31;
- t.betdageshhebrew = 0xfb31;
- t.bethebrew = 0x05d1;
- t.betrafehebrew = 0xfb4c;
- t.bhabengali = 0x09ad;
- t.bhadeva = 0x092d;
- t.bhagujarati = 0x0aad;
- t.bhagurmukhi = 0x0a2d;
- t.bhook = 0x0253;
- t.bihiragana = 0x3073;
- t.bikatakana = 0x30d3;
- t.bilabialclick = 0x0298;
- t.bindigurmukhi = 0x0a02;
- t.birusquare = 0x3331;
- t.blackcircle = 0x25cf;
- t.blackdiamond = 0x25c6;
- t.blackdownpointingtriangle = 0x25bc;
- t.blackleftpointingpointer = 0x25c4;
- t.blackleftpointingtriangle = 0x25c0;
- t.blacklenticularbracketleft = 0x3010;
- t.blacklenticularbracketleftvertical = 0xfe3b;
- t.blacklenticularbracketright = 0x3011;
- t.blacklenticularbracketrightvertical = 0xfe3c;
- t.blacklowerlefttriangle = 0x25e3;
- t.blacklowerrighttriangle = 0x25e2;
- t.blackrectangle = 0x25ac;
- t.blackrightpointingpointer = 0x25ba;
- t.blackrightpointingtriangle = 0x25b6;
- t.blacksmallsquare = 0x25aa;
- t.blacksmilingface = 0x263b;
- t.blacksquare = 0x25a0;
- t.blackstar = 0x2605;
- t.blackupperlefttriangle = 0x25e4;
- t.blackupperrighttriangle = 0x25e5;
- t.blackuppointingsmalltriangle = 0x25b4;
- t.blackuppointingtriangle = 0x25b2;
- t.blank = 0x2423;
- t.blinebelow = 0x1e07;
- t.block = 0x2588;
- t.bmonospace = 0xff42;
- t.bobaimaithai = 0x0e1a;
- t.bohiragana = 0x307c;
- t.bokatakana = 0x30dc;
- t.bparen = 0x249d;
- t.bqsquare = 0x33c3;
- t.braceex = 0xf8f4;
- t.braceleft = 0x007b;
- t.braceleftbt = 0xf8f3;
- t.braceleftmid = 0xf8f2;
- t.braceleftmonospace = 0xff5b;
- t.braceleftsmall = 0xfe5b;
- t.bracelefttp = 0xf8f1;
- t.braceleftvertical = 0xfe37;
- t.braceright = 0x007d;
- t.bracerightbt = 0xf8fe;
- t.bracerightmid = 0xf8fd;
- t.bracerightmonospace = 0xff5d;
- t.bracerightsmall = 0xfe5c;
- t.bracerighttp = 0xf8fc;
- t.bracerightvertical = 0xfe38;
- t.bracketleft = 0x005b;
- t.bracketleftbt = 0xf8f0;
- t.bracketleftex = 0xf8ef;
- t.bracketleftmonospace = 0xff3b;
- t.bracketlefttp = 0xf8ee;
- t.bracketright = 0x005d;
- t.bracketrightbt = 0xf8fb;
- t.bracketrightex = 0xf8fa;
- t.bracketrightmonospace = 0xff3d;
- t.bracketrighttp = 0xf8f9;
- t.breve = 0x02d8;
- t.brevebelowcmb = 0x032e;
- t.brevecmb = 0x0306;
- t.breveinvertedbelowcmb = 0x032f;
- t.breveinvertedcmb = 0x0311;
- t.breveinverteddoublecmb = 0x0361;
- t.bridgebelowcmb = 0x032a;
- t.bridgeinvertedbelowcmb = 0x033a;
- t.brokenbar = 0x00a6;
- t.bstroke = 0x0180;
- t.bsuperior = 0xf6ea;
- t.btopbar = 0x0183;
- t.buhiragana = 0x3076;
- t.bukatakana = 0x30d6;
- t.bullet = 0x2022;
- t.bulletinverse = 0x25d8;
- t.bulletoperator = 0x2219;
- t.bullseye = 0x25ce;
- t.c = 0x0063;
- t.caarmenian = 0x056e;
- t.cabengali = 0x099a;
- t.cacute = 0x0107;
- t.cadeva = 0x091a;
- t.cagujarati = 0x0a9a;
- t.cagurmukhi = 0x0a1a;
- t.calsquare = 0x3388;
- t.candrabindubengali = 0x0981;
- t.candrabinducmb = 0x0310;
- t.candrabindudeva = 0x0901;
- t.candrabindugujarati = 0x0a81;
- t.capslock = 0x21ea;
- t.careof = 0x2105;
- t.caron = 0x02c7;
- t.caronbelowcmb = 0x032c;
- t.caroncmb = 0x030c;
- t.carriagereturn = 0x21b5;
- t.cbopomofo = 0x3118;
- t.ccaron = 0x010d;
- t.ccedilla = 0x00e7;
- t.ccedillaacute = 0x1e09;
- t.ccircle = 0x24d2;
- t.ccircumflex = 0x0109;
- t.ccurl = 0x0255;
- t.cdot = 0x010b;
- t.cdotaccent = 0x010b;
- t.cdsquare = 0x33c5;
- t.cedilla = 0x00b8;
- t.cedillacmb = 0x0327;
- t.cent = 0x00a2;
- t.centigrade = 0x2103;
- t.centinferior = 0xf6df;
- t.centmonospace = 0xffe0;
- t.centoldstyle = 0xf7a2;
- t.centsuperior = 0xf6e0;
- t.chaarmenian = 0x0579;
- t.chabengali = 0x099b;
- t.chadeva = 0x091b;
- t.chagujarati = 0x0a9b;
- t.chagurmukhi = 0x0a1b;
- t.chbopomofo = 0x3114;
- t.cheabkhasiancyrillic = 0x04bd;
- t.checkmark = 0x2713;
- t.checyrillic = 0x0447;
- t.chedescenderabkhasiancyrillic = 0x04bf;
- t.chedescendercyrillic = 0x04b7;
- t.chedieresiscyrillic = 0x04f5;
- t.cheharmenian = 0x0573;
- t.chekhakassiancyrillic = 0x04cc;
- t.cheverticalstrokecyrillic = 0x04b9;
- t.chi = 0x03c7;
- t.chieuchacirclekorean = 0x3277;
- t.chieuchaparenkorean = 0x3217;
- t.chieuchcirclekorean = 0x3269;
- t.chieuchkorean = 0x314a;
- t.chieuchparenkorean = 0x3209;
- t.chochangthai = 0x0e0a;
- t.chochanthai = 0x0e08;
- t.chochingthai = 0x0e09;
- t.chochoethai = 0x0e0c;
- t.chook = 0x0188;
- t.cieucacirclekorean = 0x3276;
- t.cieucaparenkorean = 0x3216;
- t.cieuccirclekorean = 0x3268;
- t.cieuckorean = 0x3148;
- t.cieucparenkorean = 0x3208;
- t.cieucuparenkorean = 0x321c;
- t.circle = 0x25cb;
- t.circlecopyrt = 0x00a9;
- t.circlemultiply = 0x2297;
- t.circleot = 0x2299;
- t.circleplus = 0x2295;
- t.circlepostalmark = 0x3036;
- t.circlewithlefthalfblack = 0x25d0;
- t.circlewithrighthalfblack = 0x25d1;
- t.circumflex = 0x02c6;
- t.circumflexbelowcmb = 0x032d;
- t.circumflexcmb = 0x0302;
- t.clear = 0x2327;
- t.clickalveolar = 0x01c2;
- t.clickdental = 0x01c0;
- t.clicklateral = 0x01c1;
- t.clickretroflex = 0x01c3;
- t.club = 0x2663;
- t.clubsuitblack = 0x2663;
- t.clubsuitwhite = 0x2667;
- t.cmcubedsquare = 0x33a4;
- t.cmonospace = 0xff43;
- t.cmsquaredsquare = 0x33a0;
- t.coarmenian = 0x0581;
- t.colon = 0x003a;
- t.colonmonetary = 0x20a1;
- t.colonmonospace = 0xff1a;
- t.colonsign = 0x20a1;
- t.colonsmall = 0xfe55;
- t.colontriangularhalfmod = 0x02d1;
- t.colontriangularmod = 0x02d0;
- t.comma = 0x002c;
- t.commaabovecmb = 0x0313;
- t.commaaboverightcmb = 0x0315;
- t.commaaccent = 0xf6c3;
- t.commaarabic = 0x060c;
- t.commaarmenian = 0x055d;
- t.commainferior = 0xf6e1;
- t.commamonospace = 0xff0c;
- t.commareversedabovecmb = 0x0314;
- t.commareversedmod = 0x02bd;
- t.commasmall = 0xfe50;
- t.commasuperior = 0xf6e2;
- t.commaturnedabovecmb = 0x0312;
- t.commaturnedmod = 0x02bb;
- t.compass = 0x263c;
- t.congruent = 0x2245;
- t.contourintegral = 0x222e;
- t.control = 0x2303;
- t.controlACK = 0x0006;
- t.controlBEL = 0x0007;
- t.controlBS = 0x0008;
- t.controlCAN = 0x0018;
- t.controlCR = 0x000d;
- t.controlDC1 = 0x0011;
- t.controlDC2 = 0x0012;
- t.controlDC3 = 0x0013;
- t.controlDC4 = 0x0014;
- t.controlDEL = 0x007f;
- t.controlDLE = 0x0010;
- t.controlEM = 0x0019;
- t.controlENQ = 0x0005;
- t.controlEOT = 0x0004;
- t.controlESC = 0x001b;
- t.controlETB = 0x0017;
- t.controlETX = 0x0003;
- t.controlFF = 0x000c;
- t.controlFS = 0x001c;
- t.controlGS = 0x001d;
- t.controlHT = 0x0009;
- t.controlLF = 0x000a;
- t.controlNAK = 0x0015;
- t.controlNULL = 0x0000;
- t.controlRS = 0x001e;
- t.controlSI = 0x000f;
- t.controlSO = 0x000e;
- t.controlSOT = 0x0002;
- t.controlSTX = 0x0001;
- t.controlSUB = 0x001a;
- t.controlSYN = 0x0016;
- t.controlUS = 0x001f;
- t.controlVT = 0x000b;
- t.copyright = 0x00a9;
- t.copyrightsans = 0xf8e9;
- t.copyrightserif = 0xf6d9;
- t.cornerbracketleft = 0x300c;
- t.cornerbracketlefthalfwidth = 0xff62;
- t.cornerbracketleftvertical = 0xfe41;
- t.cornerbracketright = 0x300d;
- t.cornerbracketrighthalfwidth = 0xff63;
- t.cornerbracketrightvertical = 0xfe42;
- t.corporationsquare = 0x337f;
- t.cosquare = 0x33c7;
- t.coverkgsquare = 0x33c6;
- t.cparen = 0x249e;
- t.cruzeiro = 0x20a2;
- t.cstretched = 0x0297;
- t.curlyand = 0x22cf;
- t.curlyor = 0x22ce;
- t.currency = 0x00a4;
- t.cyrBreve = 0xf6d1;
- t.cyrFlex = 0xf6d2;
- t.cyrbreve = 0xf6d4;
- t.cyrflex = 0xf6d5;
- t.d = 0x0064;
- t.daarmenian = 0x0564;
- t.dabengali = 0x09a6;
- t.dadarabic = 0x0636;
- t.dadeva = 0x0926;
- t.dadfinalarabic = 0xfebe;
- t.dadinitialarabic = 0xfebf;
- t.dadmedialarabic = 0xfec0;
- t.dagesh = 0x05bc;
- t.dageshhebrew = 0x05bc;
- t.dagger = 0x2020;
- t.daggerdbl = 0x2021;
- t.dagujarati = 0x0aa6;
- t.dagurmukhi = 0x0a26;
- t.dahiragana = 0x3060;
- t.dakatakana = 0x30c0;
- t.dalarabic = 0x062f;
- t.dalet = 0x05d3;
- t.daletdagesh = 0xfb33;
- t.daletdageshhebrew = 0xfb33;
- t.dalethebrew = 0x05d3;
- t.dalfinalarabic = 0xfeaa;
- t.dammaarabic = 0x064f;
- t.dammalowarabic = 0x064f;
- t.dammatanaltonearabic = 0x064c;
- t.dammatanarabic = 0x064c;
- t.danda = 0x0964;
- t.dargahebrew = 0x05a7;
- t.dargalefthebrew = 0x05a7;
- t.dasiapneumatacyrilliccmb = 0x0485;
- t.dblGrave = 0xf6d3;
- t.dblanglebracketleft = 0x300a;
- t.dblanglebracketleftvertical = 0xfe3d;
- t.dblanglebracketright = 0x300b;
- t.dblanglebracketrightvertical = 0xfe3e;
- t.dblarchinvertedbelowcmb = 0x032b;
- t.dblarrowleft = 0x21d4;
- t.dblarrowright = 0x21d2;
- t.dbldanda = 0x0965;
- t.dblgrave = 0xf6d6;
- t.dblgravecmb = 0x030f;
- t.dblintegral = 0x222c;
- t.dbllowline = 0x2017;
- t.dbllowlinecmb = 0x0333;
- t.dbloverlinecmb = 0x033f;
- t.dblprimemod = 0x02ba;
- t.dblverticalbar = 0x2016;
- t.dblverticallineabovecmb = 0x030e;
- t.dbopomofo = 0x3109;
- t.dbsquare = 0x33c8;
- t.dcaron = 0x010f;
- t.dcedilla = 0x1e11;
- t.dcircle = 0x24d3;
- t.dcircumflexbelow = 0x1e13;
- t.dcroat = 0x0111;
- t.ddabengali = 0x09a1;
- t.ddadeva = 0x0921;
- t.ddagujarati = 0x0aa1;
- t.ddagurmukhi = 0x0a21;
- t.ddalarabic = 0x0688;
- t.ddalfinalarabic = 0xfb89;
- t.dddhadeva = 0x095c;
- t.ddhabengali = 0x09a2;
- t.ddhadeva = 0x0922;
- t.ddhagujarati = 0x0aa2;
- t.ddhagurmukhi = 0x0a22;
- t.ddotaccent = 0x1e0b;
- t.ddotbelow = 0x1e0d;
- t.decimalseparatorarabic = 0x066b;
- t.decimalseparatorpersian = 0x066b;
- t.decyrillic = 0x0434;
- t.degree = 0x00b0;
- t.dehihebrew = 0x05ad;
- t.dehiragana = 0x3067;
- t.deicoptic = 0x03ef;
- t.dekatakana = 0x30c7;
- t.deleteleft = 0x232b;
- t.deleteright = 0x2326;
- t.delta = 0x03b4;
- t.deltaturned = 0x018d;
- t.denominatorminusonenumeratorbengali = 0x09f8;
- t.dezh = 0x02a4;
- t.dhabengali = 0x09a7;
- t.dhadeva = 0x0927;
- t.dhagujarati = 0x0aa7;
- t.dhagurmukhi = 0x0a27;
- t.dhook = 0x0257;
- t.dialytikatonos = 0x0385;
- t.dialytikatonoscmb = 0x0344;
- t.diamond = 0x2666;
- t.diamondsuitwhite = 0x2662;
- t.dieresis = 0x00a8;
- t.dieresisacute = 0xf6d7;
- t.dieresisbelowcmb = 0x0324;
- t.dieresiscmb = 0x0308;
- t.dieresisgrave = 0xf6d8;
- t.dieresistonos = 0x0385;
- t.dihiragana = 0x3062;
- t.dikatakana = 0x30c2;
- t.dittomark = 0x3003;
- t.divide = 0x00f7;
- t.divides = 0x2223;
- t.divisionslash = 0x2215;
- t.djecyrillic = 0x0452;
- t.dkshade = 0x2593;
- t.dlinebelow = 0x1e0f;
- t.dlsquare = 0x3397;
- t.dmacron = 0x0111;
- t.dmonospace = 0xff44;
- t.dnblock = 0x2584;
- t.dochadathai = 0x0e0e;
- t.dodekthai = 0x0e14;
- t.dohiragana = 0x3069;
- t.dokatakana = 0x30c9;
- t.dollar = 0x0024;
- t.dollarinferior = 0xf6e3;
- t.dollarmonospace = 0xff04;
- t.dollaroldstyle = 0xf724;
- t.dollarsmall = 0xfe69;
- t.dollarsuperior = 0xf6e4;
- t.dong = 0x20ab;
- t.dorusquare = 0x3326;
- t.dotaccent = 0x02d9;
- t.dotaccentcmb = 0x0307;
- t.dotbelowcmb = 0x0323;
- t.dotbelowcomb = 0x0323;
- t.dotkatakana = 0x30fb;
- t.dotlessi = 0x0131;
- t.dotlessj = 0xf6be;
- t.dotlessjstrokehook = 0x0284;
- t.dotmath = 0x22c5;
- t.dottedcircle = 0x25cc;
- t.doubleyodpatah = 0xfb1f;
- t.doubleyodpatahhebrew = 0xfb1f;
- t.downtackbelowcmb = 0x031e;
- t.downtackmod = 0x02d5;
- t.dparen = 0x249f;
- t.dsuperior = 0xf6eb;
- t.dtail = 0x0256;
- t.dtopbar = 0x018c;
- t.duhiragana = 0x3065;
- t.dukatakana = 0x30c5;
- t.dz = 0x01f3;
- t.dzaltone = 0x02a3;
- t.dzcaron = 0x01c6;
- t.dzcurl = 0x02a5;
- t.dzeabkhasiancyrillic = 0x04e1;
- t.dzecyrillic = 0x0455;
- t.dzhecyrillic = 0x045f;
- t.e = 0x0065;
- t.eacute = 0x00e9;
- t.earth = 0x2641;
- t.ebengali = 0x098f;
- t.ebopomofo = 0x311c;
- t.ebreve = 0x0115;
- t.ecandradeva = 0x090d;
- t.ecandragujarati = 0x0a8d;
- t.ecandravowelsigndeva = 0x0945;
- t.ecandravowelsigngujarati = 0x0ac5;
- t.ecaron = 0x011b;
- t.ecedillabreve = 0x1e1d;
- t.echarmenian = 0x0565;
- t.echyiwnarmenian = 0x0587;
- t.ecircle = 0x24d4;
- t.ecircumflex = 0x00ea;
- t.ecircumflexacute = 0x1ebf;
- t.ecircumflexbelow = 0x1e19;
- t.ecircumflexdotbelow = 0x1ec7;
- t.ecircumflexgrave = 0x1ec1;
- t.ecircumflexhookabove = 0x1ec3;
- t.ecircumflextilde = 0x1ec5;
- t.ecyrillic = 0x0454;
- t.edblgrave = 0x0205;
- t.edeva = 0x090f;
- t.edieresis = 0x00eb;
- t.edot = 0x0117;
- t.edotaccent = 0x0117;
- t.edotbelow = 0x1eb9;
- t.eegurmukhi = 0x0a0f;
- t.eematragurmukhi = 0x0a47;
- t.efcyrillic = 0x0444;
- t.egrave = 0x00e8;
- t.egujarati = 0x0a8f;
- t.eharmenian = 0x0567;
- t.ehbopomofo = 0x311d;
- t.ehiragana = 0x3048;
- t.ehookabove = 0x1ebb;
- t.eibopomofo = 0x311f;
- t.eight = 0x0038;
- t.eightarabic = 0x0668;
- t.eightbengali = 0x09ee;
- t.eightcircle = 0x2467;
- t.eightcircleinversesansserif = 0x2791;
- t.eightdeva = 0x096e;
- t.eighteencircle = 0x2471;
- t.eighteenparen = 0x2485;
- t.eighteenperiod = 0x2499;
- t.eightgujarati = 0x0aee;
- t.eightgurmukhi = 0x0a6e;
- t.eighthackarabic = 0x0668;
- t.eighthangzhou = 0x3028;
- t.eighthnotebeamed = 0x266b;
- t.eightideographicparen = 0x3227;
- t.eightinferior = 0x2088;
- t.eightmonospace = 0xff18;
- t.eightoldstyle = 0xf738;
- t.eightparen = 0x247b;
- t.eightperiod = 0x248f;
- t.eightpersian = 0x06f8;
- t.eightroman = 0x2177;
- t.eightsuperior = 0x2078;
- t.eightthai = 0x0e58;
- t.einvertedbreve = 0x0207;
- t.eiotifiedcyrillic = 0x0465;
- t.ekatakana = 0x30a8;
- t.ekatakanahalfwidth = 0xff74;
- t.ekonkargurmukhi = 0x0a74;
- t.ekorean = 0x3154;
- t.elcyrillic = 0x043b;
- t.element = 0x2208;
- t.elevencircle = 0x246a;
- t.elevenparen = 0x247e;
- t.elevenperiod = 0x2492;
- t.elevenroman = 0x217a;
- t.ellipsis = 0x2026;
- t.ellipsisvertical = 0x22ee;
- t.emacron = 0x0113;
- t.emacronacute = 0x1e17;
- t.emacrongrave = 0x1e15;
- t.emcyrillic = 0x043c;
- t.emdash = 0x2014;
- t.emdashvertical = 0xfe31;
- t.emonospace = 0xff45;
- t.emphasismarkarmenian = 0x055b;
- t.emptyset = 0x2205;
- t.enbopomofo = 0x3123;
- t.encyrillic = 0x043d;
- t.endash = 0x2013;
- t.endashvertical = 0xfe32;
- t.endescendercyrillic = 0x04a3;
- t.eng = 0x014b;
- t.engbopomofo = 0x3125;
- t.enghecyrillic = 0x04a5;
- t.enhookcyrillic = 0x04c8;
- t.enspace = 0x2002;
- t.eogonek = 0x0119;
- t.eokorean = 0x3153;
- t.eopen = 0x025b;
- t.eopenclosed = 0x029a;
- t.eopenreversed = 0x025c;
- t.eopenreversedclosed = 0x025e;
- t.eopenreversedhook = 0x025d;
- t.eparen = 0x24a0;
- t.epsilon = 0x03b5;
- t.epsilontonos = 0x03ad;
- t.equal = 0x003d;
- t.equalmonospace = 0xff1d;
- t.equalsmall = 0xfe66;
- t.equalsuperior = 0x207c;
- t.equivalence = 0x2261;
- t.erbopomofo = 0x3126;
- t.ercyrillic = 0x0440;
- t.ereversed = 0x0258;
- t.ereversedcyrillic = 0x044d;
- t.escyrillic = 0x0441;
- t.esdescendercyrillic = 0x04ab;
- t.esh = 0x0283;
- t.eshcurl = 0x0286;
- t.eshortdeva = 0x090e;
- t.eshortvowelsigndeva = 0x0946;
- t.eshreversedloop = 0x01aa;
- t.eshsquatreversed = 0x0285;
- t.esmallhiragana = 0x3047;
- t.esmallkatakana = 0x30a7;
- t.esmallkatakanahalfwidth = 0xff6a;
- t.estimated = 0x212e;
- t.esuperior = 0xf6ec;
- t.eta = 0x03b7;
- t.etarmenian = 0x0568;
- t.etatonos = 0x03ae;
- t.eth = 0x00f0;
- t.etilde = 0x1ebd;
- t.etildebelow = 0x1e1b;
- t.etnahtafoukhhebrew = 0x0591;
- t.etnahtafoukhlefthebrew = 0x0591;
- t.etnahtahebrew = 0x0591;
- t.etnahtalefthebrew = 0x0591;
- t.eturned = 0x01dd;
- t.eukorean = 0x3161;
- t.euro = 0x20ac;
- t.evowelsignbengali = 0x09c7;
- t.evowelsigndeva = 0x0947;
- t.evowelsigngujarati = 0x0ac7;
- t.exclam = 0x0021;
- t.exclamarmenian = 0x055c;
- t.exclamdbl = 0x203c;
- t.exclamdown = 0x00a1;
- t.exclamdownsmall = 0xf7a1;
- t.exclammonospace = 0xff01;
- t.exclamsmall = 0xf721;
- t.existential = 0x2203;
- t.ezh = 0x0292;
- t.ezhcaron = 0x01ef;
- t.ezhcurl = 0x0293;
- t.ezhreversed = 0x01b9;
- t.ezhtail = 0x01ba;
- t.f = 0x0066;
- t.fadeva = 0x095e;
- t.fagurmukhi = 0x0a5e;
- t.fahrenheit = 0x2109;
- t.fathaarabic = 0x064e;
- t.fathalowarabic = 0x064e;
- t.fathatanarabic = 0x064b;
- t.fbopomofo = 0x3108;
- t.fcircle = 0x24d5;
- t.fdotaccent = 0x1e1f;
- t.feharabic = 0x0641;
- t.feharmenian = 0x0586;
- t.fehfinalarabic = 0xfed2;
- t.fehinitialarabic = 0xfed3;
- t.fehmedialarabic = 0xfed4;
- t.feicoptic = 0x03e5;
- t.female = 0x2640;
- t.ff = 0xfb00;
- t.f_f = 0xfb00;
- t.ffi = 0xfb03;
- t.ffl = 0xfb04;
- t.fi = 0xfb01;
- t.fifteencircle = 0x246e;
- t.fifteenparen = 0x2482;
- t.fifteenperiod = 0x2496;
- t.figuredash = 0x2012;
- t.filledbox = 0x25a0;
- t.filledrect = 0x25ac;
- t.finalkaf = 0x05da;
- t.finalkafdagesh = 0xfb3a;
- t.finalkafdageshhebrew = 0xfb3a;
- t.finalkafhebrew = 0x05da;
- t.finalmem = 0x05dd;
- t.finalmemhebrew = 0x05dd;
- t.finalnun = 0x05df;
- t.finalnunhebrew = 0x05df;
- t.finalpe = 0x05e3;
- t.finalpehebrew = 0x05e3;
- t.finaltsadi = 0x05e5;
- t.finaltsadihebrew = 0x05e5;
- t.firsttonechinese = 0x02c9;
- t.fisheye = 0x25c9;
- t.fitacyrillic = 0x0473;
- t.five = 0x0035;
- t.fivearabic = 0x0665;
- t.fivebengali = 0x09eb;
- t.fivecircle = 0x2464;
- t.fivecircleinversesansserif = 0x278e;
- t.fivedeva = 0x096b;
- t.fiveeighths = 0x215d;
- t.fivegujarati = 0x0aeb;
- t.fivegurmukhi = 0x0a6b;
- t.fivehackarabic = 0x0665;
- t.fivehangzhou = 0x3025;
- t.fiveideographicparen = 0x3224;
- t.fiveinferior = 0x2085;
- t.fivemonospace = 0xff15;
- t.fiveoldstyle = 0xf735;
- t.fiveparen = 0x2478;
- t.fiveperiod = 0x248c;
- t.fivepersian = 0x06f5;
- t.fiveroman = 0x2174;
- t.fivesuperior = 0x2075;
- t.fivethai = 0x0e55;
- t.fl = 0xfb02;
- t.florin = 0x0192;
- t.fmonospace = 0xff46;
- t.fmsquare = 0x3399;
- t.fofanthai = 0x0e1f;
- t.fofathai = 0x0e1d;
- t.fongmanthai = 0x0e4f;
- t.forall = 0x2200;
- t.four = 0x0034;
- t.fourarabic = 0x0664;
- t.fourbengali = 0x09ea;
- t.fourcircle = 0x2463;
- t.fourcircleinversesansserif = 0x278d;
- t.fourdeva = 0x096a;
- t.fourgujarati = 0x0aea;
- t.fourgurmukhi = 0x0a6a;
- t.fourhackarabic = 0x0664;
- t.fourhangzhou = 0x3024;
- t.fourideographicparen = 0x3223;
- t.fourinferior = 0x2084;
- t.fourmonospace = 0xff14;
- t.fournumeratorbengali = 0x09f7;
- t.fouroldstyle = 0xf734;
- t.fourparen = 0x2477;
- t.fourperiod = 0x248b;
- t.fourpersian = 0x06f4;
- t.fourroman = 0x2173;
- t.foursuperior = 0x2074;
- t.fourteencircle = 0x246d;
- t.fourteenparen = 0x2481;
- t.fourteenperiod = 0x2495;
- t.fourthai = 0x0e54;
- t.fourthtonechinese = 0x02cb;
- t.fparen = 0x24a1;
- t.fraction = 0x2044;
- t.franc = 0x20a3;
- t.g = 0x0067;
- t.gabengali = 0x0997;
- t.gacute = 0x01f5;
- t.gadeva = 0x0917;
- t.gafarabic = 0x06af;
- t.gaffinalarabic = 0xfb93;
- t.gafinitialarabic = 0xfb94;
- t.gafmedialarabic = 0xfb95;
- t.gagujarati = 0x0a97;
- t.gagurmukhi = 0x0a17;
- t.gahiragana = 0x304c;
- t.gakatakana = 0x30ac;
- t.gamma = 0x03b3;
- t.gammalatinsmall = 0x0263;
- t.gammasuperior = 0x02e0;
- t.gangiacoptic = 0x03eb;
- t.gbopomofo = 0x310d;
- t.gbreve = 0x011f;
- t.gcaron = 0x01e7;
- t.gcedilla = 0x0123;
- t.gcircle = 0x24d6;
- t.gcircumflex = 0x011d;
- t.gcommaaccent = 0x0123;
- t.gdot = 0x0121;
- t.gdotaccent = 0x0121;
- t.gecyrillic = 0x0433;
- t.gehiragana = 0x3052;
- t.gekatakana = 0x30b2;
- t.geometricallyequal = 0x2251;
- t.gereshaccenthebrew = 0x059c;
- t.gereshhebrew = 0x05f3;
- t.gereshmuqdamhebrew = 0x059d;
- t.germandbls = 0x00df;
- t.gershayimaccenthebrew = 0x059e;
- t.gershayimhebrew = 0x05f4;
- t.getamark = 0x3013;
- t.ghabengali = 0x0998;
- t.ghadarmenian = 0x0572;
- t.ghadeva = 0x0918;
- t.ghagujarati = 0x0a98;
- t.ghagurmukhi = 0x0a18;
- t.ghainarabic = 0x063a;
- t.ghainfinalarabic = 0xfece;
- t.ghaininitialarabic = 0xfecf;
- t.ghainmedialarabic = 0xfed0;
- t.ghemiddlehookcyrillic = 0x0495;
- t.ghestrokecyrillic = 0x0493;
- t.gheupturncyrillic = 0x0491;
- t.ghhadeva = 0x095a;
- t.ghhagurmukhi = 0x0a5a;
- t.ghook = 0x0260;
- t.ghzsquare = 0x3393;
- t.gihiragana = 0x304e;
- t.gikatakana = 0x30ae;
- t.gimarmenian = 0x0563;
- t.gimel = 0x05d2;
- t.gimeldagesh = 0xfb32;
- t.gimeldageshhebrew = 0xfb32;
- t.gimelhebrew = 0x05d2;
- t.gjecyrillic = 0x0453;
- t.glottalinvertedstroke = 0x01be;
- t.glottalstop = 0x0294;
- t.glottalstopinverted = 0x0296;
- t.glottalstopmod = 0x02c0;
- t.glottalstopreversed = 0x0295;
- t.glottalstopreversedmod = 0x02c1;
- t.glottalstopreversedsuperior = 0x02e4;
- t.glottalstopstroke = 0x02a1;
- t.glottalstopstrokereversed = 0x02a2;
- t.gmacron = 0x1e21;
- t.gmonospace = 0xff47;
- t.gohiragana = 0x3054;
- t.gokatakana = 0x30b4;
- t.gparen = 0x24a2;
- t.gpasquare = 0x33ac;
- t.gradient = 0x2207;
- t.grave = 0x0060;
- t.gravebelowcmb = 0x0316;
- t.gravecmb = 0x0300;
- t.gravecomb = 0x0300;
- t.gravedeva = 0x0953;
- t.gravelowmod = 0x02ce;
- t.gravemonospace = 0xff40;
- t.gravetonecmb = 0x0340;
- t.greater = 0x003e;
- t.greaterequal = 0x2265;
- t.greaterequalorless = 0x22db;
- t.greatermonospace = 0xff1e;
- t.greaterorequivalent = 0x2273;
- t.greaterorless = 0x2277;
- t.greateroverequal = 0x2267;
- t.greatersmall = 0xfe65;
- t.gscript = 0x0261;
- t.gstroke = 0x01e5;
- t.guhiragana = 0x3050;
- t.guillemotleft = 0x00ab;
- t.guillemotright = 0x00bb;
- t.guilsinglleft = 0x2039;
- t.guilsinglright = 0x203a;
- t.gukatakana = 0x30b0;
- t.guramusquare = 0x3318;
- t.gysquare = 0x33c9;
- t.h = 0x0068;
- t.haabkhasiancyrillic = 0x04a9;
- t.haaltonearabic = 0x06c1;
- t.habengali = 0x09b9;
- t.hadescendercyrillic = 0x04b3;
- t.hadeva = 0x0939;
- t.hagujarati = 0x0ab9;
- t.hagurmukhi = 0x0a39;
- t.haharabic = 0x062d;
- t.hahfinalarabic = 0xfea2;
- t.hahinitialarabic = 0xfea3;
- t.hahiragana = 0x306f;
- t.hahmedialarabic = 0xfea4;
- t.haitusquare = 0x332a;
- t.hakatakana = 0x30cf;
- t.hakatakanahalfwidth = 0xff8a;
- t.halantgurmukhi = 0x0a4d;
- t.hamzaarabic = 0x0621;
- t.hamzalowarabic = 0x0621;
- t.hangulfiller = 0x3164;
- t.hardsigncyrillic = 0x044a;
- t.harpoonleftbarbup = 0x21bc;
- t.harpoonrightbarbup = 0x21c0;
- t.hasquare = 0x33ca;
- t.hatafpatah = 0x05b2;
- t.hatafpatah16 = 0x05b2;
- t.hatafpatah23 = 0x05b2;
- t.hatafpatah2f = 0x05b2;
- t.hatafpatahhebrew = 0x05b2;
- t.hatafpatahnarrowhebrew = 0x05b2;
- t.hatafpatahquarterhebrew = 0x05b2;
- t.hatafpatahwidehebrew = 0x05b2;
- t.hatafqamats = 0x05b3;
- t.hatafqamats1b = 0x05b3;
- t.hatafqamats28 = 0x05b3;
- t.hatafqamats34 = 0x05b3;
- t.hatafqamatshebrew = 0x05b3;
- t.hatafqamatsnarrowhebrew = 0x05b3;
- t.hatafqamatsquarterhebrew = 0x05b3;
- t.hatafqamatswidehebrew = 0x05b3;
- t.hatafsegol = 0x05b1;
- t.hatafsegol17 = 0x05b1;
- t.hatafsegol24 = 0x05b1;
- t.hatafsegol30 = 0x05b1;
- t.hatafsegolhebrew = 0x05b1;
- t.hatafsegolnarrowhebrew = 0x05b1;
- t.hatafsegolquarterhebrew = 0x05b1;
- t.hatafsegolwidehebrew = 0x05b1;
- t.hbar = 0x0127;
- t.hbopomofo = 0x310f;
- t.hbrevebelow = 0x1e2b;
- t.hcedilla = 0x1e29;
- t.hcircle = 0x24d7;
- t.hcircumflex = 0x0125;
- t.hdieresis = 0x1e27;
- t.hdotaccent = 0x1e23;
- t.hdotbelow = 0x1e25;
- t.he = 0x05d4;
- t.heart = 0x2665;
- t.heartsuitblack = 0x2665;
- t.heartsuitwhite = 0x2661;
- t.hedagesh = 0xfb34;
- t.hedageshhebrew = 0xfb34;
- t.hehaltonearabic = 0x06c1;
- t.heharabic = 0x0647;
- t.hehebrew = 0x05d4;
- t.hehfinalaltonearabic = 0xfba7;
- t.hehfinalalttwoarabic = 0xfeea;
- t.hehfinalarabic = 0xfeea;
- t.hehhamzaabovefinalarabic = 0xfba5;
- t.hehhamzaaboveisolatedarabic = 0xfba4;
- t.hehinitialaltonearabic = 0xfba8;
- t.hehinitialarabic = 0xfeeb;
- t.hehiragana = 0x3078;
- t.hehmedialaltonearabic = 0xfba9;
- t.hehmedialarabic = 0xfeec;
- t.heiseierasquare = 0x337b;
- t.hekatakana = 0x30d8;
- t.hekatakanahalfwidth = 0xff8d;
- t.hekutaarusquare = 0x3336;
- t.henghook = 0x0267;
- t.herutusquare = 0x3339;
- t.het = 0x05d7;
- t.hethebrew = 0x05d7;
- t.hhook = 0x0266;
- t.hhooksuperior = 0x02b1;
- t.hieuhacirclekorean = 0x327b;
- t.hieuhaparenkorean = 0x321b;
- t.hieuhcirclekorean = 0x326d;
- t.hieuhkorean = 0x314e;
- t.hieuhparenkorean = 0x320d;
- t.hihiragana = 0x3072;
- t.hikatakana = 0x30d2;
- t.hikatakanahalfwidth = 0xff8b;
- t.hiriq = 0x05b4;
- t.hiriq14 = 0x05b4;
- t.hiriq21 = 0x05b4;
- t.hiriq2d = 0x05b4;
- t.hiriqhebrew = 0x05b4;
- t.hiriqnarrowhebrew = 0x05b4;
- t.hiriqquarterhebrew = 0x05b4;
- t.hiriqwidehebrew = 0x05b4;
- t.hlinebelow = 0x1e96;
- t.hmonospace = 0xff48;
- t.hoarmenian = 0x0570;
- t.hohipthai = 0x0e2b;
- t.hohiragana = 0x307b;
- t.hokatakana = 0x30db;
- t.hokatakanahalfwidth = 0xff8e;
- t.holam = 0x05b9;
- t.holam19 = 0x05b9;
- t.holam26 = 0x05b9;
- t.holam32 = 0x05b9;
- t.holamhebrew = 0x05b9;
- t.holamnarrowhebrew = 0x05b9;
- t.holamquarterhebrew = 0x05b9;
- t.holamwidehebrew = 0x05b9;
- t.honokhukthai = 0x0e2e;
- t.hookabovecomb = 0x0309;
- t.hookcmb = 0x0309;
- t.hookpalatalizedbelowcmb = 0x0321;
- t.hookretroflexbelowcmb = 0x0322;
- t.hoonsquare = 0x3342;
- t.horicoptic = 0x03e9;
- t.horizontalbar = 0x2015;
- t.horncmb = 0x031b;
- t.hotsprings = 0x2668;
- t.house = 0x2302;
- t.hparen = 0x24a3;
- t.hsuperior = 0x02b0;
- t.hturned = 0x0265;
- t.huhiragana = 0x3075;
- t.huiitosquare = 0x3333;
- t.hukatakana = 0x30d5;
- t.hukatakanahalfwidth = 0xff8c;
- t.hungarumlaut = 0x02dd;
- t.hungarumlautcmb = 0x030b;
- t.hv = 0x0195;
- t.hyphen = 0x002d;
- t.hypheninferior = 0xf6e5;
- t.hyphenmonospace = 0xff0d;
- t.hyphensmall = 0xfe63;
- t.hyphensuperior = 0xf6e6;
- t.hyphentwo = 0x2010;
- t.i = 0x0069;
- t.iacute = 0x00ed;
- t.iacyrillic = 0x044f;
- t.ibengali = 0x0987;
- t.ibopomofo = 0x3127;
- t.ibreve = 0x012d;
- t.icaron = 0x01d0;
- t.icircle = 0x24d8;
- t.icircumflex = 0x00ee;
- t.icyrillic = 0x0456;
- t.idblgrave = 0x0209;
- t.ideographearthcircle = 0x328f;
- t.ideographfirecircle = 0x328b;
- t.ideographicallianceparen = 0x323f;
- t.ideographiccallparen = 0x323a;
- t.ideographiccentrecircle = 0x32a5;
- t.ideographicclose = 0x3006;
- t.ideographiccomma = 0x3001;
- t.ideographiccommaleft = 0xff64;
- t.ideographiccongratulationparen = 0x3237;
- t.ideographiccorrectcircle = 0x32a3;
- t.ideographicearthparen = 0x322f;
- t.ideographicenterpriseparen = 0x323d;
- t.ideographicexcellentcircle = 0x329d;
- t.ideographicfestivalparen = 0x3240;
- t.ideographicfinancialcircle = 0x3296;
- t.ideographicfinancialparen = 0x3236;
- t.ideographicfireparen = 0x322b;
- t.ideographichaveparen = 0x3232;
- t.ideographichighcircle = 0x32a4;
- t.ideographiciterationmark = 0x3005;
- t.ideographiclaborcircle = 0x3298;
- t.ideographiclaborparen = 0x3238;
- t.ideographicleftcircle = 0x32a7;
- t.ideographiclowcircle = 0x32a6;
- t.ideographicmedicinecircle = 0x32a9;
- t.ideographicmetalparen = 0x322e;
- t.ideographicmoonparen = 0x322a;
- t.ideographicnameparen = 0x3234;
- t.ideographicperiod = 0x3002;
- t.ideographicprintcircle = 0x329e;
- t.ideographicreachparen = 0x3243;
- t.ideographicrepresentparen = 0x3239;
- t.ideographicresourceparen = 0x323e;
- t.ideographicrightcircle = 0x32a8;
- t.ideographicsecretcircle = 0x3299;
- t.ideographicselfparen = 0x3242;
- t.ideographicsocietyparen = 0x3233;
- t.ideographicspace = 0x3000;
- t.ideographicspecialparen = 0x3235;
- t.ideographicstockparen = 0x3231;
- t.ideographicstudyparen = 0x323b;
- t.ideographicsunparen = 0x3230;
- t.ideographicsuperviseparen = 0x323c;
- t.ideographicwaterparen = 0x322c;
- t.ideographicwoodparen = 0x322d;
- t.ideographiczero = 0x3007;
- t.ideographmetalcircle = 0x328e;
- t.ideographmooncircle = 0x328a;
- t.ideographnamecircle = 0x3294;
- t.ideographsuncircle = 0x3290;
- t.ideographwatercircle = 0x328c;
- t.ideographwoodcircle = 0x328d;
- t.ideva = 0x0907;
- t.idieresis = 0x00ef;
- t.idieresisacute = 0x1e2f;
- t.idieresiscyrillic = 0x04e5;
- t.idotbelow = 0x1ecb;
- t.iebrevecyrillic = 0x04d7;
- t.iecyrillic = 0x0435;
- t.ieungacirclekorean = 0x3275;
- t.ieungaparenkorean = 0x3215;
- t.ieungcirclekorean = 0x3267;
- t.ieungkorean = 0x3147;
- t.ieungparenkorean = 0x3207;
- t.igrave = 0x00ec;
- t.igujarati = 0x0a87;
- t.igurmukhi = 0x0a07;
- t.ihiragana = 0x3044;
- t.ihookabove = 0x1ec9;
- t.iibengali = 0x0988;
- t.iicyrillic = 0x0438;
- t.iideva = 0x0908;
- t.iigujarati = 0x0a88;
- t.iigurmukhi = 0x0a08;
- t.iimatragurmukhi = 0x0a40;
- t.iinvertedbreve = 0x020b;
- t.iishortcyrillic = 0x0439;
- t.iivowelsignbengali = 0x09c0;
- t.iivowelsigndeva = 0x0940;
- t.iivowelsigngujarati = 0x0ac0;
- t.ij = 0x0133;
- t.ikatakana = 0x30a4;
- t.ikatakanahalfwidth = 0xff72;
- t.ikorean = 0x3163;
- t.ilde = 0x02dc;
- t.iluyhebrew = 0x05ac;
- t.imacron = 0x012b;
- t.imacroncyrillic = 0x04e3;
- t.imageorapproximatelyequal = 0x2253;
- t.imatragurmukhi = 0x0a3f;
- t.imonospace = 0xff49;
- t.increment = 0x2206;
- t.infinity = 0x221e;
- t.iniarmenian = 0x056b;
- t.integral = 0x222b;
- t.integralbottom = 0x2321;
- t.integralbt = 0x2321;
- t.integralex = 0xf8f5;
- t.integraltop = 0x2320;
- t.integraltp = 0x2320;
- t.intersection = 0x2229;
- t.intisquare = 0x3305;
- t.invbullet = 0x25d8;
- t.invcircle = 0x25d9;
- t.invsmileface = 0x263b;
- t.iocyrillic = 0x0451;
- t.iogonek = 0x012f;
- t.iota = 0x03b9;
- t.iotadieresis = 0x03ca;
- t.iotadieresistonos = 0x0390;
- t.iotalatin = 0x0269;
- t.iotatonos = 0x03af;
- t.iparen = 0x24a4;
- t.irigurmukhi = 0x0a72;
- t.ismallhiragana = 0x3043;
- t.ismallkatakana = 0x30a3;
- t.ismallkatakanahalfwidth = 0xff68;
- t.issharbengali = 0x09fa;
- t.istroke = 0x0268;
- t.isuperior = 0xf6ed;
- t.iterationhiragana = 0x309d;
- t.iterationkatakana = 0x30fd;
- t.itilde = 0x0129;
- t.itildebelow = 0x1e2d;
- t.iubopomofo = 0x3129;
- t.iucyrillic = 0x044e;
- t.ivowelsignbengali = 0x09bf;
- t.ivowelsigndeva = 0x093f;
- t.ivowelsigngujarati = 0x0abf;
- t.izhitsacyrillic = 0x0475;
- t.izhitsadblgravecyrillic = 0x0477;
- t.j = 0x006a;
- t.jaarmenian = 0x0571;
- t.jabengali = 0x099c;
- t.jadeva = 0x091c;
- t.jagujarati = 0x0a9c;
- t.jagurmukhi = 0x0a1c;
- t.jbopomofo = 0x3110;
- t.jcaron = 0x01f0;
- t.jcircle = 0x24d9;
- t.jcircumflex = 0x0135;
- t.jcrossedtail = 0x029d;
- t.jdotlessstroke = 0x025f;
- t.jecyrillic = 0x0458;
- t.jeemarabic = 0x062c;
- t.jeemfinalarabic = 0xfe9e;
- t.jeeminitialarabic = 0xfe9f;
- t.jeemmedialarabic = 0xfea0;
- t.jeharabic = 0x0698;
- t.jehfinalarabic = 0xfb8b;
- t.jhabengali = 0x099d;
- t.jhadeva = 0x091d;
- t.jhagujarati = 0x0a9d;
- t.jhagurmukhi = 0x0a1d;
- t.jheharmenian = 0x057b;
- t.jis = 0x3004;
- t.jmonospace = 0xff4a;
- t.jparen = 0x24a5;
- t.jsuperior = 0x02b2;
- t.k = 0x006b;
- t.kabashkircyrillic = 0x04a1;
- t.kabengali = 0x0995;
- t.kacute = 0x1e31;
- t.kacyrillic = 0x043a;
- t.kadescendercyrillic = 0x049b;
- t.kadeva = 0x0915;
- t.kaf = 0x05db;
- t.kafarabic = 0x0643;
- t.kafdagesh = 0xfb3b;
- t.kafdageshhebrew = 0xfb3b;
- t.kaffinalarabic = 0xfeda;
- t.kafhebrew = 0x05db;
- t.kafinitialarabic = 0xfedb;
- t.kafmedialarabic = 0xfedc;
- t.kafrafehebrew = 0xfb4d;
- t.kagujarati = 0x0a95;
- t.kagurmukhi = 0x0a15;
- t.kahiragana = 0x304b;
- t.kahookcyrillic = 0x04c4;
- t.kakatakana = 0x30ab;
- t.kakatakanahalfwidth = 0xff76;
- t.kappa = 0x03ba;
- t.kappasymbolgreek = 0x03f0;
- t.kapyeounmieumkorean = 0x3171;
- t.kapyeounphieuphkorean = 0x3184;
- t.kapyeounpieupkorean = 0x3178;
- t.kapyeounssangpieupkorean = 0x3179;
- t.karoriisquare = 0x330d;
- t.kashidaautoarabic = 0x0640;
- t.kashidaautonosidebearingarabic = 0x0640;
- t.kasmallkatakana = 0x30f5;
- t.kasquare = 0x3384;
- t.kasraarabic = 0x0650;
- t.kasratanarabic = 0x064d;
- t.kastrokecyrillic = 0x049f;
- t.katahiraprolongmarkhalfwidth = 0xff70;
- t.kaverticalstrokecyrillic = 0x049d;
- t.kbopomofo = 0x310e;
- t.kcalsquare = 0x3389;
- t.kcaron = 0x01e9;
- t.kcedilla = 0x0137;
- t.kcircle = 0x24da;
- t.kcommaaccent = 0x0137;
- t.kdotbelow = 0x1e33;
- t.keharmenian = 0x0584;
- t.kehiragana = 0x3051;
- t.kekatakana = 0x30b1;
- t.kekatakanahalfwidth = 0xff79;
- t.kenarmenian = 0x056f;
- t.kesmallkatakana = 0x30f6;
- t.kgreenlandic = 0x0138;
- t.khabengali = 0x0996;
- t.khacyrillic = 0x0445;
- t.khadeva = 0x0916;
- t.khagujarati = 0x0a96;
- t.khagurmukhi = 0x0a16;
- t.khaharabic = 0x062e;
- t.khahfinalarabic = 0xfea6;
- t.khahinitialarabic = 0xfea7;
- t.khahmedialarabic = 0xfea8;
- t.kheicoptic = 0x03e7;
- t.khhadeva = 0x0959;
- t.khhagurmukhi = 0x0a59;
- t.khieukhacirclekorean = 0x3278;
- t.khieukhaparenkorean = 0x3218;
- t.khieukhcirclekorean = 0x326a;
- t.khieukhkorean = 0x314b;
- t.khieukhparenkorean = 0x320a;
- t.khokhaithai = 0x0e02;
- t.khokhonthai = 0x0e05;
- t.khokhuatthai = 0x0e03;
- t.khokhwaithai = 0x0e04;
- t.khomutthai = 0x0e5b;
- t.khook = 0x0199;
- t.khorakhangthai = 0x0e06;
- t.khzsquare = 0x3391;
- t.kihiragana = 0x304d;
- t.kikatakana = 0x30ad;
- t.kikatakanahalfwidth = 0xff77;
- t.kiroguramusquare = 0x3315;
- t.kiromeetorusquare = 0x3316;
- t.kirosquare = 0x3314;
- t.kiyeokacirclekorean = 0x326e;
- t.kiyeokaparenkorean = 0x320e;
- t.kiyeokcirclekorean = 0x3260;
- t.kiyeokkorean = 0x3131;
- t.kiyeokparenkorean = 0x3200;
- t.kiyeoksioskorean = 0x3133;
- t.kjecyrillic = 0x045c;
- t.klinebelow = 0x1e35;
- t.klsquare = 0x3398;
- t.kmcubedsquare = 0x33a6;
- t.kmonospace = 0xff4b;
- t.kmsquaredsquare = 0x33a2;
- t.kohiragana = 0x3053;
- t.kohmsquare = 0x33c0;
- t.kokaithai = 0x0e01;
- t.kokatakana = 0x30b3;
- t.kokatakanahalfwidth = 0xff7a;
- t.kooposquare = 0x331e;
- t.koppacyrillic = 0x0481;
- t.koreanstandardsymbol = 0x327f;
- t.koroniscmb = 0x0343;
- t.kparen = 0x24a6;
- t.kpasquare = 0x33aa;
- t.ksicyrillic = 0x046f;
- t.ktsquare = 0x33cf;
- t.kturned = 0x029e;
- t.kuhiragana = 0x304f;
- t.kukatakana = 0x30af;
- t.kukatakanahalfwidth = 0xff78;
- t.kvsquare = 0x33b8;
- t.kwsquare = 0x33be;
- t.l = 0x006c;
- t.labengali = 0x09b2;
- t.lacute = 0x013a;
- t.ladeva = 0x0932;
- t.lagujarati = 0x0ab2;
- t.lagurmukhi = 0x0a32;
- t.lakkhangyaothai = 0x0e45;
- t.lamaleffinalarabic = 0xfefc;
- t.lamalefhamzaabovefinalarabic = 0xfef8;
- t.lamalefhamzaaboveisolatedarabic = 0xfef7;
- t.lamalefhamzabelowfinalarabic = 0xfefa;
- t.lamalefhamzabelowisolatedarabic = 0xfef9;
- t.lamalefisolatedarabic = 0xfefb;
- t.lamalefmaddaabovefinalarabic = 0xfef6;
- t.lamalefmaddaaboveisolatedarabic = 0xfef5;
- t.lamarabic = 0x0644;
- t.lambda = 0x03bb;
- t.lambdastroke = 0x019b;
- t.lamed = 0x05dc;
- t.lameddagesh = 0xfb3c;
- t.lameddageshhebrew = 0xfb3c;
- t.lamedhebrew = 0x05dc;
- t.lamfinalarabic = 0xfede;
- t.lamhahinitialarabic = 0xfcca;
- t.laminitialarabic = 0xfedf;
- t.lamjeeminitialarabic = 0xfcc9;
- t.lamkhahinitialarabic = 0xfccb;
- t.lamlamhehisolatedarabic = 0xfdf2;
- t.lammedialarabic = 0xfee0;
- t.lammeemhahinitialarabic = 0xfd88;
- t.lammeeminitialarabic = 0xfccc;
- t.largecircle = 0x25ef;
- t.lbar = 0x019a;
- t.lbelt = 0x026c;
- t.lbopomofo = 0x310c;
- t.lcaron = 0x013e;
- t.lcedilla = 0x013c;
- t.lcircle = 0x24db;
- t.lcircumflexbelow = 0x1e3d;
- t.lcommaaccent = 0x013c;
- t.ldot = 0x0140;
- t.ldotaccent = 0x0140;
- t.ldotbelow = 0x1e37;
- t.ldotbelowmacron = 0x1e39;
- t.leftangleabovecmb = 0x031a;
- t.lefttackbelowcmb = 0x0318;
- t.less = 0x003c;
- t.lessequal = 0x2264;
- t.lessequalorgreater = 0x22da;
- t.lessmonospace = 0xff1c;
- t.lessorequivalent = 0x2272;
- t.lessorgreater = 0x2276;
- t.lessoverequal = 0x2266;
- t.lesssmall = 0xfe64;
- t.lezh = 0x026e;
- t.lfblock = 0x258c;
- t.lhookretroflex = 0x026d;
- t.lira = 0x20a4;
- t.liwnarmenian = 0x056c;
- t.lj = 0x01c9;
- t.ljecyrillic = 0x0459;
- t.ll = 0xf6c0;
- t.lladeva = 0x0933;
- t.llagujarati = 0x0ab3;
- t.llinebelow = 0x1e3b;
- t.llladeva = 0x0934;
- t.llvocalicbengali = 0x09e1;
- t.llvocalicdeva = 0x0961;
- t.llvocalicvowelsignbengali = 0x09e3;
- t.llvocalicvowelsigndeva = 0x0963;
- t.lmiddletilde = 0x026b;
- t.lmonospace = 0xff4c;
- t.lmsquare = 0x33d0;
- t.lochulathai = 0x0e2c;
- t.logicaland = 0x2227;
- t.logicalnot = 0x00ac;
- t.logicalnotreversed = 0x2310;
- t.logicalor = 0x2228;
- t.lolingthai = 0x0e25;
- t.longs = 0x017f;
- t.lowlinecenterline = 0xfe4e;
- t.lowlinecmb = 0x0332;
- t.lowlinedashed = 0xfe4d;
- t.lozenge = 0x25ca;
- t.lparen = 0x24a7;
- t.lslash = 0x0142;
- t.lsquare = 0x2113;
- t.lsuperior = 0xf6ee;
- t.ltshade = 0x2591;
- t.luthai = 0x0e26;
- t.lvocalicbengali = 0x098c;
- t.lvocalicdeva = 0x090c;
- t.lvocalicvowelsignbengali = 0x09e2;
- t.lvocalicvowelsigndeva = 0x0962;
- t.lxsquare = 0x33d3;
- t.m = 0x006d;
- t.mabengali = 0x09ae;
- t.macron = 0x00af;
- t.macronbelowcmb = 0x0331;
- t.macroncmb = 0x0304;
- t.macronlowmod = 0x02cd;
- t.macronmonospace = 0xffe3;
- t.macute = 0x1e3f;
- t.madeva = 0x092e;
- t.magujarati = 0x0aae;
- t.magurmukhi = 0x0a2e;
- t.mahapakhhebrew = 0x05a4;
- t.mahapakhlefthebrew = 0x05a4;
- t.mahiragana = 0x307e;
- t.maichattawalowleftthai = 0xf895;
- t.maichattawalowrightthai = 0xf894;
- t.maichattawathai = 0x0e4b;
- t.maichattawaupperleftthai = 0xf893;
- t.maieklowleftthai = 0xf88c;
- t.maieklowrightthai = 0xf88b;
- t.maiekthai = 0x0e48;
- t.maiekupperleftthai = 0xf88a;
- t.maihanakatleftthai = 0xf884;
- t.maihanakatthai = 0x0e31;
- t.maitaikhuleftthai = 0xf889;
- t.maitaikhuthai = 0x0e47;
- t.maitholowleftthai = 0xf88f;
- t.maitholowrightthai = 0xf88e;
- t.maithothai = 0x0e49;
- t.maithoupperleftthai = 0xf88d;
- t.maitrilowleftthai = 0xf892;
- t.maitrilowrightthai = 0xf891;
- t.maitrithai = 0x0e4a;
- t.maitriupperleftthai = 0xf890;
- t.maiyamokthai = 0x0e46;
- t.makatakana = 0x30de;
- t.makatakanahalfwidth = 0xff8f;
- t.male = 0x2642;
- t.mansyonsquare = 0x3347;
- t.maqafhebrew = 0x05be;
- t.mars = 0x2642;
- t.masoracirclehebrew = 0x05af;
- t.masquare = 0x3383;
- t.mbopomofo = 0x3107;
- t.mbsquare = 0x33d4;
- t.mcircle = 0x24dc;
- t.mcubedsquare = 0x33a5;
- t.mdotaccent = 0x1e41;
- t.mdotbelow = 0x1e43;
- t.meemarabic = 0x0645;
- t.meemfinalarabic = 0xfee2;
- t.meeminitialarabic = 0xfee3;
- t.meemmedialarabic = 0xfee4;
- t.meemmeeminitialarabic = 0xfcd1;
- t.meemmeemisolatedarabic = 0xfc48;
- t.meetorusquare = 0x334d;
- t.mehiragana = 0x3081;
- t.meizierasquare = 0x337e;
- t.mekatakana = 0x30e1;
- t.mekatakanahalfwidth = 0xff92;
- t.mem = 0x05de;
- t.memdagesh = 0xfb3e;
- t.memdageshhebrew = 0xfb3e;
- t.memhebrew = 0x05de;
- t.menarmenian = 0x0574;
- t.merkhahebrew = 0x05a5;
- t.merkhakefulahebrew = 0x05a6;
- t.merkhakefulalefthebrew = 0x05a6;
- t.merkhalefthebrew = 0x05a5;
- t.mhook = 0x0271;
- t.mhzsquare = 0x3392;
- t.middledotkatakanahalfwidth = 0xff65;
- t.middot = 0x00b7;
- t.mieumacirclekorean = 0x3272;
- t.mieumaparenkorean = 0x3212;
- t.mieumcirclekorean = 0x3264;
- t.mieumkorean = 0x3141;
- t.mieumpansioskorean = 0x3170;
- t.mieumparenkorean = 0x3204;
- t.mieumpieupkorean = 0x316e;
- t.mieumsioskorean = 0x316f;
- t.mihiragana = 0x307f;
- t.mikatakana = 0x30df;
- t.mikatakanahalfwidth = 0xff90;
- t.minus = 0x2212;
- t.minusbelowcmb = 0x0320;
- t.minuscircle = 0x2296;
- t.minusmod = 0x02d7;
- t.minusplus = 0x2213;
- t.minute = 0x2032;
- t.miribaarusquare = 0x334a;
- t.mirisquare = 0x3349;
- t.mlonglegturned = 0x0270;
- t.mlsquare = 0x3396;
- t.mmcubedsquare = 0x33a3;
- t.mmonospace = 0xff4d;
- t.mmsquaredsquare = 0x339f;
- t.mohiragana = 0x3082;
- t.mohmsquare = 0x33c1;
- t.mokatakana = 0x30e2;
- t.mokatakanahalfwidth = 0xff93;
- t.molsquare = 0x33d6;
- t.momathai = 0x0e21;
- t.moverssquare = 0x33a7;
- t.moverssquaredsquare = 0x33a8;
- t.mparen = 0x24a8;
- t.mpasquare = 0x33ab;
- t.mssquare = 0x33b3;
- t.msuperior = 0xf6ef;
- t.mturned = 0x026f;
- t.mu = 0x00b5;
- t.mu1 = 0x00b5;
- t.muasquare = 0x3382;
- t.muchgreater = 0x226b;
- t.muchless = 0x226a;
- t.mufsquare = 0x338c;
- t.mugreek = 0x03bc;
- t.mugsquare = 0x338d;
- t.muhiragana = 0x3080;
- t.mukatakana = 0x30e0;
- t.mukatakanahalfwidth = 0xff91;
- t.mulsquare = 0x3395;
- t.multiply = 0x00d7;
- t.mumsquare = 0x339b;
- t.munahhebrew = 0x05a3;
- t.munahlefthebrew = 0x05a3;
- t.musicalnote = 0x266a;
- t.musicalnotedbl = 0x266b;
- t.musicflatsign = 0x266d;
- t.musicsharpsign = 0x266f;
- t.mussquare = 0x33b2;
- t.muvsquare = 0x33b6;
- t.muwsquare = 0x33bc;
- t.mvmegasquare = 0x33b9;
- t.mvsquare = 0x33b7;
- t.mwmegasquare = 0x33bf;
- t.mwsquare = 0x33bd;
- t.n = 0x006e;
- t.nabengali = 0x09a8;
- t.nabla = 0x2207;
- t.nacute = 0x0144;
- t.nadeva = 0x0928;
- t.nagujarati = 0x0aa8;
- t.nagurmukhi = 0x0a28;
- t.nahiragana = 0x306a;
- t.nakatakana = 0x30ca;
- t.nakatakanahalfwidth = 0xff85;
- t.napostrophe = 0x0149;
- t.nasquare = 0x3381;
- t.nbopomofo = 0x310b;
- t.nbspace = 0x00a0;
- t.ncaron = 0x0148;
- t.ncedilla = 0x0146;
- t.ncircle = 0x24dd;
- t.ncircumflexbelow = 0x1e4b;
- t.ncommaaccent = 0x0146;
- t.ndotaccent = 0x1e45;
- t.ndotbelow = 0x1e47;
- t.nehiragana = 0x306d;
- t.nekatakana = 0x30cd;
- t.nekatakanahalfwidth = 0xff88;
- t.newsheqelsign = 0x20aa;
- t.nfsquare = 0x338b;
- t.ngabengali = 0x0999;
- t.ngadeva = 0x0919;
- t.ngagujarati = 0x0a99;
- t.ngagurmukhi = 0x0a19;
- t.ngonguthai = 0x0e07;
- t.nhiragana = 0x3093;
- t.nhookleft = 0x0272;
- t.nhookretroflex = 0x0273;
- t.nieunacirclekorean = 0x326f;
- t.nieunaparenkorean = 0x320f;
- t.nieuncieuckorean = 0x3135;
- t.nieuncirclekorean = 0x3261;
- t.nieunhieuhkorean = 0x3136;
- t.nieunkorean = 0x3134;
- t.nieunpansioskorean = 0x3168;
- t.nieunparenkorean = 0x3201;
- t.nieunsioskorean = 0x3167;
- t.nieuntikeutkorean = 0x3166;
- t.nihiragana = 0x306b;
- t.nikatakana = 0x30cb;
- t.nikatakanahalfwidth = 0xff86;
- t.nikhahitleftthai = 0xf899;
- t.nikhahitthai = 0x0e4d;
- t.nine = 0x0039;
- t.ninearabic = 0x0669;
- t.ninebengali = 0x09ef;
- t.ninecircle = 0x2468;
- t.ninecircleinversesansserif = 0x2792;
- t.ninedeva = 0x096f;
- t.ninegujarati = 0x0aef;
- t.ninegurmukhi = 0x0a6f;
- t.ninehackarabic = 0x0669;
- t.ninehangzhou = 0x3029;
- t.nineideographicparen = 0x3228;
- t.nineinferior = 0x2089;
- t.ninemonospace = 0xff19;
- t.nineoldstyle = 0xf739;
- t.nineparen = 0x247c;
- t.nineperiod = 0x2490;
- t.ninepersian = 0x06f9;
- t.nineroman = 0x2178;
- t.ninesuperior = 0x2079;
- t.nineteencircle = 0x2472;
- t.nineteenparen = 0x2486;
- t.nineteenperiod = 0x249a;
- t.ninethai = 0x0e59;
- t.nj = 0x01cc;
- t.njecyrillic = 0x045a;
- t.nkatakana = 0x30f3;
- t.nkatakanahalfwidth = 0xff9d;
- t.nlegrightlong = 0x019e;
- t.nlinebelow = 0x1e49;
- t.nmonospace = 0xff4e;
- t.nmsquare = 0x339a;
- t.nnabengali = 0x09a3;
- t.nnadeva = 0x0923;
- t.nnagujarati = 0x0aa3;
- t.nnagurmukhi = 0x0a23;
- t.nnnadeva = 0x0929;
- t.nohiragana = 0x306e;
- t.nokatakana = 0x30ce;
- t.nokatakanahalfwidth = 0xff89;
- t.nonbreakingspace = 0x00a0;
- t.nonenthai = 0x0e13;
- t.nonuthai = 0x0e19;
- t.noonarabic = 0x0646;
- t.noonfinalarabic = 0xfee6;
- t.noonghunnaarabic = 0x06ba;
- t.noonghunnafinalarabic = 0xfb9f;
- t.nooninitialarabic = 0xfee7;
- t.noonjeeminitialarabic = 0xfcd2;
- t.noonjeemisolatedarabic = 0xfc4b;
- t.noonmedialarabic = 0xfee8;
- t.noonmeeminitialarabic = 0xfcd5;
- t.noonmeemisolatedarabic = 0xfc4e;
- t.noonnoonfinalarabic = 0xfc8d;
- t.notcontains = 0x220c;
- t.notelement = 0x2209;
- t.notelementof = 0x2209;
- t.notequal = 0x2260;
- t.notgreater = 0x226f;
- t.notgreaternorequal = 0x2271;
- t.notgreaternorless = 0x2279;
- t.notidentical = 0x2262;
- t.notless = 0x226e;
- t.notlessnorequal = 0x2270;
- t.notparallel = 0x2226;
- t.notprecedes = 0x2280;
- t.notsubset = 0x2284;
- t.notsucceeds = 0x2281;
- t.notsuperset = 0x2285;
- t.nowarmenian = 0x0576;
- t.nparen = 0x24a9;
- t.nssquare = 0x33b1;
- t.nsuperior = 0x207f;
- t.ntilde = 0x00f1;
- t.nu = 0x03bd;
- t.nuhiragana = 0x306c;
- t.nukatakana = 0x30cc;
- t.nukatakanahalfwidth = 0xff87;
- t.nuktabengali = 0x09bc;
- t.nuktadeva = 0x093c;
- t.nuktagujarati = 0x0abc;
- t.nuktagurmukhi = 0x0a3c;
- t.numbersign = 0x0023;
- t.numbersignmonospace = 0xff03;
- t.numbersignsmall = 0xfe5f;
- t.numeralsigngreek = 0x0374;
- t.numeralsignlowergreek = 0x0375;
- t.numero = 0x2116;
- t.nun = 0x05e0;
- t.nundagesh = 0xfb40;
- t.nundageshhebrew = 0xfb40;
- t.nunhebrew = 0x05e0;
- t.nvsquare = 0x33b5;
- t.nwsquare = 0x33bb;
- t.nyabengali = 0x099e;
- t.nyadeva = 0x091e;
- t.nyagujarati = 0x0a9e;
- t.nyagurmukhi = 0x0a1e;
- t.o = 0x006f;
- t.oacute = 0x00f3;
- t.oangthai = 0x0e2d;
- t.obarred = 0x0275;
- t.obarredcyrillic = 0x04e9;
- t.obarreddieresiscyrillic = 0x04eb;
- t.obengali = 0x0993;
- t.obopomofo = 0x311b;
- t.obreve = 0x014f;
- t.ocandradeva = 0x0911;
- t.ocandragujarati = 0x0a91;
- t.ocandravowelsigndeva = 0x0949;
- t.ocandravowelsigngujarati = 0x0ac9;
- t.ocaron = 0x01d2;
- t.ocircle = 0x24de;
- t.ocircumflex = 0x00f4;
- t.ocircumflexacute = 0x1ed1;
- t.ocircumflexdotbelow = 0x1ed9;
- t.ocircumflexgrave = 0x1ed3;
- t.ocircumflexhookabove = 0x1ed5;
- t.ocircumflextilde = 0x1ed7;
- t.ocyrillic = 0x043e;
- t.odblacute = 0x0151;
- t.odblgrave = 0x020d;
- t.odeva = 0x0913;
- t.odieresis = 0x00f6;
- t.odieresiscyrillic = 0x04e7;
- t.odotbelow = 0x1ecd;
- t.oe = 0x0153;
- t.oekorean = 0x315a;
- t.ogonek = 0x02db;
- t.ogonekcmb = 0x0328;
- t.ograve = 0x00f2;
- t.ogujarati = 0x0a93;
- t.oharmenian = 0x0585;
- t.ohiragana = 0x304a;
- t.ohookabove = 0x1ecf;
- t.ohorn = 0x01a1;
- t.ohornacute = 0x1edb;
- t.ohorndotbelow = 0x1ee3;
- t.ohorngrave = 0x1edd;
- t.ohornhookabove = 0x1edf;
- t.ohorntilde = 0x1ee1;
- t.ohungarumlaut = 0x0151;
- t.oi = 0x01a3;
- t.oinvertedbreve = 0x020f;
- t.okatakana = 0x30aa;
- t.okatakanahalfwidth = 0xff75;
- t.okorean = 0x3157;
- t.olehebrew = 0x05ab;
- t.omacron = 0x014d;
- t.omacronacute = 0x1e53;
- t.omacrongrave = 0x1e51;
- t.omdeva = 0x0950;
- t.omega = 0x03c9;
- t.omega1 = 0x03d6;
- t.omegacyrillic = 0x0461;
- t.omegalatinclosed = 0x0277;
- t.omegaroundcyrillic = 0x047b;
- t.omegatitlocyrillic = 0x047d;
- t.omegatonos = 0x03ce;
- t.omgujarati = 0x0ad0;
- t.omicron = 0x03bf;
- t.omicrontonos = 0x03cc;
- t.omonospace = 0xff4f;
- t.one = 0x0031;
- t.onearabic = 0x0661;
- t.onebengali = 0x09e7;
- t.onecircle = 0x2460;
- t.onecircleinversesansserif = 0x278a;
- t.onedeva = 0x0967;
- t.onedotenleader = 0x2024;
- t.oneeighth = 0x215b;
- t.onefitted = 0xf6dc;
- t.onegujarati = 0x0ae7;
- t.onegurmukhi = 0x0a67;
- t.onehackarabic = 0x0661;
- t.onehalf = 0x00bd;
- t.onehangzhou = 0x3021;
- t.oneideographicparen = 0x3220;
- t.oneinferior = 0x2081;
- t.onemonospace = 0xff11;
- t.onenumeratorbengali = 0x09f4;
- t.oneoldstyle = 0xf731;
- t.oneparen = 0x2474;
- t.oneperiod = 0x2488;
- t.onepersian = 0x06f1;
- t.onequarter = 0x00bc;
- t.oneroman = 0x2170;
- t.onesuperior = 0x00b9;
- t.onethai = 0x0e51;
- t.onethird = 0x2153;
- t.oogonek = 0x01eb;
- t.oogonekmacron = 0x01ed;
- t.oogurmukhi = 0x0a13;
- t.oomatragurmukhi = 0x0a4b;
- t.oopen = 0x0254;
- t.oparen = 0x24aa;
- t.openbullet = 0x25e6;
- t.option = 0x2325;
- t.ordfeminine = 0x00aa;
- t.ordmasculine = 0x00ba;
- t.orthogonal = 0x221f;
- t.oshortdeva = 0x0912;
- t.oshortvowelsigndeva = 0x094a;
- t.oslash = 0x00f8;
- t.oslashacute = 0x01ff;
- t.osmallhiragana = 0x3049;
- t.osmallkatakana = 0x30a9;
- t.osmallkatakanahalfwidth = 0xff6b;
- t.ostrokeacute = 0x01ff;
- t.osuperior = 0xf6f0;
- t.otcyrillic = 0x047f;
- t.otilde = 0x00f5;
- t.otildeacute = 0x1e4d;
- t.otildedieresis = 0x1e4f;
- t.oubopomofo = 0x3121;
- t.overline = 0x203e;
- t.overlinecenterline = 0xfe4a;
- t.overlinecmb = 0x0305;
- t.overlinedashed = 0xfe49;
- t.overlinedblwavy = 0xfe4c;
- t.overlinewavy = 0xfe4b;
- t.overscore = 0x00af;
- t.ovowelsignbengali = 0x09cb;
- t.ovowelsigndeva = 0x094b;
- t.ovowelsigngujarati = 0x0acb;
- t.p = 0x0070;
- t.paampssquare = 0x3380;
- t.paasentosquare = 0x332b;
- t.pabengali = 0x09aa;
- t.pacute = 0x1e55;
- t.padeva = 0x092a;
- t.pagedown = 0x21df;
- t.pageup = 0x21de;
- t.pagujarati = 0x0aaa;
- t.pagurmukhi = 0x0a2a;
- t.pahiragana = 0x3071;
- t.paiyannoithai = 0x0e2f;
- t.pakatakana = 0x30d1;
- t.palatalizationcyrilliccmb = 0x0484;
- t.palochkacyrillic = 0x04c0;
- t.pansioskorean = 0x317f;
- t.paragraph = 0x00b6;
- t.parallel = 0x2225;
- t.parenleft = 0x0028;
- t.parenleftaltonearabic = 0xfd3e;
- t.parenleftbt = 0xf8ed;
- t.parenleftex = 0xf8ec;
- t.parenleftinferior = 0x208d;
- t.parenleftmonospace = 0xff08;
- t.parenleftsmall = 0xfe59;
- t.parenleftsuperior = 0x207d;
- t.parenlefttp = 0xf8eb;
- t.parenleftvertical = 0xfe35;
- t.parenright = 0x0029;
- t.parenrightaltonearabic = 0xfd3f;
- t.parenrightbt = 0xf8f8;
- t.parenrightex = 0xf8f7;
- t.parenrightinferior = 0x208e;
- t.parenrightmonospace = 0xff09;
- t.parenrightsmall = 0xfe5a;
- t.parenrightsuperior = 0x207e;
- t.parenrighttp = 0xf8f6;
- t.parenrightvertical = 0xfe36;
- t.partialdiff = 0x2202;
- t.paseqhebrew = 0x05c0;
- t.pashtahebrew = 0x0599;
- t.pasquare = 0x33a9;
- t.patah = 0x05b7;
- t.patah11 = 0x05b7;
- t.patah1d = 0x05b7;
- t.patah2a = 0x05b7;
- t.patahhebrew = 0x05b7;
- t.patahnarrowhebrew = 0x05b7;
- t.patahquarterhebrew = 0x05b7;
- t.patahwidehebrew = 0x05b7;
- t.pazerhebrew = 0x05a1;
- t.pbopomofo = 0x3106;
- t.pcircle = 0x24df;
- t.pdotaccent = 0x1e57;
- t.pe = 0x05e4;
- t.pecyrillic = 0x043f;
- t.pedagesh = 0xfb44;
- t.pedageshhebrew = 0xfb44;
- t.peezisquare = 0x333b;
- t.pefinaldageshhebrew = 0xfb43;
- t.peharabic = 0x067e;
- t.peharmenian = 0x057a;
- t.pehebrew = 0x05e4;
- t.pehfinalarabic = 0xfb57;
- t.pehinitialarabic = 0xfb58;
- t.pehiragana = 0x307a;
- t.pehmedialarabic = 0xfb59;
- t.pekatakana = 0x30da;
- t.pemiddlehookcyrillic = 0x04a7;
- t.perafehebrew = 0xfb4e;
- t.percent = 0x0025;
- t.percentarabic = 0x066a;
- t.percentmonospace = 0xff05;
- t.percentsmall = 0xfe6a;
- t.period = 0x002e;
- t.periodarmenian = 0x0589;
- t.periodcentered = 0x00b7;
- t.periodhalfwidth = 0xff61;
- t.periodinferior = 0xf6e7;
- t.periodmonospace = 0xff0e;
- t.periodsmall = 0xfe52;
- t.periodsuperior = 0xf6e8;
- t.perispomenigreekcmb = 0x0342;
- t.perpendicular = 0x22a5;
- t.perthousand = 0x2030;
- t.peseta = 0x20a7;
- t.pfsquare = 0x338a;
- t.phabengali = 0x09ab;
- t.phadeva = 0x092b;
- t.phagujarati = 0x0aab;
- t.phagurmukhi = 0x0a2b;
- t.phi = 0x03c6;
- t.phi1 = 0x03d5;
- t.phieuphacirclekorean = 0x327a;
- t.phieuphaparenkorean = 0x321a;
- t.phieuphcirclekorean = 0x326c;
- t.phieuphkorean = 0x314d;
- t.phieuphparenkorean = 0x320c;
- t.philatin = 0x0278;
- t.phinthuthai = 0x0e3a;
- t.phisymbolgreek = 0x03d5;
- t.phook = 0x01a5;
- t.phophanthai = 0x0e1e;
- t.phophungthai = 0x0e1c;
- t.phosamphaothai = 0x0e20;
- t.pi = 0x03c0;
- t.pieupacirclekorean = 0x3273;
- t.pieupaparenkorean = 0x3213;
- t.pieupcieuckorean = 0x3176;
- t.pieupcirclekorean = 0x3265;
- t.pieupkiyeokkorean = 0x3172;
- t.pieupkorean = 0x3142;
- t.pieupparenkorean = 0x3205;
- t.pieupsioskiyeokkorean = 0x3174;
- t.pieupsioskorean = 0x3144;
- t.pieupsiostikeutkorean = 0x3175;
- t.pieupthieuthkorean = 0x3177;
- t.pieuptikeutkorean = 0x3173;
- t.pihiragana = 0x3074;
- t.pikatakana = 0x30d4;
- t.pisymbolgreek = 0x03d6;
- t.piwrarmenian = 0x0583;
- t.plus = 0x002b;
- t.plusbelowcmb = 0x031f;
- t.pluscircle = 0x2295;
- t.plusminus = 0x00b1;
- t.plusmod = 0x02d6;
- t.plusmonospace = 0xff0b;
- t.plussmall = 0xfe62;
- t.plussuperior = 0x207a;
- t.pmonospace = 0xff50;
- t.pmsquare = 0x33d8;
- t.pohiragana = 0x307d;
- t.pointingindexdownwhite = 0x261f;
- t.pointingindexleftwhite = 0x261c;
- t.pointingindexrightwhite = 0x261e;
- t.pointingindexupwhite = 0x261d;
- t.pokatakana = 0x30dd;
- t.poplathai = 0x0e1b;
- t.postalmark = 0x3012;
- t.postalmarkface = 0x3020;
- t.pparen = 0x24ab;
- t.precedes = 0x227a;
- t.prescription = 0x211e;
- t.primemod = 0x02b9;
- t.primereversed = 0x2035;
- t.product = 0x220f;
- t.projective = 0x2305;
- t.prolongedkana = 0x30fc;
- t.propellor = 0x2318;
- t.propersubset = 0x2282;
- t.propersuperset = 0x2283;
- t.proportion = 0x2237;
- t.proportional = 0x221d;
- t.psi = 0x03c8;
- t.psicyrillic = 0x0471;
- t.psilipneumatacyrilliccmb = 0x0486;
- t.pssquare = 0x33b0;
- t.puhiragana = 0x3077;
- t.pukatakana = 0x30d7;
- t.pvsquare = 0x33b4;
- t.pwsquare = 0x33ba;
- t.q = 0x0071;
- t.qadeva = 0x0958;
- t.qadmahebrew = 0x05a8;
- t.qafarabic = 0x0642;
- t.qaffinalarabic = 0xfed6;
- t.qafinitialarabic = 0xfed7;
- t.qafmedialarabic = 0xfed8;
- t.qamats = 0x05b8;
- t.qamats10 = 0x05b8;
- t.qamats1a = 0x05b8;
- t.qamats1c = 0x05b8;
- t.qamats27 = 0x05b8;
- t.qamats29 = 0x05b8;
- t.qamats33 = 0x05b8;
- t.qamatsde = 0x05b8;
- t.qamatshebrew = 0x05b8;
- t.qamatsnarrowhebrew = 0x05b8;
- t.qamatsqatanhebrew = 0x05b8;
- t.qamatsqatannarrowhebrew = 0x05b8;
- t.qamatsqatanquarterhebrew = 0x05b8;
- t.qamatsqatanwidehebrew = 0x05b8;
- t.qamatsquarterhebrew = 0x05b8;
- t.qamatswidehebrew = 0x05b8;
- t.qarneyparahebrew = 0x059f;
- t.qbopomofo = 0x3111;
- t.qcircle = 0x24e0;
- t.qhook = 0x02a0;
- t.qmonospace = 0xff51;
- t.qof = 0x05e7;
- t.qofdagesh = 0xfb47;
- t.qofdageshhebrew = 0xfb47;
- t.qofhebrew = 0x05e7;
- t.qparen = 0x24ac;
- t.quarternote = 0x2669;
- t.qubuts = 0x05bb;
- t.qubuts18 = 0x05bb;
- t.qubuts25 = 0x05bb;
- t.qubuts31 = 0x05bb;
- t.qubutshebrew = 0x05bb;
- t.qubutsnarrowhebrew = 0x05bb;
- t.qubutsquarterhebrew = 0x05bb;
- t.qubutswidehebrew = 0x05bb;
- t.question = 0x003f;
- t.questionarabic = 0x061f;
- t.questionarmenian = 0x055e;
- t.questiondown = 0x00bf;
- t.questiondownsmall = 0xf7bf;
- t.questiongreek = 0x037e;
- t.questionmonospace = 0xff1f;
- t.questionsmall = 0xf73f;
- t.quotedbl = 0x0022;
- t.quotedblbase = 0x201e;
- t.quotedblleft = 0x201c;
- t.quotedblmonospace = 0xff02;
- t.quotedblprime = 0x301e;
- t.quotedblprimereversed = 0x301d;
- t.quotedblright = 0x201d;
- t.quoteleft = 0x2018;
- t.quoteleftreversed = 0x201b;
- t.quotereversed = 0x201b;
- t.quoteright = 0x2019;
- t.quoterightn = 0x0149;
- t.quotesinglbase = 0x201a;
- t.quotesingle = 0x0027;
- t.quotesinglemonospace = 0xff07;
- t.r = 0x0072;
- t.raarmenian = 0x057c;
- t.rabengali = 0x09b0;
- t.racute = 0x0155;
- t.radeva = 0x0930;
- t.radical = 0x221a;
- t.radicalex = 0xf8e5;
- t.radoverssquare = 0x33ae;
- t.radoverssquaredsquare = 0x33af;
- t.radsquare = 0x33ad;
- t.rafe = 0x05bf;
- t.rafehebrew = 0x05bf;
- t.ragujarati = 0x0ab0;
- t.ragurmukhi = 0x0a30;
- t.rahiragana = 0x3089;
- t.rakatakana = 0x30e9;
- t.rakatakanahalfwidth = 0xff97;
- t.ralowerdiagonalbengali = 0x09f1;
- t.ramiddlediagonalbengali = 0x09f0;
- t.ramshorn = 0x0264;
- t.ratio = 0x2236;
- t.rbopomofo = 0x3116;
- t.rcaron = 0x0159;
- t.rcedilla = 0x0157;
- t.rcircle = 0x24e1;
- t.rcommaaccent = 0x0157;
- t.rdblgrave = 0x0211;
- t.rdotaccent = 0x1e59;
- t.rdotbelow = 0x1e5b;
- t.rdotbelowmacron = 0x1e5d;
- t.referencemark = 0x203b;
- t.reflexsubset = 0x2286;
- t.reflexsuperset = 0x2287;
- t.registered = 0x00ae;
- t.registersans = 0xf8e8;
- t.registerserif = 0xf6da;
- t.reharabic = 0x0631;
- t.reharmenian = 0x0580;
- t.rehfinalarabic = 0xfeae;
- t.rehiragana = 0x308c;
- t.rekatakana = 0x30ec;
- t.rekatakanahalfwidth = 0xff9a;
- t.resh = 0x05e8;
- t.reshdageshhebrew = 0xfb48;
- t.reshhebrew = 0x05e8;
- t.reversedtilde = 0x223d;
- t.reviahebrew = 0x0597;
- t.reviamugrashhebrew = 0x0597;
- t.revlogicalnot = 0x2310;
- t.rfishhook = 0x027e;
- t.rfishhookreversed = 0x027f;
- t.rhabengali = 0x09dd;
- t.rhadeva = 0x095d;
- t.rho = 0x03c1;
- t.rhook = 0x027d;
- t.rhookturned = 0x027b;
- t.rhookturnedsuperior = 0x02b5;
- t.rhosymbolgreek = 0x03f1;
- t.rhotichookmod = 0x02de;
- t.rieulacirclekorean = 0x3271;
- t.rieulaparenkorean = 0x3211;
- t.rieulcirclekorean = 0x3263;
- t.rieulhieuhkorean = 0x3140;
- t.rieulkiyeokkorean = 0x313a;
- t.rieulkiyeoksioskorean = 0x3169;
- t.rieulkorean = 0x3139;
- t.rieulmieumkorean = 0x313b;
- t.rieulpansioskorean = 0x316c;
- t.rieulparenkorean = 0x3203;
- t.rieulphieuphkorean = 0x313f;
- t.rieulpieupkorean = 0x313c;
- t.rieulpieupsioskorean = 0x316b;
- t.rieulsioskorean = 0x313d;
- t.rieulthieuthkorean = 0x313e;
- t.rieultikeutkorean = 0x316a;
- t.rieulyeorinhieuhkorean = 0x316d;
- t.rightangle = 0x221f;
- t.righttackbelowcmb = 0x0319;
- t.righttriangle = 0x22bf;
- t.rihiragana = 0x308a;
- t.rikatakana = 0x30ea;
- t.rikatakanahalfwidth = 0xff98;
- t.ring = 0x02da;
- t.ringbelowcmb = 0x0325;
- t.ringcmb = 0x030a;
- t.ringhalfleft = 0x02bf;
- t.ringhalfleftarmenian = 0x0559;
- t.ringhalfleftbelowcmb = 0x031c;
- t.ringhalfleftcentered = 0x02d3;
- t.ringhalfright = 0x02be;
- t.ringhalfrightbelowcmb = 0x0339;
- t.ringhalfrightcentered = 0x02d2;
- t.rinvertedbreve = 0x0213;
- t.rittorusquare = 0x3351;
- t.rlinebelow = 0x1e5f;
- t.rlongleg = 0x027c;
- t.rlonglegturned = 0x027a;
- t.rmonospace = 0xff52;
- t.rohiragana = 0x308d;
- t.rokatakana = 0x30ed;
- t.rokatakanahalfwidth = 0xff9b;
- t.roruathai = 0x0e23;
- t.rparen = 0x24ad;
- t.rrabengali = 0x09dc;
- t.rradeva = 0x0931;
- t.rragurmukhi = 0x0a5c;
- t.rreharabic = 0x0691;
- t.rrehfinalarabic = 0xfb8d;
- t.rrvocalicbengali = 0x09e0;
- t.rrvocalicdeva = 0x0960;
- t.rrvocalicgujarati = 0x0ae0;
- t.rrvocalicvowelsignbengali = 0x09c4;
- t.rrvocalicvowelsigndeva = 0x0944;
- t.rrvocalicvowelsigngujarati = 0x0ac4;
- t.rsuperior = 0xf6f1;
- t.rtblock = 0x2590;
- t.rturned = 0x0279;
- t.rturnedsuperior = 0x02b4;
- t.ruhiragana = 0x308b;
- t.rukatakana = 0x30eb;
- t.rukatakanahalfwidth = 0xff99;
- t.rupeemarkbengali = 0x09f2;
- t.rupeesignbengali = 0x09f3;
- t.rupiah = 0xf6dd;
- t.ruthai = 0x0e24;
- t.rvocalicbengali = 0x098b;
- t.rvocalicdeva = 0x090b;
- t.rvocalicgujarati = 0x0a8b;
- t.rvocalicvowelsignbengali = 0x09c3;
- t.rvocalicvowelsigndeva = 0x0943;
- t.rvocalicvowelsigngujarati = 0x0ac3;
- t.s = 0x0073;
- t.sabengali = 0x09b8;
- t.sacute = 0x015b;
- t.sacutedotaccent = 0x1e65;
- t.sadarabic = 0x0635;
- t.sadeva = 0x0938;
- t.sadfinalarabic = 0xfeba;
- t.sadinitialarabic = 0xfebb;
- t.sadmedialarabic = 0xfebc;
- t.sagujarati = 0x0ab8;
- t.sagurmukhi = 0x0a38;
- t.sahiragana = 0x3055;
- t.sakatakana = 0x30b5;
- t.sakatakanahalfwidth = 0xff7b;
- t.sallallahoualayhewasallamarabic = 0xfdfa;
- t.samekh = 0x05e1;
- t.samekhdagesh = 0xfb41;
- t.samekhdageshhebrew = 0xfb41;
- t.samekhhebrew = 0x05e1;
- t.saraaathai = 0x0e32;
- t.saraaethai = 0x0e41;
- t.saraaimaimalaithai = 0x0e44;
- t.saraaimaimuanthai = 0x0e43;
- t.saraamthai = 0x0e33;
- t.saraathai = 0x0e30;
- t.saraethai = 0x0e40;
- t.saraiileftthai = 0xf886;
- t.saraiithai = 0x0e35;
- t.saraileftthai = 0xf885;
- t.saraithai = 0x0e34;
- t.saraothai = 0x0e42;
- t.saraueeleftthai = 0xf888;
- t.saraueethai = 0x0e37;
- t.saraueleftthai = 0xf887;
- t.sarauethai = 0x0e36;
- t.sarauthai = 0x0e38;
- t.sarauuthai = 0x0e39;
- t.sbopomofo = 0x3119;
- t.scaron = 0x0161;
- t.scarondotaccent = 0x1e67;
- t.scedilla = 0x015f;
- t.schwa = 0x0259;
- t.schwacyrillic = 0x04d9;
- t.schwadieresiscyrillic = 0x04db;
- t.schwahook = 0x025a;
- t.scircle = 0x24e2;
- t.scircumflex = 0x015d;
- t.scommaaccent = 0x0219;
- t.sdotaccent = 0x1e61;
- t.sdotbelow = 0x1e63;
- t.sdotbelowdotaccent = 0x1e69;
- t.seagullbelowcmb = 0x033c;
- t.second = 0x2033;
- t.secondtonechinese = 0x02ca;
- t.section = 0x00a7;
- t.seenarabic = 0x0633;
- t.seenfinalarabic = 0xfeb2;
- t.seeninitialarabic = 0xfeb3;
- t.seenmedialarabic = 0xfeb4;
- t.segol = 0x05b6;
- t.segol13 = 0x05b6;
- t.segol1f = 0x05b6;
- t.segol2c = 0x05b6;
- t.segolhebrew = 0x05b6;
- t.segolnarrowhebrew = 0x05b6;
- t.segolquarterhebrew = 0x05b6;
- t.segoltahebrew = 0x0592;
- t.segolwidehebrew = 0x05b6;
- t.seharmenian = 0x057d;
- t.sehiragana = 0x305b;
- t.sekatakana = 0x30bb;
- t.sekatakanahalfwidth = 0xff7e;
- t.semicolon = 0x003b;
- t.semicolonarabic = 0x061b;
- t.semicolonmonospace = 0xff1b;
- t.semicolonsmall = 0xfe54;
- t.semivoicedmarkkana = 0x309c;
- t.semivoicedmarkkanahalfwidth = 0xff9f;
- t.sentisquare = 0x3322;
- t.sentosquare = 0x3323;
- t.seven = 0x0037;
- t.sevenarabic = 0x0667;
- t.sevenbengali = 0x09ed;
- t.sevencircle = 0x2466;
- t.sevencircleinversesansserif = 0x2790;
- t.sevendeva = 0x096d;
- t.seveneighths = 0x215e;
- t.sevengujarati = 0x0aed;
- t.sevengurmukhi = 0x0a6d;
- t.sevenhackarabic = 0x0667;
- t.sevenhangzhou = 0x3027;
- t.sevenideographicparen = 0x3226;
- t.seveninferior = 0x2087;
- t.sevenmonospace = 0xff17;
- t.sevenoldstyle = 0xf737;
- t.sevenparen = 0x247a;
- t.sevenperiod = 0x248e;
- t.sevenpersian = 0x06f7;
- t.sevenroman = 0x2176;
- t.sevensuperior = 0x2077;
- t.seventeencircle = 0x2470;
- t.seventeenparen = 0x2484;
- t.seventeenperiod = 0x2498;
- t.seventhai = 0x0e57;
- t.sfthyphen = 0x00ad;
- t.shaarmenian = 0x0577;
- t.shabengali = 0x09b6;
- t.shacyrillic = 0x0448;
- t.shaddaarabic = 0x0651;
- t.shaddadammaarabic = 0xfc61;
- t.shaddadammatanarabic = 0xfc5e;
- t.shaddafathaarabic = 0xfc60;
- t.shaddakasraarabic = 0xfc62;
- t.shaddakasratanarabic = 0xfc5f;
- t.shade = 0x2592;
- t.shadedark = 0x2593;
- t.shadelight = 0x2591;
- t.shademedium = 0x2592;
- t.shadeva = 0x0936;
- t.shagujarati = 0x0ab6;
- t.shagurmukhi = 0x0a36;
- t.shalshelethebrew = 0x0593;
- t.shbopomofo = 0x3115;
- t.shchacyrillic = 0x0449;
- t.sheenarabic = 0x0634;
- t.sheenfinalarabic = 0xfeb6;
- t.sheeninitialarabic = 0xfeb7;
- t.sheenmedialarabic = 0xfeb8;
- t.sheicoptic = 0x03e3;
- t.sheqel = 0x20aa;
- t.sheqelhebrew = 0x20aa;
- t.sheva = 0x05b0;
- t.sheva115 = 0x05b0;
- t.sheva15 = 0x05b0;
- t.sheva22 = 0x05b0;
- t.sheva2e = 0x05b0;
- t.shevahebrew = 0x05b0;
- t.shevanarrowhebrew = 0x05b0;
- t.shevaquarterhebrew = 0x05b0;
- t.shevawidehebrew = 0x05b0;
- t.shhacyrillic = 0x04bb;
- t.shimacoptic = 0x03ed;
- t.shin = 0x05e9;
- t.shindagesh = 0xfb49;
- t.shindageshhebrew = 0xfb49;
- t.shindageshshindot = 0xfb2c;
- t.shindageshshindothebrew = 0xfb2c;
- t.shindageshsindot = 0xfb2d;
- t.shindageshsindothebrew = 0xfb2d;
- t.shindothebrew = 0x05c1;
- t.shinhebrew = 0x05e9;
- t.shinshindot = 0xfb2a;
- t.shinshindothebrew = 0xfb2a;
- t.shinsindot = 0xfb2b;
- t.shinsindothebrew = 0xfb2b;
- t.shook = 0x0282;
- t.sigma = 0x03c3;
- t.sigma1 = 0x03c2;
- t.sigmafinal = 0x03c2;
- t.sigmalunatesymbolgreek = 0x03f2;
- t.sihiragana = 0x3057;
- t.sikatakana = 0x30b7;
- t.sikatakanahalfwidth = 0xff7c;
- t.siluqhebrew = 0x05bd;
- t.siluqlefthebrew = 0x05bd;
- t.similar = 0x223c;
- t.sindothebrew = 0x05c2;
- t.siosacirclekorean = 0x3274;
- t.siosaparenkorean = 0x3214;
- t.sioscieuckorean = 0x317e;
- t.sioscirclekorean = 0x3266;
- t.sioskiyeokkorean = 0x317a;
- t.sioskorean = 0x3145;
- t.siosnieunkorean = 0x317b;
- t.siosparenkorean = 0x3206;
- t.siospieupkorean = 0x317d;
- t.siostikeutkorean = 0x317c;
- t.six = 0x0036;
- t.sixarabic = 0x0666;
- t.sixbengali = 0x09ec;
- t.sixcircle = 0x2465;
- t.sixcircleinversesansserif = 0x278f;
- t.sixdeva = 0x096c;
- t.sixgujarati = 0x0aec;
- t.sixgurmukhi = 0x0a6c;
- t.sixhackarabic = 0x0666;
- t.sixhangzhou = 0x3026;
- t.sixideographicparen = 0x3225;
- t.sixinferior = 0x2086;
- t.sixmonospace = 0xff16;
- t.sixoldstyle = 0xf736;
- t.sixparen = 0x2479;
- t.sixperiod = 0x248d;
- t.sixpersian = 0x06f6;
- t.sixroman = 0x2175;
- t.sixsuperior = 0x2076;
- t.sixteencircle = 0x246f;
- t.sixteencurrencydenominatorbengali = 0x09f9;
- t.sixteenparen = 0x2483;
- t.sixteenperiod = 0x2497;
- t.sixthai = 0x0e56;
- t.slash = 0x002f;
- t.slashmonospace = 0xff0f;
- t.slong = 0x017f;
- t.slongdotaccent = 0x1e9b;
- t.smileface = 0x263a;
- t.smonospace = 0xff53;
- t.sofpasuqhebrew = 0x05c3;
- t.softhyphen = 0x00ad;
- t.softsigncyrillic = 0x044c;
- t.sohiragana = 0x305d;
- t.sokatakana = 0x30bd;
- t.sokatakanahalfwidth = 0xff7f;
- t.soliduslongoverlaycmb = 0x0338;
- t.solidusshortoverlaycmb = 0x0337;
- t.sorusithai = 0x0e29;
- t.sosalathai = 0x0e28;
- t.sosothai = 0x0e0b;
- t.sosuathai = 0x0e2a;
- t.space = 0x0020;
- t.spacehackarabic = 0x0020;
- t.spade = 0x2660;
- t.spadesuitblack = 0x2660;
- t.spadesuitwhite = 0x2664;
- t.sparen = 0x24ae;
- t.squarebelowcmb = 0x033b;
- t.squarecc = 0x33c4;
- t.squarecm = 0x339d;
- t.squarediagonalcrosshatchfill = 0x25a9;
- t.squarehorizontalfill = 0x25a4;
- t.squarekg = 0x338f;
- t.squarekm = 0x339e;
- t.squarekmcapital = 0x33ce;
- t.squareln = 0x33d1;
- t.squarelog = 0x33d2;
- t.squaremg = 0x338e;
- t.squaremil = 0x33d5;
- t.squaremm = 0x339c;
- t.squaremsquared = 0x33a1;
- t.squareorthogonalcrosshatchfill = 0x25a6;
- t.squareupperlefttolowerrightfill = 0x25a7;
- t.squareupperrighttolowerleftfill = 0x25a8;
- t.squareverticalfill = 0x25a5;
- t.squarewhitewithsmallblack = 0x25a3;
- t.srsquare = 0x33db;
- t.ssabengali = 0x09b7;
- t.ssadeva = 0x0937;
- t.ssagujarati = 0x0ab7;
- t.ssangcieuckorean = 0x3149;
- t.ssanghieuhkorean = 0x3185;
- t.ssangieungkorean = 0x3180;
- t.ssangkiyeokkorean = 0x3132;
- t.ssangnieunkorean = 0x3165;
- t.ssangpieupkorean = 0x3143;
- t.ssangsioskorean = 0x3146;
- t.ssangtikeutkorean = 0x3138;
- t.ssuperior = 0xf6f2;
- t.sterling = 0x00a3;
- t.sterlingmonospace = 0xffe1;
- t.strokelongoverlaycmb = 0x0336;
- t.strokeshortoverlaycmb = 0x0335;
- t.subset = 0x2282;
- t.subsetnotequal = 0x228a;
- t.subsetorequal = 0x2286;
- t.succeeds = 0x227b;
- t.suchthat = 0x220b;
- t.suhiragana = 0x3059;
- t.sukatakana = 0x30b9;
- t.sukatakanahalfwidth = 0xff7d;
- t.sukunarabic = 0x0652;
- t.summation = 0x2211;
- t.sun = 0x263c;
- t.superset = 0x2283;
- t.supersetnotequal = 0x228b;
- t.supersetorequal = 0x2287;
- t.svsquare = 0x33dc;
- t.syouwaerasquare = 0x337c;
- t.t = 0x0074;
- t.tabengali = 0x09a4;
- t.tackdown = 0x22a4;
- t.tackleft = 0x22a3;
- t.tadeva = 0x0924;
- t.tagujarati = 0x0aa4;
- t.tagurmukhi = 0x0a24;
- t.taharabic = 0x0637;
- t.tahfinalarabic = 0xfec2;
- t.tahinitialarabic = 0xfec3;
- t.tahiragana = 0x305f;
- t.tahmedialarabic = 0xfec4;
- t.taisyouerasquare = 0x337d;
- t.takatakana = 0x30bf;
- t.takatakanahalfwidth = 0xff80;
- t.tatweelarabic = 0x0640;
- t.tau = 0x03c4;
- t.tav = 0x05ea;
- t.tavdages = 0xfb4a;
- t.tavdagesh = 0xfb4a;
- t.tavdageshhebrew = 0xfb4a;
- t.tavhebrew = 0x05ea;
- t.tbar = 0x0167;
- t.tbopomofo = 0x310a;
- t.tcaron = 0x0165;
- t.tccurl = 0x02a8;
- t.tcedilla = 0x0163;
- t.tcheharabic = 0x0686;
- t.tchehfinalarabic = 0xfb7b;
- t.tchehinitialarabic = 0xfb7c;
- t.tchehmedialarabic = 0xfb7d;
- t.tcircle = 0x24e3;
- t.tcircumflexbelow = 0x1e71;
- t.tcommaaccent = 0x0163;
- t.tdieresis = 0x1e97;
- t.tdotaccent = 0x1e6b;
- t.tdotbelow = 0x1e6d;
- t.tecyrillic = 0x0442;
- t.tedescendercyrillic = 0x04ad;
- t.teharabic = 0x062a;
- t.tehfinalarabic = 0xfe96;
- t.tehhahinitialarabic = 0xfca2;
- t.tehhahisolatedarabic = 0xfc0c;
- t.tehinitialarabic = 0xfe97;
- t.tehiragana = 0x3066;
- t.tehjeeminitialarabic = 0xfca1;
- t.tehjeemisolatedarabic = 0xfc0b;
- t.tehmarbutaarabic = 0x0629;
- t.tehmarbutafinalarabic = 0xfe94;
- t.tehmedialarabic = 0xfe98;
- t.tehmeeminitialarabic = 0xfca4;
- t.tehmeemisolatedarabic = 0xfc0e;
- t.tehnoonfinalarabic = 0xfc73;
- t.tekatakana = 0x30c6;
- t.tekatakanahalfwidth = 0xff83;
- t.telephone = 0x2121;
- t.telephoneblack = 0x260e;
- t.telishagedolahebrew = 0x05a0;
- t.telishaqetanahebrew = 0x05a9;
- t.tencircle = 0x2469;
- t.tenideographicparen = 0x3229;
- t.tenparen = 0x247d;
- t.tenperiod = 0x2491;
- t.tenroman = 0x2179;
- t.tesh = 0x02a7;
- t.tet = 0x05d8;
- t.tetdagesh = 0xfb38;
- t.tetdageshhebrew = 0xfb38;
- t.tethebrew = 0x05d8;
- t.tetsecyrillic = 0x04b5;
- t.tevirhebrew = 0x059b;
- t.tevirlefthebrew = 0x059b;
- t.thabengali = 0x09a5;
- t.thadeva = 0x0925;
- t.thagujarati = 0x0aa5;
- t.thagurmukhi = 0x0a25;
- t.thalarabic = 0x0630;
- t.thalfinalarabic = 0xfeac;
- t.thanthakhatlowleftthai = 0xf898;
- t.thanthakhatlowrightthai = 0xf897;
- t.thanthakhatthai = 0x0e4c;
- t.thanthakhatupperleftthai = 0xf896;
- t.theharabic = 0x062b;
- t.thehfinalarabic = 0xfe9a;
- t.thehinitialarabic = 0xfe9b;
- t.thehmedialarabic = 0xfe9c;
- t.thereexists = 0x2203;
- t.therefore = 0x2234;
- t.theta = 0x03b8;
- t.theta1 = 0x03d1;
- t.thetasymbolgreek = 0x03d1;
- t.thieuthacirclekorean = 0x3279;
- t.thieuthaparenkorean = 0x3219;
- t.thieuthcirclekorean = 0x326b;
- t.thieuthkorean = 0x314c;
- t.thieuthparenkorean = 0x320b;
- t.thirteencircle = 0x246c;
- t.thirteenparen = 0x2480;
- t.thirteenperiod = 0x2494;
- t.thonangmonthothai = 0x0e11;
- t.thook = 0x01ad;
- t.thophuthaothai = 0x0e12;
- t.thorn = 0x00fe;
- t.thothahanthai = 0x0e17;
- t.thothanthai = 0x0e10;
- t.thothongthai = 0x0e18;
- t.thothungthai = 0x0e16;
- t.thousandcyrillic = 0x0482;
- t.thousandsseparatorarabic = 0x066c;
- t.thousandsseparatorpersian = 0x066c;
- t.three = 0x0033;
- t.threearabic = 0x0663;
- t.threebengali = 0x09e9;
- t.threecircle = 0x2462;
- t.threecircleinversesansserif = 0x278c;
- t.threedeva = 0x0969;
- t.threeeighths = 0x215c;
- t.threegujarati = 0x0ae9;
- t.threegurmukhi = 0x0a69;
- t.threehackarabic = 0x0663;
- t.threehangzhou = 0x3023;
- t.threeideographicparen = 0x3222;
- t.threeinferior = 0x2083;
- t.threemonospace = 0xff13;
- t.threenumeratorbengali = 0x09f6;
- t.threeoldstyle = 0xf733;
- t.threeparen = 0x2476;
- t.threeperiod = 0x248a;
- t.threepersian = 0x06f3;
- t.threequarters = 0x00be;
- t.threequartersemdash = 0xf6de;
- t.threeroman = 0x2172;
- t.threesuperior = 0x00b3;
- t.threethai = 0x0e53;
- t.thzsquare = 0x3394;
- t.tihiragana = 0x3061;
- t.tikatakana = 0x30c1;
- t.tikatakanahalfwidth = 0xff81;
- t.tikeutacirclekorean = 0x3270;
- t.tikeutaparenkorean = 0x3210;
- t.tikeutcirclekorean = 0x3262;
- t.tikeutkorean = 0x3137;
- t.tikeutparenkorean = 0x3202;
- t.tilde = 0x02dc;
- t.tildebelowcmb = 0x0330;
- t.tildecmb = 0x0303;
- t.tildecomb = 0x0303;
- t.tildedoublecmb = 0x0360;
- t.tildeoperator = 0x223c;
- t.tildeoverlaycmb = 0x0334;
- t.tildeverticalcmb = 0x033e;
- t.timescircle = 0x2297;
- t.tipehahebrew = 0x0596;
- t.tipehalefthebrew = 0x0596;
- t.tippigurmukhi = 0x0a70;
- t.titlocyrilliccmb = 0x0483;
- t.tiwnarmenian = 0x057f;
- t.tlinebelow = 0x1e6f;
- t.tmonospace = 0xff54;
- t.toarmenian = 0x0569;
- t.tohiragana = 0x3068;
- t.tokatakana = 0x30c8;
- t.tokatakanahalfwidth = 0xff84;
- t.tonebarextrahighmod = 0x02e5;
- t.tonebarextralowmod = 0x02e9;
- t.tonebarhighmod = 0x02e6;
- t.tonebarlowmod = 0x02e8;
- t.tonebarmidmod = 0x02e7;
- t.tonefive = 0x01bd;
- t.tonesix = 0x0185;
- t.tonetwo = 0x01a8;
- t.tonos = 0x0384;
- t.tonsquare = 0x3327;
- t.topatakthai = 0x0e0f;
- t.tortoiseshellbracketleft = 0x3014;
- t.tortoiseshellbracketleftsmall = 0xfe5d;
- t.tortoiseshellbracketleftvertical = 0xfe39;
- t.tortoiseshellbracketright = 0x3015;
- t.tortoiseshellbracketrightsmall = 0xfe5e;
- t.tortoiseshellbracketrightvertical = 0xfe3a;
- t.totaothai = 0x0e15;
- t.tpalatalhook = 0x01ab;
- t.tparen = 0x24af;
- t.trademark = 0x2122;
- t.trademarksans = 0xf8ea;
- t.trademarkserif = 0xf6db;
- t.tretroflexhook = 0x0288;
- t.triagdn = 0x25bc;
- t.triaglf = 0x25c4;
- t.triagrt = 0x25ba;
- t.triagup = 0x25b2;
- t.ts = 0x02a6;
- t.tsadi = 0x05e6;
- t.tsadidagesh = 0xfb46;
- t.tsadidageshhebrew = 0xfb46;
- t.tsadihebrew = 0x05e6;
- t.tsecyrillic = 0x0446;
- t.tsere = 0x05b5;
- t.tsere12 = 0x05b5;
- t.tsere1e = 0x05b5;
- t.tsere2b = 0x05b5;
- t.tserehebrew = 0x05b5;
- t.tserenarrowhebrew = 0x05b5;
- t.tserequarterhebrew = 0x05b5;
- t.tserewidehebrew = 0x05b5;
- t.tshecyrillic = 0x045b;
- t.tsuperior = 0xf6f3;
- t.ttabengali = 0x099f;
- t.ttadeva = 0x091f;
- t.ttagujarati = 0x0a9f;
- t.ttagurmukhi = 0x0a1f;
- t.tteharabic = 0x0679;
- t.ttehfinalarabic = 0xfb67;
- t.ttehinitialarabic = 0xfb68;
- t.ttehmedialarabic = 0xfb69;
- t.tthabengali = 0x09a0;
- t.tthadeva = 0x0920;
- t.tthagujarati = 0x0aa0;
- t.tthagurmukhi = 0x0a20;
- t.tturned = 0x0287;
- t.tuhiragana = 0x3064;
- t.tukatakana = 0x30c4;
- t.tukatakanahalfwidth = 0xff82;
- t.tusmallhiragana = 0x3063;
- t.tusmallkatakana = 0x30c3;
- t.tusmallkatakanahalfwidth = 0xff6f;
- t.twelvecircle = 0x246b;
- t.twelveparen = 0x247f;
- t.twelveperiod = 0x2493;
- t.twelveroman = 0x217b;
- t.twentycircle = 0x2473;
- t.twentyhangzhou = 0x5344;
- t.twentyparen = 0x2487;
- t.twentyperiod = 0x249b;
- t.two = 0x0032;
- t.twoarabic = 0x0662;
- t.twobengali = 0x09e8;
- t.twocircle = 0x2461;
- t.twocircleinversesansserif = 0x278b;
- t.twodeva = 0x0968;
- t.twodotenleader = 0x2025;
- t.twodotleader = 0x2025;
- t.twodotleadervertical = 0xfe30;
- t.twogujarati = 0x0ae8;
- t.twogurmukhi = 0x0a68;
- t.twohackarabic = 0x0662;
- t.twohangzhou = 0x3022;
- t.twoideographicparen = 0x3221;
- t.twoinferior = 0x2082;
- t.twomonospace = 0xff12;
- t.twonumeratorbengali = 0x09f5;
- t.twooldstyle = 0xf732;
- t.twoparen = 0x2475;
- t.twoperiod = 0x2489;
- t.twopersian = 0x06f2;
- t.tworoman = 0x2171;
- t.twostroke = 0x01bb;
- t.twosuperior = 0x00b2;
- t.twothai = 0x0e52;
- t.twothirds = 0x2154;
- t.u = 0x0075;
- t.uacute = 0x00fa;
- t.ubar = 0x0289;
- t.ubengali = 0x0989;
- t.ubopomofo = 0x3128;
- t.ubreve = 0x016d;
- t.ucaron = 0x01d4;
- t.ucircle = 0x24e4;
- t.ucircumflex = 0x00fb;
- t.ucircumflexbelow = 0x1e77;
- t.ucyrillic = 0x0443;
- t.udattadeva = 0x0951;
- t.udblacute = 0x0171;
- t.udblgrave = 0x0215;
- t.udeva = 0x0909;
- t.udieresis = 0x00fc;
- t.udieresisacute = 0x01d8;
- t.udieresisbelow = 0x1e73;
- t.udieresiscaron = 0x01da;
- t.udieresiscyrillic = 0x04f1;
- t.udieresisgrave = 0x01dc;
- t.udieresismacron = 0x01d6;
- t.udotbelow = 0x1ee5;
- t.ugrave = 0x00f9;
- t.ugujarati = 0x0a89;
- t.ugurmukhi = 0x0a09;
- t.uhiragana = 0x3046;
- t.uhookabove = 0x1ee7;
- t.uhorn = 0x01b0;
- t.uhornacute = 0x1ee9;
- t.uhorndotbelow = 0x1ef1;
- t.uhorngrave = 0x1eeb;
- t.uhornhookabove = 0x1eed;
- t.uhorntilde = 0x1eef;
- t.uhungarumlaut = 0x0171;
- t.uhungarumlautcyrillic = 0x04f3;
- t.uinvertedbreve = 0x0217;
- t.ukatakana = 0x30a6;
- t.ukatakanahalfwidth = 0xff73;
- t.ukcyrillic = 0x0479;
- t.ukorean = 0x315c;
- t.umacron = 0x016b;
- t.umacroncyrillic = 0x04ef;
- t.umacrondieresis = 0x1e7b;
- t.umatragurmukhi = 0x0a41;
- t.umonospace = 0xff55;
- t.underscore = 0x005f;
- t.underscoredbl = 0x2017;
- t.underscoremonospace = 0xff3f;
- t.underscorevertical = 0xfe33;
- t.underscorewavy = 0xfe4f;
- t.union = 0x222a;
- t.universal = 0x2200;
- t.uogonek = 0x0173;
- t.uparen = 0x24b0;
- t.upblock = 0x2580;
- t.upperdothebrew = 0x05c4;
- t.upsilon = 0x03c5;
- t.upsilondieresis = 0x03cb;
- t.upsilondieresistonos = 0x03b0;
- t.upsilonlatin = 0x028a;
- t.upsilontonos = 0x03cd;
- t.uptackbelowcmb = 0x031d;
- t.uptackmod = 0x02d4;
- t.uragurmukhi = 0x0a73;
- t.uring = 0x016f;
- t.ushortcyrillic = 0x045e;
- t.usmallhiragana = 0x3045;
- t.usmallkatakana = 0x30a5;
- t.usmallkatakanahalfwidth = 0xff69;
- t.ustraightcyrillic = 0x04af;
- t.ustraightstrokecyrillic = 0x04b1;
- t.utilde = 0x0169;
- t.utildeacute = 0x1e79;
- t.utildebelow = 0x1e75;
- t.uubengali = 0x098a;
- t.uudeva = 0x090a;
- t.uugujarati = 0x0a8a;
- t.uugurmukhi = 0x0a0a;
- t.uumatragurmukhi = 0x0a42;
- t.uuvowelsignbengali = 0x09c2;
- t.uuvowelsigndeva = 0x0942;
- t.uuvowelsigngujarati = 0x0ac2;
- t.uvowelsignbengali = 0x09c1;
- t.uvowelsigndeva = 0x0941;
- t.uvowelsigngujarati = 0x0ac1;
- t.v = 0x0076;
- t.vadeva = 0x0935;
- t.vagujarati = 0x0ab5;
- t.vagurmukhi = 0x0a35;
- t.vakatakana = 0x30f7;
- t.vav = 0x05d5;
- t.vavdagesh = 0xfb35;
- t.vavdagesh65 = 0xfb35;
- t.vavdageshhebrew = 0xfb35;
- t.vavhebrew = 0x05d5;
- t.vavholam = 0xfb4b;
- t.vavholamhebrew = 0xfb4b;
- t.vavvavhebrew = 0x05f0;
- t.vavyodhebrew = 0x05f1;
- t.vcircle = 0x24e5;
- t.vdotbelow = 0x1e7f;
- t.vecyrillic = 0x0432;
- t.veharabic = 0x06a4;
- t.vehfinalarabic = 0xfb6b;
- t.vehinitialarabic = 0xfb6c;
- t.vehmedialarabic = 0xfb6d;
- t.vekatakana = 0x30f9;
- t.venus = 0x2640;
- t.verticalbar = 0x007c;
- t.verticallineabovecmb = 0x030d;
- t.verticallinebelowcmb = 0x0329;
- t.verticallinelowmod = 0x02cc;
- t.verticallinemod = 0x02c8;
- t.vewarmenian = 0x057e;
- t.vhook = 0x028b;
- t.vikatakana = 0x30f8;
- t.viramabengali = 0x09cd;
- t.viramadeva = 0x094d;
- t.viramagujarati = 0x0acd;
- t.visargabengali = 0x0983;
- t.visargadeva = 0x0903;
- t.visargagujarati = 0x0a83;
- t.vmonospace = 0xff56;
- t.voarmenian = 0x0578;
- t.voicediterationhiragana = 0x309e;
- t.voicediterationkatakana = 0x30fe;
- t.voicedmarkkana = 0x309b;
- t.voicedmarkkanahalfwidth = 0xff9e;
- t.vokatakana = 0x30fa;
- t.vparen = 0x24b1;
- t.vtilde = 0x1e7d;
- t.vturned = 0x028c;
- t.vuhiragana = 0x3094;
- t.vukatakana = 0x30f4;
- t.w = 0x0077;
- t.wacute = 0x1e83;
- t.waekorean = 0x3159;
- t.wahiragana = 0x308f;
- t.wakatakana = 0x30ef;
- t.wakatakanahalfwidth = 0xff9c;
- t.wakorean = 0x3158;
- t.wasmallhiragana = 0x308e;
- t.wasmallkatakana = 0x30ee;
- t.wattosquare = 0x3357;
- t.wavedash = 0x301c;
- t.wavyunderscorevertical = 0xfe34;
- t.wawarabic = 0x0648;
- t.wawfinalarabic = 0xfeee;
- t.wawhamzaabovearabic = 0x0624;
- t.wawhamzaabovefinalarabic = 0xfe86;
- t.wbsquare = 0x33dd;
- t.wcircle = 0x24e6;
- t.wcircumflex = 0x0175;
- t.wdieresis = 0x1e85;
- t.wdotaccent = 0x1e87;
- t.wdotbelow = 0x1e89;
- t.wehiragana = 0x3091;
- t.weierstrass = 0x2118;
- t.wekatakana = 0x30f1;
- t.wekorean = 0x315e;
- t.weokorean = 0x315d;
- t.wgrave = 0x1e81;
- t.whitebullet = 0x25e6;
- t.whitecircle = 0x25cb;
- t.whitecircleinverse = 0x25d9;
- t.whitecornerbracketleft = 0x300e;
- t.whitecornerbracketleftvertical = 0xfe43;
- t.whitecornerbracketright = 0x300f;
- t.whitecornerbracketrightvertical = 0xfe44;
- t.whitediamond = 0x25c7;
- t.whitediamondcontainingblacksmalldiamond = 0x25c8;
- t.whitedownpointingsmalltriangle = 0x25bf;
- t.whitedownpointingtriangle = 0x25bd;
- t.whiteleftpointingsmalltriangle = 0x25c3;
- t.whiteleftpointingtriangle = 0x25c1;
- t.whitelenticularbracketleft = 0x3016;
- t.whitelenticularbracketright = 0x3017;
- t.whiterightpointingsmalltriangle = 0x25b9;
- t.whiterightpointingtriangle = 0x25b7;
- t.whitesmallsquare = 0x25ab;
- t.whitesmilingface = 0x263a;
- t.whitesquare = 0x25a1;
- t.whitestar = 0x2606;
- t.whitetelephone = 0x260f;
- t.whitetortoiseshellbracketleft = 0x3018;
- t.whitetortoiseshellbracketright = 0x3019;
- t.whiteuppointingsmalltriangle = 0x25b5;
- t.whiteuppointingtriangle = 0x25b3;
- t.wihiragana = 0x3090;
- t.wikatakana = 0x30f0;
- t.wikorean = 0x315f;
- t.wmonospace = 0xff57;
- t.wohiragana = 0x3092;
- t.wokatakana = 0x30f2;
- t.wokatakanahalfwidth = 0xff66;
- t.won = 0x20a9;
- t.wonmonospace = 0xffe6;
- t.wowaenthai = 0x0e27;
- t.wparen = 0x24b2;
- t.wring = 0x1e98;
- t.wsuperior = 0x02b7;
- t.wturned = 0x028d;
- t.wynn = 0x01bf;
- t.x = 0x0078;
- t.xabovecmb = 0x033d;
- t.xbopomofo = 0x3112;
- t.xcircle = 0x24e7;
- t.xdieresis = 0x1e8d;
- t.xdotaccent = 0x1e8b;
- t.xeharmenian = 0x056d;
- t.xi = 0x03be;
- t.xmonospace = 0xff58;
- t.xparen = 0x24b3;
- t.xsuperior = 0x02e3;
- t.y = 0x0079;
- t.yaadosquare = 0x334e;
- t.yabengali = 0x09af;
- t.yacute = 0x00fd;
- t.yadeva = 0x092f;
- t.yaekorean = 0x3152;
- t.yagujarati = 0x0aaf;
- t.yagurmukhi = 0x0a2f;
- t.yahiragana = 0x3084;
- t.yakatakana = 0x30e4;
- t.yakatakanahalfwidth = 0xff94;
- t.yakorean = 0x3151;
- t.yamakkanthai = 0x0e4e;
- t.yasmallhiragana = 0x3083;
- t.yasmallkatakana = 0x30e3;
- t.yasmallkatakanahalfwidth = 0xff6c;
- t.yatcyrillic = 0x0463;
- t.ycircle = 0x24e8;
- t.ycircumflex = 0x0177;
- t.ydieresis = 0x00ff;
- t.ydotaccent = 0x1e8f;
- t.ydotbelow = 0x1ef5;
- t.yeharabic = 0x064a;
- t.yehbarreearabic = 0x06d2;
- t.yehbarreefinalarabic = 0xfbaf;
- t.yehfinalarabic = 0xfef2;
- t.yehhamzaabovearabic = 0x0626;
- t.yehhamzaabovefinalarabic = 0xfe8a;
- t.yehhamzaaboveinitialarabic = 0xfe8b;
- t.yehhamzaabovemedialarabic = 0xfe8c;
- t.yehinitialarabic = 0xfef3;
- t.yehmedialarabic = 0xfef4;
- t.yehmeeminitialarabic = 0xfcdd;
- t.yehmeemisolatedarabic = 0xfc58;
- t.yehnoonfinalarabic = 0xfc94;
- t.yehthreedotsbelowarabic = 0x06d1;
- t.yekorean = 0x3156;
- t.yen = 0x00a5;
- t.yenmonospace = 0xffe5;
- t.yeokorean = 0x3155;
- t.yeorinhieuhkorean = 0x3186;
- t.yerahbenyomohebrew = 0x05aa;
- t.yerahbenyomolefthebrew = 0x05aa;
- t.yericyrillic = 0x044b;
- t.yerudieresiscyrillic = 0x04f9;
- t.yesieungkorean = 0x3181;
- t.yesieungpansioskorean = 0x3183;
- t.yesieungsioskorean = 0x3182;
- t.yetivhebrew = 0x059a;
- t.ygrave = 0x1ef3;
- t.yhook = 0x01b4;
- t.yhookabove = 0x1ef7;
- t.yiarmenian = 0x0575;
- t.yicyrillic = 0x0457;
- t.yikorean = 0x3162;
- t.yinyang = 0x262f;
- t.yiwnarmenian = 0x0582;
- t.ymonospace = 0xff59;
- t.yod = 0x05d9;
- t.yoddagesh = 0xfb39;
- t.yoddageshhebrew = 0xfb39;
- t.yodhebrew = 0x05d9;
- t.yodyodhebrew = 0x05f2;
- t.yodyodpatahhebrew = 0xfb1f;
- t.yohiragana = 0x3088;
- t.yoikorean = 0x3189;
- t.yokatakana = 0x30e8;
- t.yokatakanahalfwidth = 0xff96;
- t.yokorean = 0x315b;
- t.yosmallhiragana = 0x3087;
- t.yosmallkatakana = 0x30e7;
- t.yosmallkatakanahalfwidth = 0xff6e;
- t.yotgreek = 0x03f3;
- t.yoyaekorean = 0x3188;
- t.yoyakorean = 0x3187;
- t.yoyakthai = 0x0e22;
- t.yoyingthai = 0x0e0d;
- t.yparen = 0x24b4;
- t.ypogegrammeni = 0x037a;
- t.ypogegrammenigreekcmb = 0x0345;
- t.yr = 0x01a6;
- t.yring = 0x1e99;
- t.ysuperior = 0x02b8;
- t.ytilde = 0x1ef9;
- t.yturned = 0x028e;
- t.yuhiragana = 0x3086;
- t.yuikorean = 0x318c;
- t.yukatakana = 0x30e6;
- t.yukatakanahalfwidth = 0xff95;
- t.yukorean = 0x3160;
- t.yusbigcyrillic = 0x046b;
- t.yusbigiotifiedcyrillic = 0x046d;
- t.yuslittlecyrillic = 0x0467;
- t.yuslittleiotifiedcyrillic = 0x0469;
- t.yusmallhiragana = 0x3085;
- t.yusmallkatakana = 0x30e5;
- t.yusmallkatakanahalfwidth = 0xff6d;
- t.yuyekorean = 0x318b;
- t.yuyeokorean = 0x318a;
- t.yyabengali = 0x09df;
- t.yyadeva = 0x095f;
- t.z = 0x007a;
- t.zaarmenian = 0x0566;
- t.zacute = 0x017a;
- t.zadeva = 0x095b;
- t.zagurmukhi = 0x0a5b;
- t.zaharabic = 0x0638;
- t.zahfinalarabic = 0xfec6;
- t.zahinitialarabic = 0xfec7;
- t.zahiragana = 0x3056;
- t.zahmedialarabic = 0xfec8;
- t.zainarabic = 0x0632;
- t.zainfinalarabic = 0xfeb0;
- t.zakatakana = 0x30b6;
- t.zaqefgadolhebrew = 0x0595;
- t.zaqefqatanhebrew = 0x0594;
- t.zarqahebrew = 0x0598;
- t.zayin = 0x05d6;
- t.zayindagesh = 0xfb36;
- t.zayindageshhebrew = 0xfb36;
- t.zayinhebrew = 0x05d6;
- t.zbopomofo = 0x3117;
- t.zcaron = 0x017e;
- t.zcircle = 0x24e9;
- t.zcircumflex = 0x1e91;
- t.zcurl = 0x0291;
- t.zdot = 0x017c;
- t.zdotaccent = 0x017c;
- t.zdotbelow = 0x1e93;
- t.zecyrillic = 0x0437;
- t.zedescendercyrillic = 0x0499;
- t.zedieresiscyrillic = 0x04df;
- t.zehiragana = 0x305c;
- t.zekatakana = 0x30bc;
- t.zero = 0x0030;
- t.zeroarabic = 0x0660;
- t.zerobengali = 0x09e6;
- t.zerodeva = 0x0966;
- t.zerogujarati = 0x0ae6;
- t.zerogurmukhi = 0x0a66;
- t.zerohackarabic = 0x0660;
- t.zeroinferior = 0x2080;
- t.zeromonospace = 0xff10;
- t.zerooldstyle = 0xf730;
- t.zeropersian = 0x06f0;
- t.zerosuperior = 0x2070;
- t.zerothai = 0x0e50;
- t.zerowidthjoiner = 0xfeff;
- t.zerowidthnonjoiner = 0x200c;
- t.zerowidthspace = 0x200b;
- t.zeta = 0x03b6;
- t.zhbopomofo = 0x3113;
- t.zhearmenian = 0x056a;
- t.zhebrevecyrillic = 0x04c2;
- t.zhecyrillic = 0x0436;
- t.zhedescendercyrillic = 0x0497;
- t.zhedieresiscyrillic = 0x04dd;
- t.zihiragana = 0x3058;
- t.zikatakana = 0x30b8;
- t.zinorhebrew = 0x05ae;
- t.zlinebelow = 0x1e95;
- t.zmonospace = 0xff5a;
- t.zohiragana = 0x305e;
- t.zokatakana = 0x30be;
- t.zparen = 0x24b5;
- t.zretroflexhook = 0x0290;
- t.zstroke = 0x01b6;
- t.zuhiragana = 0x305a;
- t.zukatakana = 0x30ba;
- t[".notdef"] = 0x0000;
- t.angbracketleftbig = 0x2329;
- t.angbracketleftBig = 0x2329;
- t.angbracketleftbigg = 0x2329;
- t.angbracketleftBigg = 0x2329;
- t.angbracketrightBig = 0x232a;
- t.angbracketrightbig = 0x232a;
- t.angbracketrightBigg = 0x232a;
- t.angbracketrightbigg = 0x232a;
- t.arrowhookleft = 0x21aa;
- t.arrowhookright = 0x21a9;
- t.arrowlefttophalf = 0x21bc;
- t.arrowleftbothalf = 0x21bd;
- t.arrownortheast = 0x2197;
- t.arrownorthwest = 0x2196;
- t.arrowrighttophalf = 0x21c0;
- t.arrowrightbothalf = 0x21c1;
- t.arrowsoutheast = 0x2198;
- t.arrowsouthwest = 0x2199;
- t.backslashbig = 0x2216;
- t.backslashBig = 0x2216;
- t.backslashBigg = 0x2216;
- t.backslashbigg = 0x2216;
- t.bardbl = 0x2016;
- t.bracehtipdownleft = 0xfe37;
- t.bracehtipdownright = 0xfe37;
- t.bracehtipupleft = 0xfe38;
- t.bracehtipupright = 0xfe38;
- t.braceleftBig = 0x007b;
- t.braceleftbig = 0x007b;
- t.braceleftbigg = 0x007b;
- t.braceleftBigg = 0x007b;
- t.bracerightBig = 0x007d;
- t.bracerightbig = 0x007d;
- t.bracerightbigg = 0x007d;
- t.bracerightBigg = 0x007d;
- t.bracketleftbig = 0x005b;
- t.bracketleftBig = 0x005b;
- t.bracketleftbigg = 0x005b;
- t.bracketleftBigg = 0x005b;
- t.bracketrightBig = 0x005d;
- t.bracketrightbig = 0x005d;
- t.bracketrightbigg = 0x005d;
- t.bracketrightBigg = 0x005d;
- t.ceilingleftbig = 0x2308;
- t.ceilingleftBig = 0x2308;
- t.ceilingleftBigg = 0x2308;
- t.ceilingleftbigg = 0x2308;
- t.ceilingrightbig = 0x2309;
- t.ceilingrightBig = 0x2309;
- t.ceilingrightbigg = 0x2309;
- t.ceilingrightBigg = 0x2309;
- t.circledotdisplay = 0x2299;
- t.circledottext = 0x2299;
- t.circlemultiplydisplay = 0x2297;
- t.circlemultiplytext = 0x2297;
- t.circleplusdisplay = 0x2295;
- t.circleplustext = 0x2295;
- t.contintegraldisplay = 0x222e;
- t.contintegraltext = 0x222e;
- t.coproductdisplay = 0x2210;
- t.coproducttext = 0x2210;
- t.floorleftBig = 0x230a;
- t.floorleftbig = 0x230a;
- t.floorleftbigg = 0x230a;
- t.floorleftBigg = 0x230a;
- t.floorrightbig = 0x230b;
- t.floorrightBig = 0x230b;
- t.floorrightBigg = 0x230b;
- t.floorrightbigg = 0x230b;
- t.hatwide = 0x0302;
- t.hatwider = 0x0302;
- t.hatwidest = 0x0302;
- t.intercal = 0x1d40;
- t.integraldisplay = 0x222b;
- t.integraltext = 0x222b;
- t.intersectiondisplay = 0x22c2;
- t.intersectiontext = 0x22c2;
- t.logicalanddisplay = 0x2227;
- t.logicalandtext = 0x2227;
- t.logicalordisplay = 0x2228;
- t.logicalortext = 0x2228;
- t.parenleftBig = 0x0028;
- t.parenleftbig = 0x0028;
- t.parenleftBigg = 0x0028;
- t.parenleftbigg = 0x0028;
- t.parenrightBig = 0x0029;
- t.parenrightbig = 0x0029;
- t.parenrightBigg = 0x0029;
- t.parenrightbigg = 0x0029;
- t.prime = 0x2032;
- t.productdisplay = 0x220f;
- t.producttext = 0x220f;
- t.radicalbig = 0x221a;
- t.radicalBig = 0x221a;
- t.radicalBigg = 0x221a;
- t.radicalbigg = 0x221a;
- t.radicalbt = 0x221a;
- t.radicaltp = 0x221a;
- t.radicalvertex = 0x221a;
- t.slashbig = 0x002f;
- t.slashBig = 0x002f;
- t.slashBigg = 0x002f;
- t.slashbigg = 0x002f;
- t.summationdisplay = 0x2211;
- t.summationtext = 0x2211;
- t.tildewide = 0x02dc;
- t.tildewider = 0x02dc;
- t.tildewidest = 0x02dc;
- t.uniondisplay = 0x22c3;
- t.unionmultidisplay = 0x228e;
- t.unionmultitext = 0x228e;
- t.unionsqdisplay = 0x2294;
- t.unionsqtext = 0x2294;
- t.uniontext = 0x22c3;
- t.vextenddouble = 0x2225;
- t.vextendsingle = 0x2223;
-});
-var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {
- t.space = 0x0020;
- t.a1 = 0x2701;
- t.a2 = 0x2702;
- t.a202 = 0x2703;
- t.a3 = 0x2704;
- t.a4 = 0x260e;
- t.a5 = 0x2706;
- t.a119 = 0x2707;
- t.a118 = 0x2708;
- t.a117 = 0x2709;
- t.a11 = 0x261b;
- t.a12 = 0x261e;
- t.a13 = 0x270c;
- t.a14 = 0x270d;
- t.a15 = 0x270e;
- t.a16 = 0x270f;
- t.a105 = 0x2710;
- t.a17 = 0x2711;
- t.a18 = 0x2712;
- t.a19 = 0x2713;
- t.a20 = 0x2714;
- t.a21 = 0x2715;
- t.a22 = 0x2716;
- t.a23 = 0x2717;
- t.a24 = 0x2718;
- t.a25 = 0x2719;
- t.a26 = 0x271a;
- t.a27 = 0x271b;
- t.a28 = 0x271c;
- t.a6 = 0x271d;
- t.a7 = 0x271e;
- t.a8 = 0x271f;
- t.a9 = 0x2720;
- t.a10 = 0x2721;
- t.a29 = 0x2722;
- t.a30 = 0x2723;
- t.a31 = 0x2724;
- t.a32 = 0x2725;
- t.a33 = 0x2726;
- t.a34 = 0x2727;
- t.a35 = 0x2605;
- t.a36 = 0x2729;
- t.a37 = 0x272a;
- t.a38 = 0x272b;
- t.a39 = 0x272c;
- t.a40 = 0x272d;
- t.a41 = 0x272e;
- t.a42 = 0x272f;
- t.a43 = 0x2730;
- t.a44 = 0x2731;
- t.a45 = 0x2732;
- t.a46 = 0x2733;
- t.a47 = 0x2734;
- t.a48 = 0x2735;
- t.a49 = 0x2736;
- t.a50 = 0x2737;
- t.a51 = 0x2738;
- t.a52 = 0x2739;
- t.a53 = 0x273a;
- t.a54 = 0x273b;
- t.a55 = 0x273c;
- t.a56 = 0x273d;
- t.a57 = 0x273e;
- t.a58 = 0x273f;
- t.a59 = 0x2740;
- t.a60 = 0x2741;
- t.a61 = 0x2742;
- t.a62 = 0x2743;
- t.a63 = 0x2744;
- t.a64 = 0x2745;
- t.a65 = 0x2746;
- t.a66 = 0x2747;
- t.a67 = 0x2748;
- t.a68 = 0x2749;
- t.a69 = 0x274a;
- t.a70 = 0x274b;
- t.a71 = 0x25cf;
- t.a72 = 0x274d;
- t.a73 = 0x25a0;
- t.a74 = 0x274f;
- t.a203 = 0x2750;
- t.a75 = 0x2751;
- t.a204 = 0x2752;
- t.a76 = 0x25b2;
- t.a77 = 0x25bc;
- t.a78 = 0x25c6;
- t.a79 = 0x2756;
- t.a81 = 0x25d7;
- t.a82 = 0x2758;
- t.a83 = 0x2759;
- t.a84 = 0x275a;
- t.a97 = 0x275b;
- t.a98 = 0x275c;
- t.a99 = 0x275d;
- t.a100 = 0x275e;
- t.a101 = 0x2761;
- t.a102 = 0x2762;
- t.a103 = 0x2763;
- t.a104 = 0x2764;
- t.a106 = 0x2765;
- t.a107 = 0x2766;
- t.a108 = 0x2767;
- t.a112 = 0x2663;
- t.a111 = 0x2666;
- t.a110 = 0x2665;
- t.a109 = 0x2660;
- t.a120 = 0x2460;
- t.a121 = 0x2461;
- t.a122 = 0x2462;
- t.a123 = 0x2463;
- t.a124 = 0x2464;
- t.a125 = 0x2465;
- t.a126 = 0x2466;
- t.a127 = 0x2467;
- t.a128 = 0x2468;
- t.a129 = 0x2469;
- t.a130 = 0x2776;
- t.a131 = 0x2777;
- t.a132 = 0x2778;
- t.a133 = 0x2779;
- t.a134 = 0x277a;
- t.a135 = 0x277b;
- t.a136 = 0x277c;
- t.a137 = 0x277d;
- t.a138 = 0x277e;
- t.a139 = 0x277f;
- t.a140 = 0x2780;
- t.a141 = 0x2781;
- t.a142 = 0x2782;
- t.a143 = 0x2783;
- t.a144 = 0x2784;
- t.a145 = 0x2785;
- t.a146 = 0x2786;
- t.a147 = 0x2787;
- t.a148 = 0x2788;
- t.a149 = 0x2789;
- t.a150 = 0x278a;
- t.a151 = 0x278b;
- t.a152 = 0x278c;
- t.a153 = 0x278d;
- t.a154 = 0x278e;
- t.a155 = 0x278f;
- t.a156 = 0x2790;
- t.a157 = 0x2791;
- t.a158 = 0x2792;
- t.a159 = 0x2793;
- t.a160 = 0x2794;
- t.a161 = 0x2192;
- t.a163 = 0x2194;
- t.a164 = 0x2195;
- t.a196 = 0x2798;
- t.a165 = 0x2799;
- t.a192 = 0x279a;
- t.a166 = 0x279b;
- t.a167 = 0x279c;
- t.a168 = 0x279d;
- t.a169 = 0x279e;
- t.a170 = 0x279f;
- t.a171 = 0x27a0;
- t.a172 = 0x27a1;
- t.a173 = 0x27a2;
- t.a162 = 0x27a3;
- t.a174 = 0x27a4;
- t.a175 = 0x27a5;
- t.a176 = 0x27a6;
- t.a177 = 0x27a7;
- t.a178 = 0x27a8;
- t.a179 = 0x27a9;
- t.a193 = 0x27aa;
- t.a180 = 0x27ab;
- t.a199 = 0x27ac;
- t.a181 = 0x27ad;
- t.a200 = 0x27ae;
- t.a182 = 0x27af;
- t.a201 = 0x27b1;
- t.a183 = 0x27b2;
- t.a184 = 0x27b3;
- t.a197 = 0x27b4;
- t.a185 = 0x27b5;
- t.a194 = 0x27b6;
- t.a198 = 0x27b7;
- t.a186 = 0x27b8;
- t.a195 = 0x27b9;
- t.a187 = 0x27ba;
- t.a188 = 0x27bb;
- t.a189 = 0x27bc;
- t.a190 = 0x27bd;
- t.a191 = 0x27be;
- t.a89 = 0x2768;
- t.a90 = 0x2769;
- t.a93 = 0x276a;
- t.a94 = 0x276b;
- t.a91 = 0x276c;
- t.a92 = 0x276d;
- t.a205 = 0x276e;
- t.a85 = 0x276f;
- t.a206 = 0x2770;
- t.a86 = 0x2771;
- t.a87 = 0x2772;
- t.a88 = 0x2773;
- t.a95 = 0x2774;
- t.a96 = 0x2775;
- t[".notdef"] = 0x0000;
-});
-exports.getGlyphsUnicode = getGlyphsUnicode;
-exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;
-
-/***/ }),
-/* 35 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = 
exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = 
exports.getNonStdFontMap = exports.getStdFontMap = void 0;
-
-var _core_utils = __w_pdfjs_require__(8);
-
-const getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t.ArialNarrow = "Helvetica";
-  t["ArialNarrow-Bold"] = "Helvetica-Bold";
-  t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique";
-  t["ArialNarrow-Italic"] = "Helvetica-Oblique";
-  t.ArialBlack = "Helvetica";
-  t["ArialBlack-Bold"] = "Helvetica-Bold";
-  t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique";
-  t["ArialBlack-Italic"] = "Helvetica-Oblique";
-  t["Arial-Black"] = "Helvetica";
-  t["Arial-Black-Bold"] = "Helvetica-Bold";
-  t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique";
-  t["Arial-Black-Italic"] = "Helvetica-Oblique";
-  t.Arial = "Helvetica";
-  t["Arial-Bold"] = "Helvetica-Bold";
-  t["Arial-BoldItalic"] = "Helvetica-BoldOblique";
-  t["Arial-Italic"] = "Helvetica-Oblique";
-  t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique";
-  t["Arial-BoldMT"] = "Helvetica-Bold";
-  t["Arial-ItalicMT"] = "Helvetica-Oblique";
-  t.ArialMT = "Helvetica";
-  t["Courier-Bold"] = "Courier-Bold";
-  t["Courier-BoldItalic"] = "Courier-BoldOblique";
-  t["Courier-Italic"] = "Courier-Oblique";
-  t.CourierNew = "Courier";
-  t["CourierNew-Bold"] = "Courier-Bold";
-  t["CourierNew-BoldItalic"] = "Courier-BoldOblique";
-  t["CourierNew-Italic"] = "Courier-Oblique";
-  t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique";
-  t["CourierNewPS-BoldMT"] = "Courier-Bold";
-  t["CourierNewPS-ItalicMT"] = "Courier-Oblique";
-  t.CourierNewPSMT = "Courier";
-  t.Helvetica = "Helvetica";
-  t["Helvetica-Bold"] = "Helvetica-Bold";
-  t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique";
-  t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique";
-  t["Helvetica-Italic"] = "Helvetica-Oblique";
-  t["Helvetica-Oblique"] = "Helvetica-Oblique";
-  t["Symbol-Bold"] = "Symbol";
-  t["Symbol-BoldItalic"] = "Symbol";
-  t["Symbol-Italic"] = "Symbol";
-  t.TimesNewRoman = "Times-Roman";
-  t["TimesNewRoman-Bold"] = "Times-Bold";
-  t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic";
-  t["TimesNewRoman-Italic"] = "Times-Italic";
-  t.TimesNewRomanPS = "Times-Roman";
-  t["TimesNewRomanPS-Bold"] = "Times-Bold";
-  t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic";
-  t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic";
-  t["TimesNewRomanPS-BoldMT"] = "Times-Bold";
-  t["TimesNewRomanPS-Italic"] = "Times-Italic";
-  t["TimesNewRomanPS-ItalicMT"] = "Times-Italic";
-  t.TimesNewRomanPSMT = "Times-Roman";
-  t["TimesNewRomanPSMT-Bold"] = "Times-Bold";
-  t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic";
-  t["TimesNewRomanPSMT-Italic"] = "Times-Italic";
-});
-exports.getStdFontMap = getStdFontMap;
-const getNonStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t.Calibri = "Helvetica";
-  t["Calibri-Bold"] = "Helvetica-Bold";
-  t["Calibri-BoldItalic"] = "Helvetica-BoldOblique";
-  t["Calibri-Italic"] = "Helvetica-Oblique";
-  t.CenturyGothic = "Helvetica";
-  t["CenturyGothic-Bold"] = "Helvetica-Bold";
-  t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique";
-  t["CenturyGothic-Italic"] = "Helvetica-Oblique";
-  t.ComicSansMS = "Comic Sans MS";
-  t["ComicSansMS-Bold"] = "Comic Sans MS-Bold";
-  t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic";
-  t["ComicSansMS-Italic"] = "Comic Sans MS-Italic";
-  t.LucidaConsole = "Courier";
-  t["LucidaConsole-Bold"] = "Courier-Bold";
-  t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique";
-  t["LucidaConsole-Italic"] = "Courier-Oblique";
-  t["LucidaSans-Demi"] = "Helvetica-Bold";
-  t["MS-Gothic"] = "MS Gothic";
-  t["MS-Gothic-Bold"] = "MS Gothic-Bold";
-  t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic";
-  t["MS-Gothic-Italic"] = "MS Gothic-Italic";
-  t["MS-Mincho"] = "MS Mincho";
-  t["MS-Mincho-Bold"] = "MS Mincho-Bold";
-  t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic";
-  t["MS-Mincho-Italic"] = "MS Mincho-Italic";
-  t["MS-PGothic"] = "MS PGothic";
-  t["MS-PGothic-Bold"] = "MS PGothic-Bold";
-  t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic";
-  t["MS-PGothic-Italic"] = "MS PGothic-Italic";
-  t["MS-PMincho"] = "MS PMincho";
-  t["MS-PMincho-Bold"] = "MS PMincho-Bold";
-  t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic";
-  t["MS-PMincho-Italic"] = "MS PMincho-Italic";
-  t.NuptialScript = "Times-Italic";
-  t.SegoeUISymbol = "Helvetica";
-  t.Wingdings = "ZapfDingbats";
-  t["Wingdings-Regular"] = "ZapfDingbats";
-});
-exports.getNonStdFontMap = getNonStdFontMap;
-const getSerifFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t["Adobe Jenson"] = true;
-  t["Adobe Text"] = true;
-  t.Albertus = true;
-  t.Aldus = true;
-  t.Alexandria = true;
-  t.Algerian = true;
-  t["American Typewriter"] = true;
-  t.Antiqua = true;
-  t.Apex = true;
-  t.Arno = true;
-  t.Aster = true;
-  t.Aurora = true;
-  t.Baskerville = true;
-  t.Bell = true;
-  t.Bembo = true;
-  t["Bembo Schoolbook"] = true;
-  t.Benguiat = true;
-  t["Berkeley Old Style"] = true;
-  t["Bernhard Modern"] = true;
-  t["Berthold City"] = true;
-  t.Bodoni = true;
-  t["Bauer Bodoni"] = true;
-  t["Book Antiqua"] = true;
-  t.Bookman = true;
-  t["Bordeaux Roman"] = true;
-  t["Californian FB"] = true;
-  t.Calisto = true;
-  t.Calvert = true;
-  t.Capitals = true;
-  t.Cambria = true;
-  t.Cartier = true;
-  t.Caslon = true;
-  t.Catull = true;
-  t.Centaur = true;
-  t["Century Old Style"] = true;
-  t["Century Schoolbook"] = true;
-  t.Chaparral = true;
-  t["Charis SIL"] = true;
-  t.Cheltenham = true;
-  t["Cholla Slab"] = true;
-  t.Clarendon = true;
-  t.Clearface = true;
-  t.Cochin = true;
-  t.Colonna = true;
-  t["Computer Modern"] = true;
-  t["Concrete Roman"] = true;
-  t.Constantia = true;
-  t["Cooper Black"] = true;
-  t.Corona = true;
-  t.Ecotype = true;
-  t.Egyptienne = true;
-  t.Elephant = true;
-  t.Excelsior = true;
-  t.Fairfield = true;
-  t["FF Scala"] = true;
-  t.Folkard = true;
-  t.Footlight = true;
-  t.FreeSerif = true;
-  t["Friz Quadrata"] = true;
-  t.Garamond = true;
-  t.Gentium = true;
-  t.Georgia = true;
-  t.Gloucester = true;
-  t["Goudy Old Style"] = true;
-  t["Goudy Schoolbook"] = true;
-  t["Goudy Pro Font"] = true;
-  t.Granjon = true;
-  t["Guardian Egyptian"] = true;
-  t.Heather = true;
-  t.Hercules = true;
-  t["High Tower Text"] = true;
-  t.Hiroshige = true;
-  t["Hoefler Text"] = true;
-  t["Humana Serif"] = true;
-  t.Imprint = true;
-  t["Ionic No. 5"] = true;
-  t.Janson = true;
-  t.Joanna = true;
-  t.Korinna = true;
-  t.Lexicon = true;
-  t["Liberation Serif"] = true;
-  t["Linux Libertine"] = true;
-  t.Literaturnaya = true;
-  t.Lucida = true;
-  t["Lucida Bright"] = true;
-  t.Melior = true;
-  t.Memphis = true;
-  t.Miller = true;
-  t.Minion = true;
-  t.Modern = true;
-  t["Mona Lisa"] = true;
-  t["Mrs Eaves"] = true;
-  t["MS Serif"] = true;
-  t["Museo Slab"] = true;
-  t["New York"] = true;
-  t["Nimbus Roman"] = true;
-  t["NPS Rawlinson Roadway"] = true;
-  t.NuptialScript = true;
-  t.Palatino = true;
-  t.Perpetua = true;
-  t.Plantin = true;
-  t["Plantin Schoolbook"] = true;
-  t.Playbill = true;
-  t["Poor Richard"] = true;
-  t["Rawlinson Roadway"] = true;
-  t.Renault = true;
-  t.Requiem = true;
-  t.Rockwell = true;
-  t.Roman = true;
-  t["Rotis Serif"] = true;
-  t.Sabon = true;
-  t.Scala = true;
-  t.Seagull = true;
-  t.Sistina = true;
-  t.Souvenir = true;
-  t.STIX = true;
-  t["Stone Informal"] = true;
-  t["Stone Serif"] = true;
-  t.Sylfaen = true;
-  t.Times = true;
-  t.Trajan = true;
-  t["Trinité"] = true;
-  t["Trump Mediaeval"] = true;
-  t.Utopia = true;
-  t["Vale Type"] = true;
-  t["Bitstream Vera"] = true;
-  t["Vera Serif"] = true;
-  t.Versailles = true;
-  t.Wanted = true;
-  t.Weiss = true;
-  t["Wide Latin"] = true;
-  t.Windsor = true;
-  t.XITS = true;
-});
-exports.getSerifFonts = getSerifFonts;
-const getSymbolsFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t.Dingbats = true;
-  t.Symbol = true;
-  t.ZapfDingbats = true;
-});
-exports.getSymbolsFonts = getSymbolsFonts;
-const getGlyphMapForStandardFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t[2] = 10;
-  t[3] = 32;
-  t[4] = 33;
-  t[5] = 34;
-  t[6] = 35;
-  t[7] = 36;
-  t[8] = 37;
-  t[9] = 38;
-  t[10] = 39;
-  t[11] = 40;
-  t[12] = 41;
-  t[13] = 42;
-  t[14] = 43;
-  t[15] = 44;
-  t[16] = 45;
-  t[17] = 46;
-  t[18] = 47;
-  t[19] = 48;
-  t[20] = 49;
-  t[21] = 50;
-  t[22] = 51;
-  t[23] = 52;
-  t[24] = 53;
-  t[25] = 54;
-  t[26] = 55;
-  t[27] = 56;
-  t[28] = 57;
-  t[29] = 58;
-  t[30] = 894;
-  t[31] = 60;
-  t[32] = 61;
-  t[33] = 62;
-  t[34] = 63;
-  t[35] = 64;
-  t[36] = 65;
-  t[37] = 66;
-  t[38] = 67;
-  t[39] = 68;
-  t[40] = 69;
-  t[41] = 70;
-  t[42] = 71;
-  t[43] = 72;
-  t[44] = 73;
-  t[45] = 74;
-  t[46] = 75;
-  t[47] = 76;
-  t[48] = 77;
-  t[49] = 78;
-  t[50] = 79;
-  t[51] = 80;
-  t[52] = 81;
-  t[53] = 82;
-  t[54] = 83;
-  t[55] = 84;
-  t[56] = 85;
-  t[57] = 86;
-  t[58] = 87;
-  t[59] = 88;
-  t[60] = 89;
-  t[61] = 90;
-  t[62] = 91;
-  t[63] = 92;
-  t[64] = 93;
-  t[65] = 94;
-  t[66] = 95;
-  t[67] = 96;
-  t[68] = 97;
-  t[69] = 98;
-  t[70] = 99;
-  t[71] = 100;
-  t[72] = 101;
-  t[73] = 102;
-  t[74] = 103;
-  t[75] = 104;
-  t[76] = 105;
-  t[77] = 106;
-  t[78] = 107;
-  t[79] = 108;
-  t[80] = 109;
-  t[81] = 110;
-  t[82] = 111;
-  t[83] = 112;
-  t[84] = 113;
-  t[85] = 114;
-  t[86] = 115;
-  t[87] = 116;
-  t[88] = 117;
-  t[89] = 118;
-  t[90] = 119;
-  t[91] = 120;
-  t[92] = 121;
-  t[93] = 122;
-  t[94] = 123;
-  t[95] = 124;
-  t[96] = 125;
-  t[97] = 126;
-  t[98] = 196;
-  t[99] = 197;
-  t[100] = 199;
-  t[101] = 201;
-  t[102] = 209;
-  t[103] = 214;
-  t[104] = 220;
-  t[105] = 225;
-  t[106] = 224;
-  t[107] = 226;
-  t[108] = 228;
-  t[109] = 227;
-  t[110] = 229;
-  t[111] = 231;
-  t[112] = 233;
-  t[113] = 232;
-  t[114] = 234;
-  t[115] = 235;
-  t[116] = 237;
-  t[117] = 236;
-  t[118] = 238;
-  t[119] = 239;
-  t[120] = 241;
-  t[121] = 243;
-  t[122] = 242;
-  t[123] = 244;
-  t[124] = 246;
-  t[125] = 245;
-  t[126] = 250;
-  t[127] = 249;
-  t[128] = 251;
-  t[129] = 252;
-  t[130] = 8224;
-  t[131] = 176;
-  t[132] = 162;
-  t[133] = 163;
-  t[134] = 167;
-  t[135] = 8226;
-  t[136] = 182;
-  t[137] = 223;
-  t[138] = 174;
-  t[139] = 169;
-  t[140] = 8482;
-  t[141] = 180;
-  t[142] = 168;
-  t[143] = 8800;
-  t[144] = 198;
-  t[145] = 216;
-  t[146] = 8734;
-  t[147] = 177;
-  t[148] = 8804;
-  t[149] = 8805;
-  t[150] = 165;
-  t[151] = 181;
-  t[152] = 8706;
-  t[153] = 8721;
-  t[154] = 8719;
-  t[156] = 8747;
-  t[157] = 170;
-  t[158] = 186;
-  t[159] = 8486;
-  t[160] = 230;
-  t[161] = 248;
-  t[162] = 191;
-  t[163] = 161;
-  t[164] = 172;
-  t[165] = 8730;
-  t[166] = 402;
-  t[167] = 8776;
-  t[168] = 8710;
-  t[169] = 171;
-  t[170] = 187;
-  t[171] = 8230;
-  t[210] = 218;
-  t[223] = 711;
-  t[224] = 321;
-  t[225] = 322;
-  t[227] = 353;
-  t[229] = 382;
-  t[234] = 253;
-  t[252] = 263;
-  t[253] = 268;
-  t[254] = 269;
-  t[258] = 258;
-  t[260] = 260;
-  t[261] = 261;
-  t[265] = 280;
-  t[266] = 281;
-  t[268] = 283;
-  t[269] = 313;
-  t[275] = 323;
-  t[276] = 324;
-  t[278] = 328;
-  t[284] = 345;
-  t[285] = 346;
-  t[286] = 347;
-  t[292] = 367;
-  t[295] = 377;
-  t[296] = 378;
-  t[298] = 380;
-  t[305] = 963;
-  t[306] = 964;
-  t[307] = 966;
-  t[308] = 8215;
-  t[309] = 8252;
-  t[310] = 8319;
-  t[311] = 8359;
-  t[312] = 8592;
-  t[313] = 8593;
-  t[337] = 9552;
-  t[493] = 1039;
-  t[494] = 1040;
-  t[705] = 1524;
-  t[706] = 8362;
-  t[710] = 64288;
-  t[711] = 64298;
-  t[759] = 1617;
-  t[761] = 1776;
-  t[763] = 1778;
-  t[775] = 1652;
-  t[777] = 1764;
-  t[778] = 1780;
-  t[779] = 1781;
-  t[780] = 1782;
-  t[782] = 771;
-  t[783] = 64726;
-  t[786] = 8363;
-  t[788] = 8532;
-  t[790] = 768;
-  t[791] = 769;
-  t[792] = 768;
-  t[795] = 803;
-  t[797] = 64336;
-  t[798] = 64337;
-  t[799] = 64342;
-  t[800] = 64343;
-  t[801] = 64344;
-  t[802] = 64345;
-  t[803] = 64362;
-  t[804] = 64363;
-  t[805] = 64364;
-  t[2424] = 7821;
-  t[2425] = 7822;
-  t[2426] = 7823;
-  t[2427] = 7824;
-  t[2428] = 7825;
-  t[2429] = 7826;
-  t[2430] = 7827;
-  t[2433] = 7682;
-  t[2678] = 8045;
-  t[2679] = 8046;
-  t[2830] = 1552;
-  t[2838] = 686;
-  t[2840] = 751;
-  t[2842] = 753;
-  t[2843] = 754;
-  t[2844] = 755;
-  t[2846] = 757;
-  t[2856] = 767;
-  t[2857] = 848;
-  t[2858] = 849;
-  t[2862] = 853;
-  t[2863] = 854;
-  t[2864] = 855;
-  t[2865] = 861;
-  t[2866] = 862;
-  t[2906] = 7460;
-  t[2908] = 7462;
-  t[2909] = 7463;
-  t[2910] = 7464;
-  t[2912] = 7466;
-  t[2913] = 7467;
-  t[2914] = 7468;
-  t[2916] = 7470;
-  t[2917] = 7471;
-  t[2918] = 7472;
-  t[2920] = 7474;
-  t[2921] = 7475;
-  t[2922] = 7476;
-  t[2924] = 7478;
-  t[2925] = 7479;
-  t[2926] = 7480;
-  t[2928] = 7482;
-  t[2929] = 7483;
-  t[2930] = 7484;
-  t[2932] = 7486;
-  t[2933] = 7487;
-  t[2934] = 7488;
-  t[2936] = 7490;
-  t[2937] = 7491;
-  t[2938] = 7492;
-  t[2940] = 7494;
-  t[2941] = 7495;
-  t[2942] = 7496;
-  t[2944] = 7498;
-  t[2946] = 7500;
-  t[2948] = 7502;
-  t[2950] = 7504;
-  t[2951] = 7505;
-  t[2952] = 7506;
-  t[2954] = 7508;
-  t[2955] = 7509;
-  t[2956] = 7510;
-  t[2958] = 7512;
-  t[2959] = 7513;
-  t[2960] = 7514;
-  t[2962] = 7516;
-  t[2963] = 7517;
-  t[2964] = 7518;
-  t[2966] = 7520;
-  t[2967] = 7521;
-  t[2968] = 7522;
-  t[2970] = 7524;
-  t[2971] = 7525;
-  t[2972] = 7526;
-  t[2974] = 7528;
-  t[2975] = 7529;
-  t[2976] = 7530;
-  t[2978] = 1537;
-  t[2979] = 1538;
-  t[2980] = 1539;
-  t[2982] = 1549;
-  t[2983] = 1551;
-  t[2984] = 1552;
-  t[2986] = 1554;
-  t[2987] = 1555;
-  t[2988] = 1556;
-  t[2990] = 1623;
-  t[2991] = 1624;
-  t[2995] = 1775;
-  t[2999] = 1791;
-  t[3002] = 64290;
-  t[3003] = 64291;
-  t[3004] = 64292;
-  t[3006] = 64294;
-  t[3007] = 64295;
-  t[3008] = 64296;
-  t[3011] = 1900;
-  t[3014] = 8223;
-  t[3015] = 8244;
-  t[3017] = 7532;
-  t[3018] = 7533;
-  t[3019] = 7534;
-  t[3075] = 7590;
-  t[3076] = 7591;
-  t[3079] = 7594;
-  t[3080] = 7595;
-  t[3083] = 7598;
-  t[3084] = 7599;
-  t[3087] = 7602;
-  t[3088] = 7603;
-  t[3091] = 7606;
-  t[3092] = 7607;
-  t[3095] = 7610;
-  t[3096] = 7611;
-  t[3099] = 7614;
-  t[3100] = 7615;
-  t[3103] = 7618;
-  t[3104] = 7619;
-  t[3107] = 8337;
-  t[3108] = 8338;
-  t[3116] = 1884;
-  t[3119] = 1885;
-  t[3120] = 1885;
-  t[3123] = 1886;
-  t[3124] = 1886;
-  t[3127] = 1887;
-  t[3128] = 1887;
-  t[3131] = 1888;
-  t[3132] = 1888;
-  t[3135] = 1889;
-  t[3136] = 1889;
-  t[3139] = 1890;
-  t[3140] = 1890;
-  t[3143] = 1891;
-  t[3144] = 1891;
-  t[3147] = 1892;
-  t[3148] = 1892;
-  t[3153] = 580;
-  t[3154] = 581;
-  t[3157] = 584;
-  t[3158] = 585;
-  t[3161] = 588;
-  t[3162] = 589;
-  t[3165] = 891;
-  t[3166] = 892;
-  t[3169] = 1274;
-  t[3170] = 1275;
-  t[3173] = 1278;
-  t[3174] = 1279;
-  t[3181] = 7622;
-  t[3182] = 7623;
-  t[3282] = 11799;
-  t[3316] = 578;
-  t[3379] = 42785;
-  t[3393] = 1159;
-  t[3416] = 8377;
-});
-exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;
-const getSupplementalGlyphMapForArialBlack = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t[227] = 322;
-  t[264] = 261;
-  t[291] = 346;
-});
-exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;
-const getSupplementalGlyphMapForCalibri = (0, _core_utils.getLookupTableFactory)(function (t) {
-  t[1] = 32;
-  t[4] = 65;
-  t[17] = 66;
-  t[18] = 67;
-  t[24] = 68;
-  t[28] = 69;
-  t[38] = 70;
-  t[39] = 71;
-  t[44] = 72;
-  t[47] = 73;
-  t[58] = 74;
-  t[60] = 75;
-  t[62] = 76;
-  t[68] = 77;
-  t[69] = 78;
-  t[75] = 79;
-  t[87] = 80;
-  t[89] = 81;
-  t[90] = 82;
-  t[94] = 83;
-  t[100] = 84;
-  t[104] = 85;
-  t[115] = 86;
-  t[116] = 87;
-  t[121] = 88;
-  t[122] = 89;
-  t[127] = 90;
-  t[258] = 97;
-  t[268] = 261;
-  t[271] = 98;
-  t[272] = 99;
-  t[273] = 263;
-  t[282] = 100;
-  t[286] = 101;
-  t[295] = 281;
-  t[296] = 102;
-  t[336] = 103;
-  t[346] = 104;
-  t[349] = 105;
-  t[361] = 106;
-  t[364] = 107;
-  t[367] = 108;
-  t[371] = 322;
-  t[373] = 109;
-  t[374] = 110;
-  t[381] = 111;
-  t[383] = 243;
-  t[393] = 112;
-  t[395] = 113;
-  t[396] = 114;
-  t[400] = 115;
-  t[401] = 347;
-  t[410] = 116;
-  t[437] = 117;
-  t[448] = 118;
-  t[449] = 119;
-  t[454] = 120;
-  t[455] = 121;
-  t[460] = 122;
-  t[463] = 380;
-  t[853] = 44;
-  t[855] = 58;
-  t[856] = 46;
-  t[876] = 47;
-  t[878] = 45;
-  t[882] = 45;
-  t[894] = 40;
-  t[895] = 41;
-  t[896] = 91;
-  t[897] = 93;
-  t[923] = 64;
-  t[1004] = 48;
-  t[1005] = 49;
-  t[1006] = 50;
-  t[1007] = 51;
-  t[1008] = 52;
-  t[1009] = 53;
-  t[1010] = 54;
-  t[1011] = 55;
-  t[1012] = 56;
-  t[1013] = 57;
-  t[1081] = 37;
-  t[1085] = 43;
-  t[1086] = 45;
-});
-exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;
-
-/***/ }),
-/* 36 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
-
-var getLookupTableFactory = __w_pdfjs_require__(8).getLookupTableFactory;
-var getSpecialPUASymbols = getLookupTableFactory(function (t) {
- t[63721] = 0x00a9;
- t[63193] = 0x00a9;
- t[63720] = 0x00ae;
- t[63194] = 0x00ae;
- t[63722] = 0x2122;
- t[63195] = 0x2122;
- t[63729] = 0x23a7;
- t[63730] = 0x23a8;
- t[63731] = 0x23a9;
- t[63740] = 0x23ab;
- t[63741] = 0x23ac;
- t[63742] = 0x23ad;
- t[63726] = 0x23a1;
- t[63727] = 0x23a2;
- t[63728] = 0x23a3;
- t[63737] = 0x23a4;
- t[63738] = 0x23a5;
- t[63739] = 0x23a6;
- t[63723] = 0x239b;
- t[63724] = 0x239c;
- t[63725] = 0x239d;
- t[63734] = 0x239e;
- t[63735] = 0x239f;
- t[63736] = 0x23a0;
-});
-function mapSpecialUnicodeValues(code) {
- if (code >= 0xfff0 && code <= 0xffff) {
-  return 0;
- } else if (code >= 0xf600 && code <= 0xf8ff) {
-  return getSpecialPUASymbols()[code] || code;
- } else if (code === 0x00ad) {
-  return 0x002d;
- }
- return code;
-}
-function getUnicodeForGlyph(name, glyphsUnicodeMap) {
- var unicode = glyphsUnicodeMap[name];
- if (unicode !== undefined) {
-  return unicode;
- }
- if (!name) {
-  return -1;
- }
- if (name[0] === "u") {
-  var nameLen = name.length, hexStr;
-  if (nameLen === 7 && name[1] === "n" && name[2] === "i") {
-   hexStr = name.substring(3);
-  } else if (nameLen >= 5 && nameLen <= 7) {
-   hexStr = name.substring(1);
-  } else {
-   return -1;
-  }
-  if (hexStr === hexStr.toUpperCase()) {
-   unicode = parseInt(hexStr, 16);
-   if (unicode >= 0) {
-    return unicode;
-   }
-  }
- }
- return -1;
-}
-var UnicodeRanges = [
+const UnicodeRanges = [
  {
   begin: 0x0000,
   end: 0x007f
@@ -37189,2411 +37612,5959 @@ var UnicodeRanges = [
  }
 ];
 function getUnicodeRangeFor(value) {
- for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
-  var range = UnicodeRanges[i];
+ for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+  const range = UnicodeRanges[i];
   if (value >= range.begin && value < range.end) {
    return i;
   }
- }
- return -1;
-}
-function isRTLRangeFor(value) {
- var range = UnicodeRanges[13];
- if (value >= range.begin && value < range.end) {
-  return true;
- }
- range = UnicodeRanges[11];
- if (value >= range.begin && value < range.end) {
-  return true;
- }
- return false;
-}
-var getNormalizedUnicodes = getLookupTableFactory(function (t) {
- t["\u00A8"] = "\u0020\u0308";
- t["\u00AF"] = "\u0020\u0304";
- t["\u00B4"] = "\u0020\u0301";
- t["\u00B5"] = "\u03BC";
- t["\u00B8"] = "\u0020\u0327";
- t["\u0132"] = "\u0049\u004A";
- t["\u0133"] = "\u0069\u006A";
- t["\u013F"] = "\u004C\u00B7";
- t["\u0140"] = "\u006C\u00B7";
- t["\u0149"] = "\u02BC\u006E";
- t["\u017F"] = "\u0073";
- t["\u01C4"] = "\u0044\u017D";
- t["\u01C5"] = "\u0044\u017E";
- t["\u01C6"] = "\u0064\u017E";
- t["\u01C7"] = "\u004C\u004A";
- t["\u01C8"] = "\u004C\u006A";
- t["\u01C9"] = "\u006C\u006A";
- t["\u01CA"] = "\u004E\u004A";
- t["\u01CB"] = "\u004E\u006A";
- t["\u01CC"] = "\u006E\u006A";
- t["\u01F1"] = "\u0044\u005A";
- t["\u01F2"] = "\u0044\u007A";
- t["\u01F3"] = "\u0064\u007A";
- t["\u02D8"] = "\u0020\u0306";
- t["\u02D9"] = "\u0020\u0307";
- t["\u02DA"] = "\u0020\u030A";
- t["\u02DB"] = "\u0020\u0328";
- t["\u02DC"] = "\u0020\u0303";
- t["\u02DD"] = "\u0020\u030B";
- t["\u037A"] = "\u0020\u0345";
- t["\u0384"] = "\u0020\u0301";
- t["\u03D0"] = "\u03B2";
- t["\u03D1"] = "\u03B8";
- t["\u03D2"] = "\u03A5";
- t["\u03D5"] = "\u03C6";
- t["\u03D6"] = "\u03C0";
- t["\u03F0"] = "\u03BA";
- t["\u03F1"] = "\u03C1";
- t["\u03F2"] = "\u03C2";
- t["\u03F4"] = "\u0398";
- t["\u03F5"] = "\u03B5";
- t["\u03F9"] = "\u03A3";
- t["\u0587"] = "\u0565\u0582";
- t["\u0675"] = "\u0627\u0674";
- t["\u0676"] = "\u0648\u0674";
- t["\u0677"] = "\u06C7\u0674";
- t["\u0678"] = "\u064A\u0674";
- t["\u0E33"] = "\u0E4D\u0E32";
- t["\u0EB3"] = "\u0ECD\u0EB2";
- t["\u0EDC"] = "\u0EAB\u0E99";
- t["\u0EDD"] = "\u0EAB\u0EA1";
- t["\u0F77"] = "\u0FB2\u0F81";
- t["\u0F79"] = "\u0FB3\u0F81";
- t["\u1E9A"] = "\u0061\u02BE";
- t["\u1FBD"] = "\u0020\u0313";
- t["\u1FBF"] = "\u0020\u0313";
- t["\u1FC0"] = "\u0020\u0342";
- t["\u1FFE"] = "\u0020\u0314";
- t["\u2002"] = "\u0020";
- t["\u2003"] = "\u0020";
- t["\u2004"] = "\u0020";
- t["\u2005"] = "\u0020";
- t["\u2006"] = "\u0020";
- t["\u2008"] = "\u0020";
- t["\u2009"] = "\u0020";
- t["\u200A"] = "\u0020";
- t["\u2017"] = "\u0020\u0333";
- t["\u2024"] = "\u002E";
- t["\u2025"] = "\u002E\u002E";
- t["\u2026"] = "\u002E\u002E\u002E";
- t["\u2033"] = "\u2032\u2032";
- t["\u2034"] = "\u2032\u2032\u2032";
- t["\u2036"] = "\u2035\u2035";
- t["\u2037"] = "\u2035\u2035\u2035";
- t["\u203C"] = "\u0021\u0021";
- t["\u203E"] = "\u0020\u0305";
- t["\u2047"] = "\u003F\u003F";
- t["\u2048"] = "\u003F\u0021";
- t["\u2049"] = "\u0021\u003F";
- t["\u2057"] = "\u2032\u2032\u2032\u2032";
- t["\u205F"] = "\u0020";
- t["\u20A8"] = "\u0052\u0073";
- t["\u2100"] = "\u0061\u002F\u0063";
- t["\u2101"] = "\u0061\u002F\u0073";
- t["\u2103"] = "\u00B0\u0043";
- t["\u2105"] = "\u0063\u002F\u006F";
- t["\u2106"] = "\u0063\u002F\u0075";
- t["\u2107"] = "\u0190";
- t["\u2109"] = "\u00B0\u0046";
- t["\u2116"] = "\u004E\u006F";
- t["\u2121"] = "\u0054\u0045\u004C";
- t["\u2135"] = "\u05D0";
- t["\u2136"] = "\u05D1";
- t["\u2137"] = "\u05D2";
- t["\u2138"] = "\u05D3";
- t["\u213B"] = "\u0046\u0041\u0058";
- t["\u2160"] = "\u0049";
- t["\u2161"] = "\u0049\u0049";
- t["\u2162"] = "\u0049\u0049\u0049";
- t["\u2163"] = "\u0049\u0056";
- t["\u2164"] = "\u0056";
- t["\u2165"] = "\u0056\u0049";
- t["\u2166"] = "\u0056\u0049\u0049";
- t["\u2167"] = "\u0056\u0049\u0049\u0049";
- t["\u2168"] = "\u0049\u0058";
- t["\u2169"] = "\u0058";
- t["\u216A"] = "\u0058\u0049";
- t["\u216B"] = "\u0058\u0049\u0049";
- t["\u216C"] = "\u004C";
- t["\u216D"] = "\u0043";
- t["\u216E"] = "\u0044";
- t["\u216F"] = "\u004D";
- t["\u2170"] = "\u0069";
- t["\u2171"] = "\u0069\u0069";
- t["\u2172"] = "\u0069\u0069\u0069";
- t["\u2173"] = "\u0069\u0076";
- t["\u2174"] = "\u0076";
- t["\u2175"] = "\u0076\u0069";
- t["\u2176"] = "\u0076\u0069\u0069";
- t["\u2177"] = "\u0076\u0069\u0069\u0069";
- t["\u2178"] = "\u0069\u0078";
- t["\u2179"] = "\u0078";
- t["\u217A"] = "\u0078\u0069";
- t["\u217B"] = "\u0078\u0069\u0069";
- t["\u217C"] = "\u006C";
- t["\u217D"] = "\u0063";
- t["\u217E"] = "\u0064";
- t["\u217F"] = "\u006D";
- t["\u222C"] = "\u222B\u222B";
- t["\u222D"] = "\u222B\u222B\u222B";
- t["\u222F"] = "\u222E\u222E";
- t["\u2230"] = "\u222E\u222E\u222E";
- t["\u2474"] = "\u0028\u0031\u0029";
- t["\u2475"] = "\u0028\u0032\u0029";
- t["\u2476"] = "\u0028\u0033\u0029";
- t["\u2477"] = "\u0028\u0034\u0029";
- t["\u2478"] = "\u0028\u0035\u0029";
- t["\u2479"] = "\u0028\u0036\u0029";
- t["\u247A"] = "\u0028\u0037\u0029";
- t["\u247B"] = "\u0028\u0038\u0029";
- t["\u247C"] = "\u0028\u0039\u0029";
- t["\u247D"] = "\u0028\u0031\u0030\u0029";
- t["\u247E"] = "\u0028\u0031\u0031\u0029";
- t["\u247F"] = "\u0028\u0031\u0032\u0029";
- t["\u2480"] = "\u0028\u0031\u0033\u0029";
- t["\u2481"] = "\u0028\u0031\u0034\u0029";
- t["\u2482"] = "\u0028\u0031\u0035\u0029";
- t["\u2483"] = "\u0028\u0031\u0036\u0029";
- t["\u2484"] = "\u0028\u0031\u0037\u0029";
- t["\u2485"] = "\u0028\u0031\u0038\u0029";
- t["\u2486"] = "\u0028\u0031\u0039\u0029";
- t["\u2487"] = "\u0028\u0032\u0030\u0029";
- t["\u2488"] = "\u0031\u002E";
- t["\u2489"] = "\u0032\u002E";
- t["\u248A"] = "\u0033\u002E";
- t["\u248B"] = "\u0034\u002E";
- t["\u248C"] = "\u0035\u002E";
- t["\u248D"] = "\u0036\u002E";
- t["\u248E"] = "\u0037\u002E";
- t["\u248F"] = "\u0038\u002E";
- t["\u2490"] = "\u0039\u002E";
- t["\u2491"] = "\u0031\u0030\u002E";
- t["\u2492"] = "\u0031\u0031\u002E";
- t["\u2493"] = "\u0031\u0032\u002E";
- t["\u2494"] = "\u0031\u0033\u002E";
- t["\u2495"] = "\u0031\u0034\u002E";
- t["\u2496"] = "\u0031\u0035\u002E";
- t["\u2497"] = "\u0031\u0036\u002E";
- t["\u2498"] = "\u0031\u0037\u002E";
- t["\u2499"] = "\u0031\u0038\u002E";
- t["\u249A"] = "\u0031\u0039\u002E";
- t["\u249B"] = "\u0032\u0030\u002E";
- t["\u249C"] = "\u0028\u0061\u0029";
- t["\u249D"] = "\u0028\u0062\u0029";
- t["\u249E"] = "\u0028\u0063\u0029";
- t["\u249F"] = "\u0028\u0064\u0029";
- t["\u24A0"] = "\u0028\u0065\u0029";
- t["\u24A1"] = "\u0028\u0066\u0029";
- t["\u24A2"] = "\u0028\u0067\u0029";
- t["\u24A3"] = "\u0028\u0068\u0029";
- t["\u24A4"] = "\u0028\u0069\u0029";
- t["\u24A5"] = "\u0028\u006A\u0029";
- t["\u24A6"] = "\u0028\u006B\u0029";
- t["\u24A7"] = "\u0028\u006C\u0029";
- t["\u24A8"] = "\u0028\u006D\u0029";
- t["\u24A9"] = "\u0028\u006E\u0029";
- t["\u24AA"] = "\u0028\u006F\u0029";
- t["\u24AB"] = "\u0028\u0070\u0029";
- t["\u24AC"] = "\u0028\u0071\u0029";
- t["\u24AD"] = "\u0028\u0072\u0029";
- t["\u24AE"] = "\u0028\u0073\u0029";
- t["\u24AF"] = "\u0028\u0074\u0029";
- t["\u24B0"] = "\u0028\u0075\u0029";
- t["\u24B1"] = "\u0028\u0076\u0029";
- t["\u24B2"] = "\u0028\u0077\u0029";
- t["\u24B3"] = "\u0028\u0078\u0029";
- t["\u24B4"] = "\u0028\u0079\u0029";
- t["\u24B5"] = "\u0028\u007A\u0029";
- t["\u2A0C"] = "\u222B\u222B\u222B\u222B";
- t["\u2A74"] = "\u003A\u003A\u003D";
- t["\u2A75"] = "\u003D\u003D";
- t["\u2A76"] = "\u003D\u003D\u003D";
- t["\u2E9F"] = "\u6BCD";
- t["\u2EF3"] = "\u9F9F";
- t["\u2F00"] = "\u4E00";
- t["\u2F01"] = "\u4E28";
- t["\u2F02"] = "\u4E36";
- t["\u2F03"] = "\u4E3F";
- t["\u2F04"] = "\u4E59";
- t["\u2F05"] = "\u4E85";
- t["\u2F06"] = "\u4E8C";
- t["\u2F07"] = "\u4EA0";
- t["\u2F08"] = "\u4EBA";
- t["\u2F09"] = "\u513F";
- t["\u2F0A"] = "\u5165";
- t["\u2F0B"] = "\u516B";
- t["\u2F0C"] = "\u5182";
- t["\u2F0D"] = "\u5196";
- t["\u2F0E"] = "\u51AB";
- t["\u2F0F"] = "\u51E0";
- t["\u2F10"] = "\u51F5";
- t["\u2F11"] = "\u5200";
- t["\u2F12"] = "\u529B";
- t["\u2F13"] = "\u52F9";
- t["\u2F14"] = "\u5315";
- t["\u2F15"] = "\u531A";
- t["\u2F16"] = "\u5338";
- t["\u2F17"] = "\u5341";
- t["\u2F18"] = "\u535C";
- t["\u2F19"] = "\u5369";
- t["\u2F1A"] = "\u5382";
- t["\u2F1B"] = "\u53B6";
- t["\u2F1C"] = "\u53C8";
- t["\u2F1D"] = "\u53E3";
- t["\u2F1E"] = "\u56D7";
- t["\u2F1F"] = "\u571F";
- t["\u2F20"] = "\u58EB";
- t["\u2F21"] = "\u5902";
- t["\u2F22"] = "\u590A";
- t["\u2F23"] = "\u5915";
- t["\u2F24"] = "\u5927";
- t["\u2F25"] = "\u5973";
- t["\u2F26"] = "\u5B50";
- t["\u2F27"] = "\u5B80";
- t["\u2F28"] = "\u5BF8";
- t["\u2F29"] = "\u5C0F";
- t["\u2F2A"] = "\u5C22";
- t["\u2F2B"] = "\u5C38";
- t["\u2F2C"] = "\u5C6E";
- t["\u2F2D"] = "\u5C71";
- t["\u2F2E"] = "\u5DDB";
- t["\u2F2F"] = "\u5DE5";
- t["\u2F30"] = "\u5DF1";
- t["\u2F31"] = "\u5DFE";
- t["\u2F32"] = "\u5E72";
- t["\u2F33"] = "\u5E7A";
- t["\u2F34"] = "\u5E7F";
- t["\u2F35"] = "\u5EF4";
- t["\u2F36"] = "\u5EFE";
- t["\u2F37"] = "\u5F0B";
- t["\u2F38"] = "\u5F13";
- t["\u2F39"] = "\u5F50";
- t["\u2F3A"] = "\u5F61";
- t["\u2F3B"] = "\u5F73";
- t["\u2F3C"] = "\u5FC3";
- t["\u2F3D"] = "\u6208";
- t["\u2F3E"] = "\u6236";
- t["\u2F3F"] = "\u624B";
- t["\u2F40"] = "\u652F";
- t["\u2F41"] = "\u6534";
- t["\u2F42"] = "\u6587";
- t["\u2F43"] = "\u6597";
- t["\u2F44"] = "\u65A4";
- t["\u2F45"] = "\u65B9";
- t["\u2F46"] = "\u65E0";
- t["\u2F47"] = "\u65E5";
- t["\u2F48"] = "\u66F0";
- t["\u2F49"] = "\u6708";
- t["\u2F4A"] = "\u6728";
- t["\u2F4B"] = "\u6B20";
- t["\u2F4C"] = "\u6B62";
- t["\u2F4D"] = "\u6B79";
- t["\u2F4E"] = "\u6BB3";
- t["\u2F4F"] = "\u6BCB";
- t["\u2F50"] = "\u6BD4";
- t["\u2F51"] = "\u6BDB";
- t["\u2F52"] = "\u6C0F";
- t["\u2F53"] = "\u6C14";
- t["\u2F54"] = "\u6C34";
- t["\u2F55"] = "\u706B";
- t["\u2F56"] = "\u722A";
- t["\u2F57"] = "\u7236";
- t["\u2F58"] = "\u723B";
- t["\u2F59"] = "\u723F";
- t["\u2F5A"] = "\u7247";
- t["\u2F5B"] = "\u7259";
- t["\u2F5C"] = "\u725B";
- t["\u2F5D"] = "\u72AC";
- t["\u2F5E"] = "\u7384";
- t["\u2F5F"] = "\u7389";
- t["\u2F60"] = "\u74DC";
- t["\u2F61"] = "\u74E6";
- t["\u2F62"] = "\u7518";
- t["\u2F63"] = "\u751F";
- t["\u2F64"] = "\u7528";
- t["\u2F65"] = "\u7530";
- t["\u2F66"] = "\u758B";
- t["\u2F67"] = "\u7592";
- t["\u2F68"] = "\u7676";
- t["\u2F69"] = "\u767D";
- t["\u2F6A"] = "\u76AE";
- t["\u2F6B"] = "\u76BF";
- t["\u2F6C"] = "\u76EE";
- t["\u2F6D"] = "\u77DB";
- t["\u2F6E"] = "\u77E2";
- t["\u2F6F"] = "\u77F3";
- t["\u2F70"] = "\u793A";
- t["\u2F71"] = "\u79B8";
- t["\u2F72"] = "\u79BE";
- t["\u2F73"] = "\u7A74";
- t["\u2F74"] = "\u7ACB";
- t["\u2F75"] = "\u7AF9";
- t["\u2F76"] = "\u7C73";
- t["\u2F77"] = "\u7CF8";
- t["\u2F78"] = "\u7F36";
- t["\u2F79"] = "\u7F51";
- t["\u2F7A"] = "\u7F8A";
- t["\u2F7B"] = "\u7FBD";
- t["\u2F7C"] = "\u8001";
- t["\u2F7D"] = "\u800C";
- t["\u2F7E"] = "\u8012";
- t["\u2F7F"] = "\u8033";
- t["\u2F80"] = "\u807F";
- t["\u2F81"] = "\u8089";
- t["\u2F82"] = "\u81E3";
- t["\u2F83"] = "\u81EA";
- t["\u2F84"] = "\u81F3";
- t["\u2F85"] = "\u81FC";
- t["\u2F86"] = "\u820C";
- t["\u2F87"] = "\u821B";
- t["\u2F88"] = "\u821F";
- t["\u2F89"] = "\u826E";
- t["\u2F8A"] = "\u8272";
- t["\u2F8B"] = "\u8278";
- t["\u2F8C"] = "\u864D";
- t["\u2F8D"] = "\u866B";
- t["\u2F8E"] = "\u8840";
- t["\u2F8F"] = "\u884C";
- t["\u2F90"] = "\u8863";
- t["\u2F91"] = "\u897E";
- t["\u2F92"] = "\u898B";
- t["\u2F93"] = "\u89D2";
- t["\u2F94"] = "\u8A00";
- t["\u2F95"] = "\u8C37";
- t["\u2F96"] = "\u8C46";
- t["\u2F97"] = "\u8C55";
- t["\u2F98"] = "\u8C78";
- t["\u2F99"] = "\u8C9D";
- t["\u2F9A"] = "\u8D64";
- t["\u2F9B"] = "\u8D70";
- t["\u2F9C"] = "\u8DB3";
- t["\u2F9D"] = "\u8EAB";
- t["\u2F9E"] = "\u8ECA";
- t["\u2F9F"] = "\u8F9B";
- t["\u2FA0"] = "\u8FB0";
- t["\u2FA1"] = "\u8FB5";
- t["\u2FA2"] = "\u9091";
- t["\u2FA3"] = "\u9149";
- t["\u2FA4"] = "\u91C6";
- t["\u2FA5"] = "\u91CC";
- t["\u2FA6"] = "\u91D1";
- t["\u2FA7"] = "\u9577";
- t["\u2FA8"] = "\u9580";
- t["\u2FA9"] = "\u961C";
- t["\u2FAA"] = "\u96B6";
- t["\u2FAB"] = "\u96B9";
- t["\u2FAC"] = "\u96E8";
- t["\u2FAD"] = "\u9751";
- t["\u2FAE"] = "\u975E";
- t["\u2FAF"] = "\u9762";
- t["\u2FB0"] = "\u9769";
- t["\u2FB1"] = "\u97CB";
- t["\u2FB2"] = "\u97ED";
- t["\u2FB3"] = "\u97F3";
- t["\u2FB4"] = "\u9801";
- t["\u2FB5"] = "\u98A8";
- t["\u2FB6"] = "\u98DB";
- t["\u2FB7"] = "\u98DF";
- t["\u2FB8"] = "\u9996";
- t["\u2FB9"] = "\u9999";
- t["\u2FBA"] = "\u99AC";
- t["\u2FBB"] = "\u9AA8";
- t["\u2FBC"] = "\u9AD8";
- t["\u2FBD"] = "\u9ADF";
- t["\u2FBE"] = "\u9B25";
- t["\u2FBF"] = "\u9B2F";
- t["\u2FC0"] = "\u9B32";
- t["\u2FC1"] = "\u9B3C";
- t["\u2FC2"] = "\u9B5A";
- t["\u2FC3"] = "\u9CE5";
- t["\u2FC4"] = "\u9E75";
- t["\u2FC5"] = "\u9E7F";
- t["\u2FC6"] = "\u9EA5";
- t["\u2FC7"] = "\u9EBB";
- t["\u2FC8"] = "\u9EC3";
- t["\u2FC9"] = "\u9ECD";
- t["\u2FCA"] = "\u9ED1";
- t["\u2FCB"] = "\u9EF9";
- t["\u2FCC"] = "\u9EFD";
- t["\u2FCD"] = "\u9F0E";
- t["\u2FCE"] = "\u9F13";
- t["\u2FCF"] = "\u9F20";
- t["\u2FD0"] = "\u9F3B";
- t["\u2FD1"] = "\u9F4A";
- t["\u2FD2"] = "\u9F52";
- t["\u2FD3"] = "\u9F8D";
- t["\u2FD4"] = "\u9F9C";
- t["\u2FD5"] = "\u9FA0";
- t["\u3036"] = "\u3012";
- t["\u3038"] = "\u5341";
- t["\u3039"] = "\u5344";
- t["\u303A"] = "\u5345";
- t["\u309B"] = "\u0020\u3099";
- t["\u309C"] = "\u0020\u309A";
- t["\u3131"] = "\u1100";
- t["\u3132"] = "\u1101";
- t["\u3133"] = "\u11AA";
- t["\u3134"] = "\u1102";
- t["\u3135"] = "\u11AC";
- t["\u3136"] = "\u11AD";
- t["\u3137"] = "\u1103";
- t["\u3138"] = "\u1104";
- t["\u3139"] = "\u1105";
- t["\u313A"] = "\u11B0";
- t["\u313B"] = "\u11B1";
- t["\u313C"] = "\u11B2";
- t["\u313D"] = "\u11B3";
- t["\u313E"] = "\u11B4";
- t["\u313F"] = "\u11B5";
- t["\u3140"] = "\u111A";
- t["\u3141"] = "\u1106";
- t["\u3142"] = "\u1107";
- t["\u3143"] = "\u1108";
- t["\u3144"] = "\u1121";
- t["\u3145"] = "\u1109";
- t["\u3146"] = "\u110A";
- t["\u3147"] = "\u110B";
- t["\u3148"] = "\u110C";
- t["\u3149"] = "\u110D";
- t["\u314A"] = "\u110E";
- t["\u314B"] = "\u110F";
- t["\u314C"] = "\u1110";
- t["\u314D"] = "\u1111";
- t["\u314E"] = "\u1112";
- t["\u314F"] = "\u1161";
- t["\u3150"] = "\u1162";
- t["\u3151"] = "\u1163";
- t["\u3152"] = "\u1164";
- t["\u3153"] = "\u1165";
- t["\u3154"] = "\u1166";
- t["\u3155"] = "\u1167";
- t["\u3156"] = "\u1168";
- t["\u3157"] = "\u1169";
- t["\u3158"] = "\u116A";
- t["\u3159"] = "\u116B";
- t["\u315A"] = "\u116C";
- t["\u315B"] = "\u116D";
- t["\u315C"] = "\u116E";
- t["\u315D"] = "\u116F";
- t["\u315E"] = "\u1170";
- t["\u315F"] = "\u1171";
- t["\u3160"] = "\u1172";
- t["\u3161"] = "\u1173";
- t["\u3162"] = "\u1174";
- t["\u3163"] = "\u1175";
- t["\u3164"] = "\u1160";
- t["\u3165"] = "\u1114";
- t["\u3166"] = "\u1115";
- t["\u3167"] = "\u11C7";
- t["\u3168"] = "\u11C8";
- t["\u3169"] = "\u11CC";
- t["\u316A"] = "\u11CE";
- t["\u316B"] = "\u11D3";
- t["\u316C"] = "\u11D7";
- t["\u316D"] = "\u11D9";
- t["\u316E"] = "\u111C";
- t["\u316F"] = "\u11DD";
- t["\u3170"] = "\u11DF";
- t["\u3171"] = "\u111D";
- t["\u3172"] = "\u111E";
- t["\u3173"] = "\u1120";
- t["\u3174"] = "\u1122";
- t["\u3175"] = "\u1123";
- t["\u3176"] = "\u1127";
- t["\u3177"] = "\u1129";
- t["\u3178"] = "\u112B";
- t["\u3179"] = "\u112C";
- t["\u317A"] = "\u112D";
- t["\u317B"] = "\u112E";
- t["\u317C"] = "\u112F";
- t["\u317D"] = "\u1132";
- t["\u317E"] = "\u1136";
- t["\u317F"] = "\u1140";
- t["\u3180"] = "\u1147";
- t["\u3181"] = "\u114C";
- t["\u3182"] = "\u11F1";
- t["\u3183"] = "\u11F2";
- t["\u3184"] = "\u1157";
- t["\u3185"] = "\u1158";
- t["\u3186"] = "\u1159";
- t["\u3187"] = "\u1184";
- t["\u3188"] = "\u1185";
- t["\u3189"] = "\u1188";
- t["\u318A"] = "\u1191";
- t["\u318B"] = "\u1192";
- t["\u318C"] = "\u1194";
- t["\u318D"] = "\u119E";
- t["\u318E"] = "\u11A1";
- t["\u3200"] = "\u0028\u1100\u0029";
- t["\u3201"] = "\u0028\u1102\u0029";
- t["\u3202"] = "\u0028\u1103\u0029";
- t["\u3203"] = "\u0028\u1105\u0029";
- t["\u3204"] = "\u0028\u1106\u0029";
- t["\u3205"] = "\u0028\u1107\u0029";
- t["\u3206"] = "\u0028\u1109\u0029";
- t["\u3207"] = "\u0028\u110B\u0029";
- t["\u3208"] = "\u0028\u110C\u0029";
- t["\u3209"] = "\u0028\u110E\u0029";
- t["\u320A"] = "\u0028\u110F\u0029";
- t["\u320B"] = "\u0028\u1110\u0029";
- t["\u320C"] = "\u0028\u1111\u0029";
- t["\u320D"] = "\u0028\u1112\u0029";
- t["\u320E"] = "\u0028\u1100\u1161\u0029";
- t["\u320F"] = "\u0028\u1102\u1161\u0029";
- t["\u3210"] = "\u0028\u1103\u1161\u0029";
- t["\u3211"] = "\u0028\u1105\u1161\u0029";
- t["\u3212"] = "\u0028\u1106\u1161\u0029";
- t["\u3213"] = "\u0028\u1107\u1161\u0029";
- t["\u3214"] = "\u0028\u1109\u1161\u0029";
- t["\u3215"] = "\u0028\u110B\u1161\u0029";
- t["\u3216"] = "\u0028\u110C\u1161\u0029";
- t["\u3217"] = "\u0028\u110E\u1161\u0029";
- t["\u3218"] = "\u0028\u110F\u1161\u0029";
- t["\u3219"] = "\u0028\u1110\u1161\u0029";
- t["\u321A"] = "\u0028\u1111\u1161\u0029";
- t["\u321B"] = "\u0028\u1112\u1161\u0029";
- t["\u321C"] = "\u0028\u110C\u116E\u0029";
- t["\u321D"] = "\u0028\u110B\u1169\u110C\u1165\u11AB\u0029";
- t["\u321E"] = "\u0028\u110B\u1169\u1112\u116E\u0029";
- t["\u3220"] = "\u0028\u4E00\u0029";
- t["\u3221"] = "\u0028\u4E8C\u0029";
- t["\u3222"] = "\u0028\u4E09\u0029";
- t["\u3223"] = "\u0028\u56DB\u0029";
- t["\u3224"] = "\u0028\u4E94\u0029";
- t["\u3225"] = "\u0028\u516D\u0029";
- t["\u3226"] = "\u0028\u4E03\u0029";
- t["\u3227"] = "\u0028\u516B\u0029";
- t["\u3228"] = "\u0028\u4E5D\u0029";
- t["\u3229"] = "\u0028\u5341\u0029";
- t["\u322A"] = "\u0028\u6708\u0029";
- t["\u322B"] = "\u0028\u706B\u0029";
- t["\u322C"] = "\u0028\u6C34\u0029";
- t["\u322D"] = "\u0028\u6728\u0029";
- t["\u322E"] = "\u0028\u91D1\u0029";
- t["\u322F"] = "\u0028\u571F\u0029";
- t["\u3230"] = "\u0028\u65E5\u0029";
- t["\u3231"] = "\u0028\u682A\u0029";
- t["\u3232"] = "\u0028\u6709\u0029";
- t["\u3233"] = "\u0028\u793E\u0029";
- t["\u3234"] = "\u0028\u540D\u0029";
- t["\u3235"] = "\u0028\u7279\u0029";
- t["\u3236"] = "\u0028\u8CA1\u0029";
- t["\u3237"] = "\u0028\u795D\u0029";
- t["\u3238"] = "\u0028\u52B4\u0029";
- t["\u3239"] = "\u0028\u4EE3\u0029";
- t["\u323A"] = "\u0028\u547C\u0029";
- t["\u323B"] = "\u0028\u5B66\u0029";
- t["\u323C"] = "\u0028\u76E3\u0029";
- t["\u323D"] = "\u0028\u4F01\u0029";
- t["\u323E"] = "\u0028\u8CC7\u0029";
- t["\u323F"] = "\u0028\u5354\u0029";
- t["\u3240"] = "\u0028\u796D\u0029";
- t["\u3241"] = "\u0028\u4F11\u0029";
- t["\u3242"] = "\u0028\u81EA\u0029";
- t["\u3243"] = "\u0028\u81F3\u0029";
- t["\u32C0"] = "\u0031\u6708";
- t["\u32C1"] = "\u0032\u6708";
- t["\u32C2"] = "\u0033\u6708";
- t["\u32C3"] = "\u0034\u6708";
- t["\u32C4"] = "\u0035\u6708";
- t["\u32C5"] = "\u0036\u6708";
- t["\u32C6"] = "\u0037\u6708";
- t["\u32C7"] = "\u0038\u6708";
- t["\u32C8"] = "\u0039\u6708";
- t["\u32C9"] = "\u0031\u0030\u6708";
- t["\u32CA"] = "\u0031\u0031\u6708";
- t["\u32CB"] = "\u0031\u0032\u6708";
- t["\u3358"] = "\u0030\u70B9";
- t["\u3359"] = "\u0031\u70B9";
- t["\u335A"] = "\u0032\u70B9";
- t["\u335B"] = "\u0033\u70B9";
- t["\u335C"] = "\u0034\u70B9";
- t["\u335D"] = "\u0035\u70B9";
- t["\u335E"] = "\u0036\u70B9";
- t["\u335F"] = "\u0037\u70B9";
- t["\u3360"] = "\u0038\u70B9";
- t["\u3361"] = "\u0039\u70B9";
- t["\u3362"] = "\u0031\u0030\u70B9";
- t["\u3363"] = "\u0031\u0031\u70B9";
- t["\u3364"] = "\u0031\u0032\u70B9";
- t["\u3365"] = "\u0031\u0033\u70B9";
- t["\u3366"] = "\u0031\u0034\u70B9";
- t["\u3367"] = "\u0031\u0035\u70B9";
- t["\u3368"] = "\u0031\u0036\u70B9";
- t["\u3369"] = "\u0031\u0037\u70B9";
- t["\u336A"] = "\u0031\u0038\u70B9";
- t["\u336B"] = "\u0031\u0039\u70B9";
- t["\u336C"] = "\u0032\u0030\u70B9";
- t["\u336D"] = "\u0032\u0031\u70B9";
- t["\u336E"] = "\u0032\u0032\u70B9";
- t["\u336F"] = "\u0032\u0033\u70B9";
- t["\u3370"] = "\u0032\u0034\u70B9";
- t["\u33E0"] = "\u0031\u65E5";
- t["\u33E1"] = "\u0032\u65E5";
- t["\u33E2"] = "\u0033\u65E5";
- t["\u33E3"] = "\u0034\u65E5";
- t["\u33E4"] = "\u0035\u65E5";
- t["\u33E5"] = "\u0036\u65E5";
- t["\u33E6"] = "\u0037\u65E5";
- t["\u33E7"] = "\u0038\u65E5";
- t["\u33E8"] = "\u0039\u65E5";
- t["\u33E9"] = "\u0031\u0030\u65E5";
- t["\u33EA"] = "\u0031\u0031\u65E5";
- t["\u33EB"] = "\u0031\u0032\u65E5";
- t["\u33EC"] = "\u0031\u0033\u65E5";
- t["\u33ED"] = "\u0031\u0034\u65E5";
- t["\u33EE"] = "\u0031\u0035\u65E5";
- t["\u33EF"] = "\u0031\u0036\u65E5";
- t["\u33F0"] = "\u0031\u0037\u65E5";
- t["\u33F1"] = "\u0031\u0038\u65E5";
- t["\u33F2"] = "\u0031\u0039\u65E5";
- t["\u33F3"] = "\u0032\u0030\u65E5";
- t["\u33F4"] = "\u0032\u0031\u65E5";
- t["\u33F5"] = "\u0032\u0032\u65E5";
- t["\u33F6"] = "\u0032\u0033\u65E5";
- t["\u33F7"] = "\u0032\u0034\u65E5";
- t["\u33F8"] = "\u0032\u0035\u65E5";
- t["\u33F9"] = "\u0032\u0036\u65E5";
- t["\u33FA"] = "\u0032\u0037\u65E5";
- t["\u33FB"] = "\u0032\u0038\u65E5";
- t["\u33FC"] = "\u0032\u0039\u65E5";
- t["\u33FD"] = "\u0033\u0030\u65E5";
- t["\u33FE"] = "\u0033\u0031\u65E5";
- t["\uFB00"] = "\u0066\u0066";
- t["\uFB01"] = "\u0066\u0069";
- t["\uFB02"] = "\u0066\u006C";
- t["\uFB03"] = "\u0066\u0066\u0069";
- t["\uFB04"] = "\u0066\u0066\u006C";
- t["\uFB05"] = "\u017F\u0074";
- t["\uFB06"] = "\u0073\u0074";
- t["\uFB13"] = "\u0574\u0576";
- t["\uFB14"] = "\u0574\u0565";
- t["\uFB15"] = "\u0574\u056B";
- t["\uFB16"] = "\u057E\u0576";
- t["\uFB17"] = "\u0574\u056D";
- t["\uFB4F"] = "\u05D0\u05DC";
- t["\uFB50"] = "\u0671";
- t["\uFB51"] = "\u0671";
- t["\uFB52"] = "\u067B";
- t["\uFB53"] = "\u067B";
- t["\uFB54"] = "\u067B";
- t["\uFB55"] = "\u067B";
- t["\uFB56"] = "\u067E";
- t["\uFB57"] = "\u067E";
- t["\uFB58"] = "\u067E";
- t["\uFB59"] = "\u067E";
- t["\uFB5A"] = "\u0680";
- t["\uFB5B"] = "\u0680";
- t["\uFB5C"] = "\u0680";
- t["\uFB5D"] = "\u0680";
- t["\uFB5E"] = "\u067A";
- t["\uFB5F"] = "\u067A";
- t["\uFB60"] = "\u067A";
- t["\uFB61"] = "\u067A";
- t["\uFB62"] = "\u067F";
- t["\uFB63"] = "\u067F";
- t["\uFB64"] = "\u067F";
- t["\uFB65"] = "\u067F";
- t["\uFB66"] = "\u0679";
- t["\uFB67"] = "\u0679";
- t["\uFB68"] = "\u0679";
- t["\uFB69"] = "\u0679";
- t["\uFB6A"] = "\u06A4";
- t["\uFB6B"] = "\u06A4";
- t["\uFB6C"] = "\u06A4";
- t["\uFB6D"] = "\u06A4";
- t["\uFB6E"] = "\u06A6";
- t["\uFB6F"] = "\u06A6";
- t["\uFB70"] = "\u06A6";
- t["\uFB71"] = "\u06A6";
- t["\uFB72"] = "\u0684";
- t["\uFB73"] = "\u0684";
- t["\uFB74"] = "\u0684";
- t["\uFB75"] = "\u0684";
- t["\uFB76"] = "\u0683";
- t["\uFB77"] = "\u0683";
- t["\uFB78"] = "\u0683";
- t["\uFB79"] = "\u0683";
- t["\uFB7A"] = "\u0686";
- t["\uFB7B"] = "\u0686";
- t["\uFB7C"] = "\u0686";
- t["\uFB7D"] = "\u0686";
- t["\uFB7E"] = "\u0687";
- t["\uFB7F"] = "\u0687";
- t["\uFB80"] = "\u0687";
- t["\uFB81"] = "\u0687";
- t["\uFB82"] = "\u068D";
- t["\uFB83"] = "\u068D";
- t["\uFB84"] = "\u068C";
- t["\uFB85"] = "\u068C";
- t["\uFB86"] = "\u068E";
- t["\uFB87"] = "\u068E";
- t["\uFB88"] = "\u0688";
- t["\uFB89"] = "\u0688";
- t["\uFB8A"] = "\u0698";
- t["\uFB8B"] = "\u0698";
- t["\uFB8C"] = "\u0691";
- t["\uFB8D"] = "\u0691";
- t["\uFB8E"] = "\u06A9";
- t["\uFB8F"] = "\u06A9";
- t["\uFB90"] = "\u06A9";
- t["\uFB91"] = "\u06A9";
- t["\uFB92"] = "\u06AF";
- t["\uFB93"] = "\u06AF";
- t["\uFB94"] = "\u06AF";
- t["\uFB95"] = "\u06AF";
- t["\uFB96"] = "\u06B3";
- t["\uFB97"] = "\u06B3";
- t["\uFB98"] = "\u06B3";
- t["\uFB99"] = "\u06B3";
- t["\uFB9A"] = "\u06B1";
- t["\uFB9B"] = "\u06B1";
- t["\uFB9C"] = "\u06B1";
- t["\uFB9D"] = "\u06B1";
- t["\uFB9E"] = "\u06BA";
- t["\uFB9F"] = "\u06BA";
- t["\uFBA0"] = "\u06BB";
- t["\uFBA1"] = "\u06BB";
- t["\uFBA2"] = "\u06BB";
- t["\uFBA3"] = "\u06BB";
- t["\uFBA4"] = "\u06C0";
- t["\uFBA5"] = "\u06C0";
- t["\uFBA6"] = "\u06C1";
- t["\uFBA7"] = "\u06C1";
- t["\uFBA8"] = "\u06C1";
- t["\uFBA9"] = "\u06C1";
- t["\uFBAA"] = "\u06BE";
- t["\uFBAB"] = "\u06BE";
- t["\uFBAC"] = "\u06BE";
- t["\uFBAD"] = "\u06BE";
- t["\uFBAE"] = "\u06D2";
- t["\uFBAF"] = "\u06D2";
- t["\uFBB0"] = "\u06D3";
- t["\uFBB1"] = "\u06D3";
- t["\uFBD3"] = "\u06AD";
- t["\uFBD4"] = "\u06AD";
- t["\uFBD5"] = "\u06AD";
- t["\uFBD6"] = "\u06AD";
- t["\uFBD7"] = "\u06C7";
- t["\uFBD8"] = "\u06C7";
- t["\uFBD9"] = "\u06C6";
- t["\uFBDA"] = "\u06C6";
- t["\uFBDB"] = "\u06C8";
- t["\uFBDC"] = "\u06C8";
- t["\uFBDD"] = "\u0677";
- t["\uFBDE"] = "\u06CB";
- t["\uFBDF"] = "\u06CB";
- t["\uFBE0"] = "\u06C5";
- t["\uFBE1"] = "\u06C5";
- t["\uFBE2"] = "\u06C9";
- t["\uFBE3"] = "\u06C9";
- t["\uFBE4"] = "\u06D0";
- t["\uFBE5"] = "\u06D0";
- t["\uFBE6"] = "\u06D0";
- t["\uFBE7"] = "\u06D0";
- t["\uFBE8"] = "\u0649";
- t["\uFBE9"] = "\u0649";
- t["\uFBEA"] = "\u0626\u0627";
- t["\uFBEB"] = "\u0626\u0627";
- t["\uFBEC"] = "\u0626\u06D5";
- t["\uFBED"] = "\u0626\u06D5";
- t["\uFBEE"] = "\u0626\u0648";
- t["\uFBEF"] = "\u0626\u0648";
- t["\uFBF0"] = "\u0626\u06C7";
- t["\uFBF1"] = "\u0626\u06C7";
- t["\uFBF2"] = "\u0626\u06C6";
- t["\uFBF3"] = "\u0626\u06C6";
- t["\uFBF4"] = "\u0626\u06C8";
- t["\uFBF5"] = "\u0626\u06C8";
- t["\uFBF6"] = "\u0626\u06D0";
- t["\uFBF7"] = "\u0626\u06D0";
- t["\uFBF8"] = "\u0626\u06D0";
- t["\uFBF9"] = "\u0626\u0649";
- t["\uFBFA"] = "\u0626\u0649";
- t["\uFBFB"] = "\u0626\u0649";
- t["\uFBFC"] = "\u06CC";
- t["\uFBFD"] = "\u06CC";
- t["\uFBFE"] = "\u06CC";
- t["\uFBFF"] = "\u06CC";
- t["\uFC00"] = "\u0626\u062C";
- t["\uFC01"] = "\u0626\u062D";
- t["\uFC02"] = "\u0626\u0645";
- t["\uFC03"] = "\u0626\u0649";
- t["\uFC04"] = "\u0626\u064A";
- t["\uFC05"] = "\u0628\u062C";
- t["\uFC06"] = "\u0628\u062D";
- t["\uFC07"] = "\u0628\u062E";
- t["\uFC08"] = "\u0628\u0645";
- t["\uFC09"] = "\u0628\u0649";
- t["\uFC0A"] = "\u0628\u064A";
- t["\uFC0B"] = "\u062A\u062C";
- t["\uFC0C"] = "\u062A\u062D";
- t["\uFC0D"] = "\u062A\u062E";
- t["\uFC0E"] = "\u062A\u0645";
- t["\uFC0F"] = "\u062A\u0649";
- t["\uFC10"] = "\u062A\u064A";
- t["\uFC11"] = "\u062B\u062C";
- t["\uFC12"] = "\u062B\u0645";
- t["\uFC13"] = "\u062B\u0649";
- t["\uFC14"] = "\u062B\u064A";
- t["\uFC15"] = "\u062C\u062D";
- t["\uFC16"] = "\u062C\u0645";
- t["\uFC17"] = "\u062D\u062C";
- t["\uFC18"] = "\u062D\u0645";
- t["\uFC19"] = "\u062E\u062C";
- t["\uFC1A"] = "\u062E\u062D";
- t["\uFC1B"] = "\u062E\u0645";
- t["\uFC1C"] = "\u0633\u062C";
- t["\uFC1D"] = "\u0633\u062D";
- t["\uFC1E"] = "\u0633\u062E";
- t["\uFC1F"] = "\u0633\u0645";
- t["\uFC20"] = "\u0635\u062D";
- t["\uFC21"] = "\u0635\u0645";
- t["\uFC22"] = "\u0636\u062C";
- t["\uFC23"] = "\u0636\u062D";
- t["\uFC24"] = "\u0636\u062E";
- t["\uFC25"] = "\u0636\u0645";
- t["\uFC26"] = "\u0637\u062D";
- t["\uFC27"] = "\u0637\u0645";
- t["\uFC28"] = "\u0638\u0645";
- t["\uFC29"] = "\u0639\u062C";
- t["\uFC2A"] = "\u0639\u0645";
- t["\uFC2B"] = "\u063A\u062C";
- t["\uFC2C"] = "\u063A\u0645";
- t["\uFC2D"] = "\u0641\u062C";
- t["\uFC2E"] = "\u0641\u062D";
- t["\uFC2F"] = "\u0641\u062E";
- t["\uFC30"] = "\u0641\u0645";
- t["\uFC31"] = "\u0641\u0649";
- t["\uFC32"] = "\u0641\u064A";
- t["\uFC33"] = "\u0642\u062D";
- t["\uFC34"] = "\u0642\u0645";
- t["\uFC35"] = "\u0642\u0649";
- t["\uFC36"] = "\u0642\u064A";
- t["\uFC37"] = "\u0643\u0627";
- t["\uFC38"] = "\u0643\u062C";
- t["\uFC39"] = "\u0643\u062D";
- t["\uFC3A"] = "\u0643\u062E";
- t["\uFC3B"] = "\u0643\u0644";
- t["\uFC3C"] = "\u0643\u0645";
- t["\uFC3D"] = "\u0643\u0649";
- t["\uFC3E"] = "\u0643\u064A";
- t["\uFC3F"] = "\u0644\u062C";
- t["\uFC40"] = "\u0644\u062D";
- t["\uFC41"] = "\u0644\u062E";
- t["\uFC42"] = "\u0644\u0645";
- t["\uFC43"] = "\u0644\u0649";
- t["\uFC44"] = "\u0644\u064A";
- t["\uFC45"] = "\u0645\u062C";
- t["\uFC46"] = "\u0645\u062D";
- t["\uFC47"] = "\u0645\u062E";
- t["\uFC48"] = "\u0645\u0645";
- t["\uFC49"] = "\u0645\u0649";
- t["\uFC4A"] = "\u0645\u064A";
- t["\uFC4B"] = "\u0646\u062C";
- t["\uFC4C"] = "\u0646\u062D";
- t["\uFC4D"] = "\u0646\u062E";
- t["\uFC4E"] = "\u0646\u0645";
- t["\uFC4F"] = "\u0646\u0649";
- t["\uFC50"] = "\u0646\u064A";
- t["\uFC51"] = "\u0647\u062C";
- t["\uFC52"] = "\u0647\u0645";
- t["\uFC53"] = "\u0647\u0649";
- t["\uFC54"] = "\u0647\u064A";
- t["\uFC55"] = "\u064A\u062C";
- t["\uFC56"] = "\u064A\u062D";
- t["\uFC57"] = "\u064A\u062E";
- t["\uFC58"] = "\u064A\u0645";
- t["\uFC59"] = "\u064A\u0649";
- t["\uFC5A"] = "\u064A\u064A";
- t["\uFC5B"] = "\u0630\u0670";
- t["\uFC5C"] = "\u0631\u0670";
- t["\uFC5D"] = "\u0649\u0670";
- t["\uFC5E"] = "\u0020\u064C\u0651";
- t["\uFC5F"] = "\u0020\u064D\u0651";
- t["\uFC60"] = "\u0020\u064E\u0651";
- t["\uFC61"] = "\u0020\u064F\u0651";
- t["\uFC62"] = "\u0020\u0650\u0651";
- t["\uFC63"] = "\u0020\u0651\u0670";
- t["\uFC64"] = "\u0626\u0631";
- t["\uFC65"] = "\u0626\u0632";
- t["\uFC66"] = "\u0626\u0645";
- t["\uFC67"] = "\u0626\u0646";
- t["\uFC68"] = "\u0626\u0649";
- t["\uFC69"] = "\u0626\u064A";
- t["\uFC6A"] = "\u0628\u0631";
- t["\uFC6B"] = "\u0628\u0632";
- t["\uFC6C"] = "\u0628\u0645";
- t["\uFC6D"] = "\u0628\u0646";
- t["\uFC6E"] = "\u0628\u0649";
- t["\uFC6F"] = "\u0628\u064A";
- t["\uFC70"] = "\u062A\u0631";
- t["\uFC71"] = "\u062A\u0632";
- t["\uFC72"] = "\u062A\u0645";
- t["\uFC73"] = "\u062A\u0646";
- t["\uFC74"] = "\u062A\u0649";
- t["\uFC75"] = "\u062A\u064A";
- t["\uFC76"] = "\u062B\u0631";
- t["\uFC77"] = "\u062B\u0632";
- t["\uFC78"] = "\u062B\u0645";
- t["\uFC79"] = "\u062B\u0646";
- t["\uFC7A"] = "\u062B\u0649";
- t["\uFC7B"] = "\u062B\u064A";
- t["\uFC7C"] = "\u0641\u0649";
- t["\uFC7D"] = "\u0641\u064A";
- t["\uFC7E"] = "\u0642\u0649";
- t["\uFC7F"] = "\u0642\u064A";
- t["\uFC80"] = "\u0643\u0627";
- t["\uFC81"] = "\u0643\u0644";
- t["\uFC82"] = "\u0643\u0645";
- t["\uFC83"] = "\u0643\u0649";
- t["\uFC84"] = "\u0643\u064A";
- t["\uFC85"] = "\u0644\u0645";
- t["\uFC86"] = "\u0644\u0649";
- t["\uFC87"] = "\u0644\u064A";
- t["\uFC88"] = "\u0645\u0627";
- t["\uFC89"] = "\u0645\u0645";
- t["\uFC8A"] = "\u0646\u0631";
- t["\uFC8B"] = "\u0646\u0632";
- t["\uFC8C"] = "\u0646\u0645";
- t["\uFC8D"] = "\u0646\u0646";
- t["\uFC8E"] = "\u0646\u0649";
- t["\uFC8F"] = "\u0646\u064A";
- t["\uFC90"] = "\u0649\u0670";
- t["\uFC91"] = "\u064A\u0631";
- t["\uFC92"] = "\u064A\u0632";
- t["\uFC93"] = "\u064A\u0645";
- t["\uFC94"] = "\u064A\u0646";
- t["\uFC95"] = "\u064A\u0649";
- t["\uFC96"] = "\u064A\u064A";
- t["\uFC97"] = "\u0626\u062C";
- t["\uFC98"] = "\u0626\u062D";
- t["\uFC99"] = "\u0626\u062E";
- t["\uFC9A"] = "\u0626\u0645";
- t["\uFC9B"] = "\u0626\u0647";
- t["\uFC9C"] = "\u0628\u062C";
- t["\uFC9D"] = "\u0628\u062D";
- t["\uFC9E"] = "\u0628\u062E";
- t["\uFC9F"] = "\u0628\u0645";
- t["\uFCA0"] = "\u0628\u0647";
- t["\uFCA1"] = "\u062A\u062C";
- t["\uFCA2"] = "\u062A\u062D";
- t["\uFCA3"] = "\u062A\u062E";
- t["\uFCA4"] = "\u062A\u0645";
- t["\uFCA5"] = "\u062A\u0647";
- t["\uFCA6"] = "\u062B\u0645";
- t["\uFCA7"] = "\u062C\u062D";
- t["\uFCA8"] = "\u062C\u0645";
- t["\uFCA9"] = "\u062D\u062C";
- t["\uFCAA"] = "\u062D\u0645";
- t["\uFCAB"] = "\u062E\u062C";
- t["\uFCAC"] = "\u062E\u0645";
- t["\uFCAD"] = "\u0633\u062C";
- t["\uFCAE"] = "\u0633\u062D";
- t["\uFCAF"] = "\u0633\u062E";
- t["\uFCB0"] = "\u0633\u0645";
- t["\uFCB1"] = "\u0635\u062D";
- t["\uFCB2"] = "\u0635\u062E";
- t["\uFCB3"] = "\u0635\u0645";
- t["\uFCB4"] = "\u0636\u062C";
- t["\uFCB5"] = "\u0636\u062D";
- t["\uFCB6"] = "\u0636\u062E";
- t["\uFCB7"] = "\u0636\u0645";
- t["\uFCB8"] = "\u0637\u062D";
- t["\uFCB9"] = "\u0638\u0645";
- t["\uFCBA"] = "\u0639\u062C";
- t["\uFCBB"] = "\u0639\u0645";
- t["\uFCBC"] = "\u063A\u062C";
- t["\uFCBD"] = "\u063A\u0645";
- t["\uFCBE"] = "\u0641\u062C";
- t["\uFCBF"] = "\u0641\u062D";
- t["\uFCC0"] = "\u0641\u062E";
- t["\uFCC1"] = "\u0641\u0645";
- t["\uFCC2"] = "\u0642\u062D";
- t["\uFCC3"] = "\u0642\u0645";
- t["\uFCC4"] = "\u0643\u062C";
- t["\uFCC5"] = "\u0643\u062D";
- t["\uFCC6"] = "\u0643\u062E";
- t["\uFCC7"] = "\u0643\u0644";
- t["\uFCC8"] = "\u0643\u0645";
- t["\uFCC9"] = "\u0644\u062C";
- t["\uFCCA"] = "\u0644\u062D";
- t["\uFCCB"] = "\u0644\u062E";
- t["\uFCCC"] = "\u0644\u0645";
- t["\uFCCD"] = "\u0644\u0647";
- t["\uFCCE"] = "\u0645\u062C";
- t["\uFCCF"] = "\u0645\u062D";
- t["\uFCD0"] = "\u0645\u062E";
- t["\uFCD1"] = "\u0645\u0645";
- t["\uFCD2"] = "\u0646\u062C";
- t["\uFCD3"] = "\u0646\u062D";
- t["\uFCD4"] = "\u0646\u062E";
- t["\uFCD5"] = "\u0646\u0645";
- t["\uFCD6"] = "\u0646\u0647";
- t["\uFCD7"] = "\u0647\u062C";
- t["\uFCD8"] = "\u0647\u0645";
- t["\uFCD9"] = "\u0647\u0670";
- t["\uFCDA"] = "\u064A\u062C";
- t["\uFCDB"] = "\u064A\u062D";
- t["\uFCDC"] = "\u064A\u062E";
- t["\uFCDD"] = "\u064A\u0645";
- t["\uFCDE"] = "\u064A\u0647";
- t["\uFCDF"] = "\u0626\u0645";
- t["\uFCE0"] = "\u0626\u0647";
- t["\uFCE1"] = "\u0628\u0645";
- t["\uFCE2"] = "\u0628\u0647";
- t["\uFCE3"] = "\u062A\u0645";
- t["\uFCE4"] = "\u062A\u0647";
- t["\uFCE5"] = "\u062B\u0645";
- t["\uFCE6"] = "\u062B\u0647";
- t["\uFCE7"] = "\u0633\u0645";
- t["\uFCE8"] = "\u0633\u0647";
- t["\uFCE9"] = "\u0634\u0645";
- t["\uFCEA"] = "\u0634\u0647";
- t["\uFCEB"] = "\u0643\u0644";
- t["\uFCEC"] = "\u0643\u0645";
- t["\uFCED"] = "\u0644\u0645";
- t["\uFCEE"] = "\u0646\u0645";
- t["\uFCEF"] = "\u0646\u0647";
- t["\uFCF0"] = "\u064A\u0645";
- t["\uFCF1"] = "\u064A\u0647";
- t["\uFCF2"] = "\u0640\u064E\u0651";
- t["\uFCF3"] = "\u0640\u064F\u0651";
- t["\uFCF4"] = "\u0640\u0650\u0651";
- t["\uFCF5"] = "\u0637\u0649";
- t["\uFCF6"] = "\u0637\u064A";
- t["\uFCF7"] = "\u0639\u0649";
- t["\uFCF8"] = "\u0639\u064A";
- t["\uFCF9"] = "\u063A\u0649";
- t["\uFCFA"] = "\u063A\u064A";
- t["\uFCFB"] = "\u0633\u0649";
- t["\uFCFC"] = "\u0633\u064A";
- t["\uFCFD"] = "\u0634\u0649";
- t["\uFCFE"] = "\u0634\u064A";
- t["\uFCFF"] = "\u062D\u0649";
- t["\uFD00"] = "\u062D\u064A";
- t["\uFD01"] = "\u062C\u0649";
- t["\uFD02"] = "\u062C\u064A";
- t["\uFD03"] = "\u062E\u0649";
- t["\uFD04"] = "\u062E\u064A";
- t["\uFD05"] = "\u0635\u0649";
- t["\uFD06"] = "\u0635\u064A";
- t["\uFD07"] = "\u0636\u0649";
- t["\uFD08"] = "\u0636\u064A";
- t["\uFD09"] = "\u0634\u062C";
- t["\uFD0A"] = "\u0634\u062D";
- t["\uFD0B"] = "\u0634\u062E";
- t["\uFD0C"] = "\u0634\u0645";
- t["\uFD0D"] = "\u0634\u0631";
- t["\uFD0E"] = "\u0633\u0631";
- t["\uFD0F"] = "\u0635\u0631";
- t["\uFD10"] = "\u0636\u0631";
- t["\uFD11"] = "\u0637\u0649";
- t["\uFD12"] = "\u0637\u064A";
- t["\uFD13"] = "\u0639\u0649";
- t["\uFD14"] = "\u0639\u064A";
- t["\uFD15"] = "\u063A\u0649";
- t["\uFD16"] = "\u063A\u064A";
- t["\uFD17"] = "\u0633\u0649";
- t["\uFD18"] = "\u0633\u064A";
- t["\uFD19"] = "\u0634\u0649";
- t["\uFD1A"] = "\u0634\u064A";
- t["\uFD1B"] = "\u062D\u0649";
- t["\uFD1C"] = "\u062D\u064A";
- t["\uFD1D"] = "\u062C\u0649";
- t["\uFD1E"] = "\u062C\u064A";
- t["\uFD1F"] = "\u062E\u0649";
- t["\uFD20"] = "\u062E\u064A";
- t["\uFD21"] = "\u0635\u0649";
- t["\uFD22"] = "\u0635\u064A";
- t["\uFD23"] = "\u0636\u0649";
- t["\uFD24"] = "\u0636\u064A";
- t["\uFD25"] = "\u0634\u062C";
- t["\uFD26"] = "\u0634\u062D";
- t["\uFD27"] = "\u0634\u062E";
- t["\uFD28"] = "\u0634\u0645";
- t["\uFD29"] = "\u0634\u0631";
- t["\uFD2A"] = "\u0633\u0631";
- t["\uFD2B"] = "\u0635\u0631";
- t["\uFD2C"] = "\u0636\u0631";
- t["\uFD2D"] = "\u0634\u062C";
- t["\uFD2E"] = "\u0634\u062D";
- t["\uFD2F"] = "\u0634\u062E";
- t["\uFD30"] = "\u0634\u0645";
- t["\uFD31"] = "\u0633\u0647";
- t["\uFD32"] = "\u0634\u0647";
- t["\uFD33"] = "\u0637\u0645";
- t["\uFD34"] = "\u0633\u062C";
- t["\uFD35"] = "\u0633\u062D";
- t["\uFD36"] = "\u0633\u062E";
- t["\uFD37"] = "\u0634\u062C";
- t["\uFD38"] = "\u0634\u062D";
- t["\uFD39"] = "\u0634\u062E";
- t["\uFD3A"] = "\u0637\u0645";
- t["\uFD3B"] = "\u0638\u0645";
- t["\uFD3C"] = "\u0627\u064B";
- t["\uFD3D"] = "\u0627\u064B";
- t["\uFD50"] = "\u062A\u062C\u0645";
- t["\uFD51"] = "\u062A\u062D\u062C";
- t["\uFD52"] = "\u062A\u062D\u062C";
- t["\uFD53"] = "\u062A\u062D\u0645";
- t["\uFD54"] = "\u062A\u062E\u0645";
- t["\uFD55"] = "\u062A\u0645\u062C";
- t["\uFD56"] = "\u062A\u0645\u062D";
- t["\uFD57"] = "\u062A\u0645\u062E";
- t["\uFD58"] = "\u062C\u0645\u062D";
- t["\uFD59"] = "\u062C\u0645\u062D";
- t["\uFD5A"] = "\u062D\u0645\u064A";
- t["\uFD5B"] = "\u062D\u0645\u0649";
- t["\uFD5C"] = "\u0633\u062D\u062C";
- t["\uFD5D"] = "\u0633\u062C\u062D";
- t["\uFD5E"] = "\u0633\u062C\u0649";
- t["\uFD5F"] = "\u0633\u0645\u062D";
- t["\uFD60"] = "\u0633\u0645\u062D";
- t["\uFD61"] = "\u0633\u0645\u062C";
- t["\uFD62"] = "\u0633\u0645\u0645";
- t["\uFD63"] = "\u0633\u0645\u0645";
- t["\uFD64"] = "\u0635\u062D\u062D";
- t["\uFD65"] = "\u0635\u062D\u062D";
- t["\uFD66"] = "\u0635\u0645\u0645";
- t["\uFD67"] = "\u0634\u062D\u0645";
- t["\uFD68"] = "\u0634\u062D\u0645";
- t["\uFD69"] = "\u0634\u062C\u064A";
- t["\uFD6A"] = "\u0634\u0645\u062E";
- t["\uFD6B"] = "\u0634\u0645\u062E";
- t["\uFD6C"] = "\u0634\u0645\u0645";
- t["\uFD6D"] = "\u0634\u0645\u0645";
- t["\uFD6E"] = "\u0636\u062D\u0649";
- t["\uFD6F"] = "\u0636\u062E\u0645";
- t["\uFD70"] = "\u0636\u062E\u0645";
- t["\uFD71"] = "\u0637\u0645\u062D";
- t["\uFD72"] = "\u0637\u0645\u062D";
- t["\uFD73"] = "\u0637\u0645\u0645";
- t["\uFD74"] = "\u0637\u0645\u064A";
- t["\uFD75"] = "\u0639\u062C\u0645";
- t["\uFD76"] = "\u0639\u0645\u0645";
- t["\uFD77"] = "\u0639\u0645\u0645";
- t["\uFD78"] = "\u0639\u0645\u0649";
- t["\uFD79"] = "\u063A\u0645\u0645";
- t["\uFD7A"] = "\u063A\u0645\u064A";
- t["\uFD7B"] = "\u063A\u0645\u0649";
- t["\uFD7C"] = "\u0641\u062E\u0645";
- t["\uFD7D"] = "\u0641\u062E\u0645";
- t["\uFD7E"] = "\u0642\u0645\u062D";
- t["\uFD7F"] = "\u0642\u0645\u0645";
- t["\uFD80"] = "\u0644\u062D\u0645";
- t["\uFD81"] = "\u0644\u062D\u064A";
- t["\uFD82"] = "\u0644\u062D\u0649";
- t["\uFD83"] = "\u0644\u062C\u062C";
- t["\uFD84"] = "\u0644\u062C\u062C";
- t["\uFD85"] = "\u0644\u062E\u0645";
- t["\uFD86"] = "\u0644\u062E\u0645";
- t["\uFD87"] = "\u0644\u0645\u062D";
- t["\uFD88"] = "\u0644\u0645\u062D";
- t["\uFD89"] = "\u0645\u062D\u062C";
- t["\uFD8A"] = "\u0645\u062D\u0645";
- t["\uFD8B"] = "\u0645\u062D\u064A";
- t["\uFD8C"] = "\u0645\u062C\u062D";
- t["\uFD8D"] = "\u0645\u062C\u0645";
- t["\uFD8E"] = "\u0645\u062E\u062C";
- t["\uFD8F"] = "\u0645\u062E\u0645";
- t["\uFD92"] = "\u0645\u062C\u062E";
- t["\uFD93"] = "\u0647\u0645\u062C";
- t["\uFD94"] = "\u0647\u0645\u0645";
- t["\uFD95"] = "\u0646\u062D\u0645";
- t["\uFD96"] = "\u0646\u062D\u0649";
- t["\uFD97"] = "\u0646\u062C\u0645";
- t["\uFD98"] = "\u0646\u062C\u0645";
- t["\uFD99"] = "\u0646\u062C\u0649";
- t["\uFD9A"] = "\u0646\u0645\u064A";
- t["\uFD9B"] = "\u0646\u0645\u0649";
- t["\uFD9C"] = "\u064A\u0645\u0645";
- t["\uFD9D"] = "\u064A\u0645\u0645";
- t["\uFD9E"] = "\u0628\u062E\u064A";
- t["\uFD9F"] = "\u062A\u062C\u064A";
- t["\uFDA0"] = "\u062A\u062C\u0649";
- t["\uFDA1"] = "\u062A\u062E\u064A";
- t["\uFDA2"] = "\u062A\u062E\u0649";
- t["\uFDA3"] = "\u062A\u0645\u064A";
- t["\uFDA4"] = "\u062A\u0645\u0649";
- t["\uFDA5"] = "\u062C\u0645\u064A";
- t["\uFDA6"] = "\u062C\u062D\u0649";
- t["\uFDA7"] = "\u062C\u0645\u0649";
- t["\uFDA8"] = "\u0633\u062E\u0649";
- t["\uFDA9"] = "\u0635\u062D\u064A";
- t["\uFDAA"] = "\u0634\u062D\u064A";
- t["\uFDAB"] = "\u0636\u062D\u064A";
- t["\uFDAC"] = "\u0644\u062C\u064A";
- t["\uFDAD"] = "\u0644\u0645\u064A";
- t["\uFDAE"] = "\u064A\u062D\u064A";
- t["\uFDAF"] = "\u064A\u062C\u064A";
- t["\uFDB0"] = "\u064A\u0645\u064A";
- t["\uFDB1"] = "\u0645\u0645\u064A";
- t["\uFDB2"] = "\u0642\u0645\u064A";
- t["\uFDB3"] = "\u0646\u062D\u064A";
- t["\uFDB4"] = "\u0642\u0645\u062D";
- t["\uFDB5"] = "\u0644\u062D\u0645";
- t["\uFDB6"] = "\u0639\u0645\u064A";
- t["\uFDB7"] = "\u0643\u0645\u064A";
- t["\uFDB8"] = "\u0646\u062C\u062D";
- t["\uFDB9"] = "\u0645\u062E\u064A";
- t["\uFDBA"] = "\u0644\u062C\u0645";
- t["\uFDBB"] = "\u0643\u0645\u0645";
- t["\uFDBC"] = "\u0644\u062C\u0645";
- t["\uFDBD"] = "\u0646\u062C\u062D";
- t["\uFDBE"] = "\u062C\u062D\u064A";
- t["\uFDBF"] = "\u062D\u062C\u064A";
- t["\uFDC0"] = "\u0645\u062C\u064A";
- t["\uFDC1"] = "\u0641\u0645\u064A";
- t["\uFDC2"] = "\u0628\u062D\u064A";
- t["\uFDC3"] = "\u0643\u0645\u0645";
- t["\uFDC4"] = "\u0639\u062C\u0645";
- t["\uFDC5"] = "\u0635\u0645\u0645";
- t["\uFDC6"] = "\u0633\u062E\u064A";
- t["\uFDC7"] = "\u0646\u062C\u064A";
- t["\uFE49"] = "\u203E";
- t["\uFE4A"] = "\u203E";
- t["\uFE4B"] = "\u203E";
- t["\uFE4C"] = "\u203E";
- t["\uFE4D"] = "\u005F";
- t["\uFE4E"] = "\u005F";
- t["\uFE4F"] = "\u005F";
- t["\uFE80"] = "\u0621";
- t["\uFE81"] = "\u0622";
- t["\uFE82"] = "\u0622";
- t["\uFE83"] = "\u0623";
- t["\uFE84"] = "\u0623";
- t["\uFE85"] = "\u0624";
- t["\uFE86"] = "\u0624";
- t["\uFE87"] = "\u0625";
- t["\uFE88"] = "\u0625";
- t["\uFE89"] = "\u0626";
- t["\uFE8A"] = "\u0626";
- t["\uFE8B"] = "\u0626";
- t["\uFE8C"] = "\u0626";
- t["\uFE8D"] = "\u0627";
- t["\uFE8E"] = "\u0627";
- t["\uFE8F"] = "\u0628";
- t["\uFE90"] = "\u0628";
- t["\uFE91"] = "\u0628";
- t["\uFE92"] = "\u0628";
- t["\uFE93"] = "\u0629";
- t["\uFE94"] = "\u0629";
- t["\uFE95"] = "\u062A";
- t["\uFE96"] = "\u062A";
- t["\uFE97"] = "\u062A";
- t["\uFE98"] = "\u062A";
- t["\uFE99"] = "\u062B";
- t["\uFE9A"] = "\u062B";
- t["\uFE9B"] = "\u062B";
- t["\uFE9C"] = "\u062B";
- t["\uFE9D"] = "\u062C";
- t["\uFE9E"] = "\u062C";
- t["\uFE9F"] = "\u062C";
- t["\uFEA0"] = "\u062C";
- t["\uFEA1"] = "\u062D";
- t["\uFEA2"] = "\u062D";
- t["\uFEA3"] = "\u062D";
- t["\uFEA4"] = "\u062D";
- t["\uFEA5"] = "\u062E";
- t["\uFEA6"] = "\u062E";
- t["\uFEA7"] = "\u062E";
- t["\uFEA8"] = "\u062E";
- t["\uFEA9"] = "\u062F";
- t["\uFEAA"] = "\u062F";
- t["\uFEAB"] = "\u0630";
- t["\uFEAC"] = "\u0630";
- t["\uFEAD"] = "\u0631";
- t["\uFEAE"] = "\u0631";
- t["\uFEAF"] = "\u0632";
- t["\uFEB0"] = "\u0632";
- t["\uFEB1"] = "\u0633";
- t["\uFEB2"] = "\u0633";
- t["\uFEB3"] = "\u0633";
- t["\uFEB4"] = "\u0633";
- t["\uFEB5"] = "\u0634";
- t["\uFEB6"] = "\u0634";
- t["\uFEB7"] = "\u0634";
- t["\uFEB8"] = "\u0634";
- t["\uFEB9"] = "\u0635";
- t["\uFEBA"] = "\u0635";
- t["\uFEBB"] = "\u0635";
- t["\uFEBC"] = "\u0635";
- t["\uFEBD"] = "\u0636";
- t["\uFEBE"] = "\u0636";
- t["\uFEBF"] = "\u0636";
- t["\uFEC0"] = "\u0636";
- t["\uFEC1"] = "\u0637";
- t["\uFEC2"] = "\u0637";
- t["\uFEC3"] = "\u0637";
- t["\uFEC4"] = "\u0637";
- t["\uFEC5"] = "\u0638";
- t["\uFEC6"] = "\u0638";
- t["\uFEC7"] = "\u0638";
- t["\uFEC8"] = "\u0638";
- t["\uFEC9"] = "\u0639";
- t["\uFECA"] = "\u0639";
- t["\uFECB"] = "\u0639";
- t["\uFECC"] = "\u0639";
- t["\uFECD"] = "\u063A";
- t["\uFECE"] = "\u063A";
- t["\uFECF"] = "\u063A";
- t["\uFED0"] = "\u063A";
- t["\uFED1"] = "\u0641";
- t["\uFED2"] = "\u0641";
- t["\uFED3"] = "\u0641";
- t["\uFED4"] = "\u0641";
- t["\uFED5"] = "\u0642";
- t["\uFED6"] = "\u0642";
- t["\uFED7"] = "\u0642";
- t["\uFED8"] = "\u0642";
- t["\uFED9"] = "\u0643";
- t["\uFEDA"] = "\u0643";
- t["\uFEDB"] = "\u0643";
- t["\uFEDC"] = "\u0643";
- t["\uFEDD"] = "\u0644";
- t["\uFEDE"] = "\u0644";
- t["\uFEDF"] = "\u0644";
- t["\uFEE0"] = "\u0644";
- t["\uFEE1"] = "\u0645";
- t["\uFEE2"] = "\u0645";
- t["\uFEE3"] = "\u0645";
- t["\uFEE4"] = "\u0645";
- t["\uFEE5"] = "\u0646";
- t["\uFEE6"] = "\u0646";
- t["\uFEE7"] = "\u0646";
- t["\uFEE8"] = "\u0646";
- t["\uFEE9"] = "\u0647";
- t["\uFEEA"] = "\u0647";
- t["\uFEEB"] = "\u0647";
- t["\uFEEC"] = "\u0647";
- t["\uFEED"] = "\u0648";
- t["\uFEEE"] = "\u0648";
- t["\uFEEF"] = "\u0649";
- t["\uFEF0"] = "\u0649";
- t["\uFEF1"] = "\u064A";
- t["\uFEF2"] = "\u064A";
- t["\uFEF3"] = "\u064A";
- t["\uFEF4"] = "\u064A";
- t["\uFEF5"] = "\u0644\u0622";
- t["\uFEF6"] = "\u0644\u0622";
- t["\uFEF7"] = "\u0644\u0623";
- t["\uFEF8"] = "\u0644\u0623";
- t["\uFEF9"] = "\u0644\u0625";
- t["\uFEFA"] = "\u0644\u0625";
- t["\uFEFB"] = "\u0644\u0627";
- t["\uFEFC"] = "\u0644\u0627";
-});
-function reverseIfRtl(chars) {
- var charsLength = chars.length;
- if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
-  return chars;
- }
- var s = "";
- for (var ii = charsLength - 1; ii >= 0; ii--) {
-  s += chars[ii];
- }
- return s;
+ }
+ return -1;
+}
+function isRTLRangeFor(value) {
+ let range = UnicodeRanges[13];
+ if (value >= range.begin && value < range.end) {
+  return true;
+ }
+ range = UnicodeRanges[11];
+ if (value >= range.begin && value < range.end) {
+  return true;
+ }
+ return false;
+}
+const getNormalizedUnicodes = 
(0,_core_utils_js__WEBPACK_IMPORTED_MODULE_0__.getArrayLookupTableFactory)(function () {
+ return [
+  "\u00A8",
+  "\u0020\u0308",
+  "\u00AF",
+  "\u0020\u0304",
+  "\u00B4",
+  "\u0020\u0301",
+  "\u00B5",
+  "\u03BC",
+  "\u00B8",
+  "\u0020\u0327",
+  "\u0132",
+  "\u0049\u004A",
+  "\u0133",
+  "\u0069\u006A",
+  "\u013F",
+  "\u004C\u00B7",
+  "\u0140",
+  "\u006C\u00B7",
+  "\u0149",
+  "\u02BC\u006E",
+  "\u017F",
+  "\u0073",
+  "\u01C4",
+  "\u0044\u017D",
+  "\u01C5",
+  "\u0044\u017E",
+  "\u01C6",
+  "\u0064\u017E",
+  "\u01C7",
+  "\u004C\u004A",
+  "\u01C8",
+  "\u004C\u006A",
+  "\u01C9",
+  "\u006C\u006A",
+  "\u01CA",
+  "\u004E\u004A",
+  "\u01CB",
+  "\u004E\u006A",
+  "\u01CC",
+  "\u006E\u006A",
+  "\u01F1",
+  "\u0044\u005A",
+  "\u01F2",
+  "\u0044\u007A",
+  "\u01F3",
+  "\u0064\u007A",
+  "\u02D8",
+  "\u0020\u0306",
+  "\u02D9",
+  "\u0020\u0307",
+  "\u02DA",
+  "\u0020\u030A",
+  "\u02DB",
+  "\u0020\u0328",
+  "\u02DC",
+  "\u0020\u0303",
+  "\u02DD",
+  "\u0020\u030B",
+  "\u037A",
+  "\u0020\u0345",
+  "\u0384",
+  "\u0020\u0301",
+  "\u03D0",
+  "\u03B2",
+  "\u03D1",
+  "\u03B8",
+  "\u03D2",
+  "\u03A5",
+  "\u03D5",
+  "\u03C6",
+  "\u03D6",
+  "\u03C0",
+  "\u03F0",
+  "\u03BA",
+  "\u03F1",
+  "\u03C1",
+  "\u03F2",
+  "\u03C2",
+  "\u03F4",
+  "\u0398",
+  "\u03F5",
+  "\u03B5",
+  "\u03F9",
+  "\u03A3",
+  "\u0587",
+  "\u0565\u0582",
+  "\u0675",
+  "\u0627\u0674",
+  "\u0676",
+  "\u0648\u0674",
+  "\u0677",
+  "\u06C7\u0674",
+  "\u0678",
+  "\u064A\u0674",
+  "\u0E33",
+  "\u0E4D\u0E32",
+  "\u0EB3",
+  "\u0ECD\u0EB2",
+  "\u0EDC",
+  "\u0EAB\u0E99",
+  "\u0EDD",
+  "\u0EAB\u0EA1",
+  "\u0F77",
+  "\u0FB2\u0F81",
+  "\u0F79",
+  "\u0FB3\u0F81",
+  "\u1E9A",
+  "\u0061\u02BE",
+  "\u1FBD",
+  "\u0020\u0313",
+  "\u1FBF",
+  "\u0020\u0313",
+  "\u1FC0",
+  "\u0020\u0342",
+  "\u1FFE",
+  "\u0020\u0314",
+  "\u2002",
+  "\u0020",
+  "\u2003",
+  "\u0020",
+  "\u2004",
+  "\u0020",
+  "\u2005",
+  "\u0020",
+  "\u2006",
+  "\u0020",
+  "\u2008",
+  "\u0020",
+  "\u2009",
+  "\u0020",
+  "\u200A",
+  "\u0020",
+  "\u2017",
+  "\u0020\u0333",
+  "\u2024",
+  "\u002E",
+  "\u2025",
+  "\u002E\u002E",
+  "\u2026",
+  "\u002E\u002E\u002E",
+  "\u2033",
+  "\u2032\u2032",
+  "\u2034",
+  "\u2032\u2032\u2032",
+  "\u2036",
+  "\u2035\u2035",
+  "\u2037",
+  "\u2035\u2035\u2035",
+  "\u203C",
+  "\u0021\u0021",
+  "\u203E",
+  "\u0020\u0305",
+  "\u2047",
+  "\u003F\u003F",
+  "\u2048",
+  "\u003F\u0021",
+  "\u2049",
+  "\u0021\u003F",
+  "\u2057",
+  "\u2032\u2032\u2032\u2032",
+  "\u205F",
+  "\u0020",
+  "\u20A8",
+  "\u0052\u0073",
+  "\u2100",
+  "\u0061\u002F\u0063",
+  "\u2101",
+  "\u0061\u002F\u0073",
+  "\u2103",
+  "\u00B0\u0043",
+  "\u2105",
+  "\u0063\u002F\u006F",
+  "\u2106",
+  "\u0063\u002F\u0075",
+  "\u2107",
+  "\u0190",
+  "\u2109",
+  "\u00B0\u0046",
+  "\u2116",
+  "\u004E\u006F",
+  "\u2121",
+  "\u0054\u0045\u004C",
+  "\u2135",
+  "\u05D0",
+  "\u2136",
+  "\u05D1",
+  "\u2137",
+  "\u05D2",
+  "\u2138",
+  "\u05D3",
+  "\u213B",
+  "\u0046\u0041\u0058",
+  "\u2160",
+  "\u0049",
+  "\u2161",
+  "\u0049\u0049",
+  "\u2162",
+  "\u0049\u0049\u0049",
+  "\u2163",
+  "\u0049\u0056",
+  "\u2164",
+  "\u0056",
+  "\u2165",
+  "\u0056\u0049",
+  "\u2166",
+  "\u0056\u0049\u0049",
+  "\u2167",
+  "\u0056\u0049\u0049\u0049",
+  "\u2168",
+  "\u0049\u0058",
+  "\u2169",
+  "\u0058",
+  "\u216A",
+  "\u0058\u0049",
+  "\u216B",
+  "\u0058\u0049\u0049",
+  "\u216C",
+  "\u004C",
+  "\u216D",
+  "\u0043",
+  "\u216E",
+  "\u0044",
+  "\u216F",
+  "\u004D",
+  "\u2170",
+  "\u0069",
+  "\u2171",
+  "\u0069\u0069",
+  "\u2172",
+  "\u0069\u0069\u0069",
+  "\u2173",
+  "\u0069\u0076",
+  "\u2174",
+  "\u0076",
+  "\u2175",
+  "\u0076\u0069",
+  "\u2176",
+  "\u0076\u0069\u0069",
+  "\u2177",
+  "\u0076\u0069\u0069\u0069",
+  "\u2178",
+  "\u0069\u0078",
+  "\u2179",
+  "\u0078",
+  "\u217A",
+  "\u0078\u0069",
+  "\u217B",
+  "\u0078\u0069\u0069",
+  "\u217C",
+  "\u006C",
+  "\u217D",
+  "\u0063",
+  "\u217E",
+  "\u0064",
+  "\u217F",
+  "\u006D",
+  "\u222C",
+  "\u222B\u222B",
+  "\u222D",
+  "\u222B\u222B\u222B",
+  "\u222F",
+  "\u222E\u222E",
+  "\u2230",
+  "\u222E\u222E\u222E",
+  "\u2474",
+  "\u0028\u0031\u0029",
+  "\u2475",
+  "\u0028\u0032\u0029",
+  "\u2476",
+  "\u0028\u0033\u0029",
+  "\u2477",
+  "\u0028\u0034\u0029",
+  "\u2478",
+  "\u0028\u0035\u0029",
+  "\u2479",
+  "\u0028\u0036\u0029",
+  "\u247A",
+  "\u0028\u0037\u0029",
+  "\u247B",
+  "\u0028\u0038\u0029",
+  "\u247C",
+  "\u0028\u0039\u0029",
+  "\u247D",
+  "\u0028\u0031\u0030\u0029",
+  "\u247E",
+  "\u0028\u0031\u0031\u0029",
+  "\u247F",
+  "\u0028\u0031\u0032\u0029",
+  "\u2480",
+  "\u0028\u0031\u0033\u0029",
+  "\u2481",
+  "\u0028\u0031\u0034\u0029",
+  "\u2482",
+  "\u0028\u0031\u0035\u0029",
+  "\u2483",
+  "\u0028\u0031\u0036\u0029",
+  "\u2484",
+  "\u0028\u0031\u0037\u0029",
+  "\u2485",
+  "\u0028\u0031\u0038\u0029",
+  "\u2486",
+  "\u0028\u0031\u0039\u0029",
+  "\u2487",
+  "\u0028\u0032\u0030\u0029",
+  "\u2488",
+  "\u0031\u002E",
+  "\u2489",
+  "\u0032\u002E",
+  "\u248A",
+  "\u0033\u002E",
+  "\u248B",
+  "\u0034\u002E",
+  "\u248C",
+  "\u0035\u002E",
+  "\u248D",
+  "\u0036\u002E",
+  "\u248E",
+  "\u0037\u002E",
+  "\u248F",
+  "\u0038\u002E",
+  "\u2490",
+  "\u0039\u002E",
+  "\u2491",
+  "\u0031\u0030\u002E",
+  "\u2492",
+  "\u0031\u0031\u002E",
+  "\u2493",
+  "\u0031\u0032\u002E",
+  "\u2494",
+  "\u0031\u0033\u002E",
+  "\u2495",
+  "\u0031\u0034\u002E",
+  "\u2496",
+  "\u0031\u0035\u002E",
+  "\u2497",
+  "\u0031\u0036\u002E",
+  "\u2498",
+  "\u0031\u0037\u002E",
+  "\u2499",
+  "\u0031\u0038\u002E",
+  "\u249A",
+  "\u0031\u0039\u002E",
+  "\u249B",
+  "\u0032\u0030\u002E",
+  "\u249C",
+  "\u0028\u0061\u0029",
+  "\u249D",
+  "\u0028\u0062\u0029",
+  "\u249E",
+  "\u0028\u0063\u0029",
+  "\u249F",
+  "\u0028\u0064\u0029",
+  "\u24A0",
+  "\u0028\u0065\u0029",
+  "\u24A1",
+  "\u0028\u0066\u0029",
+  "\u24A2",
+  "\u0028\u0067\u0029",
+  "\u24A3",
+  "\u0028\u0068\u0029",
+  "\u24A4",
+  "\u0028\u0069\u0029",
+  "\u24A5",
+  "\u0028\u006A\u0029",
+  "\u24A6",
+  "\u0028\u006B\u0029",
+  "\u24A7",
+  "\u0028\u006C\u0029",
+  "\u24A8",
+  "\u0028\u006D\u0029",
+  "\u24A9",
+  "\u0028\u006E\u0029",
+  "\u24AA",
+  "\u0028\u006F\u0029",
+  "\u24AB",
+  "\u0028\u0070\u0029",
+  "\u24AC",
+  "\u0028\u0071\u0029",
+  "\u24AD",
+  "\u0028\u0072\u0029",
+  "\u24AE",
+  "\u0028\u0073\u0029",
+  "\u24AF",
+  "\u0028\u0074\u0029",
+  "\u24B0",
+  "\u0028\u0075\u0029",
+  "\u24B1",
+  "\u0028\u0076\u0029",
+  "\u24B2",
+  "\u0028\u0077\u0029",
+  "\u24B3",
+  "\u0028\u0078\u0029",
+  "\u24B4",
+  "\u0028\u0079\u0029",
+  "\u24B5",
+  "\u0028\u007A\u0029",
+  "\u2A0C",
+  "\u222B\u222B\u222B\u222B",
+  "\u2A74",
+  "\u003A\u003A\u003D",
+  "\u2A75",
+  "\u003D\u003D",
+  "\u2A76",
+  "\u003D\u003D\u003D",
+  "\u2E9F",
+  "\u6BCD",
+  "\u2EF3",
+  "\u9F9F",
+  "\u2F00",
+  "\u4E00",
+  "\u2F01",
+  "\u4E28",
+  "\u2F02",
+  "\u4E36",
+  "\u2F03",
+  "\u4E3F",
+  "\u2F04",
+  "\u4E59",
+  "\u2F05",
+  "\u4E85",
+  "\u2F06",
+  "\u4E8C",
+  "\u2F07",
+  "\u4EA0",
+  "\u2F08",
+  "\u4EBA",
+  "\u2F09",
+  "\u513F",
+  "\u2F0A",
+  "\u5165",
+  "\u2F0B",
+  "\u516B",
+  "\u2F0C",
+  "\u5182",
+  "\u2F0D",
+  "\u5196",
+  "\u2F0E",
+  "\u51AB",
+  "\u2F0F",
+  "\u51E0",
+  "\u2F10",
+  "\u51F5",
+  "\u2F11",
+  "\u5200",
+  "\u2F12",
+  "\u529B",
+  "\u2F13",
+  "\u52F9",
+  "\u2F14",
+  "\u5315",
+  "\u2F15",
+  "\u531A",
+  "\u2F16",
+  "\u5338",
+  "\u2F17",
+  "\u5341",
+  "\u2F18",
+  "\u535C",
+  "\u2F19",
+  "\u5369",
+  "\u2F1A",
+  "\u5382",
+  "\u2F1B",
+  "\u53B6",
+  "\u2F1C",
+  "\u53C8",
+  "\u2F1D",
+  "\u53E3",
+  "\u2F1E",
+  "\u56D7",
+  "\u2F1F",
+  "\u571F",
+  "\u2F20",
+  "\u58EB",
+  "\u2F21",
+  "\u5902",
+  "\u2F22",
+  "\u590A",
+  "\u2F23",
+  "\u5915",
+  "\u2F24",
+  "\u5927",
+  "\u2F25",
+  "\u5973",
+  "\u2F26",
+  "\u5B50",
+  "\u2F27",
+  "\u5B80",
+  "\u2F28",
+  "\u5BF8",
+  "\u2F29",
+  "\u5C0F",
+  "\u2F2A",
+  "\u5C22",
+  "\u2F2B",
+  "\u5C38",
+  "\u2F2C",
+  "\u5C6E",
+  "\u2F2D",
+  "\u5C71",
+  "\u2F2E",
+  "\u5DDB",
+  "\u2F2F",
+  "\u5DE5",
+  "\u2F30",
+  "\u5DF1",
+  "\u2F31",
+  "\u5DFE",
+  "\u2F32",
+  "\u5E72",
+  "\u2F33",
+  "\u5E7A",
+  "\u2F34",
+  "\u5E7F",
+  "\u2F35",
+  "\u5EF4",
+  "\u2F36",
+  "\u5EFE",
+  "\u2F37",
+  "\u5F0B",
+  "\u2F38",
+  "\u5F13",
+  "\u2F39",
+  "\u5F50",
+  "\u2F3A",
+  "\u5F61",
+  "\u2F3B",
+  "\u5F73",
+  "\u2F3C",
+  "\u5FC3",
+  "\u2F3D",
+  "\u6208",
+  "\u2F3E",
+  "\u6236",
+  "\u2F3F",
+  "\u624B",
+  "\u2F40",
+  "\u652F",
+  "\u2F41",
+  "\u6534",
+  "\u2F42",
+  "\u6587",
+  "\u2F43",
+  "\u6597",
+  "\u2F44",
+  "\u65A4",
+  "\u2F45",
+  "\u65B9",
+  "\u2F46",
+  "\u65E0",
+  "\u2F47",
+  "\u65E5",
+  "\u2F48",
+  "\u66F0",
+  "\u2F49",
+  "\u6708",
+  "\u2F4A",
+  "\u6728",
+  "\u2F4B",
+  "\u6B20",
+  "\u2F4C",
+  "\u6B62",
+  "\u2F4D",
+  "\u6B79",
+  "\u2F4E",
+  "\u6BB3",
+  "\u2F4F",
+  "\u6BCB",
+  "\u2F50",
+  "\u6BD4",
+  "\u2F51",
+  "\u6BDB",
+  "\u2F52",
+  "\u6C0F",
+  "\u2F53",
+  "\u6C14",
+  "\u2F54",
+  "\u6C34",
+  "\u2F55",
+  "\u706B",
+  "\u2F56",
+  "\u722A",
+  "\u2F57",
+  "\u7236",
+  "\u2F58",
+  "\u723B",
+  "\u2F59",
+  "\u723F",
+  "\u2F5A",
+  "\u7247",
+  "\u2F5B",
+  "\u7259",
+  "\u2F5C",
+  "\u725B",
+  "\u2F5D",
+  "\u72AC",
+  "\u2F5E",
+  "\u7384",
+  "\u2F5F",
+  "\u7389",
+  "\u2F60",
+  "\u74DC",
+  "\u2F61",
+  "\u74E6",
+  "\u2F62",
+  "\u7518",
+  "\u2F63",
+  "\u751F",
+  "\u2F64",
+  "\u7528",
+  "\u2F65",
+  "\u7530",
+  "\u2F66",
+  "\u758B",
+  "\u2F67",
+  "\u7592",
+  "\u2F68",
+  "\u7676",
+  "\u2F69",
+  "\u767D",
+  "\u2F6A",
+  "\u76AE",
+  "\u2F6B",
+  "\u76BF",
+  "\u2F6C",
+  "\u76EE",
+  "\u2F6D",
+  "\u77DB",
+  "\u2F6E",
+  "\u77E2",
+  "\u2F6F",
+  "\u77F3",
+  "\u2F70",
+  "\u793A",
+  "\u2F71",
+  "\u79B8",
+  "\u2F72",
+  "\u79BE",
+  "\u2F73",
+  "\u7A74",
+  "\u2F74",
+  "\u7ACB",
+  "\u2F75",
+  "\u7AF9",
+  "\u2F76",
+  "\u7C73",
+  "\u2F77",
+  "\u7CF8",
+  "\u2F78",
+  "\u7F36",
+  "\u2F79",
+  "\u7F51",
+  "\u2F7A",
+  "\u7F8A",
+  "\u2F7B",
+  "\u7FBD",
+  "\u2F7C",
+  "\u8001",
+  "\u2F7D",
+  "\u800C",
+  "\u2F7E",
+  "\u8012",
+  "\u2F7F",
+  "\u8033",
+  "\u2F80",
+  "\u807F",
+  "\u2F81",
+  "\u8089",
+  "\u2F82",
+  "\u81E3",
+  "\u2F83",
+  "\u81EA",
+  "\u2F84",
+  "\u81F3",
+  "\u2F85",
+  "\u81FC",
+  "\u2F86",
+  "\u820C",
+  "\u2F87",
+  "\u821B",
+  "\u2F88",
+  "\u821F",
+  "\u2F89",
+  "\u826E",
+  "\u2F8A",
+  "\u8272",
+  "\u2F8B",
+  "\u8278",
+  "\u2F8C",
+  "\u864D",
+  "\u2F8D",
+  "\u866B",
+  "\u2F8E",
+  "\u8840",
+  "\u2F8F",
+  "\u884C",
+  "\u2F90",
+  "\u8863",
+  "\u2F91",
+  "\u897E",
+  "\u2F92",
+  "\u898B",
+  "\u2F93",
+  "\u89D2",
+  "\u2F94",
+  "\u8A00",
+  "\u2F95",
+  "\u8C37",
+  "\u2F96",
+  "\u8C46",
+  "\u2F97",
+  "\u8C55",
+  "\u2F98",
+  "\u8C78",
+  "\u2F99",
+  "\u8C9D",
+  "\u2F9A",
+  "\u8D64",
+  "\u2F9B",
+  "\u8D70",
+  "\u2F9C",
+  "\u8DB3",
+  "\u2F9D",
+  "\u8EAB",
+  "\u2F9E",
+  "\u8ECA",
+  "\u2F9F",
+  "\u8F9B",
+  "\u2FA0",
+  "\u8FB0",
+  "\u2FA1",
+  "\u8FB5",
+  "\u2FA2",
+  "\u9091",
+  "\u2FA3",
+  "\u9149",
+  "\u2FA4",
+  "\u91C6",
+  "\u2FA5",
+  "\u91CC",
+  "\u2FA6",
+  "\u91D1",
+  "\u2FA7",
+  "\u9577",
+  "\u2FA8",
+  "\u9580",
+  "\u2FA9",
+  "\u961C",
+  "\u2FAA",
+  "\u96B6",
+  "\u2FAB",
+  "\u96B9",
+  "\u2FAC",
+  "\u96E8",
+  "\u2FAD",
+  "\u9751",
+  "\u2FAE",
+  "\u975E",
+  "\u2FAF",
+  "\u9762",
+  "\u2FB0",
+  "\u9769",
+  "\u2FB1",
+  "\u97CB",
+  "\u2FB2",
+  "\u97ED",
+  "\u2FB3",
+  "\u97F3",
+  "\u2FB4",
+  "\u9801",
+  "\u2FB5",
+  "\u98A8",
+  "\u2FB6",
+  "\u98DB",
+  "\u2FB7",
+  "\u98DF",
+  "\u2FB8",
+  "\u9996",
+  "\u2FB9",
+  "\u9999",
+  "\u2FBA",
+  "\u99AC",
+  "\u2FBB",
+  "\u9AA8",
+  "\u2FBC",
+  "\u9AD8",
+  "\u2FBD",
+  "\u9ADF",
+  "\u2FBE",
+  "\u9B25",
+  "\u2FBF",
+  "\u9B2F",
+  "\u2FC0",
+  "\u9B32",
+  "\u2FC1",
+  "\u9B3C",
+  "\u2FC2",
+  "\u9B5A",
+  "\u2FC3",
+  "\u9CE5",
+  "\u2FC4",
+  "\u9E75",
+  "\u2FC5",
+  "\u9E7F",
+  "\u2FC6",
+  "\u9EA5",
+  "\u2FC7",
+  "\u9EBB",
+  "\u2FC8",
+  "\u9EC3",
+  "\u2FC9",
+  "\u9ECD",
+  "\u2FCA",
+  "\u9ED1",
+  "\u2FCB",
+  "\u9EF9",
+  "\u2FCC",
+  "\u9EFD",
+  "\u2FCD",
+  "\u9F0E",
+  "\u2FCE",
+  "\u9F13",
+  "\u2FCF",
+  "\u9F20",
+  "\u2FD0",
+  "\u9F3B",
+  "\u2FD1",
+  "\u9F4A",
+  "\u2FD2",
+  "\u9F52",
+  "\u2FD3",
+  "\u9F8D",
+  "\u2FD4",
+  "\u9F9C",
+  "\u2FD5",
+  "\u9FA0",
+  "\u3036",
+  "\u3012",
+  "\u3038",
+  "\u5341",
+  "\u3039",
+  "\u5344",
+  "\u303A",
+  "\u5345",
+  "\u309B",
+  "\u0020\u3099",
+  "\u309C",
+  "\u0020\u309A",
+  "\u3131",
+  "\u1100",
+  "\u3132",
+  "\u1101",
+  "\u3133",
+  "\u11AA",
+  "\u3134",
+  "\u1102",
+  "\u3135",
+  "\u11AC",
+  "\u3136",
+  "\u11AD",
+  "\u3137",
+  "\u1103",
+  "\u3138",
+  "\u1104",
+  "\u3139",
+  "\u1105",
+  "\u313A",
+  "\u11B0",
+  "\u313B",
+  "\u11B1",
+  "\u313C",
+  "\u11B2",
+  "\u313D",
+  "\u11B3",
+  "\u313E",
+  "\u11B4",
+  "\u313F",
+  "\u11B5",
+  "\u3140",
+  "\u111A",
+  "\u3141",
+  "\u1106",
+  "\u3142",
+  "\u1107",
+  "\u3143",
+  "\u1108",
+  "\u3144",
+  "\u1121",
+  "\u3145",
+  "\u1109",
+  "\u3146",
+  "\u110A",
+  "\u3147",
+  "\u110B",
+  "\u3148",
+  "\u110C",
+  "\u3149",
+  "\u110D",
+  "\u314A",
+  "\u110E",
+  "\u314B",
+  "\u110F",
+  "\u314C",
+  "\u1110",
+  "\u314D",
+  "\u1111",
+  "\u314E",
+  "\u1112",
+  "\u314F",
+  "\u1161",
+  "\u3150",
+  "\u1162",
+  "\u3151",
+  "\u1163",
+  "\u3152",
+  "\u1164",
+  "\u3153",
+  "\u1165",
+  "\u3154",
+  "\u1166",
+  "\u3155",
+  "\u1167",
+  "\u3156",
+  "\u1168",
+  "\u3157",
+  "\u1169",
+  "\u3158",
+  "\u116A",
+  "\u3159",
+  "\u116B",
+  "\u315A",
+  "\u116C",
+  "\u315B",
+  "\u116D",
+  "\u315C",
+  "\u116E",
+  "\u315D",
+  "\u116F",
+  "\u315E",
+  "\u1170",
+  "\u315F",
+  "\u1171",
+  "\u3160",
+  "\u1172",
+  "\u3161",
+  "\u1173",
+  "\u3162",
+  "\u1174",
+  "\u3163",
+  "\u1175",
+  "\u3164",
+  "\u1160",
+  "\u3165",
+  "\u1114",
+  "\u3166",
+  "\u1115",
+  "\u3167",
+  "\u11C7",
+  "\u3168",
+  "\u11C8",
+  "\u3169",
+  "\u11CC",
+  "\u316A",
+  "\u11CE",
+  "\u316B",
+  "\u11D3",
+  "\u316C",
+  "\u11D7",
+  "\u316D",
+  "\u11D9",
+  "\u316E",
+  "\u111C",
+  "\u316F",
+  "\u11DD",
+  "\u3170",
+  "\u11DF",
+  "\u3171",
+  "\u111D",
+  "\u3172",
+  "\u111E",
+  "\u3173",
+  "\u1120",
+  "\u3174",
+  "\u1122",
+  "\u3175",
+  "\u1123",
+  "\u3176",
+  "\u1127",
+  "\u3177",
+  "\u1129",
+  "\u3178",
+  "\u112B",
+  "\u3179",
+  "\u112C",
+  "\u317A",
+  "\u112D",
+  "\u317B",
+  "\u112E",
+  "\u317C",
+  "\u112F",
+  "\u317D",
+  "\u1132",
+  "\u317E",
+  "\u1136",
+  "\u317F",
+  "\u1140",
+  "\u3180",
+  "\u1147",
+  "\u3181",
+  "\u114C",
+  "\u3182",
+  "\u11F1",
+  "\u3183",
+  "\u11F2",
+  "\u3184",
+  "\u1157",
+  "\u3185",
+  "\u1158",
+  "\u3186",
+  "\u1159",
+  "\u3187",
+  "\u1184",
+  "\u3188",
+  "\u1185",
+  "\u3189",
+  "\u1188",
+  "\u318A",
+  "\u1191",
+  "\u318B",
+  "\u1192",
+  "\u318C",
+  "\u1194",
+  "\u318D",
+  "\u119E",
+  "\u318E",
+  "\u11A1",
+  "\u3200",
+  "\u0028\u1100\u0029",
+  "\u3201",
+  "\u0028\u1102\u0029",
+  "\u3202",
+  "\u0028\u1103\u0029",
+  "\u3203",
+  "\u0028\u1105\u0029",
+  "\u3204",
+  "\u0028\u1106\u0029",
+  "\u3205",
+  "\u0028\u1107\u0029",
+  "\u3206",
+  "\u0028\u1109\u0029",
+  "\u3207",
+  "\u0028\u110B\u0029",
+  "\u3208",
+  "\u0028\u110C\u0029",
+  "\u3209",
+  "\u0028\u110E\u0029",
+  "\u320A",
+  "\u0028\u110F\u0029",
+  "\u320B",
+  "\u0028\u1110\u0029",
+  "\u320C",
+  "\u0028\u1111\u0029",
+  "\u320D",
+  "\u0028\u1112\u0029",
+  "\u320E",
+  "\u0028\u1100\u1161\u0029",
+  "\u320F",
+  "\u0028\u1102\u1161\u0029",
+  "\u3210",
+  "\u0028\u1103\u1161\u0029",
+  "\u3211",
+  "\u0028\u1105\u1161\u0029",
+  "\u3212",
+  "\u0028\u1106\u1161\u0029",
+  "\u3213",
+  "\u0028\u1107\u1161\u0029",
+  "\u3214",
+  "\u0028\u1109\u1161\u0029",
+  "\u3215",
+  "\u0028\u110B\u1161\u0029",
+  "\u3216",
+  "\u0028\u110C\u1161\u0029",
+  "\u3217",
+  "\u0028\u110E\u1161\u0029",
+  "\u3218",
+  "\u0028\u110F\u1161\u0029",
+  "\u3219",
+  "\u0028\u1110\u1161\u0029",
+  "\u321A",
+  "\u0028\u1111\u1161\u0029",
+  "\u321B",
+  "\u0028\u1112\u1161\u0029",
+  "\u321C",
+  "\u0028\u110C\u116E\u0029",
+  "\u321D",
+  "\u0028\u110B\u1169\u110C\u1165\u11AB\u0029",
+  "\u321E",
+  "\u0028\u110B\u1169\u1112\u116E\u0029",
+  "\u3220",
+  "\u0028\u4E00\u0029",
+  "\u3221",
+  "\u0028\u4E8C\u0029",
+  "\u3222",
+  "\u0028\u4E09\u0029",
+  "\u3223",
+  "\u0028\u56DB\u0029",
+  "\u3224",
+  "\u0028\u4E94\u0029",
+  "\u3225",
+  "\u0028\u516D\u0029",
+  "\u3226",
+  "\u0028\u4E03\u0029",
+  "\u3227",
+  "\u0028\u516B\u0029",
+  "\u3228",
+  "\u0028\u4E5D\u0029",
+  "\u3229",
+  "\u0028\u5341\u0029",
+  "\u322A",
+  "\u0028\u6708\u0029",
+  "\u322B",
+  "\u0028\u706B\u0029",
+  "\u322C",
+  "\u0028\u6C34\u0029",
+  "\u322D",
+  "\u0028\u6728\u0029",
+  "\u322E",
+  "\u0028\u91D1\u0029",
+  "\u322F",
+  "\u0028\u571F\u0029",
+  "\u3230",
+  "\u0028\u65E5\u0029",
+  "\u3231",
+  "\u0028\u682A\u0029",
+  "\u3232",
+  "\u0028\u6709\u0029",
+  "\u3233",
+  "\u0028\u793E\u0029",
+  "\u3234",
+  "\u0028\u540D\u0029",
+  "\u3235",
+  "\u0028\u7279\u0029",
+  "\u3236",
+  "\u0028\u8CA1\u0029",
+  "\u3237",
+  "\u0028\u795D\u0029",
+  "\u3238",
+  "\u0028\u52B4\u0029",
+  "\u3239",
+  "\u0028\u4EE3\u0029",
+  "\u323A",
+  "\u0028\u547C\u0029",
+  "\u323B",
+  "\u0028\u5B66\u0029",
+  "\u323C",
+  "\u0028\u76E3\u0029",
+  "\u323D",
+  "\u0028\u4F01\u0029",
+  "\u323E",
+  "\u0028\u8CC7\u0029",
+  "\u323F",
+  "\u0028\u5354\u0029",
+  "\u3240",
+  "\u0028\u796D\u0029",
+  "\u3241",
+  "\u0028\u4F11\u0029",
+  "\u3242",
+  "\u0028\u81EA\u0029",
+  "\u3243",
+  "\u0028\u81F3\u0029",
+  "\u32C0",
+  "\u0031\u6708",
+  "\u32C1",
+  "\u0032\u6708",
+  "\u32C2",
+  "\u0033\u6708",
+  "\u32C3",
+  "\u0034\u6708",
+  "\u32C4",
+  "\u0035\u6708",
+  "\u32C5",
+  "\u0036\u6708",
+  "\u32C6",
+  "\u0037\u6708",
+  "\u32C7",
+  "\u0038\u6708",
+  "\u32C8",
+  "\u0039\u6708",
+  "\u32C9",
+  "\u0031\u0030\u6708",
+  "\u32CA",
+  "\u0031\u0031\u6708",
+  "\u32CB",
+  "\u0031\u0032\u6708",
+  "\u3358",
+  "\u0030\u70B9",
+  "\u3359",
+  "\u0031\u70B9",
+  "\u335A",
+  "\u0032\u70B9",
+  "\u335B",
+  "\u0033\u70B9",
+  "\u335C",
+  "\u0034\u70B9",
+  "\u335D",
+  "\u0035\u70B9",
+  "\u335E",
+  "\u0036\u70B9",
+  "\u335F",
+  "\u0037\u70B9",
+  "\u3360",
+  "\u0038\u70B9",
+  "\u3361",
+  "\u0039\u70B9",
+  "\u3362",
+  "\u0031\u0030\u70B9",
+  "\u3363",
+  "\u0031\u0031\u70B9",
+  "\u3364",
+  "\u0031\u0032\u70B9",
+  "\u3365",
+  "\u0031\u0033\u70B9",
+  "\u3366",
+  "\u0031\u0034\u70B9",
+  "\u3367",
+  "\u0031\u0035\u70B9",
+  "\u3368",
+  "\u0031\u0036\u70B9",
+  "\u3369",
+  "\u0031\u0037\u70B9",
+  "\u336A",
+  "\u0031\u0038\u70B9",
+  "\u336B",
+  "\u0031\u0039\u70B9",
+  "\u336C",
+  "\u0032\u0030\u70B9",
+  "\u336D",
+  "\u0032\u0031\u70B9",
+  "\u336E",
+  "\u0032\u0032\u70B9",
+  "\u336F",
+  "\u0032\u0033\u70B9",
+  "\u3370",
+  "\u0032\u0034\u70B9",
+  "\u33E0",
+  "\u0031\u65E5",
+  "\u33E1",
+  "\u0032\u65E5",
+  "\u33E2",
+  "\u0033\u65E5",
+  "\u33E3",
+  "\u0034\u65E5",
+  "\u33E4",
+  "\u0035\u65E5",
+  "\u33E5",
+  "\u0036\u65E5",
+  "\u33E6",
+  "\u0037\u65E5",
+  "\u33E7",
+  "\u0038\u65E5",
+  "\u33E8",
+  "\u0039\u65E5",
+  "\u33E9",
+  "\u0031\u0030\u65E5",
+  "\u33EA",
+  "\u0031\u0031\u65E5",
+  "\u33EB",
+  "\u0031\u0032\u65E5",
+  "\u33EC",
+  "\u0031\u0033\u65E5",
+  "\u33ED",
+  "\u0031\u0034\u65E5",
+  "\u33EE",
+  "\u0031\u0035\u65E5",
+  "\u33EF",
+  "\u0031\u0036\u65E5",
+  "\u33F0",
+  "\u0031\u0037\u65E5",
+  "\u33F1",
+  "\u0031\u0038\u65E5",
+  "\u33F2",
+  "\u0031\u0039\u65E5",
+  "\u33F3",
+  "\u0032\u0030\u65E5",
+  "\u33F4",
+  "\u0032\u0031\u65E5",
+  "\u33F5",
+  "\u0032\u0032\u65E5",
+  "\u33F6",
+  "\u0032\u0033\u65E5",
+  "\u33F7",
+  "\u0032\u0034\u65E5",
+  "\u33F8",
+  "\u0032\u0035\u65E5",
+  "\u33F9",
+  "\u0032\u0036\u65E5",
+  "\u33FA",
+  "\u0032\u0037\u65E5",
+  "\u33FB",
+  "\u0032\u0038\u65E5",
+  "\u33FC",
+  "\u0032\u0039\u65E5",
+  "\u33FD",
+  "\u0033\u0030\u65E5",
+  "\u33FE",
+  "\u0033\u0031\u65E5",
+  "\uFB00",
+  "\u0066\u0066",
+  "\uFB01",
+  "\u0066\u0069",
+  "\uFB02",
+  "\u0066\u006C",
+  "\uFB03",
+  "\u0066\u0066\u0069",
+  "\uFB04",
+  "\u0066\u0066\u006C",
+  "\uFB05",
+  "\u017F\u0074",
+  "\uFB06",
+  "\u0073\u0074",
+  "\uFB13",
+  "\u0574\u0576",
+  "\uFB14",
+  "\u0574\u0565",
+  "\uFB15",
+  "\u0574\u056B",
+  "\uFB16",
+  "\u057E\u0576",
+  "\uFB17",
+  "\u0574\u056D",
+  "\uFB4F",
+  "\u05D0\u05DC",
+  "\uFB50",
+  "\u0671",
+  "\uFB51",
+  "\u0671",
+  "\uFB52",
+  "\u067B",
+  "\uFB53",
+  "\u067B",
+  "\uFB54",
+  "\u067B",
+  "\uFB55",
+  "\u067B",
+  "\uFB56",
+  "\u067E",
+  "\uFB57",
+  "\u067E",
+  "\uFB58",
+  "\u067E",
+  "\uFB59",
+  "\u067E",
+  "\uFB5A",
+  "\u0680",
+  "\uFB5B",
+  "\u0680",
+  "\uFB5C",
+  "\u0680",
+  "\uFB5D",
+  "\u0680",
+  "\uFB5E",
+  "\u067A",
+  "\uFB5F",
+  "\u067A",
+  "\uFB60",
+  "\u067A",
+  "\uFB61",
+  "\u067A",
+  "\uFB62",
+  "\u067F",
+  "\uFB63",
+  "\u067F",
+  "\uFB64",
+  "\u067F",
+  "\uFB65",
+  "\u067F",
+  "\uFB66",
+  "\u0679",
+  "\uFB67",
+  "\u0679",
+  "\uFB68",
+  "\u0679",
+  "\uFB69",
+  "\u0679",
+  "\uFB6A",
+  "\u06A4",
+  "\uFB6B",
+  "\u06A4",
+  "\uFB6C",
+  "\u06A4",
+  "\uFB6D",
+  "\u06A4",
+  "\uFB6E",
+  "\u06A6",
+  "\uFB6F",
+  "\u06A6",
+  "\uFB70",
+  "\u06A6",
+  "\uFB71",
+  "\u06A6",
+  "\uFB72",
+  "\u0684",
+  "\uFB73",
+  "\u0684",
+  "\uFB74",
+  "\u0684",
+  "\uFB75",
+  "\u0684",
+  "\uFB76",
+  "\u0683",
+  "\uFB77",
+  "\u0683",
+  "\uFB78",
+  "\u0683",
+  "\uFB79",
+  "\u0683",
+  "\uFB7A",
+  "\u0686",
+  "\uFB7B",
+  "\u0686",
+  "\uFB7C",
+  "\u0686",
+  "\uFB7D",
+  "\u0686",
+  "\uFB7E",
+  "\u0687",
+  "\uFB7F",
+  "\u0687",
+  "\uFB80",
+  "\u0687",
+  "\uFB81",
+  "\u0687",
+  "\uFB82",
+  "\u068D",
+  "\uFB83",
+  "\u068D",
+  "\uFB84",
+  "\u068C",
+  "\uFB85",
+  "\u068C",
+  "\uFB86",
+  "\u068E",
+  "\uFB87",
+  "\u068E",
+  "\uFB88",
+  "\u0688",
+  "\uFB89",
+  "\u0688",
+  "\uFB8A",
+  "\u0698",
+  "\uFB8B",
+  "\u0698",
+  "\uFB8C",
+  "\u0691",
+  "\uFB8D",
+  "\u0691",
+  "\uFB8E",
+  "\u06A9",
+  "\uFB8F",
+  "\u06A9",
+  "\uFB90",
+  "\u06A9",
+  "\uFB91",
+  "\u06A9",
+  "\uFB92",
+  "\u06AF",
+  "\uFB93",
+  "\u06AF",
+  "\uFB94",
+  "\u06AF",
+  "\uFB95",
+  "\u06AF",
+  "\uFB96",
+  "\u06B3",
+  "\uFB97",
+  "\u06B3",
+  "\uFB98",
+  "\u06B3",
+  "\uFB99",
+  "\u06B3",
+  "\uFB9A",
+  "\u06B1",
+  "\uFB9B",
+  "\u06B1",
+  "\uFB9C",
+  "\u06B1",
+  "\uFB9D",
+  "\u06B1",
+  "\uFB9E",
+  "\u06BA",
+  "\uFB9F",
+  "\u06BA",
+  "\uFBA0",
+  "\u06BB",
+  "\uFBA1",
+  "\u06BB",
+  "\uFBA2",
+  "\u06BB",
+  "\uFBA3",
+  "\u06BB",
+  "\uFBA4",
+  "\u06C0",
+  "\uFBA5",
+  "\u06C0",
+  "\uFBA6",
+  "\u06C1",
+  "\uFBA7",
+  "\u06C1",
+  "\uFBA8",
+  "\u06C1",
+  "\uFBA9",
+  "\u06C1",
+  "\uFBAA",
+  "\u06BE",
+  "\uFBAB",
+  "\u06BE",
+  "\uFBAC",
+  "\u06BE",
+  "\uFBAD",
+  "\u06BE",
+  "\uFBAE",
+  "\u06D2",
+  "\uFBAF",
+  "\u06D2",
+  "\uFBB0",
+  "\u06D3",
+  "\uFBB1",
+  "\u06D3",
+  "\uFBD3",
+  "\u06AD",
+  "\uFBD4",
+  "\u06AD",
+  "\uFBD5",
+  "\u06AD",
+  "\uFBD6",
+  "\u06AD",
+  "\uFBD7",
+  "\u06C7",
+  "\uFBD8",
+  "\u06C7",
+  "\uFBD9",
+  "\u06C6",
+  "\uFBDA",
+  "\u06C6",
+  "\uFBDB",
+  "\u06C8",
+  "\uFBDC",
+  "\u06C8",
+  "\uFBDD",
+  "\u0677",
+  "\uFBDE",
+  "\u06CB",
+  "\uFBDF",
+  "\u06CB",
+  "\uFBE0",
+  "\u06C5",
+  "\uFBE1",
+  "\u06C5",
+  "\uFBE2",
+  "\u06C9",
+  "\uFBE3",
+  "\u06C9",
+  "\uFBE4",
+  "\u06D0",
+  "\uFBE5",
+  "\u06D0",
+  "\uFBE6",
+  "\u06D0",
+  "\uFBE7",
+  "\u06D0",
+  "\uFBE8",
+  "\u0649",
+  "\uFBE9",
+  "\u0649",
+  "\uFBEA",
+  "\u0626\u0627",
+  "\uFBEB",
+  "\u0626\u0627",
+  "\uFBEC",
+  "\u0626\u06D5",
+  "\uFBED",
+  "\u0626\u06D5",
+  "\uFBEE",
+  "\u0626\u0648",
+  "\uFBEF",
+  "\u0626\u0648",
+  "\uFBF0",
+  "\u0626\u06C7",
+  "\uFBF1",
+  "\u0626\u06C7",
+  "\uFBF2",
+  "\u0626\u06C6",
+  "\uFBF3",
+  "\u0626\u06C6",
+  "\uFBF4",
+  "\u0626\u06C8",
+  "\uFBF5",
+  "\u0626\u06C8",
+  "\uFBF6",
+  "\u0626\u06D0",
+  "\uFBF7",
+  "\u0626\u06D0",
+  "\uFBF8",
+  "\u0626\u06D0",
+  "\uFBF9",
+  "\u0626\u0649",
+  "\uFBFA",
+  "\u0626\u0649",
+  "\uFBFB",
+  "\u0626\u0649",
+  "\uFBFC",
+  "\u06CC",
+  "\uFBFD",
+  "\u06CC",
+  "\uFBFE",
+  "\u06CC",
+  "\uFBFF",
+  "\u06CC",
+  "\uFC00",
+  "\u0626\u062C",
+  "\uFC01",
+  "\u0626\u062D",
+  "\uFC02",
+  "\u0626\u0645",
+  "\uFC03",
+  "\u0626\u0649",
+  "\uFC04",
+  "\u0626\u064A",
+  "\uFC05",
+  "\u0628\u062C",
+  "\uFC06",
+  "\u0628\u062D",
+  "\uFC07",
+  "\u0628\u062E",
+  "\uFC08",
+  "\u0628\u0645",
+  "\uFC09",
+  "\u0628\u0649",
+  "\uFC0A",
+  "\u0628\u064A",
+  "\uFC0B",
+  "\u062A\u062C",
+  "\uFC0C",
+  "\u062A\u062D",
+  "\uFC0D",
+  "\u062A\u062E",
+  "\uFC0E",
+  "\u062A\u0645",
+  "\uFC0F",
+  "\u062A\u0649",
+  "\uFC10",
+  "\u062A\u064A",
+  "\uFC11",
+  "\u062B\u062C",
+  "\uFC12",
+  "\u062B\u0645",
+  "\uFC13",
+  "\u062B\u0649",
+  "\uFC14",
+  "\u062B\u064A",
+  "\uFC15",
+  "\u062C\u062D",
+  "\uFC16",
+  "\u062C\u0645",
+  "\uFC17",
+  "\u062D\u062C",
+  "\uFC18",
+  "\u062D\u0645",
+  "\uFC19",
+  "\u062E\u062C",
+  "\uFC1A",
+  "\u062E\u062D",
+  "\uFC1B",
+  "\u062E\u0645",
+  "\uFC1C",
+  "\u0633\u062C",
+  "\uFC1D",
+  "\u0633\u062D",
+  "\uFC1E",
+  "\u0633\u062E",
+  "\uFC1F",
+  "\u0633\u0645",
+  "\uFC20",
+  "\u0635\u062D",
+  "\uFC21",
+  "\u0635\u0645",
+  "\uFC22",
+  "\u0636\u062C",
+  "\uFC23",
+  "\u0636\u062D",
+  "\uFC24",
+  "\u0636\u062E",
+  "\uFC25",
+  "\u0636\u0645",
+  "\uFC26",
+  "\u0637\u062D",
+  "\uFC27",
+  "\u0637\u0645",
+  "\uFC28",
+  "\u0638\u0645",
+  "\uFC29",
+  "\u0639\u062C",
+  "\uFC2A",
+  "\u0639\u0645",
+  "\uFC2B",
+  "\u063A\u062C",
+  "\uFC2C",
+  "\u063A\u0645",
+  "\uFC2D",
+  "\u0641\u062C",
+  "\uFC2E",
+  "\u0641\u062D",
+  "\uFC2F",
+  "\u0641\u062E",
+  "\uFC30",
+  "\u0641\u0645",
+  "\uFC31",
+  "\u0641\u0649",
+  "\uFC32",
+  "\u0641\u064A",
+  "\uFC33",
+  "\u0642\u062D",
+  "\uFC34",
+  "\u0642\u0645",
+  "\uFC35",
+  "\u0642\u0649",
+  "\uFC36",
+  "\u0642\u064A",
+  "\uFC37",
+  "\u0643\u0627",
+  "\uFC38",
+  "\u0643\u062C",
+  "\uFC39",
+  "\u0643\u062D",
+  "\uFC3A",
+  "\u0643\u062E",
+  "\uFC3B",
+  "\u0643\u0644",
+  "\uFC3C",
+  "\u0643\u0645",
+  "\uFC3D",
+  "\u0643\u0649",
+  "\uFC3E",
+  "\u0643\u064A",
+  "\uFC3F",
+  "\u0644\u062C",
+  "\uFC40",
+  "\u0644\u062D",
+  "\uFC41",
+  "\u0644\u062E",
+  "\uFC42",
+  "\u0644\u0645",
+  "\uFC43",
+  "\u0644\u0649",
+  "\uFC44",
+  "\u0644\u064A",
+  "\uFC45",
+  "\u0645\u062C",
+  "\uFC46",
+  "\u0645\u062D",
+  "\uFC47",
+  "\u0645\u062E",
+  "\uFC48",
+  "\u0645\u0645",
+  "\uFC49",
+  "\u0645\u0649",
+  "\uFC4A",
+  "\u0645\u064A",
+  "\uFC4B",
+  "\u0646\u062C",
+  "\uFC4C",
+  "\u0646\u062D",
+  "\uFC4D",
+  "\u0646\u062E",
+  "\uFC4E",
+  "\u0646\u0645",
+  "\uFC4F",
+  "\u0646\u0649",
+  "\uFC50",
+  "\u0646\u064A",
+  "\uFC51",
+  "\u0647\u062C",
+  "\uFC52",
+  "\u0647\u0645",
+  "\uFC53",
+  "\u0647\u0649",
+  "\uFC54",
+  "\u0647\u064A",
+  "\uFC55",
+  "\u064A\u062C",
+  "\uFC56",
+  "\u064A\u062D",
+  "\uFC57",
+  "\u064A\u062E",
+  "\uFC58",
+  "\u064A\u0645",
+  "\uFC59",
+  "\u064A\u0649",
+  "\uFC5A",
+  "\u064A\u064A",
+  "\uFC5B",
+  "\u0630\u0670",
+  "\uFC5C",
+  "\u0631\u0670",
+  "\uFC5D",
+  "\u0649\u0670",
+  "\uFC5E",
+  "\u0020\u064C\u0651",
+  "\uFC5F",
+  "\u0020\u064D\u0651",
+  "\uFC60",
+  "\u0020\u064E\u0651",
+  "\uFC61",
+  "\u0020\u064F\u0651",
+  "\uFC62",
+  "\u0020\u0650\u0651",
+  "\uFC63",
+  "\u0020\u0651\u0670",
+  "\uFC64",
+  "\u0626\u0631",
+  "\uFC65",
+  "\u0626\u0632",
+  "\uFC66",
+  "\u0626\u0645",
+  "\uFC67",
+  "\u0626\u0646",
+  "\uFC68",
+  "\u0626\u0649",
+  "\uFC69",
+  "\u0626\u064A",
+  "\uFC6A",
+  "\u0628\u0631",
+  "\uFC6B",
+  "\u0628\u0632",
+  "\uFC6C",
+  "\u0628\u0645",
+  "\uFC6D",
+  "\u0628\u0646",
+  "\uFC6E",
+  "\u0628\u0649",
+  "\uFC6F",
+  "\u0628\u064A",
+  "\uFC70",
+  "\u062A\u0631",
+  "\uFC71",
+  "\u062A\u0632",
+  "\uFC72",
+  "\u062A\u0645",
+  "\uFC73",
+  "\u062A\u0646",
+  "\uFC74",
+  "\u062A\u0649",
+  "\uFC75",
+  "\u062A\u064A",
+  "\uFC76",
+  "\u062B\u0631",
+  "\uFC77",
+  "\u062B\u0632",
+  "\uFC78",
+  "\u062B\u0645",
+  "\uFC79",
+  "\u062B\u0646",
+  "\uFC7A",
+  "\u062B\u0649",
+  "\uFC7B",
+  "\u062B\u064A",
+  "\uFC7C",
+  "\u0641\u0649",
+  "\uFC7D",
+  "\u0641\u064A",
+  "\uFC7E",
+  "\u0642\u0649",
+  "\uFC7F",
+  "\u0642\u064A",
+  "\uFC80",
+  "\u0643\u0627",
+  "\uFC81",
+  "\u0643\u0644",
+  "\uFC82",
+  "\u0643\u0645",
+  "\uFC83",
+  "\u0643\u0649",
+  "\uFC84",
+  "\u0643\u064A",
+  "\uFC85",
+  "\u0644\u0645",
+  "\uFC86",
+  "\u0644\u0649",
+  "\uFC87",
+  "\u0644\u064A",
+  "\uFC88",
+  "\u0645\u0627",
+  "\uFC89",
+  "\u0645\u0645",
+  "\uFC8A",
+  "\u0646\u0631",
+  "\uFC8B",
+  "\u0646\u0632",
+  "\uFC8C",
+  "\u0646\u0645",
+  "\uFC8D",
+  "\u0646\u0646",
+  "\uFC8E",
+  "\u0646\u0649",
+  "\uFC8F",
+  "\u0646\u064A",
+  "\uFC90",
+  "\u0649\u0670",
+  "\uFC91",
+  "\u064A\u0631",
+  "\uFC92",
+  "\u064A\u0632",
+  "\uFC93",
+  "\u064A\u0645",
+  "\uFC94",
+  "\u064A\u0646",
+  "\uFC95",
+  "\u064A\u0649",
+  "\uFC96",
+  "\u064A\u064A",
+  "\uFC97",
+  "\u0626\u062C",
+  "\uFC98",
+  "\u0626\u062D",
+  "\uFC99",
+  "\u0626\u062E",
+  "\uFC9A",
+  "\u0626\u0645",
+  "\uFC9B",
+  "\u0626\u0647",
+  "\uFC9C",
+  "\u0628\u062C",
+  "\uFC9D",
+  "\u0628\u062D",
+  "\uFC9E",
+  "\u0628\u062E",
+  "\uFC9F",
+  "\u0628\u0645",
+  "\uFCA0",
+  "\u0628\u0647",
+  "\uFCA1",
+  "\u062A\u062C",
+  "\uFCA2",
+  "\u062A\u062D",
+  "\uFCA3",
+  "\u062A\u062E",
+  "\uFCA4",
+  "\u062A\u0645",
+  "\uFCA5",
+  "\u062A\u0647",
+  "\uFCA6",
+  "\u062B\u0645",
+  "\uFCA7",
+  "\u062C\u062D",
+  "\uFCA8",
+  "\u062C\u0645",
+  "\uFCA9",
+  "\u062D\u062C",
+  "\uFCAA",
+  "\u062D\u0645",
+  "\uFCAB",
+  "\u062E\u062C",
+  "\uFCAC",
+  "\u062E\u0645",
+  "\uFCAD",
+  "\u0633\u062C",
+  "\uFCAE",
+  "\u0633\u062D",
+  "\uFCAF",
+  "\u0633\u062E",
+  "\uFCB0",
+  "\u0633\u0645",
+  "\uFCB1",
+  "\u0635\u062D",
+  "\uFCB2",
+  "\u0635\u062E",
+  "\uFCB3",
+  "\u0635\u0645",
+  "\uFCB4",
+  "\u0636\u062C",
+  "\uFCB5",
+  "\u0636\u062D",
+  "\uFCB6",
+  "\u0636\u062E",
+  "\uFCB7",
+  "\u0636\u0645",
+  "\uFCB8",
+  "\u0637\u062D",
+  "\uFCB9",
+  "\u0638\u0645",
+  "\uFCBA",
+  "\u0639\u062C",
+  "\uFCBB",
+  "\u0639\u0645",
+  "\uFCBC",
+  "\u063A\u062C",
+  "\uFCBD",
+  "\u063A\u0645",
+  "\uFCBE",
+  "\u0641\u062C",
+  "\uFCBF",
+  "\u0641\u062D",
+  "\uFCC0",
+  "\u0641\u062E",
+  "\uFCC1",
+  "\u0641\u0645",
+  "\uFCC2",
+  "\u0642\u062D",
+  "\uFCC3",
+  "\u0642\u0645",
+  "\uFCC4",
+  "\u0643\u062C",
+  "\uFCC5",
+  "\u0643\u062D",
+  "\uFCC6",
+  "\u0643\u062E",
+  "\uFCC7",
+  "\u0643\u0644",
+  "\uFCC8",
+  "\u0643\u0645",
+  "\uFCC9",
+  "\u0644\u062C",
+  "\uFCCA",
+  "\u0644\u062D",
+  "\uFCCB",
+  "\u0644\u062E",
+  "\uFCCC",
+  "\u0644\u0645",
+  "\uFCCD",
+  "\u0644\u0647",
+  "\uFCCE",
+  "\u0645\u062C",
+  "\uFCCF",
+  "\u0645\u062D",
+  "\uFCD0",
+  "\u0645\u062E",
+  "\uFCD1",
+  "\u0645\u0645",
+  "\uFCD2",
+  "\u0646\u062C",
+  "\uFCD3",
+  "\u0646\u062D",
+  "\uFCD4",
+  "\u0646\u062E",
+  "\uFCD5",
+  "\u0646\u0645",
+  "\uFCD6",
+  "\u0646\u0647",
+  "\uFCD7",
+  "\u0647\u062C",
+  "\uFCD8",
+  "\u0647\u0645",
+  "\uFCD9",
+  "\u0647\u0670",
+  "\uFCDA",
+  "\u064A\u062C",
+  "\uFCDB",
+  "\u064A\u062D",
+  "\uFCDC",
+  "\u064A\u062E",
+  "\uFCDD",
+  "\u064A\u0645",
+  "\uFCDE",
+  "\u064A\u0647",
+  "\uFCDF",
+  "\u0626\u0645",
+  "\uFCE0",
+  "\u0626\u0647",
+  "\uFCE1",
+  "\u0628\u0645",
+  "\uFCE2",
+  "\u0628\u0647",
+  "\uFCE3",
+  "\u062A\u0645",
+  "\uFCE4",
+  "\u062A\u0647",
+  "\uFCE5",
+  "\u062B\u0645",
+  "\uFCE6",
+  "\u062B\u0647",
+  "\uFCE7",
+  "\u0633\u0645",
+  "\uFCE8",
+  "\u0633\u0647",
+  "\uFCE9",
+  "\u0634\u0645",
+  "\uFCEA",
+  "\u0634\u0647",
+  "\uFCEB",
+  "\u0643\u0644",
+  "\uFCEC",
+  "\u0643\u0645",
+  "\uFCED",
+  "\u0644\u0645",
+  "\uFCEE",
+  "\u0646\u0645",
+  "\uFCEF",
+  "\u0646\u0647",
+  "\uFCF0",
+  "\u064A\u0645",
+  "\uFCF1",
+  "\u064A\u0647",
+  "\uFCF2",
+  "\u0640\u064E\u0651",
+  "\uFCF3",
+  "\u0640\u064F\u0651",
+  "\uFCF4",
+  "\u0640\u0650\u0651",
+  "\uFCF5",
+  "\u0637\u0649",
+  "\uFCF6",
+  "\u0637\u064A",
+  "\uFCF7",
+  "\u0639\u0649",
+  "\uFCF8",
+  "\u0639\u064A",
+  "\uFCF9",
+  "\u063A\u0649",
+  "\uFCFA",
+  "\u063A\u064A",
+  "\uFCFB",
+  "\u0633\u0649",
+  "\uFCFC",
+  "\u0633\u064A",
+  "\uFCFD",
+  "\u0634\u0649",
+  "\uFCFE",
+  "\u0634\u064A",
+  "\uFCFF",
+  "\u062D\u0649",
+  "\uFD00",
+  "\u062D\u064A",
+  "\uFD01",
+  "\u062C\u0649",
+  "\uFD02",
+  "\u062C\u064A",
+  "\uFD03",
+  "\u062E\u0649",
+  "\uFD04",
+  "\u062E\u064A",
+  "\uFD05",
+  "\u0635\u0649",
+  "\uFD06",
+  "\u0635\u064A",
+  "\uFD07",
+  "\u0636\u0649",
+  "\uFD08",
+  "\u0636\u064A",
+  "\uFD09",
+  "\u0634\u062C",
+  "\uFD0A",
+  "\u0634\u062D",
+  "\uFD0B",
+  "\u0634\u062E",
+  "\uFD0C",
+  "\u0634\u0645",
+  "\uFD0D",
+  "\u0634\u0631",
+  "\uFD0E",
+  "\u0633\u0631",
+  "\uFD0F",
+  "\u0635\u0631",
+  "\uFD10",
+  "\u0636\u0631",
+  "\uFD11",
+  "\u0637\u0649",
+  "\uFD12",
+  "\u0637\u064A",
+  "\uFD13",
+  "\u0639\u0649",
+  "\uFD14",
+  "\u0639\u064A",
+  "\uFD15",
+  "\u063A\u0649",
+  "\uFD16",
+  "\u063A\u064A",
+  "\uFD17",
+  "\u0633\u0649",
+  "\uFD18",
+  "\u0633\u064A",
+  "\uFD19",
+  "\u0634\u0649",
+  "\uFD1A",
+  "\u0634\u064A",
+  "\uFD1B",
+  "\u062D\u0649",
+  "\uFD1C",
+  "\u062D\u064A",
+  "\uFD1D",
+  "\u062C\u0649",
+  "\uFD1E",
+  "\u062C\u064A",
+  "\uFD1F",
+  "\u062E\u0649",
+  "\uFD20",
+  "\u062E\u064A",
+  "\uFD21",
+  "\u0635\u0649",
+  "\uFD22",
+  "\u0635\u064A",
+  "\uFD23",
+  "\u0636\u0649",
+  "\uFD24",
+  "\u0636\u064A",
+  "\uFD25",
+  "\u0634\u062C",
+  "\uFD26",
+  "\u0634\u062D",
+  "\uFD27",
+  "\u0634\u062E",
+  "\uFD28",
+  "\u0634\u0645",
+  "\uFD29",
+  "\u0634\u0631",
+  "\uFD2A",
+  "\u0633\u0631",
+  "\uFD2B",
+  "\u0635\u0631",
+  "\uFD2C",
+  "\u0636\u0631",
+  "\uFD2D",
+  "\u0634\u062C",
+  "\uFD2E",
+  "\u0634\u062D",
+  "\uFD2F",
+  "\u0634\u062E",
+  "\uFD30",
+  "\u0634\u0645",
+  "\uFD31",
+  "\u0633\u0647",
+  "\uFD32",
+  "\u0634\u0647",
+  "\uFD33",
+  "\u0637\u0645",
+  "\uFD34",
+  "\u0633\u062C",
+  "\uFD35",
+  "\u0633\u062D",
+  "\uFD36",
+  "\u0633\u062E",
+  "\uFD37",
+  "\u0634\u062C",
+  "\uFD38",
+  "\u0634\u062D",
+  "\uFD39",
+  "\u0634\u062E",
+  "\uFD3A",
+  "\u0637\u0645",
+  "\uFD3B",
+  "\u0638\u0645",
+  "\uFD3C",
+  "\u0627\u064B",
+  "\uFD3D",
+  "\u0627\u064B",
+  "\uFD50",
+  "\u062A\u062C\u0645",
+  "\uFD51",
+  "\u062A\u062D\u062C",
+  "\uFD52",
+  "\u062A\u062D\u062C",
+  "\uFD53",
+  "\u062A\u062D\u0645",
+  "\uFD54",
+  "\u062A\u062E\u0645",
+  "\uFD55",
+  "\u062A\u0645\u062C",
+  "\uFD56",
+  "\u062A\u0645\u062D",
+  "\uFD57",
+  "\u062A\u0645\u062E",
+  "\uFD58",
+  "\u062C\u0645\u062D",
+  "\uFD59",
+  "\u062C\u0645\u062D",
+  "\uFD5A",
+  "\u062D\u0645\u064A",
+  "\uFD5B",
+  "\u062D\u0645\u0649",
+  "\uFD5C",
+  "\u0633\u062D\u062C",
+  "\uFD5D",
+  "\u0633\u062C\u062D",
+  "\uFD5E",
+  "\u0633\u062C\u0649",
+  "\uFD5F",
+  "\u0633\u0645\u062D",
+  "\uFD60",
+  "\u0633\u0645\u062D",
+  "\uFD61",
+  "\u0633\u0645\u062C",
+  "\uFD62",
+  "\u0633\u0645\u0645",
+  "\uFD63",
+  "\u0633\u0645\u0645",
+  "\uFD64",
+  "\u0635\u062D\u062D",
+  "\uFD65",
+  "\u0635\u062D\u062D",
+  "\uFD66",
+  "\u0635\u0645\u0645",
+  "\uFD67",
+  "\u0634\u062D\u0645",
+  "\uFD68",
+  "\u0634\u062D\u0645",
+  "\uFD69",
+  "\u0634\u062C\u064A",
+  "\uFD6A",
+  "\u0634\u0645\u062E",
+  "\uFD6B",
+  "\u0634\u0645\u062E",
+  "\uFD6C",
+  "\u0634\u0645\u0645",
+  "\uFD6D",
+  "\u0634\u0645\u0645",
+  "\uFD6E",
+  "\u0636\u062D\u0649",
+  "\uFD6F",
+  "\u0636\u062E\u0645",
+  "\uFD70",
+  "\u0636\u062E\u0645",
+  "\uFD71",
+  "\u0637\u0645\u062D",
+  "\uFD72",
+  "\u0637\u0645\u062D",
+  "\uFD73",
+  "\u0637\u0645\u0645",
+  "\uFD74",
+  "\u0637\u0645\u064A",
+  "\uFD75",
+  "\u0639\u062C\u0645",
+  "\uFD76",
+  "\u0639\u0645\u0645",
+  "\uFD77",
+  "\u0639\u0645\u0645",
+  "\uFD78",
+  "\u0639\u0645\u0649",
+  "\uFD79",
+  "\u063A\u0645\u0645",
+  "\uFD7A",
+  "\u063A\u0645\u064A",
+  "\uFD7B",
+  "\u063A\u0645\u0649",
+  "\uFD7C",
+  "\u0641\u062E\u0645",
+  "\uFD7D",
+  "\u0641\u062E\u0645",
+  "\uFD7E",
+  "\u0642\u0645\u062D",
+  "\uFD7F",
+  "\u0642\u0645\u0645",
+  "\uFD80",
+  "\u0644\u062D\u0645",
+  "\uFD81",
+  "\u0644\u062D\u064A",
+  "\uFD82",
+  "\u0644\u062D\u0649",
+  "\uFD83",
+  "\u0644\u062C\u062C",
+  "\uFD84",
+  "\u0644\u062C\u062C",
+  "\uFD85",
+  "\u0644\u062E\u0645",
+  "\uFD86",
+  "\u0644\u062E\u0645",
+  "\uFD87",
+  "\u0644\u0645\u062D",
+  "\uFD88",
+  "\u0644\u0645\u062D",
+  "\uFD89",
+  "\u0645\u062D\u062C",
+  "\uFD8A",
+  "\u0645\u062D\u0645",
+  "\uFD8B",
+  "\u0645\u062D\u064A",
+  "\uFD8C",
+  "\u0645\u062C\u062D",
+  "\uFD8D",
+  "\u0645\u062C\u0645",
+  "\uFD8E",
+  "\u0645\u062E\u062C",
+  "\uFD8F",
+  "\u0645\u062E\u0645",
+  "\uFD92",
+  "\u0645\u062C\u062E",
+  "\uFD93",
+  "\u0647\u0645\u062C",
+  "\uFD94",
+  "\u0647\u0645\u0645",
+  "\uFD95",
+  "\u0646\u062D\u0645",
+  "\uFD96",
+  "\u0646\u062D\u0649",
+  "\uFD97",
+  "\u0646\u062C\u0645",
+  "\uFD98",
+  "\u0646\u062C\u0645",
+  "\uFD99",
+  "\u0646\u062C\u0649",
+  "\uFD9A",
+  "\u0646\u0645\u064A",
+  "\uFD9B",
+  "\u0646\u0645\u0649",
+  "\uFD9C",
+  "\u064A\u0645\u0645",
+  "\uFD9D",
+  "\u064A\u0645\u0645",
+  "\uFD9E",
+  "\u0628\u062E\u064A",
+  "\uFD9F",
+  "\u062A\u062C\u064A",
+  "\uFDA0",
+  "\u062A\u062C\u0649",
+  "\uFDA1",
+  "\u062A\u062E\u064A",
+  "\uFDA2",
+  "\u062A\u062E\u0649",
+  "\uFDA3",
+  "\u062A\u0645\u064A",
+  "\uFDA4",
+  "\u062A\u0645\u0649",
+  "\uFDA5",
+  "\u062C\u0645\u064A",
+  "\uFDA6",
+  "\u062C\u062D\u0649",
+  "\uFDA7",
+  "\u062C\u0645\u0649",
+  "\uFDA8",
+  "\u0633\u062E\u0649",
+  "\uFDA9",
+  "\u0635\u062D\u064A",
+  "\uFDAA",
+  "\u0634\u062D\u064A",
+  "\uFDAB",
+  "\u0636\u062D\u064A",
+  "\uFDAC",
+  "\u0644\u062C\u064A",
+  "\uFDAD",
+  "\u0644\u0645\u064A",
+  "\uFDAE",
+  "\u064A\u062D\u064A",
+  "\uFDAF",
+  "\u064A\u062C\u064A",
+  "\uFDB0",
+  "\u064A\u0645\u064A",
+  "\uFDB1",
+  "\u0645\u0645\u064A",
+  "\uFDB2",
+  "\u0642\u0645\u064A",
+  "\uFDB3",
+  "\u0646\u062D\u064A",
+  "\uFDB4",
+  "\u0642\u0645\u062D",
+  "\uFDB5",
+  "\u0644\u062D\u0645",
+  "\uFDB6",
+  "\u0639\u0645\u064A",
+  "\uFDB7",
+  "\u0643\u0645\u064A",
+  "\uFDB8",
+  "\u0646\u062C\u062D",
+  "\uFDB9",
+  "\u0645\u062E\u064A",
+  "\uFDBA",
+  "\u0644\u062C\u0645",
+  "\uFDBB",
+  "\u0643\u0645\u0645",
+  "\uFDBC",
+  "\u0644\u062C\u0645",
+  "\uFDBD",
+  "\u0646\u062C\u062D",
+  "\uFDBE",
+  "\u062C\u062D\u064A",
+  "\uFDBF",
+  "\u062D\u062C\u064A",
+  "\uFDC0",
+  "\u0645\u062C\u064A",
+  "\uFDC1",
+  "\u0641\u0645\u064A",
+  "\uFDC2",
+  "\u0628\u062D\u064A",
+  "\uFDC3",
+  "\u0643\u0645\u0645",
+  "\uFDC4",
+  "\u0639\u062C\u0645",
+  "\uFDC5",
+  "\u0635\u0645\u0645",
+  "\uFDC6",
+  "\u0633\u062E\u064A",
+  "\uFDC7",
+  "\u0646\u062C\u064A",
+  "\uFE49",
+  "\u203E",
+  "\uFE4A",
+  "\u203E",
+  "\uFE4B",
+  "\u203E",
+  "\uFE4C",
+  "\u203E",
+  "\uFE4D",
+  "\u005F",
+  "\uFE4E",
+  "\u005F",
+  "\uFE4F",
+  "\u005F",
+  "\uFE80",
+  "\u0621",
+  "\uFE81",
+  "\u0622",
+  "\uFE82",
+  "\u0622",
+  "\uFE83",
+  "\u0623",
+  "\uFE84",
+  "\u0623",
+  "\uFE85",
+  "\u0624",
+  "\uFE86",
+  "\u0624",
+  "\uFE87",
+  "\u0625",
+  "\uFE88",
+  "\u0625",
+  "\uFE89",
+  "\u0626",
+  "\uFE8A",
+  "\u0626",
+  "\uFE8B",
+  "\u0626",
+  "\uFE8C",
+  "\u0626",
+  "\uFE8D",
+  "\u0627",
+  "\uFE8E",
+  "\u0627",
+  "\uFE8F",
+  "\u0628",
+  "\uFE90",
+  "\u0628",
+  "\uFE91",
+  "\u0628",
+  "\uFE92",
+  "\u0628",
+  "\uFE93",
+  "\u0629",
+  "\uFE94",
+  "\u0629",
+  "\uFE95",
+  "\u062A",
+  "\uFE96",
+  "\u062A",
+  "\uFE97",
+  "\u062A",
+  "\uFE98",
+  "\u062A",
+  "\uFE99",
+  "\u062B",
+  "\uFE9A",
+  "\u062B",
+  "\uFE9B",
+  "\u062B",
+  "\uFE9C",
+  "\u062B",
+  "\uFE9D",
+  "\u062C",
+  "\uFE9E",
+  "\u062C",
+  "\uFE9F",
+  "\u062C",
+  "\uFEA0",
+  "\u062C",
+  "\uFEA1",
+  "\u062D",
+  "\uFEA2",
+  "\u062D",
+  "\uFEA3",
+  "\u062D",
+  "\uFEA4",
+  "\u062D",
+  "\uFEA5",
+  "\u062E",
+  "\uFEA6",
+  "\u062E",
+  "\uFEA7",
+  "\u062E",
+  "\uFEA8",
+  "\u062E",
+  "\uFEA9",
+  "\u062F",
+  "\uFEAA",
+  "\u062F",
+  "\uFEAB",
+  "\u0630",
+  "\uFEAC",
+  "\u0630",
+  "\uFEAD",
+  "\u0631",
+  "\uFEAE",
+  "\u0631",
+  "\uFEAF",
+  "\u0632",
+  "\uFEB0",
+  "\u0632",
+  "\uFEB1",
+  "\u0633",
+  "\uFEB2",
+  "\u0633",
+  "\uFEB3",
+  "\u0633",
+  "\uFEB4",
+  "\u0633",
+  "\uFEB5",
+  "\u0634",
+  "\uFEB6",
+  "\u0634",
+  "\uFEB7",
+  "\u0634",
+  "\uFEB8",
+  "\u0634",
+  "\uFEB9",
+  "\u0635",
+  "\uFEBA",
+  "\u0635",
+  "\uFEBB",
+  "\u0635",
+  "\uFEBC",
+  "\u0635",
+  "\uFEBD",
+  "\u0636",
+  "\uFEBE",
+  "\u0636",
+  "\uFEBF",
+  "\u0636",
+  "\uFEC0",
+  "\u0636",
+  "\uFEC1",
+  "\u0637",
+  "\uFEC2",
+  "\u0637",
+  "\uFEC3",
+  "\u0637",
+  "\uFEC4",
+  "\u0637",
+  "\uFEC5",
+  "\u0638",
+  "\uFEC6",
+  "\u0638",
+  "\uFEC7",
+  "\u0638",
+  "\uFEC8",
+  "\u0638",
+  "\uFEC9",
+  "\u0639",
+  "\uFECA",
+  "\u0639",
+  "\uFECB",
+  "\u0639",
+  "\uFECC",
+  "\u0639",
+  "\uFECD",
+  "\u063A",
+  "\uFECE",
+  "\u063A",
+  "\uFECF",
+  "\u063A",
+  "\uFED0",
+  "\u063A",
+  "\uFED1",
+  "\u0641",
+  "\uFED2",
+  "\u0641",
+  "\uFED3",
+  "\u0641",
+  "\uFED4",
+  "\u0641",
+  "\uFED5",
+  "\u0642",
+  "\uFED6",
+  "\u0642",
+  "\uFED7",
+  "\u0642",
+  "\uFED8",
+  "\u0642",
+  "\uFED9",
+  "\u0643",
+  "\uFEDA",
+  "\u0643",
+  "\uFEDB",
+  "\u0643",
+  "\uFEDC",
+  "\u0643",
+  "\uFEDD",
+  "\u0644",
+  "\uFEDE",
+  "\u0644",
+  "\uFEDF",
+  "\u0644",
+  "\uFEE0",
+  "\u0644",
+  "\uFEE1",
+  "\u0645",
+  "\uFEE2",
+  "\u0645",
+  "\uFEE3",
+  "\u0645",
+  "\uFEE4",
+  "\u0645",
+  "\uFEE5",
+  "\u0646",
+  "\uFEE6",
+  "\u0646",
+  "\uFEE7",
+  "\u0646",
+  "\uFEE8",
+  "\u0646",
+  "\uFEE9",
+  "\u0647",
+  "\uFEEA",
+  "\u0647",
+  "\uFEEB",
+  "\u0647",
+  "\uFEEC",
+  "\u0647",
+  "\uFEED",
+  "\u0648",
+  "\uFEEE",
+  "\u0648",
+  "\uFEEF",
+  "\u0649",
+  "\uFEF0",
+  "\u0649",
+  "\uFEF1",
+  "\u064A",
+  "\uFEF2",
+  "\u064A",
+  "\uFEF3",
+  "\u064A",
+  "\uFEF4",
+  "\u064A",
+  "\uFEF5",
+  "\u0644\u0622",
+  "\uFEF6",
+  "\u0644\u0622",
+  "\uFEF7",
+  "\u0644\u0623",
+  "\uFEF8",
+  "\u0644\u0623",
+  "\uFEF9",
+  "\u0644\u0625",
+  "\uFEFA",
+  "\u0644\u0625",
+  "\uFEFB",
+  "\u0644\u0627",
+  "\uFEFC",
+  "\u0644\u0627"
+ ];
+});
+function reverseIfRtl(chars) {
+ const charsLength = chars.length;
+ if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
+  return chars;
+ }
+ const buf = [];
+ for (let ii = charsLength - 1; ii >= 0; ii--) {
+  buf.push(chars[ii]);
+ }
+ return buf.join("");
+}
+
+
+/***/ }),
+/* 41 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getStandardFontName = getStandardFontName;
+exports.getSymbolsFonts = exports.getSupplementalGlyphMapForCalibri = 
exports.getSupplementalGlyphMapForArialBlack = exports.getStdFontMap = exports.getSerifFonts = 
exports.getNonStdFontMap = exports.getGlyphMapForStandardFonts = exports.getFontNameToFileMap = void 0;
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _fonts_utils = __w_pdfjs_require__(38);
+
+const getStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t["Times-Roman"] = "Times-Roman";
+  t.Helvetica = "Helvetica";
+  t.Courier = "Courier";
+  t.Symbol = "Symbol";
+  t["Times-Bold"] = "Times-Bold";
+  t["Helvetica-Bold"] = "Helvetica-Bold";
+  t["Courier-Bold"] = "Courier-Bold";
+  t.ZapfDingbats = "ZapfDingbats";
+  t["Times-Italic"] = "Times-Italic";
+  t["Helvetica-Oblique"] = "Helvetica-Oblique";
+  t["Courier-Oblique"] = "Courier-Oblique";
+  t["Times-BoldItalic"] = "Times-BoldItalic";
+  t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique";
+  t["Courier-BoldOblique"] = "Courier-BoldOblique";
+  t.ArialNarrow = "Helvetica";
+  t["ArialNarrow-Bold"] = "Helvetica-Bold";
+  t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ArialNarrow-Italic"] = "Helvetica-Oblique";
+  t.ArialBlack = "Helvetica";
+  t["ArialBlack-Bold"] = "Helvetica-Bold";
+  t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ArialBlack-Italic"] = "Helvetica-Oblique";
+  t["Arial-Black"] = "Helvetica";
+  t["Arial-Black-Bold"] = "Helvetica-Bold";
+  t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Arial-Black-Italic"] = "Helvetica-Oblique";
+  t.Arial = "Helvetica";
+  t["Arial-Bold"] = "Helvetica-Bold";
+  t["Arial-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Arial-Italic"] = "Helvetica-Oblique";
+  t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique";
+  t["Arial-BoldMT"] = "Helvetica-Bold";
+  t["Arial-ItalicMT"] = "Helvetica-Oblique";
+  t.ArialMT = "Helvetica";
+  t["Courier-BoldItalic"] = "Courier-BoldOblique";
+  t["Courier-Italic"] = "Courier-Oblique";
+  t.CourierNew = "Courier";
+  t["CourierNew-Bold"] = "Courier-Bold";
+  t["CourierNew-BoldItalic"] = "Courier-BoldOblique";
+  t["CourierNew-Italic"] = "Courier-Oblique";
+  t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique";
+  t["CourierNewPS-BoldMT"] = "Courier-Bold";
+  t["CourierNewPS-ItalicMT"] = "Courier-Oblique";
+  t.CourierNewPSMT = "Courier";
+  t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Helvetica-Italic"] = "Helvetica-Oblique";
+  t["Symbol-Bold"] = "Symbol";
+  t["Symbol-BoldItalic"] = "Symbol";
+  t["Symbol-Italic"] = "Symbol";
+  t.TimesNewRoman = "Times-Roman";
+  t["TimesNewRoman-Bold"] = "Times-Bold";
+  t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRoman-Italic"] = "Times-Italic";
+  t.TimesNewRomanPS = "Times-Roman";
+  t["TimesNewRomanPS-Bold"] = "Times-Bold";
+  t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic";
+  t["TimesNewRomanPS-BoldMT"] = "Times-Bold";
+  t["TimesNewRomanPS-Italic"] = "Times-Italic";
+  t["TimesNewRomanPS-ItalicMT"] = "Times-Italic";
+  t.TimesNewRomanPSMT = "Times-Roman";
+  t["TimesNewRomanPSMT-Bold"] = "Times-Bold";
+  t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRomanPSMT-Italic"] = "Times-Italic";
+});
+exports.getStdFontMap = getStdFontMap;
+const getFontNameToFileMap = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t.Courier = "FoxitFixed.pfb";
+  t["Courier-Bold"] = "FoxitFixedBold.pfb";
+  t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb";
+  t["Courier-Oblique"] = "FoxitFixedItalic.pfb";
+  t.Helvetica = "FoxitSans.pfb";
+  t["Helvetica-Bold"] = "FoxitSansBold.pfb";
+  t["Helvetica-BoldOblique"] = "FoxitSansBoldItalic.pfb";
+  t["Helvetica-Oblique"] = "FoxitSansItalic.pfb";
+  t["Times-Roman"] = "FoxitSerif.pfb";
+  t["Times-Bold"] = "FoxitSerifBold.pfb";
+  t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb";
+  t["Times-Italic"] = "FoxitSerifItalic.pfb";
+  t.Symbol = "FoxitSymbol.pfb";
+  t.ZapfDingbats = "FoxitDingbats.pfb";
+  t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf";
+  t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf";
+  t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf";
+  t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf";
+});
+exports.getFontNameToFileMap = getFontNameToFileMap;
+const getNonStdFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t.Calibri = "Helvetica";
+  t["Calibri-Bold"] = "Helvetica-Bold";
+  t["Calibri-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Calibri-Italic"] = "Helvetica-Oblique";
+  t.CenturyGothic = "Helvetica";
+  t["CenturyGothic-Bold"] = "Helvetica-Bold";
+  t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique";
+  t["CenturyGothic-Italic"] = "Helvetica-Oblique";
+  t.ComicSansMS = "Comic Sans MS";
+  t["ComicSansMS-Bold"] = "Comic Sans MS-Bold";
+  t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic";
+  t["ComicSansMS-Italic"] = "Comic Sans MS-Italic";
+  t.LucidaConsole = "Courier";
+  t["LucidaConsole-Bold"] = "Courier-Bold";
+  t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique";
+  t["LucidaConsole-Italic"] = "Courier-Oblique";
+  t["LucidaSans-Demi"] = "Helvetica-Bold";
+  t["MS-Gothic"] = "MS Gothic";
+  t["MS-Gothic-Bold"] = "MS Gothic-Bold";
+  t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic";
+  t["MS-Gothic-Italic"] = "MS Gothic-Italic";
+  t["MS-Mincho"] = "MS Mincho";
+  t["MS-Mincho-Bold"] = "MS Mincho-Bold";
+  t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic";
+  t["MS-Mincho-Italic"] = "MS Mincho-Italic";
+  t["MS-PGothic"] = "MS PGothic";
+  t["MS-PGothic-Bold"] = "MS PGothic-Bold";
+  t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic";
+  t["MS-PGothic-Italic"] = "MS PGothic-Italic";
+  t["MS-PMincho"] = "MS PMincho";
+  t["MS-PMincho-Bold"] = "MS PMincho-Bold";
+  t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic";
+  t["MS-PMincho-Italic"] = "MS PMincho-Italic";
+  t.NuptialScript = "Times-Italic";
+  t.SegoeUISymbol = "Helvetica";
+  t.Wingdings = "ZapfDingbats";
+  t["Wingdings-Regular"] = "ZapfDingbats";
+});
+exports.getNonStdFontMap = getNonStdFontMap;
+const getSerifFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t["Adobe Jenson"] = true;
+  t["Adobe Text"] = true;
+  t.Albertus = true;
+  t.Aldus = true;
+  t.Alexandria = true;
+  t.Algerian = true;
+  t["American Typewriter"] = true;
+  t.Antiqua = true;
+  t.Apex = true;
+  t.Arno = true;
+  t.Aster = true;
+  t.Aurora = true;
+  t.Baskerville = true;
+  t.Bell = true;
+  t.Bembo = true;
+  t["Bembo Schoolbook"] = true;
+  t.Benguiat = true;
+  t["Berkeley Old Style"] = true;
+  t["Bernhard Modern"] = true;
+  t["Berthold City"] = true;
+  t.Bodoni = true;
+  t["Bauer Bodoni"] = true;
+  t["Book Antiqua"] = true;
+  t.Bookman = true;
+  t["Bordeaux Roman"] = true;
+  t["Californian FB"] = true;
+  t.Calisto = true;
+  t.Calvert = true;
+  t.Capitals = true;
+  t.Cambria = true;
+  t.Cartier = true;
+  t.Caslon = true;
+  t.Catull = true;
+  t.Centaur = true;
+  t["Century Old Style"] = true;
+  t["Century Schoolbook"] = true;
+  t.Chaparral = true;
+  t["Charis SIL"] = true;
+  t.Cheltenham = true;
+  t["Cholla Slab"] = true;
+  t.Clarendon = true;
+  t.Clearface = true;
+  t.Cochin = true;
+  t.Colonna = true;
+  t["Computer Modern"] = true;
+  t["Concrete Roman"] = true;
+  t.Constantia = true;
+  t["Cooper Black"] = true;
+  t.Corona = true;
+  t.Ecotype = true;
+  t.Egyptienne = true;
+  t.Elephant = true;
+  t.Excelsior = true;
+  t.Fairfield = true;
+  t["FF Scala"] = true;
+  t.Folkard = true;
+  t.Footlight = true;
+  t.FreeSerif = true;
+  t["Friz Quadrata"] = true;
+  t.Garamond = true;
+  t.Gentium = true;
+  t.Georgia = true;
+  t.Gloucester = true;
+  t["Goudy Old Style"] = true;
+  t["Goudy Schoolbook"] = true;
+  t["Goudy Pro Font"] = true;
+  t.Granjon = true;
+  t["Guardian Egyptian"] = true;
+  t.Heather = true;
+  t.Hercules = true;
+  t["High Tower Text"] = true;
+  t.Hiroshige = true;
+  t["Hoefler Text"] = true;
+  t["Humana Serif"] = true;
+  t.Imprint = true;
+  t["Ionic No. 5"] = true;
+  t.Janson = true;
+  t.Joanna = true;
+  t.Korinna = true;
+  t.Lexicon = true;
+  t["Liberation Serif"] = true;
+  t["Linux Libertine"] = true;
+  t.Literaturnaya = true;
+  t.Lucida = true;
+  t["Lucida Bright"] = true;
+  t.Melior = true;
+  t.Memphis = true;
+  t.Miller = true;
+  t.Minion = true;
+  t.Modern = true;
+  t["Mona Lisa"] = true;
+  t["Mrs Eaves"] = true;
+  t["MS Serif"] = true;
+  t["Museo Slab"] = true;
+  t["New York"] = true;
+  t["Nimbus Roman"] = true;
+  t["NPS Rawlinson Roadway"] = true;
+  t.NuptialScript = true;
+  t.Palatino = true;
+  t.Perpetua = true;
+  t.Plantin = true;
+  t["Plantin Schoolbook"] = true;
+  t.Playbill = true;
+  t["Poor Richard"] = true;
+  t["Rawlinson Roadway"] = true;
+  t.Renault = true;
+  t.Requiem = true;
+  t.Rockwell = true;
+  t.Roman = true;
+  t["Rotis Serif"] = true;
+  t.Sabon = true;
+  t.Scala = true;
+  t.Seagull = true;
+  t.Sistina = true;
+  t.Souvenir = true;
+  t.STIX = true;
+  t["Stone Informal"] = true;
+  t["Stone Serif"] = true;
+  t.Sylfaen = true;
+  t.Times = true;
+  t.Trajan = true;
+  t["Trinité"] = true;
+  t["Trump Mediaeval"] = true;
+  t.Utopia = true;
+  t["Vale Type"] = true;
+  t["Bitstream Vera"] = true;
+  t["Vera Serif"] = true;
+  t.Versailles = true;
+  t.Wanted = true;
+  t.Weiss = true;
+  t["Wide Latin"] = true;
+  t.Windsor = true;
+  t.XITS = true;
+});
+exports.getSerifFonts = getSerifFonts;
+const getSymbolsFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t.Dingbats = true;
+  t.Symbol = true;
+  t.ZapfDingbats = true;
+});
+exports.getSymbolsFonts = getSymbolsFonts;
+const getGlyphMapForStandardFonts = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t[2] = 10;
+  t[3] = 32;
+  t[4] = 33;
+  t[5] = 34;
+  t[6] = 35;
+  t[7] = 36;
+  t[8] = 37;
+  t[9] = 38;
+  t[10] = 39;
+  t[11] = 40;
+  t[12] = 41;
+  t[13] = 42;
+  t[14] = 43;
+  t[15] = 44;
+  t[16] = 45;
+  t[17] = 46;
+  t[18] = 47;
+  t[19] = 48;
+  t[20] = 49;
+  t[21] = 50;
+  t[22] = 51;
+  t[23] = 52;
+  t[24] = 53;
+  t[25] = 54;
+  t[26] = 55;
+  t[27] = 56;
+  t[28] = 57;
+  t[29] = 58;
+  t[30] = 894;
+  t[31] = 60;
+  t[32] = 61;
+  t[33] = 62;
+  t[34] = 63;
+  t[35] = 64;
+  t[36] = 65;
+  t[37] = 66;
+  t[38] = 67;
+  t[39] = 68;
+  t[40] = 69;
+  t[41] = 70;
+  t[42] = 71;
+  t[43] = 72;
+  t[44] = 73;
+  t[45] = 74;
+  t[46] = 75;
+  t[47] = 76;
+  t[48] = 77;
+  t[49] = 78;
+  t[50] = 79;
+  t[51] = 80;
+  t[52] = 81;
+  t[53] = 82;
+  t[54] = 83;
+  t[55] = 84;
+  t[56] = 85;
+  t[57] = 86;
+  t[58] = 87;
+  t[59] = 88;
+  t[60] = 89;
+  t[61] = 90;
+  t[62] = 91;
+  t[63] = 92;
+  t[64] = 93;
+  t[65] = 94;
+  t[66] = 95;
+  t[67] = 96;
+  t[68] = 97;
+  t[69] = 98;
+  t[70] = 99;
+  t[71] = 100;
+  t[72] = 101;
+  t[73] = 102;
+  t[74] = 103;
+  t[75] = 104;
+  t[76] = 105;
+  t[77] = 106;
+  t[78] = 107;
+  t[79] = 108;
+  t[80] = 109;
+  t[81] = 110;
+  t[82] = 111;
+  t[83] = 112;
+  t[84] = 113;
+  t[85] = 114;
+  t[86] = 115;
+  t[87] = 116;
+  t[88] = 117;
+  t[89] = 118;
+  t[90] = 119;
+  t[91] = 120;
+  t[92] = 121;
+  t[93] = 122;
+  t[94] = 123;
+  t[95] = 124;
+  t[96] = 125;
+  t[97] = 126;
+  t[98] = 196;
+  t[99] = 197;
+  t[100] = 199;
+  t[101] = 201;
+  t[102] = 209;
+  t[103] = 214;
+  t[104] = 220;
+  t[105] = 225;
+  t[106] = 224;
+  t[107] = 226;
+  t[108] = 228;
+  t[109] = 227;
+  t[110] = 229;
+  t[111] = 231;
+  t[112] = 233;
+  t[113] = 232;
+  t[114] = 234;
+  t[115] = 235;
+  t[116] = 237;
+  t[117] = 236;
+  t[118] = 238;
+  t[119] = 239;
+  t[120] = 241;
+  t[121] = 243;
+  t[122] = 242;
+  t[123] = 244;
+  t[124] = 246;
+  t[125] = 245;
+  t[126] = 250;
+  t[127] = 249;
+  t[128] = 251;
+  t[129] = 252;
+  t[130] = 8224;
+  t[131] = 176;
+  t[132] = 162;
+  t[133] = 163;
+  t[134] = 167;
+  t[135] = 8226;
+  t[136] = 182;
+  t[137] = 223;
+  t[138] = 174;
+  t[139] = 169;
+  t[140] = 8482;
+  t[141] = 180;
+  t[142] = 168;
+  t[143] = 8800;
+  t[144] = 198;
+  t[145] = 216;
+  t[146] = 8734;
+  t[147] = 177;
+  t[148] = 8804;
+  t[149] = 8805;
+  t[150] = 165;
+  t[151] = 181;
+  t[152] = 8706;
+  t[153] = 8721;
+  t[154] = 8719;
+  t[156] = 8747;
+  t[157] = 170;
+  t[158] = 186;
+  t[159] = 8486;
+  t[160] = 230;
+  t[161] = 248;
+  t[162] = 191;
+  t[163] = 161;
+  t[164] = 172;
+  t[165] = 8730;
+  t[166] = 402;
+  t[167] = 8776;
+  t[168] = 8710;
+  t[169] = 171;
+  t[170] = 187;
+  t[171] = 8230;
+  t[210] = 218;
+  t[223] = 711;
+  t[224] = 321;
+  t[225] = 322;
+  t[227] = 353;
+  t[229] = 382;
+  t[234] = 253;
+  t[252] = 263;
+  t[253] = 268;
+  t[254] = 269;
+  t[258] = 258;
+  t[260] = 260;
+  t[261] = 261;
+  t[265] = 280;
+  t[266] = 281;
+  t[268] = 283;
+  t[269] = 313;
+  t[275] = 323;
+  t[276] = 324;
+  t[278] = 328;
+  t[284] = 345;
+  t[285] = 346;
+  t[286] = 347;
+  t[292] = 367;
+  t[295] = 377;
+  t[296] = 378;
+  t[298] = 380;
+  t[305] = 963;
+  t[306] = 964;
+  t[307] = 966;
+  t[308] = 8215;
+  t[309] = 8252;
+  t[310] = 8319;
+  t[311] = 8359;
+  t[312] = 8592;
+  t[313] = 8593;
+  t[337] = 9552;
+  t[493] = 1039;
+  t[494] = 1040;
+  t[705] = 1524;
+  t[706] = 8362;
+  t[710] = 64288;
+  t[711] = 64298;
+  t[759] = 1617;
+  t[761] = 1776;
+  t[763] = 1778;
+  t[775] = 1652;
+  t[777] = 1764;
+  t[778] = 1780;
+  t[779] = 1781;
+  t[780] = 1782;
+  t[782] = 771;
+  t[783] = 64726;
+  t[786] = 8363;
+  t[788] = 8532;
+  t[790] = 768;
+  t[791] = 769;
+  t[792] = 768;
+  t[795] = 803;
+  t[797] = 64336;
+  t[798] = 64337;
+  t[799] = 64342;
+  t[800] = 64343;
+  t[801] = 64344;
+  t[802] = 64345;
+  t[803] = 64362;
+  t[804] = 64363;
+  t[805] = 64364;
+  t[2424] = 7821;
+  t[2425] = 7822;
+  t[2426] = 7823;
+  t[2427] = 7824;
+  t[2428] = 7825;
+  t[2429] = 7826;
+  t[2430] = 7827;
+  t[2433] = 7682;
+  t[2678] = 8045;
+  t[2679] = 8046;
+  t[2830] = 1552;
+  t[2838] = 686;
+  t[2840] = 751;
+  t[2842] = 753;
+  t[2843] = 754;
+  t[2844] = 755;
+  t[2846] = 757;
+  t[2856] = 767;
+  t[2857] = 848;
+  t[2858] = 849;
+  t[2862] = 853;
+  t[2863] = 854;
+  t[2864] = 855;
+  t[2865] = 861;
+  t[2866] = 862;
+  t[2906] = 7460;
+  t[2908] = 7462;
+  t[2909] = 7463;
+  t[2910] = 7464;
+  t[2912] = 7466;
+  t[2913] = 7467;
+  t[2914] = 7468;
+  t[2916] = 7470;
+  t[2917] = 7471;
+  t[2918] = 7472;
+  t[2920] = 7474;
+  t[2921] = 7475;
+  t[2922] = 7476;
+  t[2924] = 7478;
+  t[2925] = 7479;
+  t[2926] = 7480;
+  t[2928] = 7482;
+  t[2929] = 7483;
+  t[2930] = 7484;
+  t[2932] = 7486;
+  t[2933] = 7487;
+  t[2934] = 7488;
+  t[2936] = 7490;
+  t[2937] = 7491;
+  t[2938] = 7492;
+  t[2940] = 7494;
+  t[2941] = 7495;
+  t[2942] = 7496;
+  t[2944] = 7498;
+  t[2946] = 7500;
+  t[2948] = 7502;
+  t[2950] = 7504;
+  t[2951] = 7505;
+  t[2952] = 7506;
+  t[2954] = 7508;
+  t[2955] = 7509;
+  t[2956] = 7510;
+  t[2958] = 7512;
+  t[2959] = 7513;
+  t[2960] = 7514;
+  t[2962] = 7516;
+  t[2963] = 7517;
+  t[2964] = 7518;
+  t[2966] = 7520;
+  t[2967] = 7521;
+  t[2968] = 7522;
+  t[2970] = 7524;
+  t[2971] = 7525;
+  t[2972] = 7526;
+  t[2974] = 7528;
+  t[2975] = 7529;
+  t[2976] = 7530;
+  t[2978] = 1537;
+  t[2979] = 1538;
+  t[2980] = 1539;
+  t[2982] = 1549;
+  t[2983] = 1551;
+  t[2984] = 1552;
+  t[2986] = 1554;
+  t[2987] = 1555;
+  t[2988] = 1556;
+  t[2990] = 1623;
+  t[2991] = 1624;
+  t[2995] = 1775;
+  t[2999] = 1791;
+  t[3002] = 64290;
+  t[3003] = 64291;
+  t[3004] = 64292;
+  t[3006] = 64294;
+  t[3007] = 64295;
+  t[3008] = 64296;
+  t[3011] = 1900;
+  t[3014] = 8223;
+  t[3015] = 8244;
+  t[3017] = 7532;
+  t[3018] = 7533;
+  t[3019] = 7534;
+  t[3075] = 7590;
+  t[3076] = 7591;
+  t[3079] = 7594;
+  t[3080] = 7595;
+  t[3083] = 7598;
+  t[3084] = 7599;
+  t[3087] = 7602;
+  t[3088] = 7603;
+  t[3091] = 7606;
+  t[3092] = 7607;
+  t[3095] = 7610;
+  t[3096] = 7611;
+  t[3099] = 7614;
+  t[3100] = 7615;
+  t[3103] = 7618;
+  t[3104] = 7619;
+  t[3107] = 8337;
+  t[3108] = 8338;
+  t[3116] = 1884;
+  t[3119] = 1885;
+  t[3120] = 1885;
+  t[3123] = 1886;
+  t[3124] = 1886;
+  t[3127] = 1887;
+  t[3128] = 1887;
+  t[3131] = 1888;
+  t[3132] = 1888;
+  t[3135] = 1889;
+  t[3136] = 1889;
+  t[3139] = 1890;
+  t[3140] = 1890;
+  t[3143] = 1891;
+  t[3144] = 1891;
+  t[3147] = 1892;
+  t[3148] = 1892;
+  t[3153] = 580;
+  t[3154] = 581;
+  t[3157] = 584;
+  t[3158] = 585;
+  t[3161] = 588;
+  t[3162] = 589;
+  t[3165] = 891;
+  t[3166] = 892;
+  t[3169] = 1274;
+  t[3170] = 1275;
+  t[3173] = 1278;
+  t[3174] = 1279;
+  t[3181] = 7622;
+  t[3182] = 7623;
+  t[3282] = 11799;
+  t[3316] = 578;
+  t[3379] = 42785;
+  t[3393] = 1159;
+  t[3416] = 8377;
+});
+exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;
+const getSupplementalGlyphMapForArialBlack = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t[227] = 322;
+  t[264] = 261;
+  t[291] = 346;
+});
+exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;
+const getSupplementalGlyphMapForCalibri = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t[1] = 32;
+  t[4] = 65;
+  t[17] = 66;
+  t[18] = 67;
+  t[24] = 68;
+  t[28] = 69;
+  t[38] = 70;
+  t[39] = 71;
+  t[44] = 72;
+  t[47] = 73;
+  t[58] = 74;
+  t[60] = 75;
+  t[62] = 76;
+  t[68] = 77;
+  t[69] = 78;
+  t[75] = 79;
+  t[87] = 80;
+  t[89] = 81;
+  t[90] = 82;
+  t[94] = 83;
+  t[100] = 84;
+  t[104] = 85;
+  t[115] = 86;
+  t[116] = 87;
+  t[121] = 88;
+  t[122] = 89;
+  t[127] = 90;
+  t[258] = 97;
+  t[268] = 261;
+  t[271] = 98;
+  t[272] = 99;
+  t[273] = 263;
+  t[282] = 100;
+  t[286] = 101;
+  t[295] = 281;
+  t[296] = 102;
+  t[336] = 103;
+  t[346] = 104;
+  t[349] = 105;
+  t[361] = 106;
+  t[364] = 107;
+  t[367] = 108;
+  t[371] = 322;
+  t[373] = 109;
+  t[374] = 110;
+  t[381] = 111;
+  t[383] = 243;
+  t[393] = 112;
+  t[395] = 113;
+  t[396] = 114;
+  t[400] = 115;
+  t[401] = 347;
+  t[410] = 116;
+  t[437] = 117;
+  t[448] = 118;
+  t[449] = 119;
+  t[454] = 120;
+  t[455] = 121;
+  t[460] = 122;
+  t[463] = 380;
+  t[853] = 44;
+  t[855] = 58;
+  t[856] = 46;
+  t[876] = 47;
+  t[878] = 45;
+  t[882] = 45;
+  t[894] = 40;
+  t[895] = 41;
+  t[896] = 91;
+  t[897] = 93;
+  t[923] = 64;
+  t[1004] = 48;
+  t[1005] = 49;
+  t[1006] = 50;
+  t[1007] = 51;
+  t[1008] = 52;
+  t[1009] = 53;
+  t[1010] = 54;
+  t[1011] = 55;
+  t[1012] = 56;
+  t[1013] = 57;
+  t[1081] = 37;
+  t[1085] = 43;
+  t[1086] = 45;
+});
+exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;
+
+function getStandardFontName(name) {
+  const fontName = (0, _fonts_utils.normalizeFontName)(name);
+  const stdFontMap = getStdFontMap();
+  return stdFontMap[fontName];
+}
+
+/***/ }),
+/* 42 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ToUnicodeMap = exports.IdentityToUnicodeMap = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+class ToUnicodeMap {
+  constructor(cmap = []) {
+    this._map = cmap;
+  }
+
+  get length() {
+    return this._map.length;
+  }
+
+  forEach(callback) {
+    for (const charCode in this._map) {
+      callback(charCode, this._map[charCode].charCodeAt(0));
+    }
+  }
+
+  has(i) {
+    return this._map[i] !== undefined;
+  }
+
+  get(i) {
+    return this._map[i];
+  }
+
+  charCodeOf(value) {
+    const map = this._map;
+
+    if (map.length <= 0x10000) {
+      return map.indexOf(value);
+    }
+
+    for (const charCode in map) {
+      if (map[charCode] === value) {
+        return charCode | 0;
+      }
+    }
+
+    return -1;
+  }
+
+  amend(map) {
+    for (const charCode in map) {
+      this._map[charCode] = map[charCode];
+    }
+  }
+
+}
+
+exports.ToUnicodeMap = ToUnicodeMap;
+
+class IdentityToUnicodeMap {
+  constructor(firstChar, lastChar) {
+    this.firstChar = firstChar;
+    this.lastChar = lastChar;
+  }
+
+  get length() {
+    return this.lastChar + 1 - this.firstChar;
+  }
+
+  forEach(callback) {
+    for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
+      callback(i, i);
+    }
+  }
+
+  has(i) {
+    return this.firstChar <= i && i <= this.lastChar;
+  }
+
+  get(i) {
+    if (this.firstChar <= i && i <= this.lastChar) {
+      return String.fromCharCode(i);
+    }
+
+    return undefined;
+  }
+
+  charCodeOf(v) {
+    return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
+  }
+
+  amend(map) {
+    (0, _util.unreachable)("Should not call amend()");
+  }
+
+}
+
+exports.IdentityToUnicodeMap = IdentityToUnicodeMap;
+
+/***/ }),
+/* 43 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.CFFFont = void 0;
+
+var _cff_parser = __w_pdfjs_require__(35);
+
+var _fonts_utils = __w_pdfjs_require__(38);
+
+var _util = __w_pdfjs_require__(2);
+
+class CFFFont {
+  constructor(file, properties) {
+    this.properties = properties;
+    const parser = new _cff_parser.CFFParser(file, properties, _fonts_utils.SEAC_ANALYSIS_ENABLED);
+    this.cff = parser.parse();
+    this.cff.duplicateFirstGlyph();
+    const compiler = new _cff_parser.CFFCompiler(this.cff);
+    this.seacs = this.cff.seacs;
+
+    try {
+      this.data = compiler.compile();
+    } catch (e) {
+      (0, _util.warn)("Failed to compile font " + properties.loadedName);
+      this.data = file;
+    }
+
+    this._createBuiltInEncoding();
+  }
+
+  get numGlyphs() {
+    return this.cff.charStrings.count;
+  }
+
+  getCharset() {
+    return this.cff.charset.charset;
+  }
+
+  getGlyphMapping() {
+    const cff = this.cff;
+    const properties = this.properties;
+    const charsets = cff.charset.charset;
+    let charCodeToGlyphId;
+    let glyphId;
+
+    if (properties.composite) {
+      charCodeToGlyphId = Object.create(null);
+      let charCode;
+
+      if (cff.isCIDFont) {
+        for (glyphId = 0; glyphId < charsets.length; glyphId++) {
+          const cid = charsets[glyphId];
+          charCode = properties.cMap.charCodeOf(cid);
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      } else {
+        for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
+          charCode = properties.cMap.charCodeOf(glyphId);
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      }
+
+      return charCodeToGlyphId;
+    }
+
+    let encoding = cff.encoding ? cff.encoding.encoding : null;
+
+    if (properties.isInternalFont) {
+      encoding = properties.defaultEncoding;
+    }
+
+    charCodeToGlyphId = (0, _fonts_utils.type1FontGlyphMapping)(properties, encoding, charsets);
+    return charCodeToGlyphId;
+  }
+
+  hasGlyphId(id) {
+    return this.cff.hasGlyphId(id);
+  }
+
+  _createBuiltInEncoding() {
+    const {
+      charset,
+      encoding
+    } = this.cff;
+
+    if (!charset || !encoding) {
+      return;
+    }
+
+    const charsets = charset.charset,
+          encodings = encoding.encoding;
+    const map = [];
+
+    for (const charCode in encodings) {
+      const glyphId = encodings[charCode];
+
+      if (glyphId >= 0) {
+        const glyphName = charsets[glyphId];
+
+        if (glyphName) {
+          map[charCode] = glyphName;
+        }
+      }
+    }
+
+    if (map.length > 0) {
+      this.properties.builtInEncoding = map;
+    }
+  }
+
+}
+
+exports.CFFFont = CFFFont;
+
+/***/ }),
+/* 44 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.FontRendererFactory = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _cff_parser = __w_pdfjs_require__(35);
+
+var _glyphlist = __w_pdfjs_require__(39);
+
+var _encodings = __w_pdfjs_require__(37);
+
+var _stream = __w_pdfjs_require__(10);
+
+function getLong(data, offset) {
+  return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+}
+
+function getUshort(data, offset) {
+  return data[offset] << 8 | data[offset + 1];
+}
+
+function getSubroutineBias(subrs) {
+  const numSubrs = subrs.length;
+  let bias = 32768;
+
+  if (numSubrs < 1240) {
+    bias = 107;
+  } else if (numSubrs < 33900) {
+    bias = 1131;
+  }
+
+  return bias;
+}
+
+function parseCmap(data, start, end) {
+  const offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);
+  const format = getUshort(data, start + offset);
+  let ranges, p, i;
+
+  if (format === 4) {
+    getUshort(data, start + offset + 2);
+    const segCount = getUshort(data, start + offset + 6) >> 1;
+    p = start + offset + 14;
+    ranges = [];
+
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i] = {
+        end: getUshort(data, p)
+      };
+    }
+
+    p += 2;
+
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i].start = getUshort(data, p);
+    }
+
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i].idDelta = getUshort(data, p);
+    }
+
+    for (i = 0; i < segCount; i++, p += 2) {
+      let idOffset = getUshort(data, p);
+
+      if (idOffset === 0) {
+        continue;
+      }
+
+      ranges[i].ids = [];
+
+      for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
+        ranges[i].ids[j] = getUshort(data, p + idOffset);
+        idOffset += 2;
+      }
+    }
+
+    return ranges;
+  } else if (format === 12) {
+    getLong(data, start + offset + 4);
+    const groups = getLong(data, start + offset + 12);
+    p = start + offset + 16;
+    ranges = [];
+
+    for (i = 0; i < groups; i++) {
+      ranges.push({
+        start: getLong(data, p),
+        end: getLong(data, p + 4),
+        idDelta: getLong(data, p + 8) - getLong(data, p)
+      });
+      p += 12;
+    }
+
+    return ranges;
+  }
+
+  throw new _util.FormatError(`unsupported cmap: ${format}`);
+}
+
+function parseCff(data, start, end, seacAnalysisEnabled) {
+  const properties = {};
+  const parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, 
seacAnalysisEnabled);
+  const cff = parser.parse();
+  return {
+    glyphs: cff.charStrings.objects,
+    subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && 
cff.topDict.privateDict.subrsIndex.objects,
+    gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,
+    isCFFCIDFont: cff.isCIDFont,
+    fdSelect: cff.fdSelect,
+    fdArray: cff.fdArray
+  };
+}
+
+function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
+  let itemSize, itemDecode;
+
+  if (isGlyphLocationsLong) {
+    itemSize = 4;
+
+    itemDecode = function fontItemDecodeLong(data, offset) {
+      return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+    };
+  } else {
+    itemSize = 2;
+
+    itemDecode = function fontItemDecode(data, offset) {
+      return data[offset] << 9 | data[offset + 1] << 1;
+    };
+  }
+
+  const glyphs = [];
+  let startOffset = itemDecode(loca, 0);
+
+  for (let j = itemSize; j < loca.length; j += itemSize) {
+    const endOffset = itemDecode(loca, j);
+    glyphs.push(glyf.subarray(startOffset, endOffset));
+    startOffset = endOffset;
+  }
+
+  return glyphs;
+}
+
+function lookupCmap(ranges, unicode) {
+  const code = unicode.codePointAt(0);
+  let gid = 0,
+      l = 0,
+      r = ranges.length - 1;
+
+  while (l < r) {
+    const c = l + r + 1 >> 1;
+
+    if (code < ranges[c].start) {
+      r = c - 1;
+    } else {
+      l = c;
+    }
+  }
+
+  if (ranges[l].start <= code && code <= ranges[l].end) {
+    gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff;
+  }
+
+  return {
+    charCode: code,
+    glyphId: gid
+  };
+}
+
+function compileGlyf(code, cmds, font) {
+  function moveTo(x, y) {
+    cmds.push({
+      cmd: "moveTo",
+      args: [x, y]
+    });
+  }
+
+  function lineTo(x, y) {
+    cmds.push({
+      cmd: "lineTo",
+      args: [x, y]
+    });
+  }
+
+  function quadraticCurveTo(xa, ya, x, y) {
+    cmds.push({
+      cmd: "quadraticCurveTo",
+      args: [xa, ya, x, y]
+    });
+  }
+
+  let i = 0;
+  const numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;
+  let flags;
+  let x = 0,
+      y = 0;
+  i += 10;
+
+  if (numberOfContours < 0) {
+    do {
+      flags = code[i] << 8 | code[i + 1];
+      const glyphIndex = code[i + 2] << 8 | code[i + 3];
+      i += 4;
+      let arg1, arg2;
+
+      if (flags & 0x01) {
+        arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;
+        arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;
+        i += 4;
+      } else {
+        arg1 = code[i++];
+        arg2 = code[i++];
+      }
+
+      if (flags & 0x02) {
+        x = arg1;
+        y = arg2;
+      } else {
+        x = 0;
+        y = 0;
+      }
+
+      let scaleX = 1,
+          scaleY = 1,
+          scale01 = 0,
+          scale10 = 0;
+
+      if (flags & 0x08) {
+        scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+        i += 2;
+      } else if (flags & 0x40) {
+        scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+        scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
+        i += 4;
+      } else if (flags & 0x80) {
+        scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+        scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
+        scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;
+        scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;
+        i += 8;
+      }
+
+      const subglyph = font.glyphs[glyphIndex];
+
+      if (subglyph) {
+        cmds.push({
+          cmd: "save"
+        }, {
+          cmd: "transform",
+          args: [scaleX, scale01, scale10, scaleY, x, y]
+        });
+        compileGlyf(subglyph, cmds, font);
+        cmds.push({
+          cmd: "restore"
+        });
+      }
+    } while (flags & 0x20);
+  } else {
+    const endPtsOfContours = [];
+    let j, jj;
+
+    for (j = 0; j < numberOfContours; j++) {
+      endPtsOfContours.push(code[i] << 8 | code[i + 1]);
+      i += 2;
+    }
+
+    const instructionLength = code[i] << 8 | code[i + 1];
+    i += 2 + instructionLength;
+    const numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
+    const points = [];
+
+    while (points.length < numberOfPoints) {
+      flags = code[i++];
+      let repeat = 1;
+
+      if (flags & 0x08) {
+        repeat += code[i++];
+      }
+
+      while (repeat-- > 0) {
+        points.push({
+          flags
+        });
+      }
+    }
+
+    for (j = 0; j < numberOfPoints; j++) {
+      switch (points[j].flags & 0x12) {
+        case 0x00:
+          x += (code[i] << 24 | code[i + 1] << 16) >> 16;
+          i += 2;
+          break;
+
+        case 0x02:
+          x -= code[i++];
+          break;
+
+        case 0x12:
+          x += code[i++];
+          break;
+      }
+
+      points[j].x = x;
+    }
+
+    for (j = 0; j < numberOfPoints; j++) {
+      switch (points[j].flags & 0x24) {
+        case 0x00:
+          y += (code[i] << 24 | code[i + 1] << 16) >> 16;
+          i += 2;
+          break;
+
+        case 0x04:
+          y -= code[i++];
+          break;
+
+        case 0x24:
+          y += code[i++];
+          break;
+      }
+
+      points[j].y = y;
+    }
+
+    let startPoint = 0;
+
+    for (i = 0; i < numberOfContours; i++) {
+      const endPoint = endPtsOfContours[i];
+      const contour = points.slice(startPoint, endPoint + 1);
+
+      if (contour[0].flags & 1) {
+        contour.push(contour[0]);
+      } else if (contour[contour.length - 1].flags & 1) {
+        contour.unshift(contour[contour.length - 1]);
+      } else {
+        const p = {
+          flags: 1,
+          x: (contour[0].x + contour[contour.length - 1].x) / 2,
+          y: (contour[0].y + contour[contour.length - 1].y) / 2
+        };
+        contour.unshift(p);
+        contour.push(p);
+      }
+
+      moveTo(contour[0].x, contour[0].y);
+
+      for (j = 1, jj = contour.length; j < jj; j++) {
+        if (contour[j].flags & 1) {
+          lineTo(contour[j].x, contour[j].y);
+        } else if (contour[j + 1].flags & 1) {
+          quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
+          j++;
+        } else {
+          quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y 
+ contour[j + 1].y) / 2);
+        }
+      }
+
+      startPoint = endPoint + 1;
+    }
+  }
 }
-exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;
-exports.reverseIfRtl = reverseIfRtl;
-exports.getUnicodeRangeFor = getUnicodeRangeFor;
-exports.getNormalizedUnicodes = getNormalizedUnicodes;
-exports.getUnicodeForGlyph = getUnicodeForGlyph;
 
-/***/ }),
-/* 37 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+function compileCharString(charStringCode, cmds, font, glyphId) {
+  function moveTo(x, y) {
+    cmds.push({
+      cmd: "moveTo",
+      args: [x, y]
+    });
+  }
+
+  function lineTo(x, y) {
+    cmds.push({
+      cmd: "lineTo",
+      args: [x, y]
+    });
+  }
 
-"use strict";
+  function bezierCurveTo(x1, y1, x2, y2, x, y) {
+    cmds.push({
+      cmd: "bezierCurveTo",
+      args: [x1, y1, x2, y2, x, y]
+    });
+  }
 
+  const stack = [];
+  let x = 0,
+      y = 0;
+  let stems = 0;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.FontRendererFactory = void 0;
+  function parse(code) {
+    let i = 0;
 
-var _util = __w_pdfjs_require__(2);
+    while (i < code.length) {
+      let stackClean = false;
+      let v = code[i++];
+      let xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+
+      switch (v) {
+        case 1:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+
+        case 3:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+
+        case 4:
+          y += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+
+        case 5:
+          while (stack.length > 0) {
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+          }
 
-var _cff_parser = __w_pdfjs_require__(31);
+          break;
+
+        case 6:
+          while (stack.length > 0) {
+            x += stack.shift();
+            lineTo(x, y);
 
-var _glyphlist = __w_pdfjs_require__(34);
+            if (stack.length === 0) {
+              break;
+            }
 
-var _encodings = __w_pdfjs_require__(33);
+            y += stack.shift();
+            lineTo(x, y);
+          }
 
-var _stream = __w_pdfjs_require__(12);
+          break;
 
-var FontRendererFactory = function FontRendererFactoryClosure() {
-  function getLong(data, offset) {
-    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
-  }
+        case 7:
+          while (stack.length > 0) {
+            y += stack.shift();
+            lineTo(x, y);
+
+            if (stack.length === 0) {
+              break;
+            }
+
+            x += stack.shift();
+            lineTo(x, y);
+          }
+
+          break;
+
+        case 8:
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          break;
+
+        case 10:
+          n = stack.pop();
+          subrCode = null;
+
+          if (font.isCFFCIDFont) {
+            const fdIndex = font.fdSelect.getFDIndex(glyphId);
+
+            if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
+              const fontDict = font.fdArray[fdIndex];
+              let subrs;
+
+              if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {
+                subrs = fontDict.privateDict.subrsIndex.objects;
+              }
+
+              if (subrs) {
+                n += getSubroutineBias(subrs);
+                subrCode = subrs[n];
+              }
+            } else {
+              (0, _util.warn)("Invalid fd index for glyph index.");
+            }
+          } else {
+            subrCode = font.subrs[n + font.subrsBias];
+          }
+
+          if (subrCode) {
+            parse(subrCode);
+          }
+
+          break;
+
+        case 11:
+          return;
+
+        case 12:
+          v = code[i++];
+
+          switch (v) {
+            case 34:
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              y1 = y + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y, xb, y1, x, y1);
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y1, xb, y, x, y);
+              break;
+
+            case 35:
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              stack.pop();
+              break;
+
+            case 36:
+              xa = x + stack.shift();
+              y1 = y + stack.shift();
+              xb = xa + stack.shift();
+              y2 = y1 + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y1, xb, y2, x, y2);
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              y3 = y2 + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y2, xb, y3, x, y);
+              break;
+
+            case 37:
+              const x0 = x,
+                    y0 = y;
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb;
+              y = yb;
+
+              if (Math.abs(x - x0) > Math.abs(y - y0)) {
+                x += stack.shift();
+              } else {
+                y += stack.shift();
+              }
+
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              break;
+
+            default:
+              throw new _util.FormatError(`unknown operator: 12 ${v}`);
+          }
+
+          break;
+
+        case 14:
+          if (stack.length >= 4) {
+            const achar = stack.pop();
+            const bchar = stack.pop();
+            y = stack.pop();
+            x = stack.pop();
+            cmds.push({
+              cmd: "save"
+            }, {
+              cmd: "translate",
+              args: [x, y]
+            });
+            let cmap = lookupCmap(font.cmap, 
String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));
+            compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+            cmds.push({
+              cmd: "restore"
+            });
+            cmap = lookupCmap(font.cmap, 
String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));
+            compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+          }
+
+          return;
+
+        case 18:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+
+        case 19:
+          stems += stack.length >> 1;
+          i += stems + 7 >> 3;
+          stackClean = true;
+          break;
+
+        case 20:
+          stems += stack.length >> 1;
+          i += stems + 7 >> 3;
+          stackClean = true;
+          break;
+
+        case 21:
+          y += stack.pop();
+          x += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+
+        case 22:
+          x += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+
+        case 23:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+
+        case 24:
+          while (stack.length > 2) {
+            xa = x + stack.shift();
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          x += stack.shift();
+          y += stack.shift();
+          lineTo(x, y);
+          break;
+
+        case 25:
+          while (stack.length > 6) {
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+          }
+
+          xa = x + stack.shift();
+          ya = y + stack.shift();
+          xb = xa + stack.shift();
+          yb = ya + stack.shift();
+          x = xb + stack.shift();
+          y = yb + stack.shift();
+          bezierCurveTo(xa, ya, xb, yb, x, y);
+          break;
+
+        case 26:
+          if (stack.length % 2) {
+            x += stack.shift();
+          }
+
+          while (stack.length > 0) {
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb;
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          break;
+
+        case 27:
+          if (stack.length % 2) {
+            y += stack.shift();
+          }
+
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb;
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          break;
+
+        case 28:
+          stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);
+          i += 2;
+          break;
+
+        case 29:
+          n = stack.pop() + font.gsubrsBias;
+          subrCode = font.gsubrs[n];
+
+          if (subrCode) {
+            parse(subrCode);
+          }
+
+          break;
+
+        case 30:
+          while (stack.length > 0) {
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+
+            if (stack.length === 0) {
+              break;
+            }
+
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            y = yb + stack.shift();
+            x = xb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          break;
+
+        case 31:
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            y = yb + stack.shift();
+            x = xb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+
+            if (stack.length === 0) {
+              break;
+            }
+
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+
+          break;
+
+        default:
+          if (v < 32) {
+            throw new _util.FormatError(`unknown operator: ${v}`);
+          }
+
+          if (v < 247) {
+            stack.push(v - 139);
+          } else if (v < 251) {
+            stack.push((v - 247) * 256 + code[i++] + 108);
+          } else if (v < 255) {
+            stack.push(-(v - 251) * 256 - code[i++] - 108);
+          } else {
+            stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);
+            i += 4;
+          }
 
-  function getUshort(data, offset) {
-    return data[offset] << 8 | data[offset + 1];
+          break;
+      }
+
+      if (stackClean) {
+        stack.length = 0;
+      }
+    }
   }
 
-  function getSubroutineBias(subrs) {
-    const numSubrs = subrs.length;
-    let bias = 32768;
+  parse(charStringCode);
+}
 
-    if (numSubrs < 1240) {
-      bias = 107;
-    } else if (numSubrs < 33900) {
-      bias = 1131;
+const NOOP = [];
+
+class CompiledFont {
+  constructor(fontMatrix) {
+    if (this.constructor === CompiledFont) {
+      (0, _util.unreachable)("Cannot initialize CompiledFont.");
     }
 
-    return bias;
+    this.fontMatrix = fontMatrix;
+    this.compiledGlyphs = Object.create(null);
+    this.compiledCharCodeToGlyphId = Object.create(null);
   }
 
-  function parseCmap(data, start, end) {
-    var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);
-    var format = getUshort(data, start + offset);
-    var ranges, p, i;
+  getPathJs(unicode) {
+    const {
+      charCode,
+      glyphId
+    } = lookupCmap(this.cmap, unicode);
+    let fn = this.compiledGlyphs[glyphId];
+
+    if (!fn) {
+      try {
+        fn = this.compileGlyph(this.glyphs[glyphId], glyphId);
+        this.compiledGlyphs[glyphId] = fn;
+      } catch (ex) {
+        this.compiledGlyphs[glyphId] = NOOP;
 
-    if (format === 4) {
-      getUshort(data, start + offset + 2);
-      var segCount = getUshort(data, start + offset + 6) >> 1;
-      p = start + offset + 14;
-      ranges = [];
+        if (this.compiledCharCodeToGlyphId[charCode] === undefined) {
+          this.compiledCharCodeToGlyphId[charCode] = glyphId;
+        }
 
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i] = {
-          end: getUshort(data, p)
-        };
+        throw ex;
       }
+    }
 
-      p += 2;
+    if (this.compiledCharCodeToGlyphId[charCode] === undefined) {
+      this.compiledCharCodeToGlyphId[charCode] = glyphId;
+    }
 
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i].start = getUshort(data, p);
-      }
+    return fn;
+  }
+
+  compileGlyph(code, glyphId) {
+    if (!code || code.length === 0 || code[0] === 14) {
+      return NOOP;
+    }
+
+    let fontMatrix = this.fontMatrix;
+
+    if (this.isCFFCIDFont) {
+      const fdIndex = this.fdSelect.getFDIndex(glyphId);
 
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i].idDelta = getUshort(data, p);
+      if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
+        const fontDict = this.fdArray[fdIndex];
+        fontMatrix = fontDict.getByName("FontMatrix") || _util.FONT_IDENTITY_MATRIX;
+      } else {
+        (0, _util.warn)("Invalid fd index for glyph index.");
       }
+    }
 
-      for (i = 0; i < segCount; i++, p += 2) {
-        var idOffset = getUshort(data, p);
+    const cmds = [{
+      cmd: "save"
+    }, {
+      cmd: "transform",
+      args: fontMatrix.slice()
+    }, {
+      cmd: "scale",
+      args: ["size", "-size"]
+    }];
+    this.compileGlyphImpl(code, cmds, glyphId);
+    cmds.push({
+      cmd: "restore"
+    });
+    return cmds;
+  }
 
-        if (idOffset === 0) {
-          continue;
-        }
+  compileGlyphImpl() {
+    (0, _util.unreachable)("Children classes should implement this.");
+  }
+
+  hasBuiltPath(unicode) {
+    const {
+      charCode,
+      glyphId
+    } = lookupCmap(this.cmap, unicode);
+    return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== 
undefined;
+  }
 
-        ranges[i].ids = [];
+}
 
-        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
-          ranges[i].ids[j] = getUshort(data, p + idOffset);
-          idOffset += 2;
-        }
+class TrueTypeCompiled extends CompiledFont {
+  constructor(glyphs, cmap, fontMatrix) {
+    super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);
+    this.glyphs = glyphs;
+    this.cmap = cmap;
+  }
+
+  compileGlyphImpl(code, cmds) {
+    compileGlyf(code, cmds, this);
+  }
+
+}
+
+class Type2Compiled extends CompiledFont {
+  constructor(cffInfo, cmap, fontMatrix, glyphNameMap) {
+    super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);
+    this.glyphs = cffInfo.glyphs;
+    this.gsubrs = cffInfo.gsubrs || [];
+    this.subrs = cffInfo.subrs || [];
+    this.cmap = cmap;
+    this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();
+    this.gsubrsBias = getSubroutineBias(this.gsubrs);
+    this.subrsBias = getSubroutineBias(this.subrs);
+    this.isCFFCIDFont = cffInfo.isCFFCIDFont;
+    this.fdSelect = cffInfo.fdSelect;
+    this.fdArray = cffInfo.fdArray;
+  }
+
+  compileGlyphImpl(code, cmds, glyphId) {
+    compileCharString(code, cmds, this, glyphId);
+  }
+
+}
+
+class FontRendererFactory {
+  static create(font, seacAnalysisEnabled) {
+    const data = new Uint8Array(font.data);
+    let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
+    const numTables = getUshort(data, 4);
+
+    for (let i = 0, p = 12; i < numTables; i++, p += 16) {
+      const tag = (0, _util.bytesToString)(data.subarray(p, p + 4));
+      const offset = getLong(data, p + 8);
+      const length = getLong(data, p + 12);
+
+      switch (tag) {
+        case "cmap":
+          cmap = parseCmap(data, offset, offset + length);
+          break;
+
+        case "glyf":
+          glyf = data.subarray(offset, offset + length);
+          break;
+
+        case "loca":
+          loca = data.subarray(offset, offset + length);
+          break;
+
+        case "head":
+          unitsPerEm = getUshort(data, offset + 18);
+          indexToLocFormat = getUshort(data, offset + 50);
+          break;
+
+        case "CFF ":
+          cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
+          break;
       }
+    }
+
+    if (glyf) {
+      const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
+      return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+    }
 
-      return ranges;
-    } else if (format === 12) {
-      getLong(data, start + offset + 4);
-      var groups = getLong(data, start + offset + 12);
-      p = start + offset + 16;
-      ranges = [];
+    return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
+  }
 
-      for (i = 0; i < groups; i++) {
-        ranges.push({
-          start: getLong(data, p),
-          end: getLong(data, p + 4),
-          idDelta: getLong(data, p + 8) - getLong(data, p)
-        });
-        p += 12;
+}
+
+exports.FontRendererFactory = FontRendererFactory;
+
+/***/ }),
+/* 45 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.GlyfTable = void 0;
+const ON_CURVE_POINT = 1 << 0;
+const X_SHORT_VECTOR = 1 << 1;
+const Y_SHORT_VECTOR = 1 << 2;
+const REPEAT_FLAG = 1 << 3;
+const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4;
+const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5;
+const OVERLAP_SIMPLE = 1 << 6;
+const ARG_1_AND_2_ARE_WORDS = 1 << 0;
+const ARGS_ARE_XY_VALUES = 1 << 1;
+const WE_HAVE_A_SCALE = 1 << 3;
+const MORE_COMPONENTS = 1 << 5;
+const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
+const WE_HAVE_A_TWO_BY_TWO = 1 << 7;
+const WE_HAVE_INSTRUCTIONS = 1 << 8;
+
+class GlyfTable {
+  constructor({
+    glyfTable,
+    isGlyphLocationsLong,
+    locaTable,
+    numGlyphs
+  }) {
+    this.glyphs = [];
+    const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength);
+    const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength);
+    const offsetSize = isGlyphLocationsLong ? 4 : 2;
+    let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0);
+    let pos = 0;
+
+    for (let i = 0; i < numGlyphs; i++) {
+      pos += offsetSize;
+      const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos);
+
+      if (next === prev) {
+        this.glyphs.push(new Glyph({}));
+        continue;
       }
 
-      return ranges;
+      const glyph = Glyph.parse(prev, glyf);
+      this.glyphs.push(glyph);
+      prev = next;
     }
+  }
 
-    throw new _util.FormatError(`unsupported cmap: ${format}`);
+  getSize() {
+    return this.glyphs.reduce((a, g) => {
+      const size = g.getSize();
+      return a + (size + 3 & ~3);
+    }, 0);
   }
 
-  function parseCff(data, start, end, seacAnalysisEnabled) {
-    var properties = {};
-    var parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, 
seacAnalysisEnabled);
-    var cff = parser.parse();
+  write() {
+    const totalSize = this.getSize();
+    const glyfTable = new DataView(new ArrayBuffer(totalSize));
+    const isLocationLong = totalSize > 0x1fffe;
+    const offsetSize = isLocationLong ? 4 : 2;
+    const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize));
+
+    if (isLocationLong) {
+      locaTable.setUint32(0, 0);
+    } else {
+      locaTable.setUint16(0, 0);
+    }
+
+    let pos = 0;
+    let locaIndex = 0;
+
+    for (const glyph of this.glyphs) {
+      pos += glyph.write(pos, glyfTable);
+      pos = pos + 3 & ~3;
+      locaIndex += offsetSize;
+
+      if (isLocationLong) {
+        locaTable.setUint32(locaIndex, pos);
+      } else {
+        locaTable.setUint16(locaIndex, pos >> 1);
+      }
+    }
+
     return {
-      glyphs: cff.charStrings.objects,
-      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && 
cff.topDict.privateDict.subrsIndex.objects,
-      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,
-      isCFFCIDFont: cff.isCIDFont,
-      fdSelect: cff.fdSelect,
-      fdArray: cff.fdArray
+      isLocationLong,
+      loca: new Uint8Array(locaTable.buffer),
+      glyf: new Uint8Array(glyfTable.buffer)
     };
   }
 
-  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
-    var itemSize, itemDecode;
+  scale(factors) {
+    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
+      this.glyphs[i].scale(factors[i]);
+    }
+  }
+
+}
 
-    if (isGlyphLocationsLong) {
-      itemSize = 4;
+exports.GlyfTable = GlyfTable;
 
-      itemDecode = function fontItemDecodeLong(data, offset) {
-        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
-      };
-    } else {
-      itemSize = 2;
+class Glyph {
+  constructor({
+    header = null,
+    simple = null,
+    composites = null
+  }) {
+    this.header = header;
+    this.simple = simple;
+    this.composites = composites;
+  }
 
-      itemDecode = function fontItemDecode(data, offset) {
-        return data[offset] << 9 | data[offset + 1] << 1;
-      };
+  static parse(pos, glyf) {
+    const [read, header] = GlyphHeader.parse(pos, glyf);
+    pos += read;
+
+    if (header.numberOfContours < 0) {
+      const composites = [];
+
+      while (true) {
+        const [n, composite] = CompositeGlyph.parse(pos, glyf);
+        pos += n;
+        composites.push(composite);
+
+        if (!(composite.flags & MORE_COMPONENTS)) {
+          break;
+        }
+      }
+
+      return new Glyph({
+        header,
+        composites
+      });
     }
 
-    var glyphs = [];
-    var startOffset = itemDecode(loca, 0);
+    const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours);
+    return new Glyph({
+      header,
+      simple
+    });
+  }
 
-    for (var j = itemSize; j < loca.length; j += itemSize) {
-      var endOffset = itemDecode(loca, j);
-      glyphs.push(glyf.subarray(startOffset, endOffset));
-      startOffset = endOffset;
+  getSize() {
+    if (!this.header) {
+      return 0;
     }
 
-    return glyphs;
+    const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0);
+    return this.header.getSize() + size;
   }
 
-  function lookupCmap(ranges, unicode) {
-    var code = unicode.codePointAt(0),
-        gid = 0;
-    var l = 0,
-        r = ranges.length - 1;
+  write(pos, buf) {
+    if (!this.header) {
+      return 0;
+    }
 
-    while (l < r) {
-      var c = l + r + 1 >> 1;
+    const spos = pos;
+    pos += this.header.write(pos, buf);
 
-      if (code < ranges[c].start) {
-        r = c - 1;
-      } else {
-        l = c;
+    if (this.simple) {
+      pos += this.simple.write(pos, buf);
+    } else {
+      for (const composite of this.composites) {
+        pos += composite.write(pos, buf);
       }
     }
 
-    if (ranges[l].start <= code && code <= ranges[l].end) {
-      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff;
+    return pos - spos;
+  }
+
+  scale(factor) {
+    if (!this.header) {
+      return;
     }
 
-    return {
-      charCode: code,
-      glyphId: gid
-    };
+    const xMiddle = (this.header.xMin + this.header.xMax) / 2;
+    this.header.scale(xMiddle, factor);
+
+    if (this.simple) {
+      this.simple.scale(xMiddle, factor);
+    } else {
+      for (const composite of this.composites) {
+        composite.scale(xMiddle, factor);
+      }
+    }
   }
 
-  function compileGlyf(code, cmds, font) {
-    function moveTo(x, y) {
-      cmds.push({
-        cmd: "moveTo",
-        args: [x, y]
-      });
+}
+
+class GlyphHeader {
+  constructor({
+    numberOfContours,
+    xMin,
+    yMin,
+    xMax,
+    yMax
+  }) {
+    this.numberOfContours = numberOfContours;
+    this.xMin = xMin;
+    this.yMin = yMin;
+    this.xMax = xMax;
+    this.yMax = yMax;
+  }
+
+  static parse(pos, glyf) {
+    return [10, new GlyphHeader({
+      numberOfContours: glyf.getInt16(pos),
+      xMin: glyf.getInt16(pos + 2),
+      yMin: glyf.getInt16(pos + 4),
+      xMax: glyf.getInt16(pos + 6),
+      yMax: glyf.getInt16(pos + 8)
+    })];
+  }
+
+  getSize() {
+    return 10;
+  }
+
+  write(pos, buf) {
+    buf.setInt16(pos, this.numberOfContours);
+    buf.setInt16(pos + 2, this.xMin);
+    buf.setInt16(pos + 4, this.yMin);
+    buf.setInt16(pos + 6, this.xMax);
+    buf.setInt16(pos + 8, this.yMax);
+    return 10;
+  }
+
+  scale(x, factor) {
+    this.xMin = Math.round(x + (this.xMin - x) * factor);
+    this.xMax = Math.round(x + (this.xMax - x) * factor);
+  }
+
+}
+
+class Contour {
+  constructor({
+    flags,
+    xCoordinates,
+    yCoordinates
+  }) {
+    this.xCoordinates = xCoordinates;
+    this.yCoordinates = yCoordinates;
+    this.flags = flags;
+  }
+
+}
+
+class SimpleGlyph {
+  constructor({
+    contours,
+    instructions
+  }) {
+    this.contours = contours;
+    this.instructions = instructions;
+  }
+
+  static parse(pos, glyf, numberOfContours) {
+    const endPtsOfContours = [];
+
+    for (let i = 0; i < numberOfContours; i++) {
+      const endPt = glyf.getUint16(pos);
+      pos += 2;
+      endPtsOfContours.push(endPt);
     }
 
-    function lineTo(x, y) {
-      cmds.push({
-        cmd: "lineTo",
-        args: [x, y]
-      });
+    const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1;
+    const instructionLength = glyf.getUint16(pos);
+    pos += 2;
+    const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
+    pos += instructionLength;
+    const flags = [];
+
+    for (let i = 0; i < numberOfPt; pos++, i++) {
+      let flag = glyf.getUint8(pos);
+      flags.push(flag);
+
+      if (flag & REPEAT_FLAG) {
+        const count = glyf.getUint8(++pos);
+        flag ^= REPEAT_FLAG;
+
+        for (let m = 0; m < count; m++) {
+          flags.push(flag);
+        }
+
+        i += count;
+      }
     }
 
-    function quadraticCurveTo(xa, ya, x, y) {
-      cmds.push({
-        cmd: "quadraticCurveTo",
-        args: [xa, ya, x, y]
-      });
+    const allXCoordinates = [];
+    let xCoordinates = [];
+    let yCoordinates = [];
+    let pointFlags = [];
+    const contours = [];
+    let endPtsOfContoursIndex = 0;
+    let lastCoordinate = 0;
+
+    for (let i = 0; i < numberOfPt; i++) {
+      const flag = flags[i];
+
+      if (flag & X_SHORT_VECTOR) {
+        const x = glyf.getUint8(pos++);
+        lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x;
+        xCoordinates.push(lastCoordinate);
+      } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) {
+        xCoordinates.push(lastCoordinate);
+      } else {
+        lastCoordinate += glyf.getInt16(pos);
+        pos += 2;
+        xCoordinates.push(lastCoordinate);
+      }
+
+      if (endPtsOfContours[endPtsOfContoursIndex] === i) {
+        endPtsOfContoursIndex++;
+        allXCoordinates.push(xCoordinates);
+        xCoordinates = [];
+      }
     }
 
-    var i = 0;
-    var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;
-    var flags;
-    var x = 0,
-        y = 0;
-    i += 10;
+    lastCoordinate = 0;
+    endPtsOfContoursIndex = 0;
 
-    if (numberOfContours < 0) {
-      do {
-        flags = code[i] << 8 | code[i + 1];
-        var glyphIndex = code[i + 2] << 8 | code[i + 3];
-        i += 4;
-        var arg1, arg2;
+    for (let i = 0; i < numberOfPt; i++) {
+      const flag = flags[i];
 
-        if (flags & 0x01) {
-          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;
-          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;
-          i += 4;
-        } else {
-          arg1 = code[i++];
-          arg2 = code[i++];
+      if (flag & Y_SHORT_VECTOR) {
+        const y = glyf.getUint8(pos++);
+        lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y;
+        yCoordinates.push(lastCoordinate);
+      } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) {
+        yCoordinates.push(lastCoordinate);
+      } else {
+        lastCoordinate += glyf.getInt16(pos);
+        pos += 2;
+        yCoordinates.push(lastCoordinate);
+      }
+
+      pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE);
+
+      if (endPtsOfContours[endPtsOfContoursIndex] === i) {
+        xCoordinates = allXCoordinates[endPtsOfContoursIndex];
+        endPtsOfContoursIndex++;
+        contours.push(new Contour({
+          flags: pointFlags,
+          xCoordinates,
+          yCoordinates
+        }));
+        yCoordinates = [];
+        pointFlags = [];
+      }
+    }
+
+    return new SimpleGlyph({
+      contours,
+      instructions
+    });
+  }
+
+  getSize() {
+    let size = this.contours.length * 2 + 2 + this.instructions.length;
+    let lastX = 0;
+    let lastY = 0;
+
+    for (const contour of this.contours) {
+      size += contour.flags.length;
+
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        const x = contour.xCoordinates[i];
+        const y = contour.yCoordinates[i];
+        let abs = Math.abs(x - lastX);
+
+        if (abs > 255) {
+          size += 2;
+        } else if (abs > 0) {
+          size += 1;
+        }
+
+        lastX = x;
+        abs = Math.abs(y - lastY);
+
+        if (abs > 255) {
+          size += 2;
+        } else if (abs > 0) {
+          size += 1;
         }
 
-        if (flags & 0x02) {
-          x = arg1;
-          y = arg2;
+        lastY = y;
+      }
+    }
+
+    return size;
+  }
+
+  write(pos, buf) {
+    const spos = pos;
+    const xCoordinates = [];
+    const yCoordinates = [];
+    const flags = [];
+    let lastX = 0;
+    let lastY = 0;
+
+    for (const contour of this.contours) {
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        let flag = contour.flags[i];
+        const x = contour.xCoordinates[i];
+        let delta = x - lastX;
+
+        if (delta === 0) {
+          flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR;
+          xCoordinates.push(0);
         } else {
-          x = 0;
-          y = 0;
+          const abs = Math.abs(delta);
+
+          if (abs <= 255) {
+            flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR;
+            xCoordinates.push(abs);
+          } else {
+            xCoordinates.push(delta);
+          }
         }
 
-        var scaleX = 1,
-            scaleY = 1,
-            scale01 = 0,
-            scale10 = 0;
+        lastX = x;
+        const y = contour.yCoordinates[i];
+        delta = y - lastY;
 
-        if (flags & 0x08) {
-          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
-          i += 2;
-        } else if (flags & 0x40) {
-          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
-          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
-          i += 4;
-        } else if (flags & 0x80) {
-          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
-          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
-          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;
-          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;
-          i += 8;
+        if (delta === 0) {
+          flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR;
+          yCoordinates.push(0);
+        } else {
+          const abs = Math.abs(delta);
+
+          if (abs <= 255) {
+            flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR;
+            yCoordinates.push(abs);
+          } else {
+            yCoordinates.push(delta);
+          }
         }
 
-        var subglyph = font.glyphs[glyphIndex];
+        lastY = y;
+        flags.push(flag);
+      }
+
+      buf.setUint16(pos, xCoordinates.length - 1);
+      pos += 2;
+    }
+
+    buf.setUint16(pos, this.instructions.length);
+    pos += 2;
+
+    if (this.instructions.length) {
+      new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
+      pos += this.instructions.length;
+    }
+
+    for (const flag of flags) {
+      buf.setUint8(pos++, flag);
+    }
+
+    for (let i = 0, ii = xCoordinates.length; i < ii; i++) {
+      const x = xCoordinates[i];
+      const flag = flags[i];
+
+      if (flag & X_SHORT_VECTOR) {
+        buf.setUint8(pos++, x);
+      } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) {
+        buf.setInt16(pos, x);
+        pos += 2;
+      }
+    }
+
+    for (let i = 0, ii = yCoordinates.length; i < ii; i++) {
+      const y = yCoordinates[i];
+      const flag = flags[i];
+
+      if (flag & Y_SHORT_VECTOR) {
+        buf.setUint8(pos++, y);
+      } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) {
+        buf.setInt16(pos, y);
+        pos += 2;
+      }
+    }
+
+    return pos - spos;
+  }
+
+  scale(x, factor) {
+    for (const contour of this.contours) {
+      if (contour.xCoordinates.length === 0) {
+        continue;
+      }
+
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor);
+      }
+    }
+  }
+
+}
+
+class CompositeGlyph {
+  constructor({
+    flags,
+    glyphIndex,
+    argument1,
+    argument2,
+    transf,
+    instructions
+  }) {
+    this.flags = flags;
+    this.glyphIndex = glyphIndex;
+    this.argument1 = argument1;
+    this.argument2 = argument2;
+    this.transf = transf;
+    this.instructions = instructions;
+  }
+
+  static parse(pos, glyf) {
+    const spos = pos;
+    const transf = [];
+    let flags = glyf.getUint16(pos);
+    const glyphIndex = glyf.getUint16(pos + 2);
+    pos += 4;
+    let argument1, argument2;
+
+    if (flags & ARG_1_AND_2_ARE_WORDS) {
+      if (flags & ARGS_ARE_XY_VALUES) {
+        argument1 = glyf.getInt16(pos);
+        argument2 = glyf.getInt16(pos + 2);
+      } else {
+        argument1 = glyf.getUint16(pos);
+        argument2 = glyf.getUint16(pos + 2);
+      }
 
-        if (subglyph) {
-          cmds.push({
-            cmd: "save"
-          });
-          cmds.push({
-            cmd: "transform",
-            args: [scaleX, scale01, scale10, scaleY, x, y]
-          });
-          compileGlyf(subglyph, cmds, font);
-          cmds.push({
-            cmd: "restore"
-          });
-        }
-      } while (flags & 0x20);
+      pos += 4;
+      flags ^= ARG_1_AND_2_ARE_WORDS;
     } else {
-      var endPtsOfContours = [];
-      var j, jj;
+      argument1 = glyf.getUint8(pos);
+      argument2 = glyf.getUint8(pos + 1);
 
-      for (j = 0; j < numberOfContours; j++) {
-        endPtsOfContours.push(code[i] << 8 | code[i + 1]);
-        i += 2;
+      if (flags & ARGS_ARE_XY_VALUES) {
+        const abs1 = argument1 & 0x7f;
+        argument1 = argument1 & 0x80 ? -abs1 : abs1;
+        const abs2 = argument2 & 0x7f;
+        argument2 = argument2 & 0x80 ? -abs2 : abs2;
       }
 
-      var instructionLength = code[i] << 8 | code[i + 1];
-      i += 2 + instructionLength;
-      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
-      var points = [];
+      pos += 2;
+    }
 
-      while (points.length < numberOfPoints) {
-        flags = code[i++];
-        var repeat = 1;
+    if (flags & WE_HAVE_A_SCALE) {
+      transf.push(glyf.getUint16(pos));
+      pos += 2;
+    } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+      transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2));
+      pos += 4;
+    } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+      transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos 
+ 6));
+      pos += 8;
+    }
 
-        if (flags & 0x08) {
-          repeat += code[i++];
-        }
+    let instructions = null;
 
-        while (repeat-- > 0) {
-          points.push({
-            flags
-          });
-        }
-      }
+    if (flags & WE_HAVE_INSTRUCTIONS) {
+      const instructionLength = glyf.getUint16(pos);
+      pos += 2;
+      instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
+      pos += instructionLength;
+    }
 
-      for (j = 0; j < numberOfPoints; j++) {
-        switch (points[j].flags & 0x12) {
-          case 0x00:
-            x += (code[i] << 24 | code[i + 1] << 16) >> 16;
-            i += 2;
-            break;
+    return [pos - spos, new CompositeGlyph({
+      flags,
+      glyphIndex,
+      argument1,
+      argument2,
+      transf,
+      instructions
+    })];
+  }
 
-          case 0x02:
-            x -= code[i++];
-            break;
+  getSize() {
+    let size = 2 + 2 + this.transf.length * 2;
 
-          case 0x12:
-            x += code[i++];
-            break;
-        }
+    if (this.flags & WE_HAVE_INSTRUCTIONS) {
+      size += 2 + this.instructions.length;
+    }
 
-        points[j].x = x;
-      }
+    size += 2;
 
-      for (j = 0; j < numberOfPoints; j++) {
-        switch (points[j].flags & 0x24) {
-          case 0x00:
-            y += (code[i] << 24 | code[i + 1] << 16) >> 16;
-            i += 2;
-            break;
+    if (this.flags & 2) {
+      if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 
127)) {
+        size += 2;
+      }
+    } else {
+      if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
+        size += 2;
+      }
+    }
 
-          case 0x04:
-            y -= code[i++];
-            break;
+    return size;
+  }
 
-          case 0x24:
-            y += code[i++];
-            break;
-        }
+  write(pos, buf) {
+    const spos = pos;
 
-        points[j].y = y;
+    if (this.flags & ARGS_ARE_XY_VALUES) {
+      if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 
127)) {
+        this.flags |= ARG_1_AND_2_ARE_WORDS;
       }
+    } else {
+      if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
+        this.flags |= ARG_1_AND_2_ARE_WORDS;
+      }
+    }
 
-      var startPoint = 0;
-
-      for (i = 0; i < numberOfContours; i++) {
-        var endPoint = endPtsOfContours[i];
-        var contour = points.slice(startPoint, endPoint + 1);
+    buf.setUint16(pos, this.flags);
+    buf.setUint16(pos + 2, this.glyphIndex);
+    pos += 4;
 
-        if (contour[0].flags & 1) {
-          contour.push(contour[0]);
-        } else if (contour[contour.length - 1].flags & 1) {
-          contour.unshift(contour[contour.length - 1]);
-        } else {
-          var p = {
-            flags: 1,
-            x: (contour[0].x + contour[contour.length - 1].x) / 2,
-            y: (contour[0].y + contour[contour.length - 1].y) / 2
-          };
-          contour.unshift(p);
-          contour.push(p);
-        }
+    if (this.flags & ARG_1_AND_2_ARE_WORDS) {
+      if (this.flags & ARGS_ARE_XY_VALUES) {
+        buf.setInt16(pos, this.argument1);
+        buf.setInt16(pos + 2, this.argument2);
+      } else {
+        buf.setUint16(pos, this.argument1);
+        buf.setUint16(pos + 2, this.argument2);
+      }
 
-        moveTo(contour[0].x, contour[0].y);
+      pos += 4;
+    } else {
+      buf.setUint8(pos, this.argument1);
+      buf.setUint8(pos + 1, this.argument2);
+      pos += 2;
+    }
 
-        for (j = 1, jj = contour.length; j < jj; j++) {
-          if (contour[j].flags & 1) {
-            lineTo(contour[j].x, contour[j].y);
-          } else if (contour[j + 1].flags & 1) {
-            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
-            j++;
-          } else {
-            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, 
(contour[j].y + contour[j + 1].y) / 2);
-          }
-        }
+    if (this.flags & WE_HAVE_INSTRUCTIONS) {
+      buf.setUint16(pos, this.instructions.length);
+      pos += 2;
 
-        startPoint = endPoint + 1;
+      if (this.instructions.length) {
+        new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
+        pos += this.instructions.length;
       }
     }
+
+    return pos - spos;
   }
 
-  function compileCharString(charStringCode, cmds, font, glyphId) {
-    function moveTo(x, y) {
-      cmds.push({
-        cmd: "moveTo",
-        args: [x, y]
-      });
-    }
+  scale(x, factor) {}
 
-    function lineTo(x, y) {
-      cmds.push({
-        cmd: "lineTo",
-        args: [x, y]
-      });
-    }
+}
 
-    function bezierCurveTo(x1, y1, x2, y2, x, y) {
-      cmds.push({
-        cmd: "bezierCurveTo",
-        args: [x1, y1, x2, y2, x, y]
-      });
-    }
+/***/ }),
+/* 46 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-    var stack = [];
-    var x = 0,
-        y = 0;
-    var stems = 0;
 
-    function parse(code) {
-      var i = 0;
 
-      while (i < code.length) {
-        var stackClean = false;
-        var v = code[i++];
-        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.OpenTypeFileBuilder = void 0;
 
-        switch (v) {
-          case 1:
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
+var _core_utils = __w_pdfjs_require__(9);
 
-          case 3:
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
+var _util = __w_pdfjs_require__(2);
 
-          case 4:
-            y += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
+function writeInt16(dest, offset, num) {
+  dest[offset] = num >> 8 & 0xff;
+  dest[offset + 1] = num & 0xff;
+}
 
-          case 5:
-            while (stack.length > 0) {
-              x += stack.shift();
-              y += stack.shift();
-              lineTo(x, y);
-            }
+function writeInt32(dest, offset, num) {
+  dest[offset] = num >> 24 & 0xff;
+  dest[offset + 1] = num >> 16 & 0xff;
+  dest[offset + 2] = num >> 8 & 0xff;
+  dest[offset + 3] = num & 0xff;
+}
 
-            break;
+function writeData(dest, offset, data) {
+  if (data instanceof Uint8Array) {
+    dest.set(data, offset);
+  } else if (typeof data === "string") {
+    for (let i = 0, ii = data.length; i < ii; i++) {
+      dest[offset++] = data.charCodeAt(i) & 0xff;
+    }
+  } else {
+    for (let i = 0, ii = data.length; i < ii; i++) {
+      dest[offset++] = data[i] & 0xff;
+    }
+  }
+}
 
-          case 6:
-            while (stack.length > 0) {
-              x += stack.shift();
-              lineTo(x, y);
+const OTF_HEADER_SIZE = 12;
+const OTF_TABLE_ENTRY_SIZE = 16;
 
-              if (stack.length === 0) {
-                break;
-              }
+class OpenTypeFileBuilder {
+  constructor(sfnt) {
+    this.sfnt = sfnt;
+    this.tables = Object.create(null);
+  }
 
-              y += stack.shift();
-              lineTo(x, y);
-            }
+  static getSearchParams(entriesCount, entrySize) {
+    let maxPower2 = 1,
+        log2 = 0;
 
-            break;
+    while ((maxPower2 ^ entriesCount) > maxPower2) {
+      maxPower2 <<= 1;
+      log2++;
+    }
 
-          case 7:
-            while (stack.length > 0) {
-              y += stack.shift();
-              lineTo(x, y);
+    const searchRange = maxPower2 * entrySize;
+    return {
+      range: searchRange,
+      entry: log2,
+      rangeShift: entrySize * entriesCount - searchRange
+    };
+  }
 
-              if (stack.length === 0) {
-                break;
-              }
+  toArray() {
+    let sfnt = this.sfnt;
+    const tables = this.tables;
+    const tablesNames = Object.keys(tables);
+    tablesNames.sort();
+    const numTables = tablesNames.length;
+    let i, j, jj, table, tableName;
+    let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
+    const tableOffsets = [offset];
 
-              x += stack.shift();
-              lineTo(x, y);
-            }
+    for (i = 0; i < numTables; i++) {
+      table = tables[tablesNames[i]];
+      const paddedLength = (table.length + 3 & ~3) >>> 0;
+      offset += paddedLength;
+      tableOffsets.push(offset);
+    }
 
-            break;
+    const file = new Uint8Array(offset);
 
-          case 8:
-            while (stack.length > 0) {
-              xa = x + stack.shift();
-              ya = y + stack.shift();
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+    for (i = 0; i < numTables; i++) {
+      table = tables[tablesNames[i]];
+      writeData(file, tableOffsets[i], table);
+    }
 
-            break;
+    if (sfnt === "true") {
+      sfnt = (0, _util.string32)(0x00010000);
+    }
 
-          case 10:
-            n = stack.pop();
-            subrCode = null;
+    file[0] = sfnt.charCodeAt(0) & 0xff;
+    file[1] = sfnt.charCodeAt(1) & 0xff;
+    file[2] = sfnt.charCodeAt(2) & 0xff;
+    file[3] = sfnt.charCodeAt(3) & 0xff;
+    writeInt16(file, 4, numTables);
+    const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
+    writeInt16(file, 6, searchParams.range);
+    writeInt16(file, 8, searchParams.entry);
+    writeInt16(file, 10, searchParams.rangeShift);
+    offset = OTF_HEADER_SIZE;
 
-            if (font.isCFFCIDFont) {
-              const fdIndex = font.fdSelect.getFDIndex(glyphId);
+    for (i = 0; i < numTables; i++) {
+      tableName = tablesNames[i];
+      file[offset] = tableName.charCodeAt(0) & 0xff;
+      file[offset + 1] = tableName.charCodeAt(1) & 0xff;
+      file[offset + 2] = tableName.charCodeAt(2) & 0xff;
+      file[offset + 3] = tableName.charCodeAt(3) & 0xff;
+      let checksum = 0;
 
-              if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
-                const fontDict = font.fdArray[fdIndex];
-                let subrs;
+      for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
+        const quad = (0, _core_utils.readUint32)(file, j);
+        checksum = checksum + quad >>> 0;
+      }
 
-                if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {
-                  subrs = fontDict.privateDict.subrsIndex.objects;
-                }
+      writeInt32(file, offset + 4, checksum);
+      writeInt32(file, offset + 8, tableOffsets[i]);
+      writeInt32(file, offset + 12, tables[tableName].length);
+      offset += OTF_TABLE_ENTRY_SIZE;
+    }
 
-                if (subrs) {
-                  n += getSubroutineBias(subrs);
-                  subrCode = subrs[n];
-                }
-              } else {
-                (0, _util.warn)("Invalid fd index for glyph index.");
-              }
-            } else {
-              subrCode = font.subrs[n + font.subrsBias];
-            }
+    return file;
+  }
 
-            if (subrCode) {
-              parse(subrCode);
-            }
+  addTable(tag, data) {
+    if (tag in this.tables) {
+      throw new Error("Table " + tag + " already exists");
+    }
 
-            break;
+    this.tables[tag] = data;
+  }
 
-          case 11:
-            return;
+}
 
-          case 12:
-            v = code[i++];
-
-            switch (v) {
-              case 34:
-                xa = x + stack.shift();
-                xb = xa + stack.shift();
-                y1 = y + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y, xb, y1, x, y1);
-                xa = x + stack.shift();
-                xb = xa + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y1, xb, y, x, y);
-                break;
+exports.OpenTypeFileBuilder = OpenTypeFileBuilder;
 
-              case 35:
-                xa = x + stack.shift();
-                ya = y + stack.shift();
-                xb = xa + stack.shift();
-                yb = ya + stack.shift();
-                x = xb + stack.shift();
-                y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                xa = x + stack.shift();
-                ya = y + stack.shift();
-                xb = xa + stack.shift();
-                yb = ya + stack.shift();
-                x = xb + stack.shift();
-                y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                stack.pop();
-                break;
+/***/ }),
+/* 47 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-              case 36:
-                xa = x + stack.shift();
-                y1 = y + stack.shift();
-                xb = xa + stack.shift();
-                y2 = y1 + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y1, xb, y2, x, y2);
-                xa = x + stack.shift();
-                xb = xa + stack.shift();
-                y3 = y2 + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y2, xb, y3, x, y);
-                break;
 
-              case 37:
-                var x0 = x,
-                    y0 = y;
-                xa = x + stack.shift();
-                ya = y + stack.shift();
-                xb = xa + stack.shift();
-                yb = ya + stack.shift();
-                x = xb + stack.shift();
-                y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                xa = x + stack.shift();
-                ya = y + stack.shift();
-                xb = xa + stack.shift();
-                yb = ya + stack.shift();
-                x = xb;
-                y = yb;
-
-                if (Math.abs(x - x0) > Math.abs(y - y0)) {
-                  x += stack.shift();
-                } else {
-                  y += stack.shift();
-                }
 
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                break;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Type1Font = void 0;
 
-              default:
-                throw new _util.FormatError(`unknown operator: 12 ${v}`);
-            }
+var _cff_parser = __w_pdfjs_require__(35);
 
-            break;
+var _fonts_utils = __w_pdfjs_require__(38);
 
-          case 14:
-            if (stack.length >= 4) {
-              var achar = stack.pop();
-              var bchar = stack.pop();
-              y = stack.pop();
-              x = stack.pop();
-              cmds.push({
-                cmd: "save"
-              });
-              cmds.push({
-                cmd: "translate",
-                args: [x, y]
-              });
-              var cmap = lookupCmap(font.cmap, 
String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));
-              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
-              cmds.push({
-                cmd: "restore"
-              });
-              cmap = lookupCmap(font.cmap, 
String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));
-              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
-            }
+var _core_utils = __w_pdfjs_require__(9);
 
-            return;
+var _stream = __w_pdfjs_require__(10);
 
-          case 18:
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
+var _type1_parser = __w_pdfjs_require__(48);
 
-          case 19:
-            stems += stack.length >> 1;
-            i += stems + 7 >> 3;
-            stackClean = true;
-            break;
+var _util = __w_pdfjs_require__(2);
 
-          case 20:
-            stems += stack.length >> 1;
-            i += stems + 7 >> 3;
-            stackClean = true;
-            break;
+function findBlock(streamBytes, signature, startIndex) {
+  const streamBytesLength = streamBytes.length;
+  const signatureLength = signature.length;
+  const scanLength = streamBytesLength - signatureLength;
+  let i = startIndex,
+      found = false;
 
-          case 21:
-            y += stack.pop();
-            x += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
+  while (i < scanLength) {
+    let j = 0;
 
-          case 22:
-            x += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
+    while (j < signatureLength && streamBytes[i + j] === signature[j]) {
+      j++;
+    }
 
-          case 23:
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
+    if (j >= signatureLength) {
+      i += j;
 
-          case 24:
-            while (stack.length > 2) {
-              xa = x + stack.shift();
-              ya = y + stack.shift();
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+      while (i < streamBytesLength && (0, _core_utils.isWhiteSpace)(streamBytes[i])) {
+        i++;
+      }
 
-            x += stack.shift();
-            y += stack.shift();
-            lineTo(x, y);
-            break;
+      found = true;
+      break;
+    }
 
-          case 25:
-            while (stack.length > 6) {
-              x += stack.shift();
-              y += stack.shift();
-              lineTo(x, y);
-            }
+    i++;
+  }
 
-            xa = x + stack.shift();
-            ya = y + stack.shift();
-            xb = xa + stack.shift();
-            yb = ya + stack.shift();
-            x = xb + stack.shift();
-            y = yb + stack.shift();
-            bezierCurveTo(xa, ya, xb, yb, x, y);
-            break;
+  return {
+    found,
+    length: i
+  };
+}
 
-          case 26:
-            if (stack.length % 2) {
-              x += stack.shift();
-            }
+function getHeaderBlock(stream, suggestedLength) {
+  const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
+  const streamStartPos = stream.pos;
+  let headerBytes, headerBytesLength, block;
 
-            while (stack.length > 0) {
-              xa = x;
-              ya = y + stack.shift();
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb;
-              y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+  try {
+    headerBytes = stream.getBytes(suggestedLength);
+    headerBytesLength = headerBytes.length;
+  } catch (ex) {}
 
-            break;
+  if (headerBytesLength === suggestedLength) {
+    block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);
 
-          case 27:
-            if (stack.length % 2) {
-              y += stack.shift();
-            }
+    if (block.found && block.length === suggestedLength) {
+      return {
+        stream: new _stream.Stream(headerBytes),
+        length: suggestedLength
+      };
+    }
+  }
 
-            while (stack.length > 0) {
-              xa = x + stack.shift();
-              ya = y;
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb;
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+  (0, _util.warn)('Invalid "Length1" property in Type1 font -- trying to recover.');
+  stream.pos = streamStartPos;
+  const SCAN_BLOCK_LENGTH = 2048;
+  let actualLength;
 
-            break;
+  while (true) {
+    const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+    block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);
 
-          case 28:
-            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);
-            i += 2;
-            break;
+    if (block.length === 0) {
+      break;
+    }
 
-          case 29:
-            n = stack.pop() + font.gsubrsBias;
-            subrCode = font.gsubrs[n];
+    stream.pos += block.length;
 
-            if (subrCode) {
-              parse(subrCode);
-            }
+    if (block.found) {
+      actualLength = stream.pos - streamStartPos;
+      break;
+    }
+  }
 
-            break;
+  stream.pos = streamStartPos;
 
-          case 30:
-            while (stack.length > 0) {
-              xa = x;
-              ya = y + stack.shift();
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
+  if (actualLength) {
+    return {
+      stream: new _stream.Stream(stream.getBytes(actualLength)),
+      length: actualLength
+    };
+  }
 
-              if (stack.length === 0) {
-                break;
-              }
+  (0, _util.warn)('Unable to recover "Length1" property in Type1 font -- using as is.');
+  return {
+    stream: new _stream.Stream(stream.getBytes(suggestedLength)),
+    length: suggestedLength
+  };
+}
 
-              xa = x + stack.shift();
-              ya = y;
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              y = yb + stack.shift();
-              x = xb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+function getEexecBlock(stream, suggestedLength) {
+  const eexecBytes = stream.getBytes();
+  return {
+    stream: new _stream.Stream(eexecBytes),
+    length: eexecBytes.length
+  };
+}
 
-            break;
+class Type1Font {
+  constructor(name, file, properties) {
+    const PFB_HEADER_SIZE = 6;
+    let headerBlockLength = properties.length1;
+    let eexecBlockLength = properties.length2;
+    let pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
+    const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
 
-          case 31:
-            while (stack.length > 0) {
-              xa = x + stack.shift();
-              ya = y;
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              y = yb + stack.shift();
-              x = xb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
+    if (pfbHeaderPresent) {
+      file.skip(PFB_HEADER_SIZE);
+      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
 
-              if (stack.length === 0) {
-                break;
-              }
+    const headerBlock = getHeaderBlock(file, headerBlockLength);
+    const headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, 
_fonts_utils.SEAC_ANALYSIS_ENABLED);
+    headerBlockParser.extractFontHeader(properties);
 
-              xa = x;
-              ya = y + stack.shift();
-              xb = xa + stack.shift();
-              yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
+    if (pfbHeaderPresent) {
+      pfbHeader = file.getBytes(PFB_HEADER_SIZE);
+      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
 
-            break;
+    const eexecBlock = getEexecBlock(file, eexecBlockLength);
+    const eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, 
_fonts_utils.SEAC_ANALYSIS_ENABLED);
+    const data = eexecBlockParser.extractFontProgram(properties);
 
-          default:
-            if (v < 32) {
-              throw new _util.FormatError(`unknown operator: ${v}`);
-            }
+    for (const key in data.properties) {
+      properties[key] = data.properties[key];
+    }
 
-            if (v < 247) {
-              stack.push(v - 139);
-            } else if (v < 251) {
-              stack.push((v - 247) * 256 + code[i++] + 108);
-            } else if (v < 255) {
-              stack.push(-(v - 251) * 256 - code[i++] - 108);
-            } else {
-              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);
-              i += 4;
-            }
+    const charstrings = data.charstrings;
+    const type2Charstrings = this.getType2Charstrings(charstrings);
+    const subrs = this.getType2Subrs(data.subrs);
+    this.charstrings = charstrings;
+    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
+    this.seacs = this.getSeacs(data.charstrings);
+  }
 
-            break;
-        }
+  get numGlyphs() {
+    return this.charstrings.length + 1;
+  }
 
-        if (stackClean) {
-          stack.length = 0;
-        }
-      }
+  getCharset() {
+    const charset = [".notdef"];
+    const charstrings = this.charstrings;
+
+    for (let glyphId = 0; glyphId < charstrings.length; glyphId++) {
+      charset.push(charstrings[glyphId].glyphName);
     }
 
-    parse(charStringCode);
+    return charset;
   }
 
-  const NOOP = [];
+  getGlyphMapping(properties) {
+    const charstrings = this.charstrings;
+
+    if (properties.composite) {
+      const charCodeToGlyphId = Object.create(null);
 
-  class CompiledFont {
-    constructor(fontMatrix) {
-      if (this.constructor === CompiledFont) {
-        (0, _util.unreachable)("Cannot initialize CompiledFont.");
+      for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) {
+        const charCode = properties.cMap.charCodeOf(glyphId);
+        charCodeToGlyphId[charCode] = glyphId + 1;
       }
 
-      this.fontMatrix = fontMatrix;
-      this.compiledGlyphs = Object.create(null);
-      this.compiledCharCodeToGlyphId = Object.create(null);
+      return charCodeToGlyphId;
     }
 
-    getPathJs(unicode) {
-      const cmap = lookupCmap(this.cmap, unicode);
-      let fn = this.compiledGlyphs[cmap.glyphId];
-
-      if (!fn) {
-        fn = this.compileGlyph(this.glyphs[cmap.glyphId], cmap.glyphId);
-        this.compiledGlyphs[cmap.glyphId] = fn;
-      }
-
-      if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {
-        this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;
-      }
+    const glyphNames = [".notdef"];
+    let builtInEncoding, glyphId;
 
-      return fn;
+    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
+      glyphNames.push(charstrings[glyphId].glyphName);
     }
 
-    compileGlyph(code, glyphId) {
-      if (!code || code.length === 0 || code[0] === 14) {
-        return NOOP;
-      }
+    const encoding = properties.builtInEncoding;
 
-      let fontMatrix = this.fontMatrix;
+    if (encoding) {
+      builtInEncoding = Object.create(null);
 
-      if (this.isCFFCIDFont) {
-        const fdIndex = this.fdSelect.getFDIndex(glyphId);
+      for (const charCode in encoding) {
+        glyphId = glyphNames.indexOf(encoding[charCode]);
 
-        if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
-          const fontDict = this.fdArray[fdIndex];
-          fontMatrix = fontDict.getByName("FontMatrix") || _util.FONT_IDENTITY_MATRIX;
-        } else {
-          (0, _util.warn)("Invalid fd index for glyph index.");
+        if (glyphId >= 0) {
+          builtInEncoding[charCode] = glyphId;
         }
       }
-
-      const cmds = [];
-      cmds.push({
-        cmd: "save"
-      });
-      cmds.push({
-        cmd: "transform",
-        args: fontMatrix.slice()
-      });
-      cmds.push({
-        cmd: "scale",
-        args: ["size", "-size"]
-      });
-      this.compileGlyphImpl(code, cmds, glyphId);
-      cmds.push({
-        cmd: "restore"
-      });
-      return cmds;
     }
 
-    compileGlyphImpl() {
-      (0, _util.unreachable)("Children classes should implement this.");
+    return (0, _fonts_utils.type1FontGlyphMapping)(properties, builtInEncoding, glyphNames);
+  }
+
+  hasGlyphId(id) {
+    if (id < 0 || id >= this.numGlyphs) {
+      return false;
     }
 
-    hasBuiltPath(unicode) {
-      const cmap = lookupCmap(this.cmap, unicode);
-      return this.compiledGlyphs[cmap.glyphId] !== undefined && 
this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;
+    if (id === 0) {
+      return true;
     }
 
+    const glyph = this.charstrings[id - 1];
+    return glyph.charstring.length > 0;
   }
 
-  class TrueTypeCompiled extends CompiledFont {
-    constructor(glyphs, cmap, fontMatrix) {
-      super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);
-      this.glyphs = glyphs;
-      this.cmap = cmap;
+  getSeacs(charstrings) {
+    const seacMap = [];
+
+    for (let i = 0, ii = charstrings.length; i < ii; i++) {
+      const charstring = charstrings[i];
+
+      if (charstring.seac) {
+        seacMap[i + 1] = charstring.seac;
+      }
     }
 
-    compileGlyphImpl(code, cmds) {
-      compileGlyf(code, cmds, this);
+    return seacMap;
+  }
+
+  getType2Charstrings(type1Charstrings) {
+    const type2Charstrings = [];
+
+    for (let i = 0, ii = type1Charstrings.length; i < ii; i++) {
+      type2Charstrings.push(type1Charstrings[i].charstring);
     }
 
+    return type2Charstrings;
   }
 
-  class Type2Compiled extends CompiledFont {
-    constructor(cffInfo, cmap, fontMatrix, glyphNameMap) {
-      super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);
-      this.glyphs = cffInfo.glyphs;
-      this.gsubrs = cffInfo.gsubrs || [];
-      this.subrs = cffInfo.subrs || [];
-      this.cmap = cmap;
-      this.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();
-      this.gsubrsBias = getSubroutineBias(this.gsubrs);
-      this.subrsBias = getSubroutineBias(this.subrs);
-      this.isCFFCIDFont = cffInfo.isCFFCIDFont;
-      this.fdSelect = cffInfo.fdSelect;
-      this.fdArray = cffInfo.fdArray;
+  getType2Subrs(type1Subrs) {
+    let bias = 0;
+    const count = type1Subrs.length;
+
+    if (count < 1133) {
+      bias = 107;
+    } else if (count < 33769) {
+      bias = 1131;
+    } else {
+      bias = 32768;
     }
 
-    compileGlyphImpl(code, cmds, glyphId) {
-      compileCharString(code, cmds, this, glyphId);
+    const type2Subrs = [];
+    let i;
+
+    for (i = 0; i < bias; i++) {
+      type2Subrs.push([0x0b]);
     }
 
-  }
+    for (i = 0; i < count; i++) {
+      type2Subrs.push(type1Subrs[i]);
+    }
+
+    return type2Subrs;
+  }
+
+  wrap(name, glyphs, charstrings, subrs, properties) {
+    const cff = new _cff_parser.CFF();
+    cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);
+    cff.names = [name];
+    const topDict = new _cff_parser.CFFTopDict();
+    topDict.setByName("version", 391);
+    topDict.setByName("Notice", 392);
+    topDict.setByName("FullName", 393);
+    topDict.setByName("FamilyName", 394);
+    topDict.setByName("Weight", 395);
+    topDict.setByName("Encoding", null);
+    topDict.setByName("FontMatrix", properties.fontMatrix);
+    topDict.setByName("FontBBox", properties.bbox);
+    topDict.setByName("charset", null);
+    topDict.setByName("CharStrings", null);
+    topDict.setByName("Private", null);
+    cff.topDict = topDict;
+    const strings = new _cff_parser.CFFStrings();
+    strings.add("Version 0.11");
+    strings.add("See original notice");
+    strings.add(name);
+    strings.add(name);
+    strings.add("Medium");
+    cff.strings = strings;
+    cff.globalSubrIndex = new _cff_parser.CFFIndex();
+    const count = glyphs.length;
+    const charsetArray = [".notdef"];
+    let i, ii;
 
-  return {
-    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {
-      var data = new Uint8Array(font.data);
-      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
-      var numTables = getUshort(data, 4);
-
-      for (var i = 0, p = 12; i < numTables; i++, p += 16) {
-        var tag = (0, _util.bytesToString)(data.subarray(p, p + 4));
-        var offset = getLong(data, p + 8);
-        var length = getLong(data, p + 12);
-
-        switch (tag) {
-          case "cmap":
-            cmap = parseCmap(data, offset, offset + length);
-            break;
+    for (i = 0; i < count; i++) {
+      const glyphName = charstrings[i].glyphName;
 
-          case "glyf":
-            glyf = data.subarray(offset, offset + length);
-            break;
+      const index = _cff_parser.CFFStandardStrings.indexOf(glyphName);
 
-          case "loca":
-            loca = data.subarray(offset, offset + length);
-            break;
+      if (index === -1) {
+        strings.add(glyphName);
+      }
 
-          case "head":
-            unitsPerEm = getUshort(data, offset + 18);
-            indexToLocFormat = getUshort(data, offset + 50);
-            break;
+      charsetArray.push(glyphName);
+    }
 
-          case "CFF ":
-            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
-            break;
-        }
+    cff.charset = new _cff_parser.CFFCharset(false, 0, charsetArray);
+    const charStringsIndex = new _cff_parser.CFFIndex();
+    charStringsIndex.add([0x8b, 0x0e]);
+
+    for (i = 0; i < count; i++) {
+      charStringsIndex.add(glyphs[i]);
+    }
+
+    cff.charStrings = charStringsIndex;
+    const privateDict = new _cff_parser.CFFPrivateDict();
+    privateDict.setByName("Subrs", null);
+    const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", 
"BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"];
+
+    for (i = 0, ii = fields.length; i < ii; i++) {
+      const field = fields[i];
+
+      if (!(field in properties.privateData)) {
+        continue;
       }
 
-      if (glyf) {
-        var fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
-        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+      const value = properties.privateData[field];
+
+      if (Array.isArray(value)) {
+        for (let j = value.length - 1; j > 0; j--) {
+          value[j] -= value[j - 1];
+        }
       }
 
-      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
+      privateDict.setByName(field, value);
     }
-  };
-}();
 
-exports.FontRendererFactory = FontRendererFactory;
+    cff.topDict.privateDict = privateDict;
+    const subrIndex = new _cff_parser.CFFIndex();
+
+    for (i = 0, ii = subrs.length; i < ii; i++) {
+      subrIndex.add(subrs[i]);
+    }
+
+    privateDict.subrsIndex = subrIndex;
+    const compiler = new _cff_parser.CFFCompiler(cff);
+    return compiler.compile();
+  }
+
+}
+
+exports.Type1Font = Type1Font;
 
 /***/ }),
-/* 38 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 48 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.Type1Parser = void 0;
 
-var _encodings = __w_pdfjs_require__(33);
+var _encodings = __w_pdfjs_require__(37);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
 
-var _stream = __w_pdfjs_require__(12);
+var _stream = __w_pdfjs_require__(10);
 
 var _util = __w_pdfjs_require__(2);
 
-var HINTING_ENABLED = false;
+const HINTING_ENABLED = false;
 
-var Type1CharString = function Type1CharStringClosure() {
-  var COMMAND_MAP = {
+const Type1CharString = function Type1CharStringClosure() {
+  const COMMAND_MAP = {
     hstem: [1],
     vstem: [3],
     vmoveto: [4],
@@ -39611,22 +43582,22 @@ var Type1CharString = function Type1CharStringClosure() {
     hvcurveto: [31]
   };
 
-  function Type1CharString() {
-    this.width = 0;
-    this.lsb = 0;
-    this.flexing = false;
-    this.output = [];
-    this.stack = [];
-  }
+  class Type1CharString {
+    constructor() {
+      this.width = 0;
+      this.lsb = 0;
+      this.flexing = false;
+      this.output = [];
+      this.stack = [];
+    }
 
-  Type1CharString.prototype = {
-    convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {
-      var count = encoded.length;
-      var error = false;
-      var wx, sbx, subrNumber;
+    convert(encoded, subrs, seacAnalysisEnabled) {
+      const count = encoded.length;
+      let error = false;
+      let wx, sbx, subrNumber;
 
-      for (var i = 0; i < count; i++) {
-        var value = encoded[i];
+      for (let i = 0; i < count; i++) {
+        let value = encoded[i];
 
         if (value < 32) {
           if (value === 12) {
@@ -39659,7 +43630,7 @@ var Type1CharString = function Type1CharStringClosure() {
                   break;
                 }
 
-                var dy = this.stack.pop();
+                const dy = this.stack.pop();
                 this.stack.push(0, dy);
                 break;
               }
@@ -39791,7 +43762,7 @@ var Type1CharString = function Type1CharStringClosure() {
 
               this.stack.pop();
               wx = this.stack.pop();
-              var sby = this.stack.pop();
+              const sby = this.stack.pop();
               sbx = this.stack.pop();
               this.lsb = sbx;
               this.width = wx;
@@ -39805,8 +43776,8 @@ var Type1CharString = function Type1CharStringClosure() {
                 break;
               }
 
-              var num2 = this.stack.pop();
-              var num1 = this.stack.pop();
+              const num2 = this.stack.pop();
+              const num1 = this.stack.pop();
               this.stack.push(num1 / num2);
               break;
 
@@ -39817,10 +43788,10 @@ var Type1CharString = function Type1CharStringClosure() {
               }
 
               subrNumber = this.stack.pop();
-              var numArgs = this.stack.pop();
+              const numArgs = this.stack.pop();
 
               if (subrNumber === 0 && numArgs === 3) {
-                var flexArgs = this.stack.splice(this.stack.length - 17, 17);
+                const flexArgs = this.stack.splice(this.stack.length - 17, 17);
                 this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], 
flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], 
flexArgs[13], flexArgs[14]);
                 error = this.executeCommand(13, COMMAND_MAP.flex, true);
                 this.flexing = false;
@@ -39849,7 +43820,7 @@ var Type1CharString = function Type1CharStringClosure() {
 
           continue;
         } else if (value <= 246) {
-          value = value - 139;
+          value -= 139;
         } else if (value <= 250) {
           value = (value - 247) * 256 + encoded[++i] + 108;
         } else if (value <= 254) {
@@ -39862,19 +43833,19 @@ var Type1CharString = function Type1CharStringClosure() {
       }
 
       return error;
-    },
+    }
 
     executeCommand(howManyArgs, command, keepStack) {
-      var stackLength = this.stack.length;
+      const stackLength = this.stack.length;
 
       if (howManyArgs > stackLength) {
         return true;
       }
 
-      var start = stackLength - howManyArgs;
+      const start = stackLength - howManyArgs;
 
-      for (var i = start; i < stackLength; i++) {
-        var value = this.stack[i];
+      for (let i = start; i < stackLength; i++) {
+        let value = this.stack[i];
 
         if (Number.isInteger(value)) {
           this.output.push(28, value >> 8 & 0xff, value & 0xff);
@@ -39895,13 +43866,14 @@ var Type1CharString = function Type1CharStringClosure() {
       return false;
     }
 
-  };
+  }
+
   return Type1CharString;
 }();
 
-var Type1Parser = function Type1ParserClosure() {
-  var EEXEC_ENCRYPT_KEY = 55665;
-  var CHAR_STRS_ENCRYPT_KEY = 4330;
+const Type1Parser = function Type1ParserClosure() {
+  const EEXEC_ENCRYPT_KEY = 55665;
+  const CHAR_STRS_ENCRYPT_KEY = 4330;
 
   function isHexDigit(code) {
     return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
@@ -39912,9 +43884,9 @@ var Type1Parser = function Type1ParserClosure() {
       return new Uint8Array(0);
     }
 
-    var r = key | 0,
-        c1 = 52845,
-        c2 = 22719,
+    const c1 = 52845,
+          c2 = 22719;
+    let r = key | 0,
         i,
         j;
 
@@ -39922,11 +43894,11 @@ var Type1Parser = function Type1ParserClosure() {
       r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
     }
 
-    var count = data.length - discardNumber;
-    var decrypted = new Uint8Array(count);
+    const count = data.length - discardNumber;
+    const decrypted = new Uint8Array(count);
 
     for (i = discardNumber, j = 0; j < count; i++, j++) {
-      var value = data[i];
+      const value = data[i];
       decrypted[j] = value ^ r >> 8;
       r = (value + r) * c1 + c2 & (1 << 16) - 1;
     }
@@ -39935,30 +43907,30 @@ var Type1Parser = function Type1ParserClosure() {
   }
 
   function decryptAscii(data, key, discardNumber) {
-    var r = key | 0,
-        c1 = 52845,
-        c2 = 22719;
-    var count = data.length,
-        maybeLength = count >>> 1;
-    var decrypted = new Uint8Array(maybeLength);
-    var i, j;
+    const c1 = 52845,
+          c2 = 22719;
+    let r = key | 0;
+    const count = data.length,
+          maybeLength = count >>> 1;
+    const decrypted = new Uint8Array(maybeLength);
+    let i, j;
 
     for (i = 0, j = 0; i < count; i++) {
-      var digit1 = data[i];
+      const digit1 = data[i];
 
       if (!isHexDigit(digit1)) {
         continue;
       }
 
       i++;
-      var digit2;
+      let digit2;
 
       while (i < count && !isHexDigit(digit2 = data[i])) {
         i++;
       }
 
       if (i < count) {
-        var value = parseInt(String.fromCharCode(digit1, digit2), 16);
+        const value = parseInt(String.fromCharCode(digit1, digit2), 16);
         decrypted[j++] = value ^ r >> 8;
         r = (value + r) * c1 + c2 & (1 << 16) - 1;
       }
@@ -39971,25 +43943,25 @@ var Type1Parser = function Type1ParserClosure() {
     return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29;
   }
 
-  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {
-    if (encrypted) {
-      var data = stream.getBytes();
-      var isBinary = !((isHexDigit(data[0]) || (0, _core_utils.isWhiteSpace)(data[0])) && 
isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && 
isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7]));
-      stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, 
EEXEC_ENCRYPT_KEY, 4));
-    }
+  class Type1Parser {
+    constructor(stream, encrypted, seacAnalysisEnabled) {
+      if (encrypted) {
+        const data = stream.getBytes();
+        const isBinary = !((isHexDigit(data[0]) || (0, _core_utils.isWhiteSpace)(data[0])) && 
isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && 
isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7]));
+        stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, 
EEXEC_ENCRYPT_KEY, 4));
+      }
 
-    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
-    this.stream = stream;
-    this.nextChar();
-  }
+      this.seacAnalysisEnabled = !!seacAnalysisEnabled;
+      this.stream = stream;
+      this.nextChar();
+    }
 
-  Type1Parser.prototype = {
-    readNumberArray: function Type1Parser_readNumberArray() {
+    readNumberArray() {
       this.getToken();
-      var array = [];
+      const array = [];
 
       while (true) {
-        var token = this.getToken();
+        const token = this.getToken();
 
         if (token === null || token === "]" || token === "}") {
           break;
@@ -39999,25 +43971,30 @@ var Type1Parser = function Type1ParserClosure() {
       }
 
       return array;
-    },
-    readNumber: function Type1Parser_readNumber() {
-      var token = this.getToken();
+    }
+
+    readNumber() {
+      const token = this.getToken();
       return parseFloat(token || 0);
-    },
-    readInt: function Type1Parser_readInt() {
-      var token = this.getToken();
+    }
+
+    readInt() {
+      const token = this.getToken();
       return parseInt(token || 0, 10) | 0;
-    },
-    readBoolean: function Type1Parser_readBoolean() {
-      var token = this.getToken();
+    }
+
+    readBoolean() {
+      const token = this.getToken();
       return token === "true" ? 1 : 0;
-    },
-    nextChar: function Type1_nextChar() {
+    }
+
+    nextChar() {
       return this.currentChar = this.stream.getByte();
-    },
-    getToken: function Type1Parser_getToken() {
-      var comment = false;
-      var ch = this.currentChar;
+    }
+
+    getToken() {
+      let comment = false;
+      let ch = this.currentChar;
 
       while (true) {
         if (ch === -1) {
@@ -40042,7 +44019,7 @@ var Type1Parser = function Type1ParserClosure() {
         return String.fromCharCode(ch);
       }
 
-      var token = "";
+      let token = "";
 
       do {
         token += String.fromCharCode(ch);
@@ -40050,28 +44027,30 @@ var Type1Parser = function Type1ParserClosure() {
       } while (ch >= 0 && !(0, _core_utils.isWhiteSpace)(ch) && !isSpecial(ch));
 
       return token;
-    },
-    readCharStrings: function Type1Parser_readCharStrings(bytes, lenIV) {
+    }
+
+    readCharStrings(bytes, lenIV) {
       if (lenIV === -1) {
         return bytes;
       }
 
       return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
-    },
-    extractFontProgram: function Type1Parser_extractFontProgram(properties) {
-      var stream = this.stream;
-      var subrs = [],
-          charstrings = [];
-      var privateData = Object.create(null);
+    }
+
+    extractFontProgram(properties) {
+      const stream = this.stream;
+      const subrs = [],
+            charstrings = [];
+      const privateData = Object.create(null);
       privateData.lenIV = 4;
-      var program = {
+      const program = {
         subrs: [],
         charstrings: [],
         properties: {
           privateData
         }
       };
-      var token, length, data, lenIV, encoded;
+      let token, length, data, lenIV, encoded;
 
       while ((token = this.getToken()) !== null) {
         if (token !== "/") {
@@ -40098,7 +44077,7 @@ var Type1Parser = function Type1ParserClosure() {
                 continue;
               }
 
-              var glyph = this.getToken();
+              const glyph = this.getToken();
               length = this.readInt();
               this.getToken();
               data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
@@ -40146,7 +44125,7 @@ var Type1Parser = function Type1ParserClosure() {
           case "OtherBlues":
           case "FamilyBlues":
           case "FamilyOtherBlues":
-            var blueArray = this.readNumberArray();
+            const blueArray = this.readNumberArray();
 
             if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
               program.properties.privateData[token] = blueArray;
@@ -40179,12 +44158,12 @@ var Type1Parser = function Type1ParserClosure() {
         }
       }
 
-      for (var i = 0; i < charstrings.length; i++) {
-        glyph = charstrings[i].glyph;
+      for (let i = 0; i < charstrings.length; i++) {
+        const glyph = charstrings[i].glyph;
         encoded = charstrings[i].encoded;
-        var charString = new Type1CharString();
-        var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
-        var output = charString.output;
+        const charString = new Type1CharString();
+        const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
+        let output = charString.output;
 
         if (error) {
           output = [14];
@@ -40214,9 +44193,10 @@ var Type1Parser = function Type1ParserClosure() {
       }
 
       return program;
-    },
-    extractFontHeader: function Type1Parser_extractFontHeader(properties) {
-      var token;
+    }
+
+    extractFontHeader(properties) {
+      let token;
 
       while ((token = this.getToken()) !== null) {
         if (token !== "/") {
@@ -40227,22 +44207,22 @@ var Type1Parser = function Type1ParserClosure() {
 
         switch (token) {
           case "FontMatrix":
-            var matrix = this.readNumberArray();
+            const matrix = this.readNumberArray();
             properties.fontMatrix = matrix;
             break;
 
           case "Encoding":
-            var encodingArg = this.getToken();
-            var encoding;
+            const encodingArg = this.getToken();
+            let encoding;
 
             if (!/^\d+$/.test(encodingArg)) {
               encoding = (0, _encodings.getEncoding)(encodingArg);
             } else {
               encoding = [];
-              var size = parseInt(encodingArg, 10) | 0;
+              const size = parseInt(encodingArg, 10) | 0;
               this.getToken();
 
-              for (var j = 0; j < size; j++) {
+              for (let j = 0; j < size; j++) {
                 token = this.getToken();
 
                 while (token !== "dup" && token !== "def") {
@@ -40257,9 +44237,9 @@ var Type1Parser = function Type1ParserClosure() {
                   break;
                 }
 
-                var index = this.readInt();
+                const index = this.readInt();
                 this.getToken();
-                var glyph = this.getToken();
+                const glyph = this.getToken();
                 encoding[index] = glyph;
                 this.getToken();
               }
@@ -40269,7 +44249,7 @@ var Type1Parser = function Type1ParserClosure() {
             break;
 
           case "FontBBox":
-            var fontBBox = this.readNumberArray();
+            const fontBBox = this.readNumberArray();
             properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
             properties.descent = Math.min(fontBBox[1], fontBBox[3]);
             properties.ascentScaled = true;
@@ -40277,34 +44257,35 @@ var Type1Parser = function Type1ParserClosure() {
         }
       }
     }
-  };
+
+  }
+
   return Type1Parser;
 }();
 
 exports.Type1Parser = Type1Parser;
 
 /***/ }),
-/* 39 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 49 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.getTilingPatternIR = getTilingPatternIR;
 exports.Pattern = void 0;
 
 var _util = __w_pdfjs_require__(2);
 
-var _colorspace = __w_pdfjs_require__(23);
+var _colorspace = __w_pdfjs_require__(14);
 
 var _primitives = __w_pdfjs_require__(5);
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
 
-var ShadingType = {
+const ShadingType = {
   FUNCTION_BASED: 1,
   AXIAL: 2,
   RADIAL: 3,
@@ -40314,32 +44295,26 @@ var ShadingType = {
   TENSOR_PATCH_MESH: 7
 };
 
-var Pattern = function PatternClosure() {
-  function Pattern() {
-    (0, _util.unreachable)("should not call Pattern constructor");
+class Pattern {
+  constructor() {
+    (0, _util.unreachable)("Cannot initialize Pattern.");
   }
 
-  Pattern.prototype = {
-    getPattern: function Pattern_getPattern(ctx) {
-      (0, _util.unreachable)(`Should not call Pattern.getStyle: ${ctx}`);
-    }
-  };
-
-  Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory, 
localColorSpaceCache) {
-    var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
-    var type = dict.get("ShadingType");
+  static parseShading(shading, matrix, xref, res, handler, pdfFunctionFactory, localColorSpaceCache) {
+    const dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
+    const type = dict.get("ShadingType");
 
     try {
       switch (type) {
         case ShadingType.AXIAL:
         case ShadingType.RADIAL:
-          return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
+          return new RadialAxialShading(dict, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
 
         case ShadingType.FREE_FORM_MESH:
         case ShadingType.LATTICE_FORM_MESH:
         case ShadingType.COONS_PATCH_MESH:
         case ShadingType.TENSOR_PATCH_MESH:
-          return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
+          return new MeshShading(shading, matrix, xref, res, pdfFunctionFactory, localColorSpaceCache);
 
         default:
           throw new _util.FormatError("Unsupported ShadingType: " + type);
@@ -40353,23 +44328,37 @@ var Pattern = function PatternClosure() {
         featureId: _util.UNSUPPORTED_FEATURES.shadingPattern
       });
       (0, _util.warn)(ex);
-      return new Shadings.Dummy();
+      return new DummyShading();
     }
-  };
+  }
 
-  return Pattern;
-}();
+}
 
 exports.Pattern = Pattern;
-var Shadings = {};
-Shadings.SMALL_NUMBER = 1e-6;
 
-Shadings.RadialAxial = function RadialAxialClosure() {
-  function RadialAxial(dict, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
+class BaseShading {
+  static get SMALL_NUMBER() {
+    return (0, _util.shadow)(this, "SMALL_NUMBER", 1e-6);
+  }
+
+  constructor() {
+    if (this.constructor === BaseShading) {
+      (0, _util.unreachable)("Cannot initialize BaseShading.");
+    }
+  }
+
+  getIR() {
+    (0, _util.unreachable)("Abstract method `getIR` called.");
+  }
+
+}
+
+class RadialAxialShading extends BaseShading {
+  constructor(dict, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
+    super();
     this.matrix = matrix;
     this.coordsArr = dict.getArray("Coords");
     this.shadingType = dict.get("ShadingType");
-    this.type = "Pattern";
 
     const cs = _colorspace.ColorSpace.parse({
       cs: dict.getRaw("ColorSpace") || dict.getRaw("CS"),
@@ -40379,7 +44368,6 @@ Shadings.RadialAxial = function RadialAxialClosure() {
       localColorSpaceCache
     });
 
-    this.cs = cs;
     const bbox = dict.getArray("BBox");
 
     if (Array.isArray(bbox) && bbox.length === 4) {
@@ -40388,32 +44376,27 @@ Shadings.RadialAxial = function RadialAxialClosure() {
       this.bbox = null;
     }
 
-    var t0 = 0.0,
+    let t0 = 0.0,
         t1 = 1.0;
 
     if (dict.has("Domain")) {
-      var domainArr = dict.getArray("Domain");
+      const domainArr = dict.getArray("Domain");
       t0 = domainArr[0];
       t1 = domainArr[1];
     }
 
-    var extendStart = false,
+    let extendStart = false,
         extendEnd = false;
 
     if (dict.has("Extend")) {
-      var extendArr = dict.getArray("Extend");
+      const extendArr = dict.getArray("Extend");
       extendStart = extendArr[0];
       extendEnd = extendArr[1];
     }
 
     if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {
-      var x1 = this.coordsArr[0];
-      var y1 = this.coordsArr[1];
-      var r1 = this.coordsArr[2];
-      var x2 = this.coordsArr[3];
-      var y2 = this.coordsArr[4];
-      var r2 = this.coordsArr[5];
-      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+      const [x1, y1, r1, x2, y2, r2] = this.coordsArr;
+      const distance = Math.hypot(x1 - x2, y1 - y2);
 
       if (r1 <= r2 + distance && r2 <= r1 + distance) {
         (0, _util.warn)("Unsupported radial gradient.");
@@ -40422,203 +44405,318 @@ Shadings.RadialAxial = function RadialAxialClosure() {
 
     this.extendStart = extendStart;
     this.extendEnd = extendEnd;
-    var fnObj = dict.getRaw("Function");
-    var fn = pdfFunctionFactory.createFromArray(fnObj);
+    const fnObj = dict.getRaw("Function");
+    const fn = pdfFunctionFactory.createFromArray(fnObj);
     const NUMBER_OF_SAMPLES = 10;
     const step = (t1 - t0) / NUMBER_OF_SAMPLES;
-    var colorStops = this.colorStops = [];
+    const colorStops = this.colorStops = [];
 
     if (t0 >= t1 || step <= 0) {
       (0, _util.info)("Bad shading domain.");
       return;
     }
 
-    var color = new Float32Array(cs.numComps),
-        ratio = new Float32Array(1);
-    var rgbColor;
+    const color = new Float32Array(cs.numComps),
+          ratio = new Float32Array(1);
+    let rgbColor;
 
     for (let i = 0; i <= NUMBER_OF_SAMPLES; i++) {
       ratio[0] = t0 + i * step;
       fn(ratio, 0, color, 0);
       rgbColor = cs.getRgb(color, 0);
 
-      var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      const cssColor = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]);
 
       colorStops.push([i / NUMBER_OF_SAMPLES, cssColor]);
     }
 
-    var background = "transparent";
+    let background = "transparent";
 
     if (dict.has("Background")) {
       rgbColor = cs.getRgb(dict.get("Background"), 0);
-      background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      background = _util.Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]);
     }
 
     if (!extendStart) {
       colorStops.unshift([0, background]);
-      colorStops[1][0] += Shadings.SMALL_NUMBER;
+      colorStops[1][0] += BaseShading.SMALL_NUMBER;
     }
 
     if (!extendEnd) {
-      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
+      colorStops[colorStops.length - 1][0] -= BaseShading.SMALL_NUMBER;
       colorStops.push([1, background]);
     }
 
     this.colorStops = colorStops;
   }
 
-  RadialAxial.prototype = {
-    getIR: function RadialAxial_getIR() {
-      var coordsArr = this.coordsArr;
-      var shadingType = this.shadingType;
-      var type, p0, p1, r0, r1;
-
-      if (shadingType === ShadingType.AXIAL) {
-        p0 = [coordsArr[0], coordsArr[1]];
-        p1 = [coordsArr[2], coordsArr[3]];
-        r0 = null;
-        r1 = null;
-        type = "axial";
-      } else if (shadingType === ShadingType.RADIAL) {
-        p0 = [coordsArr[0], coordsArr[1]];
-        p1 = [coordsArr[3], coordsArr[4]];
-        r0 = coordsArr[2];
-        r1 = coordsArr[5];
-        type = "radial";
-      } else {
-        (0, _util.unreachable)(`getPattern type unknown: ${shadingType}`);
-      }
-
-      var matrix = this.matrix;
-
-      if (matrix) {
-        p0 = _util.Util.applyTransform(p0, matrix);
-        p1 = _util.Util.applyTransform(p1, matrix);
-
-        if (shadingType === ShadingType.RADIAL) {
-          var scale = _util.Util.singularValueDecompose2dScale(matrix);
+  getIR() {
+    const coordsArr = this.coordsArr;
+    const shadingType = this.shadingType;
+    let type, p0, p1, r0, r1;
+
+    if (shadingType === ShadingType.AXIAL) {
+      p0 = [coordsArr[0], coordsArr[1]];
+      p1 = [coordsArr[2], coordsArr[3]];
+      r0 = null;
+      r1 = null;
+      type = "axial";
+    } else if (shadingType === ShadingType.RADIAL) {
+      p0 = [coordsArr[0], coordsArr[1]];
+      p1 = [coordsArr[3], coordsArr[4]];
+      r0 = coordsArr[2];
+      r1 = coordsArr[5];
+      type = "radial";
+    } else {
+      (0, _util.unreachable)(`getPattern type unknown: ${shadingType}`);
+    }
 
-          r0 *= scale[0];
-          r1 *= scale[1];
-        }
-      }
+    return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1, this.matrix];
+  }
 
-      return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1];
-    }
-  };
-  return RadialAxial;
-}();
+}
 
-Shadings.Mesh = function MeshClosure() {
-  function MeshStreamReader(stream, context) {
+class MeshStreamReader {
+  constructor(stream, context) {
     this.stream = stream;
     this.context = context;
     this.buffer = 0;
     this.bufferLength = 0;
-    var numComps = context.numComps;
+    const numComps = context.numComps;
     this.tmpCompsBuf = new Float32Array(numComps);
-    var csNumComps = context.colorSpace.numComps;
+    const csNumComps = context.colorSpace.numComps;
     this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
   }
 
-  MeshStreamReader.prototype = {
-    get hasData() {
-      if (this.stream.end) {
-        return this.stream.pos < this.stream.end;
+  get hasData() {
+    if (this.stream.end) {
+      return this.stream.pos < this.stream.end;
+    }
+
+    if (this.bufferLength > 0) {
+      return true;
+    }
+
+    const nextByte = this.stream.getByte();
+
+    if (nextByte < 0) {
+      return false;
+    }
+
+    this.buffer = nextByte;
+    this.bufferLength = 8;
+    return true;
+  }
+
+  readBits(n) {
+    let buffer = this.buffer;
+    let bufferLength = this.bufferLength;
+
+    if (n === 32) {
+      if (bufferLength === 0) {
+        return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | 
this.stream.getByte()) >>> 0;
       }
 
-      if (this.bufferLength > 0) {
-        return true;
-      }
+      buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | 
this.stream.getByte();
+      const nextByte = this.stream.getByte();
+      this.buffer = nextByte & (1 << bufferLength) - 1;
+      return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;
+    }
+
+    if (n === 8 && bufferLength === 0) {
+      return this.stream.getByte();
+    }
+
+    while (bufferLength < n) {
+      buffer = buffer << 8 | this.stream.getByte();
+      bufferLength += 8;
+    }
+
+    bufferLength -= n;
+    this.bufferLength = bufferLength;
+    this.buffer = buffer & (1 << bufferLength) - 1;
+    return buffer >> bufferLength;
+  }
+
+  align() {
+    this.buffer = 0;
+    this.bufferLength = 0;
+  }
+
+  readFlag() {
+    return this.readBits(this.context.bitsPerFlag);
+  }
+
+  readCoordinate() {
+    const bitsPerCoordinate = this.context.bitsPerCoordinate;
+    const xi = this.readBits(bitsPerCoordinate);
+    const yi = this.readBits(bitsPerCoordinate);
+    const decode = this.context.decode;
+    const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
+    return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + 
decode[2]];
+  }
+
+  readComponents() {
+    const numComps = this.context.numComps;
+    const bitsPerComponent = this.context.bitsPerComponent;
+    const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
+    const decode = this.context.decode;
+    const components = this.tmpCompsBuf;
+
+    for (let i = 0, j = 4; i < numComps; i++, j += 2) {
+      const ci = this.readBits(bitsPerComponent);
+      components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
+    }
+
+    const color = this.tmpCsCompsBuf;
+
+    if (this.context.colorFn) {
+      this.context.colorFn(components, 0, color, 0);
+    }
+
+    return this.context.colorSpace.getRgb(color, 0);
+  }
+
+}
+
+const getB = function getBClosure() {
+  function buildB(count) {
+    const lut = [];
+
+    for (let i = 0; i <= count; i++) {
+      const t = i / count,
+            t_ = 1 - t;
+      lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));
+    }
+
+    return lut;
+  }
+
+  const cache = [];
+  return function (count) {
+    if (!cache[count]) {
+      cache[count] = buildB(count);
+    }
+
+    return cache[count];
+  };
+}();
+
+class MeshShading extends BaseShading {
+  static get MIN_SPLIT_PATCH_CHUNKS_AMOUNT() {
+    return (0, _util.shadow)(this, "MIN_SPLIT_PATCH_CHUNKS_AMOUNT", 3);
+  }
+
+  static get MAX_SPLIT_PATCH_CHUNKS_AMOUNT() {
+    return (0, _util.shadow)(this, "MAX_SPLIT_PATCH_CHUNKS_AMOUNT", 20);
+  }
+
+  static get TRIANGLE_DENSITY() {
+    return (0, _util.shadow)(this, "TRIANGLE_DENSITY", 20);
+  }
+
+  constructor(stream, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
+    super();
+
+    if (!(0, _primitives.isStream)(stream)) {
+      throw new _util.FormatError("Mesh data is not a stream");
+    }
+
+    const dict = stream.dict;
+    this.matrix = matrix;
+    this.shadingType = dict.get("ShadingType");
+    const bbox = dict.getArray("BBox");
+
+    if (Array.isArray(bbox) && bbox.length === 4) {
+      this.bbox = _util.Util.normalizeRect(bbox);
+    } else {
+      this.bbox = null;
+    }
+
+    const cs = _colorspace.ColorSpace.parse({
+      cs: dict.getRaw("ColorSpace") || dict.getRaw("CS"),
+      xref,
+      resources,
+      pdfFunctionFactory,
+      localColorSpaceCache
+    });
+
+    this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
+    const fnObj = dict.getRaw("Function");
+    const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
+    this.coords = [];
+    this.colors = [];
+    this.figures = [];
+    const decodeContext = {
+      bitsPerCoordinate: dict.get("BitsPerCoordinate"),
+      bitsPerComponent: dict.get("BitsPerComponent"),
+      bitsPerFlag: dict.get("BitsPerFlag"),
+      decode: dict.getArray("Decode"),
+      colorFn: fn,
+      colorSpace: cs,
+      numComps: fn ? 1 : cs.numComps
+    };
+    const reader = new MeshStreamReader(stream, decodeContext);
+    let patchMesh = false;
+
+    switch (this.shadingType) {
+      case ShadingType.FREE_FORM_MESH:
+        this._decodeType4Shading(reader);
 
-      var nextByte = this.stream.getByte();
+        break;
 
-      if (nextByte < 0) {
-        return false;
-      }
+      case ShadingType.LATTICE_FORM_MESH:
+        const verticesPerRow = dict.get("VerticesPerRow") | 0;
 
-      this.buffer = nextByte;
-      this.bufferLength = 8;
-      return true;
-    },
+        if (verticesPerRow < 2) {
+          throw new _util.FormatError("Invalid VerticesPerRow");
+        }
 
-    readBits: function MeshStreamReader_readBits(n) {
-      var buffer = this.buffer;
-      var bufferLength = this.bufferLength;
+        this._decodeType5Shading(reader, verticesPerRow);
 
-      if (n === 32) {
-        if (bufferLength === 0) {
-          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | 
this.stream.getByte()) >>> 0;
-        }
+        break;
 
-        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | 
this.stream.getByte();
-        var nextByte = this.stream.getByte();
-        this.buffer = nextByte & (1 << bufferLength) - 1;
-        return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;
-      }
+      case ShadingType.COONS_PATCH_MESH:
+        this._decodeType6Shading(reader);
 
-      if (n === 8 && bufferLength === 0) {
-        return this.stream.getByte();
-      }
+        patchMesh = true;
+        break;
 
-      while (bufferLength < n) {
-        buffer = buffer << 8 | this.stream.getByte();
-        bufferLength += 8;
-      }
+      case ShadingType.TENSOR_PATCH_MESH:
+        this._decodeType7Shading(reader);
 
-      bufferLength -= n;
-      this.bufferLength = bufferLength;
-      this.buffer = buffer & (1 << bufferLength) - 1;
-      return buffer >> bufferLength;
-    },
-    align: function MeshStreamReader_align() {
-      this.buffer = 0;
-      this.bufferLength = 0;
-    },
-    readFlag: function MeshStreamReader_readFlag() {
-      return this.readBits(this.context.bitsPerFlag);
-    },
-    readCoordinate: function MeshStreamReader_readCoordinate() {
-      var bitsPerCoordinate = this.context.bitsPerCoordinate;
-      var xi = this.readBits(bitsPerCoordinate);
-      var yi = this.readBits(bitsPerCoordinate);
-      var decode = this.context.decode;
-      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
-      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + 
decode[2]];
-    },
-    readComponents: function MeshStreamReader_readComponents() {
-      var numComps = this.context.numComps;
-      var bitsPerComponent = this.context.bitsPerComponent;
-      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
-      var decode = this.context.decode;
-      var components = this.tmpCompsBuf;
+        patchMesh = true;
+        break;
 
-      for (var i = 0, j = 4; i < numComps; i++, j += 2) {
-        var ci = this.readBits(bitsPerComponent);
-        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
-      }
+      default:
+        (0, _util.unreachable)("Unsupported mesh type.");
+        break;
+    }
 
-      var color = this.tmpCsCompsBuf;
+    if (patchMesh) {
+      this._updateBounds();
 
-      if (this.context.colorFn) {
-        this.context.colorFn(components, 0, color, 0);
+      for (let i = 0, ii = this.figures.length; i < ii; i++) {
+        this._buildFigureFromPatch(i);
       }
-
-      return this.context.colorSpace.getRgb(color, 0);
     }
-  };
 
-  function decodeType4Shading(mesh, reader) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var operators = [];
-    var ps = [];
-    var verticesLeft = 0;
+    this._updateBounds();
+
+    this._packData();
+  }
+
+  _decodeType4Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const operators = [];
+    const ps = [];
+    let verticesLeft = 0;
 
     while (reader.hasData) {
-      var f = reader.readFlag();
-      var coord = reader.readCoordinate();
-      var color = reader.readComponents();
+      const f = reader.readFlag();
+      const coord = reader.readCoordinate();
+      const color = reader.readComponents();
 
       if (verticesLeft === 0) {
         if (!(0 <= f && f <= 2)) {
@@ -40651,27 +44749,27 @@ Shadings.Mesh = function MeshClosure() {
       reader.align();
     }
 
-    mesh.figures.push({
+    this.figures.push({
       type: "triangles",
       coords: new Int32Array(ps),
       colors: new Int32Array(ps)
     });
   }
 
-  function decodeType5Shading(mesh, reader, verticesPerRow) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = [];
+  _decodeType5Shading(reader, verticesPerRow) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = [];
 
     while (reader.hasData) {
-      var coord = reader.readCoordinate();
-      var color = reader.readComponents();
+      const coord = reader.readCoordinate();
+      const color = reader.readComponents();
       ps.push(coords.length);
       coords.push(coord);
       colors.push(color);
     }
 
-    mesh.figures.push({
+    this.figures.push({
       type: "lattice",
       coords: new Int32Array(ps),
       colors: new Int32Array(ps),
@@ -40679,140 +44777,32 @@ Shadings.Mesh = function MeshClosure() {
     });
   }
 
-  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
-  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
-  var TRIANGLE_DENSITY = 20;
-
-  var getB = function getBClosure() {
-    function buildB(count) {
-      var lut = [];
-
-      for (var i = 0; i <= count; i++) {
-        var t = i / count,
-            t_ = 1 - t;
-        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));
-      }
-
-      return lut;
-    }
-
-    var cache = [];
-    return function getB(count) {
-      if (!cache[count]) {
-        cache[count] = buildB(count);
-      }
-
-      return cache[count];
-    };
-  }();
-
-  function buildFigureFromPatch(mesh, index) {
-    var figure = mesh.figures[index];
-    (0, _util.assert)(figure.type === "patch", "Unexpected patch mesh figure");
-    var coords = mesh.coords,
-        colors = mesh.colors;
-    var pi = figure.coords;
-    var ci = figure.colors;
-    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
-    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
-    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
-    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
-    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - 
mesh.bounds[0]));
-    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
-    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - 
mesh.bounds[1]));
-    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
-    var verticesPerRow = splitXBy + 1;
-    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
-    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
-    var k = 0;
-    var cl = new Uint8Array(3),
-        cr = new Uint8Array(3);
-    var c0 = colors[ci[0]],
-        c1 = colors[ci[1]],
-        c2 = colors[ci[2]],
-        c3 = colors[ci[3]];
-    var bRow = getB(splitYBy),
-        bCol = getB(splitXBy);
-
-    for (var row = 0; row <= splitYBy; row++) {
-      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
-      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
-      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
-      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
-      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
-      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
-
-      for (var col = 0; col <= splitXBy; col++, k++) {
-        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
-          continue;
-        }
-
-        var x = 0,
-            y = 0;
-        var q = 0;
-
-        for (var i = 0; i <= 3; i++) {
-          for (var j = 0; j <= 3; j++, q++) {
-            var m = bRow[row][i] * bCol[col][j];
-            x += coords[pi[q]][0] * m;
-            y += coords[pi[q]][1] * m;
-          }
-        }
-
-        figureCoords[k] = coords.length;
-        coords.push([x, y]);
-        figureColors[k] = colors.length;
-        var newColor = new Uint8Array(3);
-        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
-        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
-        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
-        colors.push(newColor);
-      }
-    }
-
-    figureCoords[0] = pi[0];
-    figureColors[0] = ci[0];
-    figureCoords[splitXBy] = pi[3];
-    figureColors[splitXBy] = ci[1];
-    figureCoords[verticesPerRow * splitYBy] = pi[12];
-    figureColors[verticesPerRow * splitYBy] = ci[2];
-    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
-    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
-    mesh.figures[index] = {
-      type: "lattice",
-      coords: figureCoords,
-      colors: figureColors,
-      verticesPerRow
-    };
-  }
-
-  function decodeType6Shading(mesh, reader) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = new Int32Array(16);
-    var cs = new Int32Array(4);
+  _decodeType6Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = new Int32Array(16);
+    const cs = new Int32Array(4);
 
     while (reader.hasData) {
-      var f = reader.readFlag();
+      const f = reader.readFlag();
 
       if (!(0 <= f && f <= 3)) {
         throw new _util.FormatError("Unknown type6 flag");
       }
 
-      var i, ii;
-      var pi = coords.length;
+      const pi = coords.length;
 
-      for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
+      for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
         coords.push(reader.readCoordinate());
       }
 
-      var ci = colors.length;
+      const ci = colors.length;
 
-      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
         colors.push(reader.readComponents());
       }
 
-      var tmp1, tmp2, tmp3, tmp4;
+      let tmp1, tmp2, tmp3, tmp4;
 
       switch (f) {
         case 0:
@@ -40909,7 +44899,7 @@ Shadings.Mesh = function MeshClosure() {
       coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 
2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * 
coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + 
coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
       ps[10] = coords.length;
       coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) 
- 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * 
coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + 
coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
-      mesh.figures.push({
+      this.figures.push({
         type: "patch",
         coords: new Int32Array(ps),
         colors: new Int32Array(cs)
@@ -40917,33 +44907,32 @@ Shadings.Mesh = function MeshClosure() {
     }
   }
 
-  function decodeType7Shading(mesh, reader) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = new Int32Array(16);
-    var cs = new Int32Array(4);
+  _decodeType7Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = new Int32Array(16);
+    const cs = new Int32Array(4);
 
     while (reader.hasData) {
-      var f = reader.readFlag();
+      const f = reader.readFlag();
 
       if (!(0 <= f && f <= 3)) {
         throw new _util.FormatError("Unknown type7 flag");
       }
 
-      var i, ii;
-      var pi = coords.length;
+      const pi = coords.length;
 
-      for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
+      for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
         coords.push(reader.readCoordinate());
       }
 
-      var ci = colors.length;
+      const ci = colors.length;
 
-      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
         colors.push(reader.readComponents());
       }
 
-      var tmp1, tmp2, tmp3, tmp4;
+      let tmp1, tmp2, tmp3, tmp4;
 
       switch (f) {
         case 0:
@@ -41048,7 +45037,7 @@ Shadings.Mesh = function MeshClosure() {
           break;
       }
 
-      mesh.figures.push({
+      this.figures.push({
         type: "patch",
         coords: new Int32Array(ps),
         colors: new Int32Array(cs)
@@ -41056,53 +45045,133 @@ Shadings.Mesh = function MeshClosure() {
     }
   }
 
-  function updateBounds(mesh) {
-    var minX = mesh.coords[0][0],
-        minY = mesh.coords[0][1],
+  _buildFigureFromPatch(index) {
+    const figure = this.figures[index];
+    (0, _util.assert)(figure.type === "patch", "Unexpected patch mesh figure");
+    const coords = this.coords,
+          colors = this.colors;
+    const pi = figure.coords;
+    const ci = figure.colors;
+    const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - 
this.bounds[0]));
+    splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, 
Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
+    let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - 
this.bounds[1]));
+    splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, 
Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
+    const verticesPerRow = splitXBy + 1;
+    const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
+    const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
+    let k = 0;
+    const cl = new Uint8Array(3),
+          cr = new Uint8Array(3);
+    const c0 = colors[ci[0]],
+          c1 = colors[ci[1]],
+          c2 = colors[ci[2]],
+          c3 = colors[ci[3]];
+    const bRow = getB(splitYBy),
+          bCol = getB(splitXBy);
+
+    for (let row = 0; row <= splitYBy; row++) {
+      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
+      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
+      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
+      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
+      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
+      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
+
+      for (let col = 0; col <= splitXBy; col++, k++) {
+        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
+          continue;
+        }
+
+        let x = 0,
+            y = 0;
+        let q = 0;
+
+        for (let i = 0; i <= 3; i++) {
+          for (let j = 0; j <= 3; j++, q++) {
+            const m = bRow[row][i] * bCol[col][j];
+            x += coords[pi[q]][0] * m;
+            y += coords[pi[q]][1] * m;
+          }
+        }
+
+        figureCoords[k] = coords.length;
+        coords.push([x, y]);
+        figureColors[k] = colors.length;
+        const newColor = new Uint8Array(3);
+        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
+        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
+        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
+        colors.push(newColor);
+      }
+    }
+
+    figureCoords[0] = pi[0];
+    figureColors[0] = ci[0];
+    figureCoords[splitXBy] = pi[3];
+    figureColors[splitXBy] = ci[1];
+    figureCoords[verticesPerRow * splitYBy] = pi[12];
+    figureColors[verticesPerRow * splitYBy] = ci[2];
+    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
+    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
+    this.figures[index] = {
+      type: "lattice",
+      coords: figureCoords,
+      colors: figureColors,
+      verticesPerRow
+    };
+  }
+
+  _updateBounds() {
+    let minX = this.coords[0][0],
+        minY = this.coords[0][1],
         maxX = minX,
         maxY = minY;
 
-    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
-      var x = mesh.coords[i][0],
-          y = mesh.coords[i][1];
+    for (let i = 1, ii = this.coords.length; i < ii; i++) {
+      const x = this.coords[i][0],
+            y = this.coords[i][1];
       minX = minX > x ? x : minX;
       minY = minY > y ? y : minY;
       maxX = maxX < x ? x : maxX;
       maxY = maxY < y ? y : maxY;
     }
 
-    mesh.bounds = [minX, minY, maxX, maxY];
+    this.bounds = [minX, minY, maxX, maxY];
   }
 
-  function packData(mesh) {
-    var i, ii, j, jj;
-    var coords = mesh.coords;
-    var coordsPacked = new Float32Array(coords.length * 2);
+  _packData() {
+    let i, ii, j, jj;
+    const coords = this.coords;
+    const coordsPacked = new Float32Array(coords.length * 2);
 
     for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
-      var xy = coords[i];
+      const xy = coords[i];
       coordsPacked[j++] = xy[0];
       coordsPacked[j++] = xy[1];
     }
 
-    mesh.coords = coordsPacked;
-    var colors = mesh.colors;
-    var colorsPacked = new Uint8Array(colors.length * 3);
+    this.coords = coordsPacked;
+    const colors = this.colors;
+    const colorsPacked = new Uint8Array(colors.length * 3);
 
     for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
-      var c = colors[i];
+      const c = colors[i];
       colorsPacked[j++] = c[0];
       colorsPacked[j++] = c[1];
       colorsPacked[j++] = c[2];
     }
 
-    mesh.colors = colorsPacked;
-    var figures = mesh.figures;
+    this.colors = colorsPacked;
+    const figures = this.figures;
 
     for (i = 0, ii = figures.length; i < ii; i++) {
-      var figure = figures[i],
-          ps = figure.coords,
-          cs = figure.colors;
+      const figure = figures[i],
+            ps = figure.coords,
+            cs = figure.colors;
 
       for (j = 0, jj = ps.length; j < jj; j++) {
         ps[j] *= 2;
@@ -41111,114 +45180,20 @@ Shadings.Mesh = function MeshClosure() {
     }
   }
 
-  function Mesh(stream, matrix, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
-    if (!(0, _primitives.isStream)(stream)) {
-      throw new _util.FormatError("Mesh data is not a stream");
-    }
-
-    var dict = stream.dict;
-    this.matrix = matrix;
-    this.shadingType = dict.get("ShadingType");
-    this.type = "Pattern";
-    const bbox = dict.getArray("BBox");
-
-    if (Array.isArray(bbox) && bbox.length === 4) {
-      this.bbox = _util.Util.normalizeRect(bbox);
-    } else {
-      this.bbox = null;
-    }
-
-    const cs = _colorspace.ColorSpace.parse({
-      cs: dict.getRaw("ColorSpace") || dict.getRaw("CS"),
-      xref,
-      resources,
-      pdfFunctionFactory,
-      localColorSpaceCache
-    });
-
-    this.cs = cs;
-    this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
-    var fnObj = dict.getRaw("Function");
-    var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
-    this.coords = [];
-    this.colors = [];
-    this.figures = [];
-    var decodeContext = {
-      bitsPerCoordinate: dict.get("BitsPerCoordinate"),
-      bitsPerComponent: dict.get("BitsPerComponent"),
-      bitsPerFlag: dict.get("BitsPerFlag"),
-      decode: dict.getArray("Decode"),
-      colorFn: fn,
-      colorSpace: cs,
-      numComps: fn ? 1 : cs.numComps
-    };
-    var reader = new MeshStreamReader(stream, decodeContext);
-    var patchMesh = false;
-
-    switch (this.shadingType) {
-      case ShadingType.FREE_FORM_MESH:
-        decodeType4Shading(this, reader);
-        break;
-
-      case ShadingType.LATTICE_FORM_MESH:
-        var verticesPerRow = dict.get("VerticesPerRow") | 0;
-
-        if (verticesPerRow < 2) {
-          throw new _util.FormatError("Invalid VerticesPerRow");
-        }
-
-        decodeType5Shading(this, reader, verticesPerRow);
-        break;
-
-      case ShadingType.COONS_PATCH_MESH:
-        decodeType6Shading(this, reader);
-        patchMesh = true;
-        break;
-
-      case ShadingType.TENSOR_PATCH_MESH:
-        decodeType7Shading(this, reader);
-        patchMesh = true;
-        break;
-
-      default:
-        (0, _util.unreachable)("Unsupported mesh type.");
-        break;
-    }
-
-    if (patchMesh) {
-      updateBounds(this);
-
-      for (var i = 0, ii = this.figures.length; i < ii; i++) {
-        buildFigureFromPatch(this, i);
-      }
-    }
-
-    updateBounds(this);
-    packData(this);
+  getIR() {
+    return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, 
this.bbox, this.background];
   }
 
-  Mesh.prototype = {
-    getIR: function Mesh_getIR() {
-      return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, 
this.bbox, this.background];
-    }
-  };
-  return Mesh;
-}();
+}
 
-Shadings.Dummy = function DummyClosure() {
-  function Dummy() {
-    this.type = "Pattern";
+class DummyShading extends BaseShading {
+  getIR() {
+    return ["Dummy"];
   }
 
-  Dummy.prototype = {
-    getIR: function Dummy_getIR() {
-      return ["Dummy"];
-    }
-  };
-  return Dummy;
-}();
+}
 
-function getTilingPatternIR(operatorList, dict, args) {
+function getTilingPatternIR(operatorList, dict, color) {
   const matrix = dict.getArray("Matrix");
 
   const bbox = _util.Util.normalizeRect(dict.getArray("BBox"));
@@ -41232,29 +45207,28 @@ function getTilingPatternIR(operatorList, dict, args) {
     throw new _util.FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`);
   }
 
-  return ["TilingPattern", args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
+  return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
 }
 
 /***/ }),
-/* 40 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 50 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.isPDFFunction = isPDFFunction;
-exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = void 0;
+exports.PostScriptEvaluator = exports.PostScriptCompiler = exports.PDFFunctionFactory = void 0;
 
 var _primitives = __w_pdfjs_require__(5);
 
 var _util = __w_pdfjs_require__(2);
 
-var _ps_parser = __w_pdfjs_require__(41);
+var _ps_parser = __w_pdfjs_require__(51);
 
-var _image_utils = __w_pdfjs_require__(24);
+var _image_utils = __w_pdfjs_require__(52);
 
 class PDFFunctionFactory {
   constructor({
@@ -41263,7 +45237,6 @@ class PDFFunctionFactory {
   }) {
     this.xref = xref;
     this.isEvalSupported = isEvalSupported !== false;
-    this._localFunctionCache = null;
   }
 
   create(fn) {
@@ -41314,10 +45287,6 @@ class PDFFunctionFactory {
     }
 
     if (fnRef) {
-      if (!this._localFunctionCache) {
-        this._localFunctionCache = new _image_utils.LocalFunctionCache();
-      }
-
       const localFunction = this._localFunctionCache.getByRef(fnRef);
 
       if (localFunction) {
@@ -41344,14 +45313,14 @@ class PDFFunctionFactory {
     }
 
     if (fnRef) {
-      if (!this._localFunctionCache) {
-        this._localFunctionCache = new _image_utils.LocalFunctionCache();
-      }
-
       this._localFunctionCache.set(null, fnRef, parsedFunction);
     }
   }
 
+  get _localFunctionCache() {
+    return (0, _util.shadow)(this, "_localFunctionCache", new _image_utils.LocalFunctionCache());
+  }
+
 }
 
 exports.PDFFunctionFactory = PDFFunctionFactory;
@@ -41378,507 +45347,413 @@ function toNumberArray(arr) {
   return arr;
 }
 
-var PDFFunction = function PDFFunctionClosure() {
-  const CONSTRUCT_SAMPLED = 0;
-  const CONSTRUCT_INTERPOLATED = 2;
-  const CONSTRUCT_STICHED = 3;
-  const CONSTRUCT_POSTSCRIPT = 4;
-  return {
-    getSampleArray(size, outputSize, bps, stream) {
-      var i, ii;
-      var length = 1;
-
-      for (i = 0, ii = size.length; i < ii; i++) {
-        length *= size[i];
-      }
+class PDFFunction {
+  static getSampleArray(size, outputSize, bps, stream) {
+    let i, ii;
+    let length = 1;
 
-      length *= outputSize;
-      var array = new Array(length);
-      var codeSize = 0;
-      var codeBuf = 0;
-      var sampleMul = 1.0 / (2.0 ** bps - 1);
-      var strBytes = stream.getBytes((length * bps + 7) / 8);
-      var strIdx = 0;
+    for (i = 0, ii = size.length; i < ii; i++) {
+      length *= size[i];
+    }
 
-      for (i = 0; i < length; i++) {
-        while (codeSize < bps) {
-          codeBuf <<= 8;
-          codeBuf |= strBytes[strIdx++];
-          codeSize += 8;
-        }
+    length *= outputSize;
+    const array = new Array(length);
+    let codeSize = 0;
+    let codeBuf = 0;
+    const sampleMul = 1.0 / (2.0 ** bps - 1);
+    const strBytes = stream.getBytes((length * bps + 7) / 8);
+    let strIdx = 0;
 
-        codeSize -= bps;
-        array[i] = (codeBuf >> codeSize) * sampleMul;
-        codeBuf &= (1 << codeSize) - 1;
+    for (i = 0; i < length; i++) {
+      while (codeSize < bps) {
+        codeBuf <<= 8;
+        codeBuf |= strBytes[strIdx++];
+        codeSize += 8;
       }
 
-      return array;
-    },
-
-    getIR({
-      xref,
-      isEvalSupported,
-      fn
-    }) {
-      var dict = fn.dict;
-
-      if (!dict) {
-        dict = fn;
-      }
+      codeSize -= bps;
+      array[i] = (codeBuf >> codeSize) * sampleMul;
+      codeBuf &= (1 << codeSize) - 1;
+    }
 
-      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, 
this.constructPostScript];
-      var typeNum = dict.get("FunctionType");
-      var typeFn = types[typeNum];
+    return array;
+  }
 
-      if (!typeFn) {
-        throw new _util.FormatError("Unknown type of function");
-      }
+  static parse({
+    xref,
+    isEvalSupported,
+    fn
+  }) {
+    const dict = fn.dict || fn;
+    const typeNum = dict.get("FunctionType");
 
-      return typeFn.call(this, {
-        xref,
-        isEvalSupported,
-        fn,
-        dict
-      });
-    },
+    switch (typeNum) {
+      case 0:
+        return this.constructSampled({
+          xref,
+          isEvalSupported,
+          fn,
+          dict
+        });
 
-    fromIR({
-      xref,
-      isEvalSupported,
-      IR
-    }) {
-      var type = IR[0];
+      case 1:
+        break;
 
-      switch (type) {
-        case CONSTRUCT_SAMPLED:
-          return this.constructSampledFromIR({
-            xref,
-            isEvalSupported,
-            IR
-          });
+      case 2:
+        return this.constructInterpolated({
+          xref,
+          isEvalSupported,
+          dict
+        });
 
-        case CONSTRUCT_INTERPOLATED:
-          return this.constructInterpolatedFromIR({
-            xref,
-            isEvalSupported,
-            IR
-          });
+      case 3:
+        return this.constructStiched({
+          xref,
+          isEvalSupported,
+          dict
+        });
 
-        case CONSTRUCT_STICHED:
-          return this.constructStichedFromIR({
-            xref,
-            isEvalSupported,
-            IR
-          });
+      case 4:
+        return this.constructPostScript({
+          xref,
+          isEvalSupported,
+          fn,
+          dict
+        });
+    }
 
-        default:
-          return this.constructPostScriptFromIR({
-            xref,
-            isEvalSupported,
-            IR
-          });
-      }
-    },
+    throw new _util.FormatError("Unknown type of function");
+  }
 
-    parse({
-      xref,
-      isEvalSupported,
-      fn
-    }) {
-      const IR = this.getIR({
+  static parseArray({
+    xref,
+    isEvalSupported,
+    fnObj
+  }) {
+    if (!Array.isArray(fnObj)) {
+      return this.parse({
         xref,
         isEvalSupported,
-        fn
+        fn: fnObj
       });
-      return this.fromIR({
+    }
+
+    const fnArray = [];
+
+    for (let j = 0, jj = fnObj.length; j < jj; j++) {
+      fnArray.push(this.parse({
         xref,
         isEvalSupported,
-        IR
-      });
-    },
+        fn: xref.fetchIfRef(fnObj[j])
+      }));
+    }
 
-    parseArray({
-      xref,
-      isEvalSupported,
-      fnObj
-    }) {
-      if (!Array.isArray(fnObj)) {
-        return this.parse({
-          xref,
-          isEvalSupported,
-          fn: fnObj
-        });
+    return function (src, srcOffset, dest, destOffset) {
+      for (let i = 0, ii = fnArray.length; i < ii; i++) {
+        fnArray[i](src, srcOffset, dest, destOffset + i);
       }
+    };
+  }
 
-      var fnArray = [];
+  static constructSampled({
+    xref,
+    isEvalSupported,
+    fn,
+    dict
+  }) {
+    function toMultiArray(arr) {
+      const inputLength = arr.length;
+      const out = [];
+      let index = 0;
 
-      for (var j = 0, jj = fnObj.length; j < jj; j++) {
-        fnArray.push(this.parse({
-          xref,
-          isEvalSupported,
-          fn: xref.fetchIfRef(fnObj[j])
-        }));
+      for (let i = 0; i < inputLength; i += 2) {
+        out[index++] = [arr[i], arr[i + 1]];
       }
 
-      return function (src, srcOffset, dest, destOffset) {
-        for (var i = 0, ii = fnArray.length; i < ii; i++) {
-          fnArray[i](src, srcOffset, dest, destOffset + i);
-        }
-      };
-    },
+      return out;
+    }
 
-    constructSampled({
-      xref,
-      isEvalSupported,
-      fn,
-      dict
-    }) {
-      function toMultiArray(arr) {
-        var inputLength = arr.length;
-        var out = [];
-        var index = 0;
+    function interpolate(x, xmin, xmax, ymin, ymax) {
+      return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
+    }
 
-        for (var i = 0; i < inputLength; i += 2) {
-          out[index] = [arr[i], arr[i + 1]];
-          ++index;
-        }
+    let domain = toNumberArray(dict.getArray("Domain"));
+    let range = toNumberArray(dict.getArray("Range"));
 
-        return out;
-      }
+    if (!domain || !range) {
+      throw new _util.FormatError("No domain or range");
+    }
 
-      var domain = toNumberArray(dict.getArray("Domain"));
-      var range = toNumberArray(dict.getArray("Range"));
+    const inputSize = domain.length / 2;
+    const outputSize = range.length / 2;
+    domain = toMultiArray(domain);
+    range = toMultiArray(range);
+    const size = toNumberArray(dict.getArray("Size"));
+    const bps = dict.get("BitsPerSample");
+    const order = dict.get("Order") || 1;
 
-      if (!domain || !range) {
-        throw new _util.FormatError("No domain or range");
-      }
+    if (order !== 1) {
+      (0, _util.info)("No support for cubic spline interpolation: " + order);
+    }
 
-      var inputSize = domain.length / 2;
-      var outputSize = range.length / 2;
-      domain = toMultiArray(domain);
-      range = toMultiArray(range);
-      var size = toNumberArray(dict.getArray("Size"));
-      var bps = dict.get("BitsPerSample");
-      var order = dict.get("Order") || 1;
+    let encode = toNumberArray(dict.getArray("Encode"));
 
-      if (order !== 1) {
-        (0, _util.info)("No support for cubic spline interpolation: " + order);
-      }
+    if (!encode) {
+      encode = [];
 
-      var encode = toNumberArray(dict.getArray("Encode"));
+      for (let i = 0; i < inputSize; ++i) {
+        encode.push([0, size[i] - 1]);
+      }
+    } else {
+      encode = toMultiArray(encode);
+    }
 
-      if (!encode) {
-        encode = [];
+    let decode = toNumberArray(dict.getArray("Decode"));
 
-        for (var i = 0; i < inputSize; ++i) {
-          encode.push([0, size[i] - 1]);
-        }
-      } else {
-        encode = toMultiArray(encode);
-      }
+    if (!decode) {
+      decode = range;
+    } else {
+      decode = toMultiArray(decode);
+    }
 
-      var decode = toNumberArray(dict.getArray("Decode"));
+    const samples = this.getSampleArray(size, outputSize, bps, fn);
+    return function constructSampledFn(src, srcOffset, dest, destOffset) {
+      const cubeVertices = 1 << inputSize;
+      const cubeN = new Float64Array(cubeVertices);
+      const cubeVertex = new Uint32Array(cubeVertices);
+      let i, j;
 
-      if (!decode) {
-        decode = range;
-      } else {
-        decode = toMultiArray(decode);
+      for (j = 0; j < cubeVertices; j++) {
+        cubeN[j] = 1;
       }
 
-      var samples = this.getSampleArray(size, outputSize, bps, fn);
-      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, 2 ** bps - 1, 
range];
-    },
+      let k = outputSize,
+          pos = 1;
 
-    constructSampledFromIR({
-      xref,
-      isEvalSupported,
-      IR
-    }) {
-      function interpolate(x, xmin, xmax, ymin, ymax) {
-        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
-      }
-
-      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {
-        var m = IR[1];
-        var domain = IR[2];
-        var encode = IR[3];
-        var decode = IR[4];
-        var samples = IR[5];
-        var size = IR[6];
-        var n = IR[7];
-        var range = IR[9];
-        var cubeVertices = 1 << m;
-        var cubeN = new Float64Array(cubeVertices);
-        var cubeVertex = new Uint32Array(cubeVertices);
-        var i, j;
+      for (i = 0; i < inputSize; ++i) {
+        const domain_2i = domain[i][0];
+        const domain_2i_1 = domain[i][1];
+        const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
+        let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
+        const size_i = size[i];
+        e = Math.min(Math.max(e, 0), size_i - 1);
+        const e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
+        const n0 = e0 + 1 - e;
+        const n1 = e - e0;
+        const offset0 = e0 * k;
+        const offset1 = offset0 + k;
 
         for (j = 0; j < cubeVertices; j++) {
-          cubeN[j] = 1;
-        }
-
-        var k = n,
-            pos = 1;
-
-        for (i = 0; i < m; ++i) {
-          var domain_2i = domain[i][0];
-          var domain_2i_1 = domain[i][1];
-          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
-          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
-          var size_i = size[i];
-          e = Math.min(Math.max(e, 0), size_i - 1);
-          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
-          var n0 = e0 + 1 - e;
-          var n1 = e - e0;
-          var offset0 = e0 * k;
-          var offset1 = offset0 + k;
-
-          for (j = 0; j < cubeVertices; j++) {
-            if (j & pos) {
-              cubeN[j] *= n1;
-              cubeVertex[j] += offset1;
-            } else {
-              cubeN[j] *= n0;
-              cubeVertex[j] += offset0;
-            }
+          if (j & pos) {
+            cubeN[j] *= n1;
+            cubeVertex[j] += offset1;
+          } else {
+            cubeN[j] *= n0;
+            cubeVertex[j] += offset0;
           }
-
-          k *= size_i;
-          pos <<= 1;
         }
 
-        for (j = 0; j < n; ++j) {
-          var rj = 0;
+        k *= size_i;
+        pos <<= 1;
+      }
 
-          for (i = 0; i < cubeVertices; i++) {
-            rj += samples[cubeVertex[i] + j] * cubeN[i];
-          }
+      for (j = 0; j < outputSize; ++j) {
+        let rj = 0;
 
-          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        for (i = 0; i < cubeVertices; i++) {
+          rj += samples[cubeVertex[i] + j] * cubeN[i];
         }
-      };
-    },
-
-    constructInterpolated({
-      xref,
-      isEvalSupported,
-      fn,
-      dict
-    }) {
-      var c0 = toNumberArray(dict.getArray("C0")) || [0];
-      var c1 = toNumberArray(dict.getArray("C1")) || [1];
-      var n = dict.get("N");
-      var length = c0.length;
-      var diff = [];
 
-      for (var i = 0; i < length; ++i) {
-        diff.push(c1[i] - c0[i]);
+        rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+        dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
       }
+    };
+  }
 
-      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
-    },
-
-    constructInterpolatedFromIR({
-      xref,
-      isEvalSupported,
-      IR
-    }) {
-      var c0 = IR[1];
-      var diff = IR[2];
-      var n = IR[3];
-      var length = diff.length;
-      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {
-        var x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;
+  static constructInterpolated({
+    xref,
+    isEvalSupported,
+    dict
+  }) {
+    const c0 = toNumberArray(dict.getArray("C0")) || [0];
+    const c1 = toNumberArray(dict.getArray("C1")) || [1];
+    const n = dict.get("N");
+    const diff = [];
 
-        for (var j = 0; j < length; ++j) {
-          dest[destOffset + j] = c0[j] + x * diff[j];
-        }
-      };
-    },
+    for (let i = 0, ii = c0.length; i < ii; ++i) {
+      diff.push(c1[i] - c0[i]);
+    }
 
-    constructStiched({
-      xref,
-      isEvalSupported,
-      fn,
-      dict
-    }) {
-      var domain = toNumberArray(dict.getArray("Domain"));
+    const length = diff.length;
+    return function constructInterpolatedFn(src, srcOffset, dest, destOffset) {
+      const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;
 
-      if (!domain) {
-        throw new _util.FormatError("No domain");
+      for (let j = 0; j < length; ++j) {
+        dest[destOffset + j] = c0[j] + x * diff[j];
       }
+    };
+  }
 
-      var inputSize = domain.length / 2;
-
-      if (inputSize !== 1) {
-        throw new _util.FormatError("Bad domain for stiched function");
-      }
+  static constructStiched({
+    xref,
+    isEvalSupported,
+    dict
+  }) {
+    const domain = toNumberArray(dict.getArray("Domain"));
 
-      var fnRefs = dict.get("Functions");
-      var fns = [];
+    if (!domain) {
+      throw new _util.FormatError("No domain");
+    }
 
-      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
-        fns.push(this.parse({
-          xref,
-          isEvalSupported,
-          fn: xref.fetchIfRef(fnRefs[i])
-        }));
-      }
+    const inputSize = domain.length / 2;
 
-      var bounds = toNumberArray(dict.getArray("Bounds"));
-      var encode = toNumberArray(dict.getArray("Encode"));
-      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
-    },
+    if (inputSize !== 1) {
+      throw new _util.FormatError("Bad domain for stiched function");
+    }
 
-    constructStichedFromIR({
-      xref,
-      isEvalSupported,
-      IR
-    }) {
-      var domain = IR[1];
-      var bounds = IR[2];
-      var encode = IR[3];
-      var fns = IR[4];
-      var tmpBuf = new Float32Array(1);
-      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
-        var clip = function constructStichedFromIRClip(v, min, max) {
-          if (v > max) {
-            v = max;
-          } else if (v < min) {
-            v = min;
-          }
-
-          return v;
-        };
+    const fnRefs = dict.get("Functions");
+    const fns = [];
 
-        var v = clip(src[srcOffset], domain[0], domain[1]);
+    for (let i = 0, ii = fnRefs.length; i < ii; ++i) {
+      fns.push(this.parse({
+        xref,
+        isEvalSupported,
+        fn: xref.fetchIfRef(fnRefs[i])
+      }));
+    }
 
-        for (var i = 0, ii = bounds.length; i < ii; ++i) {
-          if (v < bounds[i]) {
-            break;
-          }
+    const bounds = toNumberArray(dict.getArray("Bounds"));
+    const encode = toNumberArray(dict.getArray("Encode"));
+    const tmpBuf = new Float32Array(1);
+    return function constructStichedFn(src, srcOffset, dest, destOffset) {
+      const clip = function constructStichedFromIRClip(v, min, max) {
+        if (v > max) {
+          v = max;
+        } else if (v < min) {
+          v = min;
         }
 
-        var dmin = domain[0];
-
-        if (i > 0) {
-          dmin = bounds[i - 1];
-        }
+        return v;
+      };
 
-        var dmax = domain[1];
+      const v = clip(src[srcOffset], domain[0], domain[1]);
+      const length = bounds.length;
+      let i;
 
-        if (i < bounds.length) {
-          dmax = bounds[i];
+      for (i = 0; i < length; ++i) {
+        if (v < bounds[i]) {
+          break;
         }
+      }
 
-        var rmin = encode[2 * i];
-        var rmax = encode[2 * i + 1];
-        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-        fns[i](tmpBuf, 0, dest, destOffset);
-      };
-    },
-
-    constructPostScript({
-      xref,
-      isEvalSupported,
-      fn,
-      dict
-    }) {
-      var domain = toNumberArray(dict.getArray("Domain"));
-      var range = toNumberArray(dict.getArray("Range"));
+      let dmin = domain[0];
 
-      if (!domain) {
-        throw new _util.FormatError("No domain.");
+      if (i > 0) {
+        dmin = bounds[i - 1];
       }
 
-      if (!range) {
-        throw new _util.FormatError("No range.");
+      let dmax = domain[1];
+
+      if (i < bounds.length) {
+        dmax = bounds[i];
       }
 
-      var lexer = new _ps_parser.PostScriptLexer(fn);
-      var parser = new _ps_parser.PostScriptParser(lexer);
-      var code = parser.parse();
-      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
-    },
+      const rmin = encode[2 * i];
+      const rmax = encode[2 * i + 1];
+      tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+      fns[i](tmpBuf, 0, dest, destOffset);
+    };
+  }
 
-    constructPostScriptFromIR({
-      xref,
-      isEvalSupported,
-      IR
-    }) {
-      var domain = IR[1];
-      var range = IR[2];
-      var code = IR[3];
+  static constructPostScript({
+    xref,
+    isEvalSupported,
+    fn,
+    dict
+  }) {
+    const domain = toNumberArray(dict.getArray("Domain"));
+    const range = toNumberArray(dict.getArray("Range"));
 
-      if (isEvalSupported && _util.IsEvalSupportedCached.value) {
-        const compiled = new PostScriptCompiler().compile(code, domain, range);
+    if (!domain) {
+      throw new _util.FormatError("No domain.");
+    }
 
-        if (compiled) {
-          return new Function("src", "srcOffset", "dest", "destOffset", compiled);
-        }
+    if (!range) {
+      throw new _util.FormatError("No range.");
+    }
+
+    const lexer = new _ps_parser.PostScriptLexer(fn);
+    const parser = new _ps_parser.PostScriptParser(lexer);
+    const code = parser.parse();
+
+    if (isEvalSupported && _util.IsEvalSupportedCached.value) {
+      const compiled = new PostScriptCompiler().compile(code, domain, range);
+
+      if (compiled) {
+        return new Function("src", "srcOffset", "dest", "destOffset", compiled);
       }
+    }
 
-      (0, _util.info)("Unable to compile PS function");
-      var numOutputs = range.length >> 1;
-      var numInputs = domain.length >> 1;
-      var evaluator = new PostScriptEvaluator(code);
-      var cache = Object.create(null);
-      var MAX_CACHE_SIZE = 2048 * 4;
-      var cache_available = MAX_CACHE_SIZE;
-      var tmpBuf = new Float32Array(numInputs);
-      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {
-        var i, value;
-        var key = "";
-        var input = tmpBuf;
+    (0, _util.info)("Unable to compile PS function");
+    const numOutputs = range.length >> 1;
+    const numInputs = domain.length >> 1;
+    const evaluator = new PostScriptEvaluator(code);
+    const cache = Object.create(null);
+    const MAX_CACHE_SIZE = 2048 * 4;
+    let cache_available = MAX_CACHE_SIZE;
+    const tmpBuf = new Float32Array(numInputs);
+    return function constructPostScriptFn(src, srcOffset, dest, destOffset) {
+      let i, value;
+      let key = "";
+      const input = tmpBuf;
 
-        for (i = 0; i < numInputs; i++) {
-          value = src[srcOffset + i];
-          input[i] = value;
-          key += value + "_";
-        }
+      for (i = 0; i < numInputs; i++) {
+        value = src[srcOffset + i];
+        input[i] = value;
+        key += value + "_";
+      }
 
-        var cachedValue = cache[key];
+      const cachedValue = cache[key];
 
-        if (cachedValue !== undefined) {
-          dest.set(cachedValue, destOffset);
-          return;
-        }
+      if (cachedValue !== undefined) {
+        dest.set(cachedValue, destOffset);
+        return;
+      }
 
-        var output = new Float32Array(numOutputs);
-        var stack = evaluator.execute(input);
-        var stackIndex = stack.length - numOutputs;
+      const output = new Float32Array(numOutputs);
+      const stack = evaluator.execute(input);
+      const stackIndex = stack.length - numOutputs;
 
-        for (i = 0; i < numOutputs; i++) {
-          value = stack[stackIndex + i];
-          var bound = range[i * 2];
+      for (i = 0; i < numOutputs; i++) {
+        value = stack[stackIndex + i];
+        let bound = range[i * 2];
 
-          if (value < bound) {
-            value = bound;
-          } else {
-            bound = range[i * 2 + 1];
+        if (value < bound) {
+          value = bound;
+        } else {
+          bound = range[i * 2 + 1];
 
-            if (value > bound) {
-              value = bound;
-            }
+          if (value > bound) {
+            value = bound;
           }
-
-          output[i] = value;
         }
 
-        if (cache_available > 0) {
-          cache_available--;
-          cache[key] = output;
-        }
+        output[i] = value;
+      }
 
-        dest.set(output, destOffset);
-      };
-    }
+      if (cache_available > 0) {
+        cache_available--;
+        cache[key] = output;
+      }
 
-  };
-}();
+      dest.set(output, destOffset);
+    };
+  }
+
+}
 
 function isPDFFunction(v) {
-  var fnDict;
+  let fnDict;
 
   if (typeof v !== "object") {
     return false;
@@ -41893,469 +45768,477 @@ function isPDFFunction(v) {
   return fnDict.has("FunctionType");
 }
 
-var PostScriptStack = function PostScriptStackClosure() {
-  var MAX_STACK_SIZE = 100;
+class PostScriptStack {
+  static get MAX_STACK_SIZE() {
+    return (0, _util.shadow)(this, "MAX_STACK_SIZE", 100);
+  }
 
-  function PostScriptStack(initialStack) {
+  constructor(initialStack) {
     this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);
   }
 
-  PostScriptStack.prototype = {
-    push: function PostScriptStack_push(value) {
-      if (this.stack.length >= MAX_STACK_SIZE) {
-        throw new Error("PostScript function stack overflow.");
-      }
+  push(value) {
+    if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) {
+      throw new Error("PostScript function stack overflow.");
+    }
 
-      this.stack.push(value);
-    },
-    pop: function PostScriptStack_pop() {
-      if (this.stack.length <= 0) {
-        throw new Error("PostScript function stack underflow.");
-      }
+    this.stack.push(value);
+  }
 
-      return this.stack.pop();
-    },
-    copy: function PostScriptStack_copy(n) {
-      if (this.stack.length + n >= MAX_STACK_SIZE) {
-        throw new Error("PostScript function stack overflow.");
-      }
+  pop() {
+    if (this.stack.length <= 0) {
+      throw new Error("PostScript function stack underflow.");
+    }
 
-      var stack = this.stack;
+    return this.stack.pop();
+  }
 
-      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
-        stack.push(stack[i]);
-      }
-    },
-    index: function PostScriptStack_index(n) {
-      this.push(this.stack[this.stack.length - n - 1]);
-    },
-    roll: function PostScriptStack_roll(n, p) {
-      var stack = this.stack;
-      var l = stack.length - n;
-      var r = stack.length - 1,
-          c = l + (p - Math.floor(p / n) * n),
-          i,
-          j,
-          t;
+  copy(n) {
+    if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) {
+      throw new Error("PostScript function stack overflow.");
+    }
 
-      for (i = l, j = r; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
+    const stack = this.stack;
 
-      for (i = l, j = c - 1; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
+    for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+      stack.push(stack[i]);
+    }
+  }
 
-      for (i = c, j = r; i < j; i++, j--) {
-        t = stack[i];
-        stack[i] = stack[j];
-        stack[j] = t;
-      }
+  index(n) {
+    this.push(this.stack[this.stack.length - n - 1]);
+  }
+
+  roll(n, p) {
+    const stack = this.stack;
+    const l = stack.length - n;
+    const r = stack.length - 1;
+    const c = l + (p - Math.floor(p / n) * n);
+
+    for (let i = l, j = r; i < j; i++, j--) {
+      const t = stack[i];
+      stack[i] = stack[j];
+      stack[j] = t;
     }
-  };
-  return PostScriptStack;
-}();
 
-var PostScriptEvaluator = function PostScriptEvaluatorClosure() {
-  function PostScriptEvaluator(operators) {
+    for (let i = l, j = c - 1; i < j; i++, j--) {
+      const t = stack[i];
+      stack[i] = stack[j];
+      stack[j] = t;
+    }
+
+    for (let i = c, j = r; i < j; i++, j--) {
+      const t = stack[i];
+      stack[i] = stack[j];
+      stack[j] = t;
+    }
+  }
+
+}
+
+class PostScriptEvaluator {
+  constructor(operators) {
     this.operators = operators;
   }
 
-  PostScriptEvaluator.prototype = {
-    execute: function PostScriptEvaluator_execute(initialStack) {
-      var stack = new PostScriptStack(initialStack);
-      var counter = 0;
-      var operators = this.operators;
-      var length = operators.length;
-      var operator, a, b;
+  execute(initialStack) {
+    const stack = new PostScriptStack(initialStack);
+    let counter = 0;
+    const operators = this.operators;
+    const length = operators.length;
+    let operator, a, b;
 
-      while (counter < length) {
-        operator = operators[counter++];
+    while (counter < length) {
+      operator = operators[counter++];
 
-        if (typeof operator === "number") {
-          stack.push(operator);
-          continue;
-        }
+      if (typeof operator === "number") {
+        stack.push(operator);
+        continue;
+      }
 
-        switch (operator) {
-          case "jz":
-            b = stack.pop();
-            a = stack.pop();
+      switch (operator) {
+        case "jz":
+          b = stack.pop();
+          a = stack.pop();
 
-            if (!a) {
-              counter = b;
-            }
+          if (!a) {
+            counter = b;
+          }
 
-            break;
+          break;
 
-          case "j":
-            a = stack.pop();
-            counter = a;
-            break;
+        case "j":
+          a = stack.pop();
+          counter = a;
+          break;
 
-          case "abs":
-            a = stack.pop();
-            stack.push(Math.abs(a));
-            break;
+        case "abs":
+          a = stack.pop();
+          stack.push(Math.abs(a));
+          break;
 
-          case "add":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a + b);
-            break;
+        case "add":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a + b);
+          break;
 
-          case "and":
-            b = stack.pop();
-            a = stack.pop();
+        case "and":
+          b = stack.pop();
+          a = stack.pop();
 
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a && b);
-            } else {
-              stack.push(a & b);
-            }
+          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+            stack.push(a && b);
+          } else {
+            stack.push(a & b);
+          }
 
-            break;
+          break;
 
-          case "atan":
-            a = stack.pop();
-            stack.push(Math.atan(a));
-            break;
+        case "atan":
+          a = stack.pop();
+          stack.push(Math.atan(a));
+          break;
 
-          case "bitshift":
-            b = stack.pop();
-            a = stack.pop();
+        case "bitshift":
+          b = stack.pop();
+          a = stack.pop();
 
-            if (a > 0) {
-              stack.push(a << b);
-            } else {
-              stack.push(a >> b);
-            }
+          if (a > 0) {
+            stack.push(a << b);
+          } else {
+            stack.push(a >> b);
+          }
 
-            break;
+          break;
 
-          case "ceiling":
-            a = stack.pop();
-            stack.push(Math.ceil(a));
-            break;
+        case "ceiling":
+          a = stack.pop();
+          stack.push(Math.ceil(a));
+          break;
 
-          case "copy":
-            a = stack.pop();
-            stack.copy(a);
-            break;
+        case "copy":
+          a = stack.pop();
+          stack.copy(a);
+          break;
 
-          case "cos":
-            a = stack.pop();
-            stack.push(Math.cos(a));
-            break;
+        case "cos":
+          a = stack.pop();
+          stack.push(Math.cos(a));
+          break;
 
-          case "cvi":
-            a = stack.pop() | 0;
-            stack.push(a);
-            break;
+        case "cvi":
+          a = stack.pop() | 0;
+          stack.push(a);
+          break;
 
-          case "cvr":
-            break;
+        case "cvr":
+          break;
 
-          case "div":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b);
-            break;
+        case "div":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a / b);
+          break;
 
-          case "dup":
-            stack.copy(1);
-            break;
+        case "dup":
+          stack.copy(1);
+          break;
 
-          case "eq":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a === b);
-            break;
+        case "eq":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a === b);
+          break;
 
-          case "exch":
-            stack.roll(2, 1);
-            break;
+        case "exch":
+          stack.roll(2, 1);
+          break;
 
-          case "exp":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a ** b);
-            break;
+        case "exp":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a ** b);
+          break;
 
-          case "false":
-            stack.push(false);
-            break;
+        case "false":
+          stack.push(false);
+          break;
 
-          case "floor":
-            a = stack.pop();
-            stack.push(Math.floor(a));
-            break;
+        case "floor":
+          a = stack.pop();
+          stack.push(Math.floor(a));
+          break;
 
-          case "ge":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a >= b);
-            break;
+        case "ge":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a >= b);
+          break;
 
-          case "gt":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a > b);
-            break;
+        case "gt":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a > b);
+          break;
 
-          case "idiv":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b | 0);
-            break;
+        case "idiv":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a / b | 0);
+          break;
 
-          case "index":
-            a = stack.pop();
-            stack.index(a);
-            break;
+        case "index":
+          a = stack.pop();
+          stack.index(a);
+          break;
 
-          case "le":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a <= b);
-            break;
+        case "le":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a <= b);
+          break;
 
-          case "ln":
-            a = stack.pop();
-            stack.push(Math.log(a));
-            break;
+        case "ln":
+          a = stack.pop();
+          stack.push(Math.log(a));
+          break;
 
-          case "log":
-            a = stack.pop();
-            stack.push(Math.log(a) / Math.LN10);
-            break;
+        case "log":
+          a = stack.pop();
+          stack.push(Math.log(a) / Math.LN10);
+          break;
 
-          case "lt":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a < b);
-            break;
+        case "lt":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a < b);
+          break;
 
-          case "mod":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a % b);
-            break;
+        case "mod":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a % b);
+          break;
 
-          case "mul":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a * b);
-            break;
+        case "mul":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a * b);
+          break;
 
-          case "ne":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a !== b);
-            break;
+        case "ne":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a !== b);
+          break;
 
-          case "neg":
-            a = stack.pop();
-            stack.push(-a);
-            break;
+        case "neg":
+          a = stack.pop();
+          stack.push(-a);
+          break;
 
-          case "not":
-            a = stack.pop();
+        case "not":
+          a = stack.pop();
 
-            if ((0, _util.isBool)(a)) {
-              stack.push(!a);
-            } else {
-              stack.push(~a);
-            }
+          if ((0, _util.isBool)(a)) {
+            stack.push(!a);
+          } else {
+            stack.push(~a);
+          }
 
-            break;
+          break;
 
-          case "or":
-            b = stack.pop();
-            a = stack.pop();
+        case "or":
+          b = stack.pop();
+          a = stack.pop();
 
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a || b);
-            } else {
-              stack.push(a | b);
-            }
+          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+            stack.push(a || b);
+          } else {
+            stack.push(a | b);
+          }
 
-            break;
+          break;
 
-          case "pop":
-            stack.pop();
-            break;
+        case "pop":
+          stack.pop();
+          break;
 
-          case "roll":
-            b = stack.pop();
-            a = stack.pop();
-            stack.roll(a, b);
-            break;
+        case "roll":
+          b = stack.pop();
+          a = stack.pop();
+          stack.roll(a, b);
+          break;
 
-          case "round":
-            a = stack.pop();
-            stack.push(Math.round(a));
-            break;
+        case "round":
+          a = stack.pop();
+          stack.push(Math.round(a));
+          break;
 
-          case "sin":
-            a = stack.pop();
-            stack.push(Math.sin(a));
-            break;
+        case "sin":
+          a = stack.pop();
+          stack.push(Math.sin(a));
+          break;
 
-          case "sqrt":
-            a = stack.pop();
-            stack.push(Math.sqrt(a));
-            break;
+        case "sqrt":
+          a = stack.pop();
+          stack.push(Math.sqrt(a));
+          break;
 
-          case "sub":
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a - b);
-            break;
+        case "sub":
+          b = stack.pop();
+          a = stack.pop();
+          stack.push(a - b);
+          break;
 
-          case "true":
-            stack.push(true);
-            break;
+        case "true":
+          stack.push(true);
+          break;
 
-          case "truncate":
-            a = stack.pop();
-            a = a < 0 ? Math.ceil(a) : Math.floor(a);
-            stack.push(a);
-            break;
+        case "truncate":
+          a = stack.pop();
+          a = a < 0 ? Math.ceil(a) : Math.floor(a);
+          stack.push(a);
+          break;
 
-          case "xor":
-            b = stack.pop();
-            a = stack.pop();
+        case "xor":
+          b = stack.pop();
+          a = stack.pop();
 
-            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
-              stack.push(a !== b);
-            } else {
-              stack.push(a ^ b);
-            }
+          if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+            stack.push(a !== b);
+          } else {
+            stack.push(a ^ b);
+          }
 
-            break;
+          break;
 
-          default:
-            throw new _util.FormatError(`Unknown operator ${operator}`);
-        }
+        default:
+          throw new _util.FormatError(`Unknown operator ${operator}`);
       }
-
-      return stack.stack;
     }
-  };
-  return PostScriptEvaluator;
-}();
+
+    return stack.stack;
+  }
+
+}
 
 exports.PostScriptEvaluator = PostScriptEvaluator;
 
-var PostScriptCompiler = function PostScriptCompilerClosure() {
-  function AstNode(type) {
-    this.type = type;
-  }
+const PostScriptCompiler = function PostScriptCompilerClosure() {
+  class AstNode {
+    constructor(type) {
+      this.type = type;
+    }
 
-  AstNode.prototype.visit = function (visitor) {
-    (0, _util.unreachable)("abstract method");
-  };
+    visit(visitor) {
+      (0, _util.unreachable)("abstract method");
+    }
 
-  function AstArgument(index, min, max) {
-    AstNode.call(this, "args");
-    this.index = index;
-    this.min = min;
-    this.max = max;
   }
 
-  AstArgument.prototype = Object.create(AstNode.prototype);
+  class AstArgument extends AstNode {
+    constructor(index, min, max) {
+      super("args");
+      this.index = index;
+      this.min = min;
+      this.max = max;
+    }
 
-  AstArgument.prototype.visit = function (visitor) {
-    visitor.visitArgument(this);
-  };
+    visit(visitor) {
+      visitor.visitArgument(this);
+    }
 
-  function AstLiteral(number) {
-    AstNode.call(this, "literal");
-    this.number = number;
-    this.min = number;
-    this.max = number;
   }
 
-  AstLiteral.prototype = Object.create(AstNode.prototype);
+  class AstLiteral extends AstNode {
+    constructor(number) {
+      super("literal");
+      this.number = number;
+      this.min = number;
+      this.max = number;
+    }
 
-  AstLiteral.prototype.visit = function (visitor) {
-    visitor.visitLiteral(this);
-  };
+    visit(visitor) {
+      visitor.visitLiteral(this);
+    }
 
-  function AstBinaryOperation(op, arg1, arg2, min, max) {
-    AstNode.call(this, "binary");
-    this.op = op;
-    this.arg1 = arg1;
-    this.arg2 = arg2;
-    this.min = min;
-    this.max = max;
   }
 
-  AstBinaryOperation.prototype = Object.create(AstNode.prototype);
+  class AstBinaryOperation extends AstNode {
+    constructor(op, arg1, arg2, min, max) {
+      super("binary");
+      this.op = op;
+      this.arg1 = arg1;
+      this.arg2 = arg2;
+      this.min = min;
+      this.max = max;
+    }
 
-  AstBinaryOperation.prototype.visit = function (visitor) {
-    visitor.visitBinaryOperation(this);
-  };
+    visit(visitor) {
+      visitor.visitBinaryOperation(this);
+    }
 
-  function AstMin(arg, max) {
-    AstNode.call(this, "max");
-    this.arg = arg;
-    this.min = arg.min;
-    this.max = max;
   }
 
-  AstMin.prototype = Object.create(AstNode.prototype);
+  class AstMin extends AstNode {
+    constructor(arg, max) {
+      super("max");
+      this.arg = arg;
+      this.min = arg.min;
+      this.max = max;
+    }
 
-  AstMin.prototype.visit = function (visitor) {
-    visitor.visitMin(this);
-  };
+    visit(visitor) {
+      visitor.visitMin(this);
+    }
 
-  function AstVariable(index, min, max) {
-    AstNode.call(this, "var");
-    this.index = index;
-    this.min = min;
-    this.max = max;
   }
 
-  AstVariable.prototype = Object.create(AstNode.prototype);
+  class AstVariable extends AstNode {
+    constructor(index, min, max) {
+      super("var");
+      this.index = index;
+      this.min = min;
+      this.max = max;
+    }
 
-  AstVariable.prototype.visit = function (visitor) {
-    visitor.visitVariable(this);
-  };
+    visit(visitor) {
+      visitor.visitVariable(this);
+    }
 
-  function AstVariableDefinition(variable, arg) {
-    AstNode.call(this, "definition");
-    this.variable = variable;
-    this.arg = arg;
   }
 
-  AstVariableDefinition.prototype = Object.create(AstNode.prototype);
+  class AstVariableDefinition extends AstNode {
+    constructor(variable, arg) {
+      super("definition");
+      this.variable = variable;
+      this.arg = arg;
+    }
 
-  AstVariableDefinition.prototype.visit = function (visitor) {
-    visitor.visitVariableDefinition(this);
-  };
+    visit(visitor) {
+      visitor.visitVariableDefinition(this);
+    }
 
-  function ExpressionBuilderVisitor() {
-    this.parts = [];
   }
 
-  ExpressionBuilderVisitor.prototype = {
+  class ExpressionBuilderVisitor {
+    constructor() {
+      this.parts = [];
+    }
+
     visitArgument(arg) {
       this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))");
-    },
+    }
 
     visitVariable(variable) {
       this.parts.push("v", variable.index);
-    },
+    }
 
     visitLiteral(literal) {
       this.parts.push(literal.number);
-    },
+    }
 
     visitBinaryOperation(operation) {
       this.parts.push("(");
@@ -42363,7 +46246,7 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
       this.parts.push(" ", operation.op, " ");
       operation.arg2.visit(this);
       this.parts.push(")");
-    },
+    }
 
     visitVariableDefinition(definition) {
       this.parts.push("var ");
@@ -42371,19 +46254,19 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
       this.parts.push(" = ");
       definition.arg.visit(this);
       this.parts.push(";");
-    },
+    }
 
     visitMin(max) {
       this.parts.push("Math.min(");
       max.arg.visit(this);
       this.parts.push(", ", max.max, ")");
-    },
+    }
 
     toString() {
       return this.parts.join("");
     }
 
-  };
+  }
 
   function buildAddOperation(num1, num2) {
     if (num2.type === "literal" && num2.number === 0) {
@@ -42420,8 +46303,8 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
       }
     }
 
-    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
-    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
     return new AstBinaryOperation("*", num1, num2, min, max);
   }
 
@@ -42451,17 +46334,15 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
     return new AstMin(num1, max);
   }
 
-  function PostScriptCompiler() {}
-
-  PostScriptCompiler.prototype = {
-    compile: function PostScriptCompiler_compile(code, domain, range) {
-      var stack = [];
-      var instructions = [];
-      var inputSize = domain.length >> 1,
-          outputSize = range.length >> 1;
-      var lastRegister = 0;
-      var n, j;
-      var num1, num2, ast1, ast2, tmpVar, item;
+  class PostScriptCompiler {
+    compile(code, domain, range) {
+      const stack = [];
+      const instructions = [];
+      const inputSize = domain.length >> 1,
+            outputSize = range.length >> 1;
+      let lastRegister = 0;
+      let n, j;
+      let num1, num2, ast1, ast2, tmpVar, item;
 
       for (let i = 0; i < inputSize; i++) {
         stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
@@ -42623,18 +46504,21 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
         return null;
       }
 
-      var result = [];
-      instructions.forEach(function (instruction) {
-        var statementBuilder = new ExpressionBuilderVisitor();
+      const result = [];
+
+      for (const instruction of instructions) {
+        const statementBuilder = new ExpressionBuilderVisitor();
         instruction.visit(statementBuilder);
         result.push(statementBuilder.toString());
-      });
-      stack.forEach(function (expr, i) {
-        var statementBuilder = new ExpressionBuilderVisitor();
+      }
+
+      for (let i = 0, ii = stack.length; i < ii; i++) {
+        const expr = stack[i],
+              statementBuilder = new ExpressionBuilderVisitor();
         expr.visit(statementBuilder);
-        var min = range[i * 2],
-            max = range[i * 2 + 1];
-        var out = [statementBuilder.toString()];
+        const min = range[i * 2],
+              max = range[i * 2 + 1];
+        const out = [statementBuilder.toString()];
 
         if (min > expr.min) {
           out.unshift("Math.max(", min, ", ");
@@ -42646,288 +46530,613 @@ var PostScriptCompiler = function PostScriptCompilerClosure() {
           out.push(")");
         }
 
-        out.unshift("dest[destOffset + ", i, "] = ");
-        out.push(";");
-        result.push(out.join(""));
-      });
-      return result.join("\n");
+        out.unshift("dest[destOffset + ", i, "] = ");
+        out.push(";");
+        result.push(out.join(""));
+      }
+
+      return result.join("\n");
+    }
+
+  }
+
+  return PostScriptCompiler;
+}();
+
+exports.PostScriptCompiler = PostScriptCompiler;
+
+/***/ }),
+/* 51 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PostScriptParser = exports.PostScriptLexer = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+class PostScriptParser {
+  constructor(lexer) {
+    this.lexer = lexer;
+    this.operators = [];
+    this.token = null;
+    this.prev = null;
+  }
+
+  nextToken() {
+    this.prev = this.token;
+    this.token = this.lexer.getToken();
+  }
+
+  accept(type) {
+    if (this.token.type === type) {
+      this.nextToken();
+      return true;
+    }
+
+    return false;
+  }
+
+  expect(type) {
+    if (this.accept(type)) {
+      return true;
+    }
+
+    throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);
+  }
+
+  parse() {
+    this.nextToken();
+    this.expect(PostScriptTokenTypes.LBRACE);
+    this.parseBlock();
+    this.expect(PostScriptTokenTypes.RBRACE);
+    return this.operators;
+  }
+
+  parseBlock() {
+    while (true) {
+      if (this.accept(PostScriptTokenTypes.NUMBER)) {
+        this.operators.push(this.prev.value);
+      } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+        this.operators.push(this.prev.value);
+      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+        this.parseCondition();
+      } else {
+        return;
+      }
+    }
+  }
+
+  parseCondition() {
+    const conditionLocation = this.operators.length;
+    this.operators.push(null, null);
+    this.parseBlock();
+    this.expect(PostScriptTokenTypes.RBRACE);
+
+    if (this.accept(PostScriptTokenTypes.IF)) {
+      this.operators[conditionLocation] = this.operators.length;
+      this.operators[conditionLocation + 1] = "jz";
+    } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+      const jumpLocation = this.operators.length;
+      this.operators.push(null, null);
+      const endOfTrue = this.operators.length;
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      this.expect(PostScriptTokenTypes.IFELSE);
+      this.operators[jumpLocation] = this.operators.length;
+      this.operators[jumpLocation + 1] = "j";
+      this.operators[conditionLocation] = endOfTrue;
+      this.operators[conditionLocation + 1] = "jz";
+    } else {
+      throw new _util.FormatError("PS Function: error parsing conditional.");
+    }
+  }
+
+}
+
+exports.PostScriptParser = PostScriptParser;
+const PostScriptTokenTypes = {
+  LBRACE: 0,
+  RBRACE: 1,
+  NUMBER: 2,
+  OPERATOR: 3,
+  IF: 4,
+  IFELSE: 5
+};
+
+class PostScriptToken {
+  static get opCache() {
+    return (0, _util.shadow)(this, "opCache", Object.create(null));
+  }
+
+  constructor(type, value) {
+    this.type = type;
+    this.value = value;
+  }
+
+  static getOperator(op) {
+    const opValue = PostScriptToken.opCache[op];
+
+    if (opValue) {
+      return opValue;
+    }
+
+    return PostScriptToken.opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+  }
+
+  static get LBRACE() {
+    return (0, _util.shadow)(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{"));
+  }
+
+  static get RBRACE() {
+    return (0, _util.shadow)(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}"));
+  }
+
+  static get IF() {
+    return (0, _util.shadow)(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF"));
+  }
+
+  static get IFELSE() {
+    return (0, _util.shadow)(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE"));
+  }
+
+}
+
+class PostScriptLexer {
+  constructor(stream) {
+    this.stream = stream;
+    this.nextChar();
+    this.strBuf = [];
+  }
+
+  nextChar() {
+    return this.currentChar = this.stream.getByte();
+  }
+
+  getToken() {
+    let comment = false;
+    let ch = this.currentChar;
+
+    while (true) {
+      if (ch < 0) {
+        return _primitives.EOF;
+      }
+
+      if (comment) {
+        if (ch === 0x0a || ch === 0x0d) {
+          comment = false;
+        }
+      } else if (ch === 0x25) {
+        comment = true;
+      } else if (!(0, _core_utils.isWhiteSpace)(ch)) {
+        break;
+      }
+
+      ch = this.nextChar();
+    }
+
+    switch (ch | 0) {
+      case 0x30:
+      case 0x31:
+      case 0x32:
+      case 0x33:
+      case 0x34:
+      case 0x35:
+      case 0x36:
+      case 0x37:
+      case 0x38:
+      case 0x39:
+      case 0x2b:
+      case 0x2d:
+      case 0x2e:
+        return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
+
+      case 0x7b:
+        this.nextChar();
+        return PostScriptToken.LBRACE;
+
+      case 0x7d:
+        this.nextChar();
+        return PostScriptToken.RBRACE;
+    }
+
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    strBuf[0] = String.fromCharCode(ch);
+
+    while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) {
+      strBuf.push(String.fromCharCode(ch));
+    }
+
+    const str = strBuf.join("");
+
+    switch (str.toLowerCase()) {
+      case "if":
+        return PostScriptToken.IF;
+
+      case "ifelse":
+        return PostScriptToken.IFELSE;
+
+      default:
+        return PostScriptToken.getOperator(str);
+    }
+  }
+
+  getNumber() {
+    let ch = this.currentChar;
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    strBuf[0] = String.fromCharCode(ch);
+
+    while ((ch = this.nextChar()) >= 0) {
+      if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) {
+        strBuf.push(String.fromCharCode(ch));
+      } else {
+        break;
+      }
+    }
+
+    const value = parseFloat(strBuf.join(""));
+
+    if (isNaN(value)) {
+      throw new _util.FormatError(`Invalid floating point number: ${value}`);
+    }
+
+    return value;
+  }
+
+}
+
+exports.PostScriptLexer = PostScriptLexer;
+
+/***/ }),
+/* 52 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.LocalTilingPatternCache = exports.LocalImageCache = exports.LocalGStateCache = 
exports.LocalFunctionCache = exports.LocalColorSpaceCache = exports.GlobalImageCache = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+class BaseLocalCache {
+  constructor(options) {
+    if (this.constructor === BaseLocalCache) {
+      (0, _util.unreachable)("Cannot initialize BaseLocalCache.");
+    }
+
+    if (!options || !options.onlyRefs) {
+      this._nameRefMap = new Map();
+      this._imageMap = new Map();
+    }
+
+    this._imageCache = new _primitives.RefSetCache();
+  }
+
+  getByName(name) {
+    const ref = this._nameRefMap.get(name);
+
+    if (ref) {
+      return this.getByRef(ref);
+    }
+
+    return this._imageMap.get(name) || null;
+  }
+
+  getByRef(ref) {
+    return this._imageCache.get(ref) || null;
+  }
+
+  set(name, ref, data) {
+    (0, _util.unreachable)("Abstract method `set` called.");
+  }
+
+}
+
+class LocalImageCache extends BaseLocalCache {
+  set(name, ref = null, data) {
+    if (typeof name !== "string") {
+      throw new Error('LocalImageCache.set - expected "name" argument.');
+    }
+
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+
+      this._nameRefMap.set(name, ref);
+
+      this._imageCache.put(ref, data);
+
+      return;
+    }
+
+    if (this._imageMap.has(name)) {
+      return;
+    }
+
+    this._imageMap.set(name, data);
+  }
+
+}
+
+exports.LocalImageCache = LocalImageCache;
+
+class LocalColorSpaceCache extends BaseLocalCache {
+  set(name = null, ref = null, data) {
+    if (typeof name !== "string" && !ref) {
+      throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');
+    }
+
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+
+      if (name !== null) {
+        this._nameRefMap.set(name, ref);
+      }
+
+      this._imageCache.put(ref, data);
+
+      return;
+    }
+
+    if (this._imageMap.has(name)) {
+      return;
+    }
+
+    this._imageMap.set(name, data);
+  }
+
+}
+
+exports.LocalColorSpaceCache = LocalColorSpaceCache;
+
+class LocalFunctionCache extends BaseLocalCache {
+  constructor(options) {
+    super({
+      onlyRefs: true
+    });
+  }
+
+  getByName(name) {
+    (0, _util.unreachable)("Should not call `getByName` method.");
+  }
+
+  set(name = null, ref, data) {
+    if (!ref) {
+      throw new Error('LocalFunctionCache.set - expected "ref" argument.');
+    }
+
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+
+    this._imageCache.put(ref, data);
+  }
+
+}
+
+exports.LocalFunctionCache = LocalFunctionCache;
+
+class LocalGStateCache extends BaseLocalCache {
+  set(name, ref = null, data) {
+    if (typeof name !== "string") {
+      throw new Error('LocalGStateCache.set - expected "name" argument.');
+    }
+
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+
+      this._nameRefMap.set(name, ref);
+
+      this._imageCache.put(ref, data);
+
+      return;
     }
-  };
-  return PostScriptCompiler;
-}();
-
-exports.PostScriptCompiler = PostScriptCompiler;
 
-/***/ }),
-/* 41 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+    if (this._imageMap.has(name)) {
+      return;
+    }
 
-"use strict";
+    this._imageMap.set(name, data);
+  }
 
+}
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PostScriptParser = exports.PostScriptLexer = void 0;
+exports.LocalGStateCache = LocalGStateCache;
 
-var _util = __w_pdfjs_require__(2);
+class LocalTilingPatternCache extends BaseLocalCache {
+  set(name, ref = null, data) {
+    if (typeof name !== "string") {
+      throw new Error('LocalTilingPatternCache.set - expected "name" argument.');
+    }
 
-var _primitives = __w_pdfjs_require__(5);
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
 
-var _core_utils = __w_pdfjs_require__(8);
+      this._nameRefMap.set(name, ref);
 
-class PostScriptParser {
-  constructor(lexer) {
-    this.lexer = lexer;
-    this.operators = [];
-    this.token = null;
-    this.prev = null;
-  }
+      this._imageCache.put(ref, data);
 
-  nextToken() {
-    this.prev = this.token;
-    this.token = this.lexer.getToken();
-  }
+      return;
+    }
 
-  accept(type) {
-    if (this.token.type === type) {
-      this.nextToken();
-      return true;
+    if (this._imageMap.has(name)) {
+      return;
     }
 
-    return false;
+    this._imageMap.set(name, data);
   }
 
-  expect(type) {
-    if (this.accept(type)) {
-      return true;
-    }
+}
 
-    throw new _util.FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);
-  }
+exports.LocalTilingPatternCache = LocalTilingPatternCache;
 
-  parse() {
-    this.nextToken();
-    this.expect(PostScriptTokenTypes.LBRACE);
-    this.parseBlock();
-    this.expect(PostScriptTokenTypes.RBRACE);
-    return this.operators;
+class GlobalImageCache {
+  static get NUM_PAGES_THRESHOLD() {
+    return (0, _util.shadow)(this, "NUM_PAGES_THRESHOLD", 2);
   }
 
-  parseBlock() {
-    while (true) {
-      if (this.accept(PostScriptTokenTypes.NUMBER)) {
-        this.operators.push(this.prev.value);
-      } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
-        this.operators.push(this.prev.value);
-      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-        this.parseCondition();
-      } else {
-        return;
-      }
-    }
+  static get MIN_IMAGES_TO_CACHE() {
+    return (0, _util.shadow)(this, "MIN_IMAGES_TO_CACHE", 10);
   }
 
-  parseCondition() {
-    const conditionLocation = this.operators.length;
-    this.operators.push(null, null);
-    this.parseBlock();
-    this.expect(PostScriptTokenTypes.RBRACE);
+  static get MAX_BYTE_SIZE() {
+    return (0, _util.shadow)(this, "MAX_BYTE_SIZE", 40e6);
+  }
 
-    if (this.accept(PostScriptTokenTypes.IF)) {
-      this.operators[conditionLocation] = this.operators.length;
-      this.operators[conditionLocation + 1] = "jz";
-    } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-      const jumpLocation = this.operators.length;
-      this.operators.push(null, null);
-      const endOfTrue = this.operators.length;
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      this.expect(PostScriptTokenTypes.IFELSE);
-      this.operators[jumpLocation] = this.operators.length;
-      this.operators[jumpLocation + 1] = "j";
-      this.operators[conditionLocation] = endOfTrue;
-      this.operators[conditionLocation + 1] = "jz";
-    } else {
-      throw new _util.FormatError("PS Function: error parsing conditional.");
-    }
+  constructor() {
+    this._refCache = new _primitives.RefSetCache();
+    this._imageCache = new _primitives.RefSetCache();
   }
 
-}
+  get _byteSize() {
+    let byteSize = 0;
 
-exports.PostScriptParser = PostScriptParser;
-const PostScriptTokenTypes = {
-  LBRACE: 0,
-  RBRACE: 1,
-  NUMBER: 2,
-  OPERATOR: 3,
-  IF: 4,
-  IFELSE: 5
-};
+    this._imageCache.forEach(imageData => {
+      byteSize += imageData.byteSize;
+    });
 
-const PostScriptToken = function PostScriptTokenClosure() {
-  const opCache = Object.create(null);
+    return byteSize;
+  }
 
-  class PostScriptToken {
-    constructor(type, value) {
-      this.type = type;
-      this.value = value;
+  get _cacheLimitReached() {
+    if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) {
+      return false;
     }
 
-    static getOperator(op) {
-      const opValue = opCache[op];
-
-      if (opValue) {
-        return opValue;
-      }
-
-      return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+    if (this._byteSize < GlobalImageCache.MAX_BYTE_SIZE) {
+      return false;
     }
 
-    static get LBRACE() {
-      return (0, _util.shadow)(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{"));
-    }
+    return true;
+  }
 
-    static get RBRACE() {
-      return (0, _util.shadow)(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}"));
-    }
+  shouldCache(ref, pageIndex) {
+    const pageIndexSet = this._refCache.get(ref);
+
+    const numPages = pageIndexSet ? pageIndexSet.size + (pageIndexSet.has(pageIndex) ? 0 : 1) : 1;
 
-    static get IF() {
-      return (0, _util.shadow)(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF"));
+    if (numPages < GlobalImageCache.NUM_PAGES_THRESHOLD) {
+      return false;
     }
 
-    static get IFELSE() {
-      return (0, _util.shadow)(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE"));
+    if (!this._imageCache.has(ref) && this._cacheLimitReached) {
+      return false;
     }
 
+    return true;
   }
 
-  return PostScriptToken;
-}();
+  addPageIndex(ref, pageIndex) {
+    let pageIndexSet = this._refCache.get(ref);
 
-class PostScriptLexer {
-  constructor(stream) {
-    this.stream = stream;
-    this.nextChar();
-    this.strBuf = [];
-  }
+    if (!pageIndexSet) {
+      pageIndexSet = new Set();
 
-  nextChar() {
-    return this.currentChar = this.stream.getByte();
-  }
+      this._refCache.put(ref, pageIndexSet);
+    }
 
-  getToken() {
-    let comment = false;
-    let ch = this.currentChar;
+    pageIndexSet.add(pageIndex);
+  }
 
-    while (true) {
-      if (ch < 0) {
-        return _primitives.EOF;
-      }
+  addByteSize(ref, byteSize) {
+    const imageData = this._imageCache.get(ref);
 
-      if (comment) {
-        if (ch === 0x0a || ch === 0x0d) {
-          comment = false;
-        }
-      } else if (ch === 0x25) {
-        comment = true;
-      } else if (!(0, _core_utils.isWhiteSpace)(ch)) {
-        break;
-      }
+    if (!imageData) {
+      return;
+    }
 
-      ch = this.nextChar();
+    if (imageData.byteSize) {
+      return;
     }
 
-    switch (ch | 0) {
-      case 0x30:
-      case 0x31:
-      case 0x32:
-      case 0x33:
-      case 0x34:
-      case 0x35:
-      case 0x36:
-      case 0x37:
-      case 0x38:
-      case 0x39:
-      case 0x2b:
-      case 0x2d:
-      case 0x2e:
-        return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
+    imageData.byteSize = byteSize;
+  }
 
-      case 0x7b:
-        this.nextChar();
-        return PostScriptToken.LBRACE;
+  getData(ref, pageIndex) {
+    const pageIndexSet = this._refCache.get(ref);
 
-      case 0x7d:
-        this.nextChar();
-        return PostScriptToken.RBRACE;
+    if (!pageIndexSet) {
+      return null;
     }
 
-    const strBuf = this.strBuf;
-    strBuf.length = 0;
-    strBuf[0] = String.fromCharCode(ch);
-
-    while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) {
-      strBuf.push(String.fromCharCode(ch));
+    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
+      return null;
     }
 
-    const str = strBuf.join("");
+    const imageData = this._imageCache.get(ref);
 
-    switch (str.toLowerCase()) {
-      case "if":
-        return PostScriptToken.IF;
+    if (!imageData) {
+      return null;
+    }
 
-      case "ifelse":
-        return PostScriptToken.IFELSE;
+    pageIndexSet.add(pageIndex);
+    return imageData;
+  }
 
-      default:
-        return PostScriptToken.getOperator(str);
+  setData(ref, data) {
+    if (!this._refCache.has(ref)) {
+      throw new Error('GlobalImageCache.setData - expected "addPageIndex" to have been called.');
     }
-  }
 
-  getNumber() {
-    let ch = this.currentChar;
-    const strBuf = this.strBuf;
-    strBuf.length = 0;
-    strBuf[0] = String.fromCharCode(ch);
+    if (this._imageCache.has(ref)) {
+      return;
+    }
 
-    while ((ch = this.nextChar()) >= 0) {
-      if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) {
-        strBuf.push(String.fromCharCode(ch));
-      } else {
-        break;
-      }
+    if (this._cacheLimitReached) {
+      (0, _util.warn)("GlobalImageCache.setData - cache limit reached.");
+      return;
     }
 
-    const value = parseFloat(strBuf.join(""));
+    this._imageCache.put(ref, data);
+  }
 
-    if (isNaN(value)) {
-      throw new _util.FormatError(`Invalid floating point number: ${value}`);
+  clear(onlyData = false) {
+    if (!onlyData) {
+      this._refCache.clear();
     }
 
-    return value;
+    this._imageCache.clear();
   }
 
 }
 
-exports.PostScriptLexer = PostScriptLexer;
+exports.GlobalImageCache = GlobalImageCache;
 
 /***/ }),
-/* 42 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 53 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.bidi = bidi;
 
 var _util = __w_pdfjs_require__(2);
 
-var baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", 
"BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", 
"ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", 
"EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", 
"ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", 
"BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", 
"BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", 
"L", "ON", "ON", "BN"
 , "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"];
-var arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", 
"ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", 
"NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", 
"AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL",
  "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", 
"NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", 
"EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"];
+const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", 
"BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", 
"ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", 
"EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", 
"ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", 
"B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", 
"BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", 
"ON", "L", "ON", "ON", "B
 N", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", 
"ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", 
"L", "L"];
+const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", 
"ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", 
"NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", 
"AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL
 ", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", 
"AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", 
"NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", 
"EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"];
 
 function isOdd(i) {
   return (i & 1) !== 0;
@@ -42938,7 +47147,9 @@ function isEven(i) {
 }
 
 function findUnequal(arr, start, value) {
-  for (var j = start, jj = arr.length; j < jj; ++j) {
+  let j, jj;
+
+  for (j = start, jj = arr.length; j < jj; ++j) {
     if (arr[j] !== value) {
       return j;
     }
@@ -42948,14 +47159,14 @@ function findUnequal(arr, start, value) {
 }
 
 function setValues(arr, start, end, value) {
-  for (var j = start; j < end; ++j) {
+  for (let j = start; j < end; ++j) {
     arr[j] = value;
   }
 }
 
 function reverseValues(arr, start, end) {
-  for (var i = start, j = end - 1; i < j; ++i, --j) {
-    var temp = arr[i];
+  for (let i = start, j = end - 1; i < j; ++i, --j) {
+    const temp = arr[i];
     arr[i] = arr[j];
     arr[j] = temp;
   }
@@ -42976,12 +47187,12 @@ function createBidiText(str, isLTR, vertical = false) {
   };
 }
 
-var chars = [];
-var types = [];
+const chars = [];
+const types = [];
 
 function bidi(str, startLevel, vertical) {
-  var isLTR = true;
-  var strLength = str.length;
+  let isLTR = true;
+  const strLength = str.length;
 
   if (strLength === 0 || vertical) {
     return createBidiText(str, isLTR, vertical);
@@ -42989,13 +47200,13 @@ function bidi(str, startLevel, vertical) {
 
   chars.length = strLength;
   types.length = strLength;
-  var numBidi = 0;
-  var i, ii;
+  let numBidi = 0;
+  let i, ii;
 
   for (i = 0; i < strLength; ++i) {
     chars[i] = str.charAt(i);
-    var charCode = str.charCodeAt(i);
-    var charType = "L";
+    const charCode = str.charCodeAt(i);
+    let charType = "L";
 
     if (charCode <= 0x00ff) {
       charType = baseTypes[charCode];
@@ -43033,16 +47244,16 @@ function bidi(str, startLevel, vertical) {
     }
   }
 
-  var levels = [];
+  const levels = [];
 
   for (i = 0; i < strLength; ++i) {
     levels[i] = startLevel;
   }
 
-  var e = isOdd(startLevel) ? "R" : "L";
-  var sor = e;
-  var eor = sor;
-  var lastType = sor;
+  const e = isOdd(startLevel) ? "R" : "L";
+  const sor = e;
+  const eor = sor;
+  let lastType = sor;
 
   for (i = 0; i < strLength; ++i) {
     if (types[i] === "NSM") {
@@ -43053,7 +47264,7 @@ function bidi(str, startLevel, vertical) {
   }
 
   lastType = sor;
-  var t;
+  let t;
 
   for (i = 0; i < strLength; ++i) {
     t = types[i];
@@ -43085,9 +47296,7 @@ function bidi(str, startLevel, vertical) {
 
   for (i = 0; i < strLength; ++i) {
     if (types[i] === "EN") {
-      var j;
-
-      for (j = i - 1; j >= 0; --j) {
+      for (let j = i - 1; j >= 0; --j) {
         if (types[j] !== "ET") {
           break;
         }
@@ -43095,7 +47304,7 @@ function bidi(str, startLevel, vertical) {
         types[j] = "EN";
       }
 
-      for (j = i + 1; j < strLength; ++j) {
+      for (let j = i + 1; j < strLength; ++j) {
         if (types[j] !== "ET") {
           break;
         }
@@ -43127,14 +47336,14 @@ function bidi(str, startLevel, vertical) {
 
   for (i = 0; i < strLength; ++i) {
     if (types[i] === "ON") {
-      var end = findUnequal(types, i + 1, "ON");
-      var before = sor;
+      const end = findUnequal(types, i + 1, "ON");
+      let before = sor;
 
       if (i > 0) {
         before = types[i - 1];
       }
 
-      var after = eor;
+      let after = eor;
 
       if (end + 1 < strLength) {
         after = types[end + 1];
@@ -43178,9 +47387,9 @@ function bidi(str, startLevel, vertical) {
     }
   }
 
-  var highestLevel = -1;
-  var lowestOddLevel = 99;
-  var level;
+  let highestLevel = -1;
+  let lowestOddLevel = 99;
+  let level;
 
   for (i = 0, ii = levels.length; i < ii; ++i) {
     level = levels[i];
@@ -43195,7 +47404,7 @@ function bidi(str, startLevel, vertical) {
   }
 
   for (level = highestLevel; level >= lowestOddLevel; --level) {
-    var start = -1;
+    let start = -1;
 
     for (i = 0, ii = levels.length; i < ii; ++i) {
       if (levels[i] < level) {
@@ -43214,7 +47423,7 @@ function bidi(str, startLevel, vertical) {
   }
 
   for (i = 0, ii = chars.length; i < ii; ++i) {
-    var ch = chars[i];
+    const ch = chars[i];
 
     if (ch === "<" || ch === ">") {
       chars[i] = "";
@@ -43225,20 +47434,19 @@ function bidi(str, startLevel, vertical) {
 }
 
 /***/ }),
-/* 43 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 54 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.getMetrics = void 0;
 
-var _core_utils = __w_pdfjs_require__(8);
+var _core_utils = __w_pdfjs_require__(9);
 
-var getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) {
+const getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) {
   t.Courier = 600;
   t["Courier-Bold"] = 600;
   t["Courier-BoldOblique"] = 600;
@@ -45971,1023 +50179,20999 @@ var getMetrics = (0, _core_utils.getLookupTableFactory)(function (t) {
     t.imacron = 278;
     t.Euro = 500;
   });
-  t.ZapfDingbats = (0, _core_utils.getLookupTableFactory)(function (t) {
-    t.space = 278;
-    t.a1 = 974;
-    t.a2 = 961;
-    t.a202 = 974;
-    t.a3 = 980;
-    t.a4 = 719;
-    t.a5 = 789;
-    t.a119 = 790;
-    t.a118 = 791;
-    t.a117 = 690;
-    t.a11 = 960;
-    t.a12 = 939;
-    t.a13 = 549;
-    t.a14 = 855;
-    t.a15 = 911;
-    t.a16 = 933;
-    t.a105 = 911;
-    t.a17 = 945;
-    t.a18 = 974;
-    t.a19 = 755;
-    t.a20 = 846;
-    t.a21 = 762;
-    t.a22 = 761;
-    t.a23 = 571;
-    t.a24 = 677;
-    t.a25 = 763;
-    t.a26 = 760;
-    t.a27 = 759;
-    t.a28 = 754;
-    t.a6 = 494;
-    t.a7 = 552;
-    t.a8 = 537;
-    t.a9 = 577;
-    t.a10 = 692;
-    t.a29 = 786;
-    t.a30 = 788;
-    t.a31 = 788;
-    t.a32 = 790;
-    t.a33 = 793;
-    t.a34 = 794;
-    t.a35 = 816;
-    t.a36 = 823;
-    t.a37 = 789;
-    t.a38 = 841;
-    t.a39 = 823;
-    t.a40 = 833;
-    t.a41 = 816;
-    t.a42 = 831;
-    t.a43 = 923;
-    t.a44 = 744;
-    t.a45 = 723;
-    t.a46 = 749;
-    t.a47 = 790;
-    t.a48 = 792;
-    t.a49 = 695;
-    t.a50 = 776;
-    t.a51 = 768;
-    t.a52 = 792;
-    t.a53 = 759;
-    t.a54 = 707;
-    t.a55 = 708;
-    t.a56 = 682;
-    t.a57 = 701;
-    t.a58 = 826;
-    t.a59 = 815;
-    t.a60 = 789;
-    t.a61 = 789;
-    t.a62 = 707;
-    t.a63 = 687;
-    t.a64 = 696;
-    t.a65 = 689;
-    t.a66 = 786;
-    t.a67 = 787;
-    t.a68 = 713;
-    t.a69 = 791;
-    t.a70 = 785;
-    t.a71 = 791;
-    t.a72 = 873;
-    t.a73 = 761;
-    t.a74 = 762;
-    t.a203 = 762;
-    t.a75 = 759;
-    t.a204 = 759;
-    t.a76 = 892;
-    t.a77 = 892;
-    t.a78 = 788;
-    t.a79 = 784;
-    t.a81 = 438;
-    t.a82 = 138;
-    t.a83 = 277;
-    t.a84 = 415;
-    t.a97 = 392;
-    t.a98 = 392;
-    t.a99 = 668;
-    t.a100 = 668;
-    t.a89 = 390;
-    t.a90 = 390;
-    t.a93 = 317;
-    t.a94 = 317;
-    t.a91 = 276;
-    t.a92 = 276;
-    t.a205 = 509;
-    t.a85 = 509;
-    t.a206 = 410;
-    t.a86 = 410;
-    t.a87 = 234;
-    t.a88 = 234;
-    t.a95 = 334;
-    t.a96 = 334;
-    t.a101 = 732;
-    t.a102 = 544;
-    t.a103 = 544;
-    t.a104 = 910;
-    t.a106 = 667;
-    t.a107 = 760;
-    t.a108 = 760;
-    t.a112 = 776;
-    t.a111 = 595;
-    t.a110 = 694;
-    t.a109 = 626;
-    t.a120 = 788;
-    t.a121 = 788;
-    t.a122 = 788;
-    t.a123 = 788;
-    t.a124 = 788;
-    t.a125 = 788;
-    t.a126 = 788;
-    t.a127 = 788;
-    t.a128 = 788;
-    t.a129 = 788;
-    t.a130 = 788;
-    t.a131 = 788;
-    t.a132 = 788;
-    t.a133 = 788;
-    t.a134 = 788;
-    t.a135 = 788;
-    t.a136 = 788;
-    t.a137 = 788;
-    t.a138 = 788;
-    t.a139 = 788;
-    t.a140 = 788;
-    t.a141 = 788;
-    t.a142 = 788;
-    t.a143 = 788;
-    t.a144 = 788;
-    t.a145 = 788;
-    t.a146 = 788;
-    t.a147 = 788;
-    t.a148 = 788;
-    t.a149 = 788;
-    t.a150 = 788;
-    t.a151 = 788;
-    t.a152 = 788;
-    t.a153 = 788;
-    t.a154 = 788;
-    t.a155 = 788;
-    t.a156 = 788;
-    t.a157 = 788;
-    t.a158 = 788;
-    t.a159 = 788;
-    t.a160 = 894;
-    t.a161 = 838;
-    t.a163 = 1016;
-    t.a164 = 458;
-    t.a196 = 748;
-    t.a165 = 924;
-    t.a192 = 748;
-    t.a166 = 918;
-    t.a167 = 927;
-    t.a168 = 928;
-    t.a169 = 928;
-    t.a170 = 834;
-    t.a171 = 873;
-    t.a172 = 828;
-    t.a173 = 924;
-    t.a162 = 924;
-    t.a174 = 917;
-    t.a175 = 930;
-    t.a176 = 931;
-    t.a177 = 463;
-    t.a178 = 883;
-    t.a179 = 836;
-    t.a193 = 836;
-    t.a180 = 867;
-    t.a199 = 867;
-    t.a181 = 696;
-    t.a200 = 696;
-    t.a182 = 874;
-    t.a201 = 874;
-    t.a183 = 760;
-    t.a184 = 946;
-    t.a197 = 771;
-    t.a185 = 865;
-    t.a194 = 771;
-    t.a198 = 888;
-    t.a186 = 967;
-    t.a195 = 888;
-    t.a187 = 831;
-    t.a188 = 873;
-    t.a189 = 927;
-    t.a190 = 970;
-    t.a191 = 918;
+  t.ZapfDingbats = (0, _core_utils.getLookupTableFactory)(function (t) {
+    t.space = 278;
+    t.a1 = 974;
+    t.a2 = 961;
+    t.a202 = 974;
+    t.a3 = 980;
+    t.a4 = 719;
+    t.a5 = 789;
+    t.a119 = 790;
+    t.a118 = 791;
+    t.a117 = 690;
+    t.a11 = 960;
+    t.a12 = 939;
+    t.a13 = 549;
+    t.a14 = 855;
+    t.a15 = 911;
+    t.a16 = 933;
+    t.a105 = 911;
+    t.a17 = 945;
+    t.a18 = 974;
+    t.a19 = 755;
+    t.a20 = 846;
+    t.a21 = 762;
+    t.a22 = 761;
+    t.a23 = 571;
+    t.a24 = 677;
+    t.a25 = 763;
+    t.a26 = 760;
+    t.a27 = 759;
+    t.a28 = 754;
+    t.a6 = 494;
+    t.a7 = 552;
+    t.a8 = 537;
+    t.a9 = 577;
+    t.a10 = 692;
+    t.a29 = 786;
+    t.a30 = 788;
+    t.a31 = 788;
+    t.a32 = 790;
+    t.a33 = 793;
+    t.a34 = 794;
+    t.a35 = 816;
+    t.a36 = 823;
+    t.a37 = 789;
+    t.a38 = 841;
+    t.a39 = 823;
+    t.a40 = 833;
+    t.a41 = 816;
+    t.a42 = 831;
+    t.a43 = 923;
+    t.a44 = 744;
+    t.a45 = 723;
+    t.a46 = 749;
+    t.a47 = 790;
+    t.a48 = 792;
+    t.a49 = 695;
+    t.a50 = 776;
+    t.a51 = 768;
+    t.a52 = 792;
+    t.a53 = 759;
+    t.a54 = 707;
+    t.a55 = 708;
+    t.a56 = 682;
+    t.a57 = 701;
+    t.a58 = 826;
+    t.a59 = 815;
+    t.a60 = 789;
+    t.a61 = 789;
+    t.a62 = 707;
+    t.a63 = 687;
+    t.a64 = 696;
+    t.a65 = 689;
+    t.a66 = 786;
+    t.a67 = 787;
+    t.a68 = 713;
+    t.a69 = 791;
+    t.a70 = 785;
+    t.a71 = 791;
+    t.a72 = 873;
+    t.a73 = 761;
+    t.a74 = 762;
+    t.a203 = 762;
+    t.a75 = 759;
+    t.a204 = 759;
+    t.a76 = 892;
+    t.a77 = 892;
+    t.a78 = 788;
+    t.a79 = 784;
+    t.a81 = 438;
+    t.a82 = 138;
+    t.a83 = 277;
+    t.a84 = 415;
+    t.a97 = 392;
+    t.a98 = 392;
+    t.a99 = 668;
+    t.a100 = 668;
+    t.a89 = 390;
+    t.a90 = 390;
+    t.a93 = 317;
+    t.a94 = 317;
+    t.a91 = 276;
+    t.a92 = 276;
+    t.a205 = 509;
+    t.a85 = 509;
+    t.a206 = 410;
+    t.a86 = 410;
+    t.a87 = 234;
+    t.a88 = 234;
+    t.a95 = 334;
+    t.a96 = 334;
+    t.a101 = 732;
+    t.a102 = 544;
+    t.a103 = 544;
+    t.a104 = 910;
+    t.a106 = 667;
+    t.a107 = 760;
+    t.a108 = 760;
+    t.a112 = 776;
+    t.a111 = 595;
+    t.a110 = 694;
+    t.a109 = 626;
+    t.a120 = 788;
+    t.a121 = 788;
+    t.a122 = 788;
+    t.a123 = 788;
+    t.a124 = 788;
+    t.a125 = 788;
+    t.a126 = 788;
+    t.a127 = 788;
+    t.a128 = 788;
+    t.a129 = 788;
+    t.a130 = 788;
+    t.a131 = 788;
+    t.a132 = 788;
+    t.a133 = 788;
+    t.a134 = 788;
+    t.a135 = 788;
+    t.a136 = 788;
+    t.a137 = 788;
+    t.a138 = 788;
+    t.a139 = 788;
+    t.a140 = 788;
+    t.a141 = 788;
+    t.a142 = 788;
+    t.a143 = 788;
+    t.a144 = 788;
+    t.a145 = 788;
+    t.a146 = 788;
+    t.a147 = 788;
+    t.a148 = 788;
+    t.a149 = 788;
+    t.a150 = 788;
+    t.a151 = 788;
+    t.a152 = 788;
+    t.a153 = 788;
+    t.a154 = 788;
+    t.a155 = 788;
+    t.a156 = 788;
+    t.a157 = 788;
+    t.a158 = 788;
+    t.a159 = 788;
+    t.a160 = 894;
+    t.a161 = 838;
+    t.a163 = 1016;
+    t.a164 = 458;
+    t.a196 = 748;
+    t.a165 = 924;
+    t.a192 = 748;
+    t.a166 = 918;
+    t.a167 = 927;
+    t.a168 = 928;
+    t.a169 = 928;
+    t.a170 = 834;
+    t.a171 = 873;
+    t.a172 = 828;
+    t.a173 = 924;
+    t.a162 = 924;
+    t.a174 = 917;
+    t.a175 = 930;
+    t.a176 = 931;
+    t.a177 = 463;
+    t.a178 = 883;
+    t.a179 = 836;
+    t.a193 = 836;
+    t.a180 = 867;
+    t.a199 = 867;
+    t.a181 = 696;
+    t.a200 = 696;
+    t.a182 = 874;
+    t.a201 = 874;
+    t.a183 = 760;
+    t.a184 = 946;
+    t.a197 = 771;
+    t.a185 = 865;
+    t.a194 = 771;
+    t.a198 = 888;
+    t.a186 = 967;
+    t.a195 = 888;
+    t.a187 = 831;
+    t.a188 = 873;
+    t.a189 = 927;
+    t.a190 = 970;
+    t.a191 = 918;
+  });
+});
+exports.getMetrics = getMetrics;
+
+/***/ }),
+/* 55 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getXfaFontName = getXfaFontName;
+exports.getXfaFontWidths = getXfaFontWidths;
+
+var _calibri_factors = __w_pdfjs_require__(56);
+
+var _helvetica_factors = __w_pdfjs_require__(57);
+
+var _liberationsans_widths = __w_pdfjs_require__(58);
+
+var _myriadpro_factors = __w_pdfjs_require__(59);
+
+var _segoeui_factors = __w_pdfjs_require__(60);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _fonts_utils = __w_pdfjs_require__(38);
+
+const getXFAFontMap = (0, _core_utils.getLookupTableFactory)(function (t) {
+  t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: _myriadpro_factors.MyriadProRegularFactors,
+    baseWidths: _liberationsans_widths.LiberationSansRegularWidths,
+    lineHeight: _myriadpro_factors.MyriadProRegularLineHeight
+  };
+  t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: _myriadpro_factors.MyriadProBoldFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldWidths,
+    lineHeight: _myriadpro_factors.MyriadProBoldLineHeight
+  };
+  t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: _myriadpro_factors.MyriadProItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansItalicWidths,
+    lineHeight: _myriadpro_factors.MyriadProItalicLineHeight
+  };
+  t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: _myriadpro_factors.MyriadProBoldItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths,
+    lineHeight: _myriadpro_factors.MyriadProBoldItalicLineHeight
+  };
+  t.ArialMT = t.Arial = t["Arial-Regular"] = {
+    name: "LiberationSans-Regular",
+    baseWidths: _liberationsans_widths.LiberationSansRegularWidths
+  };
+  t["Arial-BoldMT"] = t["Arial-Bold"] = {
+    name: "LiberationSans-Bold",
+    baseWidths: _liberationsans_widths.LiberationSansBoldWidths
+  };
+  t["Arial-ItalicMT"] = t["Arial-Italic"] = {
+    name: "LiberationSans-Italic",
+    baseWidths: _liberationsans_widths.LiberationSansItalicWidths
+  };
+  t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths
+  };
+  t["Calibri-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: _calibri_factors.CalibriRegularFactors,
+    baseWidths: _liberationsans_widths.LiberationSansRegularWidths,
+    lineHeight: _calibri_factors.CalibriRegularLineHeight
+  };
+  t["Calibri-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: _calibri_factors.CalibriBoldFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldWidths,
+    lineHeight: _calibri_factors.CalibriBoldLineHeight
+  };
+  t["Calibri-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: _calibri_factors.CalibriItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansItalicWidths,
+    lineHeight: _calibri_factors.CalibriItalicLineHeight
+  };
+  t["Calibri-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: _calibri_factors.CalibriBoldItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths,
+    lineHeight: _calibri_factors.CalibriBoldItalicLineHeight
+  };
+  t["Segoeui-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: _segoeui_factors.SegoeuiRegularFactors,
+    baseWidths: _liberationsans_widths.LiberationSansRegularWidths,
+    lineHeight: _segoeui_factors.SegoeuiRegularLineHeight
+  };
+  t["Segoeui-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: _segoeui_factors.SegoeuiBoldFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldWidths,
+    lineHeight: _segoeui_factors.SegoeuiBoldLineHeight
+  };
+  t["Segoeui-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: _segoeui_factors.SegoeuiItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansItalicWidths,
+    lineHeight: _segoeui_factors.SegoeuiItalicLineHeight
+  };
+  t["Segoeui-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: _segoeui_factors.SegoeuiBoldItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths,
+    lineHeight: _segoeui_factors.SegoeuiBoldItalicLineHeight
+  };
+  t["Helvetica-Regular"] = t.Helvetica = {
+    name: "LiberationSans-Regular",
+    factors: _helvetica_factors.HelveticaRegularFactors,
+    baseWidths: _liberationsans_widths.LiberationSansRegularWidths,
+    lineHeight: _helvetica_factors.HelveticaRegularLineHeight
+  };
+  t["Helvetica-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: _helvetica_factors.HelveticaBoldFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldWidths,
+    lineHeight: _helvetica_factors.HelveticaBoldLineHeight
+  };
+  t["Helvetica-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: _helvetica_factors.HelveticaItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansItalicWidths,
+    lineHeight: _helvetica_factors.HelveticaItalicLineHeight
+  };
+  t["Helvetica-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: _helvetica_factors.HelveticaBoldItalicFactors,
+    baseWidths: _liberationsans_widths.LiberationSansBoldItalicWidths,
+    lineHeight: _helvetica_factors.HelveticaBoldItalicLineHeight
+  };
+});
+
+function getXfaFontName(name) {
+  const fontName = (0, _fonts_utils.normalizeFontName)(name);
+  const fontMap = getXFAFontMap();
+  return fontMap[fontName];
+}
+
+function getXfaFontWidths(name) {
+  const info = getXfaFontName(name);
+
+  if (!info) {
+    return null;
+  }
+
+  const {
+    baseWidths,
+    factors
+  } = info;
+
+  if (!factors) {
+    return baseWidths;
+  }
+
+  return baseWidths.map((w, i) => w * factors[i]);
+}
+
+/***/ }),
+/* 56 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.CalibriRegularLineHeight = exports.CalibriRegularFactors = exports.CalibriItalicLineHeight = 
exports.CalibriItalicFactors = exports.CalibriBoldLineHeight = exports.CalibriBoldItalicLineHeight = 
exports.CalibriBoldItalicFactors = exports.CalibriBoldFactors = void 0;
+const CalibriBoldFactors = [1.3877, 1, 0.83908, 0.77539, 0.77539, 0.83908, 0.83908, 0.83908, 0.83908, 
0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.7762, 0.7762, 0.73293, 0.73293, 
0.73293, 0.73293, 0.73293, 0.73293, 0.82577, 0.87289, 0.87289, 0.88506, 0.80367, 0.73133, 0.73133, 0.73133, 
0.73133, 0.73133, 0.73133, 0.73133, 0.73133, 0.73133, 0.88656, 0.73133, 0.73133, 0.57184, 0.87356, 0.6965, 
0.88506, 0.91133, 0.7514, 0.81921, 0.68156, 0.81921, 0.81921, 1, 0.81921, 0.87356, 1, 0.99862, 0.99862, 1, 
0.91075, 0.87356, 0.95958, 0.76229, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 
0.95958, 0.95958, 0.56289, 0.95958, 0.59526, 0.59526, 0.75727, 0.75727, 1, 0.69225, 0.69225, 0.89019, 
0.70424, 1, 0.91926, 0.70823, 1.04924, 1.04924, 0.9121, 0.9121, 0.9121, 1, 0.9121, 0.9121, 0.86943, 0.87402, 
0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.84896, 0.81235, 0.86943, 0.82001, 0.87508, 
0.87508, 0.86943, 0.79795, 0.9762, 0.873
 56, 0.99819, 0.88198, 0.77958, 0.77958, 0.77958, 1, 0.79795, 0.70864, 0.70572, 0.70572, 0.70572, 0.70572, 1, 
1, 1, 1, 1, 0.70572, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 0.70864, 0.70864, 0.70864, 0.70864, 1, 0.78275, 0.81055, 0.81055, 0.81055, 0.81055, 1, 0.86943, 0.79795, 
0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.77892, 0.56029, 
0.90399, 0.90399, 0.88653, 0.96017, 0.96017, 0.96017, 0.96017, 0.96017, 0.82577, 0.7648, 0.77892, 0.77892, 
0.77892, 0.77892, 0.77892, 0.78257, 0.78257, 0.78257, 0.78257, 0.78257, 0.88762, 0.88762, 0.88762, 0.88762, 
0.90323, 1, 0.88762, 0.8715, 0.8715, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 0.88762, 0
 .96108, 0.96108, 0.88762, 0.97566, 0.80352, 0.88762, 0.90747, 0.88762, 0.88762, 1.31006, 1.81055, 0.90527, 
0.90527, 1.81055, 1.53711, 0.94434, 0.85284, 0.85284, 1.2798, 0.92138, 0.88762, 0.8785, 1.54657, 1.69808, 
0.8936, 1, 0.88331, 0.88331, 0.97507, 0.97507, 1.15543, 1, 1.7801, 1.42259, 0.75241, 0.75241, 1.20528, 1, 1, 
0.75241, 0.75241, 0.75241, 0.75241, 0.91056, 0.89552, 0.78287, 0.91027, 1.20528, 1, 1, 0.82845, 0.92794, 1, 
1, 1.13254, 0.89552, 1, 0.8785, 0.89552, 0.89552, 0.83016, 0.93125, 0.85592, 0.87842, 1, 1.24487, 1, 1.06303, 
0.90747, 1, 1, 0.91133, 0.70674, 0.88401, 0.90518, 0.90518, 0.90518, 0.90518, 0.90518, 0.90518, 0.90518, 
0.90518, 0.91133, 1, 0.71143, 0.90518, 0.90527, 0.89552, 0.8785, 0.90518, 0.96399, 1.01407, 0.85284, 0.85356, 
1.23108, 0.89049, 0.89049, 0.8785, 0.97801, 0.97171, 0.97801, 0.95015, 1, 1, 1, 0.91133, 0.88525, 1, 0.56892, 
0.91133, 1, 0.83406, 0.77618, 0.84021, 0.77618, 0.77618, 1, 0.77618, 0.90807, 0.90176, 1, 0.85284, 0.90747, 
0.96839, 0.96839, 1.0337
 2, 1.03372, 0.8785, 0.89608, 0.8785, 1, 1.44947, 1.45894, 1, 0.88401, 0.88401, 0.88401, 0.88401, 0.88401, 
0.88401, 0.90167, 0.88401, 1.17534, 1.37077, 0.8941, 0.8941, 0.9716, 1, 1, 1, 0.88401, 1.02988, 1.02988, 
1.02988, 1.02988, 0.88401, 0.91916, 0.91916, 0.86304, 0.86077, 1, 0.86304, 0.88401, 0.88401, 0.87445, 
0.79468, 1, 0.88175, 0.85284, 0.90747, 1, 0.91133, 0.85284, 0.9297, 1.08004, 0.94903, 1, 0.91488, 0.70645, 1, 
1, 0.85284, 1, 0.92099, 0.85284, 1, 1, 0.8785, 0.8785, 0.87802, 0.8785, 1, 0.91133, 1, 0.90747, 0.8785, 
0.84723, 0.89552, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.89291, 0.94721, 0.8801, 0.8801, 0.8801, 0.84971, 
0.84971, 0.8801, 0.8801, 0.91133, 0.83489, 0.82845, 0.78864, 0.99862, 1.12401, 1.19118, 0.69825, 0.89049, 
0.89049, 0.8801, 0.8785, 1.07463, 0.93548, 0.93548, 1.08696, 0.81988, 0.96134, 1.06152, 0.84107, 0.97747, 
0.75638, 0.85284, 0.90747, 0.95018, 0.97926, 0.8785, 0.75859, 0.75859, 0.92482, 0.87012, 0.87012, 0.87012, 
0.92794, 0.92794, 0.92794, 0.92794, 0.9815
 2, 0.91343, 0.91343, 0.90747, 0.91343, 1, 0.68787, 0.85284, 0.85714, 0.98387, 1, 0.7173, 0.7173, 0.7173, 
0.7173, 0.7173, 1, 1, 0.89552, 0.91133, 0.81499, 1, 1, 0.79586, 0.78216, 0.91133, 1.54657, 1, 1, 0.91133, 
0.77192, 1, 1.04106, 0.87965, 1.06452, 0.75841, 1, 1.00813, 0.8785, 0.91133, 0.88525, 0.84133, 1.33431, 1, 
0.95161, 0.72021, 1, 1, 1, 1, 0.91133, 0.8785, 0.8785, 0.8785, 0.8785, 0.8785, 0.8785, 0.8785, 0.8785, 
0.89552, 0.90363, 1, 1, 1.01466, 1.0088, 1, 0.75806, 0.81055, 1.04106, 1, 0.82845, 0.73133, 0.90264, 0.90518, 
0.90548, 1, 1, 1.4956, 0.93835, 1, 1, 2.2807, 1, 1, 1, 0.90727, 0.90727, 0.8785, 1, 0.94211, 0.94211, 
0.94211, 0.94211, 0.8785, 0.8785, 0.85075, 0.95794, 0.95794, 0.95794, 0.95794, 0.95794, 0.82616, 0.86513, 
0.85162, 0.85162, 0.85162, 0.85162, 0.91133, 0.85162, 0.79492, 0.79492, 0.79492, 0.79492, 0.91133, 0.79109];
+exports.CalibriBoldFactors = CalibriBoldFactors;
+const CalibriBoldLineHeight = 1.2207;
+exports.CalibriBoldLineHeight = CalibriBoldLineHeight;
+const CalibriBoldItalicFactors = [1.3877, 1, 0.83908, 0.77539, 0.77539, 0.83908, 0.83908, 0.83908, 0.83908, 
0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.7762, 0.7762, 0.71805, 0.71805, 
0.71805, 0.71805, 0.71805, 0.71805, 0.82577, 0.87289, 0.87289, 0.88506, 0.86036, 0.73133, 0.73133, 0.73133, 
0.73133, 0.73133, 0.73133, 0.73133, 0.73133, 0.73133, 0.88116, 0.73133, 0.73133, 0.57118, 0.87356, 0.6965, 
0.88506, 0.91133, 0.7514, 0.81921, 0.67174, 0.81921, 0.81921, 1, 0.81921, 0.87356, 1, 0.99862, 0.99862, 1, 
0.91075, 0.87356, 0.95958, 0.76467, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 0.95958, 
0.95958, 0.95958, 0.56347, 0.95958, 0.59526, 0.59526, 0.75727, 0.75727, 1, 0.69225, 0.69225, 0.89019, 
0.70424, 1, 0.91926, 0.70823, 1.04924, 1.04924, 0.90872, 0.90872, 0.90872, 1, 0.90872, 0.90872, 0.85938, 
0.87402, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.87179, 0.80346, 0.85938, 0.79179, 
0.87068, 0.87068, 0.85938, 0.79795, 0.
 97447, 0.87891, 0.97466, 0.87068, 0.77958, 0.77958, 0.77958, 1, 0.79795, 0.69766, 0.70572, 0.70572, 0.70572, 
0.70572, 1, 1, 1, 1, 1, 0.70572, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 0.69766, 0.69766, 0.69766, 0.69766, 1, 0.7957, 0.81055, 0.81055, 0.81055, 0.81055, 1, 0.86441, 
0.79795, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.77892, 
0.55853, 0.90399, 0.90399, 0.88653, 0.96068, 0.96068, 0.96068, 0.96068, 0.96068, 0.82577, 0.74889, 0.77892, 
0.77892, 0.77892, 0.77892, 0.77892, 0.78257, 0.78257, 0.78257, 0.78257, 0.78257, 0.94908, 0.94908, 0.94908, 
0.94908, 0.90323, 1, 0.94908, 0.85887, 0.85887, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1,
  1, 0.94908, 0.94252, 0.94252, 0.94908, 0.97566, 0.80352, 0.94908, 0.90747, 0.94908, 0.94908, 1.3107, 
1.81055, 0.90616, 0.90527, 1.81055, 1.53711, 0.94434, 0.85284, 0.85284, 1.2798, 0.92138, 0.94908, 0.86411, 
1.529, 1.69808, 0.87411, 1, 0.88331, 0.88331, 0.97507, 0.97507, 1.15543, 1, 1.7801, 1.42259, 0.74012, 
0.74012, 1.20528, 1, 1, 0.74012, 0.74012, 0.74012, 0.74012, 0.91056, 0.89552, 0.78022, 0.91027, 1.20528, 1, 
1, 0.82845, 0.92794, 1, 1, 1.13254, 0.89552, 1, 0.86411, 0.89552, 0.89552, 0.79538, 0.92726, 0.85592, 0.8728, 
1, 1.24487, 1, 1.48387, 0.90747, 1, 1, 0.91133, 0.70088, 0.88401, 0.88323, 0.88323, 0.88323, 0.88323, 
0.88323, 0.88323, 0.88323, 0.88323, 0.91133, 1, 0.71094, 0.88323, 0.90527, 0.89552, 0.86331, 0.88323, 
0.95612, 0.95612, 0.85284, 0.85356, 1.23108, 0.8753, 0.8753, 0.8785, 0.97801, 0.97171, 0.97801, 0.95015, 1, 
1, 1, 0.91133, 0.88525, 1, 0.56892, 0.91133, 1, 0.83406, 0.86411, 0.84021, 0.86411, 0.86411, 1, 0.86411, 
0.90807, 0.90176, 1, 0.85284, 0.90747, 0.96839, 0.9
 6839, 1.03372, 1.03372, 0.86331, 0.8777, 0.86331, 1, 1.44947, 1.45894, 1, 0.88401, 0.88401, 0.88401, 
0.88401, 0.88401, 0.88401, 0.90167, 0.88401, 1.17534, 1.37077, 0.8941, 0.8941, 0.9716, 1, 1, 1, 0.88401, 
1.02988, 1.02988, 1.02988, 1.02988, 0.88401, 0.91916, 0.91916, 0.86304, 0.84814, 1, 0.86304, 0.88401, 
0.88401, 0.87445, 0.77312, 1, 0.88175, 0.85284, 0.90747, 1, 0.91133, 0.85284, 0.9297, 1.08004, 0.94903, 1, 
0.9039, 0.70645, 1, 1, 0.85284, 1, 0.91822, 0.85284, 1, 1, 0.86331, 0.86331, 0.86906, 0.86331, 1, 0.91133, 1, 
0.90747, 0.86331, 0.84723, 0.89552, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86549, 0.94721, 0.86331, 
0.86331, 0.86331, 0.86015, 0.86015, 0.86331, 0.86331, 0.91133, 0.83489, 0.82845, 0.78864, 0.99862, 1.19129, 
1.19118, 0.69825, 0.89049, 0.89049, 0.86331, 0.86411, 1.07463, 0.93548, 0.93548, 1.08696, 0.81988, 0.96134, 
1.06152, 0.83326, 0.99375, 0.81344, 0.85284, 0.90747, 0.95018, 0.95452, 0.86411, 0.75859, 0.75859, 0.92482, 
0.87012, 0.87012, 0.87012, 0.92794, 0.89
 807, 0.92794, 0.92794, 0.98152, 0.90464, 0.90464, 0.90747, 0.90464, 1, 0.68787, 0.85284, 0.87581, 0.98387, 
1, 0.70852, 0.70852, 0.70852, 0.70852, 0.70852, 1, 1, 0.89552, 0.91133, 0.81499, 1, 1, 0.82046, 0.76422, 
0.91133, 1.56239, 1, 1, 0.91133, 0.77192, 1, 1.04106, 0.96057, 1.06452, 0.75841, 1, 1.02189, 0.86411, 
0.91133, 0.88525, 0.84133, 1.33431, 1, 0.95161, 0.72021, 1, 1, 1, 1, 0.91133, 0.86331, 0.86331, 0.86331, 
0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.89552, 0.90363, 1, 1, 1.01466, 1.0088, 1, 0.75806, 0.81055, 
1.04106, 1, 0.82845, 0.73133, 0.90631, 0.88323, 0.85174, 1, 1, 1.4956, 0.92972, 1, 1, 2.2807, 1, 1, 1, 
0.90727, 0.90727, 0.86331, 1, 0.92733, 0.92733, 0.92733, 0.92733, 0.86331, 0.86331, 0.84372, 0.95794, 
0.95794, 0.95794, 0.95794, 0.95794, 0.82616, 0.85668, 0.84548, 0.84548, 0.84548, 0.84548, 0.91133, 0.84548, 
0.79492, 0.79492, 0.79492, 0.79492, 0.91133, 0.74081];
+exports.CalibriBoldItalicFactors = CalibriBoldItalicFactors;
+const CalibriBoldItalicLineHeight = 1.2207;
+exports.CalibriBoldItalicLineHeight = CalibriBoldItalicLineHeight;
+const CalibriItalicFactors = [1.3877, 1, 0.8675, 0.76318, 0.76318, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 
0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.81552, 0.81552, 0.72346, 0.72346, 0.72346, 0.72346, 
0.72346, 0.72346, 0.77818, 0.85193, 0.85193, 0.86477, 0.84134, 0.73206, 0.73206, 0.73206, 0.73206, 0.73206, 
0.73206, 0.73206, 0.73206, 0.73206, 0.86698, 0.73206, 0.73206, 0.6192, 0.86275, 0.7363, 0.86477, 0.91133, 
0.7522, 0.81105, 0.7286, 0.81105, 0.81105, 1, 0.81105, 0.86275, 1, 0.99862, 0.99862, 1, 0.90872, 0.86275, 
0.90685, 0.77896, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 
0.64824, 0.90685, 0.6377, 0.6377, 0.77892, 0.77892, 1, 0.75593, 0.75593, 0.85871, 0.76032, 1, 0.98156, 
0.77261, 1.02638, 1.02638, 0.89249, 0.89249, 0.89249, 1, 0.89249, 0.89249, 0.84118, 0.8667, 0.84118, 0.84118, 
0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.87291, 0.85696, 0.84118, 0.82411, 0.84557, 0.84557, 0.84118, 
0.77452, 0.90782, 0.85984, 0.90
 3, 0.85374, 0.75186, 0.75186, 0.75186, 1, 0.77452, 0.67789, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 
1, 0.70572, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0.67789, 0.67789, 0.67789, 0.67789, 1, 0.76466, 0.79776, 0.79776, 0.79776, 0.79776, 1, 0.84369, 0.77452, 
0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.7306, 0.56321, 
0.88844, 0.88844, 0.85066, 0.94309, 0.94309, 0.94309, 0.94309, 0.94309, 0.77818, 0.75828, 0.7306, 0.7306, 
0.7306, 0.7306, 0.7306, 0.76659, 0.76659, 0.76659, 0.76659, 0.76659, 0.9245, 0.9245, 0.9245, 0.9245, 0.87683, 
1, 0.9245, 0.84843, 0.84843, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 0.9245, 0.99058, 0.99058, 0.9
 245, 1.02269, 0.90861, 0.9245, 0.90747, 0.9245, 0.9245, 1.28809, 1.81055, 0.90572, 0.90749, 1.81055, 
1.55469, 0.94434, 1.06139, 0.85284, 1.2798, 0.88071, 0.9245, 0.9245, 1.38313, 1.77256, 0.92393, 1, 0.94152, 
0.94152, 1.10369, 1.10369, 1.1437, 1, 1.91729, 1.42259, 0.83203, 0.83203, 1.18622, 1, 1, 0.83203, 0.83203, 
0.83203, 0.83203, 0.92229, 0.89552, 0.78086, 0.91027, 1.18622, 1, 1, 0.96309, 0.89807, 1, 1, 1.13254, 
0.89552, 1, 0.9245, 0.89552, 0.89552, 0.8875, 0.99034, 0.84737, 0.942, 1, 1.17889, 1, 1.48387, 0.90747, 1, 1, 
0.91133, 0.67009, 0.82601, 0.85865, 0.85865, 0.85865, 0.85865, 0.85865, 0.85865, 0.85865, 0.85865, 0.91133, 
1, 0.68994, 0.85865, 0.90527, 0.89552, 0.9245, 0.85865, 1.03667, 1.03667, 0.85284, 0.85284, 1.23108, 0.94635, 
0.94635, 0.94469, 1.17223, 1.11523, 0.97801, 1.09842, 1, 1, 1, 0.91133, 0.84426, 1, 0.54873, 0.91133, 1, 
0.82616, 0.9245, 0.8916, 0.9245, 0.9245, 1, 0.9245, 0.86331, 0.8739, 1, 0.85284, 0.90747, 0.92098, 0.92098, 
1.0176, 1.0176, 0.9245, 0.93591, 0.924
 5, 1, 1.44947, 1.40909, 1, 1.03297, 0.82601, 0.82601, 0.82601, 0.82601, 0.82601, 1.05611, 0.82601, 1.19658, 
1.33512, 0.8941, 0.8941, 0.97622, 1, 1, 1, 1.03297, 1.23516, 1.23516, 1.23516, 1.23516, 0.82601, 1.07692, 
1.07692, 0.90918, 0.90918, 1, 0.90918, 1.03297, 1.03297, 0.94048, 0.9375, 1, 0.93407, 0.85284, 0.90747, 1, 
0.91133, 0.85284, 1.09231, 1.0336, 1.11429, 1, 0.94959, 0.71353, 1, 1, 0.85284, 1, 0.98217, 0.85284, 1, 1, 
0.9245, 0.9245, 0.92534, 0.9245, 1, 0.91133, 1, 0.90747, 0.9245, 0.89746, 0.89552, 0.92274, 0.92274, 0.92274, 
0.92274, 0.92274, 0.86291, 0.93695, 0.92274, 0.92274, 0.92274, 0.89404, 0.89404, 0.92274, 0.92274, 0.91133, 
0.79801, 0.80504, 0.76288, 0.99862, 1.16359, 1.15642, 0.69825, 0.86651, 0.86651, 0.92274, 0.9245, 1.09091, 
0.91056, 0.91056, 1.07806, 0.80395, 0.90861, 1.03809, 0.83437, 1.00225, 0.82507, 0.85284, 0.90747, 0.97094, 
0.97248, 0.9245, 0.83319, 0.75859, 1.1293, 1.2566, 1.2566, 1.2566, 1.12308, 1.12308, 1.12308, 1.12308, 
1.15601, 1.02933, 1.02933, 0.9074
 7, 1.02933, 1, 0.68787, 0.85284, 0.88832, 0.96334, 1, 0.77832, 0.77832, 0.77832, 0.77832, 0.77832, 1, 1, 
0.89552, 0.91133, 0.774, 1, 1, 0.88178, 0.84438, 0.91133, 1.39543, 1, 1, 0.91133, 0.7589, 1, 1.20562, 
1.03525, 1.23023, 0.97655, 1, 1.0297, 0.9245, 0.91133, 0.84426, 0.80972, 1.35191, 1, 0.95161, 0.70508, 1, 1, 
1, 1, 0.91133, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.89552, 0.90186, 1, 1, 
1.0088, 1.0044, 1, 0.739, 0.79776, 1.20562, 1, 0.96309, 0.73206, 0.89693, 0.85865, 0.90933, 1, 1, 1.4956, 
0.97858, 1, 1, 2.01462, 1, 1, 1, 1.05859, 1.05859, 0.9245, 1, 0.9849, 0.9849, 0.9849, 0.9849, 0.9245, 0.9245, 
0.8916, 0.98986, 0.98986, 0.98986, 0.98986, 0.98986, 0.86621, 0.84153, 0.89453, 0.89453, 0.89453, 0.89453, 
0.91133, 0.89453, 0.79004, 0.79004, 0.79004, 0.79004, 0.91133, 0.75026];
+exports.CalibriItalicFactors = CalibriItalicFactors;
+const CalibriItalicLineHeight = 1.2207;
+exports.CalibriItalicLineHeight = CalibriItalicLineHeight;
+const CalibriRegularFactors = [1.3877, 1, 0.8675, 0.76318, 0.76318, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 
0.8675, 0.86686, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.81552, 0.81552, 0.73834, 0.73834, 0.73834, 
0.73834, 0.73834, 0.73834, 0.77818, 0.85193, 0.85193, 0.86477, 0.84503, 0.73206, 0.73206, 0.73206, 0.73206, 
0.73206, 0.73206, 0.73206, 0.73206, 0.73206, 0.86901, 0.73206, 0.73206, 0.62267, 0.86275, 0.74359, 0.86477, 
0.91133, 0.7522, 0.81105, 0.75443, 0.81105, 0.81105, 1, 0.81105, 0.86275, 1, 0.99862, 0.99862, 1, 0.90872, 
0.86275, 0.90685, 0.77741, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 0.90685, 
0.90685, 0.65649, 0.90685, 0.6377, 0.6377, 0.77892, 0.77892, 1, 0.75593, 0.75593, 0.85746, 0.76032, 1, 
0.98156, 0.77261, 1.02638, 1.02638, 0.89385, 0.89385, 0.89385, 1, 0.89385, 0.89385, 0.85122, 0.8667, 0.85122, 
0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.88831, 0.88254, 0.85122, 0.85498, 0.85311, 0.85311, 
0.85122, 0.77452, 0.95165, 0.86275,
  0.89772, 0.86503, 0.75186, 0.75186, 0.75186, 1, 0.77452, 0.68887, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 
1, 1, 1, 0.70572, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0.68887, 0.68887, 0.68887, 0.68887, 1, 0.74171, 0.79776, 0.79776, 0.79776, 0.79776, 1, 0.85122, 0.77452, 
0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.7306, 0.56963, 
0.88844, 0.88844, 0.85066, 0.94258, 0.94258, 0.94258, 0.94258, 0.94258, 0.77818, 0.75657, 0.7306, 0.7306, 
0.7306, 0.7306, 0.7306, 0.76659, 0.76659, 0.76659, 0.76659, 0.76659, 0.86128, 0.86128, 0.86128, 0.86128, 
0.87683, 0.86128, 0.8693, 0.8693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 0.86128, 0.98142, 0.98
 142, 0.86128, 1.02269, 0.90861, 0.86128, 0.90747, 0.86128, 0.86128, 1.28809, 1.81055, 0.90527, 0.90527, 
1.81055, 1.55469, 0.94434, 1.06139, 0.85284, 1.2798, 0.88071, 0.86128, 0.94469, 1.39016, 1.77256, 0.9236, 1, 
0.94152, 0.94152, 1.10369, 1.10369, 1.1437, 1.91729, 1.42259, 0.8457, 0.8457, 1.18622, 0.8457, 0.8457, 
0.8457, 0.8457, 0.92229, 0.89552, 0.81209, 0.91027, 1.18622, 1, 0.96309, 0.89807, 1.13254, 0.89552, 0.94469, 
0.89552, 0.89552, 0.92454, 0.9921, 0.84737, 0.94035, 1, 1.17889, 1.48387, 0.90747, 1, 1, 0.91133, 0.67742, 
0.82601, 0.89464, 0.89464, 0.89464, 0.89464, 0.89464, 0.89464, 0.89464, 0.89464, 0.91133, 0.69043, 0.89464, 
0.90527, 0.89552, 0.94469, 0.89464, 1.02191, 1.02191, 0.85284, 0.85356, 1.23108, 0.96576, 0.96576, 0.94469, 
1.17223, 1.11523, 0.97801, 1.09842, 1, 1, 1, 0.91133, 0.84426, 0.54873, 0.91133, 0.82616, 0.84636, 0.89258, 
0.84636, 0.84636, 1, 0.84636, 0.86331, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8739, 0.85284, 0.90747, 0.92098, 
0.92098, 1.0176, 1.0176, 0.94469, 
 0.95786, 0.94469, 1, 1.44947, 1.40909, 1.03297, 0.82601, 0.82601, 0.82601, 0.82601, 0.82601, 1.05611, 
0.82601, 1.19658, 1.33512, 0.8941, 0.8941, 0.97622, 1, 1, 1, 1.03297, 1.23516, 1.23516, 1.23516, 1.23516, 
0.82601, 1.07692, 1.07692, 0.90918, 0.90918, 1, 0.90918, 1.03297, 1.03297, 0.92578, 0.90452, 1, 1.11842, 
0.85284, 0.90747, 1, 0.91133, 0.85284, 1.09231, 1.0336, 1.11429, 1, 0.95897, 0.71353, 1, 1, 0.85284, 1, 
0.95424, 0.85284, 1, 1, 0.94469, 0.94469, 0.95877, 0.94469, 1, 0.91133, 1, 0.90747, 0.94469, 0.89746, 
0.89552, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90016, 0.93695, 0.9482, 0.9482, 0.9482, 0.89181, 0.89181, 
0.9482, 0.9482, 0.91133, 0.79801, 0.80504, 0.76288, 0.99862, 1.08707, 1.15642, 0.69825, 0.86651, 0.86651, 
0.9482, 0.94469, 1.09091, 0.91056, 0.91056, 1.07806, 0.80395, 0.90861, 1.03809, 0.84286, 1.00452, 0.80113, 
0.85284, 0.90747, 0.97094, 0.99247, 0.94469, 0.83319, 0.75859, 1.1293, 1.2566, 1.2566, 1.2566, 1.12308, 
1.12308, 1.12308, 1.12308, 1.15601, 1.04692, 1.04692
 , 0.90747, 1.04692, 1, 0.68787, 0.85284, 0.89442, 0.96334, 1, 0.78223, 0.78223, 0.78223, 0.78223, 0.78223, 
1, 1, 0.89552, 0.91133, 0.774, 1, 0.86155, 0.85208, 0.91133, 1.39016, 1, 1, 0.91133, 0.7589, 1, 1.20562, 
0.98022, 1.23023, 0.92188, 1, 0.9561, 0.94469, 0.91133, 0.84426, 0.80972, 1.35191, 0.95161, 0.70508, 1, 1, 1, 
1, 0.91133, 0.94469, 0.94469, 0.94469, 0.94469, 0.94469, 0.94469, 0.94469, 0.94469, 0.89552, 0.90186, 1, 1, 
1.0088, 1.0044, 1, 0.739, 0.79776, 1.20562, 1, 0.96309, 0.73206, 0.88844, 0.89464, 0.96766, 1, 1, 1.4956, 
1.07185, 0.99413, 0.96334, 1.08065, 0.99331, 1, 1, 2.01462, 1, 1, 1, 1, 1.05859, 1.05859, 0.94469, 1, 
0.99018, 0.99018, 0.99018, 0.99018, 0.94469, 0.94469, 0.90332, 0.98986, 0.98986, 0.98986, 0.98986, 0.98986, 
0.86621, 0.83969, 0.90527, 0.90527, 0.90527, 0.90527, 0.91133, 0.90527, 0.79004, 0.79004, 0.79004, 0.79004, 
0.91133, 0.78848];
+exports.CalibriRegularFactors = CalibriRegularFactors;
+const CalibriRegularLineHeight = 1.2207;
+exports.CalibriRegularLineHeight = CalibriRegularLineHeight;
+
+/***/ }),
+/* 57 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.HelveticaRegularLineHeight = exports.HelveticaRegularFactors = exports.HelveticaItalicLineHeight = 
exports.HelveticaItalicFactors = exports.HelveticaBoldLineHeight = exports.HelveticaBoldItalicLineHeight = 
exports.HelveticaBoldItalicFactors = exports.HelveticaBoldFactors = void 0;
+const HelveticaBoldFactors = [0.76116, 1, 0.99977, 1, 1, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 1.00001, 0.99977, 0.99977, 0.99977, 0.85148, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.9998, 1.00001, 1.00001, 0.99997, 0.99977, 1.00026, 0.99977, 
0.99973, 1.00026, 1.00022, 0.99988, 1.00022, 1.00022, 1.00022, 1.00022, 0.99977, 0.99999, 0.99861, 0.99861, 
1, 0.99977, 0.99977, 1.0006, 1.00042, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 
1.0006, 1.00078, 1.0006, 0.99973, 0.99973, 0.99977, 0.99977, 0.99977, 1.00026, 1.00026, 1.00001, 1.00026, 
1.00026, 1.00026, 1.00026, 0.99999, 0.99999, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00022, 
1, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1, 1.00013, 1.00022, 1.00036, 1.00022, 
1.00022, 1.00022, 1.00001, 1.00024,
  0.99977, 0.9999, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.99984, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 
1.00022, 1.00001, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 
1.00001, 0.99973, 0.99977, 0.99977, 1.00001, 1.00016, 1.00016, 1.00016, 1.00016, 1.00016, 1.00001, 1.00069, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99998, 1, 0.99973, 0.99982, 0.99982, 1, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 
1.00001, 1.00008, 1.00021, 0.999
 26, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 
0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 
1.00038, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99989, 
0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 
0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 
0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 1.0005, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 
0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 0.99973, 1.00035, 1, 0.99999, 1, 0.99971, 1.00047, 
1.00023, 0.99973, 1.00041, 1.00041, 0.99973, 0.99977, 1, 0.99973, 1.00031, 0.99973, 0.99973, 1, 1, 1, 1, 1, 
1, 1, 1.00003, 1.00003, 0.99959, 0.9999, 0.99973, 1.00026, 1.0006, 1.00077, 0.99942, 1.41144, 0.99959, 
0.99959, 0.99998, 0.99998, 0.999
 98, 1, 1.00077, 0.99972, 0.99973, 0.99973, 0.99998, 1, 1, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 
0.99973, 1.00055, 0.99999, 0.99998, 1, 0.99962, 0.99998, 1.0006, 1, 1, 1.00025, 0.99973, 1, 1.00026, 0.99973, 
0.99973, 1.03374, 1.00026, 1.00024, 0.99927, 0.9995, 0.99998, 1, 1.00034, 1.06409, 1.36625, 1.41144, 0.99973, 
0.99998, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 
0.99973, 1, 0.99973, 1.00026, 0.99973, 1.00082, 0.99962, 1.00003, 0.99915, 0.99984, 1.00026, 1.00026, 
1.00026, 0.99998, 0.99999, 0.99998, 0.99998, 1, 0.99999, 1, 0.99973, 1.00002, 0.99998, 0.99973, 0.99973, 
0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99998, 1, 1.00003, 
1.00031, 0.99973, 0.99973, 0.99998, 0.99998, 1.00026, 1.00026, 1.00026, 1.00042, 0.99999, 0.99998, 1, 1.0006, 
1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 1.0006, 1.00015, 1.00027, 0.99999, 0.99999, 0.99561, 
0.99999, 0.99999, 0.99977, 1.0006, 1.0006, 
 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 1.00069, 0.99973, 0.99973, 1.0006, 1.0006, 0.99973, 
1.03828, 1.0006, 0.99999, 1.00003, 1.00031, 1.41144, 0.99973, 1.00003, 1.0006, 0.99972, 1.0006, 1.40579, 
0.99982, 0.60299, 1, 1, 1.00003, 1.00106, 0.99867, 1.00003, 1, 1, 1.00026, 1.00026, 0.9993, 1.00026, 1.00026, 
0.99973, 1, 1.00031, 1.00026, 0.99973, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00016, 
0.99998, 1.00026, 1.00026, 1.00026, 1.00032, 1.00032, 1.00026, 1.00026, 0.99973, 1.00002, 1.00002, 1.00002, 
1.40483, 0.99968, 0.99936, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99998, 0.99998, 0.99972, 
0.99982, 1.0006, 1, 1.00023, 0.99954, 1.00049, 1.00003, 1.06409, 1.20985, 0.99945, 1.00026, 1.00026, 1.00026, 
0.99974, 1, 1, 1, 1.0006, 1.0006, 1.0006, 1.0006, 1.00087, 0.99959, 0.99959, 1.00031, 0.99959, 0.99959, 
1.00025, 1.00003, 1.00056, 0.99998, 1.41144, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99999, 
0.99973, 0.99973, 1.00002, 0.99998, 1.4
 0579, 0.99988, 1, 0.99973, 1.0006, 1, 0.99953, 0.99973, 1.39713, 1.00054, 0.99998, 0.99935, 0.99998, 0.8121, 
0.99998, 1.00087, 1.00026, 0.99973, 1.00002, 1.00002, 0.99998, 1, 0.99998, 1, 1.00026, 1.00026, 1.00026, 
1.00026, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99955, 
1.0006, 0.99998, 1, 1, 1, 1, 1.00026, 0.99998, 0.99998, 1, 1.00001, 0.99561, 0.99973, 1.00041, 1, 1, 0.99998, 
1, 0.99991, 1, 1.66475, 1.0006, 1, 1, 1, 1, 1.00026, 1.41144, 0.99995, 0.99995, 0.99995, 0.99995, 1.00026, 
1.00026, 0.99973, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 0.99973, 0.9993, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99973, 1, 1, 1, 1, 0.99973, 0.99902];
+exports.HelveticaBoldFactors = HelveticaBoldFactors;
+const HelveticaBoldLineHeight = 1.2;
+exports.HelveticaBoldLineHeight = HelveticaBoldLineHeight;
+const HelveticaBoldItalicFactors = [0.76116, 1, 0.99977, 1, 1, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 1.00001, 0.99977, 0.99977, 0.99977, 0.91155, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.9998, 1.00001, 1.00001, 1, 0.99977, 1.00026, 0.99977, 0.99973, 
1.00026, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 0.99977, 0.99999, 0.99861, 0.99861, 1, 
0.99977, 0.99977, 1.0006, 0.99971, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 
1.0006, 0.99969, 1.0006, 0.99973, 0.99973, 0.99977, 0.99977, 0.99977, 1.00026, 1.00026, 1.00001, 1.00026, 
1.00026, 1.00026, 1.00026, 0.99999, 0.99999, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00022, 
1, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1, 0.9998, 1.00022, 0.99972, 1.00022, 
1.00022, 1.00022, 1.00001, 0.99968, 
 1.00032, 1.00047, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.99944, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 
1.00022, 1.00001, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 
1.00001, 0.99981, 0.99977, 0.99977, 1.00001, 1.00016, 1.00016, 1.00016, 1.00016, 1.00016, 1.00001, 0.99966, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99998, 1, 0.99973, 0.99982, 0.99982, 1, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 
1.00001, 1.00001, 0.99973, 1.000
 66, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 
0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99966, 
1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99964, 
0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 
0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 
0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 1.00044, 1.00026, 0.99949, 
1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.99973, 0.99967, 1, 1.00026, 
1, 0.99971, 0.99978, 1, 0.99973, 0.99981, 0.99981, 0.99973, 0.99977, 1, 0.99973, 1.00031, 0.99973, 0.99973, 
1.00049, 1, 1.00098, 1, 1, 1, 1, 1.00003, 1.00003, 0.99959, 0.9999, 0.99973, 1.00026, 1.0006, 1.00077, 
1.00064, 1.41144, 0.99959, 0.99959, 0.99998,
  0.99998, 0.99998, 1, 1.00077, 0.99972, 0.99973, 0.99973, 0.99998, 1, 1, 0.99973, 0.99973, 0.99973, 0.99973, 
0.99998, 0.99973, 1.00063, 0.99999, 0.99998, 1, 0.99962, 0.99998, 1.0006, 1, 1, 1.00025, 0.99973, 1, 1.00026, 
0.99973, 0.99973, 1.0044, 1.00026, 1.00024, 0.99942, 0.9995, 0.99998, 1, 0.99998, 1.06409, 1.36625, 1.41144, 
0.99973, 0.99998, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 
0.99998, 1, 0.99973, 1, 0.99973, 1.00026, 0.99973, 1.00101, 1.00101, 1.00003, 0.99915, 0.99984, 1.00026, 
1.00026, 1.00026, 0.99998, 0.99999, 0.99998, 0.99998, 1, 0.99999, 1, 0.99973, 1.00002, 0.99998, 0.99973, 
0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99998, 1, 
1.00003, 1.00031, 0.99973, 0.99973, 0.99998, 0.99998, 1.00026, 1.00026, 1.00026, 1.00042, 0.99999, 0.99998, 
1, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 1.0006, 1.00015, 1.00027, 0.99999, 0.99999, 
0.99561, 0.99999, 0.99999, 0.99977, 1.
 0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 1.00014, 0.99973, 0.99973, 1.0006, 
1.0006, 0.99973, 1.01011, 1.0006, 0.99999, 1.00003, 1.00031, 1.41144, 0.99973, 1.00003, 1.0006, 0.99972, 
1.0006, 1.40579, 0.99982, 0.60299, 1, 1, 1.00003, 1.00106, 1.01322, 1.00003, 1, 1, 1.00026, 1.00026, 0.9993, 
1.00026, 1.00026, 0.99973, 1, 1.00031, 1.00026, 0.99973, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 
1.00026, 1.00016, 0.99998, 1.00026, 1.00026, 1.00026, 0.99943, 0.99943, 1.00026, 1.00026, 0.99973, 1.00002, 
1.00002, 1.00002, 1.40483, 0.99968, 0.99936, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99998, 
0.99998, 0.99972, 0.99982, 1.0006, 1, 1, 1.00055, 1.00012, 1.00003, 1.06409, 1.20985, 1.00007, 1.00026, 
1.00026, 1.00026, 0.99974, 1, 1, 1, 1.0006, 1.0006, 1.0006, 1.0006, 1.00087, 0.99959, 0.99959, 1.00031, 
0.99959, 0.99959, 1.00025, 1.00003, 0.99923, 0.99998, 1.41144, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99999, 0.99973, 0.99973, 1.00002, 0.99
 998, 1.40579, 1.00064, 1, 0.99973, 1.0006, 1, 0.99953, 0.99973, 1.39713, 1.00054, 0.99998, 1.00076, 0.99998, 
0.8121, 0.99998, 1.00069, 1.00026, 0.99973, 1.00002, 1.00002, 0.99998, 1, 0.99998, 1, 1.00026, 1.00026, 
1.00026, 1.00026, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 
0.99955, 1.0006, 0.99998, 1, 1, 1, 1, 1.00026, 0.99998, 0.99998, 1, 1.00001, 0.99967, 0.99973, 0.98685, 1, 1, 
0.99998, 1, 0.99991, 1, 1.66475, 1.0006, 1, 1, 1, 1, 1.00026, 1.41144, 0.99948, 0.99948, 0.99948, 0.99948, 
1.00026, 1.00026, 0.99973, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 0.99973, 1.00065, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99973, 0.99973, 1, 1, 1, 1, 0.99973, 1.00061];
+exports.HelveticaBoldItalicFactors = HelveticaBoldItalicFactors;
+const HelveticaBoldItalicLineHeight = 1.35;
+exports.HelveticaBoldItalicLineHeight = HelveticaBoldItalicLineHeight;
+const HelveticaItalicFactors = [0.76116, 1, 1.00001, 1, 1, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 1.00001, 0.99977, 0.99977, 0.99977, 0.91221, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.9998, 1.00001, 1.00001, 1.00054, 0.99977, 0.99977, 0.99977, 
0.99973, 1.00026, 1.00022, 0.99945, 1.00022, 1.00022, 1.00022, 1.00022, 0.99977, 0.99999, 0.99861, 0.99861, 
1, 0.99977, 0.99977, 1.0006, 0.99946, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 
1.0006, 1.00084, 1.0006, 1, 1, 1.00001, 1.00001, 1.00001, 0.99973, 0.99973, 1.00001, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99999, 0.99999, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00022, 1, 
1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1, 1.00013, 1.00022, 1.00007, 1.00022, 
1.00022, 1.00022, 1.00001, 1.0001, 1.00054, 1
 .00052, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00065, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00022, 
1.00001, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 
0.99973, 0.99977, 0.99977, 1.00001, 1.00016, 1.00016, 1.00016, 1.00016, 1.00016, 1.00001, 0.99933, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99998, 1, 0.99973, 0.99982, 0.99982, 1, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 
1.00001, 1.00001, 1.00038, 0.99954
 , 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 
1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99962, 
1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99975, 0.99973, 
1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 
1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 
0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99895, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 
0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 1, 1.00051, 1, 0.99973, 1, 1.00423, 0.99925, 0.99999, 0.99973, 
0.99945, 0.99945, 0.99973, 1.00001, 1, 0.99973, 1.00031, 0.99973, 0.99973, 1, 1, 1.00049, 1.00245, 1, 1, 1, 
0.99949, 1.00003, 0.99959, 0.99987, 0.99973, 0.99973, 1.0006, 1.0009, 0.99949, 1.41144, 1.00005, 1.00005, 
1.0006, 1.0006, 0.99998, 1,
  1.0009, 0.99972, 1, 1, 0.99998, 1, 1, 1, 1, 1, 1, 0.99998, 0.99973, 1.00019, 0.99999, 0.99998, 1, 0.99962, 
1.0006, 1.0006, 1, 1, 1.00025, 0.99973, 1, 0.99973, 0.99973, 0.99973, 1.0288, 0.99973, 1.00024, 1.0006, 
0.9995, 0.99998, 1, 0.99998, 1.06409, 1.36625, 1.41144, 0.99973, 0.99998, 1.0006, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 0.99973, 1, 0.99973, 0.99973, 0.99973, 
0.99897, 0.99897, 1.00003, 1.00003, 0.99984, 0.99968, 0.99968, 0.99973, 1.0006, 1, 0.99998, 1.0006, 1, 
0.99999, 1, 0.99973, 1.00002, 0.99998, 0.99973, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 
0.99973, 0.99973, 1.00026, 0.99998, 1, 1.00003, 1.00031, 0.99973, 0.99973, 0.99998, 0.99998, 0.99973, 
0.99973, 0.99973, 1.00042, 0.99999, 0.99998, 1, 0.99924, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00034, 
1.0006, 1.00015, 1.00027, 0.99999, 0.99999, 1.00035, 0.99999, 0.99999, 0.99977, 0.99924, 0.99924, 0.99924, 
0.99924, 0.99924, 1.0006, 0.99924, 0.99924, 1, 1
 , 1, 1, 0.99924, 0.99924, 0.99962, 1.06311, 0.99924, 1.00024, 1.00003, 1.00031, 1.41144, 0.99973, 1.00003, 
0.99924, 0.95317, 0.99924, 1.40579, 0.99999, 0.60299, 1, 1, 1.00003, 1.00267, 1.01487, 1.00003, 1, 1, 
0.99973, 0.99973, 1.00041, 0.99973, 0.99973, 0.99973, 1, 1.00031, 0.99973, 1, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99973, 1.00016, 0.99998, 0.99973, 0.99973, 0.99973, 1.00025, 1.00025, 0.99973, 0.99973, 
0.99973, 1.00002, 1.00002, 1.00002, 1.40483, 0.99968, 0.99936, 1, 1.00026, 1.00026, 0.99973, 0.99973, 0.9998, 
0.99998, 0.99998, 0.96329, 0.99982, 1.0006, 1, 1.00023, 0.99947, 1.00012, 1.00003, 1.06409, 1.20985, 1.00063, 
0.99973, 0.99973, 1.00026, 1.00006, 0.99998, 0.99998, 0.99998, 0.99924, 0.99924, 0.99924, 0.99924, 1.00043, 
0.99998, 0.99998, 0.8254, 0.99998, 0.99998, 1.00025, 1.00003, 1.00043, 0.99998, 1.41144, 1, 1, 1, 1, 1, 1, 
0.99999, 0.99973, 0.99973, 1.00002, 0.99998, 1.40579, 0.99995, 1, 0.99973, 1.0006, 1, 0.99953, 0.99973, 
1.39713, 1.00054, 1.0006, 0.99994, 1
 .0006, 0.89547, 1.0006, 0.99911, 0.99973, 0.99973, 1.00002, 1.00002, 0.99998, 1, 0.99998, 1, 1.00026, 
1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99955, 1.0006, 0.99998, 1, 1, 1, 1, 1.00026, 1.0006, 0.99998, 1, 1.00001, 0.99954, 0.99973, 
0.98332, 1, 1, 0.99998, 1, 0.99991, 1, 1.66475, 1.0006, 1, 1, 1, 1, 0.99973, 1.41144, 1.00036, 1.00036, 
1.00036, 1.00036, 0.99973, 0.99973, 1, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 1.0005, 1, 1, 1, 1, 
0.99973, 1, 1, 1, 1, 1, 0.99973, 0.99918];
+exports.HelveticaItalicFactors = HelveticaItalicFactors;
+const HelveticaItalicLineHeight = 1.35;
+exports.HelveticaItalicLineHeight = HelveticaItalicLineHeight;
+const HelveticaRegularFactors = [0.76116, 1, 1.00001, 1, 1, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 0.99928, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 0.99977, 1.00001, 0.99977, 0.99977, 0.99977, 0.91621, 1.00001, 1.00001, 1.00001, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.9998, 1.00001, 1.00001, 0.99977, 0.99977, 1.00013, 0.99977, 
0.99973, 1.00026, 1.00022, 1.0004, 1.00022, 1.00022, 1.00022, 1.00022, 0.99977, 0.99999, 0.99861, 0.99861, 1, 
0.99977, 0.99977, 1.0006, 1.00019, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 
1.0006, 1.00055, 1.0006, 1, 1, 1.00001, 1.00001, 1.00001, 0.99973, 0.99973, 1.00005, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99999, 0.99999, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00022, 1, 
1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1, 0.99941, 1.00022, 0.99947, 1.00022, 
1.00022, 1.00022, 1.00001, 1.00019, 0.99977, 
 0.99946, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 0.99973, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00022, 
1.00001, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 
0.99945, 0.99977, 0.99977, 1.00001, 1.00016, 1.00016, 1.00016, 1.00016, 1.00016, 1.00001, 1.00015, 1.00001, 
1.00001, 1.00001, 1.00001, 1.00001, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99998, 0.99973, 0.99982, 0.99982, 1, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 
0.99928, 0.99963, 0.99999, 1.00035,
  1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 
1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 1.00047, 
1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.9996, 0.99973, 
1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 
1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 
1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99968, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 
1.00062, 0.99973, 1.00114, 1, 1.00035, 1, 0.99955, 1, 0.99971, 0.99925, 1.00023, 0.99973, 0.99978, 0.99978, 
0.99973, 1.00001, 1, 0.99973, 1.00031, 0.99973, 0.99973, 1, 1, 1, 1, 1, 1, 1, 0.99949, 1.00003, 0.99959, 
0.99987, 0.99973, 0.99973, 1.0006, 1.0009, 0.99966, 1.41144, 1.00005, 1.00005, 1.0006, 1.0006, 0.99998, 
1.0009, 0.99972, 1, 1, 0.99998, 1, 1
 , 1, 1, 0.99998, 0.99973, 1.00019, 0.99999, 0.99998, 0.99962, 1.0006, 1.0006, 1.00025, 0.99973, 0.99973, 
0.99973, 0.99973, 1.04596, 0.99973, 1.00024, 1.00065, 0.9995, 0.99998, 0.99998, 1.06409, 1.36625, 1.41144, 
0.99973, 0.99998, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1, 
0.99973, 1, 0.99973, 0.99973, 0.99973, 1.00045, 1.00045, 1.00003, 0.99915, 0.99984, 0.99973, 0.99973, 
0.99973, 1.0006, 1, 0.99998, 1.0006, 1, 0.99999, 1, 0.99973, 1.00002, 0.99973, 0.99973, 0.99973, 0.99973, 1, 
0.99973, 0.99973, 0.99973, 0.99973, 1.00026, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 1.00003, 1.00031, 
0.99973, 0.99973, 0.99998, 0.99998, 0.99973, 0.99973, 0.99973, 1.00042, 0.99999, 0.99998, 0.99924, 1.0006, 
1.0006, 1.0006, 1.0006, 1.0006, 1.00034, 1.0006, 1.00015, 1.00027, 0.99999, 0.99999, 1.00035, 0.99999, 
0.99999, 0.99977, 0.99924, 0.99924, 0.99924, 0.99924, 0.99924, 1.0006, 0.99924, 0.99924, 1, 1, 1, 1, 0.99924, 
0.99924, 1, 1.02572, 0.99924, 1.00005, 
 1.00003, 1.00031, 1.41144, 0.99973, 1.00003, 0.99924, 0.95317, 0.99924, 1.40579, 0.99999, 0.60299, 1, 1, 
1.00003, 1.00267, 0.96499, 1.00003, 1, 1, 0.99973, 0.99973, 0.99999, 0.99973, 0.99973, 0.99973, 1, 1.00031, 
0.99973, 1, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.00016, 0.99998, 0.99973, 0.99973, 
0.99973, 1.00031, 1.00031, 0.99973, 0.99973, 0.99973, 1.00002, 1.00002, 1.00002, 1.40483, 0.99968, 0.99936, 
1, 1.00026, 1.00026, 0.99973, 0.99973, 0.9998, 0.99998, 0.99998, 0.96329, 0.99982, 1.0006, 1, 1.00023, 
0.99933, 1.00008, 1.00003, 1.06409, 1.20985, 1.00015, 0.99973, 0.99973, 1.00026, 1.00006, 0.99998, 0.99998, 
0.99998, 0.99924, 0.99924, 0.99924, 0.99924, 1.00043, 0.99998, 0.99998, 0.8254, 0.99998, 0.99998, 1.00025, 
1.00003, 1.00027, 0.99998, 1.41144, 1, 1, 1, 1, 1, 1, 0.99999, 0.99973, 0.99973, 1.00002, 1.40579, 0.9997, 1, 
0.99973, 1.0006, 1, 0.99953, 0.99973, 1.39713, 1.00054, 1.0006, 0.99995, 1.0006, 0.84533, 1.0006, 0.99973, 
0.99973, 0.99973, 1.00002, 1.00002, 0.9
 9998, 0.99998, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 
0.99973, 0.99973, 0.99973, 0.99973, 0.99955, 1.0006, 0.99998, 1, 1, 1, 1, 1.00026, 1.0006, 0.99998, 1, 
1.00001, 0.99561, 0.99973, 1.00073, 1, 1, 0.99998, 1, 1, 1, 1, 1, 0.99991, 1, 1.66475, 1.0006, 1, 1, 1, 1, 1, 
0.99973, 1.41144, 1.00023, 1.00023, 1.00023, 1.00023, 0.99973, 0.99973, 1, 0.99977, 0.99977, 0.99977, 
0.99977, 0.99977, 1, 1.00055, 1, 1, 1, 1, 0.99973, 1, 1, 1, 1, 1, 0.99973, 1.00019];
+exports.HelveticaRegularFactors = HelveticaRegularFactors;
+const HelveticaRegularLineHeight = 1.2;
+exports.HelveticaRegularLineHeight = HelveticaRegularLineHeight;
+
+/***/ }),
+/* 58 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.LiberationSansRegularWidths = exports.LiberationSansItalicWidths = exports.LiberationSansBoldWidths 
= exports.LiberationSansBoldItalicWidths = void 0;
+const LiberationSansBoldWidths = [365, 0, 722, 1000, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 
722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 719, 667, 667, 667, 667, 667, 667, 667, 
667, 667, 723, 667, 667, 853, 722, 906, 722, 556, 611, 778, 601, 778, 778, 778, 778, 722, 604, 354, 354, 604, 
722, 722, 278, 785, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 474, 278, 556, 556, 722, 722, 722, 611, 
611, 667, 611, 611, 611, 611, 833, 833, 722, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 
778, 778, 802, 838, 778, 825, 778, 778, 778, 667, 821, 722, 809, 778, 722, 722, 722, 722, 667, 667, 708, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 667, 667, 667, 667, 667, 600, 
611, 611, 611, 611, 611, 778, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 927, 722, 722, 667, 
944, 944, 94
 4, 944, 944, 667, 644, 667, 667, 667, 667, 667, 611, 611, 611, 611, 611, 556, 556, 556, 556, 333, 333, 556, 
889, 889, 1000, 722, 719, 722, 567, 712, 667, 669, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 
722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 487, 885, 567, 711, 667, 278, 
276, 556, 1094, 1062, 875, 610, 622, 556, 618, 615, 417, 635, 556, 556, 709, 497, 615, 615, 500, 635, 740, 
604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 447, 611, 417, 
552, 556, 278, 281, 278, 969, 906, 611, 500, 556, 719, 778, 604, 611, 885, 489, 1115, 556, 615, 615, 556, 
722, 333, 556, 549, 556, 556, 1000, 500, 1000, 1000, 500, 500, 500, 584, 584, 389, 975, 556, 611, 278, 280, 
610, 708, 389, 389, 333, 333, 333, 333, 280, 350, 556, 556, 333, 333, 222, 556, 556, 556, 556, 333, 556, 576, 
604, 333, 333, 656, 333, 278, 333, 222, 737, 556, 333, 611, 556, 556, 719, 611, 400, 606, 510, 333, 333, 465, 
549, 729, 708, 556, 333,
  278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 1000, 556, 1000, 556, 611, 556, 475, 451, 584, 583, 
600, 611, 611, 611, 333, 604, 333, 333, 750, 604, 1000, 556, 834, 333, 556, 556, 333, 556, 611, 556, 611, 
611, 611, 611, 611, 333, 333, 584, 549, 556, 556, 333, 333, 611, 611, 611, 594, 604, 333, 333, 278, 278, 278, 
278, 278, 278, 556, 278, 713, 274, 604, 604, 722, 604, 604, 1052, 278, 278, 278, 278, 278, 278, 278, 278, 
556, 558, 556, 556, 278, 278, 556, 385, 278, 479, 584, 549, 708, 556, 584, 278, 494, 278, 708, 889, 552, 750, 
333, 584, 240, 612, 584, 500, 750, 611, 611, 708, 611, 611, 556, 333, 549, 611, 556, 556, 611, 611, 611, 611, 
611, 944, 333, 611, 611, 611, 845, 845, 611, 611, 556, 834, 834, 834, 354, 370, 365, 979, 611, 611, 611, 611, 
556, 333, 333, 494, 889, 278, 1000, 1094, 715, 766, 584, 549, 823, 753, 611, 611, 611, 474, 500, 500, 500, 
278, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 584, 619, 333, 708, 556, 556, 556, 556, 556, 556, 479, 
556, 556, 834, 333, 
 708, 684, 520, 556, 278, 1021, 531, 556, 713, 917, 333, 446, 333, 479, 333, 541, 611, 556, 834, 834, 333, 
333, 333, 1000, 990, 990, 990, 990, 556, 611, 611, 611, 611, 611, 611, 611, 611, 556, 552, 278, 333, 333, 
333, 576, 333, 611, 333, 333, 333, 667, 722, 556, 615, 333, 333, 333, 396, 768, 612, 167, 278, 750, 333, 611, 
611, 611, 708, 582, 582, 582, 582, 611, 611, 556, 778, 778, 778, 778, 778, 556, 445, 556, 556, 556, 556, 556, 
556, 500, 500, 500, 500, 556, 460];
+exports.LiberationSansBoldWidths = LiberationSansBoldWidths;
+const LiberationSansBoldItalicWidths = [365, 0, 722, 1000, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 
722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 671, 667, 667, 667, 667, 667, 
667, 667, 667, 667, 723, 667, 667, 854, 722, 906, 722, 556, 611, 778, 610, 778, 778, 778, 778, 722, 604, 354, 
354, 604, 722, 722, 278, 782, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 473, 278, 556, 556, 722, 722, 
722, 611, 611, 667, 611, 611, 611, 611, 833, 833, 722, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 
778, 778, 778, 778, 781, 847, 778, 844, 778, 778, 778, 667, 822, 718, 829, 778, 722, 722, 722, 722, 667, 667, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 667, 667, 667, 667, 
667, 590, 611, 611, 611, 611, 611, 778, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 930, 722, 
722, 667, 944, 9
 44, 944, 944, 944, 667, 657, 667, 667, 667, 667, 667, 611, 611, 611, 611, 611, 556, 556, 556, 556, 333, 333, 
556, 889, 889, 1000, 722, 708, 722, 614, 722, 667, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 
667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 575, 886, 614, 719, 667, 
278, 278, 556, 1094, 1042, 854, 622, 677, 556, 619, 604, 534, 618, 556, 556, 736, 510, 611, 611, 507, 622, 
740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 467, 611, 
469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 556, 719, 778, 611, 611, 885, 516, 1146, 556, 620, 620, 
556, 722, 333, 556, 549, 556, 556, 1000, 500, 999, 1000, 500, 500, 500, 584, 584, 389, 975, 556, 611, 278, 
280, 621, 708, 389, 389, 333, 333, 333, 333, 280, 350, 556, 556, 333, 333, 222, 556, 556, 556, 556, 333, 556, 
578, 604, 333, 333, 656, 333, 278, 333, 222, 737, 556, 333, 611, 556, 556, 740, 611, 400, 610, 510, 333, 333, 
333, 549, 729, 708, 556, 
 333, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 1000, 556, 1000, 556, 611, 556, 479, 479, 584, 
583, 600, 611, 611, 611, 333, 604, 333, 333, 750, 604, 1000, 556, 834, 333, 556, 556, 333, 556, 611, 556, 
611, 611, 611, 611, 611, 333, 333, 584, 549, 556, 556, 333, 333, 611, 611, 611, 594, 604, 333, 333, 278, 278, 
278, 278, 278, 278, 556, 278, 713, 274, 604, 604, 722, 604, 604, 1052, 278, 278, 278, 278, 278, 278, 278, 
278, 556, 566, 556, 556, 278, 278, 556, 396, 278, 479, 584, 549, 708, 556, 584, 278, 494, 278, 708, 889, 552, 
750, 333, 584, 240, 603, 584, 500, 750, 611, 611, 708, 611, 611, 556, 333, 549, 611, 556, 556, 611, 611, 611, 
611, 611, 944, 333, 611, 611, 611, 834, 834, 611, 611, 556, 834, 834, 834, 354, 370, 365, 979, 611, 611, 611, 
611, 556, 333, 333, 494, 889, 278, 1000, 1104, 704, 712, 584, 549, 823, 773, 611, 611, 611, 474, 500, 500, 
500, 278, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 584, 605, 333, 708, 556, 556, 556, 556, 556, 556, 
479, 556, 556, 834, 3
 33, 708, 664, 532, 556, 278, 1021, 531, 556, 713, 917, 333, 409, 333, 479, 333, 558, 611, 556, 834, 834, 
333, 333, 333, 1000, 990, 990, 990, 990, 556, 611, 611, 611, 611, 611, 611, 611, 611, 556, 552, 278, 333, 
333, 333, 576, 333, 611, 333, 333, 333, 667, 719, 556, 619, 333, 333, 333, 396, 768, 612, 167, 278, 750, 333, 
611, 611, 611, 708, 591, 591, 591, 591, 611, 611, 556, 778, 778, 778, 778, 778, 556, 450, 556, 556, 556, 556, 
556, 556, 500, 500, 500, 500, 556, 492];
+exports.LiberationSansBoldItalicWidths = LiberationSansBoldItalicWidths;
+const LiberationSansItalicWidths = [365, 0, 667, 1000, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 
667, 667, 667, 667, 667, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 671, 667, 667, 667, 667, 667, 667, 
667, 667, 667, 723, 667, 667, 789, 722, 846, 722, 556, 611, 778, 570, 778, 778, 778, 778, 722, 604, 354, 354, 
604, 722, 722, 278, 733, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 389, 278, 500, 500, 667, 667, 667, 
556, 556, 667, 556, 556, 556, 556, 833, 833, 722, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 
778, 778, 778, 761, 775, 778, 794, 778, 778, 778, 667, 837, 725, 831, 778, 722, 722, 722, 722, 667, 667, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 667, 667, 667, 667, 667, 
600, 611, 611, 611, 611, 611, 778, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 865, 722, 722, 
667, 944, 944, 
 944, 944, 944, 667, 648, 667, 667, 667, 667, 667, 611, 611, 611, 611, 611, 556, 556, 556, 556, 333, 294, 
556, 889, 889, 1000, 667, 651, 667, 544, 704, 667, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 
667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 492, 843, 544, 708, 667, 
278, 278, 500, 1066, 982, 844, 589, 639, 556, 562, 522, 493, 553, 556, 556, 688, 465, 556, 556, 472, 564, 
686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 339, 556, 
378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 500, 724, 778, 556, 556, 885, 323, 1083, 556, 570, 570, 
556, 667, 278, 556, 549, 556, 556, 1000, 500, 1000, 998, 500, 500, 500, 469, 584, 389, 1015, 556, 556, 278, 
260, 571, 708, 334, 334, 278, 278, 333, 285, 260, 350, 500, 500, 333, 324, 222, 500, 500, 500, 500, 333, 556, 
546, 604, 333, 324, 656, 278, 278, 333, 222, 737, 556, 333, 556, 556, 556, 625, 556, 400, 556, 510, 333, 316, 
333, 549, 729, 708, 556, 333, 
 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 1000, 556, 1000, 556, 556, 556, 439, 439, 584, 584, 
600, 555, 555, 556, 278, 500, 333, 278, 750, 604, 1000, 556, 834, 333, 556, 556, 333, 556, 556, 500, 556, 
556, 556, 556, 611, 333, 294, 584, 549, 556, 556, 333, 333, 556, 556, 556, 594, 604, 333, 398, 222, 278, 278, 
278, 278, 278, 444, 278, 713, 274, 604, 604, 719, 604, 604, 1052, 222, 222, 222, 222, 222, 278, 222, 222, 
500, 500, 500, 500, 222, 222, 492, 281, 222, 400, 584, 549, 708, 556, 584, 222, 494, 222, 708, 833, 552, 750, 
333, 584, 188, 548, 584, 500, 750, 556, 556, 615, 556, 556, 556, 333, 549, 556, 500, 556, 556, 556, 556, 556, 
556, 944, 333, 556, 556, 556, 779, 779, 556, 556, 556, 834, 834, 834, 354, 370, 365, 979, 611, 611, 556, 556, 
537, 333, 333, 494, 889, 278, 1000, 1094, 652, 670, 584, 549, 823, 728, 556, 556, 611, 355, 333, 333, 333, 
222, 222, 222, 222, 191, 333, 333, 549, 333, 333, 737, 584, 573, 333, 708, 500, 500, 500, 500, 500, 500, 354, 
556, 556, 834, 333, 7
 08, 603, 486, 556, 278, 1021, 531, 556, 713, 917, 278, 374, 278, 354, 278, 542, 556, 556, 834, 834, 333, 
328, 333, 1000, 990, 990, 990, 990, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 552, 278, 333, 333, 
333, 576, 333, 611, 278, 333, 278, 667, 715, 556, 565, 333, 333, 333, 365, 768, 612, 167, 278, 750, 333, 500, 
500, 556, 708, 550, 550, 550, 550, 556, 556, 500, 722, 722, 722, 722, 722, 500, 447, 500, 500, 500, 500, 556, 
500, 500, 500, 500, 500, 556, 463];
+exports.LiberationSansItalicWidths = LiberationSansItalicWidths;
+const LiberationSansRegularWidths = [365, 0, 667, 1000, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 
667, 667, 667, 667, 667, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 668, 667, 667, 667, 667, 667, 667, 
667, 667, 667, 723, 667, 667, 784, 722, 838, 722, 556, 611, 778, 551, 778, 778, 778, 778, 722, 604, 354, 354, 
604, 722, 722, 278, 735, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 384, 278, 500, 500, 667, 667, 667, 
556, 556, 668, 556, 556, 556, 556, 833, 833, 722, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 
778, 778, 778, 748, 752, 778, 774, 778, 778, 778, 667, 798, 722, 835, 778, 722, 722, 722, 722, 667, 667, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 
708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 667, 667, 667, 667, 667, 
618, 611, 611, 611, 611, 611, 778, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 855, 722, 722, 
667, 944, 944,
  944, 944, 944, 667, 650, 667, 667, 667, 667, 667, 611, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 
889, 889, 1000, 667, 656, 667, 542, 677, 667, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 
722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 489, 865, 542, 719, 667, 278, 
278, 500, 1057, 1010, 854, 583, 635, 556, 573, 531, 365, 583, 556, 556, 669, 458, 559, 559, 438, 583, 688, 
552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 411, 556, 365, 
510, 500, 222, 278, 222, 906, 812, 556, 438, 500, 719, 778, 552, 556, 885, 323, 1073, 556, 578, 578, 556, 
667, 278, 556, 549, 556, 556, 1000, 500, 1000, 1000, 500, 500, 500, 469, 584, 389, 1015, 556, 556, 278, 260, 
575, 708, 334, 334, 278, 278, 333, 260, 350, 500, 500, 333, 500, 500, 500, 500, 333, 556, 525, 604, 333, 656, 
278, 278, 737, 556, 556, 556, 556, 615, 556, 400, 557, 510, 333, 333, 549, 729, 708, 556, 333, 278, 556, 556, 
556, 556, 556, 556, 556, 55
 6, 556, 1000, 556, 1000, 556, 556, 556, 446, 446, 584, 583, 600, 556, 556, 556, 278, 500, 333, 278, 750, 
604, 1000, 556, 834, 556, 556, 556, 556, 500, 556, 556, 556, 556, 611, 333, 222, 222, 294, 294, 324, 324, 
316, 328, 398, 285, 333, 584, 549, 556, 556, 333, 333, 556, 556, 556, 594, 604, 333, 222, 278, 278, 278, 278, 
278, 444, 278, 713, 274, 604, 604, 719, 604, 604, 1052, 222, 222, 222, 222, 222, 278, 222, 222, 500, 500, 
500, 500, 222, 222, 500, 292, 222, 334, 584, 549, 708, 556, 584, 222, 494, 222, 708, 833, 552, 750, 333, 584, 
188, 576, 584, 500, 750, 556, 556, 604, 556, 556, 556, 333, 549, 556, 500, 556, 556, 556, 556, 556, 556, 944, 
333, 556, 556, 556, 781, 781, 556, 556, 556, 834, 834, 834, 354, 370, 365, 979, 611, 611, 556, 556, 537, 333, 
333, 494, 889, 278, 1000, 1094, 648, 690, 584, 549, 823, 713, 556, 556, 611, 355, 333, 333, 333, 222, 222, 
222, 222, 191, 333, 333, 549, 333, 333, 737, 584, 569, 333, 708, 500, 500, 500, 500, 500, 500, 354, 556, 556, 
834, 708, 617, 482, 556
 , 278, 1021, 531, 556, 713, 917, 278, 395, 278, 375, 278, 556, 556, 556, 834, 834, 333, 333, 1000, 990, 990, 
990, 990, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 552, 278, 333, 333, 333, 576, 333, 611, 278, 333, 
278, 667, 722, 556, 559, 333, 333, 333, 333, 333, 333, 333, 365, 768, 612, 167, 278, 750, 333, 333, 500, 500, 
556, 708, 547, 547, 547, 547, 556, 556, 500, 722, 722, 722, 722, 722, 500, 448, 500, 500, 500, 500, 556, 500, 
500, 500, 500, 500, 556, 441];
+exports.LiberationSansRegularWidths = LiberationSansRegularWidths;
+
+/***/ }),
+/* 59 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.MyriadProRegularLineHeight = exports.MyriadProRegularFactors = exports.MyriadProItalicLineHeight = 
exports.MyriadProItalicFactors = exports.MyriadProBoldLineHeight = exports.MyriadProBoldItalicLineHeight = 
exports.MyriadProBoldItalicFactors = exports.MyriadProBoldFactors = void 0;
+const MyriadProBoldFactors = [1.36898, 1, 0.90838, 0.868, 0.868, 0.90838, 0.90838, 0.90838, 0.90838, 
0.90838, 0.90838, 0.91945, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.83637, 0.83637, 0.82391, 0.82391, 
0.82391, 0.82391, 0.82391, 0.82391, 0.91905, 0.96376, 0.96376, 0.97484, 0.90157, 0.80061, 0.80061, 0.80061, 
0.80061, 0.80061, 0.80061, 0.80061, 0.80061, 0.80061, 0.95417, 0.80061, 0.80061, 0.75261, 0.95407, 0.87992, 
0.97484, 0.99793, 0.86275, 0.8768, 0.8019, 0.8768, 0.8768, 1, 0.8768, 0.95407, 1, 1, 1, 1, 0.97069, 0.95407, 
1.0258, 0.887, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 1.0258, 0.82976, 
1.0258, 0.73901, 0.73901, 0.85022, 0.85022, 1, 0.83655, 0.83655, 0.97153, 0.83655, 1, 0.83655, 0.84638, 
1.0156, 1.0156, 0.95546, 0.95546, 0.95546, 1, 0.95546, 0.95546, 0.92179, 0.936, 0.92179, 0.92179, 0.92179, 
0.92179, 0.92179, 0.92179, 0.92179, 0.92796, 0.97268, 0.92179, 0.96034, 0.92179, 0.92179, 0.92179, 0.87107, 
0.95638, 0.92361, 0.91709, 0.92179, 0.82
 114, 0.82114, 0.82114, 1, 0.87107, 0.8096, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8096, 0.8096, 1, 0.8096, 1, 0.96318, 0.89713, 
0.89713, 0.89713, 0.89713, 1, 0.92436, 0.86958, 0.94438, 0.94438, 0.94438, 0.94438, 0.94438, 0.94438, 
0.94438, 0.94438, 0.94438, 0.93704, 0.93704, 0.83689, 0.94438, 0.94438, 0.95353, 0.94083, 0.94083, 0.94083, 
0.94083, 0.94083, 0.91905, 0.89192, 0.90406, 0.90406, 0.90406, 0.90406, 0.90406, 0.9446, 0.9446, 0.9446, 
0.9446, 0.9446, 0.94938, 0.94938, 0.94938, 0.94938, 0.90088, 1, 0.94938, 0.9031, 0.9031, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94938, 0.94836, 0.94836, 0.94938, 0.93884, 
0.83181, 0.94938, 1.08595, 0.94938, 0
 .94938, 1, 1, 1, 1, 1, 1, 1, 1.02058, 1.02058, 1.16661, 0.78966, 0.94938, 0.97898, 1.18777, 1.01149, 
0.96174, 1, 0.80687, 0.80687, 0.94292, 0.94292, 0.90088, 1, 1.01149, 0.96544, 0.81093, 0.81093, 0.90088, 1, 
1, 0.81093, 0.81093, 0.81093, 0.81093, 0.90088, 0.99793, 0.87548, 1, 0.90088, 1, 1, 0.78076, 0.93582, 1, 1, 
0.91882, 0.99793, 1, 0.97571, 0.94219, 0.94219, 0.84313, 0.97571, 0.89022, 0.9498, 1, 0.90088, 1, 0.9358, 
1.08595, 1, 1, 0.99793, 0.90088, 0.98621, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 
0.94938, 0.99793, 1, 1, 0.94938, 1, 0.89903, 0.95933, 0.94938, 0.98607, 1.0373, 1.02058, 1, 1.36145, 0.95933, 
0.95933, 0.93969, 0.80479, 1, 0.80479, 1.024, 1, 1, 1, 0.99793, 1, 1, 0.99793, 0.99793, 1, 1, 0.9577, 
0.92601, 0.9577, 0.9577, 1, 0.9577, 0.98225, 0.90088, 1, 1.02058, 1.08595, 0.8361, 0.8361, 0.81079, 0.81079, 
0.95933, 0.95933, 0.95933, 1, 1, 0.90088, 1, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 1.01591, 
0.98621, 1.05486, 1.30692, 1, 1, 1, 1, 1
 , 1, 0.98621, 1.0078, 1.0078, 1.0078, 1.0078, 0.98621, 1.0474, 1.0474, 0.97455, 0.98275, 1, 0.97455, 
0.98981, 0.98981, 0.9314, 0.73977, 1, 0.73903, 1.02058, 1.08595, 1, 1, 1.02058, 1, 1.16161, 1.033, 1, 0.9672, 
0.54324, 1, 1, 1.02058, 1, 0.95617, 1.02058, 1, 1, 0.95933, 0.95933, 0.8271, 0.95933, 1, 0.99793, 1, 1.08595, 
0.95933, 0.91701, 0.98894, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 0.91964, 0.90088, 0.9446, 0.9446, 0.9446, 
0.86774, 0.86774, 0.9446, 0.9446, 0.99793, 1, 0.99642, 0.99642, 1, 1.0213, 1.05686, 1, 0.9446, 0.9446, 
0.9446, 0.97898, 0.97455, 0.94292, 0.94292, 1.17173, 0.9897, 0.93582, 1.285, 1, 0.99394, 0.78367, 1.02058, 
1.08595, 0.80535, 0.96361, 0.97407, 0.72851, 0.72851, 0.83734, 0.918, 0.908, 0.908, 0.93582, 1, 0.93582, 
0.93582, 0.86209, 0.97646, 0.97646, 1.0732, 0.97646, 1, 0.62295, 1, 0.9553, 0.90088, 1, 0.78036, 0.78036, 
0.78036, 1, 0.78036, 1, 1, 1.00872, 0.99793, 1, 1, 1, 0.86832, 1, 0.99793, 1.19137, 1, 1, 0.99793, 0.76169, 
1, 1.10208, 1.0128, 1.10208, 0.77452, 
 1, 1.05453, 0.97898, 0.99793, 1, 0.99642, 0.90088, 1, 0.90989, 0.65, 1, 1, 1, 1, 0.99793, 0.95442, 0.95442, 
0.95442, 0.95442, 0.95442, 0.95442, 0.95442, 0.95442, 0.89903, 1, 0.72706, 0.96694, 1, 1, 1, 1, 0.89713, 
1.10208, 0.90088, 0.78076, 1, 1, 1, 1, 0.96694, 1, 1, 1, 1, 1, 0.74854, 0.93582, 1, 1, 1, 1, 0.95442, 1, 
0.95871, 0.95871, 0.95871, 0.95871, 0.95442, 0.95442, 0.95298, 0.97579, 0.97579, 0.97579, 0.97579, 0.97579, 
0.9332, 1.05993, 0.94039, 0.94039, 0.94039, 0.94039, 0.99793, 0.94039, 0.938, 0.938, 0.938, 0.938, 0.99793, 
0.95776];
+exports.MyriadProBoldFactors = MyriadProBoldFactors;
+const MyriadProBoldLineHeight = 1.2;
+exports.MyriadProBoldLineHeight = MyriadProBoldLineHeight;
+const MyriadProBoldItalicFactors = [1.36898, 1, 0.85576, 0.845, 0.845, 0.85576, 0.85576, 0.85576, 0.85576, 
0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.80591, 0.80591, 0.80729, 0.80729, 
0.80729, 0.80729, 0.80729, 0.80729, 0.85308, 0.94299, 0.94299, 0.95961, 0.94729, 0.77512, 0.77512, 0.77512, 
0.77512, 0.77512, 0.77512, 0.77512, 0.77512, 0.77512, 0.92098, 0.77512, 0.77512, 0.66862, 0.92222, 0.7927, 
0.95961, 0.97276, 0.83655, 0.86523, 0.7805, 0.86523, 0.86523, 1, 0.86523, 0.92222, 1, 1, 1, 1, 0.92222, 
0.92222, 0.98621, 0.86036, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 0.98621, 
0.98621, 0.69323, 0.98621, 0.71743, 0.71743, 0.81698, 0.81698, 1, 0.79726, 0.79726, 0.92655, 0.79726, 1, 
0.79726, 0.81691, 0.98558, 0.98558, 0.92222, 0.92222, 0.92222, 1, 0.92222, 0.92222, 0.90637, 0.909, 0.90637, 
0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 0.92346, 0.89711, 0.90637, 0.88127, 0.90251, 0.90251, 
0.90637, 0.83809, 0.93157, 0.9097
 6, 0.83392, 0.90637, 0.80729, 0.80729, 0.80729, 1, 0.83809, 0.76463, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.76463, 0.76463, 1, 
0.76463, 1, 0.94523, 0.86275, 0.86275, 0.86275, 0.86275, 1, 0.90637, 0.83659, 0.90699, 0.90699, 0.90699, 
0.90699, 0.90699, 0.90699, 0.90699, 0.90699, 0.90699, 0.83509, 0.83509, 0.72459, 0.90699, 0.90699, 0.91605, 
0.9154, 0.9154, 0.9154, 0.9154, 0.9154, 0.85308, 0.85359, 0.85458, 0.85458, 0.85458, 0.85458, 0.85458, 
0.90531, 0.90531, 0.90531, 0.90531, 0.90531, 0.99613, 0.99613, 0.99613, 0.99613, 1.18616, 1, 0.99613, 
0.85811, 0.85811, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0.99613, 0.92886, 0.92886, 0.99613, 0.92222, 0.8017
 8, 0.99613, 1.08595, 0.99613, 0.99613, 1, 1, 1, 1, 1, 1, 1, 1.02058, 1.02058, 1.16148, 0.76813, 0.99613, 
0.91677, 1.21296, 0.8578, 0.90557, 1, 0.80687, 0.80687, 0.94292, 0.94292, 1.18616, 1, 0.8578, 0.95973, 
0.78216, 0.78216, 1.18616, 1, 1, 0.78216, 0.78216, 0.78216, 0.78216, 1.18616, 0.97276, 0.81539, 1, 1.18616, 
1, 1, 0.78076, 0.93582, 1, 1, 0.91339, 0.97276, 1, 0.91677, 0.9332, 0.9332, 0.76783, 0.91677, 0.89022, 
0.90276, 1, 1.18616, 1, 1.30628, 1.08595, 1, 1, 0.97276, 1.18616, 0.95381, 0.90083, 0.90083, 0.90083, 
0.90083, 0.90083, 0.90083, 0.90083, 0.90083, 0.97276, 1, 1, 0.90083, 1, 0.89903, 0.92168, 0.90083, 0.91324, 
0.91324, 1.02058, 1, 1.36145, 0.92168, 0.92168, 0.9135, 0.80779, 1, 0.80779, 0.98796, 1, 1, 1, 0.97276, 1, 1, 
0.97276, 0.97276, 1, 1, 0.9135, 0.86847, 0.9135, 0.9135, 1, 0.9135, 0.94951, 1.18616, 1, 1.02058, 1.08595, 
0.82891, 0.82711, 0.80479, 0.80178, 0.92168, 0.92168, 0.92168, 1, 1, 1.18616, 1, 0.95381, 0.95381, 0.95381, 
0.95381, 0.95381, 0.95381, 0.97096, 0.95381
 , 1.05486, 1.23026, 1, 1, 1, 1, 1, 1, 0.95381, 0.95381, 0.95381, 0.95381, 0.95381, 0.95381, 0.98981, 
0.98981, 0.95298, 0.9224, 1, 0.95298, 0.95381, 0.95381, 0.85408, 0.6894, 1, 0.74321, 1.02058, 1.08595, 1, 1, 
1.02058, 1, 1.20006, 1.0006, 1, 0.93459, 0.71526, 1, 1, 1.02058, 1, 0.92699, 1.02058, 1, 1, 0.92168, 0.92168, 
0.79464, 0.92168, 1, 0.97276, 1, 1.08595, 0.92168, 0.86847, 0.97276, 0.91513, 0.91513, 0.91513, 0.91513, 
0.91513, 0.87514, 1.18616, 0.91513, 0.91513, 0.91513, 0.85923, 0.85923, 0.91513, 0.91513, 0.97276, 1, 
0.99043, 0.99043, 1, 1.08074, 1.04864, 1, 0.91677, 0.91677, 0.91513, 0.92004, 0.96736, 0.94292, 0.94292, 
1.14542, 0.97733, 0.93582, 1.26, 1, 0.97355, 0.80487, 1.02058, 1.08595, 0.79199, 0.89398, 0.91677, 0.71541, 
0.71541, 0.81625, 0.896, 0.896, 0.896, 0.91782, 1, 0.91782, 0.91782, 0.83266, 0.95077, 0.95077, 1.03493, 
0.95077, 1, 0.55509, 1, 0.93481, 1.18616, 1, 0.748, 0.748, 0.748, 1, 0.748, 1, 1, 0.99973, 0.97276, 1, 1, 1, 
0.88159, 1, 0.97276, 1.17337, 1, 1, 0.97276
 , 0.78694, 1, 1.04502, 1.05214, 1.04502, 0.72651, 1, 0.99531, 0.92332, 0.97276, 1, 0.99043, 1.18616, 1, 
1.00899, 0.698, 1, 1, 1, 1, 0.97276, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 
0.89903, 1, 0.66227, 0.96694, 1, 1, 1, 1, 0.86275, 1.04502, 1.18616, 0.78076, 1, 1, 1, 1, 0.96694, 1, 1, 1, 
1, 1, 0.85633, 0.93582, 1, 1, 1, 1, 0.91677, 1, 0.90646, 0.90646, 0.90646, 0.90646, 0.91677, 0.91677, 
0.92061, 0.94236, 0.94236, 0.94236, 0.94236, 0.94236, 0.89544, 1.0051, 0.89364, 0.89364, 0.89364, 0.89364, 
0.97276, 0.89364, 0.9, 0.9, 0.9, 0.9, 0.97276, 0.86842];
+exports.MyriadProBoldItalicFactors = MyriadProBoldItalicFactors;
+const MyriadProBoldItalicLineHeight = 1.2;
+exports.MyriadProBoldItalicLineHeight = MyriadProBoldItalicLineHeight;
+const MyriadProItalicFactors = [1.36898, 1, 0.85158, 0.773, 0.773, 0.85158, 0.85158, 0.85158, 0.85158, 
0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.77812, 0.77812, 0.76852, 0.76852, 
0.76852, 0.76852, 0.76852, 0.76852, 0.78112, 0.89591, 0.89591, 0.90561, 0.88836, 0.70466, 0.70466, 0.70466, 
0.70466, 0.70466, 0.70466, 0.70466, 0.70466, 0.70466, 0.87396, 0.70466, 0.70466, 0.62264, 0.86822, 0.7646, 
0.90561, 0.88465, 0.76125, 0.80094, 0.76449, 0.80094, 0.80094, 1, 0.80094, 0.86822, 1, 1, 1, 1, 0.86822, 
0.86822, 0.83864, 0.81402, 0.83864, 0.83864, 0.83864, 0.83864, 0.83864, 0.83864, 0.83864, 0.83864, 0.83864, 
0.83864, 0.65351, 0.83864, 0.728, 0.728, 0.77212, 0.77212, 1, 0.79475, 0.79475, 0.85308, 0.79475, 1, 0.79475, 
0.80553, 0.93637, 0.93637, 0.87514, 0.87514, 0.87514, 1, 0.87514, 0.87514, 0.8588, 0.867, 0.8588, 0.8588, 
0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 0.89386, 0.89947, 0.8588, 0.86026, 0.85751, 0.85751, 0.8588, 0.76013, 
0.82565, 0.85701, 0.77899, 0.858
 8, 0.72421, 0.72421, 0.72421, 1, 0.76013, 0.69866, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.69866, 0.69866, 1, 0.69866, 1, 0.89058, 
0.77598, 0.77598, 0.77598, 0.77598, 1, 0.8588, 0.76013, 0.85991, 0.85991, 0.85991, 0.85991, 0.85991, 0.85991, 
0.85991, 0.85991, 0.85991, 0.8156, 0.8156, 0.69461, 0.85991, 0.85991, 0.80811, 0.87832, 0.87832, 0.87832, 
0.87832, 0.87832, 0.78112, 0.82352, 0.77512, 0.77512, 0.77512, 0.77512, 0.77512, 0.8562, 0.8562, 0.8562, 
0.8562, 0.8562, 0.93859, 0.93859, 0.93859, 0.93859, 1.15012, 1, 0.93859, 0.8075, 0.8075, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93859, 0.9486, 0.9486, 0.93859, 0.88307, 
0.77025, 0.93859, 1.08595, 0.93
 859, 0.93859, 1, 1, 1, 1, 1, 1, 1, 1.27014, 1.02058, 1.06383, 0.70926, 0.93859, 0.94399, 1.18417, 0.83537, 
0.93298, 1, 0.85034, 0.85034, 1.0222, 1.0222, 1.15012, 1, 0.83537, 0.79121, 0.846, 0.846, 1.15012, 1, 1, 
0.846, 0.846, 0.846, 0.846, 1.15012, 0.88465, 0.77487, 1, 1.15012, 1, 1, 0.75945, 0.75945, 1, 1, 0.9161, 
0.88465, 1, 0.94399, 0.86847, 0.86847, 0.8544, 0.94399, 0.79519, 0.93942, 1, 1.15012, 1, 1.03901, 1.08595, 1, 
1, 0.88465, 1.15012, 0.82424, 0.81453, 0.81453, 0.81453, 0.81453, 0.81453, 0.81453, 0.81453, 0.81453, 
0.88465, 1, 1, 0.81453, 1, 0.89903, 0.96017, 0.81453, 0.92388, 0.92388, 1.02058, 1, 1.36145, 0.96186, 
0.96186, 0.9278, 0.84943, 1, 0.70869, 1.0186, 1, 1, 1, 0.88465, 1, 1, 0.88465, 0.88465, 1, 1, 0.94219, 0.878, 
0.94219, 0.94219, 1, 0.94219, 0.88075, 1.15012, 1, 1.02058, 1.08595, 0.73541, 0.73361, 0.73572, 0.73572, 
0.96017, 0.96017, 0.96017, 1, 1, 1.15012, 1, 1.03075, 0.82424, 0.82424, 0.82424, 0.82424, 0.82424, 1.02738, 
0.82424, 1.02119, 1.06233, 1, 1, 1, 1, 1, 1
 , 1.03075, 1.03075, 1.03075, 1.03075, 1.03075, 0.82424, 1.02175, 1.02175, 0.912, 0.922, 1, 0.912, 1.03075, 
1.03075, 0.88787, 0.83911, 1, 0.66266, 1.02058, 1.08595, 1, 1, 1.02058, 1, 1.05233, 1.06676, 1, 0.96998, 
0.69353, 1, 1, 1.02058, 1, 0.95829, 1.02058, 1, 1, 0.96017, 0.96017, 0.86865, 0.96017, 1, 0.88465, 1, 
1.08595, 0.96017, 0.88, 0.88465, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.84759, 1.15012, 0.93859, 
0.93859, 0.93859, 0.86799, 0.86799, 0.93859, 0.93859, 0.88465, 1, 0.9005, 0.9005, 1, 0.94565, 0.9446, 1, 
0.8562, 0.8562, 0.93859, 0.94399, 0.91974, 0.85283, 0.85283, 1.04828, 0.86936, 0.75945, 1.124, 1, 0.93969, 
0.78815, 1.02058, 1.08595, 0.74948, 0.85769, 0.94399, 0.69046, 0.62864, 0.85639, 1.027, 1.027, 1.027, 
0.87321, 1, 0.87321, 0.87321, 0.86948, 0.95493, 0.95493, 0.98391, 0.95493, 1, 0.53609, 1, 0.93758, 1.15313, 
1, 0.746, 0.746, 0.746, 1, 0.746, 1, 1, 0.90083, 0.88465, 1, 1, 1, 0.89217, 1, 0.88465, 1.17337, 1, 1, 
0.88465, 0.75187, 1, 1.12658, 1.03737, 1.12658, 0.884
 17, 1, 0.95119, 0.94578, 0.88465, 1, 0.9005, 1.15012, 1, 1.08106, 0.669, 1, 1, 1, 1, 0.88465, 0.94578, 
0.94578, 0.94578, 0.94578, 0.94578, 0.94578, 0.94578, 0.94578, 0.89903, 1, 0.65507, 0.9219, 1, 1, 1, 1, 
0.77598, 1.12658, 1.15012, 0.75945, 1, 1, 1, 1, 0.9219, 1, 1, 1, 1, 1, 0.85034, 0.75945, 1, 1, 1, 1, 0.94578, 
1, 0.91123, 0.91123, 0.91123, 0.91123, 0.94578, 0.94578, 0.91, 0.979, 0.979, 0.979, 0.979, 0.979, 0.882, 
0.93559, 0.882, 0.882, 0.882, 0.882, 0.88465, 0.882, 0.83, 0.83, 0.83, 0.83, 0.88465, 0.84596];
+exports.MyriadProItalicFactors = MyriadProItalicFactors;
+const MyriadProItalicLineHeight = 1.2;
+exports.MyriadProItalicLineHeight = MyriadProItalicLineHeight;
+const MyriadProRegularFactors = [1.36898, 1, 0.91755, 0.788, 0.788, 0.91755, 0.91755, 0.91755, 0.91755, 
0.91755, 0.91755, 0.92138, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.8126, 0.8126, 0.80314, 0.80314, 
0.80314, 0.80314, 0.80314, 0.80314, 0.85608, 0.92222, 0.92222, 0.92915, 0.92819, 0.73764, 0.73764, 0.73764, 
0.73764, 0.73764, 0.73764, 0.73764, 0.73764, 0.73764, 0.90991, 0.73764, 0.73764, 0.7154, 0.90284, 0.86169, 
0.92915, 0.92241, 0.79726, 0.83051, 0.81884, 0.83051, 0.83051, 1, 0.83051, 0.90284, 1, 1, 1, 1, 0.90976, 
0.90284, 0.86023, 0.82873, 0.86023, 0.86023, 0.86023, 0.86023, 0.86023, 0.86023, 0.86023, 0.86023, 0.86023, 
0.86023, 0.80513, 0.86023, 0.74, 0.74, 0.8126, 0.8126, 1, 0.84869, 0.84869, 0.91172, 0.84869, 1, 0.84869, 
0.85588, 0.96518, 0.96518, 0.91115, 0.91115, 0.91115, 1, 0.91115, 0.91115, 0.8858, 0.894, 0.8858, 0.8858, 
0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 0.94307, 0.98612, 0.8858, 0.94007, 0.8858, 0.8858, 0.8858, 0.79761, 
0.89992, 0.87791, 0.81992, 0.8858, 0.74
 498, 0.74498, 0.74498, 1, 0.79761, 0.73914, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.73914, 0.73914, 1, 0.73914, 1, 0.89297, 0.81363, 
0.81363, 0.81363, 0.81363, 1, 0.8858, 0.79611, 0.89591, 0.89591, 0.89591, 0.89591, 0.89591, 0.89591, 0.89591, 
0.89591, 0.89591, 0.88157, 0.88157, 0.82528, 0.89591, 0.89591, 0.83659, 0.89633, 0.89633, 0.89633, 0.89633, 
0.89633, 0.85608, 0.83089, 0.8111, 0.8111, 0.8111, 0.8111, 0.8111, 0.90531, 0.90531, 0.90531, 0.90531, 
0.90531, 0.86667, 0.86667, 0.86667, 0.86667, 0.90088, 0.86667, 0.86936, 0.86936, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.86667, 0.95308, 0.95308, 0.86667, 0.90706, 
0.78105, 0.86667, 1.08595, 0.86667,
  0.86667, 1, 1, 1, 1, 1, 1, 1, 1.27014, 1.02058, 1.0664, 0.72601, 0.86667, 1.0231, 1.22736, 0.92006, 
0.97358, 1, 0.85034, 0.85034, 1.0222, 1.0222, 0.90088, 0.92006, 0.80549, 0.896, 0.896, 0.90088, 0.896, 0.896, 
0.896, 0.896, 0.90088, 0.92241, 0.87064, 1, 0.90088, 1, 0.74505, 0.74505, 0.91882, 0.92241, 1.01411, 0.89903, 
0.89903, 0.93372, 1.01411, 0.79519, 0.98088, 1, 0.90088, 1.03901, 1.08595, 1, 1, 0.92241, 0.90088, 0.84224, 
0.90083, 0.90083, 0.90083, 0.90083, 0.90083, 0.90083, 0.90083, 0.90083, 0.92241, 1, 0.90083, 1, 0.89903, 
0.99793, 0.90083, 0.98699, 0.98699, 1.02058, 1, 1.36145, 0.99793, 0.99793, 0.97276, 0.82784, 1, 0.69067, 
1.05099, 1, 1, 1, 0.92241, 1, 0.92241, 0.92241, 1, 1.00512, 0.928, 1.00512, 1.00512, 1, 1.00512, 0.89713, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90088, 1.02058, 1.08595, 0.75339, 0.75339, 0.76575, 0.76575, 0.99793, 
0.99793, 0.99793, 1, 1, 0.90088, 1.05326, 0.84224, 0.84224, 0.84224, 0.84224, 0.84224, 1.07469, 0.84224, 
1.02119, 1.1536, 1, 1, 1, 1, 1, 1, 1.05326
 , 1.06226, 1.06226, 1.06226, 1.06226, 0.84224, 1.09377, 1.09377, 0.938, 0.986, 1, 0.938, 1.06226, 1.06226, 
0.944, 0.83704, 1, 0.81441, 1.02058, 1.08595, 1, 1, 1.02058, 1, 1.05638, 1.08927, 1, 1.00119, 0.54324, 1, 1, 
1.02058, 1, 0.95978, 1.02058, 1, 1, 0.99793, 0.99793, 0.91887, 0.99793, 1, 0.92241, 1, 1.08595, 0.99793, 
0.938, 0.89364, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 0.91434, 0.90088, 0.98714, 0.98714, 0.98714, 
0.88888, 0.88888, 0.98714, 0.98714, 0.92241, 1, 0.91009, 0.91009, 1, 0.93484, 0.97198, 1, 0.89876, 0.89876, 
0.98714, 1.0231, 0.95325, 0.85283, 0.85283, 1.07257, 0.89073, 0.74505, 1.156, 1, 0.99007, 0.80442, 1.02058, 
1.08595, 0.74705, 0.91879, 1.01231, 0.73002, 0.66466, 0.94935, 1.06904, 1.06304, 1.06304, 0.93173, 1, 
0.93173, 0.93173, 0.98472, 0.98196, 0.98196, 1.024, 0.98196, 1, 0.56866, 1, 0.98972, 0.90088, 1, 0.792, 
0.792, 0.792, 1, 0.792, 1, 1, 0.9332, 0.92241, 1, 1, 0.89762, 1, 0.92241, 1.23456, 1, 1, 0.92241, 0.71119, 1, 
1.19137, 1.04552, 1.19137, 0.904, 1, 0
 .96017, 1.0231, 0.92241, 1, 0.91009, 0.90088, 0.90388, 0.619, 1, 1, 1, 1, 0.92241, 0.99074, 0.99074, 
0.99074, 0.99074, 0.99074, 0.99074, 0.99074, 0.99074, 0.89903, 1, 0.76305, 0.9219, 1, 1, 1, 1, 0.81363, 
1.19137, 0.90088, 0.74505, 1, 1, 1, 1, 0.9219, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.72458, 0.74505, 1, 1, 1, 1, 1, 
0.99074, 1, 0.95817, 0.95817, 0.95817, 0.95817, 0.99074, 0.99074, 0.962, 1.01915, 1.01915, 1.01915, 1.01915, 
1.01915, 0.926, 0.96705, 0.942, 0.942, 0.942, 0.942, 0.92241, 0.942, 0.856, 0.856, 0.856, 0.856, 0.92241, 
0.92761];
+exports.MyriadProRegularFactors = MyriadProRegularFactors;
+const MyriadProRegularLineHeight = 1.2;
+exports.MyriadProRegularLineHeight = MyriadProRegularLineHeight;
+
+/***/ }),
+/* 60 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.SegoeuiRegularLineHeight = exports.SegoeuiRegularFactors = exports.SegoeuiItalicLineHeight = 
exports.SegoeuiItalicFactors = exports.SegoeuiBoldLineHeight = exports.SegoeuiBoldItalicLineHeight = 
exports.SegoeuiBoldItalicFactors = exports.SegoeuiBoldFactors = void 0;
+const SegoeuiBoldFactors = [1.76738, 1, 0.97363, 0.93506, 0.93506, 0.97363, 0.97363, 0.97363, 0.97363, 
0.97363, 0.97363, 1.01149, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.88776, 0.88776, 0.8641, 0.8641, 
0.8641, 0.8641, 0.8641, 0.8641, 0.98243, 1.02096, 1.02096, 1.02096, 0.97826, 0.79795, 0.79795, 0.79795, 
0.79795, 0.79795, 0.79795, 0.79795, 0.79795, 0.79795, 1.09251, 0.79795, 0.79795, 0.7676, 1.06085, 0.98167, 
1.02096, 1.03424, 0.85132, 0.914, 0.85134, 0.914, 0.914, 1, 0.914, 1.06085, 1, 0.99862, 0.99862, 1, 1.06085, 
1.06085, 1.1406, 0.97138, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 
1.01134, 1.1406, 0.8007, 0.8007, 0.89858, 0.89858, 1, 0.83693, 0.83693, 1.0388, 0.83693, 1, 0.83693, 0.83693, 
1.14889, 1.14889, 1.09398, 1.09398, 1.09398, 1, 1.09398, 1.09398, 0.97489, 0.93994, 0.97426, 0.97489, 
0.97426, 0.97426, 0.97426, 0.97489, 0.97489, 0.95493, 1.03089, 0.97489, 1.02546, 0.97489, 0.97489, 0.97426, 
0.92094, 0.99346, 1.0595, 1.02112, 0.97489
 , 0.90399, 0.90399, 0.90399, 1, 0.92094, 0.84041, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.84041, 0.84041, 0.84041, 0.84041, 1, 
0.94793, 0.95923, 0.95923, 0.95923, 0.95923, 1, 0.97489, 0.92094, 1.00135, 1.00135, 1.00135, 1.00135, 
1.00135, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.90996, 0.84097, 1.00135, 1.00135, 1, 1.06467, 
1.06467, 1.06467, 1.06467, 1.06467, 0.98243, 0.86039, 0.90996, 0.90996, 0.90996, 0.90996, 0.90996, 0.99361, 
0.99361, 0.99361, 0.99361, 0.99361, 0.96752, 0.96752, 0.96752, 0.96752, 0.91056, 1, 0.96752, 0.93136, 
0.93136, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96752, 
1.03574, 1.03574, 0.96752, 1.17647, 0.81525, 0.96752, 1.
 29004, 0.96752, 0.96752, 0.86182, 0.94434, 0.86279, 0.86279, 0.94434, 1, 1, 1.2107, 1.2107, 1.16939, 
0.97847, 0.96752, 1.01519, 1.56942, 1.16579, 1.0192, 1, 0.94856, 0.94856, 1.1085, 1.1085, 1.03959, 1, 
1.16579, 1.20642, 0.86304, 0.86304, 1.15103, 1, 1, 0.86304, 0.86304, 0.86304, 0.86304, 0.64663, 1.03424, 
0.96268, 1.42603, 1.15103, 1, 1.04315, 0.81378, 0.9754, 1, 1, 1.18622, 1, 1, 1.01359, 0.73047, 0.73047, 
1.03057, 1.03517, 0.94994, 1.00886, 1.34163, 1.3871, 1, 0.87815, 1.28826, 1, 1, 1.03424, 0.75953, 1.02285, 
0.97278, 0.97278, 0.97278, 0.97278, 0.97278, 0.97278, 0.97278, 0.97278, 1.03424, 1, 0.91211, 0.97278, 1, 
0.89903, 0.99041, 0.97278, 0.97531, 1.02597, 1.2107, 1.21172, 1, 1.0008, 1.0008, 0.97122, 0.9824, 0.96039, 
0.9824, 1.15103, 1, 1.42603, 1, 1.03424, 1.15749, 1, 1.03424, 1.03424, 1, 0.93503, 1.01359, 1.01932, 1.01359, 
1.01359, 1, 1.01359, 1.02798, 0.94282, 1, 1.2107, 1.29004, 1.04478, 1.04478, 1.03372, 1.03372, 0.98561, 
1.00879, 0.98561, 1.15296, 1, 1.21994, 1, 1.02285, 1
 .02285, 1.02285, 1.02285, 1.02285, 1.02285, 1.08692, 1.02285, 1.13973, 2.10339, 1, 1, 0.9716, 1.42603, 
1.42603, 1, 1.02285, 1.18102, 1.18102, 1.18102, 1.18102, 1.02285, 1.02285, 1.02285, 1.00527, 1.02277, 1, 
1.00527, 1.02285, 1.02285, 0.98683, 0.9455, 1, 0.90418, 1.2107, 1.29004, 1, 1.03424, 1.2107, 1.07733, 
1.18874, 1.13005, 1, 1.0302, 0.75155, 1, 1, 1.2107, 1.222, 1.0016, 1.2107, 1, 1, 0.99041, 0.99041, 0.96692, 
0.99041, 1, 1.03424, 1, 1.29004, 0.99041, 0.99561, 1.06497, 1.0008, 1, 1.0008, 1, 1, 0.97931, 0.79912, 1, 
1.0008, 1.0008, 0.98439, 0.98439, 1.0008, 1.0008, 1.03424, 1.15749, 1.15749, 1.14169, 0.99862, 1.10818, 
1.24866, 0.69825, 1.0008, 1.0008, 1, 1.01519, 0.91572, 1.1085, 1.1085, 1.16897, 0.97529, 0.9754, 1.25635, 
1.19687, 1.04983, 0.90434, 1.2107, 1.28826, 0.96085, 1.0499, 1.01359, 0.71703, 0.71703, 1.04016, 0.98633, 
0.98633, 0.98633, 1.04394, 1.04394, 1.04394, 1.04394, 1.23203, 1.02258, 1.02258, 1.18416, 1.02258, 1, 
1.18622, 1, 0.99921, 0.81378, 1, 0.79104, 0.79104, 0.79
 104, 0.79104, 0.79104, 1, 1.02956, 0.8727, 1.03424, 1.10948, 1, 1, 0.8965, 0.93803, 1.03424, 1.59578, 1, 
1.2886, 1.03424, 0.90137, 1, 1.16862, 1.23085, 1.16862, 1.07034, 1, 1.13189, 1.01519, 1.03424, 1.15749, 
1.17389, 1.15103, 1, 0.95161, 0.771, 0.87025, 0.87025, 0.87025, 0.87025, 1.03424, 0.99041, 0.99041, 0.99041, 
0.99041, 0.99041, 0.99041, 0.99041, 0.99041, 0.74627, 0.75155, 0.99297, 1.21408, 1.21408, 1.21408, 1, 
1.18328, 0.95923, 1.16862, 1.01173, 0.81378, 0.79795, 1.09466, 0.97278, 1.02065, 1, 1.21408, 1.24633, 
1.12454, 1, 1, 1, 0.9754, 1, 1, 1.09193, 1.09193, 0.99041, 1, 1.06628, 1.06628, 1.06628, 1.06628, 0.99041, 
0.99041, 0.97454, 1.02511, 1.02511, 1.02511, 1.02511, 1.02511, 0.99298, 1.07237, 0.96752, 0.96752, 0.96752, 
0.96752, 1.03424, 0.96752, 0.95801, 0.95801, 0.95801, 0.95801, 1.03424, 1.0106];
+exports.SegoeuiBoldFactors = SegoeuiBoldFactors;
+const SegoeuiBoldLineHeight = 1.33008;
+exports.SegoeuiBoldLineHeight = SegoeuiBoldLineHeight;
+const SegoeuiBoldItalicFactors = [1.76738, 1, 0.97363, 0.94385, 0.94385, 0.97363, 0.97363, 0.97363, 0.97363, 
0.97363, 0.97363, 1.00811, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.89723, 0.89723, 0.87897, 0.87897, 
0.87897, 0.87897, 0.87897, 0.87897, 0.9817, 1.0426, 1.0426, 1.0426, 1.09818, 0.79429, 0.79429, 0.79429, 
0.79429, 0.79429, 0.79429, 0.79429, 0.79429, 0.79429, 1.10466, 0.79429, 0.79429, 0.77702, 1.05815, 0.99137, 
1.0426, 1.036, 0.85292, 0.91149, 0.86869, 0.91149, 0.91149, 1, 0.91149, 1.05815, 1, 0.99862, 0.99862, 1, 
1.05815, 1.05815, 1.1406, 0.97441, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 1.1406, 
1.1406, 0.95253, 1.1406, 0.79631, 0.79631, 0.90128, 0.90128, 1, 0.83853, 0.83853, 1.06662, 0.83853, 1, 
0.83853, 0.83853, 1.04396, 1.04396, 1.10615, 1.10615, 1.10615, 1, 1.10615, 1.10615, 0.97552, 0.91602, 
0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 0.98999, 1.07205, 0.97552, 1.0347, 0.97552, 
0.97552, 0.97552, 0.94436, 1.00356, 1.04694,
  1.01945, 0.97552, 0.88641, 0.88641, 0.88641, 1, 0.94436, 0.80527, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.80527, 0.80527, 0.80527, 
0.80527, 1, 0.98015, 0.96083, 0.96083, 0.95923, 0.96083, 1, 0.97552, 0.94436, 1.00135, 1.00135, 1.00135, 
1.00135, 1.00135, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.91142, 0.86142, 1.00135, 1.00135, 1, 
1.06777, 1.06777, 1.06777, 1.06777, 1.06777, 0.9817, 0.84918, 0.91142, 0.91142, 0.91142, 0.91142, 0.91142, 
0.99361, 0.99361, 0.99361, 0.99361, 0.99361, 1.06585, 1.06585, 1.06585, 1.06585, 1.31818, 1, 1.06585, 
0.96705, 0.96705, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1.06585, 1.04961, 1.04961, 1.06585, 1.10953, 0.83
 284, 1.06585, 1.29004, 1.06585, 1.06585, 0.86224, 0.94434, 0.86364, 0.86279, 0.94434, 1, 1, 1.21237, 
1.21237, 1.16939, 0.97847, 1.06585, 0.97042, 1.57293, 1.16579, 0.99607, 1, 0.95107, 0.95107, 1.11144, 
1.11144, 1.31818, 1, 1.16579, 1.20502, 0.83055, 0.83055, 1.31818, 1, 1, 0.83055, 0.83055, 0.83055, 0.83055, 
1.31818, 1.036, 0.93491, 1.42603, 1.31818, 1, 1.04315, 0.81378, 0.9754, 1, 1, 1.18754, 1, 1, 0.97042, 
0.72959, 0.72959, 1.0033, 0.97042, 0.94994, 1.008, 1.34163, 1.31818, 1, 1.27126, 1.29004, 1, 1, 1.036, 
1.31818, 1.14236, 0.93503, 0.93503, 0.93503, 0.93503, 0.93503, 0.93503, 0.93503, 0.93503, 1.036, 1, 0.91406, 
0.93503, 1, 0.89903, 0.97922, 0.93503, 0.9898, 0.9898, 1.21237, 1.21339, 1, 1.00639, 1.00639, 0.93125, 
1.03959, 0.96039, 1.03959, 1.1261, 1, 1.42603, 1, 1.036, 1.15574, 1, 1.036, 1.036, 1, 0.93327, 0.97042, 
1.02897, 0.97042, 0.97042, 1, 0.97042, 0.98721, 1.31818, 1, 1.21237, 1.29004, 1.05356, 1.05356, 1.03372, 
1.03372, 0.97922, 0.97922, 0.97922, 1.15296, 1, 1.31818, 1, 
 1.14236, 1.14236, 1.14236, 1.14236, 1.14236, 1.14236, 1.04302, 1.14236, 1.13904, 2.10339, 1, 1, 0.9716, 
1.42603, 1.42603, 1, 1.14236, 1.14236, 1.14236, 1.14236, 1.14236, 1.14236, 0.94552, 1.01582, 1.01054, 
1.00518, 1, 1.01054, 1.14236, 1.14236, 0.97981, 1.09125, 1, 0.90418, 1.21237, 1.29004, 1, 1.03336, 1.21237, 
1.23199, 1.18775, 1.19508, 1, 1.02471, 0.79487, 1, 1, 1.21237, 1.222, 1.02186, 1.21237, 1, 1, 0.97922, 
0.97922, 1.01034, 0.97922, 1, 1.036, 1, 1.29004, 0.97922, 1, 1.02809, 0.94165, 0.94165, 0.94165, 0.94165, 
0.94165, 0.91981, 1.31818, 0.94165, 0.94165, 0.94165, 1.00351, 1.00351, 0.94165, 0.94165, 1.036, 1.15574, 
1.15574, 1.13934, 0.99862, 1.26781, 1.24866, 0.69825, 0.94165, 0.94165, 0.94165, 0.97042, 0.91484, 1.11144, 
1.11144, 1.16798, 0.97639, 0.9754, 1.26514, 1.16541, 1.10687, 0.99314, 1.21237, 1.29004, 0.96085, 1.04232, 
0.97042, 0.73541, 0.73541, 1.04016, 0.98633, 0.98633, 0.98633, 1.04745, 1.04394, 1.04745, 1.04745, 1.23203, 
1.0276, 1.0276, 1.18416, 1.0276, 1, 1.18622, 
 1, 0.98387, 1.31818, 1, 0.78929, 0.78929, 0.78929, 0.78929, 0.78929, 1, 1.02956, 0.87357, 1.036, 1.15574, 1, 
1, 0.93377, 0.93028, 1.036, 1.59754, 1, 1.2886, 1.036, 0.90068, 1, 1.1261, 1.35125, 1.16862, 1.05403, 1, 
1.11121, 0.97042, 1.036, 1.15574, 1.17389, 1.31818, 1, 0.95161, 0.771, 0.87025, 0.87025, 0.87025, 0.87025, 
1.036, 0.97922, 0.97922, 0.97922, 0.97922, 0.97922, 0.97922, 0.97922, 0.97922, 0.74627, 0.75155, 0.98946, 
1.21261, 1.24047, 1.24047, 1, 1.1349, 0.96083, 1.1261, 1.31818, 0.81378, 0.79429, 1.09097, 0.93503, 0.96609, 
1, 1.21261, 1.24633, 1.09125, 1, 1, 1, 0.9754, 1, 1, 1.13269, 1.13269, 0.97922, 1, 1.07514, 1.07514, 1.07514, 
1.07514, 0.97922, 0.97922, 0.95874, 1.02197, 1.02197, 1.02197, 1.02197, 1.02197, 0.98507, 1.08578, 0.96752, 
0.96752, 0.96752, 0.96752, 1.036, 0.96752, 0.97168, 0.97168, 0.97168, 0.97168, 1.036, 0.95134];
+exports.SegoeuiBoldItalicFactors = SegoeuiBoldItalicFactors;
+const SegoeuiBoldItalicLineHeight = 1.33008;
+exports.SegoeuiBoldItalicLineHeight = SegoeuiBoldItalicLineHeight;
+const SegoeuiItalicFactors = [1.76738, 1, 0.94729, 0.85498, 0.85498, 0.94729, 0.94729, 0.94729, 0.94729, 
0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85944, 0.85944, 0.88506, 0.88506, 
0.88506, 0.88506, 0.88506, 0.88506, 0.8858, 0.9858, 0.9858, 0.9858, 0.9607, 0.74817, 0.74817, 0.74817, 
0.74817, 0.74817, 0.74817, 0.74817, 0.74817, 0.74817, 1.03849, 0.74817, 0.74817, 0.71022, 0.98039, 0.90883, 
0.9858, 0.96927, 0.80016, 0.88449, 0.82791, 0.88449, 0.88449, 1, 0.88449, 0.98039, 1, 0.99862, 0.99862, 1, 
0.98039, 0.98039, 0.95782, 0.84421, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 
0.95782, 0.95782, 0.84171, 0.95782, 0.69238, 0.69238, 0.89898, 0.89898, 1, 0.83231, 0.83231, 0.98316, 
0.84723, 1, 0.84723, 0.83231, 0.98183, 0.98183, 1.03989, 1.03989, 1.03989, 1, 1.03989, 1.03989, 0.96924, 
0.92383, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.01284, 1.05734, 0.96924, 0.99877, 
0.96924, 0.96924, 0.96924, 0.86237, 0.90082
 , 0.97642, 0.97296, 0.96924, 0.80595, 0.80595, 0.80595, 1, 0.86237, 0.74524, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.74524, 0.74524, 
0.74524, 0.74524, 1, 0.86075, 0.86091, 0.86091, 0.85771, 0.86091, 1, 0.96924, 0.86237, 0.95402, 0.95402, 
0.95402, 0.95402, 0.95402, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.83089, 0.77596, 0.95402, 0.95402, 
0.94143, 0.98448, 0.98448, 0.98448, 0.98448, 0.98448, 0.8858, 0.78614, 0.83089, 0.83089, 0.83089, 0.83089, 
0.83089, 0.93285, 0.93285, 0.93285, 0.93285, 0.93285, 0.97454, 0.97454, 0.97454, 0.97454, 1.04839, 1, 
0.97454, 0.92916, 0.92916, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 0.97454, 1.0976, 1.0976, 0.97454,
  1.15373, 0.78032, 0.97454, 1.24822, 0.97454, 0.97454, 0.86182, 0.94434, 0.86321, 0.8649, 0.94434, 1, 1, 
1.45994, 1.17308, 1.07403, 0.94565, 0.97454, 0.97454, 1.39016, 0.92481, 0.98205, 1, 0.91082, 0.91082, 1.0949, 
1.0949, 1.04839, 1, 0.92481, 1.15621, 0.87207, 0.87207, 1.04839, 1, 1, 0.87207, 0.87207, 0.87207, 0.87207, 
1.04839, 0.96927, 0.99821, 1.42603, 1.04839, 1, 1.04315, 0.78383, 0.78383, 1, 1, 1.23393, 1, 1, 0.97454, 
0.67603, 0.67603, 0.95391, 0.97454, 0.94261, 1.05097, 1.34163, 1.04839, 1, 0.81965, 1.24822, 1, 1, 0.96927, 
1.04839, 0.93146, 0.87533, 0.87533, 0.87533, 0.87533, 0.87533, 0.87533, 0.87533, 0.87533, 0.96927, 1, 
0.73584, 0.87533, 1, 0.89903, 1.01054, 0.87533, 1.04, 1.04, 1.17308, 1.17308, 1, 1.03342, 1.03342, 0.93854, 
1.14763, 0.95996, 0.95748, 1.06151, 1, 1.42603, 1, 0.96927, 1.09836, 1, 0.96927, 0.96927, 1, 0.87709, 
0.97454, 1.03809, 0.97454, 0.97454, 1, 0.97454, 0.88409, 1.04839, 1, 1.17308, 1.24822, 0.9245, 0.9245, 
0.94868, 0.94868, 1.00176, 1.00176, 1.00176, 1.
 15296, 1, 1.04839, 1, 1.16484, 0.93146, 0.93146, 0.93146, 0.93146, 0.93146, 1.12761, 0.93146, 1.14589, 
1.96791, 1, 1, 0.97622, 1.42603, 1.42603, 1, 1.16484, 1.2, 1.2, 1.2, 1.2, 0.93146, 1.08132, 1.08132, 0.98047, 
1.02148, 1, 0.98047, 1.16484, 1.16484, 1.0119, 1.04861, 1, 0.78755, 1.17308, 1.24822, 1, 0.96927, 1.17308, 
1.31868, 1.17984, 1.23736, 1, 1.02989, 0.63218, 1, 1, 1.17308, 1.22135, 1.04724, 1.17308, 1, 1, 1.01054, 
1.01054, 0.9857, 1.01054, 1, 0.96927, 1, 1.24822, 1.01054, 1.0127, 1.06234, 0.96225, 0.96225, 0.96225, 
0.96225, 0.96225, 0.90171, 1.04839, 0.96225, 0.96225, 0.96225, 1.0326, 1.0326, 0.96225, 0.96225, 0.96927, 
1.09836, 1.13525, 1.09836, 0.99862, 1.1781, 1.22326, 0.69825, 0.8761, 0.8761, 0.96225, 0.97454, 0.85273, 
0.91349, 0.91349, 1.083, 0.92586, 0.78383, 1.21191, 1.01473, 1.11826, 0.8965, 1.17308, 1.24822, 0.91578, 
1.0557, 0.97454, 0.77349, 0.70424, 1.05365, 1.12317, 1.12317, 1.12317, 0.94945, 0.94945, 0.94945, 0.94945, 
1.18414, 1.06598, 1.06598, 1.18416, 1.06598, 1
 , 1.20808, 1, 0.97783, 1.04839, 1, 0.79004, 0.79004, 0.79004, 0.79004, 0.79004, 1, 1.06483, 0.80597, 
0.96927, 1.01522, 1, 1, 0.94818, 0.93574, 0.96927, 1.42531, 1, 1.2886, 0.96927, 0.86438, 1, 1.16344, 1.30679, 
1.16344, 1.02759, 1, 1.05401, 0.97454, 0.96927, 1.09836, 1.15222, 1.04839, 1, 0.81965, 0.77295, 0.87025, 
0.87025, 0.87025, 0.87025, 0.96927, 1.00351, 1.00351, 1.00351, 1.00351, 1.00351, 1.00351, 1.00351, 1.00351, 
0.74627, 0.75155, 0.98946, 1.20088, 1.09971, 1.09971, 1, 1.09971, 0.86091, 1.16344, 1.04839, 0.78383, 
0.74817, 1.03754, 0.87533, 0.98705, 1, 1.20088, 1.24633, 1.07497, 1, 1, 1, 0.78032, 1, 1, 1.10742, 1.10742, 
1.00351, 1, 1.0675, 1.0675, 1.0675, 1.0675, 1.00351, 1.00351, 0.94629, 0.9973, 0.9973, 0.9973, 0.9973, 
0.9973, 0.91016, 1.02732, 0.96777, 0.96777, 0.96777, 0.96777, 0.96927, 0.96777, 0.9043, 0.9043, 0.9043, 
0.9043, 0.96927, 0.95364];
+exports.SegoeuiItalicFactors = SegoeuiItalicFactors;
+const SegoeuiItalicLineHeight = 1.33008;
+exports.SegoeuiItalicLineHeight = SegoeuiItalicLineHeight;
+const SegoeuiRegularFactors = [1.76738, 1, 0.96706, 0.86035, 0.86035, 0.96706, 0.96706, 0.96706, 0.96706, 
0.96706, 0.96706, 0.96635, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.85944, 0.85944, 0.85734, 0.85734, 
0.85734, 0.85734, 0.85734, 0.85734, 0.88433, 0.97093, 0.97093, 0.97093, 0.96491, 0.75842, 0.75842, 0.75842, 
0.75842, 0.75842, 0.75842, 0.75842, 0.75842, 0.75842, 1.03444, 0.75842, 0.75842, 0.72727, 0.9831, 0.92366, 
0.97093, 0.96927, 0.79936, 0.88198, 0.85638, 0.88198, 0.88198, 1, 0.88198, 0.9831, 1, 0.99862, 0.99862, 1, 
0.9831, 0.9831, 0.95782, 0.84784, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 0.95782, 
0.95782, 0.95782, 0.98601, 0.95782, 0.71387, 0.71387, 0.86969, 0.86969, 1, 0.84636, 0.84636, 0.94152, 
0.84636, 1, 0.84636, 0.84636, 1.07796, 1.07796, 1.03584, 1.03584, 1.03584, 1, 1.03584, 1.03584, 0.96924, 
0.93066, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.0098, 1.09799, 0.96924, 1.03405, 
0.96924, 0.96924, 0.96924, 0.83968, 0.944
 92, 0.98715, 0.9287, 0.96924, 0.82826, 0.82826, 0.82826, 1, 0.83968, 0.79649, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.79649, 0.79649, 
0.79649, 0.79649, 1, 0.83491, 0.85771, 0.85771, 0.85771, 0.85771, 1, 0.96924, 0.83968, 0.95132, 0.95132, 
0.95132, 0.95132, 0.95132, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.8287, 0.77968, 0.95132, 0.95132, 
0.93119, 0.98965, 0.98965, 0.98965, 0.98965, 0.98965, 0.88433, 0.78437, 0.8287, 0.8287, 0.8287, 0.8287, 
0.8287, 0.93365, 0.93365, 0.93365, 0.93365, 0.93365, 0.91484, 0.91484, 0.91484, 0.91484, 0.84751, 0.91484, 
0.93575, 0.93575, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0.91484, 1.0625, 1.0625, 0.91484, 1.19985
 , 0.78032, 0.91484, 1.24822, 0.91484, 0.91484, 0.86182, 0.94434, 0.86279, 0.86279, 0.94434, 1, 1, 1.45786, 
1.1714, 1.07152, 0.94084, 0.91484, 1.05707, 1.3638, 0.92105, 0.95246, 1, 0.90351, 0.90351, 1.08612, 1.08612, 
0.91202, 0.92105, 1.16039, 0.92383, 0.92383, 1.11437, 0.92383, 0.92383, 0.92383, 0.92383, 0.61584, 0.96927, 
1.02512, 1.42603, 1.11437, 1.04315, 0.78032, 0.78032, 1.20808, 0.99912, 1.05882, 0.67428, 0.67428, 1.0969, 
1.05882, 0.94261, 1.04912, 1.34163, 1.2434, 0.81818, 1.24644, 1, 1, 0.96927, 0.60411, 0.8717, 0.9403, 0.9403, 
0.9403, 0.9403, 0.9403, 0.9403, 0.9403, 0.9403, 0.96927, 0.73291, 0.9403, 1, 0.89903, 1.01756, 0.9403, 
0.98248, 0.98248, 1.1714, 1.17238, 1, 1.03424, 1.03424, 1.00527, 1.02285, 0.95996, 0.85337, 1.12654, 1, 
1.42603, 1, 0.96927, 1.11358, 0.96927, 0.96927, 0.87796, 1.05882, 1.03809, 1.05882, 1.05882, 1, 1.05882, 
0.89049, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.80499, 1.1714, 1.24822, 0.90957, 0.90957, 0.94868, 0.94868, 
1.01756, 1.01756, 1.01756, 1.15296, 1, 0
 .97361, 1.09011, 0.8717, 0.8717, 0.8717, 0.8717, 0.8717, 1.11551, 0.8717, 1.14589, 1.9697, 1, 1, 0.97622, 
1.42603, 1.42603, 1, 1.09011, 1.2, 1.2, 1.2, 1.2, 0.8717, 1.09011, 1.09011, 0.99414, 1.04785, 1, 0.99414, 
1.09011, 1.09011, 0.99609, 1.0536, 1, 0.94298, 1.1714, 1.24822, 1, 0.96927, 1.1714, 1.08571, 1.18083, 
1.23297, 1, 1.034, 0.75155, 1, 1, 1.1714, 1.22135, 1.00169, 1.1714, 1, 1, 1.01756, 1.01756, 1.00323, 1.01756, 
1, 0.96927, 1, 1.24822, 1.01756, 1.05176, 1.06234, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 0.98293, 
0.55572, 1.05356, 1.05356, 1.05356, 1.03502, 1.03502, 1.05356, 1.05356, 0.96927, 1.10539, 1.11593, 1.08665, 
0.99862, 1.05937, 1.17914, 0.69825, 0.95923, 0.95923, 1.05356, 1.05707, 0.85273, 0.90616, 0.90616, 1.083, 
0.92037, 0.78032, 1.20996, 1.01518, 1.07831, 0.9087, 1.1714, 1.24644, 0.91578, 1.05205, 1.05882, 0.80597, 
0.73381, 1.10454, 1.13196, 1.13196, 1.13196, 1.03077, 1.03077, 1.03077, 1.03077, 1.2046, 1.04399, 1.04399, 
1.18416, 1.04399, 1, 1.20808, 1, 1.03004,
  0.84164, 1, 0.84863, 0.84863, 0.84863, 0.84863, 0.84863, 1, 1.06483, 0.80597, 0.96927, 1.06967, 1, 0.93117, 
0.95542, 0.96927, 1.40246, 1, 1.2886, 0.96927, 0.86507, 1, 1.21968, 1.23362, 1.21968, 1.17318, 1, 1.05443, 
1.05707, 0.96927, 1.10539, 1.14169, 1.01173, 0.81818, 0.77295, 0.87025, 0.87025, 0.87025, 0.87025, 0.96927, 
1.01756, 1.01756, 1.01756, 1.01756, 1.01756, 1.01756, 1.01756, 1.01756, 0.74627, 0.75155, 0.98594, 1.20088, 
1.09971, 1.09971, 1, 1.05425, 0.85771, 1.21968, 0.93109, 0.78032, 0.75842, 1.03719, 0.9403, 1.04021, 1, 
1.20088, 1.24633, 1.05425, 1.09971, 1.09971, 1.09971, 1.07497, 1, 1, 1, 0.78032, 1, 1, 1, 1.10938, 1.10938, 
1.01756, 1, 1.01071, 1.01071, 1.01071, 1.01071, 1.01756, 1.01756, 0.95801, 1.00068, 1.00068, 1.00068, 
1.00068, 1.00068, 0.91797, 0.99346, 0.96777, 0.96777, 0.96777, 0.96777, 0.96927, 0.96777, 0.9043, 0.9043, 
0.9043, 0.9043, 0.96927, 1.00221];
+exports.SegoeuiRegularFactors = SegoeuiRegularFactors;
+const SegoeuiRegularLineHeight = 1.33008;
+exports.SegoeuiRegularLineHeight = SegoeuiRegularLineHeight;
+
+/***/ }),
+/* 61 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.MurmurHash3_64 = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+const SEED = 0xc3d2e1f0;
+const MASK_HIGH = 0xffff0000;
+const MASK_LOW = 0xffff;
+
+class MurmurHash3_64 {
+  constructor(seed) {
+    this.h1 = seed ? seed & 0xffffffff : SEED;
+    this.h2 = seed ? seed & 0xffffffff : SEED;
+  }
+
+  update(input) {
+    let data, length;
+
+    if ((0, _util.isString)(input)) {
+      data = new Uint8Array(input.length * 2);
+      length = 0;
+
+      for (let i = 0, ii = input.length; i < ii; i++) {
+        const code = input.charCodeAt(i);
+
+        if (code <= 0xff) {
+          data[length++] = code;
+        } else {
+          data[length++] = code >>> 8;
+          data[length++] = code & 0xff;
+        }
+      }
+    } else if ((0, _util.isArrayBuffer)(input)) {
+      data = input.slice();
+      length = data.byteLength;
+    } else {
+      throw new Error("Wrong data format in MurmurHash3_64_update. " + "Input must be a string or array.");
+    }
+
+    const blockCounts = length >> 2;
+    const tailLength = length - blockCounts * 4;
+    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
+    let k1 = 0,
+        k2 = 0;
+    let h1 = this.h1,
+        h2 = this.h2;
+    const C1 = 0xcc9e2d51,
+          C2 = 0x1b873593;
+    const C1_LOW = C1 & MASK_LOW,
+          C2_LOW = C2 & MASK_LOW;
+
+    for (let i = 0; i < blockCounts; i++) {
+      if (i & 1) {
+        k1 = dataUint32[i];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+        h1 ^= k1;
+        h1 = h1 << 13 | h1 >>> 19;
+        h1 = h1 * 5 + 0xe6546b64;
+      } else {
+        k2 = dataUint32[i];
+        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
+        k2 = k2 << 15 | k2 >>> 17;
+        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
+        h2 ^= k2;
+        h2 = h2 << 13 | h2 >>> 19;
+        h2 = h2 * 5 + 0xe6546b64;
+      }
+    }
+
+    k1 = 0;
+
+    switch (tailLength) {
+      case 3:
+        k1 ^= data[blockCounts * 4 + 2] << 16;
+
+      case 2:
+        k1 ^= data[blockCounts * 4 + 1] << 8;
+
+      case 1:
+        k1 ^= data[blockCounts * 4];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+
+        if (blockCounts & 1) {
+          h1 ^= k1;
+        } else {
+          h2 ^= k1;
+        }
+
+    }
+
+    this.h1 = h1;
+    this.h2 = h2;
+  }
+
+  hexdigest() {
+    let h1 = this.h1,
+        h2 = this.h2;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
+    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
+    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    const hex1 = (h1 >>> 0).toString(16),
+          hex2 = (h2 >>> 0).toString(16);
+    return hex1.padStart(8, "0") + hex2.padStart(8, "0");
+  }
+
+}
+
+exports.MurmurHash3_64 = MurmurHash3_64;
+
+/***/ }),
+/* 62 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.OperatorList = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+function addState(parentState, pattern, checkFn, iterateFn, processFn) {
+  let state = parentState;
+
+  for (let i = 0, ii = pattern.length - 1; i < ii; i++) {
+    const item = pattern[i];
+    state = state[item] || (state[item] = []);
+  }
+
+  state[pattern[pattern.length - 1]] = {
+    checkFn,
+    iterateFn,
+    processFn
+  };
+}
+
+function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {
+  const iFirstPIMXO = iFirstSave + 2;
+  let i;
+
+  for (i = 0; i < count; i++) {
+    const arg = argsArray[iFirstPIMXO + 4 * i];
+    const imageMask = arg.length === 1 && arg[0];
+
+    if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || 
imageMask.data.length === 1 && imageMask.data[0] === 0)) {
+      fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;
+      continue;
+    }
+
+    break;
+  }
+
+  return count - i;
+}
+
+const InitialState = [];
+addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, 
_util.OPS.restore], null, function iterateInlineImageGroup(context, i) {
+  const fnArray = context.fnArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+
+  switch (pos) {
+    case 0:
+      return fnArray[i] === _util.OPS.save;
+
+    case 1:
+      return fnArray[i] === _util.OPS.transform;
+
+    case 2:
+      return fnArray[i] === _util.OPS.paintInlineImageXObject;
+
+    case 3:
+      return fnArray[i] === _util.OPS.restore;
+  }
+
+  throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);
+}, function foundInlineImageGroup(context, i) {
+  const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
+  const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
+  const MAX_WIDTH = 1000;
+  const IMAGE_PADDING = 1;
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIIXO = curr - 1;
+  const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
+
+  if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+
+  let maxX = 0;
+  const map = [];
+  let maxLineHeight = 0;
+  let currentX = IMAGE_PADDING,
+      currentY = IMAGE_PADDING;
+
+  for (let q = 0; q < count; q++) {
+    const transform = argsArray[iFirstTransform + (q << 2)];
+    const img = argsArray[iFirstPIIXO + (q << 2)][0];
+
+    if (currentX + img.width > MAX_WIDTH) {
+      maxX = Math.max(maxX, currentX);
+      currentY += maxLineHeight + 2 * IMAGE_PADDING;
+      currentX = 0;
+      maxLineHeight = 0;
+    }
+
+    map.push({
+      transform,
+      x: currentX,
+      y: currentY,
+      w: img.width,
+      h: img.height
+    });
+    currentX += img.width + 2 * IMAGE_PADDING;
+    maxLineHeight = Math.max(maxLineHeight, img.height);
+  }
+
+  const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
+  const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
+  const imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);
+  const imgRowSize = imgWidth << 2;
+
+  for (let q = 0; q < count; q++) {
+    const data = argsArray[iFirstPIIXO + (q << 2)][0].data;
+    const rowSize = map[q].w << 2;
+    let dataOffset = 0;
+    let offset = map[q].x + map[q].y * imgWidth << 2;
+    imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
+
+    for (let k = 0, kk = map[q].h; k < kk; k++) {
+      imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
+      dataOffset += rowSize;
+      offset += imgRowSize;
+    }
+
+    imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
+
+    while (offset >= 0) {
+      data[offset - 4] = data[offset];
+      data[offset - 3] = data[offset + 1];
+      data[offset - 2] = data[offset + 2];
+      data[offset - 1] = data[offset + 3];
+      data[offset + rowSize] = data[offset + rowSize - 4];
+      data[offset + rowSize + 1] = data[offset + rowSize - 3];
+      data[offset + rowSize + 2] = data[offset + rowSize - 2];
+      data[offset + rowSize + 3] = data[offset + rowSize - 1];
+      offset -= imgRowSize;
+    }
+  }
+
+  fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);
+  argsArray.splice(iFirstSave, count * 4, [{
+    width: imgWidth,
+    height: imgHeight,
+    kind: _util.ImageKind.RGBA_32BPP,
+    data: imgData
+  }, map]);
+  return iFirstSave + 1;
+});
+addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, 
_util.OPS.restore], null, function iterateImageMaskGroup(context, i) {
+  const fnArray = context.fnArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+
+  switch (pos) {
+    case 0:
+      return fnArray[i] === _util.OPS.save;
+
+    case 1:
+      return fnArray[i] === _util.OPS.transform;
+
+    case 2:
+      return fnArray[i] === _util.OPS.paintImageMaskXObject;
+
+    case 3:
+      return fnArray[i] === _util.OPS.restore;
+  }
+
+  throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);
+}, function foundImageMaskGroup(context, i) {
+  const MIN_IMAGES_IN_MASKS_BLOCK = 10;
+  const MAX_IMAGES_IN_MASKS_BLOCK = 100;
+  const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIMXO = curr - 1;
+  let count = Math.floor((i - iFirstSave) / 4);
+  count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);
+
+  if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+
+  let isSameImage = false;
+  let iTransform, transformArgs;
+  const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
+  const firstTransformArg0 = argsArray[iFirstTransform][0],
+        firstTransformArg1 = argsArray[iFirstTransform][1],
+        firstTransformArg2 = argsArray[iFirstTransform][2],
+        firstTransformArg3 = argsArray[iFirstTransform][3];
+
+  if (firstTransformArg1 === firstTransformArg2) {
+    isSameImage = true;
+    iTransform = iFirstTransform + 4;
+    let iPIMXO = iFirstPIMXO + 4;
+
+    for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
+      transformArgs = argsArray[iTransform];
+
+      if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || 
transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== 
firstTransformArg3) {
+        if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
+          isSameImage = false;
+        } else {
+          count = q;
+        }
+
+        break;
+      }
+    }
+  }
+
+  if (isSameImage) {
+    count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
+    const positions = new Float32Array(count * 2);
+    iTransform = iFirstTransform;
+
+    for (let q = 0; q < count; q++, iTransform += 4) {
+      transformArgs = argsArray[iTransform];
+      positions[q << 1] = transformArgs[4];
+      positions[(q << 1) + 1] = transformArgs[5];
+    }
+
+    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);
+    argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, 
firstTransformArg2, firstTransformArg3, positions]);
+  } else {
+    count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
+    const images = [];
+
+    for (let q = 0; q < count; q++) {
+      transformArgs = argsArray[iFirstTransform + (q << 2)];
+      const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
+      images.push({
+        data: maskParams.data,
+        width: maskParams.width,
+        height: maskParams.height,
+        transform: transformArgs
+      });
+    }
+
+    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);
+    argsArray.splice(iFirstSave, count * 4, [images]);
+  }
+
+  return iFirstSave + 1;
+});
+addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, 
_util.OPS.restore], function (context) {
+  const argsArray = context.argsArray;
+  const iFirstTransform = context.iCurr - 2;
+  return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
+}, function iterateImageGroup(context, i) {
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+
+  switch (pos) {
+    case 0:
+      return fnArray[i] === _util.OPS.save;
+
+    case 1:
+      if (fnArray[i] !== _util.OPS.transform) {
+        return false;
+      }
+
+      const iFirstTransform = context.iCurr - 2;
+      const firstTransformArg0 = argsArray[iFirstTransform][0];
+      const firstTransformArg3 = argsArray[iFirstTransform][3];
+
+      if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || 
argsArray[i][3] !== firstTransformArg3) {
+        return false;
+      }
+
+      return true;
+
+    case 2:
+      if (fnArray[i] !== _util.OPS.paintImageXObject) {
+        return false;
+      }
+
+      const iFirstPIXO = context.iCurr - 1;
+      const firstPIXOArg0 = argsArray[iFirstPIXO][0];
+
+      if (argsArray[i][0] !== firstPIXOArg0) {
+        return false;
+      }
+
+      return true;
+
+    case 3:
+      return fnArray[i] === _util.OPS.restore;
+  }
+
+  throw new Error(`iterateImageGroup - invalid pos: ${pos}`);
+}, function (context, i) {
+  const MIN_IMAGES_IN_BLOCK = 3;
+  const MAX_IMAGES_IN_BLOCK = 1000;
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIXO = curr - 1;
+  const firstPIXOArg0 = argsArray[iFirstPIXO][0];
+  const firstTransformArg0 = argsArray[iFirstTransform][0];
+  const firstTransformArg3 = argsArray[iFirstTransform][3];
+  const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);
+
+  if (count < MIN_IMAGES_IN_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+
+  const positions = new Float32Array(count * 2);
+  let iTransform = iFirstTransform;
+
+  for (let q = 0; q < count; q++, iTransform += 4) {
+    const transformArgs = argsArray[iTransform];
+    positions[q << 1] = transformArgs[4];
+    positions[(q << 1) + 1] = transformArgs[5];
+  }
+
+  const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
+  fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);
+  argsArray.splice(iFirstSave, count * 4, args);
+  return iFirstSave + 1;
+});
+addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, 
_util.OPS.endText], null, function iterateShowTextGroup(context, i) {
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const iFirstSave = context.iCurr - 4;
+  const pos = (i - iFirstSave) % 5;
+
+  switch (pos) {
+    case 0:
+      return fnArray[i] === _util.OPS.beginText;
+
+    case 1:
+      return fnArray[i] === _util.OPS.setFont;
+
+    case 2:
+      return fnArray[i] === _util.OPS.setTextMatrix;
+
+    case 3:
+      if (fnArray[i] !== _util.OPS.showText) {
+        return false;
+      }
+
+      const iFirstSetFont = context.iCurr - 3;
+      const firstSetFontArg0 = argsArray[iFirstSetFont][0];
+      const firstSetFontArg1 = argsArray[iFirstSetFont][1];
+
+      if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
+        return false;
+      }
+
+      return true;
+
+    case 4:
+      return fnArray[i] === _util.OPS.endText;
+  }
+
+  throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);
+}, function (context, i) {
+  const MIN_CHARS_IN_BLOCK = 3;
+  const MAX_CHARS_IN_BLOCK = 1000;
+  const fnArray = context.fnArray,
+        argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstBeginText = curr - 4;
+  const iFirstSetFont = curr - 3;
+  const iFirstSetTextMatrix = curr - 2;
+  const iFirstShowText = curr - 1;
+  const iFirstEndText = curr;
+  const firstSetFontArg0 = argsArray[iFirstSetFont][0];
+  const firstSetFontArg1 = argsArray[iFirstSetFont][1];
+  let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
+
+  if (count < MIN_CHARS_IN_BLOCK) {
+    return i - (i - iFirstBeginText) % 5;
+  }
+
+  let iFirst = iFirstBeginText;
+
+  if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && 
fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === 
fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && 
argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === 
firstSetFontArg1) {
+    count++;
+    iFirst -= 5;
+  }
+
+  let iEndText = iFirst + 4;
+
+  for (let q = 1; q < count; q++) {
+    fnArray.splice(iEndText, 3);
+    argsArray.splice(iEndText, 3);
+    iEndText += 2;
+  }
+
+  return iEndText + 1;
+});
+
+class NullOptimizer {
+  constructor(queue) {
+    this.queue = queue;
+  }
+
+  _optimize() {}
+
+  push(fn, args) {
+    this.queue.fnArray.push(fn);
+    this.queue.argsArray.push(args);
+
+    this._optimize();
+  }
+
+  flush() {}
+
+  reset() {}
+
+}
+
+class QueueOptimizer extends NullOptimizer {
+  constructor(queue) {
+    super(queue);
+    this.state = null;
+    this.context = {
+      iCurr: 0,
+      fnArray: queue.fnArray,
+      argsArray: queue.argsArray
+    };
+    this.match = null;
+    this.lastProcessed = 0;
+  }
+
+  _optimize() {
+    const fnArray = this.queue.fnArray;
+    let i = this.lastProcessed,
+        ii = fnArray.length;
+    let state = this.state;
+    let match = this.match;
+
+    if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
+      this.lastProcessed = ii;
+      return;
+    }
+
+    const context = this.context;
+
+    while (i < ii) {
+      if (match) {
+        const iterate = (0, match.iterateFn)(context, i);
+
+        if (iterate) {
+          i++;
+          continue;
+        }
+
+        i = (0, match.processFn)(context, i + 1);
+        ii = fnArray.length;
+        match = null;
+        state = null;
+
+        if (i >= ii) {
+          break;
+        }
+      }
+
+      state = (state || InitialState)[fnArray[i]];
+
+      if (!state || Array.isArray(state)) {
+        i++;
+        continue;
+      }
+
+      context.iCurr = i;
+      i++;
+
+      if (state.checkFn && !(0, state.checkFn)(context)) {
+        state = null;
+        continue;
+      }
+
+      match = state;
+      state = null;
+    }
+
+    this.state = state;
+    this.match = match;
+    this.lastProcessed = i;
+  }
+
+  flush() {
+    while (this.match) {
+      const length = this.queue.fnArray.length;
+      this.lastProcessed = (0, this.match.processFn)(this.context, length);
+      this.match = null;
+      this.state = null;
+
+      this._optimize();
+    }
+  }
+
+  reset() {
+    this.state = null;
+    this.match = null;
+    this.lastProcessed = 0;
+  }
+
+}
+
+class OperatorList {
+  static get CHUNK_SIZE() {
+    return (0, _util.shadow)(this, "CHUNK_SIZE", 1000);
+  }
+
+  static get CHUNK_SIZE_ABOUT() {
+    return (0, _util.shadow)(this, "CHUNK_SIZE_ABOUT", this.CHUNK_SIZE - 5);
+  }
+
+  constructor(intent, streamSink) {
+    this._streamSink = streamSink;
+    this.fnArray = [];
+    this.argsArray = [];
+
+    if (streamSink && !(intent && intent.startsWith("oplist-"))) {
+      this.optimizer = new QueueOptimizer(this);
+    } else {
+      this.optimizer = new NullOptimizer(this);
+    }
+
+    this.dependencies = new Set();
+    this._totalLength = 0;
+    this.weight = 0;
+    this._resolved = streamSink ? null : Promise.resolve();
+  }
+
+  get length() {
+    return this.argsArray.length;
+  }
+
+  get ready() {
+    return this._resolved || this._streamSink.ready;
+  }
+
+  get totalLength() {
+    return this._totalLength + this.length;
+  }
+
+  addOp(fn, args) {
+    this.optimizer.push(fn, args);
+    this.weight++;
+
+    if (this._streamSink) {
+      if (this.weight >= OperatorList.CHUNK_SIZE) {
+        this.flush();
+      } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === 
_util.OPS.endText)) {
+        this.flush();
+      }
+    }
+  }
+
+  addDependency(dependency) {
+    if (this.dependencies.has(dependency)) {
+      return;
+    }
+
+    this.dependencies.add(dependency);
+    this.addOp(_util.OPS.dependency, [dependency]);
+  }
+
+  addDependencies(dependencies) {
+    for (const dependency of dependencies) {
+      this.addDependency(dependency);
+    }
+  }
+
+  addOpList(opList) {
+    if (!(opList instanceof OperatorList)) {
+      (0, _util.warn)('addOpList - ignoring invalid "opList" parameter.');
+      return;
+    }
+
+    for (const dependency of opList.dependencies) {
+      this.dependencies.add(dependency);
+    }
+
+    for (let i = 0, ii = opList.length; i < ii; i++) {
+      this.addOp(opList.fnArray[i], opList.argsArray[i]);
+    }
+  }
+
+  getIR() {
+    return {
+      fnArray: this.fnArray,
+      argsArray: this.argsArray,
+      length: this.length
+    };
+  }
+
+  get _transfers() {
+    const transfers = [];
+    const {
+      fnArray,
+      argsArray,
+      length
+    } = this;
+
+    for (let i = 0; i < length; i++) {
+      switch (fnArray[i]) {
+        case _util.OPS.paintInlineImageXObject:
+        case _util.OPS.paintInlineImageXObjectGroup:
+        case _util.OPS.paintImageMaskXObject:
+          const arg = argsArray[i][0];
+          ;
+
+          if (!arg.cached) {
+            transfers.push(arg.data.buffer);
+          }
+
+          break;
+      }
+    }
+
+    return transfers;
+  }
+
+  flush(lastChunk = false) {
+    this.optimizer.flush();
+    const length = this.length;
+    this._totalLength += length;
+
+    this._streamSink.enqueue({
+      fnArray: this.fnArray,
+      argsArray: this.argsArray,
+      lastChunk,
+      length
+    }, 1, this._transfers);
+
+    this.dependencies.clear();
+    this.fnArray.length = 0;
+    this.argsArray.length = 0;
+    this.weight = 0;
+    this.optimizer.reset();
+  }
+
+}
+
+exports.OperatorList = OperatorList;
+
+/***/ }),
+/* 63 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PDFImage = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _colorspace = __w_pdfjs_require__(14);
+
+var _decode_stream = __w_pdfjs_require__(19);
+
+var _jpeg_stream = __w_pdfjs_require__(27);
+
+var _jpx = __w_pdfjs_require__(30);
+
+function decodeAndClamp(value, addend, coefficient, max) {
+  value = addend + value * coefficient;
+
+  if (value < 0) {
+    value = 0;
+  } else if (value > max) {
+    value = max;
+  }
+
+  return value;
+}
+
+function resizeImageMask(src, bpc, w1, h1, w2, h2) {
+  const length = w2 * h2;
+  let dest;
+
+  if (bpc <= 8) {
+    dest = new Uint8Array(length);
+  } else if (bpc <= 16) {
+    dest = new Uint16Array(length);
+  } else {
+    dest = new Uint32Array(length);
+  }
+
+  const xRatio = w1 / w2;
+  const yRatio = h1 / h2;
+  let i,
+      j,
+      py,
+      newIndex = 0,
+      oldIndex;
+  const xScaled = new Uint16Array(w2);
+  const w1Scanline = w1;
+
+  for (i = 0; i < w2; i++) {
+    xScaled[i] = Math.floor(i * xRatio);
+  }
+
+  for (i = 0; i < h2; i++) {
+    py = Math.floor(i * yRatio) * w1Scanline;
+
+    for (j = 0; j < w2; j++) {
+      oldIndex = py + xScaled[j];
+      dest[newIndex++] = src[oldIndex];
+    }
+  }
+
+  return dest;
+}
+
+class PDFImage {
+  constructor({
+    xref,
+    res,
+    image,
+    isInline = false,
+    smask = null,
+    mask = null,
+    isMask = false,
+    pdfFunctionFactory,
+    localColorSpaceCache
+  }) {
+    this.image = image;
+    const dict = image.dict;
+    const filter = dict.get("Filter");
+
+    if ((0, _primitives.isName)(filter)) {
+      switch (filter.name) {
+        case "JPXDecode":
+          const jpxImage = new _jpx.JpxImage();
+          jpxImage.parseImageProperties(image.stream);
+          image.stream.reset();
+          image.width = jpxImage.width;
+          image.height = jpxImage.height;
+          image.bitsPerComponent = jpxImage.bitsPerComponent;
+          image.numComps = jpxImage.componentsCount;
+          break;
+
+        case "JBIG2Decode":
+          image.bitsPerComponent = 1;
+          image.numComps = 1;
+          break;
+      }
+    }
+
+    let width = dict.get("Width", "W");
+    let height = dict.get("Height", "H");
+
+    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 
0 && (image.width !== width || image.height !== height)) {
+      (0, _util.warn)("PDFImage - using the Width/Height of the image data, " + "rather than the image 
dictionary.");
+      width = image.width;
+      height = image.height;
+    }
+
+    if (width < 1 || height < 1) {
+      throw new _util.FormatError(`Invalid image width: ${width} or height: ${height}`);
+    }
+
+    this.width = width;
+    this.height = height;
+    this.interpolate = dict.get("Interpolate", "I") || false;
+    this.imageMask = dict.get("ImageMask", "IM") || false;
+    this.matte = dict.get("Matte") || false;
+    let bitsPerComponent = image.bitsPerComponent;
+
+    if (!bitsPerComponent) {
+      bitsPerComponent = dict.get("BitsPerComponent", "BPC");
+
+      if (!bitsPerComponent) {
+        if (this.imageMask) {
+          bitsPerComponent = 1;
+        } else {
+          throw new _util.FormatError(`Bits per component missing in image: ${this.imageMask}`);
+        }
+      }
+    }
+
+    this.bpc = bitsPerComponent;
+
+    if (!this.imageMask) {
+      let colorSpace = dict.getRaw("ColorSpace") || dict.getRaw("CS");
+
+      if (!colorSpace) {
+        (0, _util.info)("JPX images (which do not require color spaces)");
+
+        switch (image.numComps) {
+          case 1:
+            colorSpace = _primitives.Name.get("DeviceGray");
+            break;
+
+          case 3:
+            colorSpace = _primitives.Name.get("DeviceRGB");
+            break;
+
+          case 4:
+            colorSpace = _primitives.Name.get("DeviceCMYK");
+            break;
+
+          default:
+            throw new Error(`JPX images with ${image.numComps} ` + "color components not supported.");
+        }
+      }
+
+      this.colorSpace = _colorspace.ColorSpace.parse({
+        cs: colorSpace,
+        xref,
+        resources: isInline ? res : null,
+        pdfFunctionFactory,
+        localColorSpaceCache
+      });
+      this.numComps = this.colorSpace.numComps;
+    }
+
+    this.decode = dict.getArray("Decode", "D");
+    this.needsDecode = false;
+
+    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) 
|| isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
+      this.needsDecode = true;
+      const max = (1 << bitsPerComponent) - 1;
+      this.decodeCoefficients = [];
+      this.decodeAddends = [];
+      const isIndexed = this.colorSpace && this.colorSpace.name === "Indexed";
+
+      for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+        const dmin = this.decode[i];
+        const dmax = this.decode[i + 1];
+        this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
+        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
+      }
+    }
+
+    if (smask) {
+      this.smask = new PDFImage({
+        xref,
+        res,
+        image: smask,
+        isInline,
+        pdfFunctionFactory,
+        localColorSpaceCache
+      });
+    } else if (mask) {
+      if ((0, _primitives.isStream)(mask)) {
+        const maskDict = mask.dict,
+              imageMask = maskDict.get("ImageMask", "IM");
+
+        if (!imageMask) {
+          (0, _util.warn)("Ignoring /Mask in image without /ImageMask.");
+        } else {
+          this.mask = new PDFImage({
+            xref,
+            res,
+            image: mask,
+            isInline,
+            isMask: true,
+            pdfFunctionFactory,
+            localColorSpaceCache
+          });
+        }
+      } else {
+        this.mask = mask;
+      }
+    }
+  }
+
+  static async buildImage({
+    xref,
+    res,
+    image,
+    isInline = false,
+    pdfFunctionFactory,
+    localColorSpaceCache
+  }) {
+    const imageData = image;
+    let smaskData = null;
+    let maskData = null;
+    const smask = image.dict.get("SMask");
+    const mask = image.dict.get("Mask");
+
+    if (smask) {
+      smaskData = smask;
+    } else if (mask) {
+      if ((0, _primitives.isStream)(mask) || Array.isArray(mask)) {
+        maskData = mask;
+      } else {
+        (0, _util.warn)("Unsupported mask format.");
+      }
+    }
+
+    return new PDFImage({
+      xref,
+      res,
+      image: imageData,
+      isInline,
+      smask: smaskData,
+      mask: maskData,
+      pdfFunctionFactory,
+      localColorSpaceCache
+    });
+  }
+
+  static createMask({
+    imgArray,
+    width,
+    height,
+    imageIsFromDecodeStream,
+    inverseDecode
+  }) {
+    const computedLength = (width + 7 >> 3) * height;
+    const actualLength = imgArray.byteLength;
+    const haveFullData = computedLength === actualLength;
+    let data, i;
+
+    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
+      data = imgArray;
+    } else if (!inverseDecode) {
+      data = new Uint8ClampedArray(actualLength);
+      data.set(imgArray);
+    } else {
+      data = new Uint8ClampedArray(computedLength);
+      data.set(imgArray);
+
+      for (i = actualLength; i < computedLength; i++) {
+        data[i] = 0xff;
+      }
+    }
+
+    if (inverseDecode) {
+      for (i = 0; i < actualLength; i++) {
+        data[i] ^= 0xff;
+      }
+    }
+
+    return {
+      data,
+      width,
+      height
+    };
+  }
+
+  get drawWidth() {
+    return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
+  }
+
+  get drawHeight() {
+    return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
+  }
+
+  decodeBuffer(buffer) {
+    const bpc = this.bpc;
+    const numComps = this.numComps;
+    const decodeAddends = this.decodeAddends;
+    const decodeCoefficients = this.decodeCoefficients;
+    const max = (1 << bpc) - 1;
+    let i, ii;
+
+    if (bpc === 1) {
+      for (i = 0, ii = buffer.length; i < ii; i++) {
+        buffer[i] = +!buffer[i];
+      }
+
+      return;
+    }
+
+    let index = 0;
+
+    for (i = 0, ii = this.width * this.height; i < ii; i++) {
+      for (let j = 0; j < numComps; j++) {
+        buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
+        index++;
+      }
+    }
+  }
+
+  getComponents(buffer) {
+    const bpc = this.bpc;
+
+    if (bpc === 8) {
+      return buffer;
+    }
+
+    const width = this.width;
+    const height = this.height;
+    const numComps = this.numComps;
+    const length = width * height * numComps;
+    let bufferPos = 0;
+    let output;
+
+    if (bpc <= 8) {
+      output = new Uint8Array(length);
+    } else if (bpc <= 16) {
+      output = new Uint16Array(length);
+    } else {
+      output = new Uint32Array(length);
+    }
+
+    const rowComps = width * numComps;
+    const max = (1 << bpc) - 1;
+    let i = 0,
+        ii,
+        buf;
+
+    if (bpc === 1) {
+      let mask, loop1End, loop2End;
+
+      for (let j = 0; j < height; j++) {
+        loop1End = i + (rowComps & ~7);
+        loop2End = i + rowComps;
+
+        while (i < loop1End) {
+          buf = buffer[bufferPos++];
+          output[i] = buf >> 7 & 1;
+          output[i + 1] = buf >> 6 & 1;
+          output[i + 2] = buf >> 5 & 1;
+          output[i + 3] = buf >> 4 & 1;
+          output[i + 4] = buf >> 3 & 1;
+          output[i + 5] = buf >> 2 & 1;
+          output[i + 6] = buf >> 1 & 1;
+          output[i + 7] = buf & 1;
+          i += 8;
+        }
+
+        if (i < loop2End) {
+          buf = buffer[bufferPos++];
+          mask = 128;
+
+          while (i < loop2End) {
+            output[i++] = +!!(buf & mask);
+            mask >>= 1;
+          }
+        }
+      }
+    } else {
+      let bits = 0;
+      buf = 0;
+
+      for (i = 0, ii = length; i < ii; ++i) {
+        if (i % rowComps === 0) {
+          buf = 0;
+          bits = 0;
+        }
+
+        while (bits < bpc) {
+          buf = buf << 8 | buffer[bufferPos++];
+          bits += 8;
+        }
+
+        const remainingBits = bits - bpc;
+        let value = buf >> remainingBits;
+
+        if (value < 0) {
+          value = 0;
+        } else if (value > max) {
+          value = max;
+        }
+
+        output[i] = value;
+        buf &= (1 << remainingBits) - 1;
+        bits = remainingBits;
+      }
+    }
+
+    return output;
+  }
+
+  fillOpacity(rgbaBuf, width, height, actualHeight, image) {
+    const smask = this.smask;
+    const mask = this.mask;
+    let alphaBuf, sw, sh, i, ii, j;
+
+    if (smask) {
+      sw = smask.width;
+      sh = smask.height;
+      alphaBuf = new Uint8ClampedArray(sw * sh);
+      smask.fillGrayBuffer(alphaBuf);
+
+      if (sw !== width || sh !== height) {
+        alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
+      }
+    } else if (mask) {
+      if (mask instanceof PDFImage) {
+        sw = mask.width;
+        sh = mask.height;
+        alphaBuf = new Uint8ClampedArray(sw * sh);
+        mask.numComps = 1;
+        mask.fillGrayBuffer(alphaBuf);
+
+        for (i = 0, ii = sw * sh; i < ii; ++i) {
+          alphaBuf[i] = 255 - alphaBuf[i];
+        }
+
+        if (sw !== width || sh !== height) {
+          alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
+        }
+      } else if (Array.isArray(mask)) {
+        alphaBuf = new Uint8ClampedArray(width * height);
+        const numComps = this.numComps;
+
+        for (i = 0, ii = width * height; i < ii; ++i) {
+          let opacity = 0;
+          const imageOffset = i * numComps;
+
+          for (j = 0; j < numComps; ++j) {
+            const color = image[imageOffset + j];
+            const maskOffset = j * 2;
+
+            if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
+              opacity = 255;
+              break;
+            }
+          }
+
+          alphaBuf[i] = opacity;
+        }
+      } else {
+        throw new _util.FormatError("Unknown mask format.");
+      }
+    }
+
+    if (alphaBuf) {
+      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+        rgbaBuf[j] = alphaBuf[i];
+      }
+    } else {
+      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+        rgbaBuf[j] = 255;
+      }
+    }
+  }
+
+  undoPreblend(buffer, width, height) {
+    const matte = this.smask && this.smask.matte;
+
+    if (!matte) {
+      return;
+    }
+
+    const matteRgb = this.colorSpace.getRgb(matte, 0);
+    const matteR = matteRgb[0];
+    const matteG = matteRgb[1];
+    const matteB = matteRgb[2];
+    const length = width * height * 4;
+
+    for (let i = 0; i < length; i += 4) {
+      const alpha = buffer[i + 3];
+
+      if (alpha === 0) {
+        buffer[i] = 255;
+        buffer[i + 1] = 255;
+        buffer[i + 2] = 255;
+        continue;
+      }
+
+      const k = 255 / alpha;
+      buffer[i] = (buffer[i] - matteR) * k + matteR;
+      buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
+      buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
+    }
+  }
+
+  createImageData(forceRGBA = false) {
+    const drawWidth = this.drawWidth;
+    const drawHeight = this.drawHeight;
+    const imgData = {
+      width: drawWidth,
+      height: drawHeight,
+      kind: 0,
+      data: null
+    };
+    const numComps = this.numComps;
+    const originalWidth = this.width;
+    const originalHeight = this.height;
+    const bpc = this.bpc;
+    const rowBytes = originalWidth * numComps * bpc + 7 >> 3;
+    let imgArray;
+
+    if (!forceRGBA) {
+      let kind;
+
+      if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
+        kind = _util.ImageKind.GRAYSCALE_1BPP;
+      } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
+        kind = _util.ImageKind.RGB_24BPP;
+      }
+
+      if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) 
{
+        imgData.kind = kind;
+        imgArray = this.getImageBytes(originalHeight * rowBytes);
+
+        if (this.image instanceof _decode_stream.DecodeStream) {
+          imgData.data = imgArray;
+        } else {
+          const newArray = new Uint8ClampedArray(imgArray.length);
+          newArray.set(imgArray);
+          imgData.data = newArray;
+        }
+
+        if (this.needsDecode) {
+          (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image 
must be grayscale.");
+          const buffer = imgData.data;
+
+          for (let i = 0, ii = buffer.length; i < ii; i++) {
+            buffer[i] ^= 0xff;
+          }
+        }
+
+        return imgData;
+      }
+
+      if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
+        let imageLength = originalHeight * rowBytes;
+
+        switch (this.colorSpace.name) {
+          case "DeviceGray":
+            imageLength *= 3;
+
+          case "DeviceRGB":
+          case "DeviceCMYK":
+            imgData.kind = _util.ImageKind.RGB_24BPP;
+            imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
+            return imgData;
+        }
+      }
+    }
+
+    imgArray = this.getImageBytes(originalHeight * rowBytes);
+    const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
+    const comps = this.getComponents(imgArray);
+    let alpha01, maybeUndoPreblend;
+
+    if (!forceRGBA && !this.smask && !this.mask) {
+      imgData.kind = _util.ImageKind.RGB_24BPP;
+      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
+      alpha01 = 0;
+      maybeUndoPreblend = false;
+    } else {
+      imgData.kind = _util.ImageKind.RGBA_32BPP;
+      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
+      alpha01 = 1;
+      maybeUndoPreblend = true;
+      this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
+    }
+
+    if (this.needsDecode) {
+      this.decodeBuffer(comps);
+    }
+
+    this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, 
actualHeight, bpc, comps, alpha01);
+
+    if (maybeUndoPreblend) {
+      this.undoPreblend(imgData.data, drawWidth, actualHeight);
+    }
+
+    return imgData;
+  }
+
+  fillGrayBuffer(buffer) {
+    const numComps = this.numComps;
+
+    if (numComps !== 1) {
+      throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);
+    }
+
+    const width = this.width;
+    const height = this.height;
+    const bpc = this.bpc;
+    const rowBytes = width * numComps * bpc + 7 >> 3;
+    const imgArray = this.getImageBytes(height * rowBytes);
+    const comps = this.getComponents(imgArray);
+    let i, length;
+
+    if (bpc === 1) {
+      length = width * height;
+
+      if (this.needsDecode) {
+        for (i = 0; i < length; ++i) {
+          buffer[i] = comps[i] - 1 & 255;
+        }
+      } else {
+        for (i = 0; i < length; ++i) {
+          buffer[i] = -comps[i] & 255;
+        }
+      }
+
+      return;
+    }
+
+    if (this.needsDecode) {
+      this.decodeBuffer(comps);
+    }
+
+    length = width * height;
+    const scale = 255 / ((1 << bpc) - 1);
+
+    for (i = 0; i < length; ++i) {
+      buffer[i] = scale * comps[i];
+    }
+  }
+
+  getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {
+    this.image.reset();
+    this.image.drawWidth = drawWidth || this.width;
+    this.image.drawHeight = drawHeight || this.height;
+    this.image.forceRGB = !!forceRGB;
+    return this.image.getBytes(length, true);
+  }
+
+}
+
+exports.PDFImage = PDFImage;
+
+/***/ }),
+/* 64 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Catalog = void 0;
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _util = __w_pdfjs_require__(2);
+
+var _name_number_tree = __w_pdfjs_require__(65);
+
+var _colorspace = __w_pdfjs_require__(14);
+
+var _file_spec = __w_pdfjs_require__(66);
+
+var _image_utils = __w_pdfjs_require__(52);
+
+var _metadata_parser = __w_pdfjs_require__(67);
+
+var _struct_tree = __w_pdfjs_require__(69);
+
+function fetchDestination(dest) {
+  if (dest instanceof _primitives.Dict) {
+    dest = dest.get("D");
+  }
+
+  return Array.isArray(dest) ? dest : null;
+}
+
+class Catalog {
+  constructor(pdfManager, xref) {
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this._catDict = xref.getCatalogObj();
+
+    if (!(0, _primitives.isDict)(this._catDict)) {
+      throw new _util.FormatError("Catalog object is not a dictionary.");
+    }
+
+    this.fontCache = new _primitives.RefSetCache();
+    this.builtInCMapCache = new Map();
+    this.standardFontDataCache = new Map();
+    this.globalImageCache = new _image_utils.GlobalImageCache();
+    this.pageKidsCountCache = new _primitives.RefSetCache();
+    this.pageIndexCache = new _primitives.RefSetCache();
+    this.nonBlendModesSet = new _primitives.RefSet();
+  }
+
+  get version() {
+    const version = this._catDict.get("Version");
+
+    if (!(0, _primitives.isName)(version)) {
+      return (0, _util.shadow)(this, "version", null);
+    }
+
+    return (0, _util.shadow)(this, "version", version.name);
+  }
+
+  get collection() {
+    let collection = null;
+
+    try {
+      const obj = this._catDict.get("Collection");
+
+      if ((0, _primitives.isDict)(obj) && obj.size > 0) {
+        collection = obj;
+      }
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.info)("Cannot fetch Collection entry; assuming no collection is present.");
+    }
+
+    return (0, _util.shadow)(this, "collection", collection);
+  }
+
+  get acroForm() {
+    let acroForm = null;
+
+    try {
+      const obj = this._catDict.get("AcroForm");
+
+      if ((0, _primitives.isDict)(obj) && obj.size > 0) {
+        acroForm = obj;
+      }
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.info)("Cannot fetch AcroForm entry; assuming no forms are present.");
+    }
+
+    return (0, _util.shadow)(this, "acroForm", acroForm);
+  }
+
+  get metadata() {
+    const streamRef = this._catDict.getRaw("Metadata");
+
+    if (!(0, _primitives.isRef)(streamRef)) {
+      return (0, _util.shadow)(this, "metadata", null);
+    }
+
+    const suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata);
+    const stream = this.xref.fetch(streamRef, suppressEncryption);
+    let metadata = null;
+
+    if ((0, _primitives.isStream)(stream) && (0, _primitives.isDict)(stream.dict)) {
+      const type = stream.dict.get("Type");
+      const subtype = stream.dict.get("Subtype");
+
+      if ((0, _primitives.isName)(type, "Metadata") && (0, _primitives.isName)(subtype, "XML")) {
+        try {
+          const data = (0, _util.stringToUTF8String)(stream.getString());
+
+          if (data) {
+            metadata = new _metadata_parser.MetadataParser(data).serializable;
+          }
+        } catch (e) {
+          if (e instanceof _core_utils.MissingDataException) {
+            throw e;
+          }
+
+          (0, _util.info)("Skipping invalid metadata.");
+        }
+      }
+    }
+
+    return (0, _util.shadow)(this, "metadata", metadata);
+  }
+
+  get markInfo() {
+    let markInfo = null;
+
+    try {
+      markInfo = this._readMarkInfo();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)("Unable to read mark info.");
+    }
+
+    return (0, _util.shadow)(this, "markInfo", markInfo);
+  }
+
+  _readMarkInfo() {
+    const obj = this._catDict.get("MarkInfo");
+
+    if (!(0, _primitives.isDict)(obj)) {
+      return null;
+    }
+
+    const markInfo = Object.assign(Object.create(null), {
+      Marked: false,
+      UserProperties: false,
+      Suspects: false
+    });
+
+    for (const key in markInfo) {
+      if (!obj.has(key)) {
+        continue;
+      }
+
+      const value = obj.get(key);
+
+      if (!(0, _util.isBool)(value)) {
+        continue;
+      }
+
+      markInfo[key] = value;
+    }
+
+    return markInfo;
+  }
+
+  get structTreeRoot() {
+    let structTree = null;
+
+    try {
+      structTree = this._readStructTreeRoot();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)("Unable read to structTreeRoot info.");
+    }
+
+    return (0, _util.shadow)(this, "structTreeRoot", structTree);
+  }
+
+  _readStructTreeRoot() {
+    const obj = this._catDict.get("StructTreeRoot");
+
+    if (!(0, _primitives.isDict)(obj)) {
+      return null;
+    }
+
+    const root = new _struct_tree.StructTreeRoot(obj);
+    root.init();
+    return root;
+  }
+
+  get toplevelPagesDict() {
+    const pagesObj = this._catDict.get("Pages");
+
+    if (!(0, _primitives.isDict)(pagesObj)) {
+      throw new _util.FormatError("Invalid top-level pages dictionary.");
+    }
+
+    return (0, _util.shadow)(this, "toplevelPagesDict", pagesObj);
+  }
+
+  get documentOutline() {
+    let obj = null;
+
+    try {
+      obj = this._readDocumentOutline();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)("Unable to read document outline.");
+    }
+
+    return (0, _util.shadow)(this, "documentOutline", obj);
+  }
+
+  _readDocumentOutline() {
+    let obj = this._catDict.get("Outlines");
+
+    if (!(0, _primitives.isDict)(obj)) {
+      return null;
+    }
+
+    obj = obj.getRaw("First");
+
+    if (!(0, _primitives.isRef)(obj)) {
+      return null;
+    }
+
+    const root = {
+      items: []
+    };
+    const queue = [{
+      obj,
+      parent: root
+    }];
+    const processed = new _primitives.RefSet();
+    processed.put(obj);
+    const xref = this.xref,
+          blackColor = new Uint8ClampedArray(3);
+
+    while (queue.length > 0) {
+      const i = queue.shift();
+      const outlineDict = xref.fetchIfRef(i.obj);
+
+      if (outlineDict === null) {
+        continue;
+      }
+
+      if (!outlineDict.has("Title")) {
+        throw new _util.FormatError("Invalid outline item encountered.");
+      }
+
+      const data = {
+        url: null,
+        dest: null
+      };
+      Catalog.parseDestDictionary({
+        destDict: outlineDict,
+        resultObj: data,
+        docBaseUrl: this.pdfManager.docBaseUrl
+      });
+      const title = outlineDict.get("Title");
+      const flags = outlineDict.get("F") || 0;
+      const color = outlineDict.getArray("C");
+      const count = outlineDict.get("Count");
+      let rgbColor = blackColor;
+
+      if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 
0)) {
+        rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);
+      }
+
+      const outlineItem = {
+        dest: data.dest,
+        url: data.url,
+        unsafeUrl: data.unsafeUrl,
+        newWindow: data.newWindow,
+        title: (0, _util.stringToPDFString)(title),
+        color: rgbColor,
+        count: Number.isInteger(count) ? count : undefined,
+        bold: !!(flags & 2),
+        italic: !!(flags & 1),
+        items: []
+      };
+      i.parent.items.push(outlineItem);
+      obj = outlineDict.getRaw("First");
+
+      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
+        queue.push({
+          obj,
+          parent: outlineItem
+        });
+        processed.put(obj);
+      }
+
+      obj = outlineDict.getRaw("Next");
+
+      if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
+        queue.push({
+          obj,
+          parent: i.parent
+        });
+        processed.put(obj);
+      }
+    }
+
+    return root.items.length > 0 ? root.items : null;
+  }
+
+  get permissions() {
+    let permissions = null;
+
+    try {
+      permissions = this._readPermissions();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)("Unable to read permissions.");
+    }
+
+    return (0, _util.shadow)(this, "permissions", permissions);
+  }
+
+  _readPermissions() {
+    const encrypt = this.xref.trailer.get("Encrypt");
+
+    if (!(0, _primitives.isDict)(encrypt)) {
+      return null;
+    }
+
+    let flags = encrypt.get("P");
+
+    if (!(0, _util.isNum)(flags)) {
+      return null;
+    }
+
+    flags += 2 ** 32;
+    const permissions = [];
+
+    for (const key in _util.PermissionFlag) {
+      const value = _util.PermissionFlag[key];
+
+      if (flags & value) {
+        permissions.push(value);
+      }
+    }
+
+    return permissions;
+  }
+
+  get optionalContentConfig() {
+    let config = null;
+
+    try {
+      const properties = this._catDict.get("OCProperties");
+
+      if (!properties) {
+        return (0, _util.shadow)(this, "optionalContentConfig", null);
+      }
+
+      const defaultConfig = properties.get("D");
+
+      if (!defaultConfig) {
+        return (0, _util.shadow)(this, "optionalContentConfig", null);
+      }
+
+      const groupsData = properties.get("OCGs");
+
+      if (!Array.isArray(groupsData)) {
+        return (0, _util.shadow)(this, "optionalContentConfig", null);
+      }
+
+      const groups = [];
+      const groupRefs = [];
+
+      for (const groupRef of groupsData) {
+        if (!(0, _primitives.isRef)(groupRef)) {
+          continue;
+        }
+
+        groupRefs.push(groupRef);
+        const group = this.xref.fetchIfRef(groupRef);
+        groups.push({
+          id: groupRef.toString(),
+          name: (0, _util.isString)(group.get("Name")) ? (0, _util.stringToPDFString)(group.get("Name")) : 
null,
+          intent: (0, _util.isString)(group.get("Intent")) ? (0, 
_util.stringToPDFString)(group.get("Intent")) : null
+        });
+      }
+
+      config = this._readOptionalContentConfig(defaultConfig, groupRefs);
+      config.groups = groups;
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)(`Unable to read optional content config: ${ex}`);
+    }
+
+    return (0, _util.shadow)(this, "optionalContentConfig", config);
+  }
+
+  _readOptionalContentConfig(config, contentGroupRefs) {
+    function parseOnOff(refs) {
+      const onParsed = [];
+
+      if (Array.isArray(refs)) {
+        for (const value of refs) {
+          if (!(0, _primitives.isRef)(value)) {
+            continue;
+          }
+
+          if (contentGroupRefs.includes(value)) {
+            onParsed.push(value.toString());
+          }
+        }
+      }
+
+      return onParsed;
+    }
+
+    function parseOrder(refs, nestedLevels = 0) {
+      if (!Array.isArray(refs)) {
+        return null;
+      }
+
+      const order = [];
+
+      for (const value of refs) {
+        if ((0, _primitives.isRef)(value) && contentGroupRefs.includes(value)) {
+          parsedOrderRefs.put(value);
+          order.push(value.toString());
+          continue;
+        }
+
+        const nestedOrder = parseNestedOrder(value, nestedLevels);
+
+        if (nestedOrder) {
+          order.push(nestedOrder);
+        }
+      }
+
+      if (nestedLevels > 0) {
+        return order;
+      }
+
+      const hiddenGroups = [];
+
+      for (const groupRef of contentGroupRefs) {
+        if (parsedOrderRefs.has(groupRef)) {
+          continue;
+        }
+
+        hiddenGroups.push(groupRef.toString());
+      }
+
+      if (hiddenGroups.length) {
+        order.push({
+          name: null,
+          order: hiddenGroups
+        });
+      }
+
+      return order;
+    }
+
+    function parseNestedOrder(ref, nestedLevels) {
+      if (++nestedLevels > MAX_NESTED_LEVELS) {
+        (0, _util.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS.");
+        return null;
+      }
+
+      const value = xref.fetchIfRef(ref);
+
+      if (!Array.isArray(value)) {
+        return null;
+      }
+
+      const nestedName = xref.fetchIfRef(value[0]);
+
+      if (typeof nestedName !== "string") {
+        return null;
+      }
+
+      const nestedOrder = parseOrder(value.slice(1), nestedLevels);
+
+      if (!nestedOrder || !nestedOrder.length) {
+        return null;
+      }
+
+      return {
+        name: (0, _util.stringToPDFString)(nestedName),
+        order: nestedOrder
+      };
+    }
+
+    const xref = this.xref,
+          parsedOrderRefs = new _primitives.RefSet(),
+          MAX_NESTED_LEVELS = 10;
+    return {
+      name: (0, _util.isString)(config.get("Name")) ? (0, _util.stringToPDFString)(config.get("Name")) : 
null,
+      creator: (0, _util.isString)(config.get("Creator")) ? (0, 
_util.stringToPDFString)(config.get("Creator")) : null,
+      baseState: (0, _primitives.isName)(config.get("BaseState")) ? config.get("BaseState").name : null,
+      on: parseOnOff(config.get("ON")),
+      off: parseOnOff(config.get("OFF")),
+      order: parseOrder(config.get("Order")),
+      groups: null
+    };
+  }
+
+  get numPages() {
+    const obj = this.toplevelPagesDict.get("Count");
+
+    if (!Number.isInteger(obj)) {
+      throw new _util.FormatError("Page count in top-level pages dictionary is not an integer.");
+    }
+
+    return (0, _util.shadow)(this, "numPages", obj);
+  }
+
+  get destinations() {
+    const obj = this._readDests(),
+          dests = Object.create(null);
+
+    if (obj instanceof _name_number_tree.NameTree) {
+      for (const [key, value] of obj.getAll()) {
+        const dest = fetchDestination(value);
+
+        if (dest) {
+          dests[key] = dest;
+        }
+      }
+    } else if (obj instanceof _primitives.Dict) {
+      obj.forEach(function (key, value) {
+        const dest = fetchDestination(value);
+
+        if (dest) {
+          dests[key] = dest;
+        }
+      });
+    }
+
+    return (0, _util.shadow)(this, "destinations", dests);
+  }
+
+  getDestination(id) {
+    const obj = this._readDests();
+
+    if (obj instanceof _name_number_tree.NameTree) {
+      const dest = fetchDestination(obj.get(id));
+
+      if (dest) {
+        return dest;
+      }
+
+      const allDest = this.destinations[id];
+
+      if (allDest) {
+        (0, _util.warn)(`Found "${id}" at an incorrect position in the NameTree.`);
+        return allDest;
+      }
+    } else if (obj instanceof _primitives.Dict) {
+      const dest = fetchDestination(obj.get(id));
+
+      if (dest) {
+        return dest;
+      }
+    }
+
+    return null;
+  }
+
+  _readDests() {
+    const obj = this._catDict.get("Names");
+
+    if (obj && obj.has("Dests")) {
+      return new _name_number_tree.NameTree(obj.getRaw("Dests"), this.xref);
+    } else if (this._catDict.has("Dests")) {
+      return this._catDict.get("Dests");
+    }
+
+    return undefined;
+  }
+
+  get pageLabels() {
+    let obj = null;
+
+    try {
+      obj = this._readPageLabels();
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)("Unable to read page labels.");
+    }
+
+    return (0, _util.shadow)(this, "pageLabels", obj);
+  }
+
+  _readPageLabels() {
+    const obj = this._catDict.getRaw("PageLabels");
+
+    if (!obj) {
+      return null;
+    }
+
+    const pageLabels = new Array(this.numPages);
+    let style = null,
+        prefix = "";
+    const numberTree = new _name_number_tree.NumberTree(obj, this.xref);
+    const nums = numberTree.getAll();
+    let currentLabel = "",
+        currentIndex = 1;
+
+    for (let i = 0, ii = this.numPages; i < ii; i++) {
+      const labelDict = nums.get(i);
+
+      if (labelDict !== undefined) {
+        if (!(0, _primitives.isDict)(labelDict)) {
+          throw new _util.FormatError("PageLabel is not a dictionary.");
+        }
+
+        if (labelDict.has("Type") && !(0, _primitives.isName)(labelDict.get("Type"), "PageLabel")) {
+          throw new _util.FormatError("Invalid type in PageLabel dictionary.");
+        }
+
+        if (labelDict.has("S")) {
+          const s = labelDict.get("S");
+
+          if (!(0, _primitives.isName)(s)) {
+            throw new _util.FormatError("Invalid style in PageLabel dictionary.");
+          }
+
+          style = s.name;
+        } else {
+          style = null;
+        }
+
+        if (labelDict.has("P")) {
+          const p = labelDict.get("P");
+
+          if (!(0, _util.isString)(p)) {
+            throw new _util.FormatError("Invalid prefix in PageLabel dictionary.");
+          }
+
+          prefix = (0, _util.stringToPDFString)(p);
+        } else {
+          prefix = "";
+        }
+
+        if (labelDict.has("St")) {
+          const st = labelDict.get("St");
+
+          if (!(Number.isInteger(st) && st >= 1)) {
+            throw new _util.FormatError("Invalid start in PageLabel dictionary.");
+          }
+
+          currentIndex = st;
+        } else {
+          currentIndex = 1;
+        }
+      }
+
+      switch (style) {
+        case "D":
+          currentLabel = currentIndex;
+          break;
+
+        case "R":
+        case "r":
+          currentLabel = (0, _core_utils.toRomanNumerals)(currentIndex, style === "r");
+          break;
+
+        case "A":
+        case "a":
+          const LIMIT = 26;
+          const A_UPPER_CASE = 0x41,
+                A_LOWER_CASE = 0x61;
+          const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE;
+          const letterIndex = currentIndex - 1;
+          const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
+          const charBuf = [];
+
+          for (let j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {
+            charBuf.push(character);
+          }
+
+          currentLabel = charBuf.join("");
+          break;
+
+        default:
+          if (style) {
+            throw new _util.FormatError(`Invalid style "${style}" in PageLabel dictionary.`);
+          }
+
+          currentLabel = "";
+      }
+
+      pageLabels[i] = prefix + currentLabel;
+      currentIndex++;
+    }
+
+    return pageLabels;
+  }
+
+  get pageLayout() {
+    const obj = this._catDict.get("PageLayout");
+
+    let pageLayout = "";
+
+    if ((0, _primitives.isName)(obj)) {
+      switch (obj.name) {
+        case "SinglePage":
+        case "OneColumn":
+        case "TwoColumnLeft":
+        case "TwoColumnRight":
+        case "TwoPageLeft":
+        case "TwoPageRight":
+          pageLayout = obj.name;
+      }
+    }
+
+    return (0, _util.shadow)(this, "pageLayout", pageLayout);
+  }
+
+  get pageMode() {
+    const obj = this._catDict.get("PageMode");
+
+    let pageMode = "UseNone";
+
+    if ((0, _primitives.isName)(obj)) {
+      switch (obj.name) {
+        case "UseNone":
+        case "UseOutlines":
+        case "UseThumbs":
+        case "FullScreen":
+        case "UseOC":
+        case "UseAttachments":
+          pageMode = obj.name;
+      }
+    }
+
+    return (0, _util.shadow)(this, "pageMode", pageMode);
+  }
+
+  get viewerPreferences() {
+    const ViewerPreferencesValidators = {
+      HideToolbar: _util.isBool,
+      HideMenubar: _util.isBool,
+      HideWindowUI: _util.isBool,
+      FitWindow: _util.isBool,
+      CenterWindow: _util.isBool,
+      DisplayDocTitle: _util.isBool,
+      NonFullScreenPageMode: _primitives.isName,
+      Direction: _primitives.isName,
+      ViewArea: _primitives.isName,
+      ViewClip: _primitives.isName,
+      PrintArea: _primitives.isName,
+      PrintClip: _primitives.isName,
+      PrintScaling: _primitives.isName,
+      Duplex: _primitives.isName,
+      PickTrayByPDFSize: _util.isBool,
+      PrintPageRange: Array.isArray,
+      NumCopies: Number.isInteger
+    };
+
+    const obj = this._catDict.get("ViewerPreferences");
+
+    let prefs = null;
+
+    if ((0, _primitives.isDict)(obj)) {
+      for (const key in ViewerPreferencesValidators) {
+        if (!obj.has(key)) {
+          continue;
+        }
+
+        const value = obj.get(key);
+
+        if (!ViewerPreferencesValidators[key](value)) {
+          (0, _util.info)(`Bad value in ViewerPreferences for "${key}".`);
+          continue;
+        }
+
+        let prefValue;
+
+        switch (key) {
+          case "NonFullScreenPageMode":
+            switch (value.name) {
+              case "UseNone":
+              case "UseOutlines":
+              case "UseThumbs":
+              case "UseOC":
+                prefValue = value.name;
+                break;
+
+              default:
+                prefValue = "UseNone";
+            }
+
+            break;
+
+          case "Direction":
+            switch (value.name) {
+              case "L2R":
+              case "R2L":
+                prefValue = value.name;
+                break;
+
+              default:
+                prefValue = "L2R";
+            }
+
+            break;
+
+          case "ViewArea":
+          case "ViewClip":
+          case "PrintArea":
+          case "PrintClip":
+            switch (value.name) {
+              case "MediaBox":
+              case "CropBox":
+              case "BleedBox":
+              case "TrimBox":
+              case "ArtBox":
+                prefValue = value.name;
+                break;
+
+              default:
+                prefValue = "CropBox";
+            }
+
+            break;
+
+          case "PrintScaling":
+            switch (value.name) {
+              case "None":
+              case "AppDefault":
+                prefValue = value.name;
+                break;
+
+              default:
+                prefValue = "AppDefault";
+            }
+
+            break;
+
+          case "Duplex":
+            switch (value.name) {
+              case "Simplex":
+              case "DuplexFlipShortEdge":
+              case "DuplexFlipLongEdge":
+                prefValue = value.name;
+                break;
+
+              default:
+                prefValue = "None";
+            }
+
+            break;
+
+          case "PrintPageRange":
+            const length = value.length;
+
+            if (length % 2 !== 0) {
+              break;
+            }
+
+            const isValid = value.every((page, i, arr) => {
+              return Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= 
this.numPages;
+            });
+
+            if (isValid) {
+              prefValue = value;
+            }
+
+            break;
+
+          case "NumCopies":
+            if (value > 0) {
+              prefValue = value;
+            }
+
+            break;
+
+          default:
+            if (typeof value !== "boolean") {
+              throw new _util.FormatError(`viewerPreferences - expected a boolean value for: ${key}`);
+            }
+
+            prefValue = value;
+        }
+
+        if (prefValue !== undefined) {
+          if (!prefs) {
+            prefs = Object.create(null);
+          }
+
+          prefs[key] = prefValue;
+        } else {
+          (0, _util.info)(`Bad value in ViewerPreferences for "${key}".`);
+        }
+      }
+    }
+
+    return (0, _util.shadow)(this, "viewerPreferences", prefs);
+  }
+
+  get openAction() {
+    const obj = this._catDict.get("OpenAction");
+
+    const openAction = Object.create(null);
+
+    if ((0, _primitives.isDict)(obj)) {
+      const destDict = new _primitives.Dict(this.xref);
+      destDict.set("A", obj);
+      const resultObj = {
+        url: null,
+        dest: null,
+        action: null
+      };
+      Catalog.parseDestDictionary({
+        destDict,
+        resultObj
+      });
+
+      if (Array.isArray(resultObj.dest)) {
+        openAction.dest = resultObj.dest;
+      } else if (resultObj.action) {
+        openAction.action = resultObj.action;
+      }
+    } else if (Array.isArray(obj)) {
+      openAction.dest = obj;
+    }
+
+    return (0, _util.shadow)(this, "openAction", (0, _util.objectSize)(openAction) > 0 ? openAction : null);
+  }
+
+  get attachments() {
+    const obj = this._catDict.get("Names");
+
+    let attachments = null;
+
+    if (obj instanceof _primitives.Dict && obj.has("EmbeddedFiles")) {
+      const nameTree = new _name_number_tree.NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
+
+      for (const [key, value] of nameTree.getAll()) {
+        const fs = new _file_spec.FileSpec(value, this.xref);
+
+        if (!attachments) {
+          attachments = Object.create(null);
+        }
+
+        attachments[(0, _util.stringToPDFString)(key)] = fs.serializable;
+      }
+    }
+
+    return (0, _util.shadow)(this, "attachments", attachments);
+  }
+
+  get xfaImages() {
+    const obj = this._catDict.get("Names");
+
+    let xfaImages = null;
+
+    if (obj instanceof _primitives.Dict && obj.has("XFAImages")) {
+      const nameTree = new _name_number_tree.NameTree(obj.getRaw("XFAImages"), this.xref);
+
+      for (const [key, value] of nameTree.getAll()) {
+        if (!xfaImages) {
+          xfaImages = new _primitives.Dict(this.xref);
+        }
+
+        xfaImages.set(key, value);
+      }
+    }
+
+    return (0, _util.shadow)(this, "xfaImages", xfaImages);
+  }
+
+  _collectJavaScript() {
+    const obj = this._catDict.get("Names");
+
+    let javaScript = null;
+
+    function appendIfJavaScriptDict(name, jsDict) {
+      if (!(jsDict instanceof _primitives.Dict)) {
+        return;
+      }
+
+      if (!(0, _primitives.isName)(jsDict.get("S"), "JavaScript")) {
+        return;
+      }
+
+      let js = jsDict.get("JS");
+
+      if ((0, _primitives.isStream)(js)) {
+        js = js.getString();
+      } else if (typeof js !== "string") {
+        return;
+      }
+
+      if (javaScript === null) {
+        javaScript = new Map();
+      }
+
+      javaScript.set(name, (0, _util.stringToPDFString)(js));
+    }
+
+    if (obj instanceof _primitives.Dict && obj.has("JavaScript")) {
+      const nameTree = new _name_number_tree.NameTree(obj.getRaw("JavaScript"), this.xref);
+
+      for (const [key, value] of nameTree.getAll()) {
+        appendIfJavaScriptDict(key, value);
+      }
+    }
+
+    const openAction = this._catDict.get("OpenAction");
+
+    if (openAction) {
+      appendIfJavaScriptDict("OpenAction", openAction);
+    }
+
+    return javaScript;
+  }
+
+  get javaScript() {
+    const javaScript = this._collectJavaScript();
+
+    return (0, _util.shadow)(this, "javaScript", javaScript ? [...javaScript.values()] : null);
+  }
+
+  get jsActions() {
+    const javaScript = this._collectJavaScript();
+
+    let actions = (0, _core_utils.collectActions)(this.xref, this._catDict, _util.DocumentActionEventType);
+
+    if (javaScript) {
+      if (!actions) {
+        actions = Object.create(null);
+      }
+
+      for (const [key, val] of javaScript) {
+        if (key in actions) {
+          actions[key].push(val);
+        } else {
+          actions[key] = [val];
+        }
+      }
+    }
+
+    return (0, _util.shadow)(this, "jsActions", actions);
+  }
+
+  fontFallback(id, handler) {
+    const promises = [];
+    this.fontCache.forEach(function (promise) {
+      promises.push(promise);
+    });
+    return Promise.all(promises).then(translatedFonts => {
+      for (const translatedFont of translatedFonts) {
+        if (translatedFont.loadedName === id) {
+          translatedFont.fallback(handler);
+          return;
+        }
+      }
+    });
+  }
+
+  cleanup(manuallyTriggered = false) {
+    (0, _primitives.clearPrimitiveCaches)();
+    this.globalImageCache.clear(manuallyTriggered);
+    this.pageKidsCountCache.clear();
+    this.pageIndexCache.clear();
+    this.nonBlendModesSet.clear();
+    const promises = [];
+    this.fontCache.forEach(function (promise) {
+      promises.push(promise);
+    });
+    return Promise.all(promises).then(translatedFonts => {
+      for (const {
+        dict
+      } of translatedFonts) {
+        delete dict.cacheKey;
+      }
+
+      this.fontCache.clear();
+      this.builtInCMapCache.clear();
+      this.standardFontDataCache.clear();
+    });
+  }
+
+  getPageDict(pageIndex) {
+    const capability = (0, _util.createPromiseCapability)();
+    const nodesToVisit = [this._catDict.getRaw("Pages")];
+    const visitedNodes = new _primitives.RefSet();
+    const xref = this.xref,
+          pageKidsCountCache = this.pageKidsCountCache;
+    let count,
+        currentPageIndex = 0;
+
+    function next() {
+      while (nodesToVisit.length) {
+        const currentNode = nodesToVisit.pop();
+
+        if ((0, _primitives.isRef)(currentNode)) {
+          count = pageKidsCountCache.get(currentNode);
+
+          if (count > 0 && currentPageIndex + count < pageIndex) {
+            currentPageIndex += count;
+            continue;
+          }
+
+          if (visitedNodes.has(currentNode)) {
+            capability.reject(new _util.FormatError("Pages tree contains circular reference."));
+            return;
+          }
+
+          visitedNodes.put(currentNode);
+          xref.fetchAsync(currentNode).then(function (obj) {
+            if ((0, _primitives.isDict)(obj, "Page") || (0, _primitives.isDict)(obj) && !obj.has("Kids")) {
+              if (pageIndex === currentPageIndex) {
+                if (currentNode && !pageKidsCountCache.has(currentNode)) {
+                  pageKidsCountCache.put(currentNode, 1);
+                }
+
+                capability.resolve([obj, currentNode]);
+              } else {
+                currentPageIndex++;
+                next();
+              }
+
+              return;
+            }
+
+            nodesToVisit.push(obj);
+            next();
+          }, capability.reject);
+          return;
+        }
+
+        if (!(0, _primitives.isDict)(currentNode)) {
+          capability.reject(new _util.FormatError("Page dictionary kid reference points to wrong type of 
object."));
+          return;
+        }
+
+        count = currentNode.get("Count");
+
+        if (Number.isInteger(count) && count >= 0) {
+          const objId = currentNode.objId;
+
+          if (objId && !pageKidsCountCache.has(objId)) {
+            pageKidsCountCache.put(objId, count);
+          }
+
+          if (currentPageIndex + count <= pageIndex) {
+            currentPageIndex += count;
+            continue;
+          }
+        }
+
+        const kids = currentNode.get("Kids");
+
+        if (!Array.isArray(kids)) {
+          if ((0, _primitives.isName)(currentNode.get("Type"), "Page") || !currentNode.has("Type") && 
currentNode.has("Contents")) {
+            if (currentPageIndex === pageIndex) {
+              capability.resolve([currentNode, null]);
+              return;
+            }
+
+            currentPageIndex++;
+            continue;
+          }
+
+          capability.reject(new _util.FormatError("Page dictionary kids object is not an array."));
+          return;
+        }
+
+        for (let last = kids.length - 1; last >= 0; last--) {
+          nodesToVisit.push(kids[last]);
+        }
+      }
+
+      capability.reject(new Error(`Page index ${pageIndex} not found.`));
+    }
+
+    next();
+    return capability.promise;
+  }
+
+  getPageIndex(pageRef) {
+    const cachedPageIndex = this.pageIndexCache.get(pageRef);
+
+    if (cachedPageIndex !== undefined) {
+      return Promise.resolve(cachedPageIndex);
+    }
+
+    const xref = this.xref;
+
+    function pagesBeforeRef(kidRef) {
+      let total = 0,
+          parentRef;
+      return xref.fetchAsync(kidRef).then(function (node) {
+        if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, "Page") && !((0, 
_primitives.isDict)(node) && !node.has("Type") && node.has("Contents"))) {
+          throw new _util.FormatError("The reference does not point to a /Page dictionary.");
+        }
+
+        if (!node) {
+          return null;
+        }
+
+        if (!(0, _primitives.isDict)(node)) {
+          throw new _util.FormatError("Node must be a dictionary.");
+        }
+
+        parentRef = node.getRaw("Parent");
+        return node.getAsync("Parent");
+      }).then(function (parent) {
+        if (!parent) {
+          return null;
+        }
+
+        if (!(0, _primitives.isDict)(parent)) {
+          throw new _util.FormatError("Parent must be a dictionary.");
+        }
+
+        return parent.getAsync("Kids");
+      }).then(function (kids) {
+        if (!kids) {
+          return null;
+        }
+
+        const kidPromises = [];
+        let found = false;
+
+        for (let i = 0, ii = kids.length; i < ii; i++) {
+          const kid = kids[i];
+
+          if (!(0, _primitives.isRef)(kid)) {
+            throw new _util.FormatError("Kid must be a reference.");
+          }
+
+          if ((0, _primitives.isRefsEqual)(kid, kidRef)) {
+            found = true;
+            break;
+          }
+
+          kidPromises.push(xref.fetchAsync(kid).then(function (obj) {
+            if (!(0, _primitives.isDict)(obj)) {
+              throw new _util.FormatError("Kid node must be a dictionary.");
+            }
+
+            if (obj.has("Count")) {
+              total += obj.get("Count");
+            } else {
+              total++;
+            }
+          }));
+        }
+
+        if (!found) {
+          throw new _util.FormatError("Kid reference not found in parent's kids.");
+        }
+
+        return Promise.all(kidPromises).then(function () {
+          return [total, parentRef];
+        });
+      });
+    }
+
+    let total = 0;
+
+    const next = ref => pagesBeforeRef(ref).then(args => {
+      if (!args) {
+        this.pageIndexCache.put(pageRef, total);
+        return total;
+      }
+
+      const [count, parentRef] = args;
+      total += count;
+      return next(parentRef);
+    });
+
+    return next(pageRef);
+  }
+
+  static parseDestDictionary(params) {
+    function addDefaultProtocolToUrl(url) {
+      return url.startsWith("www.") ? `http://${url}` : url;
+    }
+
+    function tryConvertUrlEncoding(url) {
+      try {
+        return (0, _util.stringToUTF8String)(url);
+      } catch (e) {
+        return url;
+      }
+    }
+
+    const destDict = params.destDict;
+
+    if (!(0, _primitives.isDict)(destDict)) {
+      (0, _util.warn)("parseDestDictionary: `destDict` must be a dictionary.");
+      return;
+    }
+
+    const resultObj = params.resultObj;
+
+    if (typeof resultObj !== "object") {
+      (0, _util.warn)("parseDestDictionary: `resultObj` must be an object.");
+      return;
+    }
+
+    const docBaseUrl = params.docBaseUrl || null;
+    let action = destDict.get("A"),
+        url,
+        dest;
+
+    if (!(0, _primitives.isDict)(action)) {
+      if (destDict.has("Dest")) {
+        action = destDict.get("Dest");
+      } else {
+        action = destDict.get("AA");
+
+        if ((0, _primitives.isDict)(action)) {
+          if (action.has("D")) {
+            action = action.get("D");
+          } else if (action.has("U")) {
+            action = action.get("U");
+          }
+        }
+      }
+    }
+
+    if ((0, _primitives.isDict)(action)) {
+      const actionType = action.get("S");
+
+      if (!(0, _primitives.isName)(actionType)) {
+        (0, _util.warn)("parseDestDictionary: Invalid type in Action dictionary.");
+        return;
+      }
+
+      const actionName = actionType.name;
+
+      switch (actionName) {
+        case "URI":
+          url = action.get("URI");
+
+          if ((0, _primitives.isName)(url)) {
+            url = "/" + url.name;
+          } else if ((0, _util.isString)(url)) {
+            url = addDefaultProtocolToUrl(url);
+          }
+
+          break;
+
+        case "GoTo":
+          dest = action.get("D");
+          break;
+
+        case "Launch":
+        case "GoToR":
+          const urlDict = action.get("F");
+
+          if ((0, _primitives.isDict)(urlDict)) {
+            url = urlDict.get("F") || null;
+          } else if ((0, _util.isString)(urlDict)) {
+            url = urlDict;
+          }
+
+          let remoteDest = action.get("D");
+
+          if (remoteDest) {
+            if ((0, _primitives.isName)(remoteDest)) {
+              remoteDest = remoteDest.name;
+            }
+
+            if ((0, _util.isString)(url)) {
+              const baseUrl = url.split("#")[0];
+
+              if ((0, _util.isString)(remoteDest)) {
+                url = baseUrl + "#" + remoteDest;
+              } else if (Array.isArray(remoteDest)) {
+                url = baseUrl + "#" + JSON.stringify(remoteDest);
+              }
+            }
+          }
+
+          const newWindow = action.get("NewWindow");
+
+          if ((0, _util.isBool)(newWindow)) {
+            resultObj.newWindow = newWindow;
+          }
+
+          break;
+
+        case "Named":
+          const namedAction = action.get("N");
+
+          if ((0, _primitives.isName)(namedAction)) {
+            resultObj.action = namedAction.name;
+          }
+
+          break;
+
+        case "JavaScript":
+          const jsAction = action.get("JS");
+          let js;
+
+          if ((0, _primitives.isStream)(jsAction)) {
+            js = jsAction.getString();
+          } else if ((0, _util.isString)(jsAction)) {
+            js = jsAction;
+          }
+
+          if (js) {
+            const URL_OPEN_METHODS = ["app.launchURL", "window.open"];
+            const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").split(".").join("\\.") + 
")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i");
+            const jsUrl = regex.exec((0, _util.stringToPDFString)(js));
+
+            if (jsUrl && jsUrl[2]) {
+              url = jsUrl[2];
+
+              if (jsUrl[3] === "true" && jsUrl[1] === "app.launchURL") {
+                resultObj.newWindow = true;
+              }
+
+              break;
+            }
+          }
+
+        default:
+          if (actionName === "JavaScript" || actionName === "ResetForm" || actionName === "SubmitForm") {
+            break;
+          }
+
+          (0, _util.warn)(`parseDestDictionary - unsupported action: "${actionName}".`);
+          break;
+      }
+    } else if (destDict.has("Dest")) {
+      dest = destDict.get("Dest");
+    }
+
+    if ((0, _util.isString)(url)) {
+      url = tryConvertUrlEncoding(url);
+      const absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);
+
+      if (absoluteUrl) {
+        resultObj.url = absoluteUrl.href;
+      }
+
+      resultObj.unsafeUrl = url;
+    }
+
+    if (dest) {
+      if ((0, _primitives.isName)(dest)) {
+        dest = dest.name;
+      }
+
+      if ((0, _util.isString)(dest) || Array.isArray(dest)) {
+        resultObj.dest = dest;
+      }
+    }
+  }
+
+}
+
+exports.Catalog = Catalog;
+
+/***/ }),
+/* 65 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.NumberTree = exports.NameTree = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+class NameOrNumberTree {
+  constructor(root, xref, type) {
+    if (this.constructor === NameOrNumberTree) {
+      (0, _util.unreachable)("Cannot initialize NameOrNumberTree.");
+    }
+
+    this.root = root;
+    this.xref = xref;
+    this._type = type;
+  }
+
+  getAll() {
+    const map = new Map();
+
+    if (!this.root) {
+      return map;
+    }
+
+    const xref = this.xref;
+    const processed = new _primitives.RefSet();
+    processed.put(this.root);
+    const queue = [this.root];
+
+    while (queue.length > 0) {
+      const obj = xref.fetchIfRef(queue.shift());
+
+      if (!(0, _primitives.isDict)(obj)) {
+        continue;
+      }
+
+      if (obj.has("Kids")) {
+        const kids = obj.get("Kids");
+
+        for (let i = 0, ii = kids.length; i < ii; i++) {
+          const kid = kids[i];
+
+          if (processed.has(kid)) {
+            throw new _util.FormatError(`Duplicate entry in "${this._type}" tree.`);
+          }
+
+          queue.push(kid);
+          processed.put(kid);
+        }
+
+        continue;
+      }
+
+      const entries = obj.get(this._type);
+
+      if (!Array.isArray(entries)) {
+        continue;
+      }
+
+      for (let i = 0, ii = entries.length; i < ii; i += 2) {
+        map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1]));
+      }
+    }
+
+    return map;
+  }
+
+  get(key) {
+    if (!this.root) {
+      return null;
+    }
+
+    const xref = this.xref;
+    let kidsOrEntries = xref.fetchIfRef(this.root);
+    let loopCount = 0;
+    const MAX_LEVELS = 10;
+
+    while (kidsOrEntries.has("Kids")) {
+      if (++loopCount > MAX_LEVELS) {
+        (0, _util.warn)(`Search depth limit reached for "${this._type}" tree.`);
+        return null;
+      }
+
+      const kids = kidsOrEntries.get("Kids");
+
+      if (!Array.isArray(kids)) {
+        return null;
+      }
+
+      let l = 0,
+          r = kids.length - 1;
+
+      while (l <= r) {
+        const m = l + r >> 1;
+        const kid = xref.fetchIfRef(kids[m]);
+        const limits = kid.get("Limits");
+
+        if (key < xref.fetchIfRef(limits[0])) {
+          r = m - 1;
+        } else if (key > xref.fetchIfRef(limits[1])) {
+          l = m + 1;
+        } else {
+          kidsOrEntries = xref.fetchIfRef(kids[m]);
+          break;
+        }
+      }
+
+      if (l > r) {
+        return null;
+      }
+    }
+
+    const entries = kidsOrEntries.get(this._type);
+
+    if (Array.isArray(entries)) {
+      let l = 0,
+          r = entries.length - 2;
+
+      while (l <= r) {
+        const tmp = l + r >> 1,
+              m = tmp + (tmp & 1);
+        const currentKey = xref.fetchIfRef(entries[m]);
+
+        if (key < currentKey) {
+          r = m - 2;
+        } else if (key > currentKey) {
+          l = m + 2;
+        } else {
+          return xref.fetchIfRef(entries[m + 1]);
+        }
+      }
+    }
+
+    return null;
+  }
+
+}
+
+class NameTree extends NameOrNumberTree {
+  constructor(root, xref) {
+    super(root, xref, "Names");
+  }
+
+}
+
+exports.NameTree = NameTree;
+
+class NumberTree extends NameOrNumberTree {
+  constructor(root, xref) {
+    super(root, xref, "Nums");
+  }
+
+}
+
+exports.NumberTree = NumberTree;
+
+/***/ }),
+/* 66 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.FileSpec = void 0;
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _util = __w_pdfjs_require__(2);
+
+function pickPlatformItem(dict) {
+  if (dict.has("UF")) {
+    return dict.get("UF");
+  } else if (dict.has("F")) {
+    return dict.get("F");
+  } else if (dict.has("Unix")) {
+    return dict.get("Unix");
+  } else if (dict.has("Mac")) {
+    return dict.get("Mac");
+  } else if (dict.has("DOS")) {
+    return dict.get("DOS");
+  }
+
+  return null;
+}
+
+class FileSpec {
+  constructor(root, xref) {
+    if (!root || !(0, _primitives.isDict)(root)) {
+      return;
+    }
+
+    this.xref = xref;
+    this.root = root;
+
+    if (root.has("FS")) {
+      this.fs = root.get("FS");
+    }
+
+    this.description = root.has("Desc") ? (0, _util.stringToPDFString)(root.get("Desc")) : "";
+
+    if (root.has("RF")) {
+      (0, _util.warn)("Related file specifications are not supported");
+    }
+
+    this.contentAvailable = true;
+
+    if (!root.has("EF")) {
+      this.contentAvailable = false;
+      (0, _util.warn)("Non-embedded file specifications are not supported");
+    }
+  }
+
+  get filename() {
+    if (!this._filename && this.root) {
+      const filename = pickPlatformItem(this.root) || "unnamed";
+      this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, "\\").replace(/\\\//g, 
"/").replace(/\\/g, "/");
+    }
+
+    return this._filename;
+  }
+
+  get content() {
+    if (!this.contentAvailable) {
+      return null;
+    }
+
+    if (!this.contentRef && this.root) {
+      this.contentRef = pickPlatformItem(this.root.get("EF"));
+    }
+
+    let content = null;
+
+    if (this.contentRef) {
+      const fileObj = this.xref.fetchIfRef(this.contentRef);
+
+      if (fileObj && (0, _primitives.isStream)(fileObj)) {
+        content = fileObj.getBytes();
+      } else {
+        (0, _util.warn)("Embedded file specification points to non-existing/invalid content");
+      }
+    } else {
+      (0, _util.warn)("Embedded file specification does not have a content");
+    }
+
+    return content;
+  }
+
+  get serializable() {
+    return {
+      filename: this.filename,
+      content: this.content
+    };
+  }
+
+}
+
+exports.FileSpec = FileSpec;
+
+/***/ }),
+/* 67 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.MetadataParser = void 0;
+
+var _xml_parser = __w_pdfjs_require__(68);
+
+class MetadataParser {
+  constructor(data) {
+    data = this._repair(data);
+    const parser = new _xml_parser.SimpleXMLParser({
+      lowerCaseName: true
+    });
+    const xmlDocument = parser.parseFromString(data);
+    this._metadataMap = new Map();
+    this._data = data;
+
+    if (xmlDocument) {
+      this._parse(xmlDocument);
+    }
+  }
+
+  _repair(data) {
+    return data.replace(/^[^<]+/, "").replace(/>\\376\\377([^<]+)/g, function (all, codes) {
+      const bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {
+        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+      }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
+        switch (name) {
+          case "amp":
+            return "&";
+
+          case "apos":
+            return "'";
+
+          case "gt":
+            return ">";
+
+          case "lt":
+            return "<";
+
+          case "quot":
+            return '"';
+        }
+
+        throw new Error(`_repair: ${name} isn't defined.`);
+      });
+      const charBuf = [];
+
+      for (let i = 0, ii = bytes.length; i < ii; i += 2) {
+        const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+
+        if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
+          charBuf.push(String.fromCharCode(code));
+        } else {
+          charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";");
+        }
+      }
+
+      return ">" + charBuf.join("");
+    });
+  }
+
+  _getSequence(entry) {
+    const name = entry.nodeName;
+
+    if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") {
+      return null;
+    }
+
+    return entry.childNodes.filter(node => node.nodeName === "rdf:li");
+  }
+
+  _parseArray(entry) {
+    if (!entry.hasChildNodes()) {
+      return;
+    }
+
+    const [seqNode] = entry.childNodes;
+    const sequence = this._getSequence(seqNode) || [];
+
+    this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim()));
+  }
+
+  _parse(xmlDocument) {
+    let rdf = xmlDocument.documentElement;
+
+    if (rdf.nodeName !== "rdf:rdf") {
+      rdf = rdf.firstChild;
+
+      while (rdf && rdf.nodeName !== "rdf:rdf") {
+        rdf = rdf.nextSibling;
+      }
+    }
+
+    if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) {
+      return;
+    }
+
+    for (const desc of rdf.childNodes) {
+      if (desc.nodeName !== "rdf:description") {
+        continue;
+      }
+
+      for (const entry of desc.childNodes) {
+        const name = entry.nodeName;
+
+        switch (name) {
+          case "#text":
+            continue;
+
+          case "dc:creator":
+          case "dc:subject":
+            this._parseArray(entry);
+
+            continue;
+        }
+
+        this._metadataMap.set(name, entry.textContent.trim());
+      }
+    }
+  }
+
+  get serializable() {
+    return {
+      parsedData: this._metadataMap,
+      rawData: this._data
+    };
+  }
+
+}
+
+exports.MetadataParser = MetadataParser;
+
+/***/ }),
+/* 68 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XMLParserErrorCode = exports.XMLParserBase = exports.SimpleXMLParser = exports.SimpleDOMNode = void 
0;
+
+var _core_utils = __w_pdfjs_require__(9);
+
+const XMLParserErrorCode = {
+  NoError: 0,
+  EndOfDocument: -1,
+  UnterminatedCdat: -2,
+  UnterminatedXmlDeclaration: -3,
+  UnterminatedDoctypeDeclaration: -4,
+  UnterminatedComment: -5,
+  MalformedElement: -6,
+  OutOfMemory: -7,
+  UnterminatedAttributeValue: -8,
+  UnterminatedElement: -9,
+  ElementNeverBegun: -10
+};
+exports.XMLParserErrorCode = XMLParserErrorCode;
+
+function isWhitespace(s, index) {
+  const ch = s[index];
+  return ch === " " || ch === "\n" || ch === "\r" || ch === "\t";
+}
+
+function isWhitespaceString(s) {
+  for (let i = 0, ii = s.length; i < ii; i++) {
+    if (!isWhitespace(s, i)) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+class XMLParserBase {
+  _resolveEntities(s) {
+    return s.replace(/&([^;]+);/g, (all, entity) => {
+      if (entity.substring(0, 2) === "#x") {
+        return String.fromCodePoint(parseInt(entity.substring(2), 16));
+      } else if (entity.substring(0, 1) === "#") {
+        return String.fromCodePoint(parseInt(entity.substring(1), 10));
+      }
+
+      switch (entity) {
+        case "lt":
+          return "<";
+
+        case "gt":
+          return ">";
+
+        case "amp":
+          return "&";
+
+        case "quot":
+          return '"';
+
+        case "apos":
+          return "'";
+      }
+
+      return this.onResolveEntity(entity);
+    });
+  }
+
+  _parseContent(s, start) {
+    const attributes = [];
+    let pos = start;
+
+    function skipWs() {
+      while (pos < s.length && isWhitespace(s, pos)) {
+        ++pos;
+      }
+    }
+
+    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") {
+      ++pos;
+    }
+
+    const name = s.substring(start, pos);
+    skipWs();
+
+    while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") {
+      skipWs();
+      let attrName = "",
+          attrValue = "";
+
+      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") {
+        attrName += s[pos];
+        ++pos;
+      }
+
+      skipWs();
+
+      if (s[pos] !== "=") {
+        return null;
+      }
+
+      ++pos;
+      skipWs();
+      const attrEndChar = s[pos];
+
+      if (attrEndChar !== '"' && attrEndChar !== "'") {
+        return null;
+      }
+
+      const attrEndIndex = s.indexOf(attrEndChar, ++pos);
+
+      if (attrEndIndex < 0) {
+        return null;
+      }
+
+      attrValue = s.substring(pos, attrEndIndex);
+      attributes.push({
+        name: attrName,
+        value: this._resolveEntities(attrValue)
+      });
+      pos = attrEndIndex + 1;
+      skipWs();
+    }
+
+    return {
+      name,
+      attributes,
+      parsed: pos - start
+    };
+  }
+
+  _parseProcessingInstruction(s, start) {
+    let pos = start;
+
+    function skipWs() {
+      while (pos < s.length && isWhitespace(s, pos)) {
+        ++pos;
+      }
+    }
+
+    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") {
+      ++pos;
+    }
+
+    const name = s.substring(start, pos);
+    skipWs();
+    const attrStart = pos;
+
+    while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) {
+      ++pos;
+    }
+
+    const value = s.substring(attrStart, pos);
+    return {
+      name,
+      value,
+      parsed: pos - start
+    };
+  }
+
+  parseXml(s) {
+    let i = 0;
+
+    while (i < s.length) {
+      const ch = s[i];
+      let j = i;
+
+      if (ch === "<") {
+        ++j;
+        const ch2 = s[j];
+        let q;
+
+        switch (ch2) {
+          case "/":
+            ++j;
+            q = s.indexOf(">", j);
+
+            if (q < 0) {
+              this.onError(XMLParserErrorCode.UnterminatedElement);
+              return;
+            }
+
+            this.onEndElement(s.substring(j, q));
+            j = q + 1;
+            break;
+
+          case "?":
+            ++j;
+
+            const pi = this._parseProcessingInstruction(s, j);
+
+            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") {
+              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
+              return;
+            }
+
+            this.onPi(pi.name, pi.value);
+            j += pi.parsed + 2;
+            break;
+
+          case "!":
+            if (s.substring(j + 1, j + 3) === "--") {
+              q = s.indexOf("-->", j + 3);
+
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedComment);
+                return;
+              }
+
+              this.onComment(s.substring(j + 3, q));
+              j = q + 3;
+            } else if (s.substring(j + 1, j + 8) === "[CDATA[") {
+              q = s.indexOf("]]>", j + 8);
+
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedCdat);
+                return;
+              }
+
+              this.onCdata(s.substring(j + 8, q));
+              j = q + 3;
+            } else if (s.substring(j + 1, j + 8) === "DOCTYPE") {
+              const q2 = s.indexOf("[", j + 8);
+              let complexDoctype = false;
+              q = s.indexOf(">", j + 8);
+
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                return;
+              }
+
+              if (q2 > 0 && q > q2) {
+                q = s.indexOf("]>", j + 8);
+
+                if (q < 0) {
+                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                  return;
+                }
+
+                complexDoctype = true;
+              }
+
+              const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
+              this.onDoctype(doctypeContent);
+              j = q + (complexDoctype ? 2 : 1);
+            } else {
+              this.onError(XMLParserErrorCode.MalformedElement);
+              return;
+            }
+
+            break;
+
+          default:
+            const content = this._parseContent(s, j);
+
+            if (content === null) {
+              this.onError(XMLParserErrorCode.MalformedElement);
+              return;
+            }
+
+            let isClosed = false;
+
+            if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") {
+              isClosed = true;
+            } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") {
+              this.onError(XMLParserErrorCode.UnterminatedElement);
+              return;
+            }
+
+            this.onBeginElement(content.name, content.attributes, isClosed);
+            j += content.parsed + (isClosed ? 2 : 1);
+            break;
+        }
+      } else {
+        while (j < s.length && s[j] !== "<") {
+          j++;
+        }
+
+        const text = s.substring(i, j);
+        this.onText(this._resolveEntities(text));
+      }
+
+      i = j;
+    }
+  }
+
+  onResolveEntity(name) {
+    return `&${name};`;
+  }
+
+  onPi(name, value) {}
+
+  onComment(text) {}
+
+  onCdata(text) {}
+
+  onDoctype(doctypeContent) {}
+
+  onText(text) {}
+
+  onBeginElement(name, attributes, isEmpty) {}
+
+  onEndElement(name) {}
+
+  onError(code) {}
+
+}
+
+exports.XMLParserBase = XMLParserBase;
+
+class SimpleDOMNode {
+  constructor(nodeName, nodeValue) {
+    this.nodeName = nodeName;
+    this.nodeValue = nodeValue;
+    Object.defineProperty(this, "parentNode", {
+      value: null,
+      writable: true
+    });
+  }
+
+  get firstChild() {
+    return this.childNodes && this.childNodes[0];
+  }
+
+  get nextSibling() {
+    const childNodes = this.parentNode.childNodes;
+
+    if (!childNodes) {
+      return undefined;
+    }
+
+    const index = childNodes.indexOf(this);
+
+    if (index === -1) {
+      return undefined;
+    }
+
+    return childNodes[index + 1];
+  }
+
+  get textContent() {
+    if (!this.childNodes) {
+      return this.nodeValue || "";
+    }
+
+    return this.childNodes.map(function (child) {
+      return child.textContent;
+    }).join("");
+  }
+
+  hasChildNodes() {
+    return this.childNodes && this.childNodes.length > 0;
+  }
+
+  searchNode(paths, pos) {
+    if (pos >= paths.length) {
+      return this;
+    }
+
+    const component = paths[pos];
+    const stack = [];
+    let node = this;
+
+    while (true) {
+      if (component.name === node.nodeName) {
+        if (component.pos === 0) {
+          const res = node.searchNode(paths, pos + 1);
+
+          if (res !== null) {
+            return res;
+          }
+        } else if (stack.length === 0) {
+          return null;
+        } else {
+          const [parent] = stack.pop();
+          let siblingPos = 0;
+
+          for (const child of parent.childNodes) {
+            if (component.name === child.nodeName) {
+              if (siblingPos === component.pos) {
+                return child.searchNode(paths, pos + 1);
+              }
+
+              siblingPos++;
+            }
+          }
+
+          return node.searchNode(paths, pos + 1);
+        }
+      }
+
+      if (node.childNodes && node.childNodes.length !== 0) {
+        stack.push([node, 0]);
+        node = node.childNodes[0];
+      } else if (stack.length === 0) {
+        return null;
+      } else {
+        while (stack.length !== 0) {
+          const [parent, currentPos] = stack.pop();
+          const newPos = currentPos + 1;
+
+          if (newPos < parent.childNodes.length) {
+            stack.push([parent, newPos]);
+            node = parent.childNodes[newPos];
+            break;
+          }
+        }
+
+        if (stack.length === 0) {
+          return null;
+        }
+      }
+    }
+  }
+
+  dump(buffer) {
+    if (this.nodeName === "#text") {
+      buffer.push((0, _core_utils.encodeToXmlString)(this.nodeValue));
+      return;
+    }
+
+    buffer.push(`<${this.nodeName}`);
+
+    if (this.attributes) {
+      for (const attribute of this.attributes) {
+        buffer.push(` ${attribute.name}="${(0, _core_utils.encodeToXmlString)(attribute.value)}"`);
+      }
+    }
+
+    if (this.hasChildNodes()) {
+      buffer.push(">");
+
+      for (const child of this.childNodes) {
+        child.dump(buffer);
+      }
+
+      buffer.push(`</${this.nodeName}>`);
+    } else if (this.nodeValue) {
+      buffer.push(`>${(0, _core_utils.encodeToXmlString)(this.nodeValue)}</${this.nodeName}>`);
+    } else {
+      buffer.push("/>");
+    }
+  }
+
+}
+
+exports.SimpleDOMNode = SimpleDOMNode;
+
+class SimpleXMLParser extends XMLParserBase {
+  constructor({
+    hasAttributes = false,
+    lowerCaseName = false
+  }) {
+    super();
+    this._currentFragment = null;
+    this._stack = null;
+    this._errorCode = XMLParserErrorCode.NoError;
+    this._hasAttributes = hasAttributes;
+    this._lowerCaseName = lowerCaseName;
+  }
+
+  parseFromString(data) {
+    this._currentFragment = [];
+    this._stack = [];
+    this._errorCode = XMLParserErrorCode.NoError;
+    this.parseXml(data);
+
+    if (this._errorCode !== XMLParserErrorCode.NoError) {
+      return undefined;
+    }
+
+    const [documentElement] = this._currentFragment;
+
+    if (!documentElement) {
+      return undefined;
+    }
+
+    return {
+      documentElement
+    };
+  }
+
+  onText(text) {
+    if (isWhitespaceString(text)) {
+      return;
+    }
+
+    const node = new SimpleDOMNode("#text", text);
+
+    this._currentFragment.push(node);
+  }
+
+  onCdata(text) {
+    const node = new SimpleDOMNode("#text", text);
+
+    this._currentFragment.push(node);
+  }
+
+  onBeginElement(name, attributes, isEmpty) {
+    if (this._lowerCaseName) {
+      name = name.toLowerCase();
+    }
+
+    const node = new SimpleDOMNode(name);
+    node.childNodes = [];
+
+    if (this._hasAttributes) {
+      node.attributes = attributes;
+    }
+
+    this._currentFragment.push(node);
+
+    if (isEmpty) {
+      return;
+    }
+
+    this._stack.push(this._currentFragment);
+
+    this._currentFragment = node.childNodes;
+  }
+
+  onEndElement(name) {
+    this._currentFragment = this._stack.pop() || [];
+    const lastElement = this._currentFragment[this._currentFragment.length - 1];
+
+    if (!lastElement) {
+      return;
+    }
+
+    for (let i = 0, ii = lastElement.childNodes.length; i < ii; i++) {
+      lastElement.childNodes[i].parentNode = lastElement;
+    }
+  }
+
+  onError(code) {
+    this._errorCode = code;
+  }
+
+}
+
+exports.SimpleXMLParser = SimpleXMLParser;
+
+/***/ }),
+/* 69 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.StructTreeRoot = exports.StructTreePage = void 0;
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _util = __w_pdfjs_require__(2);
+
+var _name_number_tree = __w_pdfjs_require__(65);
+
+const MAX_DEPTH = 40;
+const StructElementType = {
+  PAGE_CONTENT: "PAGE_CONTENT",
+  STREAM_CONTENT: "STREAM_CONTENT",
+  OBJECT: "OBJECT",
+  ELEMENT: "ELEMENT"
+};
+
+class StructTreeRoot {
+  constructor(rootDict) {
+    this.dict = rootDict;
+    this.roleMap = new Map();
+  }
+
+  init() {
+    this.readRoleMap();
+  }
+
+  readRoleMap() {
+    const roleMapDict = this.dict.get("RoleMap");
+
+    if (!(0, _primitives.isDict)(roleMapDict)) {
+      return;
+    }
+
+    roleMapDict.forEach((key, value) => {
+      if (!(0, _primitives.isName)(value)) {
+        return;
+      }
+
+      this.roleMap.set(key, value.name);
+    });
+  }
+
+}
+
+exports.StructTreeRoot = StructTreeRoot;
+
+class StructElementNode {
+  constructor(tree, dict) {
+    this.tree = tree;
+    this.dict = dict;
+    this.kids = [];
+    this.parseKids();
+  }
+
+  get role() {
+    const nameObj = this.dict.get("S");
+    const name = (0, _primitives.isName)(nameObj) ? nameObj.name : "";
+    const {
+      root
+    } = this.tree;
+
+    if (root.roleMap.has(name)) {
+      return root.roleMap.get(name);
+    }
+
+    return name;
+  }
+
+  parseKids() {
+    let pageObjId = null;
+    const objRef = this.dict.getRaw("Pg");
+
+    if ((0, _primitives.isRef)(objRef)) {
+      pageObjId = objRef.toString();
+    }
+
+    const kids = this.dict.get("K");
+
+    if (Array.isArray(kids)) {
+      for (const kid of kids) {
+        const element = this.parseKid(pageObjId, kid);
+
+        if (element) {
+          this.kids.push(element);
+        }
+      }
+    } else {
+      const element = this.parseKid(pageObjId, kids);
+
+      if (element) {
+        this.kids.push(element);
+      }
+    }
+  }
+
+  parseKid(pageObjId, kid) {
+    if (Number.isInteger(kid)) {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+
+      return new StructElement({
+        type: StructElementType.PAGE_CONTENT,
+        mcid: kid,
+        pageObjId
+      });
+    }
+
+    let kidDict = null;
+
+    if ((0, _primitives.isRef)(kid)) {
+      kidDict = this.dict.xref.fetch(kid);
+    } else if ((0, _primitives.isDict)(kid)) {
+      kidDict = kid;
+    }
+
+    if (!kidDict) {
+      return null;
+    }
+
+    const pageRef = kidDict.getRaw("Pg");
+
+    if ((0, _primitives.isRef)(pageRef)) {
+      pageObjId = pageRef.toString();
+    }
+
+    const type = (0, _primitives.isName)(kidDict.get("Type")) ? kidDict.get("Type").name : null;
+
+    if (type === "MCR") {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+
+      return new StructElement({
+        type: StructElementType.STREAM_CONTENT,
+        refObjId: (0, _primitives.isRef)(kidDict.getRaw("Stm")) ? kidDict.getRaw("Stm").toString() : null,
+        pageObjId,
+        mcid: kidDict.get("MCID")
+      });
+    }
+
+    if (type === "OBJR") {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+
+      return new StructElement({
+        type: StructElementType.OBJECT,
+        refObjId: (0, _primitives.isRef)(kidDict.getRaw("Obj")) ? kidDict.getRaw("Obj").toString() : null,
+        pageObjId
+      });
+    }
+
+    return new StructElement({
+      type: StructElementType.ELEMENT,
+      dict: kidDict
+    });
+  }
+
+}
+
+class StructElement {
+  constructor({
+    type,
+    dict = null,
+    mcid = null,
+    pageObjId = null,
+    refObjId = null
+  }) {
+    this.type = type;
+    this.dict = dict;
+    this.mcid = mcid;
+    this.pageObjId = pageObjId;
+    this.refObjId = refObjId;
+    this.parentNode = null;
+  }
+
+}
+
+class StructTreePage {
+  constructor(structTreeRoot, pageDict) {
+    this.root = structTreeRoot;
+    this.rootDict = structTreeRoot ? structTreeRoot.dict : null;
+    this.pageDict = pageDict;
+    this.nodes = [];
+  }
+
+  parse() {
+    if (!this.root || !this.rootDict) {
+      return;
+    }
+
+    const parentTree = this.rootDict.get("ParentTree");
+
+    if (!parentTree) {
+      return;
+    }
+
+    const id = this.pageDict.get("StructParents");
+
+    if (!Number.isInteger(id)) {
+      return;
+    }
+
+    const numberTree = new _name_number_tree.NumberTree(parentTree, this.rootDict.xref);
+    const parentArray = numberTree.get(id);
+
+    if (!Array.isArray(parentArray)) {
+      return;
+    }
+
+    const map = new Map();
+
+    for (const ref of parentArray) {
+      if ((0, _primitives.isRef)(ref)) {
+        this.addNode(this.rootDict.xref.fetch(ref), map);
+      }
+    }
+  }
+
+  addNode(dict, map, level = 0) {
+    if (level > MAX_DEPTH) {
+      (0, _util.warn)("StructTree MAX_DEPTH reached.");
+      return null;
+    }
+
+    if (map.has(dict)) {
+      return map.get(dict);
+    }
+
+    const element = new StructElementNode(this, dict);
+    map.set(dict, element);
+    const parent = dict.get("P");
+
+    if (!parent || (0, _primitives.isName)(parent.get("Type"), "StructTreeRoot")) {
+      if (!this.addTopLevelNode(dict, element)) {
+        map.delete(dict);
+      }
+
+      return element;
+    }
+
+    const parentNode = this.addNode(parent, map, level + 1);
+
+    if (!parentNode) {
+      return element;
+    }
+
+    let save = false;
+
+    for (const kid of parentNode.kids) {
+      if (kid.type === StructElementType.ELEMENT && kid.dict === dict) {
+        kid.parentNode = element;
+        save = true;
+      }
+    }
+
+    if (!save) {
+      map.delete(dict);
+    }
+
+    return element;
+  }
+
+  addTopLevelNode(dict, element) {
+    const obj = this.rootDict.get("K");
+
+    if (!obj) {
+      return false;
+    }
+
+    if ((0, _primitives.isDict)(obj)) {
+      if (obj.objId !== dict.objId) {
+        return false;
+      }
+
+      this.nodes[0] = element;
+      return true;
+    }
+
+    if (!Array.isArray(obj)) {
+      return true;
+    }
+
+    let save = false;
+
+    for (let i = 0; i < obj.length; i++) {
+      const kidRef = obj[i];
+
+      if (kidRef && kidRef.toString() === dict.objId) {
+        this.nodes[i] = element;
+        save = true;
+      }
+    }
+
+    return save;
+  }
+
+  get serializable() {
+    function nodeToSerializable(node, parent, level = 0) {
+      if (level > MAX_DEPTH) {
+        (0, _util.warn)("StructTree too deep to be fully serialized.");
+        return;
+      }
+
+      const obj = Object.create(null);
+      obj.role = node.role;
+      obj.children = [];
+      parent.children.push(obj);
+      const alt = node.dict.get("Alt");
+
+      if ((0, _util.isString)(alt)) {
+        obj.alt = (0, _util.stringToPDFString)(alt);
+      }
+
+      for (const kid of node.kids) {
+        const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null;
+
+        if (kidElement) {
+          nodeToSerializable(kidElement, obj, level + 1);
+          continue;
+        } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === 
StructElementType.STREAM_CONTENT) {
+          obj.children.push({
+            type: "content",
+            id: `page${kid.pageObjId}_mcid${kid.mcid}`
+          });
+        } else if (kid.type === StructElementType.OBJECT) {
+          obj.children.push({
+            type: "object",
+            id: kid.refObjId
+          });
+        }
+      }
+    }
+
+    const root = Object.create(null);
+    root.children = [];
+    root.role = "Root";
+
+    for (const child of this.nodes) {
+      if (!child) {
+        continue;
+      }
+
+      nodeToSerializable(child, root);
+    }
+
+    return root;
+  }
+
+}
+
+exports.StructTreePage = StructTreePage;
+
+/***/ }),
+/* 70 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ObjectLoader = void 0;
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _util = __w_pdfjs_require__(2);
+
+function mayHaveChildren(value) {
+  return value instanceof _primitives.Ref || value instanceof _primitives.Dict || Array.isArray(value) || 
(0, _primitives.isStream)(value);
+}
+
+function addChildren(node, nodesToVisit) {
+  if (node instanceof _primitives.Dict) {
+    node = node.getRawValues();
+  } else if ((0, _primitives.isStream)(node)) {
+    node = node.dict.getRawValues();
+  } else if (!Array.isArray(node)) {
+    return;
+  }
+
+  for (const rawValue of node) {
+    if (mayHaveChildren(rawValue)) {
+      nodesToVisit.push(rawValue);
+    }
+  }
+}
+
+class ObjectLoader {
+  constructor(dict, keys, xref) {
+    this.dict = dict;
+    this.keys = keys;
+    this.xref = xref;
+    this.refSet = null;
+  }
+
+  async load() {
+    if (this.xref.stream.isDataLoaded) {
+      return undefined;
+    }
+
+    const {
+      keys,
+      dict
+    } = this;
+    this.refSet = new _primitives.RefSet();
+    const nodesToVisit = [];
+
+    for (let i = 0, ii = keys.length; i < ii; i++) {
+      const rawValue = dict.getRaw(keys[i]);
+
+      if (rawValue !== undefined) {
+        nodesToVisit.push(rawValue);
+      }
+    }
+
+    return this._walk(nodesToVisit);
+  }
+
+  async _walk(nodesToVisit) {
+    const nodesToRevisit = [];
+    const pendingRequests = [];
+
+    while (nodesToVisit.length) {
+      let currentNode = nodesToVisit.pop();
+
+      if (currentNode instanceof _primitives.Ref) {
+        if (this.refSet.has(currentNode)) {
+          continue;
+        }
+
+        try {
+          this.refSet.put(currentNode);
+          currentNode = this.xref.fetch(currentNode);
+        } catch (ex) {
+          if (!(ex instanceof _core_utils.MissingDataException)) {
+            (0, _util.warn)(`ObjectLoader._walk - requesting all data: "${ex}".`);
+            this.refSet = null;
+            const {
+              manager
+            } = this.xref.stream;
+            return manager.requestAllChunks();
+          }
+
+          nodesToRevisit.push(currentNode);
+          pendingRequests.push({
+            begin: ex.begin,
+            end: ex.end
+          });
+        }
+      }
+
+      if ((0, _primitives.isStream)(currentNode)) {
+        const baseStreams = currentNode.getBaseStreams();
+
+        if (baseStreams) {
+          let foundMissingData = false;
+
+          for (const stream of baseStreams) {
+            if (stream.isDataLoaded) {
+              continue;
+            }
+
+            foundMissingData = true;
+            pendingRequests.push({
+              begin: stream.start,
+              end: stream.end
+            });
+          }
+
+          if (foundMissingData) {
+            nodesToRevisit.push(currentNode);
+          }
+        }
+      }
+
+      addChildren(currentNode, nodesToVisit);
+    }
+
+    if (pendingRequests.length) {
+      await this.xref.stream.manager.requestRanges(pendingRequests);
+
+      for (const node of nodesToRevisit) {
+        if (node instanceof _primitives.Ref) {
+          this.refSet.remove(node);
+        }
+      }
+
+      return this._walk(nodesToRevisit);
+    }
+
+    this.refSet = null;
+    return undefined;
+  }
+
+}
+
+exports.ObjectLoader = ObjectLoader;
+
+/***/ }),
+/* 71 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.incrementalUpdate = incrementalUpdate;
+exports.writeDict = writeDict;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _xml_parser = __w_pdfjs_require__(68);
+
+var _crypto = __w_pdfjs_require__(72);
+
+function writeDict(dict, buffer, transform) {
+  buffer.push("<<");
+
+  for (const key of dict.getKeys()) {
+    buffer.push(` /${(0, _core_utils.escapePDFName)(key)} `);
+    writeValue(dict.getRaw(key), buffer, transform);
+  }
+
+  buffer.push(">>");
+}
+
+function writeStream(stream, buffer, transform) {
+  writeDict(stream.dict, buffer, transform);
+  buffer.push(" stream\n");
+  let string = stream.getString();
+
+  if (transform !== null) {
+    string = transform.encryptString(string);
+  }
+
+  buffer.push(string, "\nendstream\n");
+}
+
+function writeArray(array, buffer, transform) {
+  buffer.push("[");
+  let first = true;
+
+  for (const val of array) {
+    if (!first) {
+      buffer.push(" ");
+    } else {
+      first = false;
+    }
+
+    writeValue(val, buffer, transform);
+  }
+
+  buffer.push("]");
+}
+
+function numberToString(value) {
+  if (Number.isInteger(value)) {
+    return value.toString();
+  }
+
+  const roundedValue = Math.round(value * 100);
+
+  if (roundedValue % 100 === 0) {
+    return (roundedValue / 100).toString();
+  }
+
+  if (roundedValue % 10 === 0) {
+    return value.toFixed(1);
+  }
+
+  return value.toFixed(2);
+}
+
+function writeValue(value, buffer, transform) {
+  if ((0, _primitives.isName)(value)) {
+    buffer.push(`/${(0, _core_utils.escapePDFName)(value.name)}`);
+  } else if ((0, _primitives.isRef)(value)) {
+    buffer.push(`${value.num} ${value.gen} R`);
+  } else if (Array.isArray(value)) {
+    writeArray(value, buffer, transform);
+  } else if (typeof value === "string") {
+    if (transform !== null) {
+      value = transform.encryptString(value);
+    }
+
+    buffer.push(`(${(0, _util.escapeString)(value)})`);
+  } else if (typeof value === "number") {
+    buffer.push(numberToString(value));
+  } else if ((0, _primitives.isDict)(value)) {
+    writeDict(value, buffer, transform);
+  } else if ((0, _primitives.isStream)(value)) {
+    writeStream(value, buffer, transform);
+  }
+}
+
+function writeInt(number, size, offset, buffer) {
+  for (let i = size + offset - 1; i > offset - 1; i--) {
+    buffer[i] = number & 0xff;
+    number >>= 8;
+  }
+
+  return offset + size;
+}
+
+function writeString(string, offset, buffer) {
+  for (let i = 0, len = string.length; i < len; i++) {
+    buffer[offset + i] = string.charCodeAt(i) & 0xff;
+  }
+}
+
+function computeMD5(filesize, xrefInfo) {
+  const time = Math.floor(Date.now() / 1000);
+  const filename = xrefInfo.filename || "";
+  const md5Buffer = [time.toString(), filename, filesize.toString()];
+  let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);
+
+  for (const value of Object.values(xrefInfo.info)) {
+    md5Buffer.push(value);
+    md5BufferLen += value.length;
+  }
+
+  const array = new Uint8Array(md5BufferLen);
+  let offset = 0;
+
+  for (const str of md5Buffer) {
+    writeString(str, offset, array);
+    offset += str.length;
+  }
+
+  return (0, _util.bytesToString)((0, _crypto.calculateMD5)(array));
+}
+
+function writeXFADataForAcroform(str, newRefs) {
+  const xml = new _xml_parser.SimpleXMLParser({
+    hasAttributes: true
+  }).parseFromString(str);
+
+  for (const {
+    xfa
+  } of newRefs) {
+    if (!xfa) {
+      continue;
+    }
+
+    const {
+      path,
+      value
+    } = xfa;
+
+    if (!path) {
+      continue;
+    }
+
+    const node = xml.documentElement.searchNode((0, _core_utils.parseXFAPath)(path), 0);
+
+    if (node) {
+      node.childNodes = [new _xml_parser.SimpleDOMNode("#text", value)];
+    } else {
+      (0, _util.warn)(`Node not found for path: ${path}`);
+    }
+  }
+
+  const buffer = [];
+  xml.documentElement.dump(buffer);
+  return buffer.join("");
+}
+
+function updateXFA(xfaData, datasetsRef, newRefs, xref) {
+  if (datasetsRef === null || xref === null) {
+    return;
+  }
+
+  if (xfaData === null) {
+    const datasets = xref.fetchIfRef(datasetsRef);
+    xfaData = writeXFADataForAcroform(datasets.getString(), newRefs);
+  }
+
+  const encrypt = xref.encrypt;
+
+  if (encrypt) {
+    const transform = encrypt.createCipherTransform(datasetsRef.num, datasetsRef.gen);
+    xfaData = transform.encryptString(xfaData);
+  }
+
+  const data = `${datasetsRef.num} ${datasetsRef.gen} obj\n` + `<< /Type /EmbeddedFile /Length 
${xfaData.length}>>\nstream\n` + xfaData + "\nendstream\nendobj\n";
+  newRefs.push({
+    ref: datasetsRef,
+    data
+  });
+}
+
+function incrementalUpdate({
+  originalData,
+  xrefInfo,
+  newRefs,
+  xref = null,
+  datasetsRef = null,
+  xfaData = null
+}) {
+  updateXFA(xfaData, datasetsRef, newRefs, xref);
+  const newXref = new _primitives.Dict(null);
+  const refForXrefTable = xrefInfo.newRef;
+  let buffer, baseOffset;
+  const lastByte = originalData[originalData.length - 1];
+
+  if (lastByte === 0x0a || lastByte === 0x0d) {
+    buffer = [];
+    baseOffset = originalData.length;
+  } else {
+    buffer = ["\n"];
+    baseOffset = originalData.length + 1;
+  }
+
+  newXref.set("Size", refForXrefTable.num + 1);
+  newXref.set("Prev", xrefInfo.startXRef);
+  newXref.set("Type", _primitives.Name.get("XRef"));
+
+  if (xrefInfo.rootRef !== null) {
+    newXref.set("Root", xrefInfo.rootRef);
+  }
+
+  if (xrefInfo.infoRef !== null) {
+    newXref.set("Info", xrefInfo.infoRef);
+  }
+
+  if (xrefInfo.encryptRef !== null) {
+    newXref.set("Encrypt", xrefInfo.encryptRef);
+  }
+
+  newRefs.push({
+    ref: refForXrefTable,
+    data: ""
+  });
+  newRefs = newRefs.sort((a, b) => {
+    return a.ref.num - b.ref.num;
+  });
+  const xrefTableData = [[0, 1, 0xffff]];
+  const indexes = [0, 1];
+  let maxOffset = 0;
+
+  for (const {
+    ref,
+    data
+  } of newRefs) {
+    maxOffset = Math.max(maxOffset, baseOffset);
+    xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]);
+    baseOffset += data.length;
+    indexes.push(ref.num, 1);
+    buffer.push(data);
+  }
+
+  newXref.set("Index", indexes);
+
+  if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) {
+    const md5 = computeMD5(baseOffset, xrefInfo);
+    newXref.set("ID", [xrefInfo.fileIds[0], md5]);
+  }
+
+  const offsetSize = Math.ceil(Math.log2(maxOffset) / 8);
+  const sizes = [1, offsetSize, 2];
+  const structSize = sizes[0] + sizes[1] + sizes[2];
+  const tableLength = structSize * xrefTableData.length;
+  newXref.set("W", sizes);
+  newXref.set("Length", tableLength);
+  buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\n`);
+  writeDict(newXref, buffer, null);
+  buffer.push(" stream\n");
+  const bufferLen = buffer.reduce((a, str) => a + str.length, 0);
+  const footer = `\nendstream\nendobj\nstartxref\n${baseOffset}\n%%EOF\n`;
+  const array = new Uint8Array(originalData.length + bufferLen + tableLength + footer.length);
+  array.set(originalData);
+  let offset = originalData.length;
+
+  for (const str of buffer) {
+    writeString(str, offset, array);
+    offset += str.length;
+  }
+
+  for (const [type, objOffset, gen] of xrefTableData) {
+    offset = writeInt(type, sizes[0], offset, array);
+    offset = writeInt(objOffset, sizes[1], offset, array);
+    offset = writeInt(gen, sizes[2], offset, array);
+  }
+
+  writeString(footer, offset, array);
+  return array;
+}
+
+/***/ }),
+/* 72 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.calculateSHA384 = calculateSHA384;
+exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.calculateSHA512 = 
exports.calculateSHA256 = exports.calculateMD5 = exports.ARCFourCipher = exports.AES256Cipher = 
exports.AES128Cipher = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _decrypt_stream = __w_pdfjs_require__(73);
+
+class ARCFourCipher {
+  constructor(key) {
+    this.a = 0;
+    this.b = 0;
+    const s = new Uint8Array(256);
+    const keyLength = key.length;
+
+    for (let i = 0; i < 256; ++i) {
+      s[i] = i;
+    }
+
+    for (let i = 0, j = 0; i < 256; ++i) {
+      const tmp = s[i];
+      j = j + tmp + key[i % keyLength] & 0xff;
+      s[i] = s[j];
+      s[j] = tmp;
+    }
+
+    this.s = s;
+  }
+
+  encryptBlock(data) {
+    let a = this.a,
+        b = this.b;
+    const s = this.s;
+    const n = data.length;
+    const output = new Uint8Array(n);
+
+    for (let i = 0; i < n; ++i) {
+      a = a + 1 & 0xff;
+      const tmp = s[a];
+      b = b + tmp & 0xff;
+      const tmp2 = s[b];
+      s[a] = tmp2;
+      s[b] = tmp;
+      output[i] = data[i] ^ s[tmp + tmp2 & 0xff];
+    }
+
+    this.a = a;
+    this.b = b;
+    return output;
+  }
+
+  decryptBlock(data) {
+    return this.encryptBlock(data);
+  }
+
+  encrypt(data) {
+    return this.encryptBlock(data);
+  }
+
+}
+
+exports.ARCFourCipher = ARCFourCipher;
+
+const calculateMD5 = function calculateMD5Closure() {
+  const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 
14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 
21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+  const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, 
-1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 
1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 
568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, 
-2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, 
-722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, 
-57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 
-145523070, -1120210379, 718787259, -343485551]);
+
+  function hash(data, offset, length) {
+    let h0 = 1732584193,
+        h1 = -271733879,
+        h2 = -1732584194,
+        h3 = 271733878;
+    const paddedLength = length + 72 & ~63;
+    const padded = new Uint8Array(paddedLength);
+    let i, j;
+
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+
+    padded[i++] = 0x80;
+    const n = paddedLength - 8;
+
+    while (i < n) {
+      padded[i++] = 0;
+    }
+
+    padded[i++] = length << 3 & 0xff;
+    padded[i++] = length >> 5 & 0xff;
+    padded[i++] = length >> 13 & 0xff;
+    padded[i++] = length >> 21 & 0xff;
+    padded[i++] = length >>> 29 & 0xff;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    const w = new Int32Array(16);
+
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j, i += 4) {
+        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
+      }
+
+      let a = h0,
+          b = h1,
+          c = h2,
+          d = h3,
+          f,
+          g;
+
+      for (j = 0; j < 64; ++j) {
+        if (j < 16) {
+          f = b & c | ~b & d;
+          g = j;
+        } else if (j < 32) {
+          f = d & b | ~d & c;
+          g = 5 * j + 1 & 15;
+        } else if (j < 48) {
+          f = b ^ c ^ d;
+          g = 3 * j + 5 & 15;
+        } else {
+          f = c ^ (b | ~d);
+          g = 7 * j & 15;
+        }
+
+        const tmp = d,
+              rotateArg = a + f + k[j] + w[g] | 0,
+              rotate = r[j];
+        d = c;
+        c = b;
+        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
+        a = tmp;
+      }
+
+      h0 = h0 + a | 0;
+      h1 = h1 + b | 0;
+      h2 = h2 + c | 0;
+      h3 = h3 + d | 0;
+    }
+
+    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 
& 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 
0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
+  }
+
+  return hash;
+}();
+
+exports.calculateMD5 = calculateMD5;
+
+class Word64 {
+  constructor(highInteger, lowInteger) {
+    this.high = highInteger | 0;
+    this.low = lowInteger | 0;
+  }
+
+  and(word) {
+    this.high &= word.high;
+    this.low &= word.low;
+  }
+
+  xor(word) {
+    this.high ^= word.high;
+    this.low ^= word.low;
+  }
+
+  or(word) {
+    this.high |= word.high;
+    this.low |= word.low;
+  }
+
+  shiftRight(places) {
+    if (places >= 32) {
+      this.low = this.high >>> places - 32 | 0;
+      this.high = 0;
+    } else {
+      this.low = this.low >>> places | this.high << 32 - places;
+      this.high = this.high >>> places | 0;
+    }
+  }
+
+  shiftLeft(places) {
+    if (places >= 32) {
+      this.high = this.low << places - 32;
+      this.low = 0;
+    } else {
+      this.high = this.high << places | this.low >>> 32 - places;
+      this.low <<= places;
+    }
+  }
+
+  rotateRight(places) {
+    let low, high;
+
+    if (places & 32) {
+      high = this.low;
+      low = this.high;
+    } else {
+      low = this.low;
+      high = this.high;
+    }
+
+    places &= 31;
+    this.low = low >>> places | high << 32 - places;
+    this.high = high >>> places | low << 32 - places;
+  }
+
+  not() {
+    this.high = ~this.high;
+    this.low = ~this.low;
+  }
+
+  add(word) {
+    const lowAdd = (this.low >>> 0) + (word.low >>> 0);
+    let highAdd = (this.high >>> 0) + (word.high >>> 0);
+
+    if (lowAdd > 0xffffffff) {
+      highAdd += 1;
+    }
+
+    this.low = lowAdd | 0;
+    this.high = highAdd | 0;
+  }
+
+  copyTo(bytes, offset) {
+    bytes[offset] = this.high >>> 24 & 0xff;
+    bytes[offset + 1] = this.high >> 16 & 0xff;
+    bytes[offset + 2] = this.high >> 8 & 0xff;
+    bytes[offset + 3] = this.high & 0xff;
+    bytes[offset + 4] = this.low >>> 24 & 0xff;
+    bytes[offset + 5] = this.low >> 16 & 0xff;
+    bytes[offset + 6] = this.low >> 8 & 0xff;
+    bytes[offset + 7] = this.low & 0xff;
+  }
+
+  assign(word) {
+    this.high = word.high;
+    this.low = word.low;
+  }
+
+}
+
+const calculateSHA256 = function calculateSHA256Closure() {
+  function rotr(x, n) {
+    return x >>> n | x << 32 - n;
+  }
+
+  function ch(x, y, z) {
+    return x & y ^ ~x & z;
+  }
+
+  function maj(x, y, z) {
+    return x & y ^ x & z ^ y & z;
+  }
+
+  function sigma(x) {
+    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
+  }
+
+  function sigmaPrime(x) {
+    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
+  }
+
+  function littleSigma(x) {
+    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
+  }
+
+  function littleSigmaPrime(x) {
+    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
+  }
+
+  const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 
0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 
0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 
0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 
0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 
0xbef9a3f7, 0xc67178f2];
+
+  function hash(data, offset, length) {
+    let h0 = 0x6a09e667,
+        h1 = 0xbb67ae85,
+        h2 = 0x3c6ef372,
+        h3 = 0xa54ff53a,
+        h4 = 0x510e527f,
+        h5 = 0x9b05688c,
+        h6 = 0x1f83d9ab,
+        h7 = 0x5be0cd19;
+    const paddedLength = Math.ceil((length + 9) / 64) * 64;
+    const padded = new Uint8Array(paddedLength);
+    let i, j;
+
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+
+    padded[i++] = 0x80;
+    const n = paddedLength - 8;
+
+    while (i < n) {
+      padded[i++] = 0;
+    }
+
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = length >>> 29 & 0xff;
+    padded[i++] = length >> 21 & 0xff;
+    padded[i++] = length >> 13 & 0xff;
+    padded[i++] = length >> 5 & 0xff;
+    padded[i++] = length << 3 & 0xff;
+    const w = new Uint32Array(64);
+
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j) {
+        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+        i += 4;
+      }
+
+      for (j = 16; j < 64; ++j) {
+        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
+      }
+
+      let a = h0,
+          b = h1,
+          c = h2,
+          d = h3,
+          e = h4,
+          f = h5,
+          g = h6,
+          h = h7,
+          t1,
+          t2;
+
+      for (j = 0; j < 64; ++j) {
+        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
+        t2 = sigma(a) + maj(a, b, c);
+        h = g;
+        g = f;
+        f = e;
+        e = d + t1 | 0;
+        d = c;
+        c = b;
+        b = a;
+        a = t1 + t2 | 0;
+      }
+
+      h0 = h0 + a | 0;
+      h1 = h1 + b | 0;
+      h2 = h2 + c | 0;
+      h3 = h3 + d | 0;
+      h4 = h4 + e | 0;
+      h5 = h5 + f | 0;
+      h6 = h6 + g | 0;
+      h7 = h7 + h | 0;
+    }
+
+    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 
16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 
24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 
0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 
& 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
+  }
+
+  return hash;
+}();
+
+exports.calculateSHA256 = calculateSHA256;
+
+const calculateSHA512 = function calculateSHA512Closure() {
+  function ch(result, x, y, z, tmp) {
+    result.assign(x);
+    result.and(y);
+    tmp.assign(x);
+    tmp.not();
+    tmp.and(z);
+    result.xor(tmp);
+  }
+
+  function maj(result, x, y, z, tmp) {
+    result.assign(x);
+    result.and(y);
+    tmp.assign(x);
+    tmp.and(z);
+    result.xor(tmp);
+    tmp.assign(y);
+    tmp.and(z);
+    result.xor(tmp);
+  }
+
+  function sigma(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(28);
+    tmp.assign(x);
+    tmp.rotateRight(34);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.rotateRight(39);
+    result.xor(tmp);
+  }
+
+  function sigmaPrime(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(14);
+    tmp.assign(x);
+    tmp.rotateRight(18);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.rotateRight(41);
+    result.xor(tmp);
+  }
+
+  function littleSigma(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(1);
+    tmp.assign(x);
+    tmp.rotateRight(8);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.shiftRight(7);
+    result.xor(tmp);
+  }
+
+  function littleSigmaPrime(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(19);
+    tmp.assign(x);
+    tmp.rotateRight(61);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.shiftRight(6);
+    result.xor(tmp);
+  }
+
+  const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 
0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 
0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 
0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 
0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 
0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 
0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 
0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 
0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 
0x98fb213f), new Word64(0
 xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new 
Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new 
Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new 
Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new 
Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new 
Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new 
Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new 
Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new 
Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new 
Word64(0x5b9cca4f, 0x7763e373), n
 ew Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), 
new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), 
new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), 
new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), 
new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), 
new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), 
new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), 
new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), 
new Word64(0x6c44198c, 0x4a475817)];
+
+  function hash(data, offset, length, mode384 = false) {
+    let h0, h1, h2, h3, h4, h5, h6, h7;
+
+    if (!mode384) {
+      h0 = new Word64(0x6a09e667, 0xf3bcc908);
+      h1 = new Word64(0xbb67ae85, 0x84caa73b);
+      h2 = new Word64(0x3c6ef372, 0xfe94f82b);
+      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
+      h4 = new Word64(0x510e527f, 0xade682d1);
+      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
+      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
+      h7 = new Word64(0x5be0cd19, 0x137e2179);
+    } else {
+      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
+      h1 = new Word64(0x629a292a, 0x367cd507);
+      h2 = new Word64(0x9159015a, 0x3070dd17);
+      h3 = new Word64(0x152fecd8, 0xf70e5939);
+      h4 = new Word64(0x67332667, 0xffc00b31);
+      h5 = new Word64(0x8eb44a87, 0x68581511);
+      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
+      h7 = new Word64(0x47b5481d, 0xbefa4fa4);
+    }
+
+    const paddedLength = Math.ceil((length + 17) / 128) * 128;
+    const padded = new Uint8Array(paddedLength);
+    let i, j;
+
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+
+    padded[i++] = 0x80;
+    const n = paddedLength - 16;
+
+    while (i < n) {
+      padded[i++] = 0;
+    }
+
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = length >>> 29 & 0xff;
+    padded[i++] = length >> 21 & 0xff;
+    padded[i++] = length >> 13 & 0xff;
+    padded[i++] = length >> 5 & 0xff;
+    padded[i++] = length << 3 & 0xff;
+    const w = new Array(80);
+
+    for (i = 0; i < 80; i++) {
+      w[i] = new Word64(0, 0);
+    }
+
+    let a = new Word64(0, 0),
+        b = new Word64(0, 0),
+        c = new Word64(0, 0);
+    let d = new Word64(0, 0),
+        e = new Word64(0, 0),
+        f = new Word64(0, 0);
+    let g = new Word64(0, 0),
+        h = new Word64(0, 0);
+    const t1 = new Word64(0, 0),
+          t2 = new Word64(0, 0);
+    const tmp1 = new Word64(0, 0),
+          tmp2 = new Word64(0, 0);
+    let tmp3;
+
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j) {
+        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
+        i += 8;
+      }
+
+      for (j = 16; j < 80; ++j) {
+        tmp3 = w[j];
+        littleSigmaPrime(tmp3, w[j - 2], tmp2);
+        tmp3.add(w[j - 7]);
+        littleSigma(tmp1, w[j - 15], tmp2);
+        tmp3.add(tmp1);
+        tmp3.add(w[j - 16]);
+      }
+
+      a.assign(h0);
+      b.assign(h1);
+      c.assign(h2);
+      d.assign(h3);
+      e.assign(h4);
+      f.assign(h5);
+      g.assign(h6);
+      h.assign(h7);
+
+      for (j = 0; j < 80; ++j) {
+        t1.assign(h);
+        sigmaPrime(tmp1, e, tmp2);
+        t1.add(tmp1);
+        ch(tmp1, e, f, g, tmp2);
+        t1.add(tmp1);
+        t1.add(k[j]);
+        t1.add(w[j]);
+        sigma(t2, a, tmp2);
+        maj(tmp1, a, b, c, tmp2);
+        t2.add(tmp1);
+        tmp3 = h;
+        h = g;
+        g = f;
+        f = e;
+        d.add(t1);
+        e = d;
+        d = c;
+        c = b;
+        b = a;
+        tmp3.assign(t1);
+        tmp3.add(t2);
+        a = tmp3;
+      }
+
+      h0.add(a);
+      h1.add(b);
+      h2.add(c);
+      h3.add(d);
+      h4.add(e);
+      h5.add(f);
+      h6.add(g);
+      h7.add(h);
+    }
+
+    let result;
+
+    if (!mode384) {
+      result = new Uint8Array(64);
+      h0.copyTo(result, 0);
+      h1.copyTo(result, 8);
+      h2.copyTo(result, 16);
+      h3.copyTo(result, 24);
+      h4.copyTo(result, 32);
+      h5.copyTo(result, 40);
+      h6.copyTo(result, 48);
+      h7.copyTo(result, 56);
+    } else {
+      result = new Uint8Array(48);
+      h0.copyTo(result, 0);
+      h1.copyTo(result, 8);
+      h2.copyTo(result, 16);
+      h3.copyTo(result, 24);
+      h4.copyTo(result, 32);
+      h5.copyTo(result, 40);
+    }
+
+    return result;
+  }
+
+  return hash;
+}();
+
+exports.calculateSHA512 = calculateSHA512;
+
+function calculateSHA384(data, offset, length) {
+  return calculateSHA512(data, offset, length, true);
+}
+
+class NullCipher {
+  decryptBlock(data) {
+    return data;
+  }
+
+  encrypt(data) {
+    return data;
+  }
+
+}
+
+class AESBaseCipher {
+  constructor() {
+    if (this.constructor === AESBaseCipher) {
+      (0, _util.unreachable)("Cannot initialize AESBaseCipher.");
+    }
+
+    this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 
0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 
0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 
0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 
0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 
0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 
0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 
0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 
0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 
0x5e, 0x0b, 0xdb, 0xe0, 0
 x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 
0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 
0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 
0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 
0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 
0x0f, 0xb0, 0x54, 0xbb, 0x16]);
+    this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 
0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 
0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 
0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 
0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 
0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 
0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 
0x1c, 0x75, 0xdf, 0x6e, 0x4
 7, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 
0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 
0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 
0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 
0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
+    this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 
0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 
0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 
0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 
0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 
0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 
0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 
0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 
0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 
0xf9082b94, 0xf701269f, 0x4d
 e6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 
0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 
0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 
0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 
0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 
0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 
0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 
0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 
0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 
0x94de6c87, 0x86c57b9a, 0x88c
 c7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 
0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 
0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 
0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 
0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 
0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 
0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 
0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 
0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 
0xef15e8e6, 0xe11ce5ed, 0xf307
 f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 
0x8d4697a3]);
+    this._mixCol = new Uint8Array(256);
+
+    for (let i = 0; i < 256; i++) {
+      if (i < 128) {
+        this._mixCol[i] = i << 1;
+      } else {
+        this._mixCol[i] = i << 1 ^ 0x1b;
+      }
+    }
+
+    this.buffer = new Uint8Array(16);
+    this.bufferPosition = 0;
+  }
+
+  _expandKey(cipherKey) {
+    (0, _util.unreachable)("Cannot call `_expandKey` on the base class");
+  }
+
+  _decrypt(input, key) {
+    let t, u, v;
+    const state = new Uint8Array(16);
+    state.set(input);
+
+    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
+      state[j] ^= key[k];
+    }
+
+    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {
+      t = state[13];
+      state[13] = state[9];
+      state[9] = state[5];
+      state[5] = state[1];
+      state[1] = t;
+      t = state[14];
+      u = state[10];
+      state[14] = state[6];
+      state[10] = state[2];
+      state[6] = t;
+      state[2] = u;
+      t = state[15];
+      u = state[11];
+      v = state[7];
+      state[15] = state[3];
+      state[11] = t;
+      state[7] = u;
+      state[3] = v;
+
+      for (let j = 0; j < 16; ++j) {
+        state[j] = this._inv_s[state[j]];
+      }
+
+      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+
+      for (let j = 0; j < 16; j += 4) {
+        const s0 = this._mix[state[j]];
+        const s1 = this._mix[state[j + 1]];
+        const s2 = this._mix[state[j + 2]];
+        const s3 = this._mix[state[j + 3]];
+        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
+        state[j] = t >>> 24 & 0xff;
+        state[j + 1] = t >> 16 & 0xff;
+        state[j + 2] = t >> 8 & 0xff;
+        state[j + 3] = t & 0xff;
+      }
+    }
+
+    t = state[13];
+    state[13] = state[9];
+    state[9] = state[5];
+    state[5] = state[1];
+    state[1] = t;
+    t = state[14];
+    u = state[10];
+    state[14] = state[6];
+    state[10] = state[2];
+    state[6] = t;
+    state[2] = u;
+    t = state[15];
+    u = state[11];
+    v = state[7];
+    state[15] = state[3];
+    state[11] = t;
+    state[7] = u;
+    state[3] = v;
+
+    for (let j = 0; j < 16; ++j) {
+      state[j] = this._inv_s[state[j]];
+      state[j] ^= key[j];
+    }
+
+    return state;
+  }
+
+  _encrypt(input, key) {
+    const s = this._s;
+    let t, u, v;
+    const state = new Uint8Array(16);
+    state.set(input);
+
+    for (let j = 0; j < 16; ++j) {
+      state[j] ^= key[j];
+    }
+
+    for (let i = 1; i < this._cyclesOfRepetition; i++) {
+      for (let j = 0; j < 16; ++j) {
+        state[j] = s[state[j]];
+      }
+
+      v = state[1];
+      state[1] = state[5];
+      state[5] = state[9];
+      state[9] = state[13];
+      state[13] = v;
+      v = state[2];
+      u = state[6];
+      state[2] = state[10];
+      state[6] = state[14];
+      state[10] = v;
+      state[14] = u;
+      v = state[3];
+      u = state[7];
+      t = state[11];
+      state[3] = state[15];
+      state[7] = v;
+      state[11] = u;
+      state[15] = t;
+
+      for (let j = 0; j < 16; j += 4) {
+        const s0 = state[j + 0];
+        const s1 = state[j + 1];
+        const s2 = state[j + 2];
+        const s3 = state[j + 3];
+        t = s0 ^ s1 ^ s2 ^ s3;
+        state[j + 0] ^= t ^ this._mixCol[s0 ^ s1];
+        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];
+        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];
+        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];
+      }
+
+      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+    }
+
+    for (let j = 0; j < 16; ++j) {
+      state[j] = s[state[j]];
+    }
+
+    v = state[1];
+    state[1] = state[5];
+    state[5] = state[9];
+    state[9] = state[13];
+    state[13] = v;
+    v = state[2];
+    u = state[6];
+    state[2] = state[10];
+    state[6] = state[14];
+    state[10] = v;
+    state[14] = u;
+    v = state[3];
+    u = state[7];
+    t = state[11];
+    state[3] = state[15];
+    state[7] = v;
+    state[11] = u;
+    state[15] = t;
+
+    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
+      state[j] ^= key[k];
+    }
+
+    return state;
+  }
+
+  _decryptBlock2(data, finalize) {
+    const sourceLength = data.length;
+    let buffer = this.buffer,
+        bufferLength = this.bufferPosition;
+    const result = [];
+    let iv = this.iv;
+
+    for (let i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+
+      if (bufferLength < 16) {
+        continue;
+      }
+
+      const plain = this._decrypt(buffer, this._key);
+
+      for (let j = 0; j < 16; ++j) {
+        plain[j] ^= iv[j];
+      }
+
+      iv = buffer;
+      result.push(plain);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+
+    if (result.length === 0) {
+      return new Uint8Array(0);
+    }
+
+    let outputLength = 16 * result.length;
+
+    if (finalize) {
+      const lastBlock = result[result.length - 1];
+      let psLen = lastBlock[15];
+
+      if (psLen <= 16) {
+        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {
+          if (lastBlock[i] !== psLen) {
+            psLen = 0;
+            break;
+          }
+        }
+
+        outputLength -= psLen;
+        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
+      }
+    }
+
+    const output = new Uint8Array(outputLength);
+
+    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+      output.set(result[i], j);
+    }
+
+    return output;
+  }
+
+  decryptBlock(data, finalize, iv = null) {
+    const sourceLength = data.length;
+    const buffer = this.buffer;
+    let bufferLength = this.bufferPosition;
+
+    if (iv) {
+      this.iv = iv;
+    } else {
+      for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
+        buffer[bufferLength] = data[i];
+      }
+
+      if (bufferLength < 16) {
+        this.bufferLength = bufferLength;
+        return new Uint8Array(0);
+      }
+
+      this.iv = buffer;
+      data = data.subarray(16);
+    }
+
+    this.buffer = new Uint8Array(16);
+    this.bufferLength = 0;
+    this.decryptBlock = this._decryptBlock2;
+    return this.decryptBlock(data, finalize);
+  }
+
+  encrypt(data, iv) {
+    const sourceLength = data.length;
+    let buffer = this.buffer,
+        bufferLength = this.bufferPosition;
+    const result = [];
+
+    if (!iv) {
+      iv = new Uint8Array(16);
+    }
+
+    for (let i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+
+      if (bufferLength < 16) {
+        continue;
+      }
+
+      for (let j = 0; j < 16; ++j) {
+        buffer[j] ^= iv[j];
+      }
+
+      const cipher = this._encrypt(buffer, this._key);
+
+      iv = cipher;
+      result.push(cipher);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+
+    if (result.length === 0) {
+      return new Uint8Array(0);
+    }
+
+    const outputLength = 16 * result.length;
+    const output = new Uint8Array(outputLength);
+
+    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+      output.set(result[i], j);
+    }
+
+    return output;
+  }
+
+}
+
+class AES128Cipher extends AESBaseCipher {
+  constructor(key) {
+    super();
+    this._cyclesOfRepetition = 10;
+    this._keySize = 160;
+    this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 
0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 
0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 
0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 
0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 
0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 
0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 
0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 
0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 
0x04, 0x08, 0x10, 0x20, 0x40
 , 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 
0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 
0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 
0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 
0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 
0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
+    this._key = this._expandKey(key);
+  }
+
+  _expandKey(cipherKey) {
+    const b = 176;
+    const s = this._s;
+    const rcon = this._rcon;
+    const result = new Uint8Array(b);
+    result.set(cipherKey);
+
+    for (let j = 16, i = 1; j < b; ++i) {
+      let t1 = result[j - 3];
+      let t2 = result[j - 2];
+      let t3 = result[j - 1];
+      let t4 = result[j - 4];
+      t1 = s[t1];
+      t2 = s[t2];
+      t3 = s[t3];
+      t4 = s[t4];
+      t1 ^= rcon[i];
+
+      for (let n = 0; n < 4; ++n) {
+        result[j] = t1 ^= result[j - 16];
+        j++;
+        result[j] = t2 ^= result[j - 16];
+        j++;
+        result[j] = t3 ^= result[j - 16];
+        j++;
+        result[j] = t4 ^= result[j - 16];
+        j++;
+      }
+    }
+
+    return result;
+  }
+
+}
+
+exports.AES128Cipher = AES128Cipher;
+
+class AES256Cipher extends AESBaseCipher {
+  constructor(key) {
+    super();
+    this._cyclesOfRepetition = 14;
+    this._keySize = 224;
+    this._key = this._expandKey(key);
+  }
+
+  _expandKey(cipherKey) {
+    const b = 240;
+    const s = this._s;
+    const result = new Uint8Array(b);
+    result.set(cipherKey);
+    let r = 1;
+    let t1, t2, t3, t4;
+
+    for (let j = 32, i = 1; j < b; ++i) {
+      if (j % 32 === 16) {
+        t1 = s[t1];
+        t2 = s[t2];
+        t3 = s[t3];
+        t4 = s[t4];
+      } else if (j % 32 === 0) {
+        t1 = result[j - 3];
+        t2 = result[j - 2];
+        t3 = result[j - 1];
+        t4 = result[j - 4];
+        t1 = s[t1];
+        t2 = s[t2];
+        t3 = s[t3];
+        t4 = s[t4];
+        t1 ^= r;
+
+        if ((r <<= 1) >= 256) {
+          r = (r ^ 0x1b) & 0xff;
+        }
+      }
+
+      for (let n = 0; n < 4; ++n) {
+        result[j] = t1 ^= result[j - 32];
+        j++;
+        result[j] = t2 ^= result[j - 32];
+        j++;
+        result[j] = t3 ^= result[j - 32];
+        j++;
+        result[j] = t4 ^= result[j - 32];
+        j++;
+      }
+    }
+
+    return result;
+  }
+
+}
+
+exports.AES256Cipher = AES256Cipher;
+
+class PDF17 {
+  checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
+    const hashData = new Uint8Array(password.length + 56);
+    hashData.set(password, 0);
+    hashData.set(ownerValidationSalt, password.length);
+    hashData.set(userBytes, password.length + ownerValidationSalt.length);
+    const result = calculateSHA256(hashData, 0, hashData.length);
+    return (0, _util.isArrayEqual)(result, ownerPassword);
+  }
+
+  checkUserPassword(password, userValidationSalt, userPassword) {
+    const hashData = new Uint8Array(password.length + 8);
+    hashData.set(password, 0);
+    hashData.set(userValidationSalt, password.length);
+    const result = calculateSHA256(hashData, 0, hashData.length);
+    return (0, _util.isArrayEqual)(result, userPassword);
+  }
+
+  getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
+    const hashData = new Uint8Array(password.length + 56);
+    hashData.set(password, 0);
+    hashData.set(ownerKeySalt, password.length);
+    hashData.set(userBytes, password.length + ownerKeySalt.length);
+    const key = calculateSHA256(hashData, 0, hashData.length);
+    const cipher = new AES256Cipher(key);
+    return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
+  }
+
+  getUserKey(password, userKeySalt, userEncryption) {
+    const hashData = new Uint8Array(password.length + 8);
+    hashData.set(password, 0);
+    hashData.set(userKeySalt, password.length);
+    const key = calculateSHA256(hashData, 0, hashData.length);
+    const cipher = new AES256Cipher(key);
+    return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+  }
+
+}
+
+exports.PDF17 = PDF17;
+
+const PDF20 = function PDF20Closure() {
+  function calculatePDF20Hash(password, input, userBytes) {
+    let k = calculateSHA256(input, 0, input.length).subarray(0, 32);
+    let e = [0];
+    let i = 0;
+
+    while (i < 64 || e[e.length - 1] > i - 32) {
+      const combinedLength = password.length + k.length + userBytes.length,
+            combinedArray = new Uint8Array(combinedLength);
+      let writeOffset = 0;
+      combinedArray.set(password, writeOffset);
+      writeOffset += password.length;
+      combinedArray.set(k, writeOffset);
+      writeOffset += k.length;
+      combinedArray.set(userBytes, writeOffset);
+      const k1 = new Uint8Array(combinedLength * 64);
+
+      for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) {
+        k1.set(combinedArray, pos);
+      }
+
+      const cipher = new AES128Cipher(k.subarray(0, 16));
+      e = cipher.encrypt(k1, k.subarray(16, 32));
+      let remainder = 0;
+
+      for (let z = 0; z < 16; z++) {
+        remainder *= 256 % 3;
+        remainder %= 3;
+        remainder += (e[z] >>> 0) % 3;
+        remainder %= 3;
+      }
+
+      if (remainder === 0) {
+        k = calculateSHA256(e, 0, e.length);
+      } else if (remainder === 1) {
+        k = calculateSHA384(e, 0, e.length);
+      } else if (remainder === 2) {
+        k = calculateSHA512(e, 0, e.length);
+      }
+
+      i++;
+    }
+
+    return k.subarray(0, 32);
+  }
+
+  class PDF20 {
+    hash(password, concatBytes, userBytes) {
+      return calculatePDF20Hash(password, concatBytes, userBytes);
+    }
+
+    checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
+      const hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerValidationSalt, password.length);
+      hashData.set(userBytes, password.length + ownerValidationSalt.length);
+      const result = calculatePDF20Hash(password, hashData, userBytes);
+      return (0, _util.isArrayEqual)(result, ownerPassword);
+    }
+
+    checkUserPassword(password, userValidationSalt, userPassword) {
+      const hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userValidationSalt, password.length);
+      const result = calculatePDF20Hash(password, hashData, []);
+      return (0, _util.isArrayEqual)(result, userPassword);
+    }
+
+    getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
+      const hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerKeySalt, password.length);
+      hashData.set(userBytes, password.length + ownerKeySalt.length);
+      const key = calculatePDF20Hash(password, hashData, userBytes);
+      const cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
+    }
+
+    getUserKey(password, userKeySalt, userEncryption) {
+      const hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userKeySalt, password.length);
+      const key = calculatePDF20Hash(password, hashData, []);
+      const cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+    }
+
+  }
+
+  return PDF20;
+}();
+
+exports.PDF20 = PDF20;
+
+class CipherTransform {
+  constructor(stringCipherConstructor, streamCipherConstructor) {
+    this.StringCipherConstructor = stringCipherConstructor;
+    this.StreamCipherConstructor = streamCipherConstructor;
+  }
+
+  createStream(stream, length) {
+    const cipher = new this.StreamCipherConstructor();
+    return new _decrypt_stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, 
finalize) {
+      return cipher.decryptBlock(data, finalize);
+    });
+  }
+
+  decryptString(s) {
+    const cipher = new this.StringCipherConstructor();
+    let data = (0, _util.stringToBytes)(s);
+    data = cipher.decryptBlock(data, true);
+    return (0, _util.bytesToString)(data);
+  }
+
+  encryptString(s) {
+    const cipher = new this.StringCipherConstructor();
+
+    if (cipher instanceof AESBaseCipher) {
+      const strLen = s.length;
+      const pad = 16 - strLen % 16;
+
+      if (pad !== 16) {
+        s = s.padEnd(16 * Math.ceil(strLen / 16), String.fromCharCode(pad));
+      }
+
+      const iv = new Uint8Array(16);
+
+      if (typeof crypto !== "undefined") {
+        crypto.getRandomValues(iv);
+      } else {
+        for (let i = 0; i < 16; i++) {
+          iv[i] = Math.floor(256 * Math.random());
+        }
+      }
+
+      let data = (0, _util.stringToBytes)(s);
+      data = cipher.encrypt(data, iv);
+      const buf = new Uint8Array(16 + data.length);
+      buf.set(iv);
+      buf.set(data, 16);
+      return (0, _util.bytesToString)(buf);
+    }
+
+    let data = (0, _util.stringToBytes)(s);
+    data = cipher.encrypt(data);
+    return (0, _util.bytesToString)(data);
+  }
+
+}
+
+const CipherTransformFactory = function CipherTransformFactoryClosure() {
+  const defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 
0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 
0x64, 0x53, 0x69, 0x7a]);
+
+  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, 
uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
+    if (password) {
+      const passwordLength = Math.min(127, password.length);
+      password = password.subarray(0, passwordLength);
+    } else {
+      password = [];
+    }
+
+    let pdfAlgorithm;
+
+    if (revision === 6) {
+      pdfAlgorithm = new PDF20();
+    } else {
+      pdfAlgorithm = new PDF17();
+    }
+
+    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
+      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
+    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, 
ownerPassword)) {
+      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
+    }
+
+    return null;
+  }
+
+  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, 
encryptMetadata) {
+    const hashDataSize = 40 + ownerPassword.length + fileId.length;
+    const hashData = new Uint8Array(hashDataSize);
+    let i = 0,
+        j,
+        n;
+
+    if (password) {
+      n = Math.min(32, password.length);
+
+      for (; i < n; ++i) {
+        hashData[i] = password[i];
+      }
+    }
+
+    j = 0;
+
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+
+    for (j = 0, n = ownerPassword.length; j < n; ++j) {
+      hashData[i++] = ownerPassword[j];
+    }
+
+    hashData[i++] = flags & 0xff;
+    hashData[i++] = flags >> 8 & 0xff;
+    hashData[i++] = flags >> 16 & 0xff;
+    hashData[i++] = flags >>> 24 & 0xff;
+
+    for (j = 0, n = fileId.length; j < n; ++j) {
+      hashData[i++] = fileId[j];
+    }
+
+    if (revision >= 4 && !encryptMetadata) {
+      hashData[i++] = 0xff;
+      hashData[i++] = 0xff;
+      hashData[i++] = 0xff;
+      hashData[i++] = 0xff;
+    }
+
+    let hash = calculateMD5(hashData, 0, i);
+    const keyLengthInBytes = keyLength >> 3;
+
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, keyLengthInBytes);
+      }
+    }
+
+    const encryptionKey = hash.subarray(0, keyLengthInBytes);
+    let cipher, checkData;
+
+    if (revision >= 3) {
+      for (i = 0; i < 32; ++i) {
+        hashData[i] = defaultPasswordBytes[i];
+      }
+
+      for (j = 0, n = fileId.length; j < n; ++j) {
+        hashData[i++] = fileId[j];
+      }
+
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+      n = encryptionKey.length;
+      const derivedKey = new Uint8Array(n);
+
+      for (j = 1; j <= 19; ++j) {
+        for (let k = 0; k < n; ++k) {
+          derivedKey[k] = encryptionKey[k] ^ j;
+        }
+
+        cipher = new ARCFourCipher(derivedKey);
+        checkData = cipher.encryptBlock(checkData);
+      }
+
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] !== checkData[j]) {
+          return null;
+        }
+      }
+    } else {
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(defaultPasswordBytes);
+
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] !== checkData[j]) {
+          return null;
+        }
+      }
+    }
+
+    return encryptionKey;
+  }
+
+  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
+    const hashData = new Uint8Array(32);
+    let i = 0;
+    const n = Math.min(32, password.length);
+
+    for (; i < n; ++i) {
+      hashData[i] = password[i];
+    }
+
+    let j = 0;
+
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+
+    let hash = calculateMD5(hashData, 0, i);
+    const keyLengthInBytes = keyLength >> 3;
+
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, hash.length);
+      }
+    }
+
+    let cipher, userPassword;
+
+    if (revision >= 3) {
+      userPassword = ownerPassword;
+      const derivedKey = new Uint8Array(keyLengthInBytes);
+
+      for (j = 19; j >= 0; j--) {
+        for (let k = 0; k < keyLengthInBytes; ++k) {
+          derivedKey[k] = hash[k] ^ j;
+        }
+
+        cipher = new ARCFourCipher(derivedKey);
+        userPassword = cipher.encryptBlock(userPassword);
+      }
+    } else {
+      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
+      userPassword = cipher.encryptBlock(ownerPassword);
+    }
+
+    return userPassword;
+  }
+
+  const identityName = _primitives.Name.get("Identity");
+
+  function buildObjectKey(num, gen, encryptionKey, isAes = false) {
+    const key = new Uint8Array(encryptionKey.length + 9);
+    const n = encryptionKey.length;
+    let i;
+
+    for (i = 0; i < n; ++i) {
+      key[i] = encryptionKey[i];
+    }
+
+    key[i++] = num & 0xff;
+    key[i++] = num >> 8 & 0xff;
+    key[i++] = num >> 16 & 0xff;
+    key[i++] = gen & 0xff;
+    key[i++] = gen >> 8 & 0xff;
+
+    if (isAes) {
+      key[i++] = 0x73;
+      key[i++] = 0x41;
+      key[i++] = 0x6c;
+      key[i++] = 0x54;
+    }
+
+    const hash = calculateMD5(key, 0, i);
+    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+  }
+
+  function buildCipherConstructor(cf, name, num, gen, key) {
+    if (!(0, _primitives.isName)(name)) {
+      throw new _util.FormatError("Invalid crypt filter name.");
+    }
+
+    const cryptFilter = cf.get(name.name);
+    let cfm;
+
+    if (cryptFilter !== null && cryptFilter !== undefined) {
+      cfm = cryptFilter.get("CFM");
+    }
+
+    if (!cfm || cfm.name === "None") {
+      return function cipherTransformFactoryBuildCipherConstructorNone() {
+        return new NullCipher();
+      };
+    }
+
+    if (cfm.name === "V2") {
+      return function cipherTransformFactoryBuildCipherConstructorV2() {
+        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
+      };
+    }
+
+    if (cfm.name === "AESV2") {
+      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+        return new AES128Cipher(buildObjectKey(num, gen, key, true));
+      };
+    }
+
+    if (cfm.name === "AESV3") {
+      return function cipherTransformFactoryBuildCipherConstructorAESV3() {
+        return new AES256Cipher(key);
+      };
+    }
+
+    throw new _util.FormatError("Unknown crypto method");
+  }
+
+  class CipherTransformFactory {
+    constructor(dict, fileId, password) {
+      const filter = dict.get("Filter");
+
+      if (!(0, _primitives.isName)(filter, "Standard")) {
+        throw new _util.FormatError("unknown encryption method");
+      }
+
+      this.dict = dict;
+      const algorithm = dict.get("V");
+
+      if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm 
!== 5) {
+        throw new _util.FormatError("unsupported encryption algorithm");
+      }
+
+      this.algorithm = algorithm;
+      let keyLength = dict.get("Length");
+
+      if (!keyLength) {
+        if (algorithm <= 3) {
+          keyLength = 40;
+        } else {
+          const cfDict = dict.get("CF");
+          const streamCryptoName = dict.get("StmF");
+
+          if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {
+            cfDict.suppressEncryption = true;
+            const handlerDict = cfDict.get(streamCryptoName.name);
+            keyLength = handlerDict && handlerDict.get("Length") || 128;
+
+            if (keyLength < 40) {
+              keyLength <<= 3;
+            }
+          }
+        }
+      }
+
+      if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
+        throw new _util.FormatError("invalid key length");
+      }
+
+      const ownerPassword = (0, _util.stringToBytes)(dict.get("O")).subarray(0, 32);
+      const userPassword = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 32);
+      const flags = dict.get("P");
+      const revision = dict.get("R");
+      const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false;
+      this.encryptMetadata = encryptMetadata;
+      const fileIdBytes = (0, _util.stringToBytes)(fileId);
+      let passwordBytes;
+
+      if (password) {
+        if (revision === 6) {
+          try {
+            password = (0, _util.utf8StringToString)(password);
+          } catch (ex) {
+            (0, _util.warn)("CipherTransformFactory: " + "Unable to convert UTF8 encoded password.");
+          }
+        }
+
+        passwordBytes = (0, _util.stringToBytes)(password);
+      }
+
+      let encryptionKey;
+
+      if (algorithm !== 5) {
+        encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, 
revision, keyLength, encryptMetadata);
+      } else {
+        const ownerValidationSalt = (0, _util.stringToBytes)(dict.get("O")).subarray(32, 40);
+        const ownerKeySalt = (0, _util.stringToBytes)(dict.get("O")).subarray(40, 48);
+        const uBytes = (0, _util.stringToBytes)(dict.get("U")).subarray(0, 48);
+        const userValidationSalt = (0, _util.stringToBytes)(dict.get("U")).subarray(32, 40);
+        const userKeySalt = (0, _util.stringToBytes)(dict.get("U")).subarray(40, 48);
+        const ownerEncryption = (0, _util.stringToBytes)(dict.get("OE"));
+        const userEncryption = (0, _util.stringToBytes)(dict.get("UE"));
+        const perms = (0, _util.stringToBytes)(dict.get("Perms"));
+        encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, 
ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
+      }
+
+      if (!encryptionKey && !password) {
+        throw new _util.PasswordException("No password given", _util.PasswordResponses.NEED_PASSWORD);
+      } else if (!encryptionKey && password) {
+        const decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
+        encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, 
revision, keyLength, encryptMetadata);
+      }
+
+      if (!encryptionKey) {
+        throw new _util.PasswordException("Incorrect Password", _util.PasswordResponses.INCORRECT_PASSWORD);
+      }
+
+      this.encryptionKey = encryptionKey;
+
+      if (algorithm >= 4) {
+        const cf = dict.get("CF");
+
+        if ((0, _primitives.isDict)(cf)) {
+          cf.suppressEncryption = true;
+        }
+
+        this.cf = cf;
+        this.stmf = dict.get("StmF") || identityName;
+        this.strf = dict.get("StrF") || identityName;
+        this.eff = dict.get("EFF") || this.stmf;
+      }
+    }
+
+    createCipherTransform(num, gen) {
+      if (this.algorithm === 4 || this.algorithm === 5) {
+        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), 
buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));
+      }
+
+      const key = buildObjectKey(num, gen, this.encryptionKey, false);
+
+      const cipherConstructor = function buildCipherCipherConstructor() {
+        return new ARCFourCipher(key);
+      };
+
+      return new CipherTransform(cipherConstructor, cipherConstructor);
+    }
+
+  }
+
+  return CipherTransformFactory;
+}();
+
+exports.CipherTransformFactory = CipherTransformFactory;
+
+/***/ }),
+/* 73 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.DecryptStream = void 0;
+
+var _decode_stream = __w_pdfjs_require__(19);
+
+const chunkSize = 512;
+
+class DecryptStream extends _decode_stream.DecodeStream {
+  constructor(str, maybeLength, decrypt) {
+    super(maybeLength);
+    this.str = str;
+    this.dict = str.dict;
+    this.decrypt = decrypt;
+    this.nextChunk = null;
+    this.initialized = false;
+  }
+
+  readBlock() {
+    let chunk;
+
+    if (this.initialized) {
+      chunk = this.nextChunk;
+    } else {
+      chunk = this.str.getBytes(chunkSize);
+      this.initialized = true;
+    }
+
+    if (!chunk || chunk.length === 0) {
+      this.eof = true;
+      return;
+    }
+
+    this.nextChunk = this.str.getBytes(chunkSize);
+    const hasMoreData = this.nextChunk && this.nextChunk.length > 0;
+    const decrypt = this.decrypt;
+    chunk = decrypt(chunk, !hasMoreData);
+    let bufferLength = this.bufferLength;
+    const n = chunk.length,
+          buffer = this.ensureBuffer(bufferLength + n);
+
+    for (let i = 0; i < n; i++) {
+      buffer[bufferLength++] = chunk[i];
+    }
+
+    this.bufferLength = bufferLength;
+  }
+
+}
+
+exports.DecryptStream = DecryptStream;
+
+/***/ }),
+/* 74 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XFAFactory = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _bind = __w_pdfjs_require__(79);
+
+var _data = __w_pdfjs_require__(85);
+
+var _fonts = __w_pdfjs_require__(83);
+
+var _utils = __w_pdfjs_require__(76);
+
+var _util = __w_pdfjs_require__(2);
+
+var _parser = __w_pdfjs_require__(86);
+
+class XFAFactory {
+  constructor(data) {
+    try {
+      this.root = new _parser.XFAParser().parse(XFAFactory._createDocument(data));
+      const binder = new _bind.Binder(this.root);
+      this.form = binder.bind();
+      this.dataHandler = new _data.DataHandler(this.root, binder.getData());
+      this.form[_xfa_object.$globalData].template = this.form;
+    } catch (e) {
+      (0, _util.warn)(`XFA - an error occurred during parsing and binding: ${e}`);
+    }
+  }
+
+  isValid() {
+    return this.root && this.form;
+  }
+
+  _createPages() {
+    try {
+      this.pages = this.form[_xfa_object.$toHTML]();
+      this.dims = this.pages.children.map(c => {
+        const {
+          width,
+          height
+        } = c.attributes.style;
+        return [0, 0, parseInt(width), parseInt(height)];
+      });
+    } catch (e) {
+      (0, _util.warn)(`XFA - an error occurred during layout: ${e}`);
+    }
+  }
+
+  getBoundingBox(pageIndex) {
+    return this.dims[pageIndex];
+  }
+
+  get numberPages() {
+    if (!this.pages) {
+      this._createPages();
+    }
+
+    return this.dims.length;
+  }
+
+  setImages(images) {
+    this.form[_xfa_object.$globalData].images = images;
+  }
+
+  setFonts(fonts) {
+    this.form[_xfa_object.$globalData].fontFinder = new _fonts.FontFinder(fonts);
+    const missingFonts = [];
+
+    for (let typeface of this.form[_xfa_object.$globalData].usedTypefaces) {
+      typeface = (0, _utils.stripQuotes)(typeface);
+
+      const font = this.form[_xfa_object.$globalData].fontFinder.find(typeface);
+
+      if (!font) {
+        missingFonts.push(typeface);
+      }
+    }
+
+    if (missingFonts.length > 0) {
+      return missingFonts;
+    }
+
+    return null;
+  }
+
+  appendFonts(fonts, reallyMissingFonts) {
+    this.form[_xfa_object.$globalData].fontFinder.add(fonts, reallyMissingFonts);
+  }
+
+  getPages() {
+    if (!this.pages) {
+      this._createPages();
+    }
+
+    const pages = this.pages;
+    this.pages = null;
+    return pages;
+  }
+
+  serializeData(storage) {
+    return this.dataHandler.serialize(storage);
+  }
+
+  static _createDocument(data) {
+    if (!data["/xdp:xdp"]) {
+      return data["xdp:xdp"];
+    }
+
+    return Object.values(data).join("");
+  }
+
+}
+
+exports.XFAFactory = XFAFactory;
+
+/***/ }),
+/* 75 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XmlObject = exports.XFAObjectArray = exports.XFAObject = exports.XFAAttribute = exports.StringObject 
= exports.OptionObject = exports.Option10 = exports.Option01 = exports.IntegerObject = exports.ContentObject 
= exports.$uid = exports.$toStyle = exports.$toString = exports.$toHTML = exports.$text = exports.$tabIndex = 
exports.$setValue = exports.$setSetAttributes = exports.$setId = exports.$searchNode = exports.$root = 
exports.$resolvePrototypes = exports.$removeChild = exports.$pushGlyphs = exports.$onText = 
exports.$onChildCheck = exports.$onChild = exports.$nsAttributes = exports.$nodeName = exports.$namespaceId = 
exports.$isUsable = exports.$isTransparent = exports.$isThereMoreWidth = exports.$isSplittable = 
exports.$isNsAgnostic = exports.$isDescendent = exports.$isDataValue = exports.$isCDATAXml = 
exports.$isBindable = exports.$insertAt = exports.$indexOf = exports.$ids = exports.$hasSettableValue = 
exports.$globalData = exports.$getTemplateRoot = exports.$getSubformPa
 rent = exports.$getRealChildrenByNameIt = exports.$getParent = exports.$getNextPage = exports.$getExtra = 
exports.$getDataValue = exports.$getContainedChildren = exports.$getChildrenByNameIt = 
exports.$getChildrenByName = exports.$getChildrenByClass = exports.$getChildren = exports.$getAvailableSpace 
= exports.$getAttributes = exports.$getAttributeIt = exports.$flushHTML = exports.$finalize = exports.$extra 
= exports.$dump = exports.$data = exports.$content = exports.$consumed = exports.$clone = exports.$cleanup = 
exports.$cleanPage = exports.$clean = exports.$childrenToHTML = exports.$appendChild = exports.$addHTML = 
exports.$acceptWhitespace = void 0;
+
+var _utils = __w_pdfjs_require__(76);
+
+var _util = __w_pdfjs_require__(2);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _som = __w_pdfjs_require__(78);
+
+const $acceptWhitespace = Symbol();
+exports.$acceptWhitespace = $acceptWhitespace;
+const $addHTML = Symbol();
+exports.$addHTML = $addHTML;
+const $appendChild = Symbol();
+exports.$appendChild = $appendChild;
+const $childrenToHTML = Symbol();
+exports.$childrenToHTML = $childrenToHTML;
+const $clean = Symbol();
+exports.$clean = $clean;
+const $cleanPage = Symbol();
+exports.$cleanPage = $cleanPage;
+const $cleanup = Symbol();
+exports.$cleanup = $cleanup;
+const $clone = Symbol();
+exports.$clone = $clone;
+const $consumed = Symbol();
+exports.$consumed = $consumed;
+const $content = Symbol("content");
+exports.$content = $content;
+const $data = Symbol("data");
+exports.$data = $data;
+const $dump = Symbol();
+exports.$dump = $dump;
+const $extra = Symbol("extra");
+exports.$extra = $extra;
+const $finalize = Symbol();
+exports.$finalize = $finalize;
+const $flushHTML = Symbol();
+exports.$flushHTML = $flushHTML;
+const $getAttributeIt = Symbol();
+exports.$getAttributeIt = $getAttributeIt;
+const $getAttributes = Symbol();
+exports.$getAttributes = $getAttributes;
+const $getAvailableSpace = Symbol();
+exports.$getAvailableSpace = $getAvailableSpace;
+const $getChildrenByClass = Symbol();
+exports.$getChildrenByClass = $getChildrenByClass;
+const $getChildrenByName = Symbol();
+exports.$getChildrenByName = $getChildrenByName;
+const $getChildrenByNameIt = Symbol();
+exports.$getChildrenByNameIt = $getChildrenByNameIt;
+const $getDataValue = Symbol();
+exports.$getDataValue = $getDataValue;
+const $getExtra = Symbol();
+exports.$getExtra = $getExtra;
+const $getRealChildrenByNameIt = Symbol();
+exports.$getRealChildrenByNameIt = $getRealChildrenByNameIt;
+const $getChildren = Symbol();
+exports.$getChildren = $getChildren;
+const $getContainedChildren = Symbol();
+exports.$getContainedChildren = $getContainedChildren;
+const $getNextPage = Symbol();
+exports.$getNextPage = $getNextPage;
+const $getSubformParent = Symbol();
+exports.$getSubformParent = $getSubformParent;
+const $getParent = Symbol();
+exports.$getParent = $getParent;
+const $getTemplateRoot = Symbol();
+exports.$getTemplateRoot = $getTemplateRoot;
+const $globalData = Symbol();
+exports.$globalData = $globalData;
+const $hasSettableValue = Symbol();
+exports.$hasSettableValue = $hasSettableValue;
+const $ids = Symbol();
+exports.$ids = $ids;
+const $indexOf = Symbol();
+exports.$indexOf = $indexOf;
+const $insertAt = Symbol();
+exports.$insertAt = $insertAt;
+const $isCDATAXml = Symbol();
+exports.$isCDATAXml = $isCDATAXml;
+const $isBindable = Symbol();
+exports.$isBindable = $isBindable;
+const $isDataValue = Symbol();
+exports.$isDataValue = $isDataValue;
+const $isDescendent = Symbol();
+exports.$isDescendent = $isDescendent;
+const $isNsAgnostic = Symbol();
+exports.$isNsAgnostic = $isNsAgnostic;
+const $isSplittable = Symbol();
+exports.$isSplittable = $isSplittable;
+const $isThereMoreWidth = Symbol();
+exports.$isThereMoreWidth = $isThereMoreWidth;
+const $isTransparent = Symbol();
+exports.$isTransparent = $isTransparent;
+const $isUsable = Symbol();
+exports.$isUsable = $isUsable;
+const $lastAttribute = Symbol();
+const $namespaceId = Symbol("namespaceId");
+exports.$namespaceId = $namespaceId;
+const $nodeName = Symbol("nodeName");
+exports.$nodeName = $nodeName;
+const $nsAttributes = Symbol();
+exports.$nsAttributes = $nsAttributes;
+const $onChild = Symbol();
+exports.$onChild = $onChild;
+const $onChildCheck = Symbol();
+exports.$onChildCheck = $onChildCheck;
+const $onText = Symbol();
+exports.$onText = $onText;
+const $pushGlyphs = Symbol();
+exports.$pushGlyphs = $pushGlyphs;
+const $removeChild = Symbol();
+exports.$removeChild = $removeChild;
+const $root = Symbol("root");
+exports.$root = $root;
+const $resolvePrototypes = Symbol();
+exports.$resolvePrototypes = $resolvePrototypes;
+const $searchNode = Symbol();
+exports.$searchNode = $searchNode;
+const $setId = Symbol();
+exports.$setId = $setId;
+const $setSetAttributes = Symbol();
+exports.$setSetAttributes = $setSetAttributes;
+const $setValue = Symbol();
+exports.$setValue = $setValue;
+const $tabIndex = Symbol();
+exports.$tabIndex = $tabIndex;
+const $text = Symbol();
+exports.$text = $text;
+const $toHTML = Symbol();
+exports.$toHTML = $toHTML;
+const $toString = Symbol();
+exports.$toString = $toString;
+const $toStyle = Symbol();
+exports.$toStyle = $toStyle;
+const $uid = Symbol("uid");
+exports.$uid = $uid;
+
+const _applyPrototype = Symbol();
+
+const _attributes = Symbol();
+
+const _attributeNames = Symbol();
+
+const _children = Symbol("_children");
+
+const _cloneAttribute = Symbol();
+
+const _dataValue = Symbol();
+
+const _defaultValue = Symbol();
+
+const _filteredChildrenGenerator = Symbol();
+
+const _getPrototype = Symbol();
+
+const _getUnsetAttributes = Symbol();
+
+const _hasChildren = Symbol();
+
+const _max = Symbol();
+
+const _options = Symbol();
+
+const _parent = Symbol("parent");
+
+const _resolvePrototypesHelper = Symbol();
+
+const _setAttributes = Symbol();
+
+const _validator = Symbol();
+
+let uid = 0;
+const NS_DATASETS = _namespaces.NamespaceIds.datasets.id;
+
+class XFAObject {
+  constructor(nsId, name, hasChildren = false) {
+    this[$namespaceId] = nsId;
+    this[$nodeName] = name;
+    this[_hasChildren] = hasChildren;
+    this[_parent] = null;
+    this[_children] = [];
+    this[$uid] = `${name}${uid++}`;
+    this[$globalData] = null;
+  }
+
+  [$onChild](child) {
+    if (!this[_hasChildren] || !this[$onChildCheck](child)) {
+      return false;
+    }
+
+    const name = child[$nodeName];
+    const node = this[name];
+
+    if (node instanceof XFAObjectArray) {
+      if (node.push(child)) {
+        this[$appendChild](child);
+        return true;
+      }
+    } else {
+      if (node !== null) {
+        this[$removeChild](node);
+      }
+
+      this[name] = child;
+      this[$appendChild](child);
+      return true;
+    }
+
+    let id = "";
+
+    if (this.id) {
+      id = ` (id: ${this.id})`;
+    } else if (this.name) {
+      id = ` (name: ${this.name} ${this.h.value})`;
+    }
+
+    (0, _util.warn)(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`);
+    return false;
+  }
+
+  [$onChildCheck](child) {
+    return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId];
+  }
+
+  [$isNsAgnostic]() {
+    return false;
+  }
+
+  [$acceptWhitespace]() {
+    return false;
+  }
+
+  [$isCDATAXml]() {
+    return false;
+  }
+
+  [$isBindable]() {
+    return false;
+  }
+
+  [$setId](ids) {
+    if (this.id && this[$namespaceId] === _namespaces.NamespaceIds.template.id) {
+      ids.set(this.id, this);
+    }
+  }
+
+  [$getTemplateRoot]() {
+    return this[$globalData].template;
+  }
+
+  [$isSplittable]() {
+    return false;
+  }
+
+  [$isThereMoreWidth]() {
+    return false;
+  }
+
+  [$appendChild](child) {
+    child[_parent] = this;
+
+    this[_children].push(child);
+  }
+
+  [$removeChild](child) {
+    const i = this[_children].indexOf(child);
+
+    this[_children].splice(i, 1);
+  }
+
+  [$hasSettableValue]() {
+    return this.hasOwnProperty("value");
+  }
+
+  [$setValue](_) {}
+
+  [$onText](_) {}
+
+  [$finalize]() {}
+
+  [$clean](builder) {
+    delete this[_hasChildren];
+
+    if (this[$cleanup]) {
+      builder.clean(this[$cleanup]);
+      delete this[$cleanup];
+    }
+  }
+
+  [$indexOf](child) {
+    return this[_children].indexOf(child);
+  }
+
+  [$insertAt](i, child) {
+    child[_parent] = this;
+
+    this[_children].splice(i, 0, child);
+  }
+
+  [$isTransparent]() {
+    return !this.name;
+  }
+
+  [$lastAttribute]() {
+    return "";
+  }
+
+  [$text]() {
+    if (this[_children].length === 0) {
+      return this[$content];
+    }
+
+    return this[_children].map(c => c[$text]()).join("");
+  }
+
+  get [_attributeNames]() {
+    const proto = Object.getPrototypeOf(this);
+
+    if (!proto._attributes) {
+      const attributes = proto._attributes = new Set();
+
+      for (const name of Object.getOwnPropertyNames(this)) {
+        if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) {
+          break;
+        }
+
+        attributes.add(name);
+      }
+    }
+
+    return (0, _util.shadow)(this, _attributeNames, proto._attributes);
+  }
+
+  [$isDescendent](parent) {
+    let node = this;
+
+    while (node) {
+      if (node === parent) {
+        return true;
+      }
+
+      node = node[$getParent]();
+    }
+
+    return false;
+  }
+
+  [$getParent]() {
+    return this[_parent];
+  }
+
+  [$getSubformParent]() {
+    return this[$getParent]();
+  }
+
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+
+    return this[name];
+  }
+
+  [$dump]() {
+    const dumped = Object.create(null);
+
+    if (this[$content]) {
+      dumped.$content = this[$content];
+    }
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const value = this[name];
+
+      if (value === null) {
+        continue;
+      }
+
+      if (value instanceof XFAObject) {
+        dumped[name] = value[$dump]();
+      } else if (value instanceof XFAObjectArray) {
+        if (!value.isEmpty()) {
+          dumped[name] = value.dump();
+        }
+      } else {
+        dumped[name] = value;
+      }
+    }
+
+    return dumped;
+  }
+
+  [$toStyle]() {
+    return null;
+  }
+
+  [$toHTML]() {
+    return _utils.HTMLResult.EMPTY;
+  }
+
+  *[$getContainedChildren]() {
+    for (const node of this[$getChildren]()) {
+      yield node;
+    }
+  }
+
+  *[_filteredChildrenGenerator](filter, include) {
+    for (const node of this[$getContainedChildren]()) {
+      if (!filter || include === filter.has(node[$nodeName])) {
+        const availableSpace = this[$getAvailableSpace]();
+        const res = node[$toHTML](availableSpace);
+
+        if (!res.success) {
+          this[$extra].failingNode = node;
+        }
+
+        yield res;
+      }
+    }
+  }
+
+  [$flushHTML]() {
+    return null;
+  }
+
+  [$addHTML](html, bbox) {
+    this[$extra].children.push(html);
+  }
+
+  [$getAvailableSpace]() {}
+
+  [$childrenToHTML]({
+    filter = null,
+    include = true
+  }) {
+    if (!this[$extra].generator) {
+      this[$extra].generator = this[_filteredChildrenGenerator](filter, include);
+    } else {
+      const availableSpace = this[$getAvailableSpace]();
+      const res = this[$extra].failingNode[$toHTML](availableSpace);
+
+      if (!res.success) {
+        return res;
+      }
+
+      if (res.html) {
+        this[$addHTML](res.html, res.bbox);
+      }
+
+      delete this[$extra].failingNode;
+    }
+
+    while (true) {
+      const gen = this[$extra].generator.next();
+
+      if (gen.done) {
+        break;
+      }
+
+      const res = gen.value;
+
+      if (!res.success) {
+        return res;
+      }
+
+      if (res.html) {
+        this[$addHTML](res.html, res.bbox);
+      }
+    }
+
+    this[$extra].generator = null;
+    return _utils.HTMLResult.EMPTY;
+  }
+
+  [$setSetAttributes](attributes) {
+    this[_setAttributes] = new Set(Object.keys(attributes));
+  }
+
+  [_getUnsetAttributes](protoAttributes) {
+    const allAttr = this[_attributeNames];
+    const setAttr = this[_setAttributes];
+    return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));
+  }
+
+  [$resolvePrototypes](ids, ancestors = new Set()) {
+    for (const child of this[_children]) {
+      child[_resolvePrototypesHelper](ids, ancestors);
+    }
+  }
+
+  [_resolvePrototypesHelper](ids, ancestors) {
+    const proto = this[_getPrototype](ids, ancestors);
+
+    if (proto) {
+      this[_applyPrototype](proto, ids, ancestors);
+    } else {
+      this[$resolvePrototypes](ids, ancestors);
+    }
+  }
+
+  [_getPrototype](ids, ancestors) {
+    const {
+      use,
+      usehref
+    } = this;
+
+    if (!use && !usehref) {
+      return null;
+    }
+
+    let proto = null;
+    let somExpression = null;
+    let id = null;
+    let ref = use;
+
+    if (usehref) {
+      ref = usehref;
+
+      if (usehref.startsWith("#som(") && usehref.endsWith(")")) {
+        somExpression = usehref.slice("#som(".length, usehref.length - 1);
+      } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) {
+        somExpression = usehref.slice(".#som(".length, usehref.length - 1);
+      } else if (usehref.startsWith("#")) {
+        id = usehref.slice(1);
+      } else if (usehref.startsWith(".#")) {
+        id = usehref.slice(2);
+      }
+    } else if (use.startsWith("#")) {
+      id = use.slice(1);
+    } else {
+      somExpression = use;
+    }
+
+    this.use = this.usehref = "";
+
+    if (id) {
+      proto = ids.get(id);
+    } else {
+      proto = (0, _som.searchNode)(ids.get($root), this, somExpression, true, false);
+
+      if (proto) {
+        proto = proto[0];
+      }
+    }
+
+    if (!proto) {
+      (0, _util.warn)(`XFA - Invalid prototype reference: ${ref}.`);
+      return null;
+    }
+
+    if (proto[$nodeName] !== this[$nodeName]) {
+      (0, _util.warn)(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`);
+      return null;
+    }
+
+    if (ancestors.has(proto)) {
+      (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);
+      return null;
+    }
+
+    ancestors.add(proto);
+
+    const protoProto = proto[_getPrototype](ids, ancestors);
+
+    if (protoProto) {
+      proto[_applyPrototype](protoProto, ids, ancestors);
+    }
+
+    proto[$resolvePrototypes](ids, ancestors);
+    ancestors.delete(proto);
+    return proto;
+  }
+
+  [_applyPrototype](proto, ids, ancestors) {
+    if (ancestors.has(proto)) {
+      (0, _util.warn)(`XFA - Cycle detected in prototypes use.`);
+      return;
+    }
+
+    if (!this[$content] && proto[$content]) {
+      this[$content] = proto[$content];
+    }
+
+    const newAncestors = new Set(ancestors);
+    newAncestors.add(proto);
+
+    for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) {
+      this[unsetAttrName] = proto[unsetAttrName];
+
+      if (this[_setAttributes]) {
+        this[_setAttributes].add(unsetAttrName);
+      }
+    }
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (this[_attributeNames].has(name)) {
+        continue;
+      }
+
+      const value = this[name];
+      const protoValue = proto[name];
+
+      if (value instanceof XFAObjectArray) {
+        for (const child of value[_children]) {
+          child[_resolvePrototypesHelper](ids, ancestors);
+        }
+
+        for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) {
+          const child = proto[_children][i][$clone]();
+
+          if (value.push(child)) {
+            child[_parent] = this;
+
+            this[_children].push(child);
+
+            child[_resolvePrototypesHelper](ids, ancestors);
+          } else {
+            break;
+          }
+        }
+
+        continue;
+      }
+
+      if (value !== null) {
+        value[$resolvePrototypes](ids, ancestors);
+
+        if (protoValue) {
+          value[_applyPrototype](protoValue, ids, ancestors);
+        }
+
+        continue;
+      }
+
+      if (protoValue !== null) {
+        const child = protoValue[$clone]();
+        child[_parent] = this;
+        this[name] = child;
+
+        this[_children].push(child);
+
+        child[_resolvePrototypesHelper](ids, ancestors);
+      }
+    }
+  }
+
+  static [_cloneAttribute](obj) {
+    if (Array.isArray(obj)) {
+      return obj.map(x => XFAObject[_cloneAttribute](x));
+    }
+
+    if (typeof obj === "object" && obj !== null) {
+      return Object.assign({}, obj);
+    }
+
+    return obj;
+  }
+
+  [$clone]() {
+    const clone = Object.create(Object.getPrototypeOf(this));
+
+    for (const $symbol of Object.getOwnPropertySymbols(this)) {
+      try {
+        clone[$symbol] = this[$symbol];
+      } catch (_) {
+        (0, _util.shadow)(clone, $symbol, this[$symbol]);
+      }
+    }
+
+    clone[$uid] = `${clone[$nodeName]}${uid++}`;
+    clone[_children] = [];
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (this[_attributeNames].has(name)) {
+        clone[name] = XFAObject[_cloneAttribute](this[name]);
+        continue;
+      }
+
+      const value = this[name];
+
+      if (value instanceof XFAObjectArray) {
+        clone[name] = new XFAObjectArray(value[_max]);
+      } else {
+        clone[name] = null;
+      }
+    }
+
+    for (const child of this[_children]) {
+      const name = child[$nodeName];
+      const clonedChild = child[$clone]();
+
+      clone[_children].push(clonedChild);
+
+      clonedChild[_parent] = clone;
+
+      if (clone[name] === null) {
+        clone[name] = clonedChild;
+      } else {
+        clone[name][_children].push(clonedChild);
+      }
+    }
+
+    return clone;
+  }
+
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+
+    return this[_children].filter(c => c[$nodeName] === name);
+  }
+
+  [$getChildrenByClass](name) {
+    return this[name];
+  }
+
+  [$getChildrenByName](name, allTransparent, first = true) {
+    return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));
+  }
+
+  *[$getChildrenByNameIt](name, allTransparent, first = true) {
+    if (name === "parent") {
+      yield this[_parent];
+      return;
+    }
+
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name) {
+        yield child;
+      }
+
+      if (child.name === name) {
+        yield child;
+      }
+
+      if (allTransparent || child[$isTransparent]()) {
+        yield* child[$getChildrenByNameIt](name, allTransparent, false);
+      }
+    }
+
+    if (first && this[_attributeNames].has(name)) {
+      yield new XFAAttribute(this, name, this[name]);
+    }
+  }
+
+}
+
+exports.XFAObject = XFAObject;
+
+class XFAObjectArray {
+  constructor(max = Infinity) {
+    this[_max] = max;
+    this[_children] = [];
+  }
+
+  push(child) {
+    const len = this[_children].length;
+
+    if (len <= this[_max]) {
+      this[_children].push(child);
+
+      return true;
+    }
+
+    (0, _util.warn)(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`);
+    return false;
+  }
+
+  isEmpty() {
+    return this[_children].length === 0;
+  }
+
+  dump() {
+    return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]());
+  }
+
+  [$clone]() {
+    const clone = new XFAObjectArray(this[_max]);
+    clone[_children] = this[_children].map(c => c[$clone]());
+    return clone;
+  }
+
+  get children() {
+    return this[_children];
+  }
+
+  clear() {
+    this[_children].length = 0;
+  }
+
+}
+
+exports.XFAObjectArray = XFAObjectArray;
+
+class XFAAttribute {
+  constructor(node, name, value) {
+    this[_parent] = node;
+    this[$nodeName] = name;
+    this[$content] = value;
+    this[$consumed] = false;
+    this[$uid] = `attribute${uid++}`;
+  }
+
+  [$getParent]() {
+    return this[_parent];
+  }
+
+  [$isDataValue]() {
+    return true;
+  }
+
+  [$getDataValue]() {
+    return this[$content].trim();
+  }
+
+  [$setValue](value) {
+    value = value.value || "";
+    this[$content] = value.toString();
+  }
+
+  [$text]() {
+    return this[$content];
+  }
+
+  [$isDescendent](parent) {
+    return this[_parent] === parent || this[_parent][$isDescendent](parent);
+  }
+
+}
+
+exports.XFAAttribute = XFAAttribute;
+
+class XmlObject extends XFAObject {
+  constructor(nsId, name, attributes = {}) {
+    super(nsId, name);
+    this[$content] = "";
+    this[_dataValue] = null;
+
+    if (name !== "#text") {
+      const map = new Map();
+      this[_attributes] = map;
+
+      for (const [attrName, value] of Object.entries(attributes)) {
+        map.set(attrName, new XFAAttribute(this, attrName, value));
+      }
+
+      if (attributes.hasOwnProperty($nsAttributes)) {
+        const dataNode = attributes[$nsAttributes].xfa.dataNode;
+
+        if (dataNode !== undefined) {
+          if (dataNode === "dataGroup") {
+            this[_dataValue] = false;
+          } else if (dataNode === "dataValue") {
+            this[_dataValue] = true;
+          }
+        }
+      }
+    }
+
+    this[$consumed] = false;
+  }
+
+  [$toString](buf) {
+    const tagName = this[$nodeName];
+
+    if (tagName === "#text") {
+      buf.push((0, _core_utils.encodeToXmlString)(this[$content]));
+      return;
+    }
+
+    const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : "";
+    buf.push(`<${prefix}${tagName}`);
+
+    for (const [name, value] of this[_attributes].entries()) {
+      buf.push(` ${name}="${(0, _core_utils.encodeToXmlString)(value[$content])}"`);
+    }
+
+    if (this[_dataValue] !== null) {
+      if (this[_dataValue]) {
+        buf.push(` xfa:dataNode="dataValue"`);
+      } else {
+        buf.push(` xfa:dataNode="dataGroup"`);
+      }
+    }
+
+    if (!this[$content] && this[_children].length === 0) {
+      buf.push("/>");
+      return;
+    }
+
+    buf.push(">");
+
+    if (this[$content]) {
+      if (typeof this[$content] === "string") {
+        buf.push((0, _core_utils.encodeToXmlString)(this[$content]));
+      } else {
+        this[$content][$toString](buf);
+      }
+    } else {
+      for (const child of this[_children]) {
+        child[$toString](buf);
+      }
+    }
+
+    buf.push(`</${prefix}${tagName}>`);
+  }
+
+  [$onChild](child) {
+    if (this[$content]) {
+      const node = new XmlObject(this[$namespaceId], "#text");
+      this[$appendChild](node);
+      node[$content] = this[$content];
+      this[$content] = "";
+    }
+
+    this[$appendChild](child);
+    return true;
+  }
+
+  [$onText](str) {
+    this[$content] += str;
+  }
+
+  [$finalize]() {
+    if (this[$content] && this[_children].length > 0) {
+      const node = new XmlObject(this[$namespaceId], "#text");
+      this[$appendChild](node);
+      node[$content] = this[$content];
+      delete this[$content];
+    }
+  }
+
+  [$toHTML]() {
+    if (this[$nodeName] === "#text") {
+      return _utils.HTMLResult.success({
+        name: "#text",
+        value: this[$content]
+      });
+    }
+
+    return _utils.HTMLResult.EMPTY;
+  }
+
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+
+    return this[_children].filter(c => c[$nodeName] === name);
+  }
+
+  [$getAttributes]() {
+    return this[_attributes];
+  }
+
+  [$getChildrenByClass](name) {
+    const value = this[_attributes].get(name);
+
+    if (value !== undefined) {
+      return value;
+    }
+
+    return this[$getChildren](name);
+  }
+
+  *[$getChildrenByNameIt](name, allTransparent) {
+    const value = this[_attributes].get(name);
+
+    if (value) {
+      yield value;
+    }
+
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name) {
+        yield child;
+      }
+
+      if (allTransparent) {
+        yield* child[$getChildrenByNameIt](name, allTransparent);
+      }
+    }
+  }
+
+  *[$getAttributeIt](name, skipConsumed) {
+    const value = this[_attributes].get(name);
+
+    if (value && (!skipConsumed || !value[$consumed])) {
+      yield value;
+    }
+
+    for (const child of this[_children]) {
+      yield* child[$getAttributeIt](name, skipConsumed);
+    }
+  }
+
+  *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {
+        yield child;
+      }
+
+      if (allTransparent) {
+        yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed);
+      }
+    }
+  }
+
+  [$isDataValue]() {
+    if (this[_dataValue] === null) {
+      return this[_children].length === 0 || this[_children][0][$namespaceId] === 
_namespaces.NamespaceIds.xhtml.id;
+    }
+
+    return this[_dataValue];
+  }
+
+  [$getDataValue]() {
+    if (this[_dataValue] === null) {
+      if (this[_children].length === 0) {
+        return this[$content].trim();
+      }
+
+      if (this[_children][0][$namespaceId] === _namespaces.NamespaceIds.xhtml.id) {
+        return this[_children][0][$text]().trim();
+      }
+
+      return null;
+    }
+
+    return this[$content].trim();
+  }
+
+  [$setValue](value) {
+    value = value.value || "";
+    this[$content] = value.toString();
+  }
+
+  [$dump]() {
+    const dumped = Object.create(null);
+
+    if (this[$content]) {
+      dumped.$content = this[$content];
+    }
+
+    dumped.$name = this[$nodeName];
+    dumped.children = [];
+
+    for (const child of this[_children]) {
+      dumped.children.push(child[$dump]());
+    }
+
+    dumped.attributes = Object.create(null);
+
+    for (const [name, value] of this[_attributes]) {
+      dumped.attributes[name] = value[$content];
+    }
+
+    return dumped;
+  }
+
+}
+
+exports.XmlObject = XmlObject;
+
+class ContentObject extends XFAObject {
+  constructor(nsId, name) {
+    super(nsId, name);
+    this[$content] = "";
+  }
+
+  [$onText](text) {
+    this[$content] += text;
+  }
+
+  [$finalize]() {}
+
+}
+
+exports.ContentObject = ContentObject;
+
+class OptionObject extends ContentObject {
+  constructor(nsId, name, options) {
+    super(nsId, name);
+    this[_options] = options;
+  }
+
+  [$finalize]() {
+    this[$content] = (0, _utils.getKeyword)({
+      data: this[$content],
+      defaultValue: this[_options][0],
+      validate: k => this[_options].includes(k)
+    });
+  }
+
+  [$clean](builder) {
+    super[$clean](builder);
+    delete this[_options];
+  }
+
+}
+
+exports.OptionObject = OptionObject;
+
+class StringObject extends ContentObject {
+  [$finalize]() {
+    this[$content] = this[$content].trim();
+  }
+
+}
+
+exports.StringObject = StringObject;
+
+class IntegerObject extends ContentObject {
+  constructor(nsId, name, defaultValue, validator) {
+    super(nsId, name);
+    this[_defaultValue] = defaultValue;
+    this[_validator] = validator;
+  }
+
+  [$finalize]() {
+    this[$content] = (0, _utils.getInteger)({
+      data: this[$content],
+      defaultValue: this[_defaultValue],
+      validate: this[_validator]
+    });
+  }
+
+  [$clean](builder) {
+    super[$clean](builder);
+    delete this[_defaultValue];
+    delete this[_validator];
+  }
+
+}
+
+exports.IntegerObject = IntegerObject;
+
+class Option01 extends IntegerObject {
+  constructor(nsId, name) {
+    super(nsId, name, 0, n => n === 1);
+  }
+
+}
+
+exports.Option01 = Option01;
+
+class Option10 extends IntegerObject {
+  constructor(nsId, name) {
+    super(nsId, name, 1, n => n === 0);
+  }
+
+}
+
+exports.Option10 = Option10;
+
+/***/ }),
+/* 76 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getBBox = getBBox;
+exports.getColor = getColor;
+exports.getFloat = getFloat;
+exports.getInteger = getInteger;
+exports.getKeyword = getKeyword;
+exports.getMeasurement = getMeasurement;
+exports.getRatio = getRatio;
+exports.getRelevant = getRelevant;
+exports.getStringOption = getStringOption;
+exports.stripQuotes = stripQuotes;
+exports.HTMLResult = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+const dimConverters = {
+  pt: x => x,
+  cm: x => x / 2.54 * 72,
+  mm: x => x / (10 * 2.54) * 72,
+  in: x => x * 72,
+  px: x => x
+};
+const measurementPattern = /([+-]?[0-9]+\.?[0-9]*)(.*)/;
+
+function stripQuotes(str) {
+  if (str.startsWith("'") || str.startsWith('"')) {
+    return str.slice(1, str.length - 1);
+  }
+
+  return str;
+}
+
+function getInteger({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+
+  data = data.trim();
+  const n = parseInt(data, 10);
+
+  if (!isNaN(n) && validate(n)) {
+    return n;
+  }
+
+  return defaultValue;
+}
+
+function getFloat({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+
+  data = data.trim();
+  const n = parseFloat(data);
+
+  if (!isNaN(n) && validate(n)) {
+    return n;
+  }
+
+  return defaultValue;
+}
+
+function getKeyword({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+
+  data = data.trim();
+
+  if (validate(data)) {
+    return data;
+  }
+
+  return defaultValue;
+}
+
+function getStringOption(data, options) {
+  return getKeyword({
+    data,
+    defaultValue: options[0],
+    validate: k => options.includes(k)
+  });
+}
+
+function getMeasurement(str, def = "0") {
+  def = def || "0";
+
+  if (!str) {
+    return getMeasurement(def);
+  }
+
+  const match = str.trim().match(measurementPattern);
+
+  if (!match) {
+    return getMeasurement(def);
+  }
+
+  const [, valueStr, unit] = match;
+  const value = parseFloat(valueStr);
+
+  if (isNaN(value)) {
+    return getMeasurement(def);
+  }
+
+  if (value === 0) {
+    return 0;
+  }
+
+  const conv = dimConverters[unit];
+
+  if (conv) {
+    return conv(value);
+  }
+
+  return value;
+}
+
+function getRatio(data) {
+  if (!data) {
+    return {
+      num: 1,
+      den: 1
+    };
+  }
+
+  const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x));
+
+  if (ratio.length === 1) {
+    ratio.push(1);
+  }
+
+  if (ratio.length === 0) {
+    return {
+      num: 1,
+      den: 1
+    };
+  }
+
+  const [num, den] = ratio;
+  return {
+    num,
+    den
+  };
+}
+
+function getRelevant(data) {
+  if (!data) {
+    return [];
+  }
+
+  return data.trim().split(/\s+/).map(e => {
+    return {
+      excluded: e[0] === "-",
+      viewname: e.substring(1)
+    };
+  });
+}
+
+function getColor(data, def = [0, 0, 0]) {
+  let [r, g, b] = def;
+
+  if (!data) {
+    return {
+      r,
+      g,
+      b
+    };
+  }
+
+  const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 
255)).map(c => isNaN(c) ? 0 : c);
+
+  if (color.length < 3) {
+    return {
+      r,
+      g,
+      b
+    };
+  }
+
+  [r, g, b] = color;
+  return {
+    r,
+    g,
+    b
+  };
+}
+
+function getBBox(data) {
+  const def = -1;
+
+  if (!data) {
+    return {
+      x: def,
+      y: def,
+      width: def,
+      height: def
+    };
+  }
+
+  const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1"));
+
+  if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) {
+    return {
+      x: def,
+      y: def,
+      width: def,
+      height: def
+    };
+  }
+
+  const [x, y, width, height] = bbox;
+  return {
+    x,
+    y,
+    width,
+    height
+  };
+}
+
+class HTMLResult {
+  static get FAILURE() {
+    return (0, _util.shadow)(this, "FAILURE", new HTMLResult(false, null, null, null));
+  }
+
+  static get EMPTY() {
+    return (0, _util.shadow)(this, "EMPTY", new HTMLResult(true, null, null, null));
+  }
+
+  constructor(success, html, bbox, breakNode) {
+    this.success = success;
+    this.html = html;
+    this.bbox = bbox;
+    this.breakNode = breakNode;
+  }
+
+  isBreak() {
+    return !!this.breakNode;
+  }
+
+  static breakNode(node) {
+    return new HTMLResult(false, null, null, node);
+  }
+
+  static success(html, bbox = null) {
+    return new HTMLResult(true, html, bbox, null);
+  }
+
+}
+
+exports.HTMLResult = HTMLResult;
+
+/***/ }),
+/* 77 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.NamespaceIds = exports.$buildXFAObject = void 0;
+const $buildXFAObject = Symbol();
+exports.$buildXFAObject = $buildXFAObject;
+const NamespaceIds = {
+  config: {
+    id: 0,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xci/";)
+  },
+  connectionSet: {
+    id: 1,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/";)
+  },
+  datasets: {
+    id: 2,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/";)
+  },
+  form: {
+    id: 3,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/";)
+  },
+  localeSet: {
+    id: 4,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/";)
+  },
+  pdf: {
+    id: 5,
+    check: ns => ns === "http://ns.adobe.com/xdp/pdf/";
+  },
+  signature: {
+    id: 6,
+    check: ns => ns === "http://www.w3.org/2000/09/xmldsig#";
+  },
+  sourceSet: {
+    id: 7,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/";)
+  },
+  stylesheet: {
+    id: 8,
+    check: ns => ns === "http://www.w3.org/1999/XSL/Transform";
+  },
+  template: {
+    id: 9,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/";)
+  },
+  xdc: {
+    id: 10,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/";)
+  },
+  xdp: {
+    id: 11,
+    check: ns => ns === "http://ns.adobe.com/xdp/";
+  },
+  xfdf: {
+    id: 12,
+    check: ns => ns === "http://ns.adobe.com/xfdf/";
+  },
+  xhtml: {
+    id: 13,
+    check: ns => ns === "http://www.w3.org/1999/xhtml";
+  },
+  xmpmeta: {
+    id: 14,
+    check: ns => ns === "http://ns.adobe.com/xmpmeta/";
+  }
+};
+exports.NamespaceIds = NamespaceIds;
+
+/***/ }),
+/* 78 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.createDataNode = createDataNode;
+exports.searchNode = searchNode;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _util = __w_pdfjs_require__(2);
+
+const namePattern = /^[^.[]+/;
+const indexPattern = /^[^\]]+/;
+const operators = {
+  dot: 0,
+  dotDot: 1,
+  dotHash: 2,
+  dotBracket: 3,
+  dotParen: 4
+};
+const shortcuts = new Map([["$data", (root, current) => root.datasets.data], ["$template", (root, current) 
=> root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => 
root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], 
["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, 
current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, 
current) => current]]);
+const somCache = new WeakMap();
+
+function parseIndex(index) {
+  index = index.trim();
+
+  if (index === "*") {
+    return Infinity;
+  }
+
+  return parseInt(index, 10) || 0;
+}
+
+function parseExpression(expr, dotDotAllowed, noExpr = true) {
+  let match = expr.match(namePattern);
+
+  if (!match) {
+    return null;
+  }
+
+  let [name] = match;
+  const parsed = [{
+    name,
+    cacheName: "." + name,
+    index: 0,
+    js: null,
+    formCalc: null,
+    operator: operators.dot
+  }];
+  let pos = name.length;
+
+  while (pos < expr.length) {
+    const spos = pos;
+    const char = expr.charAt(pos++);
+
+    if (char === "[") {
+      match = expr.slice(pos).match(indexPattern);
+
+      if (!match) {
+        (0, _util.warn)("XFA - Invalid index in SOM expression");
+        return null;
+      }
+
+      parsed[parsed.length - 1].index = parseIndex(match[0]);
+      pos += match[0].length + 1;
+      continue;
+    }
+
+    let operator;
+
+    switch (expr.charAt(pos)) {
+      case ".":
+        if (!dotDotAllowed) {
+          return null;
+        }
+
+        pos++;
+        operator = operators.dotDot;
+        break;
+
+      case "#":
+        pos++;
+        operator = operators.dotHash;
+        break;
+
+      case "[":
+        if (noExpr) {
+          (0, _util.warn)("XFA - SOM expression contains a FormCalc subexpression which is not supported for 
now.");
+          return null;
+        }
+
+        operator = operators.dotBracket;
+        break;
+
+      case "(":
+        if (noExpr) {
+          (0, _util.warn)("XFA - SOM expression contains a JavaScript subexpression which is not supported 
for now.");
+          return null;
+        }
+
+        operator = operators.dotParen;
+        break;
+
+      default:
+        operator = operators.dot;
+        break;
+    }
+
+    match = expr.slice(pos).match(namePattern);
+
+    if (!match) {
+      break;
+    }
+
+    [name] = match;
+    pos += name.length;
+    parsed.push({
+      name,
+      cacheName: expr.slice(spos, pos),
+      operator,
+      index: 0,
+      js: null,
+      formCalc: null
+    });
+  }
+
+  return parsed;
+}
+
+function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) {
+  const parsed = parseExpression(expr, dotDotAllowed);
+
+  if (!parsed) {
+    return null;
+  }
+
+  const fn = shortcuts.get(parsed[0].name);
+  let i = 0;
+  let isQualified;
+
+  if (fn) {
+    isQualified = true;
+    root = [fn(root, container)];
+    i = 1;
+  } else {
+    isQualified = container === null;
+    root = [container || root];
+  }
+
+  for (let ii = parsed.length; i < ii; i++) {
+    const {
+      name,
+      cacheName,
+      operator,
+      index
+    } = parsed[i];
+    const nodes = [];
+
+    for (const node of root) {
+      if (!(node instanceof _xfa_object.XFAObject)) {
+        continue;
+      }
+
+      let children, cached;
+
+      if (useCache) {
+        cached = somCache.get(node);
+
+        if (!cached) {
+          cached = new Map();
+          somCache.set(node, cached);
+        }
+
+        children = cached.get(cacheName);
+      }
+
+      if (!children) {
+        switch (operator) {
+          case operators.dot:
+            children = node[_xfa_object.$getChildrenByName](name, false);
+            break;
+
+          case operators.dotDot:
+            children = node[_xfa_object.$getChildrenByName](name, true);
+            break;
+
+          case operators.dotHash:
+            children = node[_xfa_object.$getChildrenByClass](name);
+
+            if (children instanceof _xfa_object.XFAObjectArray) {
+              children = children.children;
+            } else {
+              children = [children];
+            }
+
+            break;
+
+          default:
+            break;
+        }
+
+        if (useCache) {
+          cached.set(cacheName, children);
+        }
+      }
+
+      if (children.length > 0) {
+        nodes.push(children);
+      }
+    }
+
+    if (nodes.length === 0 && !isQualified && i === 0) {
+      const parent = container[_xfa_object.$getParent]();
+
+      container = parent;
+
+      if (!container) {
+        return null;
+      }
+
+      i = -1;
+      root = [container];
+      continue;
+    }
+
+    if (isFinite(index)) {
+      root = nodes.filter(node => index < node.length).map(node => node[index]);
+    } else {
+      root = nodes.reduce((acc, node) => acc.concat(node), []);
+    }
+  }
+
+  if (root.length === 0) {
+    return null;
+  }
+
+  return root;
+}
+
+function createNodes(root, path) {
+  let node = null;
+
+  for (const {
+    name,
+    index
+  } of path) {
+    for (let i = 0, ii = !isFinite(index) ? 0 : index; i <= ii; i++) {
+      node = new _xfa_object.XmlObject(root[_xfa_object.$namespaceId], name);
+
+      root[_xfa_object.$appendChild](node);
+    }
+
+    root = node;
+  }
+
+  return node;
+}
+
+function createDataNode(root, container, expr) {
+  const parsed = parseExpression(expr);
+
+  if (!parsed) {
+    return null;
+  }
+
+  if (parsed.some(x => x.operator === operators.dotDot)) {
+    return null;
+  }
+
+  const fn = shortcuts.get(parsed[0].name);
+  let i = 0;
+
+  if (fn) {
+    root = fn(root, container);
+    i = 1;
+  } else {
+    root = container || root;
+  }
+
+  for (let ii = parsed.length; i < ii; i++) {
+    const {
+      name,
+      operator,
+      index
+    } = parsed[i];
+
+    if (!isFinite(index)) {
+      parsed[i].index = 0;
+      return createNodes(root, parsed.slice(i));
+    }
+
+    let children;
+
+    switch (operator) {
+      case operators.dot:
+        children = root[_xfa_object.$getChildrenByName](name, false);
+        break;
+
+      case operators.dotDot:
+        children = root[_xfa_object.$getChildrenByName](name, true);
+        break;
+
+      case operators.dotHash:
+        children = root[_xfa_object.$getChildrenByClass](name);
+
+        if (children instanceof _xfa_object.XFAObjectArray) {
+          children = children.children;
+        } else {
+          children = [children];
+        }
+
+        break;
+
+      default:
+        break;
+    }
+
+    if (children.length === 0) {
+      return createNodes(root, parsed.slice(i));
+    }
+
+    if (index < children.length) {
+      const child = children[index];
+
+      if (!(child instanceof _xfa_object.XFAObject)) {
+        (0, _util.warn)(`XFA - Cannot create a node.`);
+        return null;
+      }
+
+      root = child;
+    } else {
+      parsed[i].index = index - children.length;
+      return createNodes(root, parsed.slice(i));
+    }
+  }
+
+  return null;
+}
+
+/***/ }),
+/* 79 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Binder = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _template = __w_pdfjs_require__(80);
+
+var _som = __w_pdfjs_require__(78);
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _util = __w_pdfjs_require__(2);
+
+function createText(content) {
+  const node = new _template.Text({});
+  node[_xfa_object.$content] = content;
+  return node;
+}
+
+class Binder {
+  constructor(root) {
+    this.root = root;
+    this.datasets = root.datasets;
+
+    if (root.datasets && root.datasets.data) {
+      this.data = root.datasets.data;
+    } else {
+      this.data = new _xfa_object.XmlObject(_namespaces.NamespaceIds.datasets.id, "data");
+    }
+
+    this.emptyMerge = this.data[_xfa_object.$getChildren]().length === 0;
+    this.root.form = this.form = root.template[_xfa_object.$clone]();
+  }
+
+  _isConsumeData() {
+    return !this.emptyMerge && this._mergeMode;
+  }
+
+  _isMatchTemplate() {
+    return !this._isConsumeData();
+  }
+
+  bind() {
+    this._bindElement(this.form, this.data);
+
+    return this.form;
+  }
+
+  getData() {
+    return this.data;
+  }
+
+  _bindValue(formNode, data, picture) {
+    formNode[_xfa_object.$data] = data;
+
+    if (formNode[_xfa_object.$hasSettableValue]()) {
+      if (data[_xfa_object.$isDataValue]()) {
+        const value = data[_xfa_object.$getDataValue]();
+
+        formNode[_xfa_object.$setValue](createText(value));
+      } else if (formNode instanceof _template.Field && formNode.ui && formNode.ui.choiceList && 
formNode.ui.choiceList.open === "multiSelect") {
+        const value = data[_xfa_object.$getChildren]().map(child => 
child[_xfa_object.$content].trim()).join("\n");
+
+        formNode[_xfa_object.$setValue](createText(value));
+      } else if (this._isConsumeData()) {
+        (0, _util.warn)(`XFA - Nodes haven't the same type.`);
+      }
+    } else if (!data[_xfa_object.$isDataValue]() || this._isMatchTemplate()) {
+      this._bindElement(formNode, data);
+    } else {
+      (0, _util.warn)(`XFA - Nodes haven't the same type.`);
+    }
+  }
+
+  _findDataByNameToConsume(name, isValue, dataNode, global) {
+    if (!name) {
+      return null;
+    }
+
+    let generator, match;
+
+    for (let i = 0; i < 3; i++) {
+      generator = dataNode[_xfa_object.$getRealChildrenByNameIt](name, false, true);
+
+      while (true) {
+        match = generator.next().value;
+
+        if (!match) {
+          break;
+        }
+
+        if (isValue === match[_xfa_object.$isDataValue]()) {
+          return match;
+        }
+      }
+
+      if (dataNode[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.datasets.id && 
dataNode[_xfa_object.$nodeName] === "data") {
+        break;
+      }
+
+      dataNode = dataNode[_xfa_object.$getParent]();
+    }
+
+    if (!global) {
+      return null;
+    }
+
+    generator = this.data[_xfa_object.$getRealChildrenByNameIt](name, true, false);
+    match = generator.next().value;
+
+    if (match) {
+      return match;
+    }
+
+    generator = this.data[_xfa_object.$getAttributeIt](name, true);
+    match = generator.next().value;
+
+    if (match && match[_xfa_object.$isDataValue]()) {
+      return match;
+    }
+
+    return null;
+  }
+
+  _setProperties(formNode, dataNode) {
+    if (!formNode.hasOwnProperty("setProperty")) {
+      return;
+    }
+
+    for (const {
+      ref,
+      target,
+      connection
+    } of formNode.setProperty.children) {
+      if (connection) {
+        continue;
+      }
+
+      if (!ref) {
+        continue;
+      }
+
+      const nodes = (0, _som.searchNode)(this.root, dataNode, ref, false, false);
+
+      if (!nodes) {
+        (0, _util.warn)(`XFA - Invalid reference: ${ref}.`);
+        continue;
+      }
+
+      const [node] = nodes;
+
+      if (!node[_xfa_object.$isDescendent](this.data)) {
+        (0, _util.warn)(`XFA - Invalid node: must be a data node.`);
+        continue;
+      }
+
+      const targetNodes = (0, _som.searchNode)(this.root, formNode, target, false, false);
+
+      if (!targetNodes) {
+        (0, _util.warn)(`XFA - Invalid target: ${target}.`);
+        continue;
+      }
+
+      const [targetNode] = targetNodes;
+
+      if (!targetNode[_xfa_object.$isDescendent](formNode)) {
+        (0, _util.warn)(`XFA - Invalid target: must be a property or subproperty.`);
+        continue;
+      }
+
+      const targetParent = targetNode[_xfa_object.$getParent]();
+
+      if (targetNode instanceof _template.SetProperty || targetParent instanceof _template.SetProperty) {
+        (0, _util.warn)(`XFA - Invalid target: cannot be a setProperty or one of its properties.`);
+        continue;
+      }
+
+      if (targetNode instanceof _template.BindItems || targetParent instanceof _template.BindItems) {
+        (0, _util.warn)(`XFA - Invalid target: cannot be a bindItems or one of its properties.`);
+        continue;
+      }
+
+      const content = node[_xfa_object.$text]();
+
+      const name = targetNode[_xfa_object.$nodeName];
+
+      if (targetNode instanceof _xfa_object.XFAAttribute) {
+        const attrs = Object.create(null);
+        attrs[name] = content;
+        const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]);
+        targetParent[name] = obj[name];
+        continue;
+      }
+
+      if (!targetNode.hasOwnProperty(_xfa_object.$content)) {
+        (0, _util.warn)(`XFA - Invalid node to use in setProperty`);
+        continue;
+      }
+
+      targetNode[_xfa_object.$data] = node;
+      targetNode[_xfa_object.$content] = content;
+
+      targetNode[_xfa_object.$finalize]();
+    }
+  }
+
+  _bindItems(formNode, dataNode) {
+    if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || 
formNode.bindItems.isEmpty()) {
+      return;
+    }
+
+    for (const item of formNode.items.children) {
+      formNode[_xfa_object.$removeChild](item);
+    }
+
+    formNode.items.clear();
+    const labels = new _template.Items({});
+    const values = new _template.Items({});
+
+    formNode[_xfa_object.$appendChild](labels);
+
+    formNode.items.push(labels);
+
+    formNode[_xfa_object.$appendChild](values);
+
+    formNode.items.push(values);
+
+    for (const {
+      ref,
+      labelRef,
+      valueRef,
+      connection
+    } of formNode.bindItems.children) {
+      if (connection) {
+        continue;
+      }
+
+      if (!ref) {
+        continue;
+      }
+
+      const nodes = (0, _som.searchNode)(this.root, dataNode, ref, false, false);
+
+      if (!nodes) {
+        (0, _util.warn)(`XFA - Invalid reference: ${ref}.`);
+        continue;
+      }
+
+      for (const node of nodes) {
+        if (!node[_xfa_object.$isDescendent](this.datasets)) {
+          (0, _util.warn)(`XFA - Invalid ref (${ref}): must be a datasets child.`);
+          continue;
+        }
+
+        const labelNodes = (0, _som.searchNode)(this.root, node, labelRef, true, false);
+
+        if (!labelNodes) {
+          (0, _util.warn)(`XFA - Invalid label: ${labelRef}.`);
+          continue;
+        }
+
+        const [labelNode] = labelNodes;
+
+        if (!labelNode[_xfa_object.$isDescendent](this.datasets)) {
+          (0, _util.warn)(`XFA - Invalid label: must be a datasets child.`);
+          continue;
+        }
+
+        const valueNodes = (0, _som.searchNode)(this.root, node, valueRef, true, false);
+
+        if (!valueNodes) {
+          (0, _util.warn)(`XFA - Invalid value: ${valueRef}.`);
+          continue;
+        }
+
+        const [valueNode] = valueNodes;
+
+        if (!valueNode[_xfa_object.$isDescendent](this.datasets)) {
+          (0, _util.warn)(`XFA - Invalid value: must be a datasets child.`);
+          continue;
+        }
+
+        const label = createText(labelNode[_xfa_object.$text]());
+        const value = createText(valueNode[_xfa_object.$text]());
+
+        labels[_xfa_object.$appendChild](label);
+
+        labels.text.push(label);
+
+        values[_xfa_object.$appendChild](value);
+
+        values.text.push(value);
+      }
+    }
+  }
+
+  _bindOccurrences(formNode, matches, picture) {
+    let baseClone;
+
+    if (matches.length > 1) {
+      baseClone = formNode[_xfa_object.$clone]();
+    }
+
+    this._bindValue(formNode, matches[0], picture);
+
+    this._setProperties(formNode, matches[0]);
+
+    this._bindItems(formNode, matches[0]);
+
+    if (matches.length === 1) {
+      return;
+    }
+
+    const parent = formNode[_xfa_object.$getParent]();
+
+    const name = formNode[_xfa_object.$nodeName];
+
+    const pos = parent[_xfa_object.$indexOf](formNode);
+
+    for (let i = 1, ii = matches.length; i < ii; i++) {
+      const match = matches[i];
+
+      const clone = baseClone[_xfa_object.$clone]();
+
+      clone.occur.min = 1;
+      clone.occur.max = 1;
+      clone.occur.initial = 1;
+      parent[name].push(clone);
+
+      parent[_xfa_object.$insertAt](pos + i, clone);
+
+      this._bindValue(clone, match, picture);
+
+      this._setProperties(clone, match);
+
+      this._bindItems(clone, match);
+    }
+  }
+
+  _createOccurrences(formNode) {
+    if (!this.emptyMerge) {
+      return;
+    }
+
+    const {
+      occur
+    } = formNode;
+
+    if (!occur || occur.initial <= 1) {
+      return;
+    }
+
+    const parent = formNode[_xfa_object.$getParent]();
+
+    const name = formNode[_xfa_object.$nodeName];
+
+    for (let i = 0, ii = occur.initial; i < ii; i++) {
+      const clone = formNode[_xfa_object.$clone]();
+
+      clone.occur.min = 1;
+      clone.occur.max = 1;
+      clone.occur.initial = 1;
+      parent[name].push(clone);
+
+      parent[_xfa_object.$appendChild](clone);
+    }
+  }
+
+  _getOccurInfo(formNode) {
+    const {
+      occur
+    } = formNode;
+    const dataName = formNode.name;
+
+    if (!occur || !dataName) {
+      return [1, 1];
+    }
+
+    const max = occur.max === -1 ? Infinity : occur.max;
+    return [occur.min, max];
+  }
+
+  _bindElement(formNode, dataNode) {
+    const uselessNodes = [];
+
+    this._createOccurrences(formNode);
+
+    for (const child of formNode[_xfa_object.$getChildren]()) {
+      if (child[_xfa_object.$data]) {
+        continue;
+      }
+
+      if (this._mergeMode === undefined && child[_xfa_object.$nodeName] === "subform") {
+        this._mergeMode = child.mergeMode === "consumeData";
+
+        const dataChildren = dataNode[_xfa_object.$getChildren]();
+
+        if (dataChildren.length > 0) {
+          this._bindOccurrences(child, [dataChildren[0]], null);
+        } else if (this.emptyMerge) {
+          const dataChild = child[_xfa_object.$data] = new 
_xfa_object.XmlObject(dataNode[_xfa_object.$namespaceId], child.name || "root");
+
+          dataNode[_xfa_object.$appendChild](dataChild);
+
+          this._bindElement(child, dataChild);
+        }
+
+        continue;
+      }
+
+      if (!child[_xfa_object.$isBindable]()) {
+        continue;
+      }
+
+      let global = false;
+      let picture = null;
+      let ref = null;
+      let match = null;
+
+      if (child.bind) {
+        switch (child.bind.match) {
+          case "none":
+            this._bindElement(child, dataNode);
+
+            continue;
+
+          case "global":
+            global = true;
+            break;
+
+          case "dataRef":
+            if (!child.bind.ref) {
+              (0, _util.warn)(`XFA - ref is empty in node ${child[_xfa_object.$nodeName]}.`);
+
+              this._bindElement(child, dataNode);
+
+              continue;
+            }
+
+            ref = child.bind.ref;
+            break;
+
+          default:
+            break;
+        }
+
+        if (child.bind.picture) {
+          picture = child.bind.picture[_xfa_object.$content];
+        }
+      }
+
+      const [min, max] = this._getOccurInfo(child);
+
+      if (ref) {
+        match = (0, _som.searchNode)(this.root, dataNode, ref, true, false);
+
+        if (match === null) {
+          match = (0, _som.createDataNode)(this.data, dataNode, ref);
+
+          if (!match) {
+            continue;
+          }
+
+          if (this._isConsumeData()) {
+            match[_xfa_object.$consumed] = true;
+          }
+
+          this._bindElement(child, match);
+
+          continue;
+        } else {
+          if (this._isConsumeData()) {
+            match = match.filter(node => !node[_xfa_object.$consumed]);
+          }
+
+          if (match.length > max) {
+            match = match.slice(0, max);
+          } else if (match.length === 0) {
+            match = null;
+          }
+
+          if (match && this._isConsumeData()) {
+            match.forEach(node => {
+              node[_xfa_object.$consumed] = true;
+            });
+          }
+        }
+      } else {
+        if (!child.name) {
+          this._bindElement(child, dataNode);
+
+          continue;
+        }
+
+        if (this._isConsumeData()) {
+          const matches = [];
+
+          while (matches.length < max) {
+            const found = this._findDataByNameToConsume(child.name, child[_xfa_object.$hasSettableValue](), 
dataNode, global);
+
+            if (!found) {
+              break;
+            }
+
+            found[_xfa_object.$consumed] = true;
+            matches.push(found);
+          }
+
+          match = matches.length > 0 ? matches : null;
+        } else {
+          match = dataNode[_xfa_object.$getRealChildrenByNameIt](child.name, false, 
this.emptyMerge).next().value;
+
+          if (!match) {
+            match = child[_xfa_object.$data] = new _xfa_object.XmlObject(dataNode[_xfa_object.$namespaceId], 
child.name);
+
+            if (this.emptyMerge) {
+              match[_xfa_object.$consumed] = true;
+            }
+
+            dataNode[_xfa_object.$appendChild](match);
+
+            this._setProperties(child, match);
+
+            this._bindItems(child, match);
+
+            this._bindElement(child, match);
+
+            continue;
+          }
+
+          if (this.emptyMerge) {
+            match[_xfa_object.$consumed] = true;
+          }
+
+          match = [match];
+        }
+      }
+
+      if (match) {
+        if (match.length < min) {
+          (0, _util.warn)(`XFA - Must have at least ${min} occurrences: 
${formNode[_xfa_object.$nodeName]}.`);
+          continue;
+        }
+
+        this._bindOccurrences(child, match, picture);
+      } else if (min > 0) {
+        this._setProperties(child, dataNode);
+
+        this._bindItems(child, dataNode);
+
+        this._bindElement(child, dataNode);
+      } else {
+        uselessNodes.push(child);
+      }
+    }
+
+    uselessNodes.forEach(node => node[_xfa_object.$getParent]()[_xfa_object.$removeChild](node));
+  }
+
+}
+
+exports.Binder = Binder;
+
+/***/ }),
+/* 80 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Value = exports.Text = exports.TemplateNamespace = exports.Template = exports.SetProperty = 
exports.Items = exports.Field = exports.BindItems = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _layout = __w_pdfjs_require__(81);
+
+var _html_utils = __w_pdfjs_require__(82);
+
+var _utils = __w_pdfjs_require__(76);
+
+var _util = __w_pdfjs_require__(2);
+
+var _som = __w_pdfjs_require__(78);
+
+const TEMPLATE_NS_ID = _namespaces.NamespaceIds.template.id;
+const SVG_NS = "http://www.w3.org/2000/svg";;
+const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2;
+const MAX_EMPTY_PAGES = 3;
+
+function hasMargin(node) {
+  return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || 
node.margin.leftInset);
+}
+
+function _setValue(templateNode, value) {
+  if (!templateNode.value) {
+    const nodeValue = new Value({});
+
+    templateNode[_xfa_object.$appendChild](nodeValue);
+
+    templateNode.value = nodeValue;
+  }
+
+  templateNode.value[_xfa_object.$setValue](value);
+}
+
+function* getContainedChildren(node) {
+  for (const child of node[_xfa_object.$getChildren]()) {
+    if (child instanceof SubformSet) {
+      yield* child[_xfa_object.$getContainedChildren]();
+      continue;
+    }
+
+    yield child;
+  }
+}
+
+function setTabIndex(node) {
+  while (node) {
+    if (!node.traversal || node[_xfa_object.$tabIndex]) {
+      return;
+    }
+
+    let next = null;
+
+    for (const child of node.traversal[_xfa_object.$getChildren]()) {
+      if (child.operation === "next") {
+        next = child;
+        break;
+      }
+    }
+
+    if (!next || !next.ref) {
+      return;
+    }
+
+    const root = node[_xfa_object.$getTemplateRoot]();
+
+    node[_xfa_object.$tabIndex] = ++root[_xfa_object.$tabIndex];
+
+    const ref = root[_xfa_object.$searchNode](next.ref, node);
+
+    if (!ref) {
+      return;
+    }
+
+    node = ref[0];
+  }
+}
+
+function valueToHtml(value) {
+  return _utils.HTMLResult.success({
+    name: "div",
+    attributes: {
+      class: ["xfaRich"],
+      style: Object.create(null)
+    },
+    children: [{
+      name: "span",
+      attributes: {
+        style: Object.create(null)
+      },
+      value
+    }]
   });
-});
-exports.getMetrics = getMetrics;
+}
+
+function setFirstUnsplittable(node) {
+  const root = node[_xfa_object.$getTemplateRoot]();
+
+  if (root[_xfa_object.$extra].firstUnsplittable === null) {
+    root[_xfa_object.$extra].firstUnsplittable = node;
+    root[_xfa_object.$extra].noLayoutFailure = true;
+  }
+}
+
+function unsetFirstUnsplittable(node) {
+  const root = node[_xfa_object.$getTemplateRoot]();
+
+  if (root[_xfa_object.$extra].firstUnsplittable === node) {
+    root[_xfa_object.$extra].noLayoutFailure = false;
+  }
+}
+
+function handleBreak(node) {
+  if (node[_xfa_object.$extra]) {
+    return false;
+  }
+
+  node[_xfa_object.$extra] = Object.create(null);
+
+  if (node.targetType === "auto") {
+    return false;
+  }
+
+  const root = node[_xfa_object.$getTemplateRoot]();
+
+  let target = null;
+
+  if (node.target) {
+    target = root[_xfa_object.$searchNode](node.target, node[_xfa_object.$getParent]());
+
+    if (!target) {
+      return false;
+    }
+
+    target = target[0];
+  }
+
+  const {
+    currentPageArea,
+    currentContentArea
+  } = root[_xfa_object.$extra];
+
+  if (node.targetType === "pageArea") {
+    if (!(target instanceof PageArea)) {
+      target = null;
+    }
+
+    if (node.startNew) {
+      node[_xfa_object.$extra].target = target || currentPageArea;
+      return true;
+    } else if (target && target !== currentPageArea) {
+      node[_xfa_object.$extra].target = target;
+      return true;
+    }
+
+    return false;
+  }
+
+  if (!(target instanceof ContentArea)) {
+    target = null;
+  }
+
+  const pageArea = target && target[_xfa_object.$getParent]();
+
+  let index;
+
+  if (node.startNew) {
+    if (target) {
+      const contentAreas = pageArea.contentArea.children;
+      index = contentAreas.findIndex(e => e === target) - 1;
+    } else {
+      index = currentPageArea.contentArea.children.findIndex(e => e === currentContentArea);
+    }
+  } else if (target && target !== currentContentArea) {
+    const contentAreas = pageArea.contentArea.children;
+    index = contentAreas.findIndex(e => e === target) - 1;
+  } else {
+    return false;
+  }
+
+  node[_xfa_object.$extra].target = pageArea === currentPageArea ? null : pageArea;
+  node[_xfa_object.$extra].index = index;
+  return true;
+}
+
+function handleOverflow(node, extraNode, space) {
+  const root = node[_xfa_object.$getTemplateRoot]();
+
+  const saved = root[_xfa_object.$extra].noLayoutFailure;
+  const savedMethod = extraNode[_xfa_object.$getSubformParent];
+
+  extraNode[_xfa_object.$getSubformParent] = () => node;
+
+  root[_xfa_object.$extra].noLayoutFailure = true;
+
+  const res = extraNode[_xfa_object.$toHTML](space);
+
+  node[_xfa_object.$addHTML](res.html, res.bbox);
+
+  root[_xfa_object.$extra].noLayoutFailure = saved;
+  extraNode[_xfa_object.$getSubformParent] = savedMethod;
+}
+
+class AppearanceFilter extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "appearanceFilter");
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Arc extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "arc", true);
+    this.circular = (0, _utils.getInteger)({
+      data: attributes.circular,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.startAngle = (0, _utils.getFloat)({
+      data: attributes.startAngle,
+      defaultValue: 0,
+      validate: x => true
+    });
+    this.sweepAngle = (0, _utils.getFloat)({
+      data: attributes.sweepAngle,
+      defaultValue: 360,
+      validate: x => true
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.edge = null;
+    this.fill = null;
+  }
+
+  [_xfa_object.$toHTML]() {
+    const edge = this.edge ? this.edge : new Edge({});
+
+    const edgeStyle = edge[_xfa_object.$toStyle]();
+
+    const style = Object.create(null);
+
+    if (this.fill && this.fill.presence === "visible") {
+      Object.assign(style, this.fill[_xfa_object.$toStyle]());
+    } else {
+      style.fill = "transparent";
+    }
+
+    style.strokeWidth = (0, _html_utils.measureToString)(edge.presence === "visible" ? edge.thickness : 0);
+    style.stroke = edgeStyle.color;
+    let arc;
+    const attributes = {
+      xmlns: SVG_NS,
+      style: {
+        width: "100%",
+        height: "100%",
+        overflow: "visible"
+      }
+    };
+
+    if (this.startAngle === 0 && this.sweepAngle === 360) {
+      arc = {
+        name: "ellipse",
+        attributes: {
+          xmlns: SVG_NS,
+          cx: "50%",
+          cy: "50%",
+          rx: "50%",
+          ry: "50%",
+          style
+        }
+      };
+    } else {
+      const startAngle = this.startAngle * Math.PI / 180;
+      const sweepAngle = this.sweepAngle * Math.PI / 180;
+      const largeArc = this.sweepAngle - this.startAngle > 180 ? 1 : 0;
+      const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + 
Math.cos(sweepAngle)), 50 * (1 - Math.sin(sweepAngle))];
+      arc = {
+        name: "path",
+        attributes: {
+          xmlns: SVG_NS,
+          d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`,
+          vectorEffect: "non-scaling-stroke",
+          style
+        }
+      };
+      Object.assign(attributes, {
+        viewBox: "0 0 100 100",
+        preserveAspectRatio: "none"
+      });
+    }
+
+    const svg = {
+      name: "svg",
+      children: [arc],
+      attributes
+    };
+
+    const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    if (hasMargin(parent)) {
+      return _utils.HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+
+    svg.attributes.style.position = "absolute";
+    return _utils.HTMLResult.success(svg);
+  }
+
+}
+
+class Area extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "area", true);
+    this.colSpan = (0, _utils.getInteger)({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.desc = null;
+    this.extras = null;
+    this.area = new _xfa_object.XFAObjectArray();
+    this.draw = new _xfa_object.XFAObjectArray();
+    this.exObject = new _xfa_object.XFAObjectArray();
+    this.exclGroup = new _xfa_object.XFAObjectArray();
+    this.field = new _xfa_object.XFAObjectArray();
+    this.subform = new _xfa_object.XFAObjectArray();
+    this.subformSet = new _xfa_object.XFAObjectArray();
+  }
+
+  *[_xfa_object.$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+
+  [_xfa_object.$isTransparent]() {
+    return true;
+  }
+
+  [_xfa_object.$addHTML](html, bbox) {
+    const [x, y, w, h] = bbox;
+    this[_xfa_object.$extra].width = Math.max(this[_xfa_object.$extra].width, x + w);
+    this[_xfa_object.$extra].height = Math.max(this[_xfa_object.$extra].height, y + h);
+
+    this[_xfa_object.$extra].children.push(html);
+  }
+
+  [_xfa_object.$getAvailableSpace]() {
+    return this[_xfa_object.$extra].availableSpace;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)(this, "position");
+    const attributes = {
+      style,
+      id: this[_xfa_object.$uid],
+      class: ["xfaArea"]
+    };
+
+    if ((0, _html_utils.isPrintOnly)(this)) {
+      attributes.class.push("xfaPrintOnly");
+    }
+
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+
+    const children = [];
+    this[_xfa_object.$extra] = {
+      children,
+      width: 0,
+      height: 0,
+      availableSpace
+    };
+
+    const result = this[_xfa_object.$childrenToHTML]({
+      filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]),
+      include: true
+    });
+
+    if (!result.success) {
+      if (result.isBreak()) {
+        return result;
+      }
+
+      delete this[_xfa_object.$extra];
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    style.width = (0, _html_utils.measureToString)(this[_xfa_object.$extra].width);
+    style.height = (0, _html_utils.measureToString)(this[_xfa_object.$extra].height);
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    const bbox = [this.x, this.y, this[_xfa_object.$extra].width, this[_xfa_object.$extra].height];
+    delete this[_xfa_object.$extra];
+    return _utils.HTMLResult.success(html, bbox);
+  }
+
+}
+
+class Assist extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "assist", true);
+    this.id = attributes.id || "";
+    this.role = attributes.role || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.speak = null;
+    this.toolTip = null;
+  }
+
+  [_xfa_object.$toHTML]() {
+    return this.toolTip && this.toolTip[_xfa_object.$content] ? this.toolTip[_xfa_object.$content] : null;
+  }
+
+}
+
+class Barcode extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "barcode", true);
+    this.charEncoding = (0, _utils.getKeyword)({
+      data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "",
+      defaultValue: "",
+      validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", 
"shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-[0-9]{2}/)
+    });
+    this.checksum = (0, _utils.getStringOption)(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", 
"2mod10", "auto"]);
+    this.dataColumnCount = (0, _utils.getInteger)({
+      data: attributes.dataColumnCount,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.dataLength = (0, _utils.getInteger)({
+      data: attributes.dataLength,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.dataPrep = (0, _utils.getStringOption)(attributes.dataPrep, ["none", "flateCompress"]);
+    this.dataRowCount = (0, _utils.getInteger)({
+      data: attributes.dataRowCount,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.endChar = attributes.endChar || "";
+    this.errorCorrectionLevel = (0, _utils.getInteger)({
+      data: attributes.errorCorrectionLevel,
+      defaultValue: -1,
+      validate: x => x >= 0 && x <= 8
+    });
+    this.id = attributes.id || "";
+    this.moduleHeight = (0, _utils.getMeasurement)(attributes.moduleHeight, "5mm");
+    this.moduleWidth = (0, _utils.getMeasurement)(attributes.moduleWidth, "0.25mm");
+    this.printCheckDigit = (0, _utils.getInteger)({
+      data: attributes.printCheckDigit,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.rowColumnRatio = (0, _utils.getRatio)(attributes.rowColumnRatio);
+    this.startChar = attributes.startChar || "";
+    this.textLocation = (0, _utils.getStringOption)(attributes.textLocation, ["below", "above", 
"aboveEmbedded", "belowEmbedded", "none"]);
+    this.truncate = (0, _utils.getInteger)({
+      data: attributes.truncate,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.type = (0, _utils.getStringOption)(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", 
"codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", 
"code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", 
"code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", 
"fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", 
"postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", 
"postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", 
"rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", 
"upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]);
+    this.upsMode = (0, _utils.getStringOption)(attributes.upsMode, ["usCarrier", "internationalCarrier", 
"secureSymbol", "standardSymbol"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.wideNarrowRatio = (0, _utils.getRatio)(attributes.wideNarrowRatio);
+    this.encrypt = null;
+    this.extras = null;
+  }
+
+}
+
+class Bind extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bind", true);
+    this.match = (0, _utils.getStringOption)(attributes.match, ["once", "dataRef", "global", "none"]);
+    this.ref = attributes.ref || "";
+    this.picture = null;
+  }
+
+}
+
+class BindItems extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bindItems");
+    this.connection = attributes.connection || "";
+    this.labelRef = attributes.labelRef || "";
+    this.ref = attributes.ref || "";
+    this.valueRef = attributes.valueRef || "";
+  }
+
+}
+
+exports.BindItems = BindItems;
+
+class Bookend extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bookend");
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class BooleanElement extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "boolean");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] === 1 ? "1" : "0");
+  }
+
+}
+
+class Border extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "border", true);
+    this.break = (0, _utils.getStringOption)(attributes.break, ["close", "open"]);
+    this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.corner = new _xfa_object.XFAObjectArray(4);
+    this.edge = new _xfa_object.XFAObjectArray(4);
+    this.extras = null;
+    this.fill = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    const edges = this.edge.children.slice();
+
+    if (edges.length < 4) {
+      const defaultEdge = edges[edges.length - 1] || new Edge({});
+
+      for (let i = edges.length; i < 4; i++) {
+        edges.push(defaultEdge);
+      }
+    }
+
+    const edgeStyles = edges.map(node => {
+      const style = node[_xfa_object.$toStyle]();
+
+      style.color = style.color || "#000000";
+      return style;
+    });
+    const widths = edges.map(edge => edge.thickness);
+    const insets = [0, 0, 0, 0];
+
+    if (this.margin) {
+      insets[0] = this.margin.topInset;
+      insets[1] = this.margin.rightInset;
+      insets[2] = this.margin.bottomInset;
+      insets[3] = this.margin.leftInset;
+    }
+
+    this[_xfa_object.$extra] = {
+      widths,
+      insets
+    };
+    const style = Object.create(null);
+
+    if (this.margin) {
+      Object.assign(style, this.margin[_xfa_object.$toStyle]());
+    }
+
+    if (this.fill && this.fill.presence === "visible") {
+      Object.assign(style, this.fill[_xfa_object.$toStyle]());
+    }
+
+    if (this.corner.children.some(node => node.radius !== 0)) {
+      const cornerStyles = this.corner.children.map(node => node[_xfa_object.$toStyle]());
+
+      if (cornerStyles.length === 2 || cornerStyles.length === 3) {
+        const last = cornerStyles[cornerStyles.length - 1];
+
+        for (let i = cornerStyles.length; i < 4; i++) {
+          cornerStyles.push(last);
+        }
+      }
+
+      style.borderRadius = cornerStyles.map(s => s.radius).join(" ");
+    }
+
+    switch (this.presence) {
+      case "invisible":
+      case "hidden":
+        style.borderStyle = "";
+        break;
+
+      case "inactive":
+        style.borderStyle = "none";
+        break;
+
+      default:
+        style.borderStyle = edgeStyles.map(s => s.style).join(" ");
+        break;
+    }
+
+    style.borderWidth = edgeStyles.map(s => s.width).join(" ");
+    style.borderColor = edgeStyles.map(s => s.color).join(" ");
+    return style;
+  }
+
+}
+
+class Break extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "break", true);
+    this.after = (0, _utils.getStringOption)(attributes.after, ["auto", "contentArea", "pageArea", 
"pageEven", "pageOdd"]);
+    this.afterTarget = attributes.afterTarget || "";
+    this.before = (0, _utils.getStringOption)(attributes.before, ["auto", "contentArea", "pageArea", 
"pageEven", "pageOdd"]);
+    this.beforeTarget = attributes.beforeTarget || "";
+    this.bookendLeader = attributes.bookendLeader || "";
+    this.bookendTrailer = attributes.bookendTrailer || "";
+    this.id = attributes.id || "";
+    this.overflowLeader = attributes.overflowLeader || "";
+    this.overflowTarget = attributes.overflowTarget || "";
+    this.overflowTrailer = attributes.overflowTrailer || "";
+    this.startNew = (0, _utils.getInteger)({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+}
+
+class BreakAfter extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "breakAfter", true);
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.startNew = (0, _utils.getInteger)({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.target = attributes.target || "";
+    this.targetType = (0, _utils.getStringOption)(attributes.targetType, ["auto", "contentArea", 
"pageArea"]);
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.script = null;
+  }
+
+}
+
+class BreakBefore extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "breakBefore", true);
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.startNew = (0, _utils.getInteger)({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.target = attributes.target || "";
+    this.targetType = (0, _utils.getStringOption)(attributes.targetType, ["auto", "contentArea", 
"pageArea"]);
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.script = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    this[_xfa_object.$extra] = {};
+    return _utils.HTMLResult.FAILURE;
+  }
+
+}
+
+class Button extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "button", true);
+    this.highlight = (0, _utils.getStringOption)(attributes.highlight, ["inverted", "none", "outline", 
"push"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return _utils.HTMLResult.success({
+      name: "button",
+      attributes: {
+        id: this[_xfa_object.$uid],
+        class: ["xfaButton"],
+        style: {}
+      },
+      children: []
+    });
+  }
+
+}
+
+class Calculate extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "calculate", true);
+    this.id = attributes.id || "";
+    this.override = (0, _utils.getStringOption)(attributes.override, ["disabled", "error", "ignore", 
"warning"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.message = null;
+    this.script = null;
+  }
+
+}
+
+class Caption extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "caption", true);
+    this.id = attributes.id || "";
+    this.placement = (0, _utils.getStringOption)(attributes.placement, ["left", "bottom", "inline", "right", 
"top"]);
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.reserve = Math.ceil((0, _utils.getMeasurement)(attributes.reserve));
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.font = null;
+    this.margin = null;
+    this.para = null;
+    this.value = null;
+  }
+
+  [_xfa_object.$setValue](value) {
+    _setValue(this, value);
+  }
+
+  [_xfa_object.$getExtra](availableSpace) {
+    if (!this[_xfa_object.$extra]) {
+      let {
+        width,
+        height
+      } = availableSpace;
+
+      switch (this.placement) {
+        case "left":
+        case "right":
+        case "inline":
+          width = this.reserve <= 0 ? width : this.reserve;
+          break;
+
+        case "top":
+        case "bottom":
+          height = this.reserve <= 0 ? height : this.reserve;
+          break;
+      }
+
+      this[_xfa_object.$extra] = (0, _html_utils.layoutNode)(this, {
+        width,
+        height
+      });
+    }
+
+    return this[_xfa_object.$extra];
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (!this.value) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    const value = this.value[_xfa_object.$toHTML](availableSpace).html;
+
+    if (!value) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    const savedReserve = this.reserve;
+
+    if (this.reserve <= 0) {
+      const {
+        w,
+        h
+      } = this[_xfa_object.$getExtra](availableSpace);
+
+      switch (this.placement) {
+        case "left":
+        case "right":
+        case "inline":
+          this.reserve = w;
+          break;
+
+        case "top":
+        case "bottom":
+          this.reserve = h;
+          break;
+      }
+    }
+
+    const children = [];
+
+    if (typeof value === "string") {
+      children.push({
+        name: "#text",
+        value
+      });
+    } else {
+      children.push(value);
+    }
+
+    const style = (0, _html_utils.toStyle)(this, "font", "margin", "visibility");
+
+    switch (this.placement) {
+      case "left":
+      case "right":
+        if (this.reserve > 0) {
+          style.width = (0, _html_utils.measureToString)(this.reserve);
+        }
+
+        break;
+
+      case "top":
+      case "bottom":
+        if (this.reserve > 0) {
+          style.height = (0, _html_utils.measureToString)(this.reserve);
+        }
+
+        break;
+    }
+
+    (0, _html_utils.setPara)(this, null, value);
+    this.reserve = savedReserve;
+    return _utils.HTMLResult.success({
+      name: "div",
+      attributes: {
+        style,
+        class: ["xfaCaption"]
+      },
+      children
+    });
+  }
+
+}
+
+class Certificate extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "certificate");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Certificates extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "certificates", true);
+    this.credentialServerPolicy = (0, _utils.getStringOption)(attributes.credentialServerPolicy, 
["optional", "required"]);
+    this.id = attributes.id || "";
+    this.url = attributes.url || "";
+    this.urlPolicy = attributes.urlPolicy || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encryption = null;
+    this.issuers = null;
+    this.keyUsage = null;
+    this.oids = null;
+    this.signing = null;
+    this.subjectDNs = null;
+  }
+
+}
+
+class CheckButton extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "checkButton", true);
+    this.id = attributes.id || "";
+    this.mark = (0, _utils.getStringOption)(attributes.mark, ["default", "check", "circle", "cross", 
"diamond", "square", "star"]);
+    this.shape = (0, _utils.getStringOption)(attributes.shape, ["square", "round"]);
+    this.size = (0, _utils.getMeasurement)(attributes.size, "10pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)("margin");
+    const size = (0, _html_utils.measureToString)(this.size);
+    style.width = style.height = size;
+    let type;
+    let className;
+    let groupId;
+
+    const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    const items = field.items.children.length && field.items.children[0][_xfa_object.$toHTML]().html || [];
+    const exportedValue = {
+      on: (items[0] || "on").toString(),
+      off: (items[1] || "off").toString()
+    };
+    const value = field.value && field.value[_xfa_object.$text]() || "off";
+    const checked = value === exportedValue.on || undefined;
+
+    const container = field[_xfa_object.$getSubformParent]();
+
+    const fieldId = field[_xfa_object.$uid];
+    let dataId;
+
+    if (container instanceof ExclGroup) {
+      groupId = container[_xfa_object.$uid];
+      type = "radio";
+      className = "xfaRadio";
+      dataId = container[_xfa_object.$data] && container[_xfa_object.$data][_xfa_object.$uid] || 
container[_xfa_object.$uid];
+    } else {
+      type = "checkbox";
+      className = "xfaCheckbox";
+      dataId = field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid];
+    }
+
+    const input = {
+      name: "input",
+      attributes: {
+        class: [className],
+        style,
+        fieldId,
+        dataId,
+        type,
+        checked,
+        xfaOn: exportedValue.on
+      }
+    };
+
+    if (groupId) {
+      input.attributes.name = groupId;
+    }
+
+    return _utils.HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [input]
+    });
+  }
+
+}
+
+class ChoiceList extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "choiceList", true);
+    this.commitOn = (0, _utils.getStringOption)(attributes.commitOn, ["select", "exit"]);
+    this.id = attributes.id || "";
+    this.open = (0, _utils.getStringOption)(attributes.open, ["userControl", "always", "multiSelect", 
"onEntry"]);
+    this.textEntry = (0, _utils.getInteger)({
+      data: attributes.textEntry,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)(this, "border", "margin");
+
+    const ui = this[_xfa_object.$getParent]();
+
+    const field = ui[_xfa_object.$getParent]();
+
+    const children = [];
+
+    if (field.items.children.length > 0) {
+      const items = field.items;
+      let displayedIndex = 0;
+      let saveIndex = 0;
+
+      if (items.children.length === 2) {
+        displayedIndex = items.children[0].save;
+        saveIndex = 1 - displayedIndex;
+      }
+
+      const displayed = items.children[displayedIndex][_xfa_object.$toHTML]().html;
+
+      const values = items.children[saveIndex][_xfa_object.$toHTML]().html;
+
+      let selected = false;
+      const value = field.value && field.value[_xfa_object.$text]() || "";
+
+      for (let i = 0, ii = displayed.length; i < ii; i++) {
+        const option = {
+          name: "option",
+          attributes: {
+            value: values[i] || displayed[i]
+          },
+          value: displayed[i]
+        };
+
+        if (values[i] === value) {
+          option.attributes.selected = selected = true;
+        }
+
+        children.push(option);
+      }
+
+      if (!selected) {
+        children.splice(0, 0, {
+          name: "option",
+          attributes: {
+            hidden: true,
+            selected: true
+          },
+          value: " "
+        });
+      }
+    }
+
+    const selectAttributes = {
+      class: ["xfaSelect"],
+      fieldId: field[_xfa_object.$uid],
+      dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid],
+      style
+    };
+
+    if (this.open === "multiSelect") {
+      selectAttributes.multiple = true;
+    }
+
+    return _utils.HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [{
+        name: "select",
+        children,
+        attributes: selectAttributes
+      }]
+    });
+  }
+
+}
+
+class Color extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "color", true);
+    this.cSpace = (0, _utils.getStringOption)(attributes.cSpace, ["SRGB"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.value = attributes.value ? (0, _utils.getColor)(attributes.value) : "";
+    this.extras = null;
+  }
+
+  [_xfa_object.$hasSettableValue]() {
+    return false;
+  }
+
+  [_xfa_object.$toStyle]() {
+    return this.value ? _util.Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null;
+  }
+
+}
+
+class Comb extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "comb");
+    this.id = attributes.id || "";
+    this.numberOfCells = (0, _utils.getInteger)({
+      data: attributes.numberOfCells,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Connect extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "connect", true);
+    this.connection = attributes.connection || "";
+    this.id = attributes.id || "";
+    this.ref = attributes.ref || "";
+    this.usage = (0, _utils.getStringOption)(attributes.usage, ["exportAndImport", "exportOnly", 
"importOnly"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.picture = null;
+  }
+
+}
+
+class ContentArea extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "contentArea", true);
+    this.h = (0, _utils.getMeasurement)(attributes.h);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = (0, _utils.getMeasurement)(attributes.w);
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.desc = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const left = (0, _html_utils.measureToString)(this.x);
+    const top = (0, _html_utils.measureToString)(this.y);
+    const style = {
+      left,
+      top,
+      width: (0, _html_utils.measureToString)(this.w),
+      height: (0, _html_utils.measureToString)(this.h)
+    };
+    const classNames = ["xfaContentarea"];
+
+    if ((0, _html_utils.isPrintOnly)(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+
+    return _utils.HTMLResult.success({
+      name: "div",
+      children: [],
+      attributes: {
+        style,
+        class: classNames,
+        id: this[_xfa_object.$uid]
+      }
+    });
+  }
+
+}
+
+class Corner extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "corner", true);
+    this.id = attributes.id || "";
+    this.inverted = (0, _utils.getInteger)({
+      data: attributes.inverted,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.join = (0, _utils.getStringOption)(attributes.join, ["square", "round"]);
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.radius = (0, _utils.getMeasurement)(attributes.radius);
+    this.stroke = (0, _utils.getStringOption)(attributes.stroke, ["solid", "dashDot", "dashDotDot", 
"dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
+    this.thickness = (0, _utils.getMeasurement)(attributes.thickness, "0.5pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    const style = (0, _html_utils.toStyle)(this, "visibility");
+    style.radius = (0, _html_utils.measureToString)(this.join === "square" ? 0 : this.radius);
+    return style;
+  }
+
+}
+
+class DateElement extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "date");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const date = this[_xfa_object.$content].trim();
+
+    this[_xfa_object.$content] = date ? new Date(date) : null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class DateTime extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "dateTime");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const date = this[_xfa_object.$content].trim();
+
+    this[_xfa_object.$content] = date ? new Date(date) : null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class DateTimeEdit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "dateTimeEdit", true);
+    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.picker = (0, _utils.getStringOption)(attributes.picker, ["host", "none"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)(this, "border", "font", "margin");
+
+    const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    const html = {
+      name: "input",
+      attributes: {
+        type: "text",
+        fieldId: field[_xfa_object.$uid],
+        dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid],
+        class: ["xfaTextfield"],
+        style
+      }
+    };
+    return _utils.HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+
+}
+
+class Decimal extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "decimal");
+    this.fracDigits = (0, _utils.getInteger)({
+      data: attributes.fracDigits,
+      defaultValue: 2,
+      validate: x => true
+    });
+    this.id = attributes.id || "";
+    this.leadDigits = (0, _utils.getInteger)({
+      data: attributes.leadDigits,
+      defaultValue: -1,
+      validate: x => true
+    });
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const number = parseFloat(this[_xfa_object.$content].trim());
+    this[_xfa_object.$content] = isNaN(number) ? null : number;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class DefaultUi extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "defaultUi", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+}
+
+class Desc extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "desc", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class DigestMethod extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class DigestMethods extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "digestMethods", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.digestMethod = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Draw extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "draw", true);
+    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", 
"bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = (0, _utils.getInteger)({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : "";
+    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", 
"radix", "right"]);
+    this.id = attributes.id || "";
+    this.locale = attributes.locale || "";
+    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt");
+    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt");
+    this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt");
+    this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.rotate = (0, _utils.getInteger)({
+      data: attributes.rotate,
+      defaultValue: 0,
+      validate: x => x % 90 === 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : "";
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.assist = null;
+    this.border = null;
+    this.caption = null;
+    this.desc = null;
+    this.extras = null;
+    this.font = null;
+    this.keep = null;
+    this.margin = null;
+    this.para = null;
+    this.traversal = null;
+    this.ui = null;
+    this.value = null;
+    this.setProperty = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$setValue](value) {
+    _setValue(this, value);
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (this.presence === "hidden" || this.presence === "inactive") {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    (0, _html_utils.fixDimensions)(this);
+    const savedW = this.w;
+    const savedH = this.h;
+    const {
+      w,
+      h,
+      isBroken
+    } = (0, _html_utils.layoutNode)(this, availableSpace);
+
+    if (w && this.w === "") {
+      if (isBroken && this[_xfa_object.$getSubformParent]()[_xfa_object.$isThereMoreWidth]()) {
+        return _utils.HTMLResult.FAILURE;
+      }
+
+      this.w = w;
+    }
+
+    if (h && this.h === "") {
+      this.h = h;
+    }
+
+    setFirstUnsplittable(this);
+
+    if (!(0, _layout.checkDimensions)(this, availableSpace)) {
+      this.w = savedW;
+      this.h = savedH;
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    unsetFirstUnsplittable(this);
+    const style = (0, _html_utils.toStyle)(this, "font", "hAlign", "dimensions", "position", "presence", 
"rotate", "anchorType", "border", "margin");
+    (0, _html_utils.setMinMaxDimensions)(this, style);
+
+    if (style.margin) {
+      style.padding = style.margin;
+      delete style.margin;
+    }
+
+    const classNames = ["xfaDraw"];
+
+    if (this.font) {
+      classNames.push("xfaFont");
+    }
+
+    if ((0, _html_utils.isPrintOnly)(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+
+    const attributes = {
+      style,
+      id: this[_xfa_object.$uid],
+      class: classNames
+    };
+
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+
+    const html = {
+      name: "div",
+      attributes,
+      children: []
+    };
+    const assist = this.assist ? this.assist[_xfa_object.$toHTML]() : null;
+
+    if (assist) {
+      html.attributes.title = assist;
+    }
+
+    const bbox = (0, _html_utils.computeBbox)(this, html, availableSpace);
+    const value = this.value ? this.value[_xfa_object.$toHTML](availableSpace).html : null;
+
+    if (value === null) {
+      this.w = savedW;
+      this.h = savedH;
+      return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+    }
+
+    html.children.push(value);
+    (0, _html_utils.setPara)(this, style, value);
+    this.w = savedW;
+    this.h = savedH;
+    return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+  }
+
+}
+
+class Edge extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "edge", true);
+    this.cap = (0, _utils.getStringOption)(attributes.cap, ["square", "butt", "round"]);
+    this.id = attributes.id || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.stroke = (0, _utils.getStringOption)(attributes.stroke, ["solid", "dashDot", "dashDotDot", 
"dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
+    this.thickness = (0, _utils.getMeasurement)(attributes.thickness, "0.5pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    const style = (0, _html_utils.toStyle)(this, "visibility");
+    Object.assign(style, {
+      linecap: this.cap,
+      width: (0, _html_utils.measureToString)(this.thickness),
+      color: this.color ? this.color[_xfa_object.$toStyle]() : "#000000",
+      style: ""
+    });
+
+    if (this.presence !== "visible") {
+      style.style = "none";
+    } else {
+      switch (this.stroke) {
+        case "solid":
+          style.style = "solid";
+          break;
+
+        case "dashDot":
+          style.style = "dashed";
+          break;
+
+        case "dashDotDot":
+          style.style = "dashed";
+          break;
+
+        case "dashed":
+          style.style = "dashed";
+          break;
+
+        case "dotted":
+          style.style = "dotted";
+          break;
+
+        case "embossed":
+          style.style = "ridge";
+          break;
+
+        case "etched":
+          style.style = "groove";
+          break;
+
+        case "lowered":
+          style.style = "inset";
+          break;
+
+        case "raised":
+          style.style = "outset";
+          break;
+      }
+    }
+
+    return style;
+  }
+
+}
+
+class Encoding extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Encodings extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encodings", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encoding = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Encrypt extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encrypt", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = null;
+  }
+
+}
+
+class EncryptData extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptData", true);
+    this.id = attributes.id || "";
+    this.operation = (0, _utils.getStringOption)(attributes.operation, ["encrypt", "decrypt"]);
+    this.target = attributes.target || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.filter = null;
+    this.manifest = null;
+  }
+
+}
+
+class Encryption extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryption", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class EncryptionMethod extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", 
"AES192-CBC"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class EncryptionMethods extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptionMethods", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encryptionMethod = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Event extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "event", true);
+    this.activity = (0, _utils.getStringOption)(attributes.activity, ["click", "change", "docClose", 
"docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", 
"mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", 
"preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]);
+    this.id = attributes.id || "";
+    this.listen = (0, _utils.getStringOption)(attributes.listen, ["refOnly", "refAndDescendents"]);
+    this.name = attributes.name || "";
+    this.ref = attributes.ref || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.encryptData = null;
+    this.execute = null;
+    this.script = null;
+    this.signData = null;
+    this.submit = null;
+  }
+
+}
+
+class ExData extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "exData");
+    this.contentType = attributes.contentType || "";
+    this.href = attributes.href || "";
+    this.id = attributes.id || "";
+    this.maxLength = (0, _utils.getInteger)({
+      data: attributes.maxLength,
+      defaultValue: -1,
+      validate: x => x >= -1
+    });
+    this.name = attributes.name || "";
+    this.rid = attributes.rid || "";
+    this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, ["none", "base64", 
"package"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$isCDATAXml]() {
+    return this.contentType === "text/html";
+  }
+
+  [_xfa_object.$onChild](child) {
+    if (this.contentType === "text/html" && child[_xfa_object.$namespaceId] === 
_namespaces.NamespaceIds.xhtml.id) {
+      this[_xfa_object.$content] = child;
+      return true;
+    }
+
+    if (this.contentType === "text/xml") {
+      this[_xfa_object.$content] = child;
+      return true;
+    }
+
+    return false;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (this.contentType !== "text/html" || !this[_xfa_object.$content]) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    return this[_xfa_object.$content][_xfa_object.$toHTML](availableSpace);
+  }
+
+}
+
+class ExObject extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "exObject", true);
+    this.archive = attributes.archive || "";
+    this.classId = attributes.classId || "";
+    this.codeBase = attributes.codeBase || "";
+    this.codeType = attributes.codeType || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.exObject = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class ExclGroup extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "exclGroup", true);
+    this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", 
"readOnly"]);
+    this.accessKey = attributes.accessKey || "";
+    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", 
"bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = (0, _utils.getInteger)({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : "";
+    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", 
"radix", "right"]);
+    this.id = attributes.id || "";
+    this.layout = (0, _utils.getStringOption)(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", 
"row", "table", "tb"]);
+    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt");
+    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt");
+    this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt");
+    this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : "";
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.assist = null;
+    this.bind = null;
+    this.border = null;
+    this.calculate = null;
+    this.caption = null;
+    this.desc = null;
+    this.extras = null;
+    this.margin = null;
+    this.para = null;
+    this.traversal = null;
+    this.validate = null;
+    this.connect = new _xfa_object.XFAObjectArray();
+    this.event = new _xfa_object.XFAObjectArray();
+    this.field = new _xfa_object.XFAObjectArray();
+    this.setProperty = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$isBindable]() {
+    return true;
+  }
+
+  [_xfa_object.$hasSettableValue]() {
+    return true;
+  }
+
+  [_xfa_object.$setValue](value) {
+    for (const field of this.field.children) {
+      if (!field.value) {
+        const nodeValue = new Value({});
+
+        field[_xfa_object.$appendChild](nodeValue);
+
+        field.value = nodeValue;
+      }
+
+      field.value[_xfa_object.$setValue](value);
+    }
+  }
+
+  [_xfa_object.$isThereMoreWidth]() {
+    return this.layout.endsWith("-tb") && this[_xfa_object.$extra].attempt === 0 && 
this[_xfa_object.$extra].numberInLine > 0 || this[_xfa_object.$getParent]()[_xfa_object.$isThereMoreWidth]();
+  }
+
+  [_xfa_object.$isSplittable]() {
+    const parent = this[_xfa_object.$getSubformParent]();
+
+    if (!parent[_xfa_object.$isSplittable]()) {
+      return false;
+    }
+
+    if (this[_xfa_object.$extra]._isSplittable !== undefined) {
+      return this[_xfa_object.$extra]._isSplittable;
+    }
+
+    if (this.layout === "position" || this.layout.includes("row")) {
+      this[_xfa_object.$extra]._isSplittable = false;
+      return false;
+    }
+
+    if (parent.layout && parent.layout.endsWith("-tb") && parent[_xfa_object.$extra].numberInLine !== 0) {
+      return false;
+    }
+
+    this[_xfa_object.$extra]._isSplittable = true;
+    return true;
+  }
+
+  [_xfa_object.$flushHTML]() {
+    return (0, _layout.flushHTML)(this);
+  }
+
+  [_xfa_object.$addHTML](html, bbox) {
+    (0, _layout.addHTML)(this, html, bbox);
+  }
+
+  [_xfa_object.$getAvailableSpace]() {
+    return (0, _layout.getAvailableSpace)(this);
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    (0, _html_utils.fixDimensions)(this);
+    const children = [];
+    const attributes = {
+      id: this[_xfa_object.$uid],
+      class: []
+    };
+    (0, _html_utils.setAccess)(this, attributes.class);
+
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = Object.create(null);
+    }
+
+    Object.assign(this[_xfa_object.$extra], {
+      children,
+      attributes,
+      attempt: 0,
+      line: null,
+      numberInLine: 0,
+      availableSpace: {
+        width: Math.min(this.w || Infinity, availableSpace.width),
+        height: Math.min(this.h || Infinity, availableSpace.height)
+      },
+      width: 0,
+      height: 0,
+      prevHeight: 0,
+      currentWidth: 0
+    });
+
+    const isSplittable = this[_xfa_object.$isSplittable]();
+
+    if (!isSplittable) {
+      setFirstUnsplittable(this);
+    }
+
+    if (!(0, _layout.checkDimensions)(this, availableSpace)) {
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    availableSpace = {
+      width: this.w === "" ? availableSpace.width : this.w,
+      height: this.h === "" ? availableSpace.height : this.h
+    };
+    const filter = new Set(["field"]);
+
+    if (this.layout.includes("row")) {
+      const columnWidths = this[_xfa_object.$getSubformParent]().columnWidths;
+
+      if (Array.isArray(columnWidths) && columnWidths.length > 0) {
+        this[_xfa_object.$extra].columnWidths = columnWidths;
+        this[_xfa_object.$extra].currentColumn = 0;
+      }
+    }
+
+    const style = (0, _html_utils.toStyle)(this, "anchorType", "dimensions", "position", "presence", 
"border", "margin", "hAlign");
+    const classNames = ["xfaExclgroup"];
+    const cl = (0, _html_utils.layoutClass)(this);
+
+    if (cl) {
+      classNames.push(cl);
+    }
+
+    if ((0, _html_utils.isPrintOnly)(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+
+    attributes.style = style;
+    attributes.class = classNames;
+
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+
+    const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
+    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
+
+    for (; this[_xfa_object.$extra].attempt < maxRun; this[_xfa_object.$extra].attempt++) {
+      if (isLrTb && this[_xfa_object.$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
+        this[_xfa_object.$extra].numberInLine = 0;
+      }
+
+      const result = this[_xfa_object.$childrenToHTML]({
+        filter,
+        include: true
+      });
+
+      if (result.success) {
+        break;
+      }
+
+      if (result.isBreak()) {
+        return result;
+      }
+
+      if (isLrTb && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine === 0 && 
!this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+        this[_xfa_object.$extra].attempt = maxRun;
+        break;
+      }
+    }
+
+    if (!isSplittable) {
+      unsetFirstUnsplittable(this);
+    }
+
+    if (this[_xfa_object.$extra].attempt === maxRun) {
+      if (!isSplittable) {
+        delete this[_xfa_object.$extra];
+      }
+
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    let marginH = 0;
+    let marginV = 0;
+
+    if (this.margin) {
+      marginH = this.margin.leftInset + this.margin.rightInset;
+      marginV = this.margin.topInset + this.margin.bottomInset;
+    }
+
+    const width = Math.max(this[_xfa_object.$extra].width + marginH, this.w || 0);
+    const height = Math.max(this[_xfa_object.$extra].height + marginV, this.h || 0);
+    const bbox = [this.x, this.y, width, height];
+
+    if (this.w === "") {
+      style.width = (0, _html_utils.measureToString)(width);
+    }
+
+    if (this.h === "") {
+      style.height = (0, _html_utils.measureToString)(height);
+    }
+
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    const assist = this.assist ? this.assist[_xfa_object.$toHTML]() : null;
+
+    if (assist) {
+      html.attributes.title = assist;
+    }
+
+    delete this[_xfa_object.$extra];
+    return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+  }
+
+}
+
+class Execute extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "execute");
+    this.connection = attributes.connection || "";
+    this.executeType = (0, _utils.getStringOption)(attributes.executeType, ["import", "remerge"]);
+    this.id = attributes.id || "";
+    this.runAt = (0, _utils.getStringOption)(attributes.runAt, ["client", "both", "server"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Extras extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "extras", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.extras = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Field extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "field", true);
+    this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", 
"readOnly"]);
+    this.accessKey = attributes.accessKey || "";
+    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", 
"bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = (0, _utils.getInteger)({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : "";
+    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", 
"radix", "right"]);
+    this.id = attributes.id || "";
+    this.locale = attributes.locale || "";
+    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt");
+    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt");
+    this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt");
+    this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.rotate = (0, _utils.getInteger)({
+      data: attributes.rotate,
+      defaultValue: 0,
+      validate: x => x % 90 === 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : "";
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.assist = null;
+    this.bind = null;
+    this.border = null;
+    this.calculate = null;
+    this.caption = null;
+    this.desc = null;
+    this.extras = null;
+    this.font = null;
+    this.format = null;
+    this.items = new _xfa_object.XFAObjectArray(2);
+    this.keep = null;
+    this.margin = null;
+    this.para = null;
+    this.traversal = null;
+    this.ui = null;
+    this.validate = null;
+    this.value = null;
+    this.bindItems = new _xfa_object.XFAObjectArray();
+    this.connect = new _xfa_object.XFAObjectArray();
+    this.event = new _xfa_object.XFAObjectArray();
+    this.setProperty = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$isBindable]() {
+    return true;
+  }
+
+  [_xfa_object.$setValue](value) {
+    _setValue(this, value);
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (!this.ui) {
+      this.ui = new Ui({});
+      this.ui[_xfa_object.$globalData] = this[_xfa_object.$globalData];
+
+      this[_xfa_object.$appendChild](this.ui);
+
+      let node;
+
+      switch (this.items.children.length) {
+        case 0:
+          node = new TextEdit({});
+          this.ui.textEdit = node;
+          break;
+
+        case 1:
+          node = new CheckButton({});
+          this.ui.checkButton = node;
+          break;
+
+        case 2:
+          node = new ChoiceList({});
+          this.ui.choiceList = node;
+          break;
+      }
+
+      this.ui[_xfa_object.$appendChild](node);
+    }
+
+    setTabIndex(this);
+
+    if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 
0) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    if (this.caption) {
+      delete this.caption[_xfa_object.$extra];
+    }
+
+    const caption = this.caption ? this.caption[_xfa_object.$toHTML](availableSpace).html : null;
+    const savedW = this.w;
+    const savedH = this.h;
+
+    if (this.w === "" || this.h === "") {
+      let marginH = 0;
+      let marginV = 0;
+
+      if (this.margin) {
+        marginH = this.margin.leftInset + this.margin.rightInset;
+        marginV = this.margin.topInset + this.margin.bottomInset;
+      }
+
+      let width = null;
+      let height = null;
+
+      if (this.caption) {
+        const {
+          w,
+          h,
+          isBroken
+        } = this.caption[_xfa_object.$getExtra](availableSpace);
+
+        if (isBroken && this[_xfa_object.$getSubformParent]()[_xfa_object.$isThereMoreWidth]()) {
+          return _utils.HTMLResult.FAILURE;
+        }
+
+        width = w;
+        height = h;
+
+        if (this.ui.checkButton) {
+          switch (this.caption.placement) {
+            case "left":
+            case "right":
+            case "inline":
+              width += this.ui.checkButton.size;
+              break;
+
+            case "top":
+            case "bottom":
+              height += this.ui.checkButton.size;
+              break;
+          }
+        }
+      }
+
+      if (width && this.w === "") {
+        this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, Math.max(this.minW, width + marginH));
+      }
+
+      if (height && this.h === "") {
+        this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, Math.max(this.minH, height + marginV));
+      }
+    }
+
+    (0, _html_utils.fixDimensions)(this);
+    setFirstUnsplittable(this);
+
+    if (!(0, _layout.checkDimensions)(this, availableSpace)) {
+      this.w = savedW;
+      this.h = savedH;
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    unsetFirstUnsplittable(this);
+    const style = (0, _html_utils.toStyle)(this, "font", "dimensions", "position", "rotate", "anchorType", 
"presence", "margin", "hAlign");
+    (0, _html_utils.setMinMaxDimensions)(this, style);
+    const classNames = ["xfaField"];
+
+    if (this.font) {
+      classNames.push("xfaFont");
+    }
+
+    if ((0, _html_utils.isPrintOnly)(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+
+    const attributes = {
+      style,
+      id: this[_xfa_object.$uid],
+      class: classNames
+    };
+
+    if (style.margin) {
+      style.padding = style.margin;
+      delete style.margin;
+    }
+
+    (0, _html_utils.setAccess)(this, classNames);
+
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+
+    const children = [];
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    const assist = this.assist ? this.assist[_xfa_object.$toHTML]() : null;
+
+    if (assist) {
+      html.attributes.title = assist;
+    }
+
+    const borderStyle = this.border ? this.border[_xfa_object.$toStyle]() : null;
+    const bbox = (0, _html_utils.computeBbox)(this, html, availableSpace);
+
+    const ui = this.ui[_xfa_object.$toHTML]().html;
+
+    if (!ui) {
+      Object.assign(style, borderStyle);
+      return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+    }
+
+    if (this[_xfa_object.$tabIndex]) {
+      if (ui.children && ui.children[0]) {
+        ui.children[0].attributes.tabindex = this[_xfa_object.$tabIndex];
+      } else {
+        ui.attributes.tabindex = this[_xfa_object.$tabIndex];
+      }
+    }
+
+    if (!ui.attributes.style) {
+      ui.attributes.style = Object.create(null);
+    }
+
+    if (this.ui.button) {
+      Object.assign(ui.attributes.style, borderStyle);
+    } else {
+      Object.assign(style, borderStyle);
+    }
+
+    children.push(ui);
+
+    if (this.value) {
+      if (this.ui.imageEdit) {
+        ui.children.push(this.value[_xfa_object.$toHTML]().html);
+      } else if (!this.ui.button) {
+        let value = "";
+
+        if (this.value.exData) {
+          value = this.value.exData[_xfa_object.$text]();
+        } else {
+          const htmlValue = this.value[_xfa_object.$toHTML]().html;
+
+          if (htmlValue !== null) {
+            value = htmlValue.children[0].value;
+          }
+        }
+
+        if (this.ui.textEdit && this.value.text && this.value.text.maxChars) {
+          ui.children[0].attributes.maxLength = this.value.text.maxChars;
+        }
+
+        if (value) {
+          if (ui.children[0].name === "textarea") {
+            ui.children[0].attributes.textContent = value;
+          } else {
+            ui.children[0].attributes.value = value;
+          }
+        }
+      }
+    }
+
+    if (!caption) {
+      if (ui.attributes.class) {
+        ui.attributes.class.push("xfaLeft");
+      }
+
+      this.w = savedW;
+      this.h = savedH;
+      return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+    }
+
+    if (this.ui.button) {
+      if (style.padding) {
+        delete style.padding;
+      }
+
+      if (caption.name === "div") {
+        caption.name = "span";
+      }
+
+      ui.children.push(caption);
+      return _utils.HTMLResult.success(html, bbox);
+    } else if (this.ui.checkButton) {
+      caption.attributes.class[0] = "xfaCaptionForCheckButton";
+    }
+
+    if (!ui.attributes.class) {
+      ui.attributes.class = [];
+    }
+
+    switch (this.caption.placement) {
+      case "left":
+        ui.children.splice(0, 0, caption);
+        ui.attributes.class.push("xfaLeft");
+        break;
+
+      case "right":
+        ui.children.push(caption);
+        ui.attributes.class.push("xfaLeft");
+        break;
+
+      case "top":
+        ui.children.splice(0, 0, caption);
+        ui.attributes.class.push("xfaTop");
+        break;
+
+      case "bottom":
+        ui.children.push(caption);
+        ui.attributes.class.push("xfaTop");
+        break;
+
+      case "inline":
+        ui.attributes.class.push("xfaLeft");
+        break;
+    }
+
+    this.w = savedW;
+    this.h = savedH;
+    return _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+  }
+
+}
+
+exports.Field = Field;
+
+class Fill extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "fill", true);
+    this.id = attributes.id || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+    this.linear = null;
+    this.pattern = null;
+    this.radial = null;
+    this.solid = null;
+    this.stipple = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    const parent = this[_xfa_object.$getParent]();
+
+    const style = Object.create(null);
+    let propName = "color";
+
+    if (parent instanceof Border) {
+      propName = "background";
+    }
+
+    if (parent instanceof Rectangle || parent instanceof Arc) {
+      propName = "fill";
+      style.fill = "white";
+    }
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (name === "extras" || name === "color") {
+        continue;
+      }
+
+      const obj = this[name];
+
+      if (!(obj instanceof _xfa_object.XFAObject)) {
+        continue;
+      }
+
+      style[propName] = obj[_xfa_object.$toStyle](this.color);
+      return style;
+    }
+
+    if (this.color) {
+      style[propName] = this.color[_xfa_object.$toStyle]();
+    }
+
+    return style;
+  }
+
+}
+
+class Filter extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "filter", true);
+    this.addRevocationInfo = (0, _utils.getStringOption)(attributes.addRevocationInfo, ["", "required", 
"optional", "none"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.version = (0, _utils.getInteger)({
+      data: this.version,
+      defaultValue: 5,
+      validate: x => x >= 1 && x <= 5
+    });
+    this.appearanceFilter = null;
+    this.certificates = null;
+    this.digestMethods = null;
+    this.encodings = null;
+    this.encryptionMethods = null;
+    this.handler = null;
+    this.lockDocument = null;
+    this.mdp = null;
+    this.reasons = null;
+    this.timeStamp = null;
+  }
+
+}
+
+class Float extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "float");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const number = parseFloat(this[_xfa_object.$content].trim());
+    this[_xfa_object.$content] = isNaN(number) ? null : number;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class Font extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "font", true);
+    this.baselineShift = (0, _utils.getMeasurement)(attributes.baselineShift);
+    this.fontHorizontalScale = (0, _utils.getFloat)({
+      data: attributes.fontHorizontalScale,
+      defaultValue: 100,
+      validate: x => x >= 0
+    });
+    this.fontVerticalScale = (0, _utils.getFloat)({
+      data: attributes.fontVerticalScale,
+      defaultValue: 100,
+      validate: x => x >= 0
+    });
+    this.id = attributes.id || "";
+    this.kerningMode = (0, _utils.getStringOption)(attributes.kerningMode, ["none", "pair"]);
+    this.letterSpacing = (0, _utils.getMeasurement)(attributes.letterSpacing, "0");
+    this.lineThrough = (0, _utils.getInteger)({
+      data: attributes.lineThrough,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.lineThroughPeriod = (0, _utils.getStringOption)(attributes.lineThroughPeriod, ["all", "word"]);
+    this.overline = (0, _utils.getInteger)({
+      data: attributes.overline,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.overlinePeriod = (0, _utils.getStringOption)(attributes.overlinePeriod, ["all", "word"]);
+    this.posture = (0, _utils.getStringOption)(attributes.posture, ["normal", "italic"]);
+    this.size = (0, _utils.getMeasurement)(attributes.size, "10pt");
+    this.typeface = attributes.typeface || "Courier";
+    this.underline = (0, _utils.getInteger)({
+      data: attributes.underline,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.underlinePeriod = (0, _utils.getStringOption)(attributes.underlinePeriod, ["all", "word"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.weight = (0, _utils.getStringOption)(attributes.weight, ["normal", "bold"]);
+    this.extras = null;
+    this.fill = null;
+  }
+
+  [_xfa_object.$clean](builder) {
+    super[_xfa_object.$clean](builder);
+
+    this[_xfa_object.$globalData].usedTypefaces.add(this.typeface);
+  }
+
+  [_xfa_object.$toStyle]() {
+    const style = (0, _html_utils.toStyle)(this, "fill");
+    const color = style.color;
+
+    if (color) {
+      if (color === "#000000") {
+        delete style.color;
+      } else if (!color.startsWith("#")) {
+        style.background = color;
+        style.backgroundClip = "text";
+        style.color = "transparent";
+      }
+    }
+
+    if (this.baselineShift) {
+      style.verticalAlign = (0, _html_utils.measureToString)(this.baselineShift);
+    }
+
+    style.fontKerning = this.kerningMode === "none" ? "none" : "normal";
+    style.letterSpacing = (0, _html_utils.measureToString)(this.letterSpacing);
+
+    if (this.lineThrough !== 0) {
+      style.textDecoration = "line-through";
+
+      if (this.lineThrough === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+
+    if (this.overline !== 0) {
+      style.textDecoration = "overline";
+
+      if (this.overline === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+
+    style.fontStyle = this.posture;
+    style.fontSize = (0, _html_utils.measureToString)(0.99 * this.size);
+    (0, _html_utils.setFontFamily)(this, this[_xfa_object.$globalData].fontFinder, style);
+
+    if (this.underline !== 0) {
+      style.textDecoration = "underline";
+
+      if (this.underline === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+
+    style.fontWeight = this.weight;
+    return style;
+  }
+
+}
+
+class Format extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "format", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.picture = null;
+  }
+
+}
+
+class Handler extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "handler");
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Hyphenation extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "hyphenation");
+    this.excludeAllCaps = (0, _utils.getInteger)({
+      data: attributes.excludeAllCaps,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.excludeInitialCap = (0, _utils.getInteger)({
+      data: attributes.excludeInitialCap,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hyphenate = (0, _utils.getInteger)({
+      data: attributes.hyphenate,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.id = attributes.id || "";
+    this.pushCharacterCount = (0, _utils.getInteger)({
+      data: attributes.pushCharacterCount,
+      defaultValue: 3,
+      validate: x => x >= 0
+    });
+    this.remainCharacterCount = (0, _utils.getInteger)({
+      data: attributes.remainCharacterCount,
+      defaultValue: 3,
+      validate: x => x >= 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.wordCharacterCount = (0, _utils.getInteger)({
+      data: attributes.wordCharacterCount,
+      defaultValue: 7,
+      validate: x => x >= 0
+    });
+  }
+
+}
+
+class Image extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "image");
+    this.aspect = (0, _utils.getStringOption)(attributes.aspect, ["fit", "actual", "height", "none", 
"width"]);
+    this.contentType = attributes.contentType || "";
+    this.href = attributes.href || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.transferEncoding = (0, _utils.getStringOption)(attributes.transferEncoding, ["base64", "none", 
"package"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$toHTML]() {
+    let buffer = this[_xfa_object.$globalData].images && this[_xfa_object.$globalData].images.get(this.href);
+
+    if (!buffer && (this.href || !this[_xfa_object.$content])) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    if (!buffer && this.transferEncoding === "base64") {
+      buffer = (0, _util.stringToBytes)(atob(this[_xfa_object.$content]));
+    }
+
+    if (!buffer) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    const blob = new Blob([buffer], {
+      type: this.contentType
+    });
+    let style;
+
+    switch (this.aspect) {
+      case "fit":
+      case "actual":
+        break;
+
+      case "height":
+        style = {
+          height: "100%",
+          objectFit: "fill"
+        };
+        break;
+
+      case "none":
+        style = {
+          width: "100%",
+          height: "100%",
+          objectFit: "fill"
+        };
+        break;
+
+      case "width":
+        style = {
+          width: "100%",
+          objectFit: "fill"
+        };
+        break;
+    }
+
+    return _utils.HTMLResult.success({
+      name: "img",
+      attributes: {
+        class: ["xfaImage"],
+        style,
+        src: URL.createObjectURL(blob)
+      }
+    });
+  }
+
+}
+
+class ImageEdit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "imageEdit", true);
+    this.data = (0, _utils.getStringOption)(attributes.data, ["link", "embed"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (this.data === "embed") {
+      return _utils.HTMLResult.success({
+        name: "div",
+        children: [],
+        attributes: {}
+      });
+    }
+
+    return _utils.HTMLResult.EMPTY;
+  }
+
+}
+
+class Integer extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "integer");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const number = parseInt(this[_xfa_object.$content].trim(), 10);
+    this[_xfa_object.$content] = isNaN(number) ? null : number;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] !== null ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class Issuers extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "issuers", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Items extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "items", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.ref = attributes.ref || "";
+    this.save = (0, _utils.getInteger)({
+      data: attributes.save,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$toHTML]() {
+    const output = [];
+
+    for (const child of this[_xfa_object.$getChildren]()) {
+      output.push(child[_xfa_object.$text]());
+    }
+
+    return _utils.HTMLResult.success(output);
+  }
+
+}
+
+exports.Items = Items;
+
+class Keep extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "keep", true);
+    this.id = attributes.id || "";
+    const options = ["none", "contentArea", "pageArea"];
+    this.intact = (0, _utils.getStringOption)(attributes.intact, options);
+    this.next = (0, _utils.getStringOption)(attributes.next, options);
+    this.previous = (0, _utils.getStringOption)(attributes.previous, options);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+}
+
+class KeyUsage extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "keyUsage");
+    const options = ["", "yes", "no"];
+    this.crlSign = (0, _utils.getStringOption)(attributes.crlSign, options);
+    this.dataEncipherment = (0, _utils.getStringOption)(attributes.dataEncipherment, options);
+    this.decipherOnly = (0, _utils.getStringOption)(attributes.decipherOnly, options);
+    this.digitalSignature = (0, _utils.getStringOption)(attributes.digitalSignature, options);
+    this.encipherOnly = (0, _utils.getStringOption)(attributes.encipherOnly, options);
+    this.id = attributes.id || "";
+    this.keyAgreement = (0, _utils.getStringOption)(attributes.keyAgreement, options);
+    this.keyCertSign = (0, _utils.getStringOption)(attributes.keyCertSign, options);
+    this.keyEncipherment = (0, _utils.getStringOption)(attributes.keyEncipherment, options);
+    this.nonRepudiation = (0, _utils.getStringOption)(attributes.nonRepudiation, options);
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Line extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "line", true);
+    this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.slope = (0, _utils.getStringOption)(attributes.slope, ["\\", "/"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.edge = null;
+  }
+
+  [_xfa_object.$toHTML]() {
+    const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    const edge = this.edge ? this.edge : new Edge({});
+
+    const edgeStyle = edge[_xfa_object.$toStyle]();
+
+    const style = Object.create(null);
+    const thickness = edge.presence === "visible" ? edge.thickness : 0;
+    style.strokeWidth = (0, _html_utils.measureToString)(thickness);
+    style.stroke = edgeStyle.color;
+    let x1, y1, x2, y2;
+    let width = "100%";
+    let height = "100%";
+
+    if (parent.w <= thickness) {
+      [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"];
+      width = style.strokeWidth;
+    } else if (parent.h <= thickness) {
+      [x1, y1, x2, y2] = [0, "50%", "100%", "50%"];
+      height = style.strokeWidth;
+    } else {
+      if (this.slope === "\\") {
+        [x1, y1, x2, y2] = [0, 0, "100%", "100%"];
+      } else {
+        [x1, y1, x2, y2] = [0, "100%", "100%", 0];
+      }
+    }
+
+    const line = {
+      name: "line",
+      attributes: {
+        xmlns: SVG_NS,
+        x1,
+        y1,
+        x2,
+        y2,
+        style
+      }
+    };
+    const svg = {
+      name: "svg",
+      children: [line],
+      attributes: {
+        xmlns: SVG_NS,
+        width,
+        height,
+        style: {
+          overflow: "visible"
+        }
+      }
+    };
+
+    if (hasMargin(parent)) {
+      return _utils.HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+
+    svg.attributes.style.position = "absolute";
+    return _utils.HTMLResult.success(svg);
+  }
+
+}
+
+class Linear extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "linear", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle](startColor) {
+    startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF";
+    const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase();
+    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000";
+    return `linear-gradient(${transf}, ${startColor}, ${endColor})`;
+  }
+
+}
+
+class LockDocument extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "lockDocument");
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = (0, _utils.getStringOption)(this[_xfa_object.$content], ["auto", "0", "1"]);
+  }
+
+}
+
+class Manifest extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "manifest", true);
+    this.action = (0, _utils.getStringOption)(attributes.action, ["include", "all", "exclude"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.ref = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Margin extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "margin", true);
+    this.bottomInset = (0, _utils.getMeasurement)(attributes.bottomInset, "0");
+    this.id = attributes.id || "";
+    this.leftInset = (0, _utils.getMeasurement)(attributes.leftInset, "0");
+    this.rightInset = (0, _utils.getMeasurement)(attributes.rightInset, "0");
+    this.topInset = (0, _utils.getMeasurement)(attributes.topInset, "0");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    return {
+      margin: (0, _html_utils.measureToString)(this.topInset) + " " + (0, 
_html_utils.measureToString)(this.rightInset) + " " + (0, _html_utils.measureToString)(this.bottomInset) + " 
" + (0, _html_utils.measureToString)(this.leftInset)
+    };
+  }
+
+}
+
+class Mdp extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "mdp");
+    this.id = attributes.id || "";
+    this.permissions = (0, _utils.getInteger)({
+      data: attributes.permissions,
+      defaultValue: 2,
+      validate: x => x === 1 || x === 3
+    });
+    this.signatureType = (0, _utils.getStringOption)(attributes.signatureType, ["filler", "author"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Medium extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "medium");
+    this.id = attributes.id || "";
+    this.imagingBBox = (0, _utils.getBBox)(attributes.imagingBBox);
+    this.long = (0, _utils.getMeasurement)(attributes.long);
+    this.orientation = (0, _utils.getStringOption)(attributes.orientation, ["portrait", "landscape"]);
+    this.short = (0, _utils.getMeasurement)(attributes.short);
+    this.stock = attributes.stock || "";
+    this.trayIn = (0, _utils.getStringOption)(attributes.trayIn, ["auto", "delegate", "pageFront"]);
+    this.trayOut = (0, _utils.getStringOption)(attributes.trayOut, ["auto", "delegate"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Message extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "message", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.text = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class NumericEdit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "numericEdit", true);
+    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)(this, "border", "font", "margin");
+
+    const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    const html = {
+      name: "input",
+      attributes: {
+        type: "text",
+        fieldId: field[_xfa_object.$uid],
+        dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid],
+        class: ["xfaTextfield"],
+        style
+      }
+    };
+    return _utils.HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+
+}
+
+class Occur extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "occur", true);
+    this.id = attributes.id || "";
+    this.initial = (0, _utils.getInteger)({
+      data: attributes.initial,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.max = (0, _utils.getInteger)({
+      data: attributes.max,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.min = (0, _utils.getInteger)({
+      data: attributes.min,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+}
+
+class Oid extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "oid");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Oids extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "oids", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.oid = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Overflow extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "overflow");
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.target = attributes.target || "";
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$getExtra]() {
+    if (!this[_xfa_object.$extra]) {
+      const parent = this[_xfa_object.$getParent]();
+
+      const root = this[_xfa_object.$getTemplateRoot]();
+
+      const target = root[_xfa_object.$searchNode](this.target, parent);
+
+      const leader = root[_xfa_object.$searchNode](this.leader, parent);
+
+      const trailer = root[_xfa_object.$searchNode](this.trailer, parent);
+
+      this[_xfa_object.$extra] = {
+        target: target && target[0] || null,
+        leader: leader && leader[0] || null,
+        trailer: trailer && trailer[0] || null,
+        addLeader: false,
+        addTrailer: false
+      };
+    }
+
+    return this[_xfa_object.$extra];
+  }
+
+}
+
+class PageArea extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pageArea", true);
+    this.blankOrNotBlank = (0, _utils.getStringOption)(attributes.blankOrNotBlank, ["any", "blank", 
"notBlank"]);
+    this.id = attributes.id || "";
+    this.initialNumber = (0, _utils.getInteger)({
+      data: attributes.initialNumber,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.name = attributes.name || "";
+    this.numbered = (0, _utils.getInteger)({
+      data: attributes.numbered,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.oddOrEven = (0, _utils.getStringOption)(attributes.oddOrEven, ["any", "even", "odd"]);
+    this.pagePosition = (0, _utils.getStringOption)(attributes.pagePosition, ["any", "first", "last", 
"only", "rest"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.desc = null;
+    this.extras = null;
+    this.medium = null;
+    this.occur = null;
+    this.area = new _xfa_object.XFAObjectArray();
+    this.contentArea = new _xfa_object.XFAObjectArray();
+    this.draw = new _xfa_object.XFAObjectArray();
+    this.exclGroup = new _xfa_object.XFAObjectArray();
+    this.field = new _xfa_object.XFAObjectArray();
+    this.subform = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$isUsable]() {
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = {
+        numberOfUse: 0
+      };
+      return true;
+    }
+
+    return !this.occur || this.occur.max === -1 || this[_xfa_object.$extra].numberOfUse < this.occur.max;
+  }
+
+  [_xfa_object.$cleanPage]() {
+    delete this[_xfa_object.$extra];
+  }
+
+  [_xfa_object.$getNextPage]() {
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = {
+        numberOfUse: 0
+      };
+    }
+
+    const parent = this[_xfa_object.$getParent]();
+
+    if (parent.relation === "orderedOccurrence") {
+      if (this[_xfa_object.$isUsable]()) {
+        this[_xfa_object.$extra].numberOfUse += 1;
+        return this;
+      }
+    }
+
+    return parent[_xfa_object.$getNextPage]();
+  }
+
+  [_xfa_object.$getAvailableSpace]() {
+    return this[_xfa_object.$extra].space || {
+      width: 0,
+      height: 0
+    };
+  }
+
+  [_xfa_object.$toHTML]() {
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = {
+        numberOfUse: 1
+      };
+    }
+
+    const children = [];
+    this[_xfa_object.$extra].children = children;
+    const style = Object.create(null);
+
+    if (this.medium && this.medium.short && this.medium.long) {
+      style.width = (0, _html_utils.measureToString)(this.medium.short);
+      style.height = (0, _html_utils.measureToString)(this.medium.long);
+      this[_xfa_object.$extra].space = {
+        width: this.medium.short,
+        height: this.medium.long
+      };
+
+      if (this.medium.orientation === "landscape") {
+        const x = style.width;
+        style.width = style.height;
+        style.height = x;
+        this[_xfa_object.$extra].space = {
+          width: this.medium.long,
+          height: this.medium.short
+        };
+      }
+    } else {
+      (0, _util.warn)("XFA - No medium specified in pageArea: please file a bug.");
+    }
+
+    this[_xfa_object.$childrenToHTML]({
+      filter: new Set(["area", "draw", "field", "subform"]),
+      include: true
+    });
+
+    this[_xfa_object.$childrenToHTML]({
+      filter: new Set(["contentArea"]),
+      include: true
+    });
+
+    return _utils.HTMLResult.success({
+      name: "div",
+      children,
+      attributes: {
+        class: ["xfaPage"],
+        id: this[_xfa_object.$uid],
+        style,
+        xfaName: this.name
+      }
+    });
+  }
+
+}
+
+class PageSet extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pageSet", true);
+    this.duplexImposition = (0, _utils.getStringOption)(attributes.duplexImposition, ["longEdge", 
"shortEdge"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relation = (0, _utils.getStringOption)(attributes.relation, ["orderedOccurrence", 
"duplexPaginated", "simplexPaginated"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.occur = null;
+    this.pageArea = new _xfa_object.XFAObjectArray();
+    this.pageSet = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$cleanPage]() {
+    for (const page of this.pageArea.children) {
+      page[_xfa_object.$cleanPage]();
+    }
+
+    for (const page of this.pageSet.children) {
+      page[_xfa_object.$cleanPage]();
+    }
+  }
+
+  [_xfa_object.$isUsable]() {
+    return !this.occur || this.occur.max === -1 || this[_xfa_object.$extra].numberOfUse < this.occur.max;
+  }
+
+  [_xfa_object.$getNextPage]() {
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = {
+        numberOfUse: 1,
+        pageIndex: -1,
+        pageSetIndex: -1
+      };
+    }
+
+    if (this.relation === "orderedOccurrence") {
+      if (this[_xfa_object.$extra].pageIndex + 1 < this.pageArea.children.length) {
+        this[_xfa_object.$extra].pageIndex += 1;
+        const pageArea = this.pageArea.children[this[_xfa_object.$extra].pageIndex];
+        return pageArea[_xfa_object.$getNextPage]();
+      }
+
+      if (this[_xfa_object.$extra].pageSetIndex + 1 < this.pageSet.children.length) {
+        this[_xfa_object.$extra].pageSetIndex += 1;
+        return this.pageSet.children[this[_xfa_object.$extra].pageSetIndex][_xfa_object.$getNextPage]();
+      }
+
+      if (this[_xfa_object.$isUsable]()) {
+        this[_xfa_object.$extra].numberOfUse += 1;
+        this[_xfa_object.$extra].pageIndex = -1;
+        this[_xfa_object.$extra].pageSetIndex = -1;
+        return this[_xfa_object.$getNextPage]();
+      }
+
+      const parent = this[_xfa_object.$getParent]();
+
+      if (parent instanceof PageSet) {
+        return parent[_xfa_object.$getNextPage]();
+      }
+
+      this[_xfa_object.$cleanPage]();
+
+      return this[_xfa_object.$getNextPage]();
+    }
+
+    const pageNumber = this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].pageNumber;
+
+    const parity = pageNumber % 2 === 0 ? "even" : "odd";
+    const position = pageNumber === 0 ? "first" : "rest";
+    let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position);
+
+    if (page) {
+      return page;
+    }
+
+    page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position);
+
+    if (page) {
+      return page;
+    }
+
+    page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any");
+
+    if (page) {
+      return page;
+    }
+
+    return this.pageArea.children[0];
+  }
+
+}
+
+class Para extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "para", true);
+    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", 
"radix", "right"]);
+    this.id = attributes.id || "";
+    this.lineHeight = attributes.lineHeight ? (0, _utils.getMeasurement)(attributes.lineHeight, "0pt") : "";
+    this.marginLeft = attributes.marginLeft ? (0, _utils.getMeasurement)(attributes.marginLeft, "0pt") : "";
+    this.marginRight = attributes.marginRight ? (0, _utils.getMeasurement)(attributes.marginRight, "0pt") : 
"";
+    this.orphans = (0, _utils.getInteger)({
+      data: attributes.orphans,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.preserve = attributes.preserve || "";
+    this.radixOffset = attributes.radixOffset ? (0, _utils.getMeasurement)(attributes.radixOffset, "0pt") : 
"";
+    this.spaceAbove = attributes.spaceAbove ? (0, _utils.getMeasurement)(attributes.spaceAbove, "0pt") : "";
+    this.spaceBelow = attributes.spaceBelow ? (0, _utils.getMeasurement)(attributes.spaceBelow, "0pt") : "";
+    this.tabDefault = attributes.tabDefault ? (0, _utils.getMeasurement)(this.tabDefault) : "";
+    this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? (0, 
_utils.getMeasurement)(x) : x);
+    this.textIndent = attributes.textIndent ? (0, _utils.getMeasurement)(attributes.textIndent, "0pt") : "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.vAlign = (0, _utils.getStringOption)(attributes.vAlign, ["top", "bottom", "middle"]);
+    this.widows = (0, _utils.getInteger)({
+      data: attributes.widows,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.hyphenation = null;
+  }
+
+  [_xfa_object.$toStyle]() {
+    const style = (0, _html_utils.toStyle)(this, "hAlign");
+
+    if (this.marginLeft !== "") {
+      style.paddingLeft = (0, _html_utils.measureToString)(this.marginLeft);
+    }
+
+    if (this.marginRight !== "") {
+      style.paddingight = (0, _html_utils.measureToString)(this.marginRight);
+    }
+
+    if (this.spaceAbove !== "") {
+      style.paddingTop = (0, _html_utils.measureToString)(this.spaceAbove);
+    }
+
+    if (this.spaceBelow !== "") {
+      style.paddingBottom = (0, _html_utils.measureToString)(this.spaceBelow);
+    }
+
+    if (this.textIndent !== "") {
+      style.textIndent = (0, _html_utils.measureToString)(this.textIndent);
+      (0, _html_utils.fixTextIndent)(style);
+    }
+
+    if (this.lineHeight > 0) {
+      style.lineHeight = (0, _html_utils.measureToString)(this.lineHeight);
+    }
+
+    if (this.tabDefault !== "") {
+      style.tabSize = (0, _html_utils.measureToString)(this.tabDefault);
+    }
+
+    if (this.tabStops.length > 0) {}
+
+    if (this.hyphenatation) {
+      Object.assign(style, this.hyphenatation[_xfa_object.$toStyle]());
+    }
+
+    return style;
+  }
+
+}
+
+class PasswordEdit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "passwordEdit", true);
+    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.passwordChar = attributes.passwordChar || "*";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+}
+
+class Pattern extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pattern", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", 
"diagonalRight", "horizontal", "vertical"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle](startColor) {
+    startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF";
+    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000";
+    const width = 5;
+    const cmd = "repeating-linear-gradient";
+    const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * 
width}px`;
+
+    switch (this.type) {
+      case "crossHatch":
+        return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`;
+
+      case "crossDiagonal":
+        return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`;
+
+      case "diagonalLeft":
+        return `${cmd}(45deg,${colors})`;
+
+      case "diagonalRight":
+        return `${cmd}(-45deg,${colors})`;
+
+      case "horizontal":
+        return `${cmd}(to top,${colors})`;
+
+      case "vertical":
+        return `${cmd}(to right,${colors})`;
+    }
+
+    return "";
+  }
+
+}
+
+class Picture extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "picture");
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Proto extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "proto", true);
+    this.appearanceFilter = new _xfa_object.XFAObjectArray();
+    this.arc = new _xfa_object.XFAObjectArray();
+    this.area = new _xfa_object.XFAObjectArray();
+    this.assist = new _xfa_object.XFAObjectArray();
+    this.barcode = new _xfa_object.XFAObjectArray();
+    this.bindItems = new _xfa_object.XFAObjectArray();
+    this.bookend = new _xfa_object.XFAObjectArray();
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.border = new _xfa_object.XFAObjectArray();
+    this.break = new _xfa_object.XFAObjectArray();
+    this.breakAfter = new _xfa_object.XFAObjectArray();
+    this.breakBefore = new _xfa_object.XFAObjectArray();
+    this.button = new _xfa_object.XFAObjectArray();
+    this.calculate = new _xfa_object.XFAObjectArray();
+    this.caption = new _xfa_object.XFAObjectArray();
+    this.certificate = new _xfa_object.XFAObjectArray();
+    this.certificates = new _xfa_object.XFAObjectArray();
+    this.checkButton = new _xfa_object.XFAObjectArray();
+    this.choiceList = new _xfa_object.XFAObjectArray();
+    this.color = new _xfa_object.XFAObjectArray();
+    this.comb = new _xfa_object.XFAObjectArray();
+    this.connect = new _xfa_object.XFAObjectArray();
+    this.contentArea = new _xfa_object.XFAObjectArray();
+    this.corner = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.dateTimeEdit = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.defaultUi = new _xfa_object.XFAObjectArray();
+    this.desc = new _xfa_object.XFAObjectArray();
+    this.digestMethod = new _xfa_object.XFAObjectArray();
+    this.digestMethods = new _xfa_object.XFAObjectArray();
+    this.draw = new _xfa_object.XFAObjectArray();
+    this.edge = new _xfa_object.XFAObjectArray();
+    this.encoding = new _xfa_object.XFAObjectArray();
+    this.encodings = new _xfa_object.XFAObjectArray();
+    this.encrypt = new _xfa_object.XFAObjectArray();
+    this.encryptData = new _xfa_object.XFAObjectArray();
+    this.encryption = new _xfa_object.XFAObjectArray();
+    this.encryptionMethod = new _xfa_object.XFAObjectArray();
+    this.encryptionMethods = new _xfa_object.XFAObjectArray();
+    this.event = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.exObject = new _xfa_object.XFAObjectArray();
+    this.exclGroup = new _xfa_object.XFAObjectArray();
+    this.execute = new _xfa_object.XFAObjectArray();
+    this.extras = new _xfa_object.XFAObjectArray();
+    this.field = new _xfa_object.XFAObjectArray();
+    this.fill = new _xfa_object.XFAObjectArray();
+    this.filter = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.font = new _xfa_object.XFAObjectArray();
+    this.format = new _xfa_object.XFAObjectArray();
+    this.handler = new _xfa_object.XFAObjectArray();
+    this.hyphenation = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.imageEdit = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.issuers = new _xfa_object.XFAObjectArray();
+    this.items = new _xfa_object.XFAObjectArray();
+    this.keep = new _xfa_object.XFAObjectArray();
+    this.keyUsage = new _xfa_object.XFAObjectArray();
+    this.line = new _xfa_object.XFAObjectArray();
+    this.linear = new _xfa_object.XFAObjectArray();
+    this.lockDocument = new _xfa_object.XFAObjectArray();
+    this.manifest = new _xfa_object.XFAObjectArray();
+    this.margin = new _xfa_object.XFAObjectArray();
+    this.mdp = new _xfa_object.XFAObjectArray();
+    this.medium = new _xfa_object.XFAObjectArray();
+    this.message = new _xfa_object.XFAObjectArray();
+    this.numericEdit = new _xfa_object.XFAObjectArray();
+    this.occur = new _xfa_object.XFAObjectArray();
+    this.oid = new _xfa_object.XFAObjectArray();
+    this.oids = new _xfa_object.XFAObjectArray();
+    this.overflow = new _xfa_object.XFAObjectArray();
+    this.pageArea = new _xfa_object.XFAObjectArray();
+    this.pageSet = new _xfa_object.XFAObjectArray();
+    this.para = new _xfa_object.XFAObjectArray();
+    this.passwordEdit = new _xfa_object.XFAObjectArray();
+    this.pattern = new _xfa_object.XFAObjectArray();
+    this.picture = new _xfa_object.XFAObjectArray();
+    this.radial = new _xfa_object.XFAObjectArray();
+    this.reason = new _xfa_object.XFAObjectArray();
+    this.reasons = new _xfa_object.XFAObjectArray();
+    this.rectangle = new _xfa_object.XFAObjectArray();
+    this.ref = new _xfa_object.XFAObjectArray();
+    this.script = new _xfa_object.XFAObjectArray();
+    this.setProperty = new _xfa_object.XFAObjectArray();
+    this.signData = new _xfa_object.XFAObjectArray();
+    this.signature = new _xfa_object.XFAObjectArray();
+    this.signing = new _xfa_object.XFAObjectArray();
+    this.solid = new _xfa_object.XFAObjectArray();
+    this.speak = new _xfa_object.XFAObjectArray();
+    this.stipple = new _xfa_object.XFAObjectArray();
+    this.subform = new _xfa_object.XFAObjectArray();
+    this.subformSet = new _xfa_object.XFAObjectArray();
+    this.subjectDN = new _xfa_object.XFAObjectArray();
+    this.subjectDNs = new _xfa_object.XFAObjectArray();
+    this.submit = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.textEdit = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+    this.timeStamp = new _xfa_object.XFAObjectArray();
+    this.toolTip = new _xfa_object.XFAObjectArray();
+    this.traversal = new _xfa_object.XFAObjectArray();
+    this.traverse = new _xfa_object.XFAObjectArray();
+    this.ui = new _xfa_object.XFAObjectArray();
+    this.validate = new _xfa_object.XFAObjectArray();
+    this.value = new _xfa_object.XFAObjectArray();
+    this.variables = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Radial extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "radial", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["toEdge", "toCenter"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle](startColor) {
+    startColor = startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF";
+    const endColor = this.color ? this.color[_xfa_object.$toStyle]() : "#000000";
+    const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`;
+    return `radial-gradient(circle at center, ${colors})`;
+  }
+
+}
+
+class Reason extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "reason");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Reasons extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "reasons", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.reason = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Rectangle extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "rectangle", true);
+    this.hand = (0, _utils.getStringOption)(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.corner = new _xfa_object.XFAObjectArray(4);
+    this.edge = new _xfa_object.XFAObjectArray(4);
+    this.fill = null;
+  }
+
+  [_xfa_object.$toHTML]() {
+    const edge = this.edge.children.length ? this.edge.children[0] : new Edge({});
+
+    const edgeStyle = edge[_xfa_object.$toStyle]();
+
+    const style = Object.create(null);
+
+    if (this.fill && this.fill.presence === "visible") {
+      Object.assign(style, this.fill[_xfa_object.$toStyle]());
+    } else {
+      style.fill = "transparent";
+    }
+
+    style.strokeWidth = (0, _html_utils.measureToString)(edge.presence === "visible" ? edge.thickness : 0);
+    style.stroke = edgeStyle.color;
+    const corner = this.corner.children.length ? this.corner.children[0] : new Corner({});
+
+    const cornerStyle = corner[_xfa_object.$toStyle]();
+
+    const rect = {
+      name: "rect",
+      attributes: {
+        xmlns: SVG_NS,
+        width: "100%",
+        height: "100%",
+        x: 0,
+        y: 0,
+        rx: cornerStyle.radius,
+        ry: cornerStyle.radius,
+        style
+      }
+    };
+    const svg = {
+      name: "svg",
+      children: [rect],
+      attributes: {
+        xmlns: SVG_NS,
+        style: {
+          overflow: "visible"
+        },
+        width: "100%",
+        height: "100%"
+      }
+    };
+
+    const parent = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    if (hasMargin(parent)) {
+      return _utils.HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+
+    svg.attributes.style.position = "absolute";
+    return _utils.HTMLResult.success(svg);
+  }
+
+}
+
+class RefElement extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "ref");
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Script extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "script");
+    this.binding = attributes.binding || "";
+    this.contentType = attributes.contentType || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.runAt = (0, _utils.getStringOption)(attributes.runAt, ["client", "both", "server"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class SetProperty extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "setProperty");
+    this.connection = attributes.connection || "";
+    this.ref = attributes.ref || "";
+    this.target = attributes.target || "";
+  }
+
+}
+
+exports.SetProperty = SetProperty;
+
+class SignData extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signData", true);
+    this.id = attributes.id || "";
+    this.operation = (0, _utils.getStringOption)(attributes.operation, ["sign", "clear", "verify"]);
+    this.ref = attributes.ref || "";
+    this.target = attributes.target || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.filter = null;
+    this.manifest = null;
+  }
+
+}
+
+class Signature extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signature", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["PDF1.3", "PDF1.6"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.filter = null;
+    this.manifest = null;
+    this.margin = null;
+  }
+
+}
+
+class Signing extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signing", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Solid extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "solid", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle](startColor) {
+    return startColor ? startColor[_xfa_object.$toStyle]() : "#FFFFFF";
+  }
+
+}
+
+class Speak extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "speak");
+    this.disable = (0, _utils.getInteger)({
+      data: attributes.disable,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.id = attributes.id || "";
+    this.priority = (0, _utils.getStringOption)(attributes.priority, ["custom", "caption", "name", 
"toolTip"]);
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Stipple extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "stipple", true);
+    this.id = attributes.id || "";
+    this.rate = (0, _utils.getInteger)({
+      data: attributes.rate,
+      defaultValue: 50,
+      validate: x => x >= 0 && x <= 100
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+
+  [_xfa_object.$toStyle](bgColor) {
+    const alpha = this.rate / 100;
+    return _util.Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), 
Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + 
this.value.b * alpha));
+  }
+
+}
+
+class Subform extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subform", true);
+    this.access = (0, _utils.getStringOption)(attributes.access, ["open", "nonInteractive", "protected", 
"readOnly"]);
+    this.allowMacro = (0, _utils.getInteger)({
+      data: attributes.allowMacro,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.anchorType = (0, _utils.getStringOption)(attributes.anchorType, ["topLeft", "bottomCenter", 
"bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = (0, _utils.getInteger)({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : (0, 
_utils.getMeasurement)(x));
+    this.h = attributes.h ? (0, _utils.getMeasurement)(attributes.h) : "";
+    this.hAlign = (0, _utils.getStringOption)(attributes.hAlign, ["left", "center", "justify", "justifyAll", 
"radix", "right"]);
+    this.id = attributes.id || "";
+    this.layout = (0, _utils.getStringOption)(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", 
"row", "table", "tb"]);
+    this.locale = attributes.locale || "";
+    this.maxH = (0, _utils.getMeasurement)(attributes.maxH, "0pt");
+    this.maxW = (0, _utils.getMeasurement)(attributes.maxW, "0pt");
+    this.mergeMode = (0, _utils.getStringOption)(attributes.mergeMode, ["consumeData", "matchTemplate"]);
+    this.minH = (0, _utils.getMeasurement)(attributes.minH, "0pt");
+    this.minW = (0, _utils.getMeasurement)(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = (0, _utils.getStringOption)(attributes.presence, ["visible", "hidden", "inactive", 
"invisible"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.restoreState = (0, _utils.getStringOption)(attributes.restoreState, ["manual", "auto"]);
+    this.scope = (0, _utils.getStringOption)(attributes.scope, ["name", "none"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? (0, _utils.getMeasurement)(attributes.w) : "";
+    this.x = (0, _utils.getMeasurement)(attributes.x, "0pt");
+    this.y = (0, _utils.getMeasurement)(attributes.y, "0pt");
+    this.assist = null;
+    this.bind = null;
+    this.bookend = null;
+    this.border = null;
+    this.break = null;
+    this.calculate = null;
+    this.desc = null;
+    this.extras = null;
+    this.keep = null;
+    this.margin = null;
+    this.occur = null;
+    this.overflow = null;
+    this.pageSet = null;
+    this.para = null;
+    this.traversal = null;
+    this.validate = null;
+    this.variables = null;
+    this.area = new _xfa_object.XFAObjectArray();
+    this.breakAfter = new _xfa_object.XFAObjectArray();
+    this.breakBefore = new _xfa_object.XFAObjectArray();
+    this.connect = new _xfa_object.XFAObjectArray();
+    this.draw = new _xfa_object.XFAObjectArray();
+    this.event = new _xfa_object.XFAObjectArray();
+    this.exObject = new _xfa_object.XFAObjectArray();
+    this.exclGroup = new _xfa_object.XFAObjectArray();
+    this.field = new _xfa_object.XFAObjectArray();
+    this.proto = new _xfa_object.XFAObjectArray();
+    this.setProperty = new _xfa_object.XFAObjectArray();
+    this.subform = new _xfa_object.XFAObjectArray();
+    this.subformSet = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$getSubformParent]() {
+    const parent = this[_xfa_object.$getParent]();
+
+    if (parent instanceof SubformSet) {
+      return parent[_xfa_object.$getSubformParent]();
+    }
+
+    return parent;
+  }
+
+  [_xfa_object.$isBindable]() {
+    return true;
+  }
+
+  [_xfa_object.$isThereMoreWidth]() {
+    return this.layout.endsWith("-tb") && this[_xfa_object.$extra].attempt === 0 && 
this[_xfa_object.$extra].numberInLine > 0 || this[_xfa_object.$getParent]()[_xfa_object.$isThereMoreWidth]();
+  }
+
+  *[_xfa_object.$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+
+  [_xfa_object.$flushHTML]() {
+    return (0, _layout.flushHTML)(this);
+  }
+
+  [_xfa_object.$addHTML](html, bbox) {
+    (0, _layout.addHTML)(this, html, bbox);
+  }
+
+  [_xfa_object.$getAvailableSpace]() {
+    return (0, _layout.getAvailableSpace)(this);
+  }
+
+  [_xfa_object.$isSplittable]() {
+    const parent = this[_xfa_object.$getSubformParent]();
+
+    if (!parent[_xfa_object.$isSplittable]()) {
+      return false;
+    }
+
+    const contentArea = this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].currentContentArea;
+
+    if (this.overflow && this.overflow[_xfa_object.$getExtra]().target === contentArea) {
+      return false;
+    }
+
+    if (this[_xfa_object.$extra]._isSplittable !== undefined) {
+      return this[_xfa_object.$extra]._isSplittable;
+    }
+
+    if (this.layout === "position" || this.layout.includes("row")) {
+      this[_xfa_object.$extra]._isSplittable = false;
+      return false;
+    }
+
+    if (this.keep && this.keep.intact !== "none") {
+      this[_xfa_object.$extra]._isSplittable = false;
+      return false;
+    }
+
+    if (parent.layout && parent.layout.endsWith("-tb") && parent[_xfa_object.$extra].numberInLine !== 0) {
+      return false;
+    }
+
+    this[_xfa_object.$extra]._isSplittable = true;
+    return true;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (this.break) {
+      if (this.break.after !== "auto" || this.break.afterTarget !== "") {
+        const node = new BreakAfter({
+          targetType: this.break.after,
+          target: this.break.afterTarget,
+          startNew: this.break.startNew.toString()
+        });
+        node[_xfa_object.$globalData] = this[_xfa_object.$globalData];
+
+        this[_xfa_object.$appendChild](node);
+
+        this.breakAfter.push(node);
+      }
+
+      if (this.break.before !== "auto" || this.break.beforeTarget !== "") {
+        const node = new BreakBefore({
+          targetType: this.break.before,
+          target: this.break.beforeTarget,
+          startNew: this.break.startNew.toString()
+        });
+        node[_xfa_object.$globalData] = this[_xfa_object.$globalData];
+
+        this[_xfa_object.$appendChild](node);
+
+        this.breakBefore.push(node);
+      }
+
+      if (this.break.overflowTarget !== "") {
+        const node = new Overflow({
+          target: this.break.overflowTarget,
+          leader: this.break.overflowLeader,
+          trailer: this.break.overflowTrailer
+        });
+        node[_xfa_object.$globalData] = this[_xfa_object.$globalData];
+
+        this[_xfa_object.$appendChild](node);
+
+        this.overflow.push(node);
+      }
+
+      this[_xfa_object.$removeChild](this.break);
+
+      this.break = null;
+    }
+
+    if (this.presence === "hidden" || this.presence === "inactive") {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) {
+      (0, _util.warn)("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");
+    }
+
+    if (this.breakBefore.children.length >= 1) {
+      const breakBefore = this.breakBefore.children[0];
+
+      if (handleBreak(breakBefore)) {
+        return _utils.HTMLResult.breakNode(breakBefore);
+      }
+    }
+
+    if (this[_xfa_object.$extra] && this[_xfa_object.$extra].afterBreakAfter) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    (0, _html_utils.fixDimensions)(this);
+    const children = [];
+    const attributes = {
+      id: this[_xfa_object.$uid],
+      class: []
+    };
+    (0, _html_utils.setAccess)(this, attributes.class);
+
+    if (!this[_xfa_object.$extra]) {
+      this[_xfa_object.$extra] = Object.create(null);
+    }
+
+    Object.assign(this[_xfa_object.$extra], {
+      children,
+      line: null,
+      attributes,
+      attempt: 0,
+      numberInLine: 0,
+      availableSpace: {
+        width: Math.min(this.w || Infinity, availableSpace.width),
+        height: Math.min(this.h || Infinity, availableSpace.height)
+      },
+      width: 0,
+      height: 0,
+      prevHeight: 0,
+      currentWidth: 0
+    });
+
+    const root = this[_xfa_object.$getTemplateRoot]();
+
+    const currentContentArea = root[_xfa_object.$extra].currentContentArea;
+    const savedNoLayoutFailure = root[_xfa_object.$extra].noLayoutFailure;
+
+    if (this.overflow) {
+      root[_xfa_object.$extra].noLayoutFailure = root[_xfa_object.$extra].noLayoutFailure || 
this.overflow[_xfa_object.$getExtra]().target === currentContentArea;
+    }
+
+    const isSplittable = this[_xfa_object.$isSplittable]();
+
+    if (!isSplittable) {
+      setFirstUnsplittable(this);
+    }
+
+    if (!(0, _layout.checkDimensions)(this, availableSpace)) {
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]);
+
+    if (this.layout.includes("row")) {
+      const columnWidths = this[_xfa_object.$getSubformParent]().columnWidths;
+
+      if (Array.isArray(columnWidths) && columnWidths.length > 0) {
+        this[_xfa_object.$extra].columnWidths = columnWidths;
+        this[_xfa_object.$extra].currentColumn = 0;
+      }
+    }
+
+    const style = (0, _html_utils.toStyle)(this, "anchorType", "dimensions", "position", "presence", 
"border", "margin", "hAlign");
+    const classNames = ["xfaSubform"];
+    const cl = (0, _html_utils.layoutClass)(this);
+
+    if (cl) {
+      classNames.push(cl);
+    }
+
+    attributes.style = style;
+    attributes.class = classNames;
+
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+
+    if (this.overflow) {
+      const overflowExtra = this.overflow[_xfa_object.$getExtra]();
+
+      if (overflowExtra.addLeader) {
+        overflowExtra.addLeader = false;
+        handleOverflow(this, overflowExtra.leader, availableSpace);
+      }
+    }
+
+    const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
+    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
+
+    for (; this[_xfa_object.$extra].attempt < maxRun; this[_xfa_object.$extra].attempt++) {
+      if (isLrTb && this[_xfa_object.$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
+        this[_xfa_object.$extra].numberInLine = 0;
+      }
+
+      const result = this[_xfa_object.$childrenToHTML]({
+        filter,
+        include: true
+      });
+
+      if (result.success) {
+        break;
+      }
+
+      if (result.isBreak()) {
+        return result;
+      }
+
+      if (isLrTb && this[_xfa_object.$extra].attempt === 0 && this[_xfa_object.$extra].numberInLine === 0 && 
!root[_xfa_object.$extra].noLayoutFailure) {
+        this[_xfa_object.$extra].attempt = maxRun;
+        break;
+      }
+    }
+
+    if (!isSplittable) {
+      unsetFirstUnsplittable(this);
+    }
+
+    root[_xfa_object.$extra].noLayoutFailure = savedNoLayoutFailure;
+
+    if (this[_xfa_object.$extra].attempt === maxRun) {
+      if (this.overflow) {
+        this[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].overflowNode = this.overflow;
+      }
+
+      if (!isSplittable) {
+        delete this[_xfa_object.$extra];
+      }
+
+      return _utils.HTMLResult.FAILURE;
+    }
+
+    if (this.overflow) {
+      const overflowExtra = this.overflow[_xfa_object.$getExtra]();
+
+      if (overflowExtra.addTrailer) {
+        overflowExtra.addTrailer = false;
+        handleOverflow(this, overflowExtra.trailer, availableSpace);
+      }
+    }
+
+    let marginH = 0;
+    let marginV = 0;
+
+    if (this.margin) {
+      marginH = this.margin.leftInset + this.margin.rightInset;
+      marginV = this.margin.topInset + this.margin.bottomInset;
+    }
+
+    const width = Math.max(this[_xfa_object.$extra].width + marginH, this.w || 0);
+    const height = Math.max(this[_xfa_object.$extra].height + marginV, this.h || 0);
+    const bbox = [this.x, this.y, width, height];
+
+    if (this.w === "") {
+      style.width = (0, _html_utils.measureToString)(width);
+    }
+
+    if (this.h === "") {
+      style.height = (0, _html_utils.measureToString)(height);
+    }
+
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    const assist = this.assist ? this.assist[_xfa_object.$toHTML]() : null;
+
+    if (assist) {
+      html.attributes.title = assist;
+    }
+
+    const result = _utils.HTMLResult.success((0, _html_utils.createWrapper)(this, html), bbox);
+
+    if (this.breakAfter.children.length >= 1) {
+      const breakAfter = this.breakAfter.children[0];
+
+      if (handleBreak(breakAfter)) {
+        this[_xfa_object.$extra].afterBreakAfter = result;
+        return _utils.HTMLResult.breakNode(breakAfter);
+      }
+    }
+
+    delete this[_xfa_object.$extra];
+    return result;
+  }
+
+}
+
+class SubformSet extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subformSet", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relation = (0, _utils.getStringOption)(attributes.relation, ["ordered", "choice", "unordered"]);
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.bookend = null;
+    this.break = null;
+    this.desc = null;
+    this.extras = null;
+    this.occur = null;
+    this.overflow = null;
+    this.breakAfter = new _xfa_object.XFAObjectArray();
+    this.breakBefore = new _xfa_object.XFAObjectArray();
+    this.subform = new _xfa_object.XFAObjectArray();
+    this.subformSet = new _xfa_object.XFAObjectArray();
+  }
+
+  *[_xfa_object.$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+
+  [_xfa_object.$getSubformParent]() {
+    let parent = this[_xfa_object.$getParent]();
+
+    while (!(parent instanceof Subform)) {
+      parent = parent[_xfa_object.$getParent]();
+    }
+
+    return parent;
+  }
+
+}
+
+class SubjectDN extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subjectDN");
+    this.delimiter = attributes.delimiter || ",";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = new Map(this[_xfa_object.$content].split(this.delimiter).map(kv => {
+      kv = kv.split("=", 2);
+      kv[0] = kv[0].trim();
+      return kv;
+    }));
+  }
+
+}
+
+class SubjectDNs extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subjectDNs", true);
+    this.id = attributes.id || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.subjectDN = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Submit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "submit", true);
+    this.embedPDF = (0, _utils.getInteger)({
+      data: attributes.embedPDF,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.format = (0, _utils.getStringOption)(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", 
"xfd", "xml"]);
+    this.id = attributes.id || "";
+    this.target = attributes.target || "";
+    this.textEncoding = (0, _utils.getKeyword)({
+      data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "",
+      defaultValue: "",
+      validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", 
"shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-[0-9]{2}/)
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.xdpContent = attributes.xdpContent || "";
+    this.encrypt = null;
+    this.encryptData = new _xfa_object.XFAObjectArray();
+    this.signData = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Template extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "template", true);
+    this.baseProfile = (0, _utils.getStringOption)(attributes.baseProfile, ["full", "interactiveForms"]);
+    this.extras = null;
+    this.subform = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$finalize]() {
+    if (this.subform.children.length === 0) {
+      (0, _util.warn)("XFA - No subforms in template node.");
+    }
+
+    if (this.subform.children.length >= 2) {
+      (0, _util.warn)("XFA - Several subforms in template node: please file a bug.");
+    }
+
+    this[_xfa_object.$tabIndex] = 1000;
+  }
+
+  [_xfa_object.$isSplittable]() {
+    return true;
+  }
+
+  [_xfa_object.$searchNode](expr, container) {
+    if (expr.startsWith("#")) {
+      return [this[_xfa_object.$ids].get(expr.slice(1))];
+    }
+
+    return (0, _som.searchNode)(this, container, expr, true, true);
+  }
+
+  [_xfa_object.$toHTML]() {
+    if (!this.subform.children.length) {
+      return _utils.HTMLResult.success({
+        name: "div",
+        children: []
+      });
+    }
+
+    this[_xfa_object.$extra] = {
+      overflowNode: null,
+      firstUnsplittable: null,
+      currentContentArea: null,
+      currentPageArea: null,
+      noLayoutFailure: false,
+      pageNumber: 1,
+      pagePosition: "first",
+      oddOrEven: "odd",
+      blankOrNotBlank: "nonBlank"
+    };
+    const root = this.subform.children[0];
+
+    root.pageSet[_xfa_object.$cleanPage]();
+
+    const pageAreas = root.pageSet.pageArea.children;
+    const mainHtml = {
+      name: "div",
+      children: []
+    };
+    let pageArea = null;
+    let breakBefore = null;
+    let breakBeforeTarget = null;
+
+    if (root.breakBefore.children.length >= 1) {
+      breakBefore = root.breakBefore.children[0];
+      breakBeforeTarget = breakBefore.target;
+    } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 
1) {
+      breakBefore = root.subform.children[0].breakBefore.children[0];
+      breakBeforeTarget = breakBefore.target;
+    } else if (root.break && root.break.beforeTarget) {
+      breakBefore = root.break;
+      breakBeforeTarget = breakBefore.beforeTarget;
+    } else if (root.subform.children.length >= 1 && root.subform.children[0].break && 
root.subform.children[0].break.beforeTarget) {
+      breakBefore = root.subform.children[0].break;
+      breakBeforeTarget = breakBefore.beforeTarget;
+    }
+
+    if (breakBefore) {
+      const target = this[_xfa_object.$searchNode](breakBeforeTarget, breakBefore[_xfa_object.$getParent]());
+
+      if (target instanceof PageArea) {
+        pageArea = target;
+        breakBefore[_xfa_object.$extra] = {};
+      }
+    }
+
+    if (!pageArea) {
+      pageArea = pageAreas[0];
+    }
+
+    pageArea[_xfa_object.$extra] = {
+      numberOfUse: 1
+    };
+
+    const pageAreaParent = pageArea[_xfa_object.$getParent]();
+
+    pageAreaParent[_xfa_object.$extra] = {
+      numberOfUse: 1,
+      pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea),
+      pageSetIndex: 0
+    };
+    let targetPageArea;
+    let leader = null;
+    let trailer = null;
+    let hasSomething = true;
+    let hasSomethingCounter = 0;
+    let startIndex = 0;
+
+    while (true) {
+      if (!hasSomething) {
+        mainHtml.children.pop();
+
+        if (++hasSomethingCounter === MAX_EMPTY_PAGES) {
+          (0, _util.warn)("XFA - Something goes wrong: please file a bug.");
+          return mainHtml;
+        }
+      } else {
+        hasSomethingCounter = 0;
+      }
+
+      targetPageArea = null;
+      this[_xfa_object.$extra].currentPageArea = pageArea;
+
+      const page = pageArea[_xfa_object.$toHTML]().html;
+
+      mainHtml.children.push(page);
+
+      if (leader) {
+        this[_xfa_object.$extra].noLayoutFailure = true;
+        page.children.push(leader[_xfa_object.$toHTML](pageArea[_xfa_object.$extra].space).html);
+        leader = null;
+      }
+
+      if (trailer) {
+        this[_xfa_object.$extra].noLayoutFailure = true;
+        page.children.push(trailer[_xfa_object.$toHTML](pageArea[_xfa_object.$extra].space).html);
+        trailer = null;
+      }
+
+      const contentAreas = pageArea.contentArea.children;
+      const htmlContentAreas = page.children.filter(node => 
node.attributes.class.includes("xfaContentarea"));
+      hasSomething = false;
+      this[_xfa_object.$extra].firstUnsplittable = null;
+      this[_xfa_object.$extra].noLayoutFailure = false;
+
+      const flush = index => {
+        const html = root[_xfa_object.$flushHTML]();
+
+        if (html) {
+          hasSomething = hasSomething || html.children && html.children.length !== 0;
+          htmlContentAreas[index].children.push(html);
+        }
+      };
+
+      for (let i = startIndex, ii = contentAreas.length; i < ii; i++) {
+        const contentArea = this[_xfa_object.$extra].currentContentArea = contentAreas[i];
+        const space = {
+          width: contentArea.w,
+          height: contentArea.h
+        };
+        startIndex = 0;
+
+        if (leader) {
+          htmlContentAreas[i].children.push(leader[_xfa_object.$toHTML](space).html);
+          leader = null;
+        }
+
+        if (trailer) {
+          htmlContentAreas[i].children.push(trailer[_xfa_object.$toHTML](space).html);
+          trailer = null;
+        }
+
+        const html = root[_xfa_object.$toHTML](space);
+
+        if (html.success) {
+          if (html.html) {
+            hasSomething = hasSomething || html.html.children && html.html.children.length !== 0;
+            htmlContentAreas[i].children.push(html.html);
+          } else if (!hasSomething) {
+            mainHtml.children.pop();
+          }
+
+          return mainHtml;
+        }
+
+        if (html.isBreak()) {
+          const node = html.breakNode;
+          flush(i);
+
+          if (node.targetType === "auto") {
+            continue;
+          }
+
+          if (node.leader) {
+            leader = this[_xfa_object.$searchNode](node.leader, node[_xfa_object.$getParent]());
+            leader = leader ? leader[0] : null;
+          }
+
+          if (node.trailer) {
+            trailer = this[_xfa_object.$searchNode](node.trailer, node[_xfa_object.$getParent]());
+            trailer = trailer ? trailer[0] : null;
+          }
+
+          if (node.targetType === "pageArea") {
+            targetPageArea = node[_xfa_object.$extra].target;
+            i = Infinity;
+          } else if (!node[_xfa_object.$extra].target) {
+            i = node[_xfa_object.$extra].index;
+          } else {
+            targetPageArea = node[_xfa_object.$extra].target;
+            startIndex = node[_xfa_object.$extra].index + 1;
+            i = Infinity;
+          }
+
+          continue;
+        }
+
+        if (this[_xfa_object.$extra].overflowNode) {
+          const node = this[_xfa_object.$extra].overflowNode;
+          this[_xfa_object.$extra].overflowNode = null;
+
+          const overflowExtra = node[_xfa_object.$getExtra]();
+
+          const target = overflowExtra.target;
+          overflowExtra.addLeader = overflowExtra.leader !== null;
+          overflowExtra.addTrailer = overflowExtra.trailer !== null;
+          flush(i);
+          i = Infinity;
+
+          if (target instanceof PageArea) {
+            targetPageArea = target;
+          } else if (target instanceof ContentArea) {
+            const index = contentAreas.findIndex(e => e === target);
+
+            if (index !== -1) {
+              i = index - 1;
+            } else {
+              targetPageArea = target[_xfa_object.$getParent]();
+              startIndex = targetPageArea.contentArea.children.findIndex(e => e === target);
+            }
+          }
+
+          continue;
+        }
+
+        flush(i);
+      }
+
+      this[_xfa_object.$extra].pageNumber += 1;
+
+      if (targetPageArea) {
+        if (targetPageArea[_xfa_object.$isUsable]()) {
+          targetPageArea[_xfa_object.$extra].numberOfUse += 1;
+        } else {
+          targetPageArea = null;
+        }
+      }
+
+      pageArea = targetPageArea || pageArea[_xfa_object.$getNextPage]();
+    }
+  }
+
+}
+
+exports.Template = Template;
+
+class Text extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "text");
+    this.id = attributes.id || "";
+    this.maxChars = (0, _utils.getInteger)({
+      data: attributes.maxChars,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.name = attributes.name || "";
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$acceptWhitespace]() {
+    return true;
+  }
+
+  [_xfa_object.$onChild](child) {
+    if (child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.xhtml.id) {
+      this[_xfa_object.$content] = child;
+      return true;
+    }
+
+    (0, _util.warn)(`XFA - Invalid content in Text: ${child[_xfa_object.$nodeName]}.`);
+    return false;
+  }
+
+  [_xfa_object.$onText](str) {
+    if (this[_xfa_object.$content] instanceof _xfa_object.XFAObject) {
+      return;
+    }
+
+    super[_xfa_object.$onText](str);
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    if (typeof this[_xfa_object.$content] === "string") {
+      const html = valueToHtml(this[_xfa_object.$content]).html;
+
+      if (this[_xfa_object.$content].includes("\u2029")) {
+        html.name = "div";
+        html.children = [];
+
+        this[_xfa_object.$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) 
=> {
+          acc.push({
+            name: "span",
+            value: line
+          }, {
+            name: "br"
+          });
+          return acc;
+        }, [])).forEach(lines => {
+          html.children.push({
+            name: "p",
+            children: lines
+          });
+        });
+      } else if (/[\u2028\n]/.test(this[_xfa_object.$content])) {
+        html.name = "div";
+        html.children = [];
+
+        this[_xfa_object.$content].split(/[\u2028\n]/).forEach(line => {
+          html.children.push({
+            name: "span",
+            value: line
+          }, {
+            name: "br"
+          });
+        });
+      }
+
+      return _utils.HTMLResult.success(html);
+    }
+
+    return this[_xfa_object.$content][_xfa_object.$toHTML](availableSpace);
+  }
+
+}
+
+exports.Text = Text;
+
+class TextEdit extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "textEdit", true);
+    this.allowRichText = (0, _utils.getInteger)({
+      data: attributes.allowRichText,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hScrollPolicy = (0, _utils.getStringOption)(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.multiLine = attributes.multiLine || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.vScrollPolicy = (0, _utils.getStringOption)(attributes.vScrollPolicy, ["auto", "off", "on"]);
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+
+  [_xfa_object.$clean](builder) {
+    super[_xfa_object.$clean](builder);
+
+    const parent = this[_xfa_object.$getParent]();
+
+    const defaultValue = parent instanceof Draw ? 1 : 0;
+    this.multiLine = (0, _utils.getInteger)({
+      data: this.multiLine,
+      defaultValue,
+      validate: x => x === 0 || x === 1
+    });
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    const style = (0, _html_utils.toStyle)(this, "border", "font", "margin");
+    let html;
+
+    const field = this[_xfa_object.$getParent]()[_xfa_object.$getParent]();
+
+    if (this.multiLine === 1) {
+      html = {
+        name: "textarea",
+        attributes: {
+          dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid],
+          fieldId: field[_xfa_object.$uid],
+          class: ["xfaTextfield"],
+          style
+        }
+      };
+    } else {
+      html = {
+        name: "input",
+        attributes: {
+          type: "text",
+          dataId: field[_xfa_object.$data] && field[_xfa_object.$data][_xfa_object.$uid] || 
field[_xfa_object.$uid],
+          fieldId: field[_xfa_object.$uid],
+          class: ["xfaTextfield"],
+          style
+        }
+      };
+    }
+
+    return _utils.HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+
+}
+
+class Time extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "time");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+  [_xfa_object.$finalize]() {
+    const date = this[_xfa_object.$content].trim();
+
+    this[_xfa_object.$content] = date ? new Date(date) : null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return valueToHtml(this[_xfa_object.$content] ? this[_xfa_object.$content].toString() : "");
+  }
+
+}
+
+class TimeStamp extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "timeStamp");
+    this.id = attributes.id || "";
+    this.server = attributes.server || "";
+    this.type = (0, _utils.getStringOption)(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class ToolTip extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "toolTip");
+    this.id = attributes.id || "";
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Traversal extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "traversal", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.traverse = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Traverse extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "traverse", true);
+    this.id = attributes.id || "";
+    this.operation = (0, _utils.getStringOption)(attributes.operation, ["next", "back", "down", "first", 
"left", "right", "up"]);
+    this.ref = attributes.ref || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.script = null;
+  }
+
+  get name() {
+    return this.operation;
+  }
+
+  [_xfa_object.$isTransparent]() {
+    return false;
+  }
+
+}
+
+class Ui extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "ui", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.picture = null;
+    this.barcode = null;
+    this.button = null;
+    this.checkButton = null;
+    this.choiceList = null;
+    this.dateTimeEdit = null;
+    this.defaultUi = null;
+    this.imageEdit = null;
+    this.numericEdit = null;
+    this.passwordEdit = null;
+    this.signature = null;
+    this.textEdit = null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (name === "extras" || name === "picture") {
+        continue;
+      }
+
+      const obj = this[name];
+
+      if (!(obj instanceof _xfa_object.XFAObject)) {
+        continue;
+      }
+
+      return obj[_xfa_object.$toHTML](availableSpace);
+    }
+
+    return _utils.HTMLResult.EMPTY;
+  }
+
+}
+
+class Validate extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "validate", true);
+    this.formatTest = (0, _utils.getStringOption)(attributes.formatTest, ["warning", "disabled", "error"]);
+    this.id = attributes.id || "";
+    this.nullTest = (0, _utils.getStringOption)(attributes.nullTest, ["disabled", "error", "warning"]);
+    this.scriptTest = (0, _utils.getStringOption)(attributes.scriptTest, ["error", "disabled", "warning"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.message = null;
+    this.picture = null;
+    this.script = null;
+  }
+
+}
+
+class Value extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "value", true);
+    this.id = attributes.id || "";
+    this.override = (0, _utils.getInteger)({
+      data: attributes.override,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.relevant = (0, _utils.getRelevant)(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.arc = null;
+    this.boolean = null;
+    this.date = null;
+    this.dateTime = null;
+    this.decimal = null;
+    this.exData = null;
+    this.float = null;
+    this.image = null;
+    this.integer = null;
+    this.line = null;
+    this.rectangle = null;
+    this.text = null;
+    this.time = null;
+  }
+
+  [_xfa_object.$setValue](value) {
+    const parent = this[_xfa_object.$getParent]();
+
+    if (parent instanceof Field) {
+      if (parent.ui && parent.ui.imageEdit) {
+        if (!this.image) {
+          this.image = new Image({});
+        }
+
+        this.image[_xfa_object.$content] = value[_xfa_object.$content];
+        return;
+      }
+    }
+
+    const valueName = value[_xfa_object.$nodeName];
+
+    if (this[valueName] !== null) {
+      this[valueName][_xfa_object.$content] = value[_xfa_object.$content];
+      return;
+    }
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const obj = this[name];
+
+      if (obj instanceof _xfa_object.XFAObject) {
+        this[name] = null;
+
+        this[_xfa_object.$removeChild](obj);
+      }
+    }
+
+    this[value[_xfa_object.$nodeName]] = value;
+
+    this[_xfa_object.$appendChild](value);
+  }
+
+  [_xfa_object.$text]() {
+    if (this.exData) {
+      return this.exData[_xfa_object.$content][_xfa_object.$text]().trim();
+    }
+
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (name === "image") {
+        continue;
+      }
+
+      const obj = this[name];
+
+      if (obj instanceof _xfa_object.XFAObject) {
+        return (obj[_xfa_object.$content] || "").toString().trim();
+      }
+    }
+
+    return null;
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const obj = this[name];
+
+      if (!(obj instanceof _xfa_object.XFAObject)) {
+        continue;
+      }
+
+      return obj[_xfa_object.$toHTML](availableSpace);
+    }
+
+    return _utils.HTMLResult.EMPTY;
+  }
+
+}
+
+exports.Value = Value;
+
+class Variables extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "variables", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.boolean = new _xfa_object.XFAObjectArray();
+    this.date = new _xfa_object.XFAObjectArray();
+    this.dateTime = new _xfa_object.XFAObjectArray();
+    this.decimal = new _xfa_object.XFAObjectArray();
+    this.exData = new _xfa_object.XFAObjectArray();
+    this.float = new _xfa_object.XFAObjectArray();
+    this.image = new _xfa_object.XFAObjectArray();
+    this.integer = new _xfa_object.XFAObjectArray();
+    this.manifest = new _xfa_object.XFAObjectArray();
+    this.script = new _xfa_object.XFAObjectArray();
+    this.text = new _xfa_object.XFAObjectArray();
+    this.time = new _xfa_object.XFAObjectArray();
+  }
+
+  [_xfa_object.$isTransparent]() {
+    return true;
+  }
+
+}
+
+class TemplateNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (TemplateNamespace.hasOwnProperty(name)) {
+      const node = TemplateNamespace[name](attributes);
+
+      node[_xfa_object.$setSetAttributes](attributes);
+
+      return node;
+    }
+
+    return undefined;
+  }
+
+  static appearanceFilter(attrs) {
+    return new AppearanceFilter(attrs);
+  }
+
+  static arc(attrs) {
+    return new Arc(attrs);
+  }
+
+  static area(attrs) {
+    return new Area(attrs);
+  }
+
+  static assist(attrs) {
+    return new Assist(attrs);
+  }
+
+  static barcode(attrs) {
+    return new Barcode(attrs);
+  }
+
+  static bind(attrs) {
+    return new Bind(attrs);
+  }
+
+  static bindItems(attrs) {
+    return new BindItems(attrs);
+  }
+
+  static bookend(attrs) {
+    return new Bookend(attrs);
+  }
+
+  static boolean(attrs) {
+    return new BooleanElement(attrs);
+  }
+
+  static border(attrs) {
+    return new Border(attrs);
+  }
+
+  static break(attrs) {
+    return new Break(attrs);
+  }
+
+  static breakAfter(attrs) {
+    return new BreakAfter(attrs);
+  }
+
+  static breakBefore(attrs) {
+    return new BreakBefore(attrs);
+  }
+
+  static button(attrs) {
+    return new Button(attrs);
+  }
+
+  static calculate(attrs) {
+    return new Calculate(attrs);
+  }
+
+  static caption(attrs) {
+    return new Caption(attrs);
+  }
+
+  static certificate(attrs) {
+    return new Certificate(attrs);
+  }
+
+  static certificates(attrs) {
+    return new Certificates(attrs);
+  }
+
+  static checkButton(attrs) {
+    return new CheckButton(attrs);
+  }
+
+  static choiceList(attrs) {
+    return new ChoiceList(attrs);
+  }
+
+  static color(attrs) {
+    return new Color(attrs);
+  }
+
+  static comb(attrs) {
+    return new Comb(attrs);
+  }
+
+  static connect(attrs) {
+    return new Connect(attrs);
+  }
+
+  static contentArea(attrs) {
+    return new ContentArea(attrs);
+  }
+
+  static corner(attrs) {
+    return new Corner(attrs);
+  }
+
+  static date(attrs) {
+    return new DateElement(attrs);
+  }
+
+  static dateTime(attrs) {
+    return new DateTime(attrs);
+  }
+
+  static dateTimeEdit(attrs) {
+    return new DateTimeEdit(attrs);
+  }
+
+  static decimal(attrs) {
+    return new Decimal(attrs);
+  }
+
+  static defaultUi(attrs) {
+    return new DefaultUi(attrs);
+  }
+
+  static desc(attrs) {
+    return new Desc(attrs);
+  }
+
+  static digestMethod(attrs) {
+    return new DigestMethod(attrs);
+  }
+
+  static digestMethods(attrs) {
+    return new DigestMethods(attrs);
+  }
+
+  static draw(attrs) {
+    return new Draw(attrs);
+  }
+
+  static edge(attrs) {
+    return new Edge(attrs);
+  }
+
+  static encoding(attrs) {
+    return new Encoding(attrs);
+  }
+
+  static encodings(attrs) {
+    return new Encodings(attrs);
+  }
+
+  static encrypt(attrs) {
+    return new Encrypt(attrs);
+  }
+
+  static encryptData(attrs) {
+    return new EncryptData(attrs);
+  }
+
+  static encryption(attrs) {
+    return new Encryption(attrs);
+  }
+
+  static encryptionMethod(attrs) {
+    return new EncryptionMethod(attrs);
+  }
+
+  static encryptionMethods(attrs) {
+    return new EncryptionMethods(attrs);
+  }
+
+  static event(attrs) {
+    return new Event(attrs);
+  }
+
+  static exData(attrs) {
+    return new ExData(attrs);
+  }
+
+  static exObject(attrs) {
+    return new ExObject(attrs);
+  }
+
+  static exclGroup(attrs) {
+    return new ExclGroup(attrs);
+  }
+
+  static execute(attrs) {
+    return new Execute(attrs);
+  }
+
+  static extras(attrs) {
+    return new Extras(attrs);
+  }
+
+  static field(attrs) {
+    return new Field(attrs);
+  }
+
+  static fill(attrs) {
+    return new Fill(attrs);
+  }
+
+  static filter(attrs) {
+    return new Filter(attrs);
+  }
+
+  static float(attrs) {
+    return new Float(attrs);
+  }
+
+  static font(attrs) {
+    return new Font(attrs);
+  }
+
+  static format(attrs) {
+    return new Format(attrs);
+  }
+
+  static handler(attrs) {
+    return new Handler(attrs);
+  }
+
+  static hyphenation(attrs) {
+    return new Hyphenation(attrs);
+  }
+
+  static image(attrs) {
+    return new Image(attrs);
+  }
+
+  static imageEdit(attrs) {
+    return new ImageEdit(attrs);
+  }
+
+  static integer(attrs) {
+    return new Integer(attrs);
+  }
+
+  static issuers(attrs) {
+    return new Issuers(attrs);
+  }
+
+  static items(attrs) {
+    return new Items(attrs);
+  }
+
+  static keep(attrs) {
+    return new Keep(attrs);
+  }
+
+  static keyUsage(attrs) {
+    return new KeyUsage(attrs);
+  }
+
+  static line(attrs) {
+    return new Line(attrs);
+  }
+
+  static linear(attrs) {
+    return new Linear(attrs);
+  }
+
+  static lockDocument(attrs) {
+    return new LockDocument(attrs);
+  }
+
+  static manifest(attrs) {
+    return new Manifest(attrs);
+  }
+
+  static margin(attrs) {
+    return new Margin(attrs);
+  }
+
+  static mdp(attrs) {
+    return new Mdp(attrs);
+  }
+
+  static medium(attrs) {
+    return new Medium(attrs);
+  }
+
+  static message(attrs) {
+    return new Message(attrs);
+  }
+
+  static numericEdit(attrs) {
+    return new NumericEdit(attrs);
+  }
+
+  static occur(attrs) {
+    return new Occur(attrs);
+  }
+
+  static oid(attrs) {
+    return new Oid(attrs);
+  }
+
+  static oids(attrs) {
+    return new Oids(attrs);
+  }
+
+  static overflow(attrs) {
+    return new Overflow(attrs);
+  }
+
+  static pageArea(attrs) {
+    return new PageArea(attrs);
+  }
+
+  static pageSet(attrs) {
+    return new PageSet(attrs);
+  }
+
+  static para(attrs) {
+    return new Para(attrs);
+  }
+
+  static passwordEdit(attrs) {
+    return new PasswordEdit(attrs);
+  }
+
+  static pattern(attrs) {
+    return new Pattern(attrs);
+  }
+
+  static picture(attrs) {
+    return new Picture(attrs);
+  }
+
+  static proto(attrs) {
+    return new Proto(attrs);
+  }
+
+  static radial(attrs) {
+    return new Radial(attrs);
+  }
+
+  static reason(attrs) {
+    return new Reason(attrs);
+  }
+
+  static reasons(attrs) {
+    return new Reasons(attrs);
+  }
+
+  static rectangle(attrs) {
+    return new Rectangle(attrs);
+  }
+
+  static ref(attrs) {
+    return new RefElement(attrs);
+  }
+
+  static script(attrs) {
+    return new Script(attrs);
+  }
+
+  static setProperty(attrs) {
+    return new SetProperty(attrs);
+  }
+
+  static signData(attrs) {
+    return new SignData(attrs);
+  }
+
+  static signature(attrs) {
+    return new Signature(attrs);
+  }
+
+  static signing(attrs) {
+    return new Signing(attrs);
+  }
+
+  static solid(attrs) {
+    return new Solid(attrs);
+  }
+
+  static speak(attrs) {
+    return new Speak(attrs);
+  }
+
+  static stipple(attrs) {
+    return new Stipple(attrs);
+  }
+
+  static subform(attrs) {
+    return new Subform(attrs);
+  }
+
+  static subformSet(attrs) {
+    return new SubformSet(attrs);
+  }
+
+  static subjectDN(attrs) {
+    return new SubjectDN(attrs);
+  }
+
+  static subjectDNs(attrs) {
+    return new SubjectDNs(attrs);
+  }
+
+  static submit(attrs) {
+    return new Submit(attrs);
+  }
+
+  static template(attrs) {
+    return new Template(attrs);
+  }
+
+  static text(attrs) {
+    return new Text(attrs);
+  }
+
+  static textEdit(attrs) {
+    return new TextEdit(attrs);
+  }
+
+  static time(attrs) {
+    return new Time(attrs);
+  }
+
+  static timeStamp(attrs) {
+    return new TimeStamp(attrs);
+  }
+
+  static toolTip(attrs) {
+    return new ToolTip(attrs);
+  }
+
+  static traversal(attrs) {
+    return new Traversal(attrs);
+  }
+
+  static traverse(attrs) {
+    return new Traverse(attrs);
+  }
+
+  static ui(attrs) {
+    return new Ui(attrs);
+  }
+
+  static validate(attrs) {
+    return new Validate(attrs);
+  }
+
+  static value(attrs) {
+    return new Value(attrs);
+  }
+
+  static variables(attrs) {
+    return new Variables(attrs);
+  }
+
+}
+
+exports.TemplateNamespace = TemplateNamespace;
+
+/***/ }),
+/* 81 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.addHTML = addHTML;
+exports.checkDimensions = checkDimensions;
+exports.flushHTML = flushHTML;
+exports.getAvailableSpace = getAvailableSpace;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _html_utils = __w_pdfjs_require__(82);
+
+function createLine(node, children) {
+  return {
+    name: "div",
+    attributes: {
+      class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"]
+    },
+    children
+  };
+}
+
+function flushHTML(node) {
+  if (!node[_xfa_object.$extra]) {
+    return null;
+  }
+
+  const attributes = node[_xfa_object.$extra].attributes;
+  const html = {
+    name: "div",
+    attributes,
+    children: node[_xfa_object.$extra].children
+  };
+
+  if (node[_xfa_object.$extra].failingNode) {
+    const htmlFromFailing = node[_xfa_object.$extra].failingNode[_xfa_object.$flushHTML]();
+
+    if (htmlFromFailing) {
+      if (node.layout.endsWith("-tb")) {
+        html.children.push(createLine(node, [htmlFromFailing]));
+      } else {
+        html.children.push(htmlFromFailing);
+      }
+    }
+  }
+
+  if (html.children.length === 0) {
+    return null;
+  }
+
+  return html;
+}
+
+function addHTML(node, html, bbox) {
+  const extra = node[_xfa_object.$extra];
+  const availableSpace = extra.availableSpace;
+  const [x, y, w, h] = bbox;
+
+  switch (node.layout) {
+    case "position":
+      {
+        extra.width = Math.max(extra.width, x + w);
+        extra.height = Math.max(extra.height, y + h);
+        extra.children.push(html);
+        break;
+      }
+
+    case "lr-tb":
+    case "rl-tb":
+      if (!extra.line || extra.attempt === 1) {
+        extra.line = createLine(node, []);
+        extra.children.push(extra.line);
+        extra.numberInLine = 0;
+      }
+
+      extra.numberInLine += 1;
+      extra.line.children.push(html);
+
+      if (extra.attempt === 0) {
+        extra.currentWidth += w;
+        extra.height = Math.max(extra.height, extra.prevHeight + h);
+      } else {
+        extra.currentWidth = w;
+        extra.prevHeight = extra.height;
+        extra.height += h;
+        extra.attempt = 0;
+      }
+
+      extra.width = Math.max(extra.width, extra.currentWidth);
+      break;
+
+    case "rl-row":
+    case "row":
+      {
+        extra.children.push(html);
+        extra.width += w;
+        extra.height = Math.max(extra.height, h);
+        const height = (0, _html_utils.measureToString)(extra.height);
+
+        for (const child of extra.children) {
+          child.attributes.style.height = height;
+        }
+
+        break;
+      }
+
+    case "table":
+      {
+        extra.width = Math.min(availableSpace.width, Math.max(extra.width, w));
+        extra.height += h;
+        extra.children.push(html);
+        break;
+      }
+
+    case "tb":
+      {
+        extra.width = availableSpace.width;
+        extra.height += h;
+        extra.children.push(html);
+        break;
+      }
+  }
+}
+
+function getAvailableSpace(node) {
+  const availableSpace = node[_xfa_object.$extra].availableSpace;
+  const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0;
+  const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0;
+
+  switch (node.layout) {
+    case "lr-tb":
+    case "rl-tb":
+      if (node[_xfa_object.$extra].attempt === 0) {
+        return {
+          width: availableSpace.width - marginH - node[_xfa_object.$extra].currentWidth,
+          height: availableSpace.height - marginV - node[_xfa_object.$extra].prevHeight
+        };
+      }
+
+      return {
+        width: availableSpace.width - marginH,
+        height: availableSpace.height - marginV - node[_xfa_object.$extra].height
+      };
+
+    case "rl-row":
+    case "row":
+      const width = 
node[_xfa_object.$extra].columnWidths.slice(node[_xfa_object.$extra].currentColumn).reduce((a, x) => a + x);
+
+      return {
+        width,
+        height: availableSpace.height - marginH
+      };
+
+    case "table":
+    case "tb":
+      return {
+        width: availableSpace.width - marginH,
+        height: availableSpace.height - marginV - node[_xfa_object.$extra].height
+      };
+
+    case "position":
+    default:
+      return availableSpace;
+  }
+}
+
+function getTransformedBBox(node) {
+  let w = node.w === "" ? NaN : node.w;
+  let h = node.h === "" ? NaN : node.h;
+  let [centerX, centerY] = [0, 0];
+
+  switch (node.anchorType || "") {
+    case "bottomCenter":
+      [centerX, centerY] = [w / 2, h];
+      break;
+
+    case "bottomLeft":
+      [centerX, centerY] = [0, h];
+      break;
+
+    case "bottomRight":
+      [centerX, centerY] = [w, h];
+      break;
+
+    case "middleCenter":
+      [centerX, centerY] = [w / 2, h / 2];
+      break;
+
+    case "middleLeft":
+      [centerX, centerY] = [0, h / 2];
+      break;
+
+    case "middleRight":
+      [centerX, centerY] = [w, h / 2];
+      break;
+
+    case "topCenter":
+      [centerX, centerY] = [w / 2, 0];
+      break;
+
+    case "topRight":
+      [centerX, centerY] = [w, 0];
+      break;
+  }
+
+  let x, y;
+
+  switch (node.rotate || 0) {
+    case 0:
+      [x, y] = [-centerX, -centerY];
+      break;
+
+    case 90:
+      [x, y] = [-centerY, centerX];
+      [w, h] = [h, -w];
+      break;
+
+    case 180:
+      [x, y] = [centerX, centerY];
+      [w, h] = [-w, -h];
+      break;
+
+    case 270:
+      [x, y] = [centerY, -centerX];
+      [w, h] = [-h, w];
+      break;
+  }
+
+  return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)];
+}
+
+function checkDimensions(node, space) {
+  if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].firstUnsplittable === null) {
+    return true;
+  }
+
+  if (node.w === 0 || node.h === 0) {
+    return true;
+  }
+
+  const ERROR = 2;
+
+  const parent = node[_xfa_object.$getSubformParent]();
+
+  const attempt = parent[_xfa_object.$extra] && parent[_xfa_object.$extra].attempt || 0;
+  const [, y, w, h] = getTransformedBBox(node);
+
+  switch (parent.layout) {
+    case "lr-tb":
+    case "rl-tb":
+      if (attempt === 0) {
+        if (!node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+          if (node.h !== "" && Math.round(h - space.height) > ERROR) {
+            return false;
+          }
+
+          if (node.w !== "") {
+            if (Math.round(w - space.width) <= ERROR) {
+              return true;
+            }
+
+            if (parent[_xfa_object.$extra].numberInLine === 0) {
+              return space.height > 0;
+            }
+
+            return false;
+          }
+
+          return space.width > 0;
+        }
+
+        if (node.w !== "") {
+          return Math.round(w - space.width) <= ERROR;
+        }
+
+        return space.width > 0;
+      }
+
+      if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+        return true;
+      }
+
+      if (node.h !== "" && Math.round(h - space.height) > ERROR) {
+        return false;
+      }
+
+      if (node.w === "" || Math.round(w - space.width) <= ERROR) {
+        return space.height > 0;
+      }
+
+      if (parent[_xfa_object.$isThereMoreWidth]()) {
+        return false;
+      }
+
+      return space.height > 0;
+
+    case "table":
+    case "tb":
+      if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+        return true;
+      }
+
+      if (node.h !== "" && !node[_xfa_object.$isSplittable]()) {
+        return Math.round(h - space.height) <= ERROR;
+      }
+
+      if (node.w === "" || Math.round(w - space.width) <= ERROR) {
+        return space.height > 0;
+      }
+
+      if (parent[_xfa_object.$isThereMoreWidth]()) {
+        return false;
+      }
+
+      return space.height > 0;
+
+    case "position":
+      if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+        return true;
+      }
+
+      if (node.h === "" || Math.round(h + y - space.height) <= ERROR) {
+        return true;
+      }
+
+      const area = node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].currentContentArea;
+
+      return h + y > area.h;
+
+    case "rl-row":
+    case "row":
+      if (node[_xfa_object.$getTemplateRoot]()[_xfa_object.$extra].noLayoutFailure) {
+        return true;
+      }
+
+      if (node.h !== "") {
+        return Math.round(h - space.height) <= ERROR;
+      }
+
+      return true;
+
+    default:
+      return true;
+  }
+}
+
+/***/ }),
+/* 82 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.computeBbox = computeBbox;
+exports.createWrapper = createWrapper;
+exports.fixDimensions = fixDimensions;
+exports.fixTextIndent = fixTextIndent;
+exports.isPrintOnly = isPrintOnly;
+exports.layoutClass = layoutClass;
+exports.layoutNode = layoutNode;
+exports.measureToString = measureToString;
+exports.setAccess = setAccess;
+exports.setFontFamily = setFontFamily;
+exports.setMinMaxDimensions = setMinMaxDimensions;
+exports.setPara = setPara;
+exports.toStyle = toStyle;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _utils = __w_pdfjs_require__(76);
+
+var _fonts = __w_pdfjs_require__(83);
+
+var _text = __w_pdfjs_require__(84);
+
+var _util = __w_pdfjs_require__(2);
+
+function measureToString(m) {
+  if (typeof m === "string") {
+    return "0px";
+  }
+
+  return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`;
+}
+
+const converters = {
+  anchorType(node, style) {
+    const parent = node[_xfa_object.$getSubformParent]();
+
+    if (!parent || parent.layout && parent.layout !== "position") {
+      return;
+    }
+
+    if (!("transform" in style)) {
+      style.transform = "";
+    }
+
+    switch (node.anchorType) {
+      case "bottomCenter":
+        style.transform += "translate(-50%, -100%)";
+        break;
+
+      case "bottomLeft":
+        style.transform += "translate(0,-100%)";
+        break;
+
+      case "bottomRight":
+        style.transform += "translate(-100%,-100%)";
+        break;
+
+      case "middleCenter":
+        style.transform += "translate(-50%,-50%)";
+        break;
+
+      case "middleLeft":
+        style.transform += "translate(0,-50%)";
+        break;
+
+      case "middleRight":
+        style.transform += "translate(-100%,-50%)";
+        break;
+
+      case "topCenter":
+        style.transform += "translate(-50%,0)";
+        break;
+
+      case "topRight":
+        style.transform += "translate(-100%,0)";
+        break;
+    }
+  },
+
+  dimensions(node, style) {
+    const parent = node[_xfa_object.$getSubformParent]();
+
+    let width = node.w;
+    const height = node.h;
+
+    if (parent.layout && parent.layout.includes("row")) {
+      const extra = parent[_xfa_object.$extra];
+      const colSpan = node.colSpan;
+      let w;
+
+      if (colSpan === -1) {
+        w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0);
+        extra.currentColumn = 0;
+      } else {
+        w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a 
+ x, 0);
+        extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length;
+      }
+
+      if (!isNaN(w)) {
+        width = node.w = w;
+      }
+    }
+
+    if (width !== "") {
+      style.width = measureToString(width);
+    } else {
+      style.width = "auto";
+    }
+
+    if (height !== "") {
+      style.height = measureToString(height);
+    } else {
+      style.height = "auto";
+    }
+  },
+
+  position(node, style) {
+    const parent = node[_xfa_object.$getSubformParent]();
+
+    if (parent && parent.layout && parent.layout !== "position") {
+      return;
+    }
+
+    style.position = "absolute";
+    style.left = measureToString(node.x);
+    style.top = measureToString(node.y);
+  },
+
+  rotate(node, style) {
+    if (node.rotate) {
+      if (!("transform" in style)) {
+        style.transform = "";
+      }
+
+      style.transform += `rotate(-${node.rotate}deg)`;
+      style.transformOrigin = "top left";
+    }
+  },
+
+  presence(node, style) {
+    switch (node.presence) {
+      case "invisible":
+        style.visibility = "hidden";
+        break;
+
+      case "hidden":
+      case "inactive":
+        style.display = "none";
+        break;
+    }
+  },
+
+  hAlign(node, style) {
+    if (node[_xfa_object.$nodeName] === "para") {
+      switch (node.hAlign) {
+        case "justifyAll":
+          style.textAlign = "justify-all";
+          break;
+
+        case "radix":
+          style.textAlign = "left";
+          break;
+
+        default:
+          style.textAlign = node.hAlign;
+      }
+    } else {
+      switch (node.hAlign) {
+        case "left":
+          style.alignSelf = "start";
+          break;
+
+        case "center":
+          style.alignSelf = "center";
+          break;
+
+        case "right":
+          style.alignSelf = "end";
+          break;
+      }
+    }
+  },
+
+  margin(node, style) {
+    if (node.margin) {
+      style.margin = node.margin[_xfa_object.$toStyle]().margin;
+    }
+  }
+
+};
+
+function setMinMaxDimensions(node, style) {
+  const parent = node[_xfa_object.$getSubformParent]();
+
+  if (parent.layout === "position") {
+    if (node.minW > 0) {
+      style.minWidth = measureToString(node.minW);
+    }
+
+    if (node.maxW > 0) {
+      style.maxWidth = measureToString(node.maxW);
+    }
+
+    if (node.minH > 0) {
+      style.minHeight = measureToString(node.minH);
+    }
+
+    if (node.maxH > 0) {
+      style.maxHeight = measureToString(node.maxH);
+    }
+  }
+}
+
+function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) {
+  const measure = new _text.TextMeasure(xfaFont, margin, lineHeight, fontFinder);
+
+  if (typeof text === "string") {
+    measure.addString(text);
+  } else {
+    text[_xfa_object.$pushGlyphs](measure);
+  }
+
+  return measure.compute(width);
+}
+
+function layoutNode(node, availableSpace) {
+  let height = null;
+  let width = null;
+  let isBroken = false;
+
+  if ((!node.w || !node.h) && node.value) {
+    let marginH = 0;
+    let marginV = 0;
+
+    if (node.margin) {
+      marginH = node.margin.leftInset + node.margin.rightInset;
+      marginV = node.margin.topInset + node.margin.bottomInset;
+    }
+
+    let lineHeight = null;
+    let margin = null;
+
+    if (node.para) {
+      margin = Object.create(null);
+      lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight;
+      margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove;
+      margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow;
+      margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft;
+      margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight;
+    }
+
+    let font = node.font;
+
+    if (!font) {
+      const root = node[_xfa_object.$getTemplateRoot]();
+
+      let parent = node[_xfa_object.$getParent]();
+
+      while (parent !== root) {
+        if (parent.font) {
+          font = parent.font;
+          break;
+        }
+
+        parent = parent[_xfa_object.$getParent]();
+      }
+    }
+
+    const maxWidth = !node.w ? availableSpace.width : node.w;
+    const fontFinder = node[_xfa_object.$globalData].fontFinder;
+
+    if (node.value.exData && node.value.exData[_xfa_object.$content] && node.value.exData.contentType === 
"text/html") {
+      const res = layoutText(node.value.exData[_xfa_object.$content], font, margin, lineHeight, fontFinder, 
maxWidth);
+      width = res.width;
+      height = res.height;
+      isBroken = res.isBroken;
+    } else {
+      const text = node.value[_xfa_object.$text]();
+
+      if (text) {
+        const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth);
+        width = res.width;
+        height = res.height;
+        isBroken = res.isBroken;
+      }
+    }
+
+    if (width !== null && !node.w) {
+      width += marginH;
+    }
+
+    if (height !== null && !node.h) {
+      height += marginV;
+    }
+  }
+
+  return {
+    w: width,
+    h: height,
+    isBroken
+  };
+}
+
+function computeBbox(node, html, availableSpace) {
+  let bbox;
+
+  if (node.w !== "" && node.h !== "") {
+    bbox = [node.x, node.y, node.w, node.h];
+  } else {
+    if (!availableSpace) {
+      return null;
+    }
+
+    let width = node.w;
+
+    if (width === "") {
+      if (node.maxW === 0) {
+        const parent = node[_xfa_object.$getSubformParent]();
+
+        if (parent.layout === "position" && parent.w !== "") {
+          width = 0;
+        } else {
+          width = node.minW;
+        }
+      } else {
+        width = Math.min(node.maxW, availableSpace.width);
+      }
+
+      html.attributes.style.width = measureToString(width);
+    }
+
+    let height = node.h;
+
+    if (height === "") {
+      if (node.maxH === 0) {
+        const parent = node[_xfa_object.$getSubformParent]();
+
+        if (parent.layout === "position" && parent.h !== "") {
+          height = 0;
+        } else {
+          height = node.minH;
+        }
+      } else {
+        height = Math.min(node.maxH, availableSpace.height);
+      }
+
+      html.attributes.style.height = measureToString(height);
+    }
+
+    bbox = [node.x, node.y, width, height];
+  }
+
+  return bbox;
+}
+
+function fixDimensions(node) {
+  const parent = node[_xfa_object.$getSubformParent]();
+
+  if (parent.layout && parent.layout.includes("row")) {
+    const extra = parent[_xfa_object.$extra];
+    const colSpan = node.colSpan;
+    let width;
+
+    if (colSpan === -1) {
+      width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0);
+    } else {
+      width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => 
a + w, 0);
+    }
+
+    if (!isNaN(width)) {
+      node.w = width;
+    }
+  }
+
+  if (parent.layout && parent.layout !== "position") {
+    node.x = node.y = 0;
+  }
+
+  if (node.layout === "table") {
+    if (node.w === "" && Array.isArray(node.columnWidths)) {
+      node.w = node.columnWidths.reduce((a, x) => a + x, 0);
+    }
+  }
+}
+
+function layoutClass(node) {
+  switch (node.layout) {
+    case "position":
+      return "xfaPosition";
+
+    case "lr-tb":
+      return "xfaLrTb";
+
+    case "rl-row":
+      return "xfaRlRow";
+
+    case "rl-tb":
+      return "xfaRlTb";
+
+    case "row":
+      return "xfaRow";
+
+    case "table":
+      return "xfaTable";
+
+    case "tb":
+      return "xfaTb";
+
+    default:
+      return "xfaPosition";
+  }
+}
+
+function toStyle(node, ...names) {
+  const style = Object.create(null);
+
+  for (const name of names) {
+    const value = node[name];
+
+    if (value === null) {
+      continue;
+    }
+
+    if (converters.hasOwnProperty(name)) {
+      converters[name](node, style);
+      continue;
+    }
+
+    if (value instanceof _xfa_object.XFAObject) {
+      const newStyle = value[_xfa_object.$toStyle]();
+
+      if (newStyle) {
+        Object.assign(style, newStyle);
+      } else {
+        (0, _util.warn)(`(DEBUG) - XFA - style for ${name} not implemented yet`);
+      }
+    }
+  }
+
+  return style;
+}
+
+function createWrapper(node, html) {
+  const {
+    attributes
+  } = html;
+  const {
+    style
+  } = attributes;
+  const wrapper = {
+    name: "div",
+    attributes: {
+      class: ["xfaWrapper"],
+      style: Object.create(null)
+    },
+    children: []
+  };
+  attributes.class.push("xfaWrapped");
+
+  if (node.border) {
+    const {
+      widths,
+      insets
+    } = node.border[_xfa_object.$extra];
+    let width, height;
+    let top = insets[0];
+    let left = insets[3];
+    const insetsH = insets[0] + insets[2];
+    const insetsW = insets[1] + insets[3];
+
+    switch (node.border.hand) {
+      case "even":
+        top -= widths[0] / 2;
+        left -= widths[3] / 2;
+        width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`;
+        height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`;
+        break;
+
+      case "left":
+        top -= widths[0];
+        left -= widths[3];
+        width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`;
+        height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`;
+        break;
+
+      case "right":
+        width = insetsW ? `calc(100% - ${insetsW}px)` : "100%";
+        height = insetsH ? `calc(100% - ${insetsH}px)` : "100%";
+        break;
+    }
+
+    const classNames = ["xfaBorder"];
+
+    if (isPrintOnly(node.border)) {
+      classNames.push("xfaPrintOnly");
+    }
+
+    const border = {
+      name: "div",
+      attributes: {
+        class: classNames,
+        style: {
+          top: `${top}px`,
+          left: `${left}px`,
+          width,
+          height
+        }
+      },
+      children: []
+    };
+
+    for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) {
+      if (style[key] !== undefined) {
+        border.attributes.style[key] = style[key];
+        delete style[key];
+      }
+    }
+
+    wrapper.children.push(border, html);
+  } else {
+    wrapper.children.push(html);
+  }
+
+  for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", 
"minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) {
+    if (style[key] !== undefined) {
+      wrapper.attributes.style[key] = style[key];
+      delete style[key];
+    }
+  }
+
+  if (style.position === "absolute") {
+    wrapper.attributes.style.position = "absolute";
+  } else {
+    wrapper.attributes.style.position = "relative";
+  }
+
+  delete style.position;
+
+  if (style.alignSelf) {
+    wrapper.attributes.style.alignSelf = style.alignSelf;
+    delete style.alignSelf;
+  }
+
+  return wrapper;
+}
+
+function fixTextIndent(styles) {
+  const indent = (0, _utils.getMeasurement)(styles.textIndent, "0px");
+
+  if (indent >= 0) {
+    return;
+  }
+
+  const align = styles.textAlign === "right" ? "right" : "left";
+  const name = "padding" + (align === "left" ? "Left" : "Right");
+  const padding = (0, _utils.getMeasurement)(styles[name], "0px");
+  styles[name] = `${padding - indent}px`;
+}
+
+function setAccess(node, classNames) {
+  switch (node.access) {
+    case "nonInteractive":
+      classNames.push("xfaNonInteractive");
+      break;
+
+    case "readOnly":
+      classNames.push("xfaReadOnly");
+      break;
+
+    case "protected":
+      classNames.push("xfaDisabled");
+      break;
+  }
+}
+
+function isPrintOnly(node) {
+  return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print";
+}
+
+function setPara(node, nodeStyle, value) {
+  if (value.attributes.class && value.attributes.class.includes("xfaRich")) {
+    if (nodeStyle) {
+      if (node.h === "") {
+        nodeStyle.height = "auto";
+      }
+
+      if (node.w === "") {
+        nodeStyle.width = "auto";
+      }
+    }
+
+    if (node.para) {
+      const valueStyle = value.attributes.style;
+      valueStyle.display = "flex";
+      valueStyle.flexDirection = "column";
+
+      switch (node.para.vAlign) {
+        case "top":
+          valueStyle.justifyContent = "start";
+          break;
+
+        case "bottom":
+          valueStyle.justifyContent = "end";
+          break;
+
+        case "middle":
+          valueStyle.justifyContent = "center";
+          break;
+      }
+
+      const paraStyle = node.para[_xfa_object.$toStyle]();
+
+      for (const [key, val] of Object.entries(paraStyle)) {
+        if (!(key in valueStyle)) {
+          valueStyle[key] = val;
+        }
+      }
+    }
+  }
+}
+
+function setFontFamily(xfaFont, fontFinder, style) {
+  const name = (0, _utils.stripQuotes)(xfaFont.typeface);
+  const typeface = fontFinder.find(name);
+  style.fontFamily = `"${name}"`;
+
+  if (typeface) {
+    const {
+      fontFamily
+    } = typeface.regular.cssFontInfo;
+
+    if (fontFamily !== name) {
+      style.fontFamily = `"${fontFamily}"`;
+    }
+
+    if (style.lineHeight) {
+      return;
+    }
+
+    const pdfFont = (0, _fonts.selectFont)(xfaFont, typeface);
+
+    if (pdfFont && pdfFont.lineHeight > 0) {
+      style.lineHeight = Math.max(1.2, pdfFont.lineHeight);
+    } else {
+      style.lineHeight = 1.2;
+    }
+  }
+}
+
+/***/ }),
+/* 83 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.selectFont = selectFont;
+exports.FontFinder = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+class FontFinder {
+  constructor(pdfFonts) {
+    this.fonts = new Map();
+    this.cache = new Map();
+    this.warned = new Set();
+    this.defaultFont = null;
+    this.add(pdfFonts);
+  }
+
+  add(pdfFonts, reallyMissingFonts = null) {
+    for (const pdfFont of pdfFonts) {
+      this.addPdfFont(pdfFont);
+    }
+
+    for (const pdfFont of this.fonts.values()) {
+      if (!pdfFont.regular) {
+        pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic;
+      }
+    }
+
+    if (!reallyMissingFonts || reallyMissingFonts.size === 0) {
+      return;
+    }
+
+    const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA");
+
+    for (const missing of reallyMissingFonts) {
+      this.fonts.set(missing, myriad);
+    }
+  }
+
+  addPdfFont(pdfFont) {
+    const cssFontInfo = pdfFont.cssFontInfo;
+    const name = cssFontInfo.fontFamily;
+    let font = this.fonts.get(name);
+
+    if (!font) {
+      font = Object.create(null);
+      this.fonts.set(name, font);
+
+      if (!this.defaultFont) {
+        this.defaultFont = font;
+      }
+    }
+
+    let property = "";
+    const fontWeight = parseFloat(cssFontInfo.fontWeight);
+
+    if (parseFloat(cssFontInfo.italicAngle) !== 0) {
+      property = fontWeight >= 700 ? "bolditalic" : "italic";
+    } else if (fontWeight >= 700) {
+      property = "bold";
+    }
+
+    if (!property) {
+      if (pdfFont.name.includes("Bold") || pdfFont.psName && pdfFont.psName.includes("Bold")) {
+        property = "bold";
+      }
+
+      if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName && 
(pdfFont.psName.includes("Italic") || pdfFont.psName.endsWith("It"))) {
+        property += "italic";
+      }
+    }
+
+    if (!property) {
+      property = "regular";
+    }
+
+    font[property] = pdfFont;
+  }
+
+  getDefault() {
+    return this.defaultFont;
+  }
+
+  find(fontName, mustWarn = true) {
+    let font = this.fonts.get(fontName) || this.cache.get(fontName);
+
+    if (font) {
+      return font;
+    }
+
+    const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi;
+    let name = fontName.replace(pattern, "");
+    font = this.fonts.get(name);
+
+    if (font) {
+      this.cache.set(fontName, font);
+      return font;
+    }
+
+    name = name.toLowerCase();
+    const maybe = [];
+
+    for (const [family, pdfFont] of this.fonts.entries()) {
+      if (family.replace(pattern, "").toLowerCase().startsWith(name)) {
+        maybe.push(pdfFont);
+      }
+    }
+
+    if (maybe.length === 0) {
+      for (const [, pdfFont] of this.fonts.entries()) {
+        if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, 
"").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+
+    if (maybe.length === 0) {
+      name = name.replace(/psmt|mt/gi, "");
+
+      for (const [family, pdfFont] of this.fonts.entries()) {
+        if (family.replace(pattern, "").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+
+    if (maybe.length === 0) {
+      for (const pdfFont of this.fonts.values()) {
+        if (pdfFont.regular.name && pdfFont.regular.name.replace(pattern, 
"").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+
+    if (maybe.length >= 1) {
+      if (maybe.length !== 1 && mustWarn) {
+        (0, _util.warn)(`XFA - Too many choices to guess the correct font: ${fontName}`);
+      }
+
+      this.cache.set(fontName, maybe[0]);
+      return maybe[0];
+    }
+
+    if (mustWarn && !this.warned.has(fontName)) {
+      this.warned.add(fontName);
+      (0, _util.warn)(`XFA - Cannot find the font: ${fontName}`);
+    }
+
+    return null;
+  }
+
+}
+
+exports.FontFinder = FontFinder;
+
+function selectFont(xfaFont, typeface) {
+  if (xfaFont.posture === "italic") {
+    if (xfaFont.weight === "bold") {
+      return typeface.bolditalic;
+    }
+
+    return typeface.italic;
+  } else if (xfaFont.weight === "bold") {
+    return typeface.bold;
+  }
+
+  return typeface.regular;
+}
+
+/***/ }),
+/* 84 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.TextMeasure = void 0;
+
+var _fonts = __w_pdfjs_require__(83);
+
+const WIDTH_FACTOR = 1.01;
+
+class FontInfo {
+  constructor(xfaFont, margin, lineHeight, fontFinder) {
+    this.lineHeight = lineHeight;
+    this.paraMargin = margin || {
+      top: 0,
+      bottom: 0,
+      left: 0,
+      right: 0
+    };
+
+    if (!xfaFont) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+      return;
+    }
+
+    this.xfaFont = {
+      typeface: xfaFont.typeface,
+      posture: xfaFont.posture,
+      weight: xfaFont.weight,
+      size: xfaFont.size,
+      letterSpacing: xfaFont.letterSpacing
+    };
+    const typeface = fontFinder.find(xfaFont.typeface);
+
+    if (!typeface) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+      return;
+    }
+
+    this.pdfFont = (0, _fonts.selectFont)(xfaFont, typeface);
+
+    if (!this.pdfFont) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+    }
+  }
+
+  defaultFont(fontFinder) {
+    const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || 
fontFinder.find("Arial", false) || fontFinder.getDefault();
+
+    if (font && font.regular) {
+      const pdfFont = font.regular;
+      const info = pdfFont.cssFontInfo;
+      const xfaFont = {
+        typeface: info.fontFamily,
+        posture: "normal",
+        weight: "normal",
+        size: 10,
+        letterSpacing: 0
+      };
+      return [pdfFont, xfaFont];
+    }
+
+    const xfaFont = {
+      typeface: "Courier",
+      posture: "normal",
+      weight: "normal",
+      size: 10,
+      letterSpacing: 0
+    };
+    return [null, xfaFont];
+  }
+
+}
+
+class FontSelector {
+  constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) {
+    this.fontFinder = fontFinder;
+    this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)];
+  }
+
+  pushData(xfaFont, margin, lineHeight) {
+    const lastFont = this.stack[this.stack.length - 1];
+
+    for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) {
+      if (!xfaFont[name]) {
+        xfaFont[name] = lastFont.xfaFont[name];
+      }
+    }
+
+    for (const name of ["top", "bottom", "left", "right"]) {
+      if (isNaN(margin[name])) {
+        margin[name] = lastFont.paraMargin[name];
+      }
+    }
+
+    const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder);
+
+    if (!fontInfo.pdfFont) {
+      fontInfo.pdfFont = lastFont.pdfFont;
+    }
+
+    this.stack.push(fontInfo);
+  }
+
+  popFont() {
+    this.stack.pop();
+  }
+
+  topFont() {
+    return this.stack[this.stack.length - 1];
+  }
+
+}
+
+class TextMeasure {
+  constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) {
+    this.glyphs = [];
+    this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts);
+    this.extraHeight = 0;
+  }
+
+  pushData(xfaFont, margin, lineHeight) {
+    this.fontSelector.pushData(xfaFont, margin, lineHeight);
+  }
+
+  popFont(xfaFont) {
+    return this.fontSelector.popFont();
+  }
+
+  addPara() {
+    const lastFont = this.fontSelector.topFont();
+    this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom;
+  }
+
+  addString(str) {
+    if (!str) {
+      return;
+    }
+
+    const lastFont = this.fontSelector.topFont();
+    const fontSize = lastFont.xfaFont.size;
+
+    if (lastFont.pdfFont) {
+      const letterSpacing = lastFont.xfaFont.letterSpacing;
+      const pdfFont = lastFont.pdfFont;
+      const lineHeight = lastFont.lineHeight || Math.ceil(Math.max(1.2, pdfFont.lineHeight) * fontSize);
+      const scale = fontSize / 1000;
+
+      for (const line of str.split(/[\u2029\n]/)) {
+        const encodedLine = pdfFont.encodeString(line).join("");
+        const glyphs = pdfFont.charsToGlyphs(encodedLine);
+
+        for (const glyph of glyphs) {
+          this.glyphs.push([glyph.width * scale + letterSpacing, lineHeight, glyph.unicode === " ", false]);
+        }
+
+        this.glyphs.push([0, 0, false, true]);
+      }
+
+      this.glyphs.pop();
+      return;
+    }
+
+    for (const line of str.split(/[\u2029\n]/)) {
+      for (const char of line.split("")) {
+        this.glyphs.push([fontSize, fontSize, char === " ", false]);
+      }
+
+      this.glyphs.push([0, 0, false, true]);
+    }
+
+    this.glyphs.pop();
+  }
+
+  compute(maxWidth) {
+    let lastSpacePos = -1,
+        lastSpaceWidth = 0,
+        width = 0,
+        height = 0,
+        currentLineWidth = 0,
+        currentLineHeight = 0;
+    let isBroken = false;
+
+    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
+      const [glyphWidth, glyphHeight, isSpace, isEOL] = this.glyphs[i];
+
+      if (isEOL) {
+        width = Math.max(width, currentLineWidth);
+        currentLineWidth = 0;
+        height += currentLineHeight;
+        currentLineHeight = glyphHeight;
+        lastSpacePos = -1;
+        lastSpaceWidth = 0;
+        continue;
+      }
+
+      if (isSpace) {
+        if (currentLineWidth + glyphWidth > maxWidth) {
+          width = Math.max(width, currentLineWidth);
+          currentLineWidth = 0;
+          height += currentLineHeight;
+          currentLineHeight = glyphHeight;
+          lastSpacePos = -1;
+          lastSpaceWidth = 0;
+          isBroken = true;
+        } else {
+          currentLineHeight = Math.max(glyphHeight, currentLineHeight);
+          lastSpaceWidth = currentLineWidth;
+          currentLineWidth += glyphWidth;
+          lastSpacePos = i;
+        }
+
+        continue;
+      }
+
+      if (currentLineWidth + glyphWidth > maxWidth) {
+        height += currentLineHeight;
+        currentLineHeight = glyphHeight;
+
+        if (lastSpacePos !== -1) {
+          i = lastSpacePos;
+          width = Math.max(width, lastSpaceWidth);
+          currentLineWidth = 0;
+          lastSpacePos = -1;
+          lastSpaceWidth = 0;
+        } else {
+          width = Math.max(width, currentLineWidth);
+          currentLineWidth = glyphWidth;
+        }
+
+        isBroken = true;
+        continue;
+      }
+
+      currentLineWidth += glyphWidth;
+      currentLineHeight = Math.max(glyphHeight, currentLineHeight);
+    }
+
+    width = Math.max(width, currentLineWidth);
+    height += currentLineHeight + this.extraHeight;
+    return {
+      width: WIDTH_FACTOR * width,
+      height,
+      isBroken
+    };
+  }
+
+}
+
+exports.TextMeasure = TextMeasure;
+
+/***/ }),
+/* 85 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.DataHandler = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+class DataHandler {
+  constructor(root, data) {
+    this.data = data;
+    this.dataset = root.datasets || null;
+  }
+
+  serialize(storage) {
+    const stack = [[-1, this.data[_xfa_object.$getChildren]()]];
+
+    while (stack.length > 0) {
+      const last = stack[stack.length - 1];
+      const [i, children] = last;
+
+      if (i + 1 === children.length) {
+        stack.pop();
+        continue;
+      }
+
+      const child = children[++last[0]];
+      const storageEntry = storage.get(child[_xfa_object.$uid]);
+
+      if (storageEntry) {
+        child[_xfa_object.$setValue](storageEntry);
+      } else {
+        const attributes = child[_xfa_object.$getAttributes]();
+
+        for (const value of attributes.values()) {
+          const entry = storage.get(value[_xfa_object.$uid]);
+
+          if (entry) {
+            value[_xfa_object.$setValue](entry);
+
+            break;
+          }
+        }
+      }
+
+      const nodes = child[_xfa_object.$getChildren]();
+
+      if (nodes.length > 0) {
+        stack.push([-1, nodes]);
+      }
+    }
+
+    const buf = [`<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/";>`];
+
+    if (this.dataset) {
+      for (const child of this.dataset[_xfa_object.$getChildren]()) {
+        if (child[_xfa_object.$nodeName] !== "data") {
+          child[_xfa_object.$toString](buf);
+        }
+      }
+    }
+
+    this.data[_xfa_object.$toString](buf);
+
+    buf.push("</xfa:datasets>");
+    return buf.join("");
+  }
+
+}
+
+exports.DataHandler = DataHandler;
+
+/***/ }),
+/* 86 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XFAParser = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _xml_parser = __w_pdfjs_require__(68);
+
+var _builder = __w_pdfjs_require__(87);
+
+var _util = __w_pdfjs_require__(2);
+
+class XFAParser extends _xml_parser.XMLParserBase {
+  constructor() {
+    super();
+    this._builder = new _builder.Builder();
+    this._stack = [];
+    this._globalData = {
+      usedTypefaces: new Set()
+    };
+    this._ids = new Map();
+    this._current = this._builder.buildRoot(this._ids);
+    this._errorCode = _xml_parser.XMLParserErrorCode.NoError;
+    this._whiteRegex = /^\s+$/;
+    this._nbsps = /\xa0+/g;
+  }
+
+  parse(data) {
+    this.parseXml(data);
+
+    if (this._errorCode !== _xml_parser.XMLParserErrorCode.NoError) {
+      return undefined;
+    }
+
+    this._current[_xfa_object.$finalize]();
+
+    return this._current.element;
+  }
+
+  onText(text) {
+    text = text.replace(this._nbsps, match => match.slice(1) + " ");
+
+    if (this._current[_xfa_object.$acceptWhitespace]()) {
+      this._current[_xfa_object.$onText](text);
+
+      return;
+    }
+
+    if (this._whiteRegex.test(text)) {
+      return;
+    }
+
+    this._current[_xfa_object.$onText](text.trim());
+  }
+
+  onCdata(text) {
+    this._current[_xfa_object.$onText](text);
+  }
+
+  _mkAttributes(attributes, tagName) {
+    let namespace = null;
+    let prefixes = null;
+    const attributeObj = Object.create({});
+
+    for (const {
+      name,
+      value
+    } of attributes) {
+      if (name === "xmlns") {
+        if (!namespace) {
+          namespace = value;
+        } else {
+          (0, _util.warn)(`XFA - multiple namespace definition in <${tagName}>`);
+        }
+      } else if (name.startsWith("xmlns:")) {
+        const prefix = name.substring("xmlns:".length);
+
+        if (!prefixes) {
+          prefixes = [];
+        }
+
+        prefixes.push({
+          prefix,
+          value
+        });
+      } else {
+        const i = name.indexOf(":");
+
+        if (i === -1) {
+          attributeObj[name] = value;
+        } else {
+          let nsAttrs = attributeObj[_xfa_object.$nsAttributes];
+
+          if (!nsAttrs) {
+            nsAttrs = attributeObj[_xfa_object.$nsAttributes] = Object.create(null);
+          }
+
+          const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)];
+          let attrs = nsAttrs[ns];
+
+          if (!attrs) {
+            attrs = nsAttrs[ns] = Object.create(null);
+          }
+
+          attrs[attrName] = value;
+        }
+      }
+    }
+
+    return [namespace, prefixes, attributeObj];
+  }
+
+  _getNameAndPrefix(name, nsAgnostic) {
+    const i = name.indexOf(":");
+
+    if (i === -1) {
+      return [name, null];
+    }
+
+    return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)];
+  }
+
+  onBeginElement(tagName, attributes, isEmpty) {
+    const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName);
+
+    const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic());
+
+    const node = this._builder.build({
+      nsPrefix,
+      name,
+      attributes: attributesObj,
+      namespace,
+      prefixes
+    });
+
+    node[_xfa_object.$globalData] = this._globalData;
+
+    if (isEmpty) {
+      node[_xfa_object.$finalize]();
+
+      if (this._current[_xfa_object.$onChild](node)) {
+        node[_xfa_object.$setId](this._ids);
+      }
+
+      node[_xfa_object.$clean](this._builder);
+
+      return;
+    }
+
+    this._stack.push(this._current);
+
+    this._current = node;
+  }
+
+  onEndElement(name) {
+    const node = this._current;
+
+    if (node[_xfa_object.$isCDATAXml]() && typeof node[_xfa_object.$content] === "string") {
+      const parser = new XFAParser();
+      parser._globalData = this._globalData;
+      const root = parser.parse(node[_xfa_object.$content]);
+      node[_xfa_object.$content] = null;
+
+      node[_xfa_object.$onChild](root);
+    }
+
+    node[_xfa_object.$finalize]();
+
+    this._current = this._stack.pop();
+
+    if (this._current[_xfa_object.$onChild](node)) {
+      node[_xfa_object.$setId](this._ids);
+    }
+
+    node[_xfa_object.$clean](this._builder);
+  }
+
+  onError(code) {
+    this._errorCode = code;
+  }
+
+}
+
+exports.XFAParser = XFAParser;
+
+/***/ }),
+/* 87 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.Builder = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _setup = __w_pdfjs_require__(88);
+
+var _template = __w_pdfjs_require__(80);
+
+var _unknown = __w_pdfjs_require__(97);
+
+var _util = __w_pdfjs_require__(2);
+
+class Root extends _xfa_object.XFAObject {
+  constructor(ids) {
+    super(-1, "root", Object.create(null));
+    this.element = null;
+    this[_xfa_object.$ids] = ids;
+  }
+
+  [_xfa_object.$onChild](child) {
+    this.element = child;
+    return true;
+  }
+
+  [_xfa_object.$finalize]() {
+    super[_xfa_object.$finalize]();
+
+    if (this.element.template instanceof _template.Template) {
+      this[_xfa_object.$ids].set(_xfa_object.$root, this.element);
+
+      this.element.template[_xfa_object.$resolvePrototypes](this[_xfa_object.$ids]);
+
+      this.element.template[_xfa_object.$ids] = this[_xfa_object.$ids];
+    }
+  }
+
+}
+
+class Empty extends _xfa_object.XFAObject {
+  constructor() {
+    super(-1, "", Object.create(null));
+  }
+
+  [_xfa_object.$onChild](_) {
+    return false;
+  }
+
+}
+
+class Builder {
+  constructor() {
+    this._namespaceStack = [];
+    this._nsAgnosticLevel = 0;
+    this._namespacePrefixes = new Map();
+    this._namespaces = new Map();
+    this._nextNsId = Math.max(...Object.values(_namespaces.NamespaceIds).map(({
+      id
+    }) => id));
+    this._currentNamespace = new _unknown.UnknownNamespace(++this._nextNsId);
+  }
+
+  buildRoot(ids) {
+    return new Root(ids);
+  }
+
+  build({
+    nsPrefix,
+    name,
+    attributes,
+    namespace,
+    prefixes
+  }) {
+    const hasNamespaceDef = namespace !== null;
+
+    if (hasNamespaceDef) {
+      this._namespaceStack.push(this._currentNamespace);
+
+      this._currentNamespace = this._searchNamespace(namespace);
+    }
+
+    if (prefixes) {
+      this._addNamespacePrefix(prefixes);
+    }
+
+    if (attributes.hasOwnProperty(_xfa_object.$nsAttributes)) {
+      const dataTemplate = _setup.NamespaceSetUp.datasets;
+      const nsAttrs = attributes[_xfa_object.$nsAttributes];
+      let xfaAttrs = null;
+
+      for (const [ns, attrs] of Object.entries(nsAttrs)) {
+        const nsToUse = this._getNamespaceToUse(ns);
+
+        if (nsToUse === dataTemplate) {
+          xfaAttrs = {
+            xfa: attrs
+          };
+          break;
+        }
+      }
+
+      if (xfaAttrs) {
+        attributes[_xfa_object.$nsAttributes] = xfaAttrs;
+      } else {
+        delete attributes[_xfa_object.$nsAttributes];
+      }
+    }
+
+    const namespaceToUse = this._getNamespaceToUse(nsPrefix);
+
+    const node = namespaceToUse && namespaceToUse[_namespaces.$buildXFAObject](name, attributes) || new 
Empty();
+
+    if (node[_xfa_object.$isNsAgnostic]()) {
+      this._nsAgnosticLevel++;
+    }
+
+    if (hasNamespaceDef || prefixes || node[_xfa_object.$isNsAgnostic]()) {
+      node[_xfa_object.$cleanup] = {
+        hasNamespace: hasNamespaceDef,
+        prefixes,
+        nsAgnostic: node[_xfa_object.$isNsAgnostic]()
+      };
+    }
+
+    return node;
+  }
+
+  isNsAgnostic() {
+    return this._nsAgnosticLevel > 0;
+  }
+
+  _searchNamespace(nsName) {
+    let ns = this._namespaces.get(nsName);
+
+    if (ns) {
+      return ns;
+    }
+
+    for (const [name, {
+      check
+    }] of Object.entries(_namespaces.NamespaceIds)) {
+      if (check(nsName)) {
+        ns = _setup.NamespaceSetUp[name];
+
+        if (ns) {
+          this._namespaces.set(nsName, ns);
+
+          return ns;
+        }
+
+        break;
+      }
+    }
+
+    ns = new _unknown.UnknownNamespace(++this._nextNsId);
+
+    this._namespaces.set(nsName, ns);
+
+    return ns;
+  }
+
+  _addNamespacePrefix(prefixes) {
+    for (const {
+      prefix,
+      value
+    } of prefixes) {
+      const namespace = this._searchNamespace(value);
+
+      let prefixStack = this._namespacePrefixes.get(prefix);
+
+      if (!prefixStack) {
+        prefixStack = [];
+
+        this._namespacePrefixes.set(prefix, prefixStack);
+      }
+
+      prefixStack.push(namespace);
+    }
+  }
+
+  _getNamespaceToUse(prefix) {
+    if (!prefix) {
+      return this._currentNamespace;
+    }
+
+    const prefixStack = this._namespacePrefixes.get(prefix);
+
+    if (prefixStack && prefixStack.length > 0) {
+      return prefixStack[prefixStack.length - 1];
+    }
+
+    (0, _util.warn)(`Unknown namespace prefix: ${prefix}.`);
+    return null;
+  }
+
+  clean(data) {
+    const {
+      hasNamespace,
+      prefixes,
+      nsAgnostic
+    } = data;
+
+    if (hasNamespace) {
+      this._currentNamespace = this._namespaceStack.pop();
+    }
+
+    if (prefixes) {
+      prefixes.forEach(({
+        prefix
+      }) => {
+        this._namespacePrefixes.get(prefix).pop();
+      });
+    }
+
+    if (nsAgnostic) {
+      this._nsAgnosticLevel--;
+    }
+  }
+
+}
+
+exports.Builder = Builder;
+
+/***/ }),
+/* 88 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.NamespaceSetUp = void 0;
+
+var _config = __w_pdfjs_require__(89);
+
+var _connection_set = __w_pdfjs_require__(90);
+
+var _datasets = __w_pdfjs_require__(91);
+
+var _locale_set = __w_pdfjs_require__(92);
+
+var _signature = __w_pdfjs_require__(93);
+
+var _stylesheet = __w_pdfjs_require__(94);
+
+var _template = __w_pdfjs_require__(80);
+
+var _xdp = __w_pdfjs_require__(95);
+
+var _xhtml = __w_pdfjs_require__(96);
+
+const NamespaceSetUp = {
+  config: _config.ConfigNamespace,
+  connection: _connection_set.ConnectionSetNamespace,
+  datasets: _datasets.DatasetsNamespace,
+  localeSet: _locale_set.LocaleSetNamespace,
+  signature: _signature.SignatureNamespace,
+  stylesheet: _stylesheet.StylesheetNamespace,
+  template: _template.TemplateNamespace,
+  xdp: _xdp.XdpNamespace,
+  xhtml: _xhtml.XhtmlNamespace
+};
+exports.NamespaceSetUp = NamespaceSetUp;
+
+/***/ }),
+/* 89 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ConfigNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _utils = __w_pdfjs_require__(76);
+
+var _util = __w_pdfjs_require__(2);
+
+const CONFIG_NS_ID = _namespaces.NamespaceIds.config.id;
+
+class Acrobat extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "acrobat", true);
+    this.acrobat7 = null;
+    this.autoSave = null;
+    this.common = null;
+    this.validate = null;
+    this.validateApprovalSignatures = null;
+    this.submitUrl = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Acrobat7 extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "acrobat7", true);
+    this.dynamicRender = null;
+  }
+
+}
+
+class ADBE_JSConsole extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]);
+  }
+
+}
+
+class ADBE_JSDebugger extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]);
+  }
+
+}
+
+class AddSilentPrint extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "addSilentPrint");
+  }
+
+}
+
+class AddViewerPreferences extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "addViewerPreferences");
+  }
+
+}
+
+class AdjustData extends _xfa_object.Option10 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "adjustData");
+  }
+
+}
+
+class AdobeExtensionLevel extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8);
+  }
+
+}
+
+class Agent extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "agent", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.common = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class AlwaysEmbed extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "alwaysEmbed");
+  }
+
+}
+
+class Amd extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "amd");
+  }
+
+}
+
+class Area extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "area");
+    this.level = (0, _utils.getInteger)({
+      data: attributes.level,
+      defaultValue: 0,
+      validate: n => n >= 1 && n <= 3
+    });
+    this.name = (0, _utils.getStringOption)(attributes.name, ["", "barcode", "coreinit", "deviceDriver", 
"font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]);
+  }
+
+}
+
+class Attributes extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]);
+  }
+
+}
+
+class AutoSave extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]);
+  }
+
+}
+
+class Base extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "base");
+  }
+
+}
+
+class BatchOutput extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "batchOutput");
+    this.format = (0, _utils.getStringOption)(attributes.format, ["none", "concat", "zip", "zipCompress"]);
+  }
+
+}
+
+class BehaviorOverride extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "behaviorOverride");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = new Map(this[_xfa_object.$content].trim().split(/\s+/).filter(x => 
x.includes(":")).map(x => x.split(":", 2)));
+  }
+
+}
+
+class Cache extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "cache", true);
+    this.templateCache = null;
+  }
+
+}
+
+class Change extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "change");
+  }
+
+}
+
+class Common extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "common", true);
+    this.data = null;
+    this.locale = null;
+    this.localeSet = null;
+    this.messaging = null;
+    this.suppressBanner = null;
+    this.template = null;
+    this.validationMessaging = null;
+    this.versionControl = null;
+    this.log = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Compress extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compress");
+    this.scope = (0, _utils.getStringOption)(attributes.scope, ["imageOnly", "document"]);
+  }
+
+}
+
+class CompressLogicalStructure extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compressLogicalStructure");
+  }
+
+}
+
+class CompressObjectStream extends _xfa_object.Option10 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compressObjectStream");
+  }
+
+}
+
+class Compression extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compression", true);
+    this.compressLogicalStructure = null;
+    this.compressObjectStream = null;
+    this.level = null;
+    this.type = null;
+  }
+
+}
+
+class Config extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "config", true);
+    this.acrobat = null;
+    this.present = null;
+    this.trace = null;
+    this.agent = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Conformance extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "conformance", ["A", "B"]);
+  }
+
+}
+
+class ContentCopy extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "contentCopy");
+  }
+
+}
+
+class Copies extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "copies", 1, n => n >= 1);
+  }
+
+}
+
+class Creator extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "creator");
+  }
+
+}
+
+class CurrentPage extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0);
+  }
+
+}
+
+class Data extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "data", true);
+    this.adjustData = null;
+    this.attributes = null;
+    this.incrementalLoad = null;
+    this.outputXSL = null;
+    this.range = null;
+    this.record = null;
+    this.startNode = null;
+    this.uri = null;
+    this.window = null;
+    this.xsl = null;
+    this.excludeNS = new _xfa_object.XFAObjectArray();
+    this.transform = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Debug extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "debug", true);
+    this.uri = null;
+  }
+
+}
+
+class DefaultTypeface extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "defaultTypeface");
+    this.writingScript = (0, _utils.getStringOption)(attributes.writingScript, ["*", "Arabic", "Cyrillic", 
"EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", 
"TraditionalChinese", "Vietnamese"]);
+  }
+
+}
+
+class Destination extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]);
+  }
+
+}
+
+class DocumentAssembly extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "documentAssembly");
+  }
+
+}
+
+class Driver extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "driver", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+
+}
+
+class DuplexOption extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]);
+  }
+
+}
+
+class DynamicRender extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]);
+  }
+
+}
+
+class Embed extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "embed");
+  }
+
+}
+
+class Encrypt extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encrypt");
+  }
+
+}
+
+class Encryption extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encryption", true);
+    this.encrypt = null;
+    this.encryptionLevel = null;
+    this.permissions = null;
+  }
+
+}
+
+class EncryptionLevel extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]);
+  }
+
+}
+
+class Enforce extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "enforce");
+  }
+
+}
+
+class Equate extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "equate");
+    this.force = (0, _utils.getInteger)({
+      data: attributes.force,
+      defaultValue: 1,
+      validate: n => n === 0
+    });
+    this.from = attributes.from || "";
+    this.to = attributes.to || "";
+  }
+
+}
+
+class EquateRange extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "equateRange");
+    this.from = attributes.from || "";
+    this.to = attributes.to || "";
+    this._unicodeRange = attributes.unicodeRange || "";
+  }
+
+  get unicodeRange() {
+    const ranges = [];
+    const unicodeRegex = /U\+([0-9a-fA-F]+)/;
+    const unicodeRange = this._unicodeRange;
+
+    for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) {
+      range = range.split("-", 2).map(x => {
+        const found = x.match(unicodeRegex);
+
+        if (!found) {
+          return 0;
+        }
+
+        return parseInt(found[1], 16);
+      });
+
+      if (range.length === 1) {
+        range.push(range[0]);
+      }
+
+      ranges.push(range);
+    }
+
+    return (0, _util.shadow)(this, "unicodeRange", ranges);
+  }
+
+}
+
+class Exclude extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "exclude");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => x && 
["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x));
+  }
+
+}
+
+class ExcludeNS extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "excludeNS");
+  }
+
+}
+
+class FlipLabel extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]);
+  }
+
+}
+
+class FontInfo extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "fontInfo", true);
+    this.embed = null;
+    this.map = null;
+    this.subsetBelow = null;
+    this.alwaysEmbed = new _xfa_object.XFAObjectArray();
+    this.defaultTypeface = new _xfa_object.XFAObjectArray();
+    this.neverEmbed = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class FormFieldFilling extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "formFieldFilling");
+  }
+
+}
+
+class GroupParent extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "groupParent");
+  }
+
+}
+
+class IfEmpty extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]);
+  }
+
+}
+
+class IncludeXDPContent extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "includeXDPContent");
+  }
+
+}
+
+class IncrementalLoad extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]);
+  }
+
+}
+
+class IncrementalMerge extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "incrementalMerge");
+  }
+
+}
+
+class Interactive extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "interactive");
+  }
+
+}
+
+class Jog extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]);
+  }
+
+}
+
+class LabelPrinter extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "labelPrinter", true);
+    this.name = (0, _utils.getStringOption)(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]);
+    this.batchOutput = null;
+    this.flipLabel = null;
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+
+}
+
+class Layout extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "layout", ["paginate", "panel"]);
+  }
+
+}
+
+class Level extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "level", 0, n => n > 0);
+  }
+
+}
+
+class Linearized extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "linearized");
+  }
+
+}
+
+class Locale extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "locale");
+  }
+
+}
+
+class LocaleSet extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "localeSet");
+  }
+
+}
+
+class Log extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "log", true);
+    this.mode = null;
+    this.threshold = null;
+    this.to = null;
+    this.uri = null;
+  }
+
+}
+
+class MapElement extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "map", true);
+    this.equate = new _xfa_object.XFAObjectArray();
+    this.equateRange = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class MediumInfo extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "mediumInfo", true);
+    this.map = null;
+  }
+
+}
+
+class Message extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "message", true);
+    this.msgId = null;
+    this.severity = null;
+  }
+
+}
+
+class Messaging extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "messaging", true);
+    this.message = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Mode extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "mode", ["append", "overwrite"]);
+  }
+
+}
+
+class ModifyAnnots extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "modifyAnnots");
+  }
+
+}
+
+class MsgId extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "msgId", 1, n => n >= 1);
+  }
+
+}
+
+class NameAttr extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "nameAttr");
+  }
+
+}
+
+class NeverEmbed extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "neverEmbed");
+  }
+
+}
+
+class NumberOfCopies extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5);
+  }
+
+}
+
+class OpenAction extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "openAction", true);
+    this.destination = null;
+  }
+
+}
+
+class Output extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "output", true);
+    this.to = null;
+    this.type = null;
+    this.uri = null;
+  }
+
+}
+
+class OutputBin extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "outputBin");
+  }
+
+}
+
+class OutputXSL extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "outputXSL", true);
+    this.uri = null;
+  }
+
+}
+
+class Overprint extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]);
+  }
+
+}
+
+class Packets extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "packets");
+  }
+
+  [_xfa_object.$finalize]() {
+    if (this[_xfa_object.$content] === "*") {
+      return;
+    }
+
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => ["config", 
"datasets", "template", "xfdf", "xslt"].includes(x));
+  }
+
+}
+
+class PageOffset extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pageOffset");
+    this.x = (0, _utils.getInteger)({
+      data: attributes.x,
+      defaultValue: "useXDCSetting",
+      validate: n => true
+    });
+    this.y = (0, _utils.getInteger)({
+      data: attributes.y,
+      defaultValue: "useXDCSetting",
+      validate: n => true
+    });
+  }
+
+}
+
+class PageRange extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pageRange");
+  }
+
+  [_xfa_object.$finalize]() {
+    const numbers = this[_xfa_object.$content].trim().split(/\s+/).map(x => parseInt(x, 10));
+
+    const ranges = [];
+
+    for (let i = 0, ii = numbers.length; i < ii; i += 2) {
+      ranges.push(numbers.slice(i, i + 2));
+    }
+
+    this[_xfa_object.$content] = ranges;
+  }
+
+}
+
+class Pagination extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]);
+  }
+
+}
+
+class PaginationOverride extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", 
"forceDuplexShortEdge", "forceSimplex"]);
+  }
+
+}
+
+class Part extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "part", 1, n => false);
+  }
+
+}
+
+class Pcl extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pcl", true);
+    this.name = attributes.name || "";
+    this.batchOutput = null;
+    this.fontInfo = null;
+    this.jog = null;
+    this.mediumInfo = null;
+    this.outputBin = null;
+    this.pageOffset = null;
+    this.staple = null;
+    this.xdc = null;
+  }
+
+}
+
+class Pdf extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pdf", true);
+    this.name = attributes.name || "";
+    this.adobeExtensionLevel = null;
+    this.batchOutput = null;
+    this.compression = null;
+    this.creator = null;
+    this.encryption = null;
+    this.fontInfo = null;
+    this.interactive = null;
+    this.linearized = null;
+    this.openAction = null;
+    this.pdfa = null;
+    this.producer = null;
+    this.renderPolicy = null;
+    this.scriptModel = null;
+    this.silentPrint = null;
+    this.submitFormat = null;
+    this.tagged = null;
+    this.version = null;
+    this.viewerPreferences = null;
+    this.xdc = null;
+  }
+
+}
+
+class Pdfa extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pdfa", true);
+    this.amd = null;
+    this.conformance = null;
+    this.includeXDPContent = null;
+    this.part = null;
+  }
+
+}
+
+class Permissions extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "permissions", true);
+    this.accessibleContent = null;
+    this.change = null;
+    this.contentCopy = null;
+    this.documentAssembly = null;
+    this.formFieldFilling = null;
+    this.modifyAnnots = null;
+    this.plaintextMetadata = null;
+    this.print = null;
+    this.printHighQuality = null;
+  }
+
+}
+
+class PickTrayByPDFSize extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pickTrayByPDFSize");
+  }
+
+}
+
+class Picture extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "picture");
+  }
+
+}
+
+class PlaintextMetadata extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "plaintextMetadata");
+  }
+
+}
+
+class Presence extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]);
+  }
+
+}
+
+class Present extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "present", true);
+    this.behaviorOverride = null;
+    this.cache = null;
+    this.common = null;
+    this.copies = null;
+    this.destination = null;
+    this.incrementalMerge = null;
+    this.layout = null;
+    this.output = null;
+    this.overprint = null;
+    this.pagination = null;
+    this.paginationOverride = null;
+    this.script = null;
+    this.validate = null;
+    this.xdp = null;
+    this.driver = new _xfa_object.XFAObjectArray();
+    this.labelPrinter = new _xfa_object.XFAObjectArray();
+    this.pcl = new _xfa_object.XFAObjectArray();
+    this.pdf = new _xfa_object.XFAObjectArray();
+    this.ps = new _xfa_object.XFAObjectArray();
+    this.submitUrl = new _xfa_object.XFAObjectArray();
+    this.webClient = new _xfa_object.XFAObjectArray();
+    this.zpl = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Print extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "print");
+  }
+
+}
+
+class PrintHighQuality extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printHighQuality");
+  }
+
+}
+
+class PrintScaling extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]);
+  }
+
+}
+
+class PrinterName extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printerName");
+  }
+
+}
+
+class Producer extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "producer");
+  }
+
+}
+
+class Ps extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ps", true);
+    this.name = attributes.name || "";
+    this.batchOutput = null;
+    this.fontInfo = null;
+    this.jog = null;
+    this.mediumInfo = null;
+    this.outputBin = null;
+    this.staple = null;
+    this.xdc = null;
+  }
+
+}
+
+class Range extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "range");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s*,\s*/, 2).map(range => 
range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => {
+      if (range.length === 1) {
+        range.push(range[0]);
+      }
+
+      return range;
+    });
+  }
+
+}
+
+class Record extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "record");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim();
+    const n = parseInt(this[_xfa_object.$content], 10);
+
+    if (!isNaN(n) && n >= 0) {
+      this[_xfa_object.$content] = n;
+    }
+  }
+
+}
+
+class Relevant extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "relevant");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/);
+  }
+
+}
+
+class Rename extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "rename");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim();
+
+    if (this[_xfa_object.$content].toLowerCase().startsWith("xml") || this[_xfa_object.$content].match(new 
RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u"))) {
+      (0, _util.warn)("XFA - Rename: invalid XFA name");
+    }
+  }
+
+}
+
+class RenderPolicy extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]);
+  }
+
+}
+
+class RunScripts extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]);
+  }
+
+}
+
+class Script extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "script", true);
+    this.currentPage = null;
+    this.exclude = null;
+    this.runScripts = null;
+  }
+
+}
+
+class ScriptModel extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]);
+  }
+
+}
+
+class Severity extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]);
+  }
+
+}
+
+class SilentPrint extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "silentPrint", true);
+    this.addSilentPrint = null;
+    this.printerName = null;
+  }
+
+}
+
+class Staple extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "staple");
+    this.mode = (0, _utils.getStringOption)(attributes.mode, ["usePrinterSetting", "on", "off"]);
+  }
+
+}
+
+class StartNode extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "startNode");
+  }
+
+}
+
+class StartPage extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "startPage", 0, n => true);
+  }
+
+}
+
+class SubmitFormat extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]);
+  }
+
+}
+
+class SubmitUrl extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "submitUrl");
+  }
+
+}
+
+class SubsetBelow extends _xfa_object.IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100);
+  }
+
+}
+
+class SuppressBanner extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "suppressBanner");
+  }
+
+}
+
+class Tagged extends _xfa_object.Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "tagged");
+  }
+
+}
+
+class Template extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "template", true);
+    this.base = null;
+    this.relevant = null;
+    this.startPage = null;
+    this.uri = null;
+    this.xsl = null;
+  }
+
+}
+
+class Threshold extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]);
+  }
+
+}
+
+class To extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]);
+  }
+
+}
+
+class TemplateCache extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "templateCache");
+    this.maxEntries = (0, _utils.getInteger)({
+      data: attributes.maxEntries,
+      defaultValue: 5,
+      validate: n => n >= 0
+    });
+  }
+
+}
+
+class Trace extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "trace", true);
+    this.area = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Transform extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "transform", true);
+    this.groupParent = null;
+    this.ifEmpty = null;
+    this.nameAttr = null;
+    this.picture = null;
+    this.presence = null;
+    this.rename = null;
+    this.whitespace = null;
+  }
+
+}
+
+class Type extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", 
"native", "xdp", "mergedXDP"]);
+  }
+
+}
+
+class Uri extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "uri");
+  }
+
+}
+
+class Validate extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]);
+  }
+
+}
+
+class ValidateApprovalSignatures extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validateApprovalSignatures");
+  }
+
+  [_xfa_object.$finalize]() {
+    this[_xfa_object.$content] = this[_xfa_object.$content].trim().split(/\s+/).filter(x => ["docReady", 
"postSign"].includes(x));
+  }
+
+}
+
+class ValidationMessaging extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", 
"firstMessageOnly", "noMessages"]);
+  }
+
+}
+
+class Version extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]);
+  }
+
+}
+
+class VersionControl extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "VersionControl");
+    this.outputBelow = (0, _utils.getStringOption)(attributes.outputBelow, ["warn", "error", "update"]);
+    this.sourceAbove = (0, _utils.getStringOption)(attributes.sourceAbove, ["warn", "error"]);
+    this.sourceBelow = (0, _utils.getStringOption)(attributes.sourceBelow, ["update", "maintain"]);
+  }
+
+}
+
+class ViewerPreferences extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "viewerPreferences", true);
+    this.ADBE_JSConsole = null;
+    this.ADBE_JSDebugger = null;
+    this.addViewerPreferences = null;
+    this.duplexOption = null;
+    this.enforce = null;
+    this.numberOfCopies = null;
+    this.pageRange = null;
+    this.pickTrayByPDFSize = null;
+    this.printScaling = null;
+  }
+
+}
+
+class WebClient extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "webClient", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+
+}
+
+class Whitespace extends _xfa_object.OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]);
+  }
+
+}
+
+class Window extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "window");
+  }
+
+  [_xfa_object.$finalize]() {
+    const pair = this[_xfa_object.$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10));
+
+    if (pair.some(x => isNaN(x))) {
+      this[_xfa_object.$content] = [0, 0];
+      return;
+    }
+
+    if (pair.length === 1) {
+      pair.push(pair[0]);
+    }
+
+    this[_xfa_object.$content] = pair;
+  }
+
+}
+
+class Xdc extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xdc", true);
+    this.uri = new _xfa_object.XFAObjectArray();
+    this.xsl = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Xdp extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xdp", true);
+    this.packets = null;
+  }
+
+}
+
+class Xsl extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xsl", true);
+    this.debug = null;
+    this.uri = null;
+  }
+
+}
+
+class Zpl extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "zpl", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.batchOutput = null;
+    this.flipLabel = null;
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+
+}
+
+class ConfigNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (ConfigNamespace.hasOwnProperty(name)) {
+      return ConfigNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static acrobat(attrs) {
+    return new Acrobat(attrs);
+  }
+
+  static acrobat7(attrs) {
+    return new Acrobat7(attrs);
+  }
+
+  static ADBE_JSConsole(attrs) {
+    return new ADBE_JSConsole(attrs);
+  }
+
+  static ADBE_JSDebugger(attrs) {
+    return new ADBE_JSDebugger(attrs);
+  }
+
+  static addSilentPrint(attrs) {
+    return new AddSilentPrint(attrs);
+  }
+
+  static addViewerPreferences(attrs) {
+    return new AddViewerPreferences(attrs);
+  }
+
+  static adjustData(attrs) {
+    return new AdjustData(attrs);
+  }
+
+  static adobeExtensionLevel(attrs) {
+    return new AdobeExtensionLevel(attrs);
+  }
+
+  static agent(attrs) {
+    return new Agent(attrs);
+  }
+
+  static alwaysEmbed(attrs) {
+    return new AlwaysEmbed(attrs);
+  }
+
+  static amd(attrs) {
+    return new Amd(attrs);
+  }
+
+  static area(attrs) {
+    return new Area(attrs);
+  }
+
+  static attributes(attrs) {
+    return new Attributes(attrs);
+  }
+
+  static autoSave(attrs) {
+    return new AutoSave(attrs);
+  }
+
+  static base(attrs) {
+    return new Base(attrs);
+  }
+
+  static batchOutput(attrs) {
+    return new BatchOutput(attrs);
+  }
+
+  static behaviorOverride(attrs) {
+    return new BehaviorOverride(attrs);
+  }
+
+  static cache(attrs) {
+    return new Cache(attrs);
+  }
+
+  static change(attrs) {
+    return new Change(attrs);
+  }
+
+  static common(attrs) {
+    return new Common(attrs);
+  }
+
+  static compress(attrs) {
+    return new Compress(attrs);
+  }
+
+  static compressLogicalStructure(attrs) {
+    return new CompressLogicalStructure(attrs);
+  }
+
+  static compressObjectStream(attrs) {
+    return new CompressObjectStream(attrs);
+  }
+
+  static compression(attrs) {
+    return new Compression(attrs);
+  }
+
+  static config(attrs) {
+    return new Config(attrs);
+  }
+
+  static conformance(attrs) {
+    return new Conformance(attrs);
+  }
+
+  static contentCopy(attrs) {
+    return new ContentCopy(attrs);
+  }
+
+  static copies(attrs) {
+    return new Copies(attrs);
+  }
+
+  static creator(attrs) {
+    return new Creator(attrs);
+  }
+
+  static currentPage(attrs) {
+    return new CurrentPage(attrs);
+  }
+
+  static data(attrs) {
+    return new Data(attrs);
+  }
+
+  static debug(attrs) {
+    return new Debug(attrs);
+  }
+
+  static defaultTypeface(attrs) {
+    return new DefaultTypeface(attrs);
+  }
+
+  static destination(attrs) {
+    return new Destination(attrs);
+  }
+
+  static documentAssembly(attrs) {
+    return new DocumentAssembly(attrs);
+  }
+
+  static driver(attrs) {
+    return new Driver(attrs);
+  }
+
+  static duplexOption(attrs) {
+    return new DuplexOption(attrs);
+  }
+
+  static dynamicRender(attrs) {
+    return new DynamicRender(attrs);
+  }
+
+  static embed(attrs) {
+    return new Embed(attrs);
+  }
+
+  static encrypt(attrs) {
+    return new Encrypt(attrs);
+  }
+
+  static encryption(attrs) {
+    return new Encryption(attrs);
+  }
+
+  static encryptionLevel(attrs) {
+    return new EncryptionLevel(attrs);
+  }
+
+  static enforce(attrs) {
+    return new Enforce(attrs);
+  }
+
+  static equate(attrs) {
+    return new Equate(attrs);
+  }
+
+  static equateRange(attrs) {
+    return new EquateRange(attrs);
+  }
+
+  static exclude(attrs) {
+    return new Exclude(attrs);
+  }
+
+  static excludeNS(attrs) {
+    return new ExcludeNS(attrs);
+  }
+
+  static flipLabel(attrs) {
+    return new FlipLabel(attrs);
+  }
+
+  static fontInfo(attrs) {
+    return new FontInfo(attrs);
+  }
+
+  static formFieldFilling(attrs) {
+    return new FormFieldFilling(attrs);
+  }
+
+  static groupParent(attrs) {
+    return new GroupParent(attrs);
+  }
+
+  static ifEmpty(attrs) {
+    return new IfEmpty(attrs);
+  }
+
+  static includeXDPContent(attrs) {
+    return new IncludeXDPContent(attrs);
+  }
+
+  static incrementalLoad(attrs) {
+    return new IncrementalLoad(attrs);
+  }
+
+  static incrementalMerge(attrs) {
+    return new IncrementalMerge(attrs);
+  }
+
+  static interactive(attrs) {
+    return new Interactive(attrs);
+  }
+
+  static jog(attrs) {
+    return new Jog(attrs);
+  }
+
+  static labelPrinter(attrs) {
+    return new LabelPrinter(attrs);
+  }
+
+  static layout(attrs) {
+    return new Layout(attrs);
+  }
+
+  static level(attrs) {
+    return new Level(attrs);
+  }
+
+  static linearized(attrs) {
+    return new Linearized(attrs);
+  }
+
+  static locale(attrs) {
+    return new Locale(attrs);
+  }
+
+  static localeSet(attrs) {
+    return new LocaleSet(attrs);
+  }
+
+  static log(attrs) {
+    return new Log(attrs);
+  }
+
+  static map(attrs) {
+    return new MapElement(attrs);
+  }
+
+  static mediumInfo(attrs) {
+    return new MediumInfo(attrs);
+  }
+
+  static message(attrs) {
+    return new Message(attrs);
+  }
+
+  static messaging(attrs) {
+    return new Messaging(attrs);
+  }
+
+  static mode(attrs) {
+    return new Mode(attrs);
+  }
+
+  static modifyAnnots(attrs) {
+    return new ModifyAnnots(attrs);
+  }
+
+  static msgId(attrs) {
+    return new MsgId(attrs);
+  }
+
+  static nameAttr(attrs) {
+    return new NameAttr(attrs);
+  }
+
+  static neverEmbed(attrs) {
+    return new NeverEmbed(attrs);
+  }
+
+  static numberOfCopies(attrs) {
+    return new NumberOfCopies(attrs);
+  }
+
+  static openAction(attrs) {
+    return new OpenAction(attrs);
+  }
+
+  static output(attrs) {
+    return new Output(attrs);
+  }
+
+  static outputBin(attrs) {
+    return new OutputBin(attrs);
+  }
+
+  static outputXSL(attrs) {
+    return new OutputXSL(attrs);
+  }
+
+  static overprint(attrs) {
+    return new Overprint(attrs);
+  }
+
+  static packets(attrs) {
+    return new Packets(attrs);
+  }
+
+  static pageOffset(attrs) {
+    return new PageOffset(attrs);
+  }
+
+  static pageRange(attrs) {
+    return new PageRange(attrs);
+  }
+
+  static pagination(attrs) {
+    return new Pagination(attrs);
+  }
+
+  static paginationOverride(attrs) {
+    return new PaginationOverride(attrs);
+  }
+
+  static part(attrs) {
+    return new Part(attrs);
+  }
+
+  static pcl(attrs) {
+    return new Pcl(attrs);
+  }
+
+  static pdf(attrs) {
+    return new Pdf(attrs);
+  }
+
+  static pdfa(attrs) {
+    return new Pdfa(attrs);
+  }
+
+  static permissions(attrs) {
+    return new Permissions(attrs);
+  }
+
+  static pickTrayByPDFSize(attrs) {
+    return new PickTrayByPDFSize(attrs);
+  }
+
+  static picture(attrs) {
+    return new Picture(attrs);
+  }
+
+  static plaintextMetadata(attrs) {
+    return new PlaintextMetadata(attrs);
+  }
+
+  static presence(attrs) {
+    return new Presence(attrs);
+  }
+
+  static present(attrs) {
+    return new Present(attrs);
+  }
+
+  static print(attrs) {
+    return new Print(attrs);
+  }
+
+  static printHighQuality(attrs) {
+    return new PrintHighQuality(attrs);
+  }
+
+  static printScaling(attrs) {
+    return new PrintScaling(attrs);
+  }
+
+  static printerName(attrs) {
+    return new PrinterName(attrs);
+  }
+
+  static producer(attrs) {
+    return new Producer(attrs);
+  }
+
+  static ps(attrs) {
+    return new Ps(attrs);
+  }
+
+  static range(attrs) {
+    return new Range(attrs);
+  }
+
+  static record(attrs) {
+    return new Record(attrs);
+  }
+
+  static relevant(attrs) {
+    return new Relevant(attrs);
+  }
+
+  static rename(attrs) {
+    return new Rename(attrs);
+  }
+
+  static renderPolicy(attrs) {
+    return new RenderPolicy(attrs);
+  }
+
+  static runScripts(attrs) {
+    return new RunScripts(attrs);
+  }
+
+  static script(attrs) {
+    return new Script(attrs);
+  }
+
+  static scriptModel(attrs) {
+    return new ScriptModel(attrs);
+  }
+
+  static severity(attrs) {
+    return new Severity(attrs);
+  }
+
+  static silentPrint(attrs) {
+    return new SilentPrint(attrs);
+  }
+
+  static staple(attrs) {
+    return new Staple(attrs);
+  }
+
+  static startNode(attrs) {
+    return new StartNode(attrs);
+  }
+
+  static startPage(attrs) {
+    return new StartPage(attrs);
+  }
+
+  static submitFormat(attrs) {
+    return new SubmitFormat(attrs);
+  }
+
+  static submitUrl(attrs) {
+    return new SubmitUrl(attrs);
+  }
+
+  static subsetBelow(attrs) {
+    return new SubsetBelow(attrs);
+  }
+
+  static suppressBanner(attrs) {
+    return new SuppressBanner(attrs);
+  }
+
+  static tagged(attrs) {
+    return new Tagged(attrs);
+  }
+
+  static template(attrs) {
+    return new Template(attrs);
+  }
+
+  static templateCache(attrs) {
+    return new TemplateCache(attrs);
+  }
+
+  static threshold(attrs) {
+    return new Threshold(attrs);
+  }
+
+  static to(attrs) {
+    return new To(attrs);
+  }
+
+  static trace(attrs) {
+    return new Trace(attrs);
+  }
+
+  static transform(attrs) {
+    return new Transform(attrs);
+  }
+
+  static type(attrs) {
+    return new Type(attrs);
+  }
+
+  static uri(attrs) {
+    return new Uri(attrs);
+  }
+
+  static validate(attrs) {
+    return new Validate(attrs);
+  }
+
+  static validateApprovalSignatures(attrs) {
+    return new ValidateApprovalSignatures(attrs);
+  }
+
+  static validationMessaging(attrs) {
+    return new ValidationMessaging(attrs);
+  }
+
+  static version(attrs) {
+    return new Version(attrs);
+  }
+
+  static versionControl(attrs) {
+    return new VersionControl(attrs);
+  }
+
+  static viewerPreferences(attrs) {
+    return new ViewerPreferences(attrs);
+  }
+
+  static webClient(attrs) {
+    return new WebClient(attrs);
+  }
+
+  static whitespace(attrs) {
+    return new Whitespace(attrs);
+  }
+
+  static window(attrs) {
+    return new Window(attrs);
+  }
+
+  static xdc(attrs) {
+    return new Xdc(attrs);
+  }
+
+  static xdp(attrs) {
+    return new Xdp(attrs);
+  }
+
+  static xsl(attrs) {
+    return new Xsl(attrs);
+  }
+
+  static zpl(attrs) {
+    return new Zpl(attrs);
+  }
+
+}
+
+exports.ConfigNamespace = ConfigNamespace;
+
+/***/ }),
+/* 90 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.ConnectionSetNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+const CONNECTION_SET_NS_ID = _namespaces.NamespaceIds.connectionSet.id;
+
+class ConnectionSet extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "connectionSet", true);
+    this.wsdlConnection = new _xfa_object.XFAObjectArray();
+    this.xmlConnection = new _xfa_object.XFAObjectArray();
+    this.xsdConnection = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class EffectiveInputPolicy extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "effectiveInputPolicy");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class EffectiveOutputPolicy extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Operation extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "operation");
+    this.id = attributes.id || "";
+    this.input = attributes.input || "";
+    this.name = attributes.name || "";
+    this.output = attributes.output || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class RootElement extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "rootElement");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class SoapAction extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "soapAction");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class SoapAddress extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "soapAddress");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class Uri extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "uri");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class WsdlAddress extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "wsdlAddress");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+
+}
+
+class WsdlConnection extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "wsdlConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.effectiveInputPolicy = null;
+    this.effectiveOutputPolicy = null;
+    this.operation = null;
+    this.soapAction = null;
+    this.soapAddress = null;
+    this.wsdlAddress = null;
+  }
+
+}
+
+class XmlConnection extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "xmlConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.uri = null;
+  }
+
+}
+
+class XsdConnection extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "xsdConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.rootElement = null;
+    this.uri = null;
+  }
+
+}
+
+class ConnectionSetNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (ConnectionSetNamespace.hasOwnProperty(name)) {
+      return ConnectionSetNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static connectionSet(attrs) {
+    return new ConnectionSet(attrs);
+  }
+
+  static effectiveInputPolicy(attrs) {
+    return new EffectiveInputPolicy(attrs);
+  }
+
+  static effectiveOutputPolicy(attrs) {
+    return new EffectiveOutputPolicy(attrs);
+  }
+
+  static operation(attrs) {
+    return new Operation(attrs);
+  }
+
+  static rootElement(attrs) {
+    return new RootElement(attrs);
+  }
+
+  static soapAction(attrs) {
+    return new SoapAction(attrs);
+  }
+
+  static soapAddress(attrs) {
+    return new SoapAddress(attrs);
+  }
+
+  static uri(attrs) {
+    return new Uri(attrs);
+  }
+
+  static wsdlAddress(attrs) {
+    return new WsdlAddress(attrs);
+  }
+
+  static wsdlConnection(attrs) {
+    return new WsdlConnection(attrs);
+  }
+
+  static xmlConnection(attrs) {
+    return new XmlConnection(attrs);
+  }
+
+  static xsdConnection(attrs) {
+    return new XsdConnection(attrs);
+  }
+
+}
+
+exports.ConnectionSetNamespace = ConnectionSetNamespace;
+
+/***/ }),
+/* 91 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.DatasetsNamespace = void 0;
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _namespaces = __w_pdfjs_require__(77);
+
+const DATASETS_NS_ID = _namespaces.NamespaceIds.datasets.id;
+
+class Data extends _xfa_object.XmlObject {
+  constructor(attributes) {
+    super(DATASETS_NS_ID, "data", attributes);
+  }
+
+  [_xfa_object.$isNsAgnostic]() {
+    return true;
+  }
+
+}
+
+class Datasets extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(DATASETS_NS_ID, "datasets", true);
+    this.data = null;
+    this.Signature = null;
+  }
+
+  [_xfa_object.$onChild](child) {
+    const name = child[_xfa_object.$nodeName];
+
+    if (name === "data" && child[_xfa_object.$namespaceId] === DATASETS_NS_ID || name === "Signature" && 
child[_xfa_object.$namespaceId] === _namespaces.NamespaceIds.signature.id) {
+      this[name] = child;
+    }
+
+    this[_xfa_object.$appendChild](child);
+  }
+
+}
+
+class DatasetsNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (DatasetsNamespace.hasOwnProperty(name)) {
+      return DatasetsNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static datasets(attributes) {
+    return new Datasets(attributes);
+  }
+
+  static data(attributes) {
+    return new Data(attributes);
+  }
+
+}
+
+exports.DatasetsNamespace = DatasetsNamespace;
+
+/***/ }),
+/* 92 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.LocaleSetNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+var _utils = __w_pdfjs_require__(76);
+
+const LOCALE_SET_NS_ID = _namespaces.NamespaceIds.localeSet.id;
+
+class CalendarSymbols extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "calendarSymbols", true);
+    this.name = "gregorian";
+    this.dayNames = new _xfa_object.XFAObjectArray(2);
+    this.eraNames = null;
+    this.meridiemNames = null;
+    this.monthNames = new _xfa_object.XFAObjectArray(2);
+  }
+
+}
+
+class CurrencySymbol extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "currencySymbol");
+    this.name = (0, _utils.getStringOption)(attributes.name, ["symbol", "isoname", "decimal"]);
+  }
+
+}
+
+class CurrencySymbols extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "currencySymbols", true);
+    this.currencySymbol = new _xfa_object.XFAObjectArray(3);
+  }
+
+}
+
+class DatePattern extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "datePattern");
+    this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]);
+  }
+
+}
+
+class DatePatterns extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "datePatterns", true);
+    this.datePattern = new _xfa_object.XFAObjectArray(4);
+  }
+
+}
+
+class DateTimeSymbols extends _xfa_object.ContentObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "dateTimeSymbols");
+  }
+
+}
+
+class Day extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "day");
+  }
+
+}
+
+class DayNames extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "dayNames", true);
+    this.abbr = (0, _utils.getInteger)({
+      data: attributes.abbr,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.day = new _xfa_object.XFAObjectArray(7);
+  }
+
+}
+
+class Era extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "era");
+  }
+
+}
+
+class EraNames extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "eraNames", true);
+    this.era = new _xfa_object.XFAObjectArray(2);
+  }
+
+}
+
+class Locale extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "locale", true);
+    this.desc = attributes.desc || "";
+    this.name = "isoname";
+    this.calendarSymbols = null;
+    this.currencySymbols = null;
+    this.datePatterns = null;
+    this.dateTimeSymbols = null;
+    this.numberPatterns = null;
+    this.numberSymbols = null;
+    this.timePatterns = null;
+    this.typeFaces = null;
+  }
+
+}
+
+class LocaleSet extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "localeSet", true);
+    this.locale = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class Meridiem extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "meridiem");
+  }
+
+}
+
+class MeridiemNames extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "meridiemNames", true);
+    this.meridiem = new _xfa_object.XFAObjectArray(2);
+  }
+
+}
+
+class Month extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "month");
+  }
+
+}
+
+class MonthNames extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "monthNames", true);
+    this.abbr = (0, _utils.getInteger)({
+      data: attributes.abbr,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.month = new _xfa_object.XFAObjectArray(12);
+  }
+
+}
+
+class NumberPattern extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberPattern");
+    this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]);
+  }
+
+}
+
+class NumberPatterns extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberPatterns", true);
+    this.numberPattern = new _xfa_object.XFAObjectArray(4);
+  }
+
+}
+
+class NumberSymbol extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberSymbol");
+    this.name = (0, _utils.getStringOption)(attributes.name, ["decimal", "grouping", "percent", "minus", 
"zero"]);
+  }
+
+}
+
+class NumberSymbols extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberSymbols", true);
+    this.numberSymbol = new _xfa_object.XFAObjectArray(5);
+  }
+
+}
+
+class TimePattern extends _xfa_object.StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "timePattern");
+    this.name = (0, _utils.getStringOption)(attributes.name, ["full", "long", "med", "short"]);
+  }
+
+}
+
+class TimePatterns extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "timePatterns", true);
+    this.timePattern = new _xfa_object.XFAObjectArray(4);
+  }
+
+}
+
+class TypeFace extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "typeFace", true);
+    this.name = attributes.name | "";
+  }
+
+}
+
+class TypeFaces extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "typeFaces", true);
+    this.typeFace = new _xfa_object.XFAObjectArray();
+  }
+
+}
+
+class LocaleSetNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (LocaleSetNamespace.hasOwnProperty(name)) {
+      return LocaleSetNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static calendarSymbols(attrs) {
+    return new CalendarSymbols(attrs);
+  }
+
+  static currencySymbol(attrs) {
+    return new CurrencySymbol(attrs);
+  }
+
+  static currencySymbols(attrs) {
+    return new CurrencySymbols(attrs);
+  }
+
+  static datePattern(attrs) {
+    return new DatePattern(attrs);
+  }
+
+  static datePatterns(attrs) {
+    return new DatePatterns(attrs);
+  }
+
+  static dateTimeSymbols(attrs) {
+    return new DateTimeSymbols(attrs);
+  }
+
+  static day(attrs) {
+    return new Day(attrs);
+  }
+
+  static dayNames(attrs) {
+    return new DayNames(attrs);
+  }
+
+  static era(attrs) {
+    return new Era(attrs);
+  }
+
+  static eraNames(attrs) {
+    return new EraNames(attrs);
+  }
+
+  static locale(attrs) {
+    return new Locale(attrs);
+  }
+
+  static localeSet(attrs) {
+    return new LocaleSet(attrs);
+  }
+
+  static meridiem(attrs) {
+    return new Meridiem(attrs);
+  }
+
+  static meridiemNames(attrs) {
+    return new MeridiemNames(attrs);
+  }
+
+  static month(attrs) {
+    return new Month(attrs);
+  }
+
+  static monthNames(attrs) {
+    return new MonthNames(attrs);
+  }
+
+  static numberPattern(attrs) {
+    return new NumberPattern(attrs);
+  }
+
+  static numberPatterns(attrs) {
+    return new NumberPatterns(attrs);
+  }
+
+  static numberSymbol(attrs) {
+    return new NumberSymbol(attrs);
+  }
+
+  static numberSymbols(attrs) {
+    return new NumberSymbols(attrs);
+  }
+
+  static timePattern(attrs) {
+    return new TimePattern(attrs);
+  }
+
+  static timePatterns(attrs) {
+    return new TimePatterns(attrs);
+  }
+
+  static typeFace(attrs) {
+    return new TypeFace(attrs);
+  }
+
+  static typeFaces(attrs) {
+    return new TypeFaces(attrs);
+  }
+
+}
+
+exports.LocaleSetNamespace = LocaleSetNamespace;
+
+/***/ }),
+/* 93 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.SignatureNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+const SIGNATURE_NS_ID = _namespaces.NamespaceIds.signature.id;
+
+class Signature extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(SIGNATURE_NS_ID, "signature", true);
+  }
+
+}
+
+class SignatureNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (SignatureNamespace.hasOwnProperty(name)) {
+      return SignatureNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static signature(attributes) {
+    return new Signature(attributes);
+  }
+
+}
+
+exports.SignatureNamespace = SignatureNamespace;
+
+/***/ }),
+/* 94 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.StylesheetNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+const STYLESHEET_NS_ID = _namespaces.NamespaceIds.stylesheet.id;
+
+class Stylesheet extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(STYLESHEET_NS_ID, "stylesheet", true);
+  }
+
+}
+
+class StylesheetNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (StylesheetNamespace.hasOwnProperty(name)) {
+      return StylesheetNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static stylesheet(attributes) {
+    return new Stylesheet(attributes);
+  }
+
+}
+
+exports.StylesheetNamespace = StylesheetNamespace;
+
+/***/ }),
+/* 95 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XdpNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+const XDP_NS_ID = _namespaces.NamespaceIds.xdp.id;
+
+class Xdp extends _xfa_object.XFAObject {
+  constructor(attributes) {
+    super(XDP_NS_ID, "xdp", true);
+    this.uuid = attributes.uuid || "";
+    this.timeStamp = attributes.timeStamp || "";
+    this.config = null;
+    this.connectionSet = null;
+    this.datasets = null;
+    this.localeSet = null;
+    this.stylesheet = new _xfa_object.XFAObjectArray();
+    this.template = null;
+  }
+
+  [_xfa_object.$onChildCheck](child) {
+    const ns = _namespaces.NamespaceIds[child[_xfa_object.$nodeName]];
+    return ns && child[_xfa_object.$namespaceId] === ns.id;
+  }
+
+}
+
+class XdpNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (XdpNamespace.hasOwnProperty(name)) {
+      return XdpNamespace[name](attributes);
+    }
+
+    return undefined;
+  }
+
+  static xdp(attributes) {
+    return new Xdp(attributes);
+  }
+
+}
+
+exports.XdpNamespace = XdpNamespace;
 
 /***/ }),
-/* 44 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 96 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.MurmurHash3_64 = void 0;
+}));
+exports.XhtmlNamespace = void 0;
 
-var _util = __w_pdfjs_require__(2);
+var _xfa_object = __w_pdfjs_require__(75);
 
-const SEED = 0xc3d2e1f0;
-const MASK_HIGH = 0xffff0000;
-const MASK_LOW = 0xffff;
+var _namespaces = __w_pdfjs_require__(77);
 
-class MurmurHash3_64 {
-  constructor(seed) {
-    this.h1 = seed ? seed & 0xffffffff : SEED;
-    this.h2 = seed ? seed & 0xffffffff : SEED;
+var _html_utils = __w_pdfjs_require__(82);
+
+var _utils = __w_pdfjs_require__(76);
+
+const XHTML_NS_ID = _namespaces.NamespaceIds.xhtml.id;
+const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", 
"font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", 
"line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", 
"tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", 
"xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]);
+const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], 
["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], 
["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], 
["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], 
["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => {
+  value = original.fontSize = (0, _utils.getMeasurement)(value);
+  return (0, _html_utils.measureToString)(0.99 * value);
+}], ["letter-spacing", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], 
["line-height", value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin", 
value => (0, _html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-bottom", value => (0, 
_html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-left", value => (0, 
_html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-right", value => (0, 
_html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["margin-top", value => (0, 
_html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["text-indent", value => (0, 
_html_utils.measureToString)((0, _utils.getMeasurement)(value))], ["font-family", value => value]]);
+const spacesRegExp = /\s+/g;
+const crlfRegExp = /[\r\n]+/g;
+
+function mapStyle(styleStr, fontFinder) {
+  const style = Object.create(null);
+
+  if (!styleStr) {
+    return style;
   }
 
-  update(input) {
-    let data, length;
+  const original = Object.create(null);
 
-    if ((0, _util.isString)(input)) {
-      data = new Uint8Array(input.length * 2);
-      length = 0;
+  for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) {
+    const mapping = StyleMapping.get(key);
 
-      for (let i = 0, ii = input.length; i < ii; i++) {
-        const code = input.charCodeAt(i);
+    if (mapping === "") {
+      continue;
+    }
 
-        if (code <= 0xff) {
-          data[length++] = code;
-        } else {
-          data[length++] = code >>> 8;
-          data[length++] = code & 0xff;
-        }
+    let newValue = value;
+
+    if (mapping) {
+      if (typeof mapping === "string") {
+        newValue = mapping;
+      } else {
+        newValue = mapping(value, original);
       }
-    } else if ((0, _util.isArrayBuffer)(input)) {
-      data = input;
-      length = data.byteLength;
-    } else {
-      throw new Error("Wrong data format in MurmurHash3_64_update. " + "Input must be a string or array.");
     }
 
-    const blockCounts = length >> 2;
-    const tailLength = length - blockCounts * 4;
-    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
-    let k1 = 0,
-        k2 = 0;
-    let h1 = this.h1,
-        h2 = this.h2;
-    const C1 = 0xcc9e2d51,
-          C2 = 0x1b873593;
-    const C1_LOW = C1 & MASK_LOW,
-          C2_LOW = C2 & MASK_LOW;
-
-    for (let i = 0; i < blockCounts; i++) {
-      if (i & 1) {
-        k1 = dataUint32[i];
-        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
-        k1 = k1 << 15 | k1 >>> 17;
-        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
-        h1 ^= k1;
-        h1 = h1 << 13 | h1 >>> 19;
-        h1 = h1 * 5 + 0xe6546b64;
+    if (key.endsWith("scale")) {
+      if (style.transform) {
+        style.transform = `${style[key]} ${newValue}`;
       } else {
-        k2 = dataUint32[i];
-        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
-        k2 = k2 << 15 | k2 >>> 17;
-        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
-        h2 ^= k2;
-        h2 = h2 << 13 | h2 >>> 19;
-        h2 = h2 * 5 + 0xe6546b64;
+        style.transform = newValue;
       }
+    } else {
+      style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue;
     }
+  }
 
-    k1 = 0;
+  if (style.fontFamily) {
+    (0, _html_utils.setFontFamily)({
+      typeface: style.fontFamily,
+      weight: style.fontWeight || "normal",
+      posture: style.fontStyle || "normal",
+      size: original.fontSize || 0
+    }, fontFinder, style);
+  }
 
-    switch (tailLength) {
-      case 3:
-        k1 ^= data[blockCounts * 4 + 2] << 16;
+  (0, _html_utils.fixTextIndent)(style);
+  return style;
+}
 
-      case 2:
-        k1 ^= data[blockCounts * 4 + 1] << 8;
+function checkStyle(node) {
+  if (!node.style) {
+    return "";
+  }
 
-      case 1:
-        k1 ^= data[blockCounts * 4];
-        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
-        k1 = k1 << 15 | k1 >>> 17;
-        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+  return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, 
value]) => {
+    if (key === "font-family") {
+      node[_xfa_object.$globalData].usedTypefaces.add(value);
+    }
 
-        if (blockCounts & 1) {
-          h1 ^= k1;
-        } else {
-          h2 ^= k1;
+    return VALID_STYLES.has(key);
+  }).map(kv => kv.join(":")).join(";");
+}
+
+const NoWhites = new Set(["body", "html"]);
+
+class XhtmlObject extends _xfa_object.XmlObject {
+  constructor(attributes, name) {
+    super(XHTML_NS_ID, name);
+    this.style = attributes.style || "";
+  }
+
+  [_xfa_object.$clean](builder) {
+    super[_xfa_object.$clean](builder);
+
+    this.style = checkStyle(this);
+  }
+
+  [_xfa_object.$acceptWhitespace]() {
+    return !NoWhites.has(this[_xfa_object.$nodeName]);
+  }
+
+  [_xfa_object.$onText](str) {
+    str = str.replace(crlfRegExp, "");
+
+    if (!this.style.includes("xfa-spacerun:yes")) {
+      str = str.replace(spacesRegExp, " ");
+    }
+
+    if (str) {
+      this[_xfa_object.$content] += str;
+    }
+  }
+
+  [_xfa_object.$pushGlyphs](measure, mustPop = true) {
+    const xfaFont = Object.create(null);
+    const margin = {
+      top: NaN,
+      bottom: NaN,
+      left: NaN,
+      right: NaN
+    };
+    let lineHeight = null;
+
+    for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) {
+      switch (key) {
+        case "font-family":
+          xfaFont.typeface = (0, _utils.stripQuotes)(value);
+          break;
+
+        case "font-size":
+          xfaFont.size = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "font-weight":
+          xfaFont.weight = value;
+          break;
+
+        case "font-style":
+          xfaFont.posture = value;
+          break;
+
+        case "letter-spacing":
+          xfaFont.letterSpacing = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "margin":
+          const values = value.split(/ \t/).map(x => (0, _utils.getMeasurement)(x));
+
+          switch (values.length) {
+            case 1:
+              margin.top = margin.bottom = margin.left = margin.right = values[0];
+              break;
+
+            case 2:
+              margin.top = margin.bottom = values[0];
+              margin.left = margin.right = values[1];
+              break;
+
+            case 3:
+              margin.top = values[0];
+              margin.bottom = values[2];
+              margin.left = margin.right = values[1];
+              break;
+
+            case 4:
+              margin.top = values[0];
+              margin.left = values[1];
+              margin.bottom = values[2];
+              margin.right = values[3];
+              break;
+          }
+
+          break;
+
+        case "margin-top":
+          margin.top = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "margin-bottom":
+          margin.bottom = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "margin-left":
+          margin.left = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "margin-right":
+          margin.right = (0, _utils.getMeasurement)(value);
+          break;
+
+        case "line-height":
+          lineHeight = (0, _utils.getMeasurement)(value);
+          break;
+      }
+    }
+
+    measure.pushData(xfaFont, margin, lineHeight);
+
+    if (this[_xfa_object.$content]) {
+      measure.addString(this[_xfa_object.$content]);
+    } else {
+      for (const child of this[_xfa_object.$getChildren]()) {
+        if (child[_xfa_object.$nodeName] === "#text") {
+          measure.addString(child[_xfa_object.$content]);
+          continue;
         }
 
+        child[_xfa_object.$pushGlyphs](measure);
+      }
     }
 
-    this.h1 = h1;
-    this.h2 = h2;
+    if (mustPop) {
+      measure.popFont();
+    }
   }
 
-  hexdigest() {
-    let h1 = this.h1,
-        h2 = this.h2;
-    h1 ^= h2 >>> 1;
-    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
-    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
-    h1 ^= h2 >>> 1;
-    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
-    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
-    h1 ^= h2 >>> 1;
-    const hex1 = (h1 >>> 0).toString(16),
-          hex2 = (h2 >>> 0).toString(16);
-    return hex1.padStart(8, "0") + hex2.padStart(8, "0");
+  [_xfa_object.$toHTML](availableSpace) {
+    const children = [];
+    this[_xfa_object.$extra] = {
+      children
+    };
+
+    this[_xfa_object.$childrenToHTML]({});
+
+    if (children.length === 0 && !this[_xfa_object.$content]) {
+      return _utils.HTMLResult.EMPTY;
+    }
+
+    return _utils.HTMLResult.success({
+      name: this[_xfa_object.$nodeName],
+      attributes: {
+        href: this.href,
+        style: mapStyle(this.style, this[_xfa_object.$globalData].fontFinder)
+      },
+      children,
+      value: this[_xfa_object.$content] || ""
+    });
   }
 
 }
 
-exports.MurmurHash3_64 = MurmurHash3_64;
+class A extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "a");
+    this.href = attributes.href || "";
+  }
 
-/***/ }),
-/* 45 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+}
 
-"use strict";
+class B extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "b");
+  }
 
+  [_xfa_object.$pushGlyphs](measure) {
+    measure.pushFont({
+      weight: "bold"
+    });
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PDFImage = void 0;
+    super[_xfa_object.$pushGlyphs](measure);
 
-var _util = __w_pdfjs_require__(2);
+    measure.popFont();
+  }
 
-var _primitives = __w_pdfjs_require__(5);
+}
 
-var _colorspace = __w_pdfjs_require__(23);
+class Body extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "body");
+  }
 
-var _stream = __w_pdfjs_require__(12);
+  [_xfa_object.$toHTML](availableSpace) {
+    const res = super[_xfa_object.$toHTML](availableSpace);
 
-var _jpeg_stream = __w_pdfjs_require__(18);
+    const {
+      html
+    } = res;
 
-var _jpx = __w_pdfjs_require__(21);
+    if (!html) {
+      return _utils.HTMLResult.EMPTY;
+    }
 
-function decodeAndClamp(value, addend, coefficient, max) {
-  value = addend + value * coefficient;
+    html.name = "div";
+    html.attributes.class = ["xfaRich"];
+    return res;
+  }
 
-  if (value < 0) {
-    value = 0;
-  } else if (value > max) {
-    value = max;
+}
+
+class Br extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "br");
+  }
+
+  [_xfa_object.$text]() {
+    return "\n";
+  }
+
+  [_xfa_object.$pushGlyphs](measure) {
+    measure.addString("\n");
+  }
+
+  [_xfa_object.$toHTML](availableSpace) {
+    return _utils.HTMLResult.success({
+      name: "br"
+    });
   }
 
-  return value;
 }
 
-function resizeImageMask(src, bpc, w1, h1, w2, h2) {
-  var length = w2 * h2;
-  let dest;
+class Html extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "html");
+  }
 
-  if (bpc <= 8) {
-    dest = new Uint8Array(length);
-  } else if (bpc <= 16) {
-    dest = new Uint16Array(length);
-  } else {
-    dest = new Uint32Array(length);
+  [_xfa_object.$toHTML](availableSpace) {
+    const children = [];
+    this[_xfa_object.$extra] = {
+      children
+    };
+
+    this[_xfa_object.$childrenToHTML]({});
+
+    if (children.length === 0) {
+      return _utils.HTMLResult.success({
+        name: "div",
+        attributes: {
+          class: ["xfaRich"],
+          style: {}
+        },
+        value: this[_xfa_object.$content] || ""
+      });
+    }
+
+    if (children.length === 1) {
+      const child = children[0];
+
+      if (child.attributes && child.attributes.class.includes("xfaRich")) {
+        return _utils.HTMLResult.success(child);
+      }
+    }
+
+    return _utils.HTMLResult.success({
+      name: "div",
+      attributes: {
+        class: ["xfaRich"],
+        style: {}
+      },
+      children
+    });
   }
 
-  var xRatio = w1 / w2;
-  var yRatio = h1 / h2;
-  var i,
-      j,
-      py,
-      newIndex = 0,
-      oldIndex;
-  var xScaled = new Uint16Array(w2);
-  var w1Scanline = w1;
+}
 
-  for (i = 0; i < w2; i++) {
-    xScaled[i] = Math.floor(i * xRatio);
+class I extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "i");
   }
 
-  for (i = 0; i < h2; i++) {
-    py = Math.floor(i * yRatio) * w1Scanline;
+  [_xfa_object.$pushGlyphs](measure) {
+    measure.pushFont({
+      posture: "italic"
+    });
 
-    for (j = 0; j < w2; j++) {
-      oldIndex = py + xScaled[j];
-      dest[newIndex++] = src[oldIndex];
+    super[_xfa_object.$pushGlyphs](measure);
+
+    measure.popFont();
+  }
+
+}
+
+class Li extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "li");
+  }
+
+}
+
+class Ol extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "ol");
+  }
+
+}
+
+class P extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "p");
+  }
+
+  [_xfa_object.$pushGlyphs](measure) {
+    super[_xfa_object.$pushGlyphs](measure, false);
+
+    measure.addString("\n");
+    measure.addPara();
+    measure.popFont();
+  }
+
+  [_xfa_object.$text]() {
+    return super[_xfa_object.$text]() + "\n";
+  }
+
+}
+
+class Span extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "span");
+  }
+
+}
+
+class Sub extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "sub");
+  }
+
+}
+
+class Sup extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "sup");
+  }
+
+}
+
+class Ul extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "ul");
+  }
+
+}
+
+class XhtmlNamespace {
+  static [_namespaces.$buildXFAObject](name, attributes) {
+    if (XhtmlNamespace.hasOwnProperty(name)) {
+      return XhtmlNamespace[name](attributes);
     }
+
+    return undefined;
+  }
+
+  static a(attributes) {
+    return new A(attributes);
+  }
+
+  static b(attributes) {
+    return new B(attributes);
+  }
+
+  static body(attributes) {
+    return new Body(attributes);
+  }
+
+  static br(attributes) {
+    return new Br(attributes);
+  }
+
+  static html(attributes) {
+    return new Html(attributes);
+  }
+
+  static i(attributes) {
+    return new I(attributes);
+  }
+
+  static li(attributes) {
+    return new Li(attributes);
+  }
+
+  static ol(attributes) {
+    return new Ol(attributes);
+  }
+
+  static p(attributes) {
+    return new P(attributes);
+  }
+
+  static span(attributes) {
+    return new Span(attributes);
+  }
+
+  static sub(attributes) {
+    return new Sub(attributes);
+  }
+
+  static sup(attributes) {
+    return new Sup(attributes);
+  }
+
+  static ul(attributes) {
+    return new Ul(attributes);
   }
 
-  return dest;
 }
 
-class PDFImage {
-  constructor({
-    xref,
-    res,
-    image,
-    isInline = false,
-    smask = null,
-    mask = null,
-    isMask = false,
-    pdfFunctionFactory,
-    localColorSpaceCache
-  }) {
-    this.image = image;
-    var dict = image.dict;
-    const filter = dict.get("Filter");
+exports.XhtmlNamespace = XhtmlNamespace;
 
-    if ((0, _primitives.isName)(filter)) {
-      switch (filter.name) {
-        case "JPXDecode":
-          var jpxImage = new _jpx.JpxImage();
-          jpxImage.parseImageProperties(image.stream);
-          image.stream.reset();
-          image.width = jpxImage.width;
-          image.height = jpxImage.height;
-          image.bitsPerComponent = jpxImage.bitsPerComponent;
-          image.numComps = jpxImage.componentsCount;
-          break;
+/***/ }),
+/* 97 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-        case "JBIG2Decode":
-          image.bitsPerComponent = 1;
-          image.numComps = 1;
-          break;
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.UnknownNamespace = void 0;
+
+var _namespaces = __w_pdfjs_require__(77);
+
+var _xfa_object = __w_pdfjs_require__(75);
+
+class UnknownNamespace {
+  constructor(nsId) {
+    this.namespaceId = nsId;
+  }
+
+  [_namespaces.$buildXFAObject](name, attributes) {
+    return new _xfa_object.XmlObject(this.namespaceId, name, attributes);
+  }
+
+}
+
+exports.UnknownNamespace = UnknownNamespace;
+
+/***/ }),
+/* 98 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.XRef = void 0;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(5);
+
+var _parser = __w_pdfjs_require__(17);
+
+var _core_utils = __w_pdfjs_require__(9);
+
+var _crypto = __w_pdfjs_require__(72);
+
+class XRef {
+  constructor(stream, pdfManager) {
+    this.stream = stream;
+    this.pdfManager = pdfManager;
+    this.entries = [];
+    this.xrefstms = Object.create(null);
+    this._cacheMap = new Map();
+    this.stats = {
+      streamTypes: Object.create(null),
+      fontTypes: Object.create(null)
+    };
+    this._newRefNum = null;
+  }
+
+  getNewRef() {
+    if (this._newRefNum === null) {
+      this._newRefNum = this.entries.length;
+    }
+
+    return _primitives.Ref.get(this._newRefNum++, 0);
+  }
+
+  resetNewRef() {
+    this._newRefNum = null;
+  }
+
+  setStartXRef(startXRef) {
+    this.startXRefQueue = [startXRef];
+  }
+
+  parse(recoveryMode = false) {
+    let trailerDict;
+
+    if (!recoveryMode) {
+      trailerDict = this.readXRef();
+    } else {
+      (0, _util.warn)("Indexing all PDF objects");
+      trailerDict = this.indexObjects();
+    }
+
+    trailerDict.assignXref(this);
+    this.trailer = trailerDict;
+    let encrypt;
+
+    try {
+      encrypt = trailerDict.get("Encrypt");
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
       }
+
+      (0, _util.warn)(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`);
     }
 
-    let width = dict.get("Width", "W");
-    let height = dict.get("Height", "H");
+    if ((0, _primitives.isDict)(encrypt)) {
+      const ids = trailerDict.get("ID");
+      const fileId = ids && ids.length ? ids[0] : "";
+      encrypt.suppressEncryption = true;
+      this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
+    }
 
-    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 
0 && (image.width !== width || image.height !== height)) {
-      (0, _util.warn)("PDFImage - using the Width/Height of the image data, " + "rather than the image 
dictionary.");
-      width = image.width;
-      height = image.height;
+    let root;
+
+    try {
+      root = trailerDict.get("Root");
+    } catch (ex) {
+      if (ex instanceof _core_utils.MissingDataException) {
+        throw ex;
+      }
+
+      (0, _util.warn)(`XRef.parse - Invalid "Root" reference: "${ex}".`);
     }
 
-    if (width < 1 || height < 1) {
-      throw new _util.FormatError(`Invalid image width: ${width} or height: ${height}`);
+    if ((0, _primitives.isDict)(root) && root.has("Pages")) {
+      this.root = root;
+    } else {
+      if (!recoveryMode) {
+        throw new _core_utils.XRefParseException();
+      }
+
+      throw new _util.FormatError("Invalid root reference");
     }
+  }
 
-    this.width = width;
-    this.height = height;
-    this.interpolate = dict.get("Interpolate", "I") || false;
-    this.imageMask = dict.get("ImageMask", "IM") || false;
-    this.matte = dict.get("Matte") || false;
-    var bitsPerComponent = image.bitsPerComponent;
+  processXRefTable(parser) {
+    if (!("tableState" in this)) {
+      this.tableState = {
+        entryNum: 0,
+        streamPos: parser.lexer.stream.pos,
+        parserBuf1: parser.buf1,
+        parserBuf2: parser.buf2
+      };
+    }
 
-    if (!bitsPerComponent) {
-      bitsPerComponent = dict.get("BitsPerComponent", "BPC");
+    const obj = this.readXRefTable(parser);
 
-      if (!bitsPerComponent) {
-        if (this.imageMask) {
-          bitsPerComponent = 1;
-        } else {
-          throw new _util.FormatError(`Bits per component missing in image: ${this.imageMask}`);
+    if (!(0, _primitives.isCmd)(obj, "trailer")) {
+      throw new _util.FormatError("Invalid XRef table: could not find trailer dictionary");
+    }
+
+    let dict = parser.getObj();
+
+    if (!(0, _primitives.isDict)(dict) && dict.dict) {
+      dict = dict.dict;
+    }
+
+    if (!(0, _primitives.isDict)(dict)) {
+      throw new _util.FormatError("Invalid XRef table: could not parse trailer dictionary");
+    }
+
+    delete this.tableState;
+    return dict;
+  }
+
+  readXRefTable(parser) {
+    const stream = parser.lexer.stream;
+    const tableState = this.tableState;
+    stream.pos = tableState.streamPos;
+    parser.buf1 = tableState.parserBuf1;
+    parser.buf2 = tableState.parserBuf2;
+    let obj;
+
+    while (true) {
+      if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) {
+        if ((0, _primitives.isCmd)(obj = parser.getObj(), "trailer")) {
+          break;
+        }
+
+        tableState.firstEntryNum = obj;
+        tableState.entryCount = parser.getObj();
+      }
+
+      let first = tableState.firstEntryNum;
+      const count = tableState.entryCount;
+
+      if (!Number.isInteger(first) || !Number.isInteger(count)) {
+        throw new _util.FormatError("Invalid XRef table: wrong types in subsection header");
+      }
+
+      for (let i = tableState.entryNum; i < count; i++) {
+        tableState.streamPos = stream.pos;
+        tableState.entryNum = i;
+        tableState.parserBuf1 = parser.buf1;
+        tableState.parserBuf2 = parser.buf2;
+        const entry = {};
+        entry.offset = parser.getObj();
+        entry.gen = parser.getObj();
+        const type = parser.getObj();
+
+        if (type instanceof _primitives.Cmd) {
+          switch (type.cmd) {
+            case "f":
+              entry.free = true;
+              break;
+
+            case "n":
+              entry.uncompressed = true;
+              break;
+          }
+        }
+
+        if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || 
entry.uncompressed)) {
+          throw new _util.FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`);
+        }
+
+        if (i === 0 && entry.free && first === 1) {
+          first = 0;
+        }
+
+        if (!this.entries[i + first]) {
+          this.entries[i + first] = entry;
         }
       }
+
+      tableState.entryNum = 0;
+      tableState.streamPos = stream.pos;
+      tableState.parserBuf1 = parser.buf1;
+      tableState.parserBuf2 = parser.buf2;
+      delete tableState.firstEntryNum;
+      delete tableState.entryCount;
     }
 
-    this.bpc = bitsPerComponent;
+    if (this.entries[0] && !this.entries[0].free) {
+      throw new _util.FormatError("Invalid XRef table: unexpected first object");
+    }
 
-    if (!this.imageMask) {
-      let colorSpace = dict.getRaw("ColorSpace") || dict.getRaw("CS");
+    return obj;
+  }
 
-      if (!colorSpace) {
-        (0, _util.info)("JPX images (which do not require color spaces)");
+  processXRefStream(stream) {
+    if (!("streamState" in this)) {
+      const streamParameters = stream.dict;
+      const byteWidths = streamParameters.get("W");
+      let range = streamParameters.get("Index");
 
-        switch (image.numComps) {
-          case 1:
-            colorSpace = _primitives.Name.get("DeviceGray");
+      if (!range) {
+        range = [0, streamParameters.get("Size")];
+      }
+
+      this.streamState = {
+        entryRanges: range,
+        byteWidths,
+        entryNum: 0,
+        streamPos: stream.pos
+      };
+    }
+
+    this.readXRefStream(stream);
+    delete this.streamState;
+    return stream.dict;
+  }
+
+  readXRefStream(stream) {
+    let i, j;
+    const streamState = this.streamState;
+    stream.pos = streamState.streamPos;
+    const byteWidths = streamState.byteWidths;
+    const typeFieldWidth = byteWidths[0];
+    const offsetFieldWidth = byteWidths[1];
+    const generationFieldWidth = byteWidths[2];
+    const entryRanges = streamState.entryRanges;
+
+    while (entryRanges.length > 0) {
+      const first = entryRanges[0];
+      const n = entryRanges[1];
+
+      if (!Number.isInteger(first) || !Number.isInteger(n)) {
+        throw new _util.FormatError(`Invalid XRef range fields: ${first}, ${n}`);
+      }
+
+      if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || 
!Number.isInteger(generationFieldWidth)) {
+        throw new _util.FormatError(`Invalid XRef entry fields length: ${first}, ${n}`);
+      }
+
+      for (i = streamState.entryNum; i < n; ++i) {
+        streamState.entryNum = i;
+        streamState.streamPos = stream.pos;
+        let type = 0,
+            offset = 0,
+            generation = 0;
+
+        for (j = 0; j < typeFieldWidth; ++j) {
+          type = type << 8 | stream.getByte();
+        }
+
+        if (typeFieldWidth === 0) {
+          type = 1;
+        }
+
+        for (j = 0; j < offsetFieldWidth; ++j) {
+          offset = offset << 8 | stream.getByte();
+        }
+
+        for (j = 0; j < generationFieldWidth; ++j) {
+          generation = generation << 8 | stream.getByte();
+        }
+
+        const entry = {};
+        entry.offset = offset;
+        entry.gen = generation;
+
+        switch (type) {
+          case 0:
+            entry.free = true;
             break;
 
-          case 3:
-            colorSpace = _primitives.Name.get("DeviceRGB");
+          case 1:
+            entry.uncompressed = true;
             break;
 
-          case 4:
-            colorSpace = _primitives.Name.get("DeviceCMYK");
+          case 2:
             break;
 
           default:
-            throw new Error(`JPX images with ${image.numComps} ` + "color components not supported.");
+            throw new _util.FormatError(`Invalid XRef entry type: ${type}`);
+        }
+
+        if (!this.entries[first + i]) {
+          this.entries[first + i] = entry;
         }
       }
 
-      this.colorSpace = _colorspace.ColorSpace.parse({
-        cs: colorSpace,
-        xref,
-        resources: isInline ? res : null,
-        pdfFunctionFactory,
-        localColorSpaceCache
-      });
-      this.numComps = this.colorSpace.numComps;
+      streamState.entryNum = 0;
+      streamState.streamPos = stream.pos;
+      entryRanges.splice(0, 2);
     }
+  }
 
-    this.decode = dict.getArray("Decode", "D");
-    this.needsDecode = false;
+  indexObjects() {
+    const TAB = 0x9,
+          LF = 0xa,
+          CR = 0xd,
+          SPACE = 0x20;
+    const PERCENT = 0x25,
+          LT = 0x3c;
 
-    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) 
|| isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
-      this.needsDecode = true;
-      var max = (1 << bitsPerComponent) - 1;
-      this.decodeCoefficients = [];
-      this.decodeAddends = [];
-      const isIndexed = this.colorSpace && this.colorSpace.name === "Indexed";
+    function readToken(data, offset) {
+      let token = "",
+          ch = data[offset];
 
-      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
-        var dmin = this.decode[i];
-        var dmax = this.decode[i + 1];
-        this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
-        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
+      while (ch !== LF && ch !== CR && ch !== LT) {
+        if (++offset >= data.length) {
+          break;
+        }
+
+        token += String.fromCharCode(ch);
+        ch = data[offset];
       }
+
+      return token;
     }
 
-    if (smask) {
-      this.smask = new PDFImage({
-        xref,
-        res,
-        image: smask,
-        isInline,
-        pdfFunctionFactory,
-        localColorSpaceCache
-      });
-    } else if (mask) {
-      if ((0, _primitives.isStream)(mask)) {
-        var maskDict = mask.dict,
-            imageMask = maskDict.get("ImageMask", "IM");
+    function skipUntil(data, offset, what) {
+      const length = what.length,
+            dataLength = data.length;
+      let skipped = 0;
 
-        if (!imageMask) {
-          (0, _util.warn)("Ignoring /Mask in image without /ImageMask.");
-        } else {
-          this.mask = new PDFImage({
-            xref,
-            res,
-            image: mask,
-            isInline,
-            isMask: true,
-            pdfFunctionFactory,
-            localColorSpaceCache
-          });
+      while (offset < dataLength) {
+        let i = 0;
+
+        while (i < length && data[offset + i] === what[i]) {
+          ++i;
         }
-      } else {
-        this.mask = mask;
+
+        if (i >= length) {
+          break;
+        }
+
+        offset++;
+        skipped++;
       }
+
+      return skipped;
     }
-  }
 
-  static async buildImage({
-    xref,
-    res,
-    image,
-    isInline = false,
-    pdfFunctionFactory,
-    localColorSpaceCache
-  }) {
-    const imageData = image;
-    let smaskData = null;
-    let maskData = null;
-    const smask = image.dict.get("SMask");
-    const mask = image.dict.get("Mask");
+    const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
+    const endobjRegExp = /\bendobj[\b\s]$/;
+    const nestedObjRegExp = /\s+(\d+\s+\d+\s+obj[\b\s<])$/;
+    const CHECK_CONTENT_LENGTH = 25;
+    const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+    const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
+    const objBytes = new Uint8Array([111, 98, 106]);
+    const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+    this.entries.length = 0;
+    const stream = this.stream;
+    stream.pos = 0;
+    const buffer = stream.getBytes(),
+          length = buffer.length;
+    let position = stream.start;
+    const trailers = [],
+          xrefStms = [];
 
-    if (smask) {
-      smaskData = smask;
-    } else if (mask) {
-      if ((0, _primitives.isStream)(mask) || Array.isArray(mask)) {
-        maskData = mask;
-      } else {
-        (0, _util.warn)("Unsupported mask format.");
+    while (position < length) {
+      let ch = buffer[position];
+
+      if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
+        ++position;
+        continue;
       }
-    }
 
-    return new PDFImage({
-      xref,
-      res,
-      image: imageData,
-      isInline,
-      smask: smaskData,
-      mask: maskData,
-      pdfFunctionFactory,
-      localColorSpaceCache
-    });
-  }
+      if (ch === PERCENT) {
+        do {
+          ++position;
 
-  static createMask({
-    imgArray,
-    width,
-    height,
-    imageIsFromDecodeStream,
-    inverseDecode
-  }) {
-    var computedLength = (width + 7 >> 3) * height;
-    var actualLength = imgArray.byteLength;
-    var haveFullData = computedLength === actualLength;
-    var data, i;
+          if (position >= length) {
+            break;
+          }
 
-    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
-      data = imgArray;
-    } else if (!inverseDecode) {
-      data = new Uint8ClampedArray(actualLength);
-      data.set(imgArray);
-    } else {
-      data = new Uint8ClampedArray(computedLength);
-      data.set(imgArray);
+          ch = buffer[position];
+        } while (ch !== LF && ch !== CR);
 
-      for (i = actualLength; i < computedLength; i++) {
-        data[i] = 0xff;
+        continue;
       }
-    }
 
-    if (inverseDecode) {
-      for (i = 0; i < actualLength; i++) {
-        data[i] ^= 0xff;
-      }
-    }
+      const token = readToken(buffer, position);
+      let m;
 
-    return {
-      data,
-      width,
-      height
-    };
-  }
+      if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) {
+        position += skipUntil(buffer, position, trailerBytes);
+        trailers.push(position);
+        position += skipUntil(buffer, position, startxrefBytes);
+      } else if (m = objRegExp.exec(token)) {
+        const num = m[1] | 0,
+              gen = m[2] | 0;
+        let contentLength,
+            startPos = position + token.length,
+            updateEntries = false;
 
-  get drawWidth() {
-    return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
-  }
+        if (!this.entries[num]) {
+          updateEntries = true;
+        } else if (this.entries[num].gen === gen) {
+          try {
+            const parser = new _parser.Parser({
+              lexer: new _parser.Lexer(stream.makeSubStream(startPos))
+            });
+            parser.getObj();
+            updateEntries = true;
+          } catch (ex) {
+            if (ex instanceof _core_utils.ParserEOFException) {
+              (0, _util.warn)(`indexObjects -- checking object (${token}): "${ex}".`);
+            } else {
+              updateEntries = true;
+            }
+          }
+        }
 
-  get drawHeight() {
-    return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
-  }
+        if (updateEntries) {
+          this.entries[num] = {
+            offset: position - stream.start,
+            gen,
+            uncompressed: true
+          };
+        }
 
-  decodeBuffer(buffer) {
-    var bpc = this.bpc;
-    var numComps = this.numComps;
-    var decodeAddends = this.decodeAddends;
-    var decodeCoefficients = this.decodeCoefficients;
-    var max = (1 << bpc) - 1;
-    var i, ii;
+        while (startPos < buffer.length) {
+          const endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;
+          contentLength = endPos - position;
+          const checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);
+          const tokenStr = (0, _util.bytesToString)(buffer.subarray(checkPos, endPos));
 
-    if (bpc === 1) {
-      for (i = 0, ii = buffer.length; i < ii; i++) {
-        buffer[i] = +!buffer[i];
-      }
+          if (endobjRegExp.test(tokenStr)) {
+            break;
+          } else {
+            const objToken = nestedObjRegExp.exec(tokenStr);
 
-      return;
-    }
+            if (objToken && objToken[1]) {
+              (0, _util.warn)('indexObjects: Found new "obj" inside of another "obj", ' + 'caused by missing 
"endobj" -- trying to recover.');
+              contentLength -= objToken[1].length;
+              break;
+            }
+          }
 
-    var index = 0;
+          startPos = endPos;
+        }
 
-    for (i = 0, ii = this.width * this.height; i < ii; i++) {
-      for (var j = 0; j < numComps; j++) {
-        buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
-        index++;
-      }
-    }
-  }
+        const content = buffer.subarray(position, position + contentLength);
+        const xrefTagOffset = skipUntil(content, 0, xrefBytes);
 
-  getComponents(buffer) {
-    var bpc = this.bpc;
+        if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
+          xrefStms.push(position - stream.start);
+          this.xrefstms[position - stream.start] = 1;
+        }
 
-    if (bpc === 8) {
-      return buffer;
+        position += contentLength;
+      } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) {
+        trailers.push(position);
+        position += skipUntil(buffer, position, startxrefBytes);
+      } else {
+        position += token.length + 1;
+      }
     }
 
-    var width = this.width;
-    var height = this.height;
-    var numComps = this.numComps;
-    var length = width * height * numComps;
-    var bufferPos = 0;
-    let output;
-
-    if (bpc <= 8) {
-      output = new Uint8Array(length);
-    } else if (bpc <= 16) {
-      output = new Uint16Array(length);
-    } else {
-      output = new Uint32Array(length);
+    for (let i = 0, ii = xrefStms.length; i < ii; ++i) {
+      this.startXRefQueue.push(xrefStms[i]);
+      this.readXRef(true);
     }
 
-    var rowComps = width * numComps;
-    var max = (1 << bpc) - 1;
-    var i = 0,
-        ii,
-        buf;
-
-    if (bpc === 1) {
-      var mask, loop1End, loop2End;
+    let trailerDict;
 
-      for (var j = 0; j < height; j++) {
-        loop1End = i + (rowComps & ~7);
-        loop2End = i + rowComps;
+    for (let i = 0, ii = trailers.length; i < ii; ++i) {
+      stream.pos = trailers[i];
+      const parser = new _parser.Parser({
+        lexer: new _parser.Lexer(stream),
+        xref: this,
+        allowStreams: true,
+        recoveryMode: true
+      });
+      const obj = parser.getObj();
 
-        while (i < loop1End) {
-          buf = buffer[bufferPos++];
-          output[i] = buf >> 7 & 1;
-          output[i + 1] = buf >> 6 & 1;
-          output[i + 2] = buf >> 5 & 1;
-          output[i + 3] = buf >> 4 & 1;
-          output[i + 4] = buf >> 3 & 1;
-          output[i + 5] = buf >> 2 & 1;
-          output[i + 6] = buf >> 1 & 1;
-          output[i + 7] = buf & 1;
-          i += 8;
-        }
+      if (!(0, _primitives.isCmd)(obj, "trailer")) {
+        continue;
+      }
 
-        if (i < loop2End) {
-          buf = buffer[bufferPos++];
-          mask = 128;
+      const dict = parser.getObj();
 
-          while (i < loop2End) {
-            output[i++] = +!!(buf & mask);
-            mask >>= 1;
-          }
-        }
+      if (!(0, _primitives.isDict)(dict)) {
+        continue;
       }
-    } else {
-      var bits = 0;
-      buf = 0;
 
-      for (i = 0, ii = length; i < ii; ++i) {
-        if (i % rowComps === 0) {
-          buf = 0;
-          bits = 0;
+      try {
+        const rootDict = dict.get("Root");
+
+        if (!(rootDict instanceof _primitives.Dict)) {
+          continue;
         }
 
-        while (bits < bpc) {
-          buf = buf << 8 | buffer[bufferPos++];
-          bits += 8;
+        const pagesDict = rootDict.get("Pages");
+
+        if (!(pagesDict instanceof _primitives.Dict)) {
+          continue;
         }
 
-        var remainingBits = bits - bpc;
-        let value = buf >> remainingBits;
+        const pagesCount = pagesDict.get("Count");
 
-        if (value < 0) {
-          value = 0;
-        } else if (value > max) {
-          value = max;
+        if (!Number.isInteger(pagesCount)) {
+          continue;
         }
+      } catch (ex) {
+        continue;
+      }
 
-        output[i] = value;
-        buf = buf & (1 << remainingBits) - 1;
-        bits = remainingBits;
+      if (dict.has("ID")) {
+        return dict;
       }
+
+      trailerDict = dict;
     }
 
-    return output;
-  }
+    if (trailerDict) {
+      return trailerDict;
+    }
 
-  fillOpacity(rgbaBuf, width, height, actualHeight, image) {
-    var smask = this.smask;
-    var mask = this.mask;
-    var alphaBuf, sw, sh, i, ii, j;
+    throw new _util.InvalidPDFException("Invalid PDF structure.");
+  }
 
-    if (smask) {
-      sw = smask.width;
-      sh = smask.height;
-      alphaBuf = new Uint8ClampedArray(sw * sh);
-      smask.fillGrayBuffer(alphaBuf);
+  readXRef(recoveryMode = false) {
+    const stream = this.stream;
+    const startXRefParsedCache = new Set();
 
-      if (sw !== width || sh !== height) {
-        alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
-      }
-    } else if (mask) {
-      if (mask instanceof PDFImage) {
-        sw = mask.width;
-        sh = mask.height;
-        alphaBuf = new Uint8ClampedArray(sw * sh);
-        mask.numComps = 1;
-        mask.fillGrayBuffer(alphaBuf);
+    try {
+      while (this.startXRefQueue.length) {
+        const startXRef = this.startXRefQueue[0];
 
-        for (i = 0, ii = sw * sh; i < ii; ++i) {
-          alphaBuf[i] = 255 - alphaBuf[i];
+        if (startXRefParsedCache.has(startXRef)) {
+          (0, _util.warn)("readXRef - skipping XRef table since it was already parsed.");
+          this.startXRefQueue.shift();
+          continue;
         }
 
-        if (sw !== width || sh !== height) {
-          alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
-        }
-      } else if (Array.isArray(mask)) {
-        alphaBuf = new Uint8ClampedArray(width * height);
-        var numComps = this.numComps;
+        startXRefParsedCache.add(startXRef);
+        stream.pos = startXRef + stream.start;
+        const parser = new _parser.Parser({
+          lexer: new _parser.Lexer(stream),
+          xref: this,
+          allowStreams: true
+        });
+        let obj = parser.getObj();
+        let dict;
 
-        for (i = 0, ii = width * height; i < ii; ++i) {
-          var opacity = 0;
-          var imageOffset = i * numComps;
+        if ((0, _primitives.isCmd)(obj, "xref")) {
+          dict = this.processXRefTable(parser);
 
-          for (j = 0; j < numComps; ++j) {
-            var color = image[imageOffset + j];
-            var maskOffset = j * 2;
+          if (!this.topDict) {
+            this.topDict = dict;
+          }
 
-            if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
-              opacity = 255;
-              break;
+          obj = dict.get("XRefStm");
+
+          if (Number.isInteger(obj)) {
+            const pos = obj;
+
+            if (!(pos in this.xrefstms)) {
+              this.xrefstms[pos] = 1;
+              this.startXRefQueue.push(pos);
             }
           }
+        } else if (Number.isInteger(obj)) {
+          if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), "obj") || !(0, 
_primitives.isStream)(obj = parser.getObj())) {
+            throw new _util.FormatError("Invalid XRef stream");
+          }
 
-          alphaBuf[i] = opacity;
+          dict = this.processXRefStream(obj);
+
+          if (!this.topDict) {
+            this.topDict = dict;
+          }
+
+          if (!dict) {
+            throw new _util.FormatError("Failed to read XRef stream");
+          }
+        } else {
+          throw new _util.FormatError("Invalid XRef stream header");
         }
-      } else {
-        throw new _util.FormatError("Unknown mask format.");
-      }
-    }
 
-    if (alphaBuf) {
-      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
-        rgbaBuf[j] = alphaBuf[i];
+        obj = dict.get("Prev");
+
+        if (Number.isInteger(obj)) {
+          this.startXRefQueue.push(obj);
+        } else if ((0, _primitives.isRef)(obj)) {
+          this.startXRefQueue.push(obj.num);
+        }
+
+        this.startXRefQueue.shift();
       }
-    } else {
-      for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
-        rgbaBuf[j] = 255;
+
+      return this.topDict;
+    } catch (e) {
+      if (e instanceof _core_utils.MissingDataException) {
+        throw e;
       }
+
+      (0, _util.info)("(while reading XRef): " + e);
     }
+
+    if (recoveryMode) {
+      return undefined;
+    }
+
+    throw new _core_utils.XRefParseException();
   }
 
-  undoPreblend(buffer, width, height) {
-    var matte = this.smask && this.smask.matte;
+  getEntry(i) {
+    const xrefEntry = this.entries[i];
 
-    if (!matte) {
-      return;
+    if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
+      return xrefEntry;
     }
 
-    var matteRgb = this.colorSpace.getRgb(matte, 0);
-    var matteR = matteRgb[0];
-    var matteG = matteRgb[1];
-    var matteB = matteRgb[2];
-    var length = width * height * 4;
+    return null;
+  }
 
-    for (var i = 0; i < length; i += 4) {
-      var alpha = buffer[i + 3];
+  fetchIfRef(obj, suppressEncryption = false) {
+    if (obj instanceof _primitives.Ref) {
+      return this.fetch(obj, suppressEncryption);
+    }
 
-      if (alpha === 0) {
-        buffer[i] = 255;
-        buffer[i + 1] = 255;
-        buffer[i + 2] = 255;
-        continue;
-      }
+    return obj;
+  }
 
-      var k = 255 / alpha;
-      buffer[i] = (buffer[i] - matteR) * k + matteR;
-      buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
-      buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
+  fetch(ref, suppressEncryption = false) {
+    if (!(ref instanceof _primitives.Ref)) {
+      throw new Error("ref object is not a reference");
     }
-  }
 
-  createImageData(forceRGBA = false) {
-    var drawWidth = this.drawWidth;
-    var drawHeight = this.drawHeight;
-    var imgData = {
-      width: drawWidth,
-      height: drawHeight,
-      kind: 0,
-      data: null
-    };
-    var numComps = this.numComps;
-    var originalWidth = this.width;
-    var originalHeight = this.height;
-    var bpc = this.bpc;
-    var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
-    var imgArray;
+    const num = ref.num;
 
-    if (!forceRGBA) {
-      var kind;
+    const cacheEntry = this._cacheMap.get(num);
 
-      if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
-        kind = _util.ImageKind.GRAYSCALE_1BPP;
-      } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
-        kind = _util.ImageKind.RGB_24BPP;
+    if (cacheEntry !== undefined) {
+      if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {
+        cacheEntry.objId = ref.toString();
       }
 
-      if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) 
{
-        imgData.kind = kind;
-        imgArray = this.getImageBytes(originalHeight * rowBytes);
+      return cacheEntry;
+    }
 
-        if (this.image instanceof _stream.DecodeStream) {
-          imgData.data = imgArray;
-        } else {
-          var newArray = new Uint8ClampedArray(imgArray.length);
-          newArray.set(imgArray);
-          imgData.data = newArray;
-        }
+    let xrefEntry = this.getEntry(num);
 
-        if (this.needsDecode) {
-          (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image 
must be grayscale.");
-          var buffer = imgData.data;
+    if (xrefEntry === null) {
+      this._cacheMap.set(num, xrefEntry);
 
-          for (var i = 0, ii = buffer.length; i < ii; i++) {
-            buffer[i] ^= 0xff;
-          }
-        }
+      return xrefEntry;
+    }
 
-        return imgData;
-      }
+    if (xrefEntry.uncompressed) {
+      xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
+    } else {
+      xrefEntry = this.fetchCompressed(ref, xrefEntry, suppressEncryption);
+    }
 
-      if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
-        let imageLength = originalHeight * rowBytes;
+    if ((0, _primitives.isDict)(xrefEntry)) {
+      xrefEntry.objId = ref.toString();
+    } else if ((0, _primitives.isStream)(xrefEntry)) {
+      xrefEntry.dict.objId = ref.toString();
+    }
 
-        switch (this.colorSpace.name) {
-          case "DeviceGray":
-            imageLength *= 3;
+    return xrefEntry;
+  }
 
-          case "DeviceRGB":
-          case "DeviceCMYK":
-            imgData.kind = _util.ImageKind.RGB_24BPP;
-            imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
-            return imgData;
+  fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {
+    const gen = ref.gen;
+    let num = ref.num;
+
+    if (xrefEntry.gen !== gen) {
+      throw new _core_utils.XRefEntryException(`Inconsistent generation in XRef: ${ref}`);
+    }
+
+    const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
+    const parser = new _parser.Parser({
+      lexer: new _parser.Lexer(stream),
+      xref: this,
+      allowStreams: true
+    });
+    const obj1 = parser.getObj();
+    const obj2 = parser.getObj();
+    const obj3 = parser.getObj();
+
+    if (obj1 !== num || obj2 !== gen || !(obj3 instanceof _primitives.Cmd)) {
+      throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
+    }
+
+    if (obj3.cmd !== "obj") {
+      if (obj3.cmd.startsWith("obj")) {
+        num = parseInt(obj3.cmd.substring(3), 10);
+
+        if (!Number.isNaN(num)) {
+          return num;
         }
       }
-    }
 
-    imgArray = this.getImageBytes(originalHeight * rowBytes);
-    var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
-    var comps = this.getComponents(imgArray);
-    var alpha01, maybeUndoPreblend;
+      throw new _core_utils.XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
+    }
 
-    if (!forceRGBA && !this.smask && !this.mask) {
-      imgData.kind = _util.ImageKind.RGB_24BPP;
-      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
-      alpha01 = 0;
-      maybeUndoPreblend = false;
+    if (this.encrypt && !suppressEncryption) {
+      xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
     } else {
-      imgData.kind = _util.ImageKind.RGBA_32BPP;
-      imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
-      alpha01 = 1;
-      maybeUndoPreblend = true;
-      this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
+      xrefEntry = parser.getObj();
     }
 
-    if (this.needsDecode) {
-      this.decodeBuffer(comps);
+    if (!(0, _primitives.isStream)(xrefEntry)) {
+      this._cacheMap.set(num, xrefEntry);
     }
 
-    this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, 
actualHeight, bpc, comps, alpha01);
+    return xrefEntry;
+  }
 
-    if (maybeUndoPreblend) {
-      this.undoPreblend(imgData.data, drawWidth, actualHeight);
+  fetchCompressed(ref, xrefEntry, suppressEncryption = false) {
+    const tableOffset = xrefEntry.offset;
+    const stream = this.fetch(_primitives.Ref.get(tableOffset, 0));
+
+    if (!(0, _primitives.isStream)(stream)) {
+      throw new _util.FormatError("bad ObjStm stream");
     }
 
-    return imgData;
-  }
+    const first = stream.dict.get("First");
+    const n = stream.dict.get("N");
 
-  fillGrayBuffer(buffer) {
-    var numComps = this.numComps;
+    if (!Number.isInteger(first) || !Number.isInteger(n)) {
+      throw new _util.FormatError("invalid first and n parameters for ObjStm stream");
+    }
 
-    if (numComps !== 1) {
-      throw new _util.FormatError(`Reading gray scale from a color image: ${numComps}`);
+    let parser = new _parser.Parser({
+      lexer: new _parser.Lexer(stream),
+      xref: this,
+      allowStreams: true
+    });
+    const nums = new Array(n);
+    const offsets = new Array(n);
+
+    for (let i = 0; i < n; ++i) {
+      const num = parser.getObj();
+
+      if (!Number.isInteger(num)) {
+        throw new _util.FormatError(`invalid object number in the ObjStm stream: ${num}`);
+      }
+
+      const offset = parser.getObj();
+
+      if (!Number.isInteger(offset)) {
+        throw new _util.FormatError(`invalid object offset in the ObjStm stream: ${offset}`);
+      }
+
+      nums[i] = num;
+      offsets[i] = offset;
     }
 
-    var width = this.width;
-    var height = this.height;
-    var bpc = this.bpc;
-    var rowBytes = width * numComps * bpc + 7 >> 3;
-    var imgArray = this.getImageBytes(height * rowBytes);
-    var comps = this.getComponents(imgArray);
-    var i, length;
+    const start = (stream.start || 0) + first;
+    const entries = new Array(n);
 
-    if (bpc === 1) {
-      length = width * height;
+    for (let i = 0; i < n; ++i) {
+      const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined;
 
-      if (this.needsDecode) {
-        for (i = 0; i < length; ++i) {
-          buffer[i] = comps[i] - 1 & 255;
-        }
-      } else {
-        for (i = 0; i < length; ++i) {
-          buffer[i] = -comps[i] & 255;
-        }
+      if (length < 0) {
+        throw new _util.FormatError("Invalid offset in the ObjStm stream.");
       }
 
-      return;
+      parser = new _parser.Parser({
+        lexer: new _parser.Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)),
+        xref: this,
+        allowStreams: true
+      });
+      const obj = parser.getObj();
+      entries[i] = obj;
+
+      if ((0, _primitives.isStream)(obj)) {
+        continue;
+      }
+
+      const num = nums[i],
+            entry = this.entries[num];
+
+      if (entry && entry.offset === tableOffset && entry.gen === i) {
+        this._cacheMap.set(num, obj);
+      }
     }
 
-    if (this.needsDecode) {
-      this.decodeBuffer(comps);
+    xrefEntry = entries[xrefEntry.gen];
+
+    if (xrefEntry === undefined) {
+      throw new _core_utils.XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);
     }
 
-    length = width * height;
-    var scale = 255 / ((1 << bpc) - 1);
+    return xrefEntry;
+  }
 
-    for (i = 0; i < length; ++i) {
-      buffer[i] = scale * comps[i];
+  async fetchIfRefAsync(obj, suppressEncryption) {
+    if (obj instanceof _primitives.Ref) {
+      return this.fetchAsync(obj, suppressEncryption);
     }
+
+    return obj;
   }
 
-  getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {
-    this.image.reset();
-    this.image.drawWidth = drawWidth || this.width;
-    this.image.drawHeight = drawHeight || this.height;
-    this.image.forceRGB = !!forceRGB;
-    return this.image.getBytes(length, true);
+  async fetchAsync(ref, suppressEncryption) {
+    try {
+      return this.fetch(ref, suppressEncryption);
+    } catch (ex) {
+      if (!(ex instanceof _core_utils.MissingDataException)) {
+        throw ex;
+      }
+
+      await this.pdfManager.requestRange(ex.begin, ex.end);
+      return this.fetchAsync(ref, suppressEncryption);
+    }
+  }
+
+  getCatalogObj() {
+    return this.root;
   }
 
 }
 
-exports.PDFImage = PDFImage;
+exports.XRef = XRef;
 
 /***/ }),
-/* 46 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 99 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.MessageHandler = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -47480,15 +71664,14 @@ class MessageHandler {
 exports.MessageHandler = MessageHandler;
 
 /***/ }),
-/* 47 */
-/***/ (function(module, exports, __w_pdfjs_require__) {
+/* 100 */
+/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFWorkerStream = void 0;
 
 var _util = __w_pdfjs_require__(2);
@@ -47520,11 +71703,9 @@ class PDFWorkerStream {
       this._fullRequestReader.cancel(reason);
     }
 
-    const readers = this._rangeRequestReaders.slice(0);
-
-    readers.forEach(function (reader) {
+    for (const reader of this._rangeRequestReaders.slice(0)) {
       reader.cancel(reason);
-    });
+    }
   }
 
 }
@@ -47633,6 +71814,86 @@ class PDFWorkerStreamRangeReader {
 }
 
 /***/ })
-/******/ ]);
+/******/       ]);
+/************************************************************************/
+/******/       // The module cache
+/******/       var __webpack_module_cache__ = {};
+/******/       
+/******/       // The require function
+/******/       function __w_pdfjs_require__(moduleId) {
+/******/               // Check if module is in cache
+/******/               var cachedModule = __webpack_module_cache__[moduleId];
+/******/               if (cachedModule !== undefined) {
+/******/                       return cachedModule.exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = __webpack_module_cache__[moduleId] = {
+/******/                       // no module.id needed
+/******/                       // no module.loaded needed
+/******/                       exports: {}
+/******/               };
+/******/       
+/******/               // Execute the module function
+/******/               __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__);
+/******/       
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/       
+/************************************************************************/
+/******/       /* webpack/runtime/define property getters */
+/******/       (() => {
+/******/               // define getter functions for harmony exports
+/******/               __w_pdfjs_require__.d = (exports, definition) => {
+/******/                       for(var key in definition) {
+/******/                               if(__w_pdfjs_require__.o(definition, key) && 
!__w_pdfjs_require__.o(exports, key)) {
+/******/                                       Object.defineProperty(exports, key, { enumerable: true, get: 
definition[key] });
+/******/                               }
+/******/                       }
+/******/               };
+/******/       })();
+/******/       
+/******/       /* webpack/runtime/hasOwnProperty shorthand */
+/******/       (() => {
+/******/               __w_pdfjs_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, 
prop))
+/******/       })();
+/******/       
+/******/       /* webpack/runtime/make namespace object */
+/******/       (() => {
+/******/               // define __esModule on exports
+/******/               __w_pdfjs_require__.r = (exports) => {
+/******/                       if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/                               Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' 
});
+/******/                       }
+/******/                       Object.defineProperty(exports, '__esModule', { value: true });
+/******/               };
+/******/       })();
+/******/       
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the 
chunk.
+(() => {
+var exports = __webpack_exports__;
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+Object.defineProperty(exports, "WorkerMessageHandler", ({
+  enumerable: true,
+  get: function () {
+    return _worker.WorkerMessageHandler;
+  }
+}));
+
+var _worker = __w_pdfjs_require__(1);
+
+const pdfjsVersion = '2.10.377';
+const pdfjsBuild = '156762c48';
+})();
+
+/******/       return __webpack_exports__;
+/******/ })()
+;
 });
 //# sourceMappingURL=pdf.worker.js.map
\ No newline at end of file
diff --git a/third-party/pdfjs/epiphany-pdfjs-changes.patch b/third-party/pdfjs/epiphany-pdfjs-changes.patch
index 69f488516..dd5b52518 100644
--- a/third-party/pdfjs/epiphany-pdfjs-changes.patch
+++ b/third-party/pdfjs/epiphany-pdfjs-changes.patch
@@ -1,13 +1,162 @@
-diff -urN web2/viewer.css web/viewer.css
---- web2/viewer.css    2020-09-03 23:18:08.000000000 +0200
-+++ web/viewer.css     2021-04-05 11:25:24.181448360 +0200
+diff --git a/third-party/pdfjs/epiphany-pdfjs-changes.patch b/third-party/pdfjs/epiphany-pdfjs-changes.patch
+index 69f488516..e69de29bb 100644
+--- a/third-party/pdfjs/epiphany-pdfjs-changes.patch
++++ b/third-party/pdfjs/epiphany-pdfjs-changes.patch
+@@ -1,143 +0,0 @@
+-diff -urN web2/viewer.css web/viewer.css
+---- web2/viewer.css   2020-09-03 23:18:08.000000000 +0200
+-+++ web/viewer.css    2021-04-05 11:25:24.181448360 +0200
+-@@ -1,4 +1,5 @@
+- /* Copyright 2014 Mozilla Foundation
+-+ * Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
+-  *
+-  * Licensed under the Apache License, Version 2.0 (the "License");
+-  * you may not use this file except in compliance with the License.
+-@@ -2361,6 +2362,7 @@
+- }
+- 
+- .dropdownToolbarButton > select {
+-+  -webkit-appearance: none;
+-   width: 162px;
+-   height: 28px;
+-   font-size: 12px;
+-@@ -3132,6 +3134,7 @@
+- }
+- 
+- .toolbarField.pageNumber {
+-+  -webkit-appearance: none;
+-   -moz-appearance: textfield; /* hides the spinner in moz */
+-   min-width: 16px;
+-   text-align: right;
+-diff -urN web2/viewer.html web/viewer.html
+---- web2/viewer.html  2020-09-03 23:18:08.000000000 +0200
+-+++ web/viewer.html   2021-04-05 11:25:24.181448360 +0200
+-@@ -1,6 +1,7 @@
+- <!DOCTYPE html>
+- <!--
+- Copyright 2012 Mozilla Foundation
+-+Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
+- 
+- Licensed under the Apache License, Version 2.0 (the "License");
+- you may not use this file except in compliance with the License.
+-@@ -21,14 +22,14 @@
+- See https://github.com/adobe-type-tools/cmap-resources
+- -->
+- <html dir="ltr" mozdisallowselectionprint>
+--  <head>
+-+  <head pdf_data="%s" pdf_name="%s">
+-     <meta charset="utf-8">
+-     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+-     <meta name="google" content="notranslate">
+-     <meta http-equiv="X-UA-Compatible" content="IE=edge">
+-     <title>PDF.js viewer</title>
+- 
+--
+-+    <base href="ephy-resource:///org/gnome/epiphany/pdfjs/web/">
+-     <link rel="stylesheet" href="viewer.css">
+- 
+- 
+-@@ -124,7 +125,7 @@
+-               <span data-l10n-id="download_label">Download</span>
+-             </button>
+- 
+--            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark 
visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">
+-+            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark hidden" 
title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">
+-               <span data-l10n-id="bookmark_label">Current View</span>
+-             </a>
+- 
+-@@ -226,7 +227,7 @@
+-                 <button id="download" class="toolbarButton download hiddenMediumView" title="Download" 
tabindex="34" data-l10n-id="download">
+-                   <span data-l10n-id="download_label">Download</span>
+-                 </button>
+--                <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" 
title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
+-+                <a href="#" id="viewBookmark" class="toolbarButton bookmark hidden" title="Current view 
(copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
+-                   <span data-l10n-id="bookmark_label">Current View</span>
+-                 </a>
+- 
+-diff -urN web2/viewer.js web/viewer.js
+---- web2/viewer.js    2020-09-03 23:18:20.000000000 +0200
+-+++ web/viewer.js     2021-04-05 11:25:24.184448405 +0200
+-@@ -3,6 +3,7 @@
+-  * Javascript code in this page
+-  *
+-  * Copyright 2020 Mozilla Foundation
+-+ * Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
+-  *
+-  * Licensed under the Apache License, Version 2.0 (the "License");
+-  * you may not use this file except in compliance with the License.
+-@@ -1973,8 +1974,7 @@
+-   let file;
+-   const queryString = document.location.search.substring(1);
+-   const params = (0, _ui_utils.parseQueryString)(queryString);
+--  file = "file" in params ? params.file : _app_options.AppOptions.get("defaultUrl");
+--  validateFileURL(file);
+-+  file = '';
+-   const fileInput = document.createElement("input");
+-   fileInput.id = appConfig.openFileInputName;
+-   fileInput.className = "fileInput";
+-@@ -1982,12 +1982,8 @@
+-   fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;
+-   document.body.appendChild(fileInput);
+- 
+--  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
+--    appConfig.toolbar.openFile.setAttribute("hidden", "true");
+--    appConfig.secondaryToolbar.openFileButton.setAttribute("hidden", "true");
+--  } else {
+--    fileInput.value = null;
+--  }
+-+  appConfig.toolbar.openFile.setAttribute('hidden', 'true');
+-+  appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');
+- 
+-   fileInput.addEventListener("change", function (evt) {
+-     const files = evt.target.files;
+-@@ -2049,8 +2045,18 @@
+-     }
+-   }, true);
+- 
+-+  var file_name = document.head.getAttribute('pdf_name')
+-+  var raw = atob(document.head.getAttribute('pdf_data'));
+-+  var raw_length = raw.length;
+-+  var array = new Uint8Array(new ArrayBuffer(raw_length));
+-+
+-+  for(var i = 0; i < raw_length; i++) {
+-+    array[i] = raw.charCodeAt(i);
+-+  }
+-+
+-   try {
+--    webViewerOpenFileViaURL(file);
+-+    PDFViewerApplication.open(array);
+-+    PDFViewerApplication.setTitleUsingUrl(file_name);
+-   } catch (reason) {
+-     PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the 
PDF.").then(msg => {
+-       PDFViewerApplication.error(msg, reason);
+-@@ -6877,6 +6883,8 @@
+-       }
+-     }
+- 
+-+    // FIXME: This currently breaks Epiphany due to rewriting history with baseUrl
+-+    return;
+-     if (shouldReplace) {
+-       window.history.replaceState(newState, "", newUrl);
+-     } else {
+-@@ -13897,4 +13905,4 @@
+- 
+- /***/ })
+- /******/ ]);
+--//# sourceMappingURL=viewer.js.map
+-\ Kein Zeilenumbruch am Dateiende.
+-+//# sourceMappingURL=viewer.js.map
+diff --git a/third-party/pdfjs/web/viewer.css b/third-party/pdfjs/web/viewer.css
+index e35bdda4b..5261568a8 100644
+--- a/third-party/pdfjs/web/viewer.css
++++ b/third-party/pdfjs/web/viewer.css
 @@ -1,4 +1,5 @@
  /* Copyright 2014 Mozilla Foundation
 + * Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
-@@ -2361,6 +2362,7 @@
+@@ -1613,6 +1614,7 @@ html[dir="rtl"] .dropdownToolbarButton::after {
  }
  
  .dropdownToolbarButton > select {
@@ -15,7 +164,7 @@ diff -urN web2/viewer.css web/viewer.css
    width: 162px;
    height: 28px;
    font-size: 12px;
-@@ -3132,6 +3134,7 @@
+@@ -1986,6 +1988,7 @@ html[dir="rtl"] .toolbarField[type="checkbox"] {
  }
  
  .toolbarField.pageNumber {
@@ -23,9 +172,10 @@ diff -urN web2/viewer.css web/viewer.css
    -moz-appearance: textfield; /* hides the spinner in moz */
    min-width: 16px;
    text-align: right;
-diff -urN web2/viewer.html web/viewer.html
---- web2/viewer.html   2020-09-03 23:18:08.000000000 +0200
-+++ web/viewer.html    2021-04-05 11:25:24.181448360 +0200
+diff --git a/third-party/pdfjs/web/viewer.html b/third-party/pdfjs/web/viewer.html
+index 503b810ba..db9b7427a 100644
+--- a/third-party/pdfjs/web/viewer.html
++++ b/third-party/pdfjs/web/viewer.html
 @@ -1,6 +1,7 @@
  <!DOCTYPE html>
  <!--
@@ -34,7 +184,7 @@ diff -urN web2/viewer.html web/viewer.html
  
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
-@@ -21,14 +22,14 @@
+@@ -21,13 +22,13 @@ Adobe CMap resources are covered by their own copyright but the same license:
  See https://github.com/adobe-type-tools/cmap-resources
  -->
  <html dir="ltr" mozdisallowselectionprint>
@@ -43,7 +193,6 @@ diff -urN web2/viewer.html web/viewer.html
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
      <meta name="google" content="notranslate">
-     <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <title>PDF.js viewer</title>
  
 -
@@ -51,7 +200,7 @@ diff -urN web2/viewer.html web/viewer.html
      <link rel="stylesheet" href="viewer.css">
  
  
-@@ -124,7 +125,7 @@
+@@ -135,7 +136,7 @@ See https://github.com/adobe-type-tools/cmap-resources
                <span data-l10n-id="download_label">Download</span>
              </button>
  
@@ -60,7 +209,7 @@ diff -urN web2/viewer.html web/viewer.html
                <span data-l10n-id="bookmark_label">Current View</span>
              </a>
  
-@@ -226,7 +227,7 @@
+@@ -237,7 +238,7 @@ See https://github.com/adobe-type-tools/cmap-resources
                  <button id="download" class="toolbarButton download hiddenMediumView" title="Download" 
tabindex="34" data-l10n-id="download">
                    <span data-l10n-id="download_label">Download</span>
                  </button>
@@ -69,18 +218,19 @@ diff -urN web2/viewer.html web/viewer.html
                    <span data-l10n-id="bookmark_label">Current View</span>
                  </a>
  
-diff -urN web2/viewer.js web/viewer.js
---- web2/viewer.js     2020-09-03 23:18:20.000000000 +0200
-+++ web/viewer.js      2021-04-05 11:25:24.184448405 +0200
+diff --git a/third-party/pdfjs/web/viewer.js b/third-party/pdfjs/web/viewer.js
+index 1d013ebfe..d0064cf18 100644
+--- a/third-party/pdfjs/web/viewer.js
++++ b/third-party/pdfjs/web/viewer.js
 @@ -3,6 +3,7 @@
   * Javascript code in this page
   *
-  * Copyright 2020 Mozilla Foundation
+  * Copyright 2021 Mozilla Foundation
 + * Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
-@@ -1973,8 +1974,7 @@
+@@ -2244,8 +2245,7 @@ function webViewerInitialized() {
    let file;
    const queryString = document.location.search.substring(1);
    const params = (0, _ui_utils.parseQueryString)(queryString);
@@ -90,13 +240,13 @@ diff -urN web2/viewer.js web/viewer.js
    const fileInput = document.createElement("input");
    fileInput.id = appConfig.openFileInputName;
    fileInput.className = "fileInput";
-@@ -1982,12 +1982,8 @@
+@@ -2253,12 +2253,8 @@ function webViewerInitialized() {
    fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;
    document.body.appendChild(fileInput);
  
 -  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
--    appConfig.toolbar.openFile.setAttribute("hidden", "true");
--    appConfig.secondaryToolbar.openFileButton.setAttribute("hidden", "true");
+-    appConfig.toolbar.openFile.hidden = true;
+-    appConfig.secondaryToolbar.openFileButton.hidden = true;
 -  } else {
 -    fileInput.value = null;
 -  }
@@ -105,7 +255,7 @@ diff -urN web2/viewer.js web/viewer.js
  
    fileInput.addEventListener("change", function (evt) {
      const files = evt.target.files;
-@@ -2049,8 +2045,18 @@
+@@ -2320,8 +2316,18 @@ function webViewerInitialized() {
      }
    }, true);
  
@@ -123,9 +273,9 @@ diff -urN web2/viewer.js web/viewer.js
 +    PDFViewerApplication.open(array);
 +    PDFViewerApplication.setTitleUsingUrl(file_name);
    } catch (reason) {
-     PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the 
PDF.").then(msg => {
-       PDFViewerApplication.error(msg, reason);
-@@ -6877,6 +6883,8 @@
+     PDFViewerApplication.l10n.get("loading_error").then(msg => {
+       PDFViewerApplication._documentError(msg, reason);
+@@ -6381,6 +6387,8 @@ class PDFHistory {
        }
      }
  
@@ -134,10 +284,10 @@ diff -urN web2/viewer.js web/viewer.js
      if (shouldReplace) {
        window.history.replaceState(newState, "", newUrl);
      } else {
-@@ -13897,4 +13905,4 @@
+@@ -15403,4 +15411,4 @@ if (document.readyState === "interactive" || document.readyState === "complete")
  
- /***/ })
- /******/ ]);
+ /******/ })()
+ ;
 -//# sourceMappingURL=viewer.js.map
-\ Kein Zeilenumbruch am Dateiende.
+\ No newline at end of file
 +//# sourceMappingURL=viewer.js.map
diff --git a/third-party/pdfjs/pdfjs.gresource.xml b/third-party/pdfjs/pdfjs.gresource.xml
index 9845e7483..1769fb55c 100644
--- a/third-party/pdfjs/pdfjs.gresource.xml
+++ b/third-party/pdfjs/pdfjs.gresource.xml
@@ -2,369 +2,359 @@
 <gresources>
        <gresource prefix="/org/gnome/epiphany/pdfjs">
                <file compressed="true">build/pdf.js</file>
+               <file compressed="true">build/pdf.sandbox.js</file>
                <file compressed="true">build/pdf.worker.js</file>
                <file compressed="true">web/compressed.tracemonkey-pldi-09.pdf</file>
                <file compressed="true">web/debugger.js</file>
                <file compressed="true">web/viewer.css</file>
                <file compressed="true">web/viewer.html</file>
                <file compressed="true">web/viewer.js</file>
-               <file compressed="true">web/images/annotation-paragraph.svg</file>
-               <file compressed="true">web/images/annotation-note.svg</file>
-               <file compressed="true">web/images/annotation-noicon.svg</file>
-               <file compressed="true">web/images/loading-icon.gif</file>
+               <file compressed="true">web/cmaps/78-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/78-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/78-H.bcmap</file>
+               <file compressed="true">web/cmaps/78-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/78-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/78-V.bcmap</file>
+               <file compressed="true">web/cmaps/78ms-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/78ms-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/83pv-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/90ms-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/90ms-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/90msp-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/90msp-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/90pv-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/90pv-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/Add-H.bcmap</file>
+               <file compressed="true">web/cmaps/Add-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/Add-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/Add-V.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-0.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-1.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-3.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-4.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-5.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-6.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-CNS1-UCS2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-0.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-1.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-3.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-4.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-5.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-GB1-UCS2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-0.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-1.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-3.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-4.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-5.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-6.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Japan1-UCS2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Korea1-0.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Korea1-1.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Korea1-2.bcmap</file>
+               <file compressed="true">web/cmaps/Adobe-Korea1-UCS2.bcmap</file>
+               <file compressed="true">web/cmaps/B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/B5pc-H.bcmap</file>
+               <file compressed="true">web/cmaps/B5pc-V.bcmap</file>
+               <file compressed="true">web/cmaps/CNS-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/CNS-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/CNS1-H.bcmap</file>
+               <file compressed="true">web/cmaps/CNS1-V.bcmap</file>
+               <file compressed="true">web/cmaps/CNS2-H.bcmap</file>
+               <file compressed="true">web/cmaps/CNS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/ETHK-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/ETHK-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/ETen-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/ETen-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/ETenms-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/ETenms-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/Ext-H.bcmap</file>
+               <file compressed="true">web/cmaps/Ext-RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/Ext-RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/Ext-V.bcmap</file>
+               <file compressed="true">web/cmaps/GB-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GB-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/GB-H.bcmap</file>
+               <file compressed="true">web/cmaps/GB-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBK-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBK-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBK2K-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBK2K-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBKp-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBKp-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBT-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBT-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBT-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBT-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBTpc-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBTpc-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/GBpc-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/GBpc-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/H.bcmap</file>
+               <file compressed="true">web/cmaps/HKdla-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKdla-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/HKdlb-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKdlb-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/HKgccs-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKgccs-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/HKm314-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKm314-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/HKm471-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKm471-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/HKscs-B5-H.bcmap</file>
+               <file compressed="true">web/cmaps/HKscs-B5-V.bcmap</file>
+               <file compressed="true">web/cmaps/Hankaku.bcmap</file>
+               <file compressed="true">web/cmaps/Hiragana.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-Johab-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-Johab-V.bcmap</file>
+               <file compressed="true">web/cmaps/KSC-V.bcmap</file>
+               <file compressed="true">web/cmaps/KSCms-UHC-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSCms-UHC-HW-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSCms-UHC-HW-V.bcmap</file>
+               <file compressed="true">web/cmaps/KSCms-UHC-V.bcmap</file>
+               <file compressed="true">web/cmaps/KSCpc-EUC-H.bcmap</file>
+               <file compressed="true">web/cmaps/KSCpc-EUC-V.bcmap</file>
+               <file compressed="true">web/cmaps/Katakana.bcmap</file>
+               <file compressed="true">web/cmaps/LICENSE</file>
+               <file compressed="true">web/cmaps/NWP-H.bcmap</file>
+               <file compressed="true">web/cmaps/NWP-V.bcmap</file>
+               <file compressed="true">web/cmaps/RKSJ-H.bcmap</file>
+               <file compressed="true">web/cmaps/RKSJ-V.bcmap</file>
+               <file compressed="true">web/cmaps/Roman.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UCS2-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UCS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF16-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF16-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF8-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniCNS-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UCS2-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UCS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF16-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF16-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF8-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniGB-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UCS2-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UCS2-HW-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UCS2-HW-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UCS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF16-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF16-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF8-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF16-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF16-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF8-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJIS2004-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISPro-UCS2-HW-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISPro-UCS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISPro-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISX0213-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISX0213-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISX02132004-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniJISX02132004-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UCS2-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UCS2-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF16-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF16-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF32-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF32-V.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF8-H.bcmap</file>
+               <file compressed="true">web/cmaps/UniKS-UTF8-V.bcmap</file>
+               <file compressed="true">web/cmaps/V.bcmap</file>
+               <file compressed="true">web/cmaps/WP-Symbol.bcmap</file>
                <file compressed="true">web/images/annotation-check.svg</file>
-               <file compressed="true">web/images/annotation-key.svg</file>
+               <file compressed="true">web/images/annotation-comment.svg</file>
                <file compressed="true">web/images/annotation-help.svg</file>
-               <file compressed="true">web/images/grabbing.cur</file>
                <file compressed="true">web/images/annotation-insert.svg</file>
-               <file compressed="true">web/images/annotation-comment.svg</file>
-               <file compressed="true">web/images/grab.cur</file>
+               <file compressed="true">web/images/annotation-key.svg</file>
                <file compressed="true">web/images/annotation-newparagraph.svg</file>
-               <file compressed="true">web/images/findbarButton-next-dark.svg</file>
+               <file compressed="true">web/images/annotation-noicon.svg</file>
+               <file compressed="true">web/images/annotation-note.svg</file>
+               <file compressed="true">web/images/annotation-paragraph.svg</file>
                <file compressed="true">web/images/findbarButton-next.svg</file>
-               <file compressed="true">web/images/findbarButton-previous-dark.svg</file>
                <file compressed="true">web/images/findbarButton-previous.svg</file>
+               <file compressed="true">web/images/grab.cur</file>
+               <file compressed="true">web/images/grabbing.cur</file>
                <file compressed="true">web/images/loading-dark.svg</file>
+               <file compressed="true">web/images/loading-icon.gif</file>
                <file compressed="true">web/images/loading.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-documentProperties-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-documentProperties.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-firstPage-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-firstPage.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-handTool-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-handTool.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-lastPage-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-lastPage.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-rotateCcw-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-rotateCcw.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-rotateCw-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-rotateCw.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-scrollHorizontal-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-scrollHorizontal.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-scrollVertical-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-scrollVertical.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-scrollWrapped-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-scrollWrapped.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-selectTool-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-selectTool.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-spreadEven-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-spreadEven.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-spreadNone-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-spreadNone.svg</file>
-               <file compressed="true">web/images/secondaryToolbarButton-spreadOdd-dark.svg</file>
                <file compressed="true">web/images/secondaryToolbarButton-spreadOdd.svg</file>
                <file compressed="true">web/images/shadow.png</file>
-               <file compressed="true">web/images/toolbarButton-bookmark-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-bookmark.svg</file>
-               <file compressed="true">web/images/toolbarButton-download-dark.svg</file>
+               <file compressed="true">web/images/toolbarButton-currentOutlineItem.svg</file>
                <file compressed="true">web/images/toolbarButton-download.svg</file>
-               <file compressed="true">web/images/toolbarButton-menuArrow-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-menuArrow.svg</file>
-               <file compressed="true">web/images/toolbarButton-openFile-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-openFile.svg</file>
-               <file compressed="true">web/images/toolbarButton-pageDown-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-pageDown.svg</file>
-               <file compressed="true">web/images/toolbarButton-pageUp-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-pageUp.svg</file>
-               <file compressed="true">web/images/toolbarButton-presentationMode-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-presentationMode.svg</file>
-               <file compressed="true">web/images/toolbarButton-print-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-print.svg</file>
-               <file compressed="true">web/images/toolbarButton-search-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-search.svg</file>
-               <file compressed="true">web/images/toolbarButton-secondaryToolbarToggle-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-secondaryToolbarToggle.svg</file>
-               <file compressed="true">web/images/toolbarButton-sidebarToggle-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-sidebarToggle.svg</file>
-               <file compressed="true">web/images/toolbarButton-viewAttachments-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-viewAttachments.svg</file>
-               <file compressed="true">web/images/toolbarButton-viewLayers-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-viewLayers.svg</file>
-               <file compressed="true">web/images/toolbarButton-viewOutline-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-viewOutline.svg</file>
-               <file compressed="true">web/images/toolbarButton-viewThumbnail-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-viewThumbnail.svg</file>
-               <file compressed="true">web/images/toolbarButton-zoomIn-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-zoomIn.svg</file>
-               <file compressed="true">web/images/toolbarButton-zoomOut-dark.svg</file>
                <file compressed="true">web/images/toolbarButton-zoomOut.svg</file>
-               <file compressed="true">web/images/treeitem-collapsed-dark.svg</file>
                <file compressed="true">web/images/treeitem-collapsed.svg</file>
-               <file compressed="true">web/images/treeitem-expanded-dark.svg</file>
                <file compressed="true">web/images/treeitem-expanded.svg</file>
                <file compressed="true">web/locale/locale.properties</file>
-               <file compressed="true">web/locale/nn-NO/viewer.properties</file>
-               <file compressed="true">web/locale/uk/viewer.properties</file>
-               <file compressed="true">web/locale/ia/viewer.properties</file>
-               <file compressed="true">web/locale/de/viewer.properties</file>
-               <file compressed="true">web/locale/ko/viewer.properties</file>
-               <file compressed="true">web/locale/be/viewer.properties</file>
-               <file compressed="true">web/locale/ur/viewer.properties</file>
-               <file compressed="true">web/locale/dsb/viewer.properties</file>
-               <file compressed="true">web/locale/es-MX/viewer.properties</file>
-               <file compressed="true">web/locale/nb-NO/viewer.properties</file>
-               <file compressed="true">web/locale/fi/viewer.properties</file>
-               <file compressed="true">web/locale/ast/viewer.properties</file>
-               <file compressed="true">web/locale/fa/viewer.properties</file>
-               <file compressed="true">web/locale/zh-CN/viewer.properties</file>
-               <file compressed="true">web/locale/te/viewer.properties</file>
-               <file compressed="true">web/locale/si/viewer.properties</file>
-               <file compressed="true">web/locale/son/viewer.properties</file>
-               <file compressed="true">web/locale/es-ES/viewer.properties</file>
-               <file compressed="true">web/locale/sv-SE/viewer.properties</file>
-               <file compressed="true">web/locale/ms/viewer.properties</file>
                <file compressed="true">web/locale/ach/viewer.properties</file>
-               <file compressed="true">web/locale/sq/viewer.properties</file>
-               <file compressed="true">web/locale/ka/viewer.properties</file>
-               <file compressed="true">web/locale/gl/viewer.properties</file>
-               <file compressed="true">web/locale/en-CA/viewer.properties</file>
-               <file compressed="true">web/locale/hy-AM/viewer.properties</file>
-               <file compressed="true">web/locale/et/viewer.properties</file>
-               <file compressed="true">web/locale/ta/viewer.properties</file>
-               <file compressed="true">web/locale/eo/viewer.properties</file>
-               <file compressed="true">web/locale/da/viewer.properties</file>
-               <file compressed="true">web/locale/es-CL/viewer.properties</file>
-               <file compressed="true">web/locale/kab/viewer.properties</file>
-               <file compressed="true">web/locale/hr/viewer.properties</file>
-               <file compressed="true">web/locale/lt/viewer.properties</file>
-               <file compressed="true">web/locale/ltg/viewer.properties</file>
-               <file compressed="true">web/locale/gd/viewer.properties</file>
-               <file compressed="true">web/locale/vi/viewer.properties</file>
                <file compressed="true">web/locale/af/viewer.properties</file>
-               <file compressed="true">web/locale/sk/viewer.properties</file>
-               <file compressed="true">web/locale/ro/viewer.properties</file>
-               <file compressed="true">web/locale/hsb/viewer.properties</file>
-               <file compressed="true">web/locale/pt-PT/viewer.properties</file>
-               <file compressed="true">web/locale/kk/viewer.properties</file>
-               <file compressed="true">web/locale/hi-IN/viewer.properties</file>
-               <file compressed="true">web/locale/id/viewer.properties</file>
-               <file compressed="true">web/locale/tl/viewer.properties</file>
-               <file compressed="true">web/locale/gu-IN/viewer.properties</file>
-               <file compressed="true">web/locale/cak/viewer.properties</file>
-               <file compressed="true">web/locale/es-AR/viewer.properties</file>
-               <file compressed="true">web/locale/sr/viewer.properties</file>
-               <file compressed="true">web/locale/meh/viewer.properties</file>
-               <file compressed="true">web/locale/trs/viewer.properties</file>
-               <file compressed="true">web/locale/is/viewer.properties</file>
-               <file compressed="true">web/locale/fy-NL/viewer.properties</file>
-               <file compressed="true">web/locale/km/viewer.properties</file>
+               <file compressed="true">web/locale/an/viewer.properties</file>
                <file compressed="true">web/locale/ar/viewer.properties</file>
-               <file compressed="true">web/locale/fr/viewer.properties</file>
-               <file compressed="true">web/locale/lo/viewer.properties</file>
-               <file compressed="true">web/locale/pt-BR/viewer.properties</file>
-               <file compressed="true">web/locale/nl/viewer.properties</file>
-               <file compressed="true">web/locale/rm/viewer.properties</file>
-               <file compressed="true">web/locale/mr/viewer.properties</file>
-               <file compressed="true">web/locale/mk/viewer.properties</file>
-               <file compressed="true">web/locale/pl/viewer.properties</file>
-               <file compressed="true">web/locale/xh/viewer.properties</file>
+               <file compressed="true">web/locale/ast/viewer.properties</file>
+               <file compressed="true">web/locale/az/viewer.properties</file>
+               <file compressed="true">web/locale/be/viewer.properties</file>
+               <file compressed="true">web/locale/bg/viewer.properties</file>
                <file compressed="true">web/locale/bn/viewer.properties</file>
+               <file compressed="true">web/locale/bo/viewer.properties</file>
                <file compressed="true">web/locale/br/viewer.properties</file>
-               <file compressed="true">web/locale/en-GB/viewer.properties</file>
-               <file compressed="true">web/locale/kn/viewer.properties</file>
-               <file compressed="true">web/locale/cy/viewer.properties</file>
                <file compressed="true">web/locale/brx/viewer.properties</file>
-               <file compressed="true">web/locale/zh-TW/viewer.properties</file>
-               <file compressed="true">web/locale/lij/viewer.properties</file>
-               <file compressed="true">web/locale/ga-IE/viewer.properties</file>
-               <file compressed="true">web/locale/ne-NP/viewer.properties</file>
-               <file compressed="true">web/locale/az/viewer.properties</file>
-               <file compressed="true">web/locale/hu/viewer.properties</file>
-               <file compressed="true">web/locale/el/viewer.properties</file>
-               <file compressed="true">web/locale/gn/viewer.properties</file>
+               <file compressed="true">web/locale/bs/viewer.properties</file>
+               <file compressed="true">web/locale/ca/viewer.properties</file>
+               <file compressed="true">web/locale/cak/viewer.properties</file>
+               <file compressed="true">web/locale/ckb/viewer.properties</file>
                <file compressed="true">web/locale/cs/viewer.properties</file>
+               <file compressed="true">web/locale/cy/viewer.properties</file>
+               <file compressed="true">web/locale/da/viewer.properties</file>
+               <file compressed="true">web/locale/de/viewer.properties</file>
+               <file compressed="true">web/locale/dsb/viewer.properties</file>
+               <file compressed="true">web/locale/el/viewer.properties</file>
+               <file compressed="true">web/locale/en-CA/viewer.properties</file>
+               <file compressed="true">web/locale/en-GB/viewer.properties</file>
+               <file compressed="true">web/locale/en-US/viewer.properties</file>
+               <file compressed="true">web/locale/eo/viewer.properties</file>
+               <file compressed="true">web/locale/es-AR/viewer.properties</file>
+               <file compressed="true">web/locale/es-CL/viewer.properties</file>
+               <file compressed="true">web/locale/es-ES/viewer.properties</file>
+               <file compressed="true">web/locale/es-MX/viewer.properties</file>
+               <file compressed="true">web/locale/et/viewer.properties</file>
+               <file compressed="true">web/locale/eu/viewer.properties</file>
+               <file compressed="true">web/locale/fa/viewer.properties</file>
                <file compressed="true">web/locale/ff/viewer.properties</file>
-               <file compressed="true">web/locale/pa-IN/viewer.properties</file>
-               <file compressed="true">web/locale/sl/viewer.properties</file>
-               <file compressed="true">web/locale/lv/viewer.properties</file>
-               <file compressed="true">web/locale/ja/viewer.properties</file>
-               <file compressed="true">web/locale/ru/viewer.properties</file>
-               <file compressed="true">web/locale/ca/viewer.properties</file>
-               <file compressed="true">web/locale/wo/viewer.properties</file>
+               <file compressed="true">web/locale/fi/viewer.properties</file>
+               <file compressed="true">web/locale/fr/viewer.properties</file>
+               <file compressed="true">web/locale/fy-NL/viewer.properties</file>
+               <file compressed="true">web/locale/ga-IE/viewer.properties</file>
+               <file compressed="true">web/locale/gd/viewer.properties</file>
+               <file compressed="true">web/locale/gl/viewer.properties</file>
+               <file compressed="true">web/locale/gn/viewer.properties</file>
+               <file compressed="true">web/locale/gu-IN/viewer.properties</file>
+               <file compressed="true">web/locale/he/viewer.properties</file>
+               <file compressed="true">web/locale/hi-IN/viewer.properties</file>
+               <file compressed="true">web/locale/hr/viewer.properties</file>
+               <file compressed="true">web/locale/hsb/viewer.properties</file>
+               <file compressed="true">web/locale/hu/viewer.properties</file>
+               <file compressed="true">web/locale/hy-AM/viewer.properties</file>
+               <file compressed="true">web/locale/hye/viewer.properties</file>
+               <file compressed="true">web/locale/ia/viewer.properties</file>
+               <file compressed="true">web/locale/id/viewer.properties</file>
+               <file compressed="true">web/locale/is/viewer.properties</file>
                <file compressed="true">web/locale/it/viewer.properties</file>
-               <file compressed="true">web/locale/tr/viewer.properties</file>
-               <file compressed="true">web/locale/en-US/viewer.properties</file>
-               <file compressed="true">web/locale/an/viewer.properties</file>
+               <file compressed="true">web/locale/ja/viewer.properties</file>
+               <file compressed="true">web/locale/ka/viewer.properties</file>
+               <file compressed="true">web/locale/kab/viewer.properties</file>
+               <file compressed="true">web/locale/kk/viewer.properties</file>
+               <file compressed="true">web/locale/km/viewer.properties</file>
+               <file compressed="true">web/locale/kn/viewer.properties</file>
+               <file compressed="true">web/locale/ko/viewer.properties</file>
+               <file compressed="true">web/locale/lij/viewer.properties</file>
+               <file compressed="true">web/locale/lo/viewer.properties</file>
+               <file compressed="true">web/locale/lt/viewer.properties</file>
+               <file compressed="true">web/locale/ltg/viewer.properties</file>
+               <file compressed="true">web/locale/lv/viewer.properties</file>
+               <file compressed="true">web/locale/meh/viewer.properties</file>
+               <file compressed="true">web/locale/mk/viewer.properties</file>
+               <file compressed="true">web/locale/mr/viewer.properties</file>
+               <file compressed="true">web/locale/ms/viewer.properties</file>
                <file compressed="true">web/locale/my/viewer.properties</file>
-               <file compressed="true">web/locale/he/viewer.properties</file>
-               <file compressed="true">web/locale/eu/viewer.properties</file>
-               <file compressed="true">web/locale/bg/viewer.properties</file>
-               <file compressed="true">web/locale/bo/viewer.properties</file>
-               <file compressed="true">web/locale/uz/viewer.properties</file>
+               <file compressed="true">web/locale/nb-NO/viewer.properties</file>
+               <file compressed="true">web/locale/ne-NP/viewer.properties</file>
+               <file compressed="true">web/locale/nl/viewer.properties</file>
+               <file compressed="true">web/locale/nn-NO/viewer.properties</file>
                <file compressed="true">web/locale/oc/viewer.properties</file>
-               <file compressed="true">web/locale/th/viewer.properties</file>
-               <file compressed="true">web/locale/bs/viewer.properties</file>
-               <file compressed="true">web/locale/hye/viewer.properties</file>
+               <file compressed="true">web/locale/pa-IN/viewer.properties</file>
+               <file compressed="true">web/locale/pl/viewer.properties</file>
+               <file compressed="true">web/locale/pt-BR/viewer.properties</file>
+               <file compressed="true">web/locale/pt-PT/viewer.properties</file>
+               <file compressed="true">web/locale/rm/viewer.properties</file>
+               <file compressed="true">web/locale/ro/viewer.properties</file>
+               <file compressed="true">web/locale/ru/viewer.properties</file>
                <file compressed="true">web/locale/scn/viewer.properties</file>
-               <file compressed="true">web/locale/ckb/viewer.properties</file>
+               <file compressed="true">web/locale/sco/viewer.properties</file>
+               <file compressed="true">web/locale/si/viewer.properties</file>
+               <file compressed="true">web/locale/sk/viewer.properties</file>
+               <file compressed="true">web/locale/sl/viewer.properties</file>
+               <file compressed="true">web/locale/son/viewer.properties</file>
+               <file compressed="true">web/locale/sq/viewer.properties</file>
+               <file compressed="true">web/locale/sr/viewer.properties</file>
+               <file compressed="true">web/locale/sv-SE/viewer.properties</file>
                <file compressed="true">web/locale/szl/viewer.properties</file>
-               <file compressed="true">web/cmaps/B5pc-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF16-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISPro-UCS2-HW-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-4.bcmap</file>
-               <file compressed="true">web/cmaps/Add-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/ETen-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Korea1-2.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISPro-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-0.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-1.bcmap</file>
-               <file compressed="true">web/cmaps/ETenms-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-UCS2.bcmap</file>
-               <file compressed="true">web/cmaps/90pv-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/B5pc-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF16-V.bcmap</file>
-               <file compressed="true">web/cmaps/B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/HKgccs-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-Johab-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UCS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-5.bcmap</file>
-               <file compressed="true">web/cmaps/Add-V.bcmap</file>
-               <file compressed="true">web/cmaps/GBT-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/Hankaku.bcmap</file>
-               <file compressed="true">web/cmaps/78-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UCS2-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-UCS2.bcmap</file>
-               <file compressed="true">web/cmaps/EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF8-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSCms-UHC-HW-H.bcmap</file>
-               <file compressed="true">web/cmaps/78ms-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-2.bcmap</file>
-               <file compressed="true">web/cmaps/KSCpc-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-0.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF8-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/HKscs-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-4.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-Johab-V.bcmap</file>
-               <file compressed="true">web/cmaps/Ext-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UCS2-HW-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBTpc-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF8-H.bcmap</file>
-               <file compressed="true">web/cmaps/78-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF8-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBpc-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/HKdlb-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UTF16-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Korea1-1.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-1.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-3.bcmap</file>
-               <file compressed="true">web/cmaps/GBT-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/GBT-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-3.bcmap</file>
-               <file compressed="true">web/cmaps/Hiragana.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UCS2-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UCS2-HW-V.bcmap</file>
-               <file compressed="true">web/cmaps/Add-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF16-V.bcmap</file>
-               <file compressed="true">web/cmaps/78-H.bcmap</file>
-               <file compressed="true">web/cmaps/RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF16-V.bcmap</file>
-               <file compressed="true">web/cmaps/GBT-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-H.bcmap</file>
-               <file compressed="true">web/cmaps/CNS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/GBKp-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/HKm314-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-5.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-6.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/90ms-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/NWP-V.bcmap</file>
-               <file compressed="true">web/cmaps/GB-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBpc-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSCms-UHC-H.bcmap</file>
-               <file compressed="true">web/cmaps/83pv-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/78-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/HKm471-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF16-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF8-V.bcmap</file>
-               <file compressed="true">web/cmaps/CNS1-H.bcmap</file>
-               <file compressed="true">web/cmaps/ETHK-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF16-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISPro-UCS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/Ext-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/GB-V.bcmap</file>
-               <file compressed="true">web/cmaps/GB-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBK-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Korea1-UCS2.bcmap</file>
-               <file compressed="true">web/cmaps/GBKp-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/Add-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniKS-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/78-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/WP-Symbol.bcmap</file>
-               <file compressed="true">web/cmaps/HKdla-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISX0213-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF8-H.bcmap</file>
-               <file compressed="true">web/cmaps/90msp-RKSJ-V.bcmap</file>
-               <file compressed="true">web/cmaps/CNS1-V.bcmap</file>
-               <file compressed="true">web/cmaps/RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBTpc-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/Ext-H.bcmap</file>
-               <file compressed="true">web/cmaps/GBK-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/ETHK-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF16-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISX02132004-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/Ext-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF16-H.bcmap</file>
-               <file compressed="true">web/cmaps/90msp-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/Roman.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-1.bcmap</file>
-               <file compressed="true">web/cmaps/KSCms-UHC-HW-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF16-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-3.bcmap</file>
-               <file compressed="true">web/cmaps/NWP-H.bcmap</file>
-               <file compressed="true">web/cmaps/LICENSE</file>
-               <file compressed="true">web/cmaps/ETen-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/HKgccs-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/CNS-EUC-H.bcmap</file>
-               <file compressed="true">web/cmaps/CNS-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISX0213-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/HKdlb-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSC-V.bcmap</file>
-               <file compressed="true">web/cmaps/HKdla-B5-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS2004-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/GB-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UCS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-2.bcmap</file>
-               <file compressed="true">web/cmaps/78ms-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/HKscs-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/H.bcmap</file>
-               <file compressed="true">web/cmaps/HKm471-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSCpc-EUC-V.bcmap</file>
-               <file compressed="true">web/cmaps/Katakana.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UCS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniJISX02132004-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-GB1-UCS2.bcmap</file>
-               <file compressed="true">web/cmaps/ETenms-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/90ms-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniGB-UTF32-H.bcmap</file>
-               <file compressed="true">web/cmaps/HKm314-B5-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-0.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-2.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-5.bcmap</file>
-               <file compressed="true">web/cmaps/90pv-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/KSCms-UHC-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-CNS1-4.bcmap</file>
-               <file compressed="true">web/cmaps/GBK2K-V.bcmap</file>
-               <file compressed="true">web/cmaps/GBK2K-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UTF32-V.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Japan1-6.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UCS2-H.bcmap</file>
-               <file compressed="true">web/cmaps/78-RKSJ-H.bcmap</file>
-               <file compressed="true">web/cmaps/UniCNS-UCS2-V.bcmap</file>
-               <file compressed="true">web/cmaps/CNS2-H.bcmap</file>
-               <file compressed="true">web/cmaps/Adobe-Korea1-0.bcmap</file>
-               <file compressed="true">web/cmaps/UniJIS-UCS2-H.bcmap</file>
+               <file compressed="true">web/locale/ta/viewer.properties</file>
+               <file compressed="true">web/locale/te/viewer.properties</file>
+               <file compressed="true">web/locale/tg/viewer.properties</file>
+               <file compressed="true">web/locale/th/viewer.properties</file>
+               <file compressed="true">web/locale/tl/viewer.properties</file>
+               <file compressed="true">web/locale/tr/viewer.properties</file>
+               <file compressed="true">web/locale/trs/viewer.properties</file>
+               <file compressed="true">web/locale/uk/viewer.properties</file>
+               <file compressed="true">web/locale/ur/viewer.properties</file>
+               <file compressed="true">web/locale/uz/viewer.properties</file>
+               <file compressed="true">web/locale/vi/viewer.properties</file>
+               <file compressed="true">web/locale/wo/viewer.properties</file>
+               <file compressed="true">web/locale/xh/viewer.properties</file>
+               <file compressed="true">web/locale/zh-CN/viewer.properties</file>
+               <file compressed="true">web/locale/zh-TW/viewer.properties</file>
+               <file compressed="true">web/standard_fonts/FoxitDingbats.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitFixed.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitFixedBold.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitFixedBoldItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitFixedItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSans.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSansBold.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSansBoldItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSansItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSerif.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSerifBold.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSerifBoldItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSerifItalic.pfb</file>
+               <file compressed="true">web/standard_fonts/FoxitSymbol.pfb</file>
+               <file compressed="true">web/standard_fonts/LICENSE_FOXIT</file>
+               <file compressed="true">web/standard_fonts/LICENSE_LIBERATION</file>
+               <file compressed="true">web/standard_fonts/LiberationSans-Bold.ttf</file>
+               <file compressed="true">web/standard_fonts/LiberationSans-BoldItalic.ttf</file>
+               <file compressed="true">web/standard_fonts/LiberationSans-Italic.ttf</file>
+               <file compressed="true">web/standard_fonts/LiberationSans-Regular.ttf</file>
        </gresource>
 </gresources>
diff --git a/third-party/pdfjs/web/debugger.js b/third-party/pdfjs/web/debugger.js
index 500522d84..cdf095440 100644
--- a/third-party/pdfjs/web/debugger.js
+++ b/third-party/pdfjs/web/debugger.js
@@ -12,14 +12,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/* eslint-disable no-var */
 
 "use strict";
 
+// eslint-disable-next-line no-var
 var FontInspector = (function FontInspectorClosure() {
-  var fonts;
-  var active = false;
-  var fontAttribute = "data-font-name";
+  let fonts;
+  let active = false;
+  const fontAttribute = "data-font-name";
   function removeSelection() {
     const divs = document.querySelectorAll(`span[${fontAttribute}]`);
     for (const div of divs) {
@@ -47,10 +47,10 @@ var FontInspector = (function FontInspectorClosure() {
     ) {
       return;
     }
-    var fontName = e.target.dataset.fontName;
-    var selects = document.getElementsByTagName("input");
-    for (var i = 0; i < selects.length; ++i) {
-      var select = selects[i];
+    const fontName = e.target.dataset.fontName;
+    const selects = document.getElementsByTagName("input");
+    for (let i = 0; i < selects.length; ++i) {
+      const select = selects[i];
       if (select.dataset.fontName !== fontName) {
         continue;
       }
@@ -66,8 +66,8 @@ var FontInspector = (function FontInspectorClosure() {
     panel: null,
     manager: null,
     init: function init(pdfjsLib) {
-      var panel = this.panel;
-      var tmp = document.createElement("button");
+      const panel = this.panel;
+      const tmp = document.createElement("button");
       tmp.addEventListener("click", resetSelection);
       tmp.textContent = "Refresh";
       panel.appendChild(tmp);
@@ -95,27 +95,27 @@ var FontInspector = (function FontInspectorClosure() {
     // FontInspector specific functions.
     fontAdded: function fontAdded(fontObj, url) {
       function properties(obj, list) {
-        var moreInfo = document.createElement("table");
-        for (var i = 0; i < list.length; i++) {
-          var tr = document.createElement("tr");
-          var td1 = document.createElement("td");
+        const moreInfo = document.createElement("table");
+        for (let i = 0; i < list.length; i++) {
+          const tr = document.createElement("tr");
+          const td1 = document.createElement("td");
           td1.textContent = list[i];
           tr.appendChild(td1);
-          var td2 = document.createElement("td");
+          const td2 = document.createElement("td");
           td2.textContent = obj[list[i]].toString();
           tr.appendChild(td2);
           moreInfo.appendChild(tr);
         }
         return moreInfo;
       }
-      var moreInfo = properties(fontObj, ["name", "type"]);
+      const moreInfo = properties(fontObj, ["name", "type"]);
       const fontName = fontObj.loadedName;
-      var font = document.createElement("div");
-      var name = document.createElement("span");
+      const font = document.createElement("div");
+      const name = document.createElement("span");
       name.textContent = fontName;
-      var download = document.createElement("a");
+      const download = document.createElement("a");
       if (url) {
-        url = /url\(['"]?([^\)"']+)/.exec(url);
+        url = /url\(['"]?([^)"']+)/.exec(url);
         download.href = url[1];
       } else if (fontObj.data) {
         download.href = URL.createObjectURL(
@@ -123,7 +123,7 @@ var FontInspector = (function FontInspectorClosure() {
         );
       }
       download.textContent = "Download";
-      var logIt = document.createElement("a");
+      const logIt = document.createElement("a");
       logIt.href = "";
       logIt.textContent = "Log";
       logIt.addEventListener("click", function (event) {
@@ -155,15 +155,17 @@ var FontInspector = (function FontInspectorClosure() {
   };
 })();
 
-var opMap;
+let opMap;
 
 // Manages all the page steppers.
+//
+// eslint-disable-next-line no-var
 var StepperManager = (function StepperManagerClosure() {
-  var steppers = [];
-  var stepperDiv = null;
-  var stepperControls = null;
-  var stepperChooser = null;
-  var breakPoints = Object.create(null);
+  let steppers = [];
+  let stepperDiv = null;
+  let stepperControls = null;
+  let stepperChooser = null;
+  let breakPoints = Object.create(null);
   return {
     // Properties/functions needed by PDFBug.
     id: "Stepper",
@@ -171,7 +173,7 @@ var StepperManager = (function StepperManagerClosure() {
     panel: null,
     manager: null,
     init: function init(pdfjsLib) {
-      var self = this;
+      const self = this;
       stepperControls = document.createElement("div");
       stepperChooser = document.createElement("select");
       stepperChooser.addEventListener("change", function (event) {
@@ -186,7 +188,7 @@ var StepperManager = (function StepperManagerClosure() {
       }
 
       opMap = Object.create(null);
-      for (var key in pdfjsLib.OPS) {
+      for (const key in pdfjsLib.OPS) {
         opMap[pdfjsLib.OPS[key]] = key;
       }
     },
@@ -199,17 +201,17 @@ var StepperManager = (function StepperManagerClosure() {
     active: false,
     // Stepper specific functions.
     create: function create(pageIndex) {
-      var debug = document.createElement("div");
+      const debug = document.createElement("div");
       debug.id = "stepper" + pageIndex;
-      debug.setAttribute("hidden", true);
+      debug.hidden = true;
       debug.className = "stepper";
       stepperDiv.appendChild(debug);
-      var b = document.createElement("option");
+      const b = document.createElement("option");
       b.textContent = "Page " + (pageIndex + 1);
       b.value = pageIndex;
       stepperChooser.appendChild(b);
-      var initBreakPoints = breakPoints[pageIndex] || [];
-      var stepper = new Stepper(debug, pageIndex, initBreakPoints);
+      const initBreakPoints = breakPoints[pageIndex] || [];
+      const stepper = new Stepper(debug, pageIndex, initBreakPoints);
       steppers.push(stepper);
       if (steppers.length === 1) {
         this.selectStepper(pageIndex, false);
@@ -217,22 +219,18 @@ var StepperManager = (function StepperManagerClosure() {
       return stepper;
     },
     selectStepper: function selectStepper(pageIndex, selectPanel) {
-      var i;
-      pageIndex = pageIndex | 0;
+      let i;
+      pageIndex |= 0;
       if (selectPanel) {
         this.manager.selectPanel(this);
       }
       for (i = 0; i < steppers.length; ++i) {
-        var stepper = steppers[i];
-        if (stepper.pageIndex === pageIndex) {
-          stepper.panel.removeAttribute("hidden");
-        } else {
-          stepper.panel.setAttribute("hidden", true);
-        }
+        const stepper = steppers[i];
+        stepper.panel.hidden = stepper.pageIndex !== pageIndex;
       }
-      var options = stepperChooser.options;
+      const options = stepperChooser.options;
       for (i = 0; i < options.length; ++i) {
-        var option = options[i];
+        const option = options[i];
         option.selected = (option.value | 0) === pageIndex;
       }
     },
@@ -243,11 +241,11 @@ var StepperManager = (function StepperManagerClosure() {
   };
 })();
 
-// The stepper for each page's IRQueue.
-var Stepper = (function StepperClosure() {
+// The stepper for each page's operatorList.
+const Stepper = (function StepperClosure() {
   // Shorter way to create element and optionally set textContent.
   function c(tag, textContent) {
-    var d = document.createElement(tag);
+    const d = document.createElement(tag);
     if (textContent) {
       d.textContent = textContent;
     }
@@ -256,7 +254,7 @@ var Stepper = (function StepperClosure() {
 
   function simplifyArgs(args) {
     if (typeof args === "string") {
-      var MAX_STRING_LENGTH = 75;
+      const MAX_STRING_LENGTH = 75;
       return args.length <= MAX_STRING_LENGTH
         ? args
         : args.substring(0, MAX_STRING_LENGTH) + "...";
@@ -266,10 +264,9 @@ var Stepper = (function StepperClosure() {
     }
     if ("length" in args) {
       // array
-      var simpleArgs = [],
-        i,
-        ii;
-      var MAX_ITEMS = 10;
+      const MAX_ITEMS = 10,
+        simpleArgs = [];
+      let i, ii;
       for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
         simpleArgs.push(simplifyArgs(args[i]));
       }
@@ -278,31 +275,32 @@ var Stepper = (function StepperClosure() {
       }
       return simpleArgs;
     }
-    var simpleObj = {};
-    for (var key in args) {
+    const simpleObj = {};
+    for (const key in args) {
       simpleObj[key] = simplifyArgs(args[key]);
     }
     return simpleObj;
   }
 
   // eslint-disable-next-line no-shadow
-  function Stepper(panel, pageIndex, initialBreakPoints) {
-    this.panel = panel;
-    this.breakPoint = 0;
-    this.nextBreakPoint = null;
-    this.pageIndex = pageIndex;
-    this.breakPoints = initialBreakPoints;
-    this.currentIdx = -1;
-    this.operatorListIdx = 0;
-  }
-  Stepper.prototype = {
-    init: function init(operatorList) {
-      var panel = this.panel;
-      var content = c("div", "c=continue, s=step");
-      var table = c("table");
+  class Stepper {
+    constructor(panel, pageIndex, initialBreakPoints) {
+      this.panel = panel;
+      this.breakPoint = 0;
+      this.nextBreakPoint = null;
+      this.pageIndex = pageIndex;
+      this.breakPoints = initialBreakPoints;
+      this.currentIdx = -1;
+      this.operatorListIdx = 0;
+    }
+
+    init(operatorList) {
+      const panel = this.panel;
+      const content = c("div", "c=continue, s=step");
+      const table = c("table");
       content.appendChild(table);
       table.cellSpacing = 0;
-      var headerRow = c("tr");
+      const headerRow = c("tr");
       table.appendChild(headerRow);
       headerRow.appendChild(c("th", "Break"));
       headerRow.appendChild(c("th", "Idx"));
@@ -311,12 +309,13 @@ var Stepper = (function StepperClosure() {
       panel.appendChild(content);
       this.table = table;
       this.updateOperatorList(operatorList);
-    },
-    updateOperatorList: function updateOperatorList(operatorList) {
-      var self = this;
+    }
+
+    updateOperatorList(operatorList) {
+      const self = this;
 
       function cboxOnClick() {
-        var x = +this.dataset.idx;
+        const x = +this.dataset.idx;
         if (this.checked) {
           self.breakPoints.push(x);
         } else {
@@ -325,26 +324,26 @@ var Stepper = (function StepperClosure() {
         StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
       }
 
-      var MAX_OPERATORS_COUNT = 15000;
+      const MAX_OPERATORS_COUNT = 15000;
       if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
         return;
       }
 
-      var chunk = document.createDocumentFragment();
-      var operatorsToDisplay = Math.min(
+      const chunk = document.createDocumentFragment();
+      const operatorsToDisplay = Math.min(
         MAX_OPERATORS_COUNT,
         operatorList.fnArray.length
       );
-      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
-        var line = c("tr");
+      for (let i = this.operatorListIdx; i < operatorsToDisplay; i++) {
+        const line = c("tr");
         line.className = "line";
         line.dataset.idx = i;
         chunk.appendChild(line);
-        var checked = this.breakPoints.includes(i);
-        var args = operatorList.argsArray[i] || [];
+        const checked = this.breakPoints.includes(i);
+        const args = operatorList.argsArray[i] || [];
 
-        var breakCell = c("td");
-        var cbox = c("input");
+        const breakCell = c("td");
+        const cbox = c("input");
         cbox.type = "checkbox";
         cbox.className = "points";
         cbox.checked = checked;
@@ -354,81 +353,92 @@ var Stepper = (function StepperClosure() {
         breakCell.appendChild(cbox);
         line.appendChild(breakCell);
         line.appendChild(c("td", i.toString()));
-        var fn = opMap[operatorList.fnArray[i]];
-        var decArgs = args;
+        const fn = opMap[operatorList.fnArray[i]];
+        let decArgs = args;
         if (fn === "showText") {
-          var glyphs = args[0];
-          var newArgs = [];
-          var str = [];
-          for (var j = 0; j < glyphs.length; j++) {
-            var glyph = glyphs[j];
+          const glyphs = args[0];
+          const charCodeRow = c("tr");
+          const fontCharRow = c("tr");
+          const unicodeRow = c("tr");
+          for (let j = 0; j < glyphs.length; j++) {
+            const glyph = glyphs[j];
             if (typeof glyph === "object" && glyph !== null) {
-              str.push(glyph.fontChar);
+              charCodeRow.appendChild(c("td", glyph.originalCharCode));
+              fontCharRow.appendChild(c("td", glyph.fontChar));
+              unicodeRow.appendChild(c("td", glyph.unicode));
             } else {
-              if (str.length > 0) {
-                newArgs.push(str.join(""));
-                str = [];
-              }
-              newArgs.push(glyph); // null or number
+              // null or number
+              const advanceEl = c("td", glyph);
+              advanceEl.classList.add("advance");
+              charCodeRow.appendChild(advanceEl);
+              fontCharRow.appendChild(c("td"));
+              unicodeRow.appendChild(c("td"));
             }
           }
-          if (str.length > 0) {
-            newArgs.push(str.join(""));
-          }
-          decArgs = [newArgs];
+          decArgs = c("td");
+          const table = c("table");
+          table.classList.add("showText");
+          decArgs.appendChild(table);
+          table.appendChild(charCodeRow);
+          table.appendChild(fontCharRow);
+          table.appendChild(unicodeRow);
         }
         line.appendChild(c("td", fn));
-        line.appendChild(c("td", JSON.stringify(simplifyArgs(decArgs))));
+        if (decArgs instanceof HTMLElement) {
+          line.appendChild(decArgs);
+        } else {
+          line.appendChild(c("td", JSON.stringify(simplifyArgs(decArgs))));
+        }
       }
       if (operatorsToDisplay < operatorList.fnArray.length) {
-        line = c("tr");
-        var lastCell = c("td", "...");
+        const lastCell = c("td", "...");
         lastCell.colspan = 4;
         chunk.appendChild(lastCell);
       }
       this.operatorListIdx = operatorList.fnArray.length;
       this.table.appendChild(chunk);
-    },
-    getNextBreakPoint: function getNextBreakPoint() {
+    }
+
+    getNextBreakPoint() {
       this.breakPoints.sort(function (a, b) {
         return a - b;
       });
-      for (var i = 0; i < this.breakPoints.length; i++) {
+      for (let i = 0; i < this.breakPoints.length; i++) {
         if (this.breakPoints[i] > this.currentIdx) {
           return this.breakPoints[i];
         }
       }
       return null;
-    },
-    breakIt: function breakIt(idx, callback) {
+    }
+
+    breakIt(idx, callback) {
       StepperManager.selectStepper(this.pageIndex, true);
-      var self = this;
-      var dom = document;
-      self.currentIdx = idx;
-      var listener = function (e) {
-        switch (e.keyCode) {
+      this.currentIdx = idx;
+
+      const listener = evt => {
+        switch (evt.keyCode) {
           case 83: // step
-            dom.removeEventListener("keydown", listener);
-            self.nextBreakPoint = self.currentIdx + 1;
-            self.goTo(-1);
+            document.removeEventListener("keydown", listener);
+            this.nextBreakPoint = this.currentIdx + 1;
+            this.goTo(-1);
             callback();
             break;
           case 67: // continue
-            dom.removeEventListener("keydown", listener);
-            var breakPoint = self.getNextBreakPoint();
-            self.nextBreakPoint = breakPoint;
-            self.goTo(-1);
+            document.removeEventListener("keydown", listener);
+            this.nextBreakPoint = this.getNextBreakPoint();
+            this.goTo(-1);
             callback();
             break;
         }
       };
-      dom.addEventListener("keydown", listener);
-      self.goTo(idx);
-    },
-    goTo: function goTo(idx) {
-      var allRows = this.panel.getElementsByClassName("line");
-      for (var x = 0, xx = allRows.length; x < xx; ++x) {
-        var row = allRows[x];
+      document.addEventListener("keydown", listener);
+      this.goTo(idx);
+    }
+
+    goTo(idx) {
+      const allRows = this.panel.getElementsByClassName("line");
+      for (let x = 0, xx = allRows.length; x < xx; ++x) {
+        const row = allRows[x];
         if ((row.dataset.idx | 0) === idx) {
           row.style.backgroundColor = "rgb(251,250,207)";
           row.scrollIntoView();
@@ -436,20 +446,21 @@ var Stepper = (function StepperClosure() {
           row.style.backgroundColor = null;
         }
       }
-    },
-  };
+    }
+  }
   return Stepper;
 })();
 
+// eslint-disable-next-line no-var
 var Stats = (function Stats() {
-  var stats = [];
+  let stats = [];
   function clear(node) {
     while (node.hasChildNodes()) {
       node.removeChild(node.lastChild);
     }
   }
   function getStatIndex(pageNumber) {
-    for (var i = 0, ii = stats.length; i < ii; ++i) {
+    for (let i = 0, ii = stats.length; i < ii; ++i) {
       if (stats[i].pageNumber === pageNumber) {
         return i;
       }
@@ -470,18 +481,18 @@ var Stats = (function Stats() {
       if (!stat) {
         return;
       }
-      var statsIndex = getStatIndex(pageNumber);
+      const statsIndex = getStatIndex(pageNumber);
       if (statsIndex !== false) {
         const b = stats[statsIndex];
         this.panel.removeChild(b.div);
         stats.splice(statsIndex, 1);
       }
-      var wrapper = document.createElement("div");
+      const wrapper = document.createElement("div");
       wrapper.className = "stats";
-      var title = document.createElement("div");
+      const title = document.createElement("div");
       title.className = "title";
       title.textContent = "Page: " + pageNumber;
-      var statsDiv = document.createElement("div");
+      const statsDiv = document.createElement("div");
       statsDiv.textContent = stat.toString();
       wrapper.appendChild(title);
       wrapper.appendChild(statsDiv);
@@ -490,7 +501,7 @@ var Stats = (function Stats() {
         return a.pageNumber - b.pageNumber;
       });
       clear(this.panel);
-      for (var i = 0, ii = stats.length; i < ii; ++i) {
+      for (let i = 0, ii = stats.length; i < ii; ++i) {
         this.panel.appendChild(stats[i].div);
       }
     },
@@ -503,20 +514,17 @@ var Stats = (function Stats() {
 
 // Manages all the debugging tools.
 window.PDFBug = (function PDFBugClosure() {
-  var panelWidth = 300;
-  var buttons = [];
-  var activePanel = null;
+  const panelWidth = 300;
+  const buttons = [];
+  let activePanel = null;
 
   return {
     tools: [FontInspector, StepperManager, Stats],
     enable(ids) {
-      var all = false,
-        tools = this.tools;
-      if (ids.length === 1 && ids[0] === "all") {
-        all = true;
-      }
-      for (var i = 0; i < tools.length; ++i) {
-        var tool = tools[i];
+      const all = ids.length === 1 && ids[0] === "all";
+      const tools = this.tools;
+      for (let i = 0; i < tools.length; ++i) {
+        const tool = tools[i];
         if (all || ids.includes(tool.id)) {
           tool.enabled = true;
         }
@@ -524,9 +532,9 @@ window.PDFBug = (function PDFBugClosure() {
       if (!all) {
         // Sort the tools by the order they are enabled.
         tools.sort(function (a, b) {
-          var indexA = ids.indexOf(a.id);
+          let indexA = ids.indexOf(a.id);
           indexA = indexA < 0 ? tools.length : indexA;
-          var indexB = ids.indexOf(b.id);
+          let indexB = ids.indexOf(b.id);
           indexB = indexB < 0 ? tools.length : indexB;
           return indexA - indexB;
         });
@@ -542,14 +550,14 @@ window.PDFBug = (function PDFBugClosure() {
        *    Panel
        *    ...
        */
-      var ui = document.createElement("div");
+      const ui = document.createElement("div");
       ui.id = "PDFBug";
 
-      var controls = document.createElement("div");
+      const controls = document.createElement("div");
       controls.setAttribute("class", "controls");
       ui.appendChild(controls);
 
-      var panels = document.createElement("div");
+      const panels = document.createElement("div");
       panels.setAttribute("class", "panels");
       ui.appendChild(panels);
 
@@ -557,12 +565,12 @@ window.PDFBug = (function PDFBugClosure() {
       container.style.right = panelWidth + "px";
 
       // Initialize all the debugging tools.
-      var tools = this.tools;
-      var self = this;
-      for (var i = 0; i < tools.length; ++i) {
-        var tool = tools[i];
-        var panel = document.createElement("div");
-        var panelButton = document.createElement("button");
+      const tools = this.tools;
+      const self = this;
+      for (let i = 0; i < tools.length; ++i) {
+        const tool = tools[i];
+        const panel = document.createElement("div");
+        const panelButton = document.createElement("button");
         panelButton.textContent = tool.name;
         panelButton.addEventListener(
           "click",
@@ -593,7 +601,7 @@ window.PDFBug = (function PDFBugClosure() {
       this.selectPanel(0);
     },
     cleanup() {
-      for (var i = 0, ii = this.tools.length; i < ii; i++) {
+      for (let i = 0, ii = this.tools.length; i < ii; i++) {
         if (this.tools[i].enabled) {
           this.tools[i].cleanup();
         }
@@ -607,17 +615,12 @@ window.PDFBug = (function PDFBugClosure() {
         return;
       }
       activePanel = index;
-      var tools = this.tools;
-      for (var j = 0; j < tools.length; ++j) {
-        if (j === index) {
-          buttons[j].setAttribute("class", "active");
-          tools[j].active = true;
-          tools[j].panel.removeAttribute("hidden");
-        } else {
-          buttons[j].setAttribute("class", "");
-          tools[j].active = false;
-          tools[j].panel.setAttribute("hidden", "true");
-        }
+      const tools = this.tools;
+      for (let j = 0; j < tools.length; ++j) {
+        const isActive = j === index;
+        buttons[j].classList.toggle("active", isActive);
+        tools[j].active = isActive;
+        tools[j].panel.hidden = !isActive;
       }
     },
   };
diff --git a/third-party/pdfjs/web/images/toolbarButton-currentOutlineItem.svg 
b/third-party/pdfjs/web/images/toolbarButton-currentOutlineItem.svg
new file mode 100644
index 000000000..c1c72b208
--- /dev/null
+++ b/third-party/pdfjs/web/images/toolbarButton-currentOutlineItem.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg"; height="16" width="16"><path d="m14 9h-6c-1.3 0-1.3 2 0 2h6c1.3 0 
1.3-2 0-2zm-5.2-8h-3.8c-1.3 0-1.3 2 0 2h1.7zm-6.8 0c-1 0-1.3 1-0.7 1.7 0.7 0.6 1.7 0.3 1.7-0.7 
0-0.5-0.4-1-1-1zm3 8c-1 0-1.3 1-0.7 1.7 0.6 0.6 1.7 0.2 1.7-0.7 0-0.5-0.4-1-1-1zm0.3-4h-0.3c-1.4 0-1.4 2 0 
2h2.3zm-3.3 0c-0.9 0-1.4 1-0.7 1.7 0.7 0.6 1.7 0.2 1.7-0.7 0-0.6-0.5-1-1-1zm12 8h-9c-1.3 0-1.3 2 0 2h9c1.3 0 
1.3-2 0-2zm-12 0c-1 0-1.3 1-0.7 1.7 0.7 0.6 1.7 0.2 1.7-0.712 0-0.5-0.4-1-1-1z"/><path d="m7.37 4.838 
3.93-3.911v2.138h3.629v3.546h-3.629v2.138l-3.93-3.911"/></svg>
\ No newline at end of file
diff --git a/third-party/pdfjs/web/locale/ach/viewer.properties 
b/third-party/pdfjs/web/locale/ach/viewer.properties
index 46e36fb7e..947228b76 100644
--- a/third-party/pdfjs/web/locale/ach/viewer.properties
+++ b/third-party/pdfjs/web/locale/ach/viewer.properties
@@ -186,6 +186,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Bal
+
 loading_error=Bal otime kun cano PDF.
 invalid_file_error=Pwail me PDF ma pe atir onyo obale woko.
 missing_file_error=Pwail me PDF tye ka rem.
diff --git a/third-party/pdfjs/web/locale/af/viewer.properties 
b/third-party/pdfjs/web/locale/af/viewer.properties
index c7d6c42b4..787c2727c 100644
--- a/third-party/pdfjs/web/locale/af/viewer.properties
+++ b/third-party/pdfjs/web/locale/af/viewer.properties
@@ -163,6 +163,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fout
+
 loading_error='n Fout het voorgekom met die laai van die PDF.
 invalid_file_error=Ongeldige of korrupte PDF-lêer.
 missing_file_error=PDF-lêer is weg.
diff --git a/third-party/pdfjs/web/locale/an/viewer.properties 
b/third-party/pdfjs/web/locale/an/viewer.properties
index 7e3504c77..4086a0a6e 100644
--- a/third-party/pdfjs/web/locale/an/viewer.properties
+++ b/third-party/pdfjs/web/locale/an/viewer.properties
@@ -42,7 +42,7 @@ print_label=Imprentar
 download.title=Descargar
 download_label=Descargar
 bookmark.title=Vista actual (copiar u ubrir en una nueva finestra)
-bookmark_label=Anvista actual
+bookmark_label=Vista actual
 
 # Secondary toolbar and context menu
 tools.title=Ferramientas
@@ -65,6 +65,20 @@ cursor_text_select_tool_label=Ferramienta de selección de texto
 cursor_hand_tool.title=Activar la ferramienta man
 cursor_hand_tool_label=Ferramienta man
 
+scroll_vertical.title=Usar lo desplazamiento vertical
+scroll_vertical_label=Desplazamiento vertical
+scroll_horizontal.title=Usar lo desplazamiento horizontal
+scroll_horizontal_label=Desplazamiento horizontal
+scroll_wrapped.title=Activaar lo desplazamiento contino
+scroll_wrapped_label=Desplazamiento contino
+
+spread_none.title=No unir vistas de pachinas
+spread_none_label=Una pachina nomás
+spread_odd.title=Mostrar vista de pachinas, con as impars a la zurda
+spread_odd_label=Doble pachina, impar a la zurda
+spread_even.title=Amostrar vista de pachinas, con as pars a la zurda
+spread_even_label=Doble pachina, para a la zurda
+
 # Document properties dialog box
 document_properties.title=Propiedatz d'o documento...
 document_properties_label=Propiedatz d'o documento...
@@ -89,6 +103,28 @@ document_properties_creator=Creyador:
 document_properties_producer=Creyador de PDF:
 document_properties_version=Versión de PDF:
 document_properties_page_count=Numero de pachinas:
+document_properties_page_size=Mida de pachina:
+document_properties_page_size_unit_inches=pulgadas
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} x {{height}} {{unit}} {{orientation}}
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} x {{height}} {{unit}} {{name}}, {{orientation}}
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista web rapida:
+document_properties_linearized_yes=Sí
+document_properties_linearized_no=No
 document_properties_close=Zarrar
 
 print_progress_message=Se ye preparando la documentación pa imprentar…
@@ -102,16 +138,23 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Amostrar u amagar a barra lateral
 toggle_sidebar_notification.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos)
+toggle_sidebar_notification2.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas)
 toggle_sidebar_label=Amostrar a barra lateral
 document_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)
 document_outline_label=Esquema d'o documento
 attachments.title=Amostrar os adchuntos
 attachments_label=Adchuntos
+layers.title=Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto)
+layers_label=Capas
 thumbs.title=Amostrar as miniaturas
 thumbs_label=Miniaturas
 findbar.title=Trobar en o documento
 findbar_label=Trobar
 
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=Pachina {{page}}
+
+additional_layers=Capas adicionals
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -129,8 +172,30 @@ find_next.title=Trobar a siguient coincidencia d'a frase
 find_next_label=Siguient
 find_highlight=Resaltar-lo tot
 find_match_case_label=Coincidencia de mayusclas/minusclas
+find_entire_word_label=Parolas completas
 find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo
 find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} coincidencia
+find_match_count[two]={{current}} de {{total}} coincidencias
+find_match_count[few]={{current}} de {{total}} coincidencias
+find_match_count[many]={{current}} de {{total}} coincidencias
+find_match_count[other]={{current}} de {{total}} coincidencias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mas de {{limit}} coincidencias
+find_match_count_limit[one]=Mas de {{limit}} coincidencias
+find_match_count_limit[two]=Mas que {{limit}} coincidencias
+find_match_count_limit[few]=Mas que {{limit}} coincidencias
+find_match_count_limit[many]=Mas que {{limit}} coincidencias
+find_match_count_limit[other]=Mas que {{limit}} coincidencias
 find_not_found=No s'ha trobau a frase
 
 # Error panel labels
@@ -163,11 +228,16 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
 loading_error=S'ha produciu una error en cargar o PDF.
 invalid_file_error=O PDF no ye valido u ye estorbau.
 missing_file_error=No i ha fichero PDF.
 unexpected_response_error=Respuesta a lo servicio inasperada.
 
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}}, {{time}}
+
 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
 # "{{type}}" will be replaced with an annotation type from a list defined in
 # the PDF spec (32000-1:2008 Table 169 – Annotation types).
diff --git a/third-party/pdfjs/web/locale/ar/viewer.properties 
b/third-party/pdfjs/web/locale/ar/viewer.properties
index cffa8bec5..d37c3e12a 100644
--- a/third-party/pdfjs/web/locale/ar/viewer.properties
+++ b/third-party/pdfjs/web/locale/ar/viewer.properties
@@ -47,12 +47,12 @@ bookmark_label=المنظور الحالي
 # Secondary toolbar and context menu
 tools.title=الأدوات
 tools_label=الأدوات
-first_page.title=اذهب إلى الصفحة الأولى
-first_page.label=اذهب إلى الصفحة الأولى
-first_page_label=اذهب إلى الصفحة الأولى
-last_page.title=اذهب إلى الصفحة الأخيرة
-last_page.label=اذهب إلى الصفحة الأخيرة
-last_page_label=اذهب إلى الصفحة الأخيرة
+first_page.title=انتقل إلى الصفحة الأولى
+first_page.label=انتقل إلى الصفحة الأولى
+first_page_label=انتقل إلى الصفحة الأولى
+last_page.title=انتقل إلى الصفحة الأخيرة
+last_page.label=انتقل إلى الصفحة الأخيرة
+last_page_label=انتقل إلى الصفحة الأخيرة
 page_rotate_cw.title=أدر باتجاه عقارب الساعة
 page_rotate_cw.label=أدر باتجاه عقارب الساعة
 page_rotate_cw_label=أدر باتجاه عقارب الساعة
@@ -138,16 +138,25 @@ print_progress_close=ألغِ
 # tooltips)
 toggle_sidebar.title=بدّل ظهور الشريط الجانبي
 toggle_sidebar_notification.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات)
+toggle_sidebar_notification2.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات)
 toggle_sidebar_label=بدّل ظهور الشريط الجانبي
 document_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)
 document_outline_label=مخطط المستند
 attachments.title=اعرض المرفقات
 attachments_label=المُرفقات
+layers.title=اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية)
+layers_label=‏‏الطبقات
 thumbs.title=اعرض مُصغرات
 thumbs_label=مُصغّرات
 findbar.title=ابحث في المستند
 findbar_label=ابحث
 
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=صفحة {{page}}
+
+additional_layers=الطبقات الإضافية
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=صفحة {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -221,6 +230,9 @@ page_scale_percent={{scale}}٪
 
 # Loading indicator messages
 loading_error_indicator=عطل
+
+# Loading indicator messages
+loading=يحمّل…
 loading_error=حدث عطل أثناء تحميل ملف PDF.
 invalid_file_error=ملف PDF تالف أو غير صحيح.
 missing_file_error=ملف PDF غير موجود.
diff --git a/third-party/pdfjs/web/locale/ast/viewer.properties 
b/third-party/pdfjs/web/locale/ast/viewer.properties
index 5f6d5e7c0..6e02489da 100644
--- a/third-party/pdfjs/web/locale/ast/viewer.properties
+++ b/third-party/pdfjs/web/locale/ast/viewer.properties
@@ -28,44 +28,51 @@ of_pages=de {{pagesCount}}
 # respectively a number representing the total number of pages in the document.
 page_of_pages=({{pageNumber}} de {{pagesCount}})
 
-zoom_out.title=Reducir
-zoom_out_label=Reducir
-zoom_in.title=Aumentar
-zoom_in_label=Aumentar
-zoom.title=Tamañu
-open_file.title=Abrir ficheru
+zoom_out.title=Alloñar
+zoom_out_label=Alloña
+zoom_in.title=Averar
+zoom_in_label=Avera
+zoom.title=Zoom
+presentation_mode.title=Cambiar al mou de presentación
+presentation_mode_label=Mou de presentación
 open_file_label=Abrir
 print.title=Imprentar
 print_label=Imprentar
-download.title=Descargar
-download_label=Descargar
-bookmark.title=Vista actual (copiar o abrir nuna nueva ventana)
+download.title=Baxar
+download_label=Baxar
 bookmark_label=Vista actual
 
 # Secondary toolbar and context menu
 tools.title=Ferramientes
 tools_label=Ferramientes
-first_page.title=Dir a la primer páxina
-first_page.label=Dir a la primer páxina
 first_page_label=Dir a la primer páxina
-last_page.title=Dir a la postrer páxina
-last_page.label=Dir a la cabera páxina
-last_page_label=Dir a la postrer páxina
-page_rotate_cw.title=Xirar en sen horariu
-page_rotate_cw_label=Xirar en sen horariu
-page_rotate_ccw.title=Xirar en sen antihorariu
-page_rotate_ccw_label=Xirar en sen antihorariu
-
-
+last_page_label=Dir a la última páxina
+page_rotate_cw.title=Voltia a la derecha
+page_rotate_cw_label=Voltiar a la derecha
+page_rotate_ccw.title=Voltia a la esquierda
+page_rotate_ccw_label=Voltiar a la esquierda
+
+cursor_text_select_tool.title=Activa la ferramienta d'esbilla de testu
+cursor_text_select_tool_label=Ferramienta d'esbilla de testu
+cursor_hand_tool.title=Activa la ferramienta de mano
+cursor_hand_tool_label=Ferramienta de mano
+
+scroll_vertical.title=Usa'l desplazamientu vertical
 scroll_vertical_label=Desplazamientu vertical
+scroll_horizontal.title=Usa'l desplazamientu horizontal
 scroll_horizontal_label=Desplazamientu horizontal
+scroll_wrapped.title=Usa'l desplazamientu continuu
+scroll_wrapped_label=Desplazamientu continuu
 
+spread_none_label=Fueyes individuales
+spread_odd_label=Fueyes pares
+spread_even_label=Fueyes impares
 
 # Document properties dialog box
 document_properties.title=Propiedaes del documentu…
 document_properties_label=Propiedaes del documentu…
-document_properties_file_name=Nome de ficheru:
-document_properties_file_size=Tamañu de ficheru:
+document_properties_file_name=Nome del ficheru:
+document_properties_file_size=Tamañu del ficheru:
 # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
 # will be replaced by the PDF file size in kilobytes, respectively in bytes.
 document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
@@ -73,20 +80,20 @@ document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
 # will be replaced by the PDF file size in megabytes, respectively in bytes.
 document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
 document_properties_title=Títulu:
-document_properties_author=Autor:
-document_properties_subject=Asuntu:
 document_properties_keywords=Pallabres clave:
 document_properties_creation_date=Data de creación:
 document_properties_modification_date=Data de modificación:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
 # will be replaced by the creation/modification date, and time, of the PDF file.
 document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creador:
-document_properties_producer=Productor PDF:
-document_properties_version=Versión PDF:
+document_properties_producer=Productor del PDF:
+document_properties_version=Versión del PDF:
 document_properties_page_count=Númberu de páxines:
+document_properties_page_size=Tamañu de páxina:
 document_properties_page_size_unit_inches=in
 document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
 document_properties_page_size_name_a3=A3
 document_properties_page_size_name_a4=A4
 # LOCALIZATION NOTE (document_properties_page_size_dimension_string):
@@ -99,11 +106,11 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}
 document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
 # LOCALIZATION NOTE (document_properties_linearized): The linearization status of
 # the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista web rápida:
 document_properties_linearized_yes=Sí
 document_properties_linearized_no=Non
 document_properties_close=Zarrar
 
-print_progress_message=Tresnando documentu pa imprentar…
 # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
 # a numerical per cent value.
 print_progress_percent={{progress}}%
@@ -112,54 +119,59 @@ print_progress_close=Encaboxar
 # Tooltips and alt text for side panel toolbar buttons
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
-toggle_sidebar.title=Camudar barra llateral
-toggle_sidebar_label=Camudar barra llateral
-document_outline.title=Amosar esquema del documentu (duble clic pa espander/contrayer tolos elementos)
-document_outline_label=Esquema del documentu
-attachments.title=Amosar axuntos
+toggle_sidebar.title=Alternar la barra llateral
+attachments.title=Amosar los axuntos
 attachments_label=Axuntos
-thumbs.title=Amosar miniatures
+layers_label=Capes
+thumbs.title=Amosar les miniatures
 thumbs_label=Miniatures
-findbar.title=Guetar nel documentu
-findbar_label=Guetar
+findbar_label=Atopar
+
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=Páxina {{page}}
 
+additional_layers=Capes adicionales
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Páxina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
 thumb_page_title=Páxina {{page}}
 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
 # number.
-thumb_page_canvas=Miniatura de la páxina {{page}}
 
 # Find panel button title and messages
-find_input.title=Guetar
-find_input.placeholder=Guetar nel documentu…
-find_previous.title=Alcontrar l'anterior apaición de la fras
 find_previous_label=Anterior
-find_next.title=Alcontrar la siguiente apaición d'esta fras
 find_next_label=Siguiente
-find_highlight=Remarcar toos
-find_match_case_label=Coincidencia de mayús./minús.
-find_entire_word_label=Pallabres enteres
-find_reached_top=Algamóse'l principiu del documentu, siguir dende'l final
-find_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu
+find_entire_word_label=Pallabres completes
+find_reached_top=Algamóse'l comienzu de la páxina, síguese dende abaxo
+find_reached_bottom=Algamóse la fin del documentu, síguese dende arriba
 # LOCALIZATION NOTE (find_match_count): The supported plural forms are
 # [one|two|few|many|other], with [other] as the default value.
 # "{{current}}" and "{{total}}" will be replaced by a number representing the
 # index of the currently active find result, respectively a number representing
 # the total number of matches in the document.
+find_match_count[one]={{current}} de {{total}} coincidencia
+find_match_count[two]={{current}} de {{total}} coincidencies
+find_match_count[few]={{current}} de {{total}} coincidencies
+find_match_count[many]={{current}} de {{total}} coincidencies
+find_match_count[other]={{current}} de {{total}} coincidencies
 # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
 # [zero|one|two|few|many|other], with [other] as the default value.
 # "{{limit}}" will be replaced by a numerical value.
-find_not_found=Frase non atopada
+find_match_count_limit[zero]=Más de {{limit}} coincidencies
+find_match_count_limit[one]=Más de {{limit}} coincidencia
+find_match_count_limit[two]=Más de {{limit}} coincidencies
+find_match_count_limit[few]=Más de {{limit}} coincidencies
+find_match_count_limit[many]=Más de {{limit}} coincidencies
+find_match_count_limit[other]=Más de {{limit}} coincidencies
 
 # Error panel labels
 error_more_info=Más información
 error_less_info=Menos información
-error_close=Zarrar
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
 # replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
+error_version_info=PDF.js v{{version}} (compilación: {{build}})
 # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
 # english string describing the error.
 error_message=Mensaxe: {{message}}
@@ -170,37 +182,32 @@ error_stack=Pila: {{stack}}
 error_file=Ficheru: {{file}}
 # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
 error_line=Llinia: {{line}}
-rendering_error=Hebo un fallu al renderizar la páxina.
 
 # Predefined zoom values
-page_scale_width=Anchor de la páxina
-page_scale_fit=Axuste de la páxina
-page_scale_auto=Tamañu automáticu
-page_scale_actual=Tamañu actual
+page_scale_auto=Zoom automáticu
+page_scale_actual=Tamañu real
 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
 # numerical scale value.
 page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fallu
-loading_error=Hebo un fallu al cargar el PDF.
-invalid_file_error=Ficheru PDF inválidu o corruptu.
-missing_file_error=Nun hai ficheru PDF.
-unexpected_response_error=Rempuesta inesperada del sirvidor.
+
+# Loading indicator messages
+loading=Cargando…
+loading_error=Asocedió un fallu mentanto se cargaba'l PDF.
 
 # LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
 # replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}}, {{time}}
 
 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
 # "{{type}}" will be replaced with an annotation type from a list defined in
 # the PDF spec (32000-1:2008 Table 169 – Annotation types).
 # Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotación {{type}}]
-password_label=Introduz la contraseña p'abrir esti ficheru PDF
-password_invalid=Contraseña non válida. Vuelvi a intentalo.
-password_ok=Aceutar
+password_ok=Aceptar
 password_cancel=Encaboxar
 
-printing_not_supported=Alvertencia: La imprentación entá nun ta sofitada dafechu nesti restolador.
-printing_not_ready=Avisu: Esti PDF nun se cargó completamente pa poder imprentase.
-web_fonts_disabled=Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
+
diff --git a/third-party/pdfjs/web/locale/az/viewer.properties 
b/third-party/pdfjs/web/locale/az/viewer.properties
index 8f61d9641..667dc9fbd 100644
--- a/third-party/pdfjs/web/locale/az/viewer.properties
+++ b/third-party/pdfjs/web/locale/az/viewer.properties
@@ -39,8 +39,8 @@ open_file.title=Fayl Aç
 open_file_label=Aç
 print.title=Yazdır
 print_label=Yazdır
-download.title=Yüklə
-download_label=Yüklə
+download.title=Endir
+download_label=Endir
 bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)
 bookmark_label=Hazırkı görünüş
 
@@ -138,11 +138,14 @@ print_progress_close=Ləğv et
 # tooltips)
 toggle_sidebar.title=Yan Paneli Aç/Bağla
 toggle_sidebar_notification.title=Yan paneli çevir (sənəddə icmal/bağlama var)
+toggle_sidebar_notification2.title=Yan paneli çevir (sənəddə icmal/bağlamalar/laylar mövcuddur)
 toggle_sidebar_label=Yan Paneli Aç/Bağla
 document_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin)
 document_outline_label=Sənəd strukturu
 attachments.title=Bağlamaları göstər
 attachments_label=Bağlamalar
+layers.title=Layları göstər (bütün layları ilkin halına sıfırlamaq üçün iki dəfə klikləyin)
+layers_label=Laylar
 thumbs.title=Kiçik şəkilləri göstər
 thumbs_label=Kiçik şəkillər
 findbar.title=Sənəddə Tap
@@ -150,6 +153,8 @@ findbar_label=Tap
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Səhifə {{page}}
+
+additional_layers=Əlavə laylar
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +228,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Səhv
+
 loading_error=PDF yüklenərkən bir səhv yarandı.
 invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.
 missing_file_error=PDF fayl yoxdur.
diff --git a/third-party/pdfjs/web/locale/be/viewer.properties 
b/third-party/pdfjs/web/locale/be/viewer.properties
index 6ac719288..8728b93b5 100644
--- a/third-party/pdfjs/web/locale/be/viewer.properties
+++ b/third-party/pdfjs/web/locale/be/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Скасаваць
 # tooltips)
 toggle_sidebar.title=Паказаць/схаваць бакавую панэль
 toggle_sidebar_notification.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні)
+toggle_sidebar_notification2.title=Паказаць/схаваць бакавую панэль (дакумент мае змест/укладанні/пласты)
 toggle_sidebar_label=Паказаць/схаваць бакавую панэль
 document_outline.title=Паказаць структуру дакумента (двайная пстрычка, каб разгарнуць /згарнуць усе элементы)
 document_outline_label=Структура дакумента
 attachments.title=Паказаць далучэнні
 attachments_label=Далучэнні
+layers.title=Паказаць пласты (двойчы пстрыкніце, каб скінуць усе пласты да прадвызначанага стану)
+layers_label=Пласты
 thumbs.title=Паказ мініяцюр
 thumbs_label=Мініяцюры
+current_outline_item.title=Знайсці бягучы элемент структуры
+current_outline_item_label=Бягучы элемент структуры
 findbar.title=Пошук у дакуменце
 findbar_label=Знайсці
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Старонка {{page}}
+
+additional_layers=Дадатковыя пласты
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Старонка {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Памылка
+
+# Loading indicator messages
+loading=Чытаецца…
 loading_error=Здарылася памылка падчас загрузкі PDF.
 invalid_file_error=Няспраўны або пашкоджаны файл PDF.
 missing_file_error=Адсутны файл PDF.
diff --git a/third-party/pdfjs/web/locale/bg/viewer.properties 
b/third-party/pdfjs/web/locale/bg/viewer.properties
index b93e3d1e4..6981eac67 100644
--- a/third-party/pdfjs/web/locale/bg/viewer.properties
+++ b/third-party/pdfjs/web/locale/bg/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Грешка
+
 loading_error=Получи се грешка при зареждане на PDF-а.
 invalid_file_error=Невалиден или повреден PDF файл.
 missing_file_error=Липсващ PDF файл.
diff --git a/third-party/pdfjs/web/locale/bn/viewer.properties 
b/third-party/pdfjs/web/locale/bn/viewer.properties
index c106df10c..ffc5465fc 100644
--- a/third-party/pdfjs/web/locale/bn/viewer.properties
+++ b/third-party/pdfjs/web/locale/bn/viewer.properties
@@ -148,6 +148,7 @@ findbar_label=খুঁজুন
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=পাতা {{page}}
+
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -221,6 +222,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=ত্রুটি
+
 loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।
 invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।
 missing_file_error=নিখোঁজ PDF ফাইল।
diff --git a/third-party/pdfjs/web/locale/bo/viewer.properties 
b/third-party/pdfjs/web/locale/bo/viewer.properties
index 3ffa84819..981addc28 100644
--- a/third-party/pdfjs/web/locale/bo/viewer.properties
+++ b/third-party/pdfjs/web/locale/bo/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
 loading_error=An error occurred while loading the PDF.
 invalid_file_error=Invalid or corrupted PDF file.
 missing_file_error=Missing PDF file.
diff --git a/third-party/pdfjs/web/locale/br/viewer.properties 
b/third-party/pdfjs/web/locale/br/viewer.properties
index 9add9a432..043931a72 100644
--- a/third-party/pdfjs/web/locale/br/viewer.properties
+++ b/third-party/pdfjs/web/locale/br/viewer.properties
@@ -82,27 +82,27 @@ spread_even_label=Pajennoù par
 # Document properties dialog box
 document_properties.title=Perzhioù an teul…
 document_properties_label=Perzhioù an teul…
-document_properties_file_name=Anv restr :
-document_properties_file_size=Ment ar restr :
+document_properties_file_name=Anv restr:
+document_properties_file_size=Ment ar restr:
 # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
 # will be replaced by the PDF file size in kilobytes, respectively in bytes.
 document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)
 # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
 # will be replaced by the PDF file size in megabytes, respectively in bytes.
 document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)
-document_properties_title=Titl :
-document_properties_author=Aozer :
-document_properties_subject=Danvez :
-document_properties_keywords=Gerioù-alc'hwez :
-document_properties_creation_date=Deiziad krouiñ :
-document_properties_modification_date=Deiziad kemmañ :
+document_properties_title=Titl:
+document_properties_author=Aozer:
+document_properties_subject=Danvez:
+document_properties_keywords=Gerioù-alc'hwez:
+document_properties_creation_date=Deiziad krouiñ:
+document_properties_modification_date=Deiziad kemmañ:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
 # will be replaced by the creation/modification date, and time, of the PDF file.
 document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Krouer :
-document_properties_producer=Kenderc'her PDF :
-document_properties_version=Handelv PDF :
-document_properties_page_count=Niver a bajennoù :
+document_properties_creator=Krouer:
+document_properties_producer=Kenderc'her PDF:
+document_properties_version=Handelv PDF:
+document_properties_page_count=Niver a bajennoù:
 document_properties_page_size=Ment ar bajenn:
 document_properties_page_size_unit_inches=in
 document_properties_page_size_unit_millimeters=mm
@@ -138,11 +138,14 @@ print_progress_close=Nullañ
 # tooltips)
 toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez
 toggle_sidebar_notification.title=Trec'haoliñ ar verrenn-gostez (ur steuñv pe stagadennoù a zo en teul)
+toggle_sidebar_notification2.title=Trec'haoliñ ar varrenn-gostez (ur steuñv pe stagadennoù a zo en teul)
 toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez
 document_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù)
 document_outline_label=Sinedoù an teuliad
 attachments.title=Diskouez ar c'henstagadurioù
 attachments_label=Kenstagadurioù
+layers.title=Diskouez ar gwiskadoù (daou-glikañ evit adderaouekaat an holl gwiskadoù d'o stad dre ziouer)
+layers_label=Gwiskadoù
 thumbs.title=Diskouez ar melvennoù
 thumbs_label=Melvennoù
 findbar.title=Klask e-barzh an teuliad
@@ -150,6 +153,10 @@ findbar_label=Klask
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pajenn {{page}}
+
+additional_layers=Gwiskadoù ouzhpenn
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pajenn {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -199,17 +206,17 @@ error_less_info=Nebeutoc'h a ditouroù
 error_close=Serriñ
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
 # replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})
+error_version_info=PDF.js handelv {{version}} (kempunadur: {{build}})
 # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
 # english string describing the error.
-error_message=Kemennadenn : {{message}}
+error_message=Kemennadenn: {{message}}
 # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
 # trace.
-error_stack=Torn : {{stack}}
+error_stack=Torn: {{stack}}
 # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Restr : {{file}}
+error_file=Restr: {{file}}
 # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linenn : {{line}}
+error_line=Linenn: {{line}}
 rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.
 
 # Predefined zoom values
@@ -223,6 +230,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fazi
+
+# Loading indicator messages
+loading=O kargañ…
 loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.
 invalid_file_error=Restr PDF didalvoudek pe kontronet.
 missing_file_error=Restr PDF o vankout.
@@ -242,6 +252,6 @@ password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.
 password_ok=Mat eo
 password_cancel=Nullañ
 
-printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.
-printing_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.
-web_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.
+printing_not_supported=Kemenn: N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.
+printing_not_ready=Kemenn: N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.
+web_fonts_disabled=Diweredekaet eo an nodrezhoù web: n'haller ket arverañ an nodrezhoù PDF enframmet.
diff --git a/third-party/pdfjs/web/locale/brx/viewer.properties 
b/third-party/pdfjs/web/locale/brx/viewer.properties
index cd3656380..6af751aa0 100644
--- a/third-party/pdfjs/web/locale/brx/viewer.properties
+++ b/third-party/pdfjs/web/locale/brx/viewer.properties
@@ -186,6 +186,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=गोरोन्थि
+
 loading_error=PDF ल'ड खालामनाय समाव मोनसे गोरोन्थि जाबाय।
 invalid_file_error=बाहायजायै एबा गाज्रि जानाय PDF फाइल
 missing_file_error=गोमानाय PDF फाइल
diff --git a/third-party/pdfjs/web/locale/bs/viewer.properties 
b/third-party/pdfjs/web/locale/bs/viewer.properties
index e5346cb0c..eb4ee3ce9 100644
--- a/third-party/pdfjs/web/locale/bs/viewer.properties
+++ b/third-party/pdfjs/web/locale/bs/viewer.properties
@@ -180,6 +180,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Greška
+
 loading_error=Došlo je do greške prilikom učitavanja PDF-a.
 invalid_file_error=Neispravan ili oštećen PDF fajl.
 missing_file_error=Nedostaje PDF fajl.
diff --git a/third-party/pdfjs/web/locale/ca/viewer.properties 
b/third-party/pdfjs/web/locale/ca/viewer.properties
index ac6fb779f..3b3189ef7 100644
--- a/third-party/pdfjs/web/locale/ca/viewer.properties
+++ b/third-party/pdfjs/web/locale/ca/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancel·la
 # tooltips)
 toggle_sidebar.title=Mostra/amaga la barra lateral
 toggle_sidebar_notification.title=Mostra/amaga la barra lateral (el document conté un esquema o adjuncions)
+toggle_sidebar_notification2.title=Mostra/amaga la barra lateral (el document conté un esquema, adjuncions o 
capes)
 toggle_sidebar_label=Mostra/amaga la barra lateral
 document_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)
-document_outline_label=Contorn del document
+document_outline_label=Esquema del document
 attachments.title=Mostra les adjuncions
 attachments_label=Adjuncions
+layers.title=Mostra les capes (doble clic per restablir totes les capes al seu estat per defecte)
+layers_label=Capes
 thumbs.title=Mostra les miniatures
 thumbs_label=Miniatures
+current_outline_item.title=Cerca l'element d'esquema actual
+current_outline_item_label=Element d'esquema actual
 findbar.title=Cerca al document
 findbar_label=Cerca
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pàgina {{page}}
+
+additional_layers=Capes addicionals
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pàgina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -213,7 +222,7 @@ error_line=Línia: {{line}}
 rendering_error=S'ha produït un error mentre es renderitzava la pàgina.
 
 # Predefined zoom values
-page_scale_width=Amplària de la pàgina
+page_scale_width=Amplada de la pàgina
 page_scale_fit=Ajusta la pàgina
 page_scale_auto=Zoom automàtic
 page_scale_actual=Mida real
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=S'està carregant…
 loading_error=S'ha produït un error en carregar el PDF.
 invalid_file_error=El fitxer PDF no és vàlid o està malmès.
 missing_file_error=Falta el fitxer PDF.
@@ -245,3 +257,5 @@ password_cancel=Cancel·la
 printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.
 printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.
 web_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra 
incrustats al PDF.
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
diff --git a/third-party/pdfjs/web/locale/cak/viewer.properties 
b/third-party/pdfjs/web/locale/cak/viewer.properties
index d4eae51a8..764ccf81f 100644
--- a/third-party/pdfjs/web/locale/cak/viewer.properties
+++ b/third-party/pdfjs/web/locale/cak/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Tiq'at
 # tooltips)
 toggle_sidebar.title=Tijal ri ajxikin kajtz'ik
 toggle_sidebar_notification.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqoj taq 
yakb'äl)
+toggle_sidebar_notification2.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqo/kuchuj)
 toggle_sidebar_label=Tijal ri ajxikin kajtz'ik
 document_outline.title=Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utinirisäx ronojel 
ruch'akulal)
 document_outline_label=Ruch'akulal wuj
 attachments.title=Kek'ut pe ri taq taqoj
 attachments_label=Taq taqoj
+layers.title=Kek'ut taq Kuchuj (ka'i'-pitz' richin yetzolïx ronojel ri taq kuchuj e k'o wi)
+layers_label=Taq kuchuj
 thumbs.title=Kek'ut pe taq ch'utiq
 thumbs_label=Koköj
+current_outline_item.title=Kekanöx  Taq Ch'akulal Kik'wan Chib'äl
+current_outline_item_label=Taq Ch'akulal Kik'wan Chib'äl
 findbar.title=Tikanöx chupam ri wuj
 findbar_label=Tikanöx
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Ruxaq {{page}}
+
+additional_layers=Tz'aqat ta Kuchuj
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Ruxaq {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Sachoj
+
+# Loading indicator messages
+loading=Nisamäj…
 loading_error=\u0020Xk'ulwachitäj jun sach'oj toq xnuk'ux ri PDF .
 invalid_file_error=Man oke ta o yujtajinäq ri PDF yakb'äl.
 missing_file_error=Man xilitäj ta ri PDF yakb'äl.
diff --git a/third-party/pdfjs/web/locale/ckb/viewer.properties 
b/third-party/pdfjs/web/locale/ckb/viewer.properties
index d1bed431b..7be9dd5a2 100644
--- a/third-party/pdfjs/web/locale/ckb/viewer.properties
+++ b/third-party/pdfjs/web/locale/ckb/viewer.properties
@@ -13,6 +13,8 @@
 # limitations under the License.
 
 # Main toolbar buttons (tooltips and alt text for images)
+previous.title=پەڕەی پێشوو
+previous_label=پێشوو
 next.title=پەڕەی دوواتر
 next_label=دوواتر
 
@@ -20,92 +22,222 @@ next_label=دوواتر
 page.title=پەرە
 # LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
 # representing the total number of pages in the document.
+of_pages=لە {{pagesCount}}
 # LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
 # will be replaced by a number representing the currently visible page,
 # respectively a number representing the total number of pages in the document.
-
+page_of_pages=({{pageNumber}} لە {{pagesCount}})
+
+zoom_out.title=ڕۆچوونی
+zoom_out_label=ڕۆچوونی
+zoom_in.title=هێنانەپێش
+zoom_in_label=هێنانەپێش
+zoom.title=زووم
+presentation_mode.title=گۆڕین بۆ دۆخی پێشکەشکردن
+presentation_mode_label=دۆخی پێشکەشکردن
 open_file.title=پەڕگە بکەرەوە
 open_file_label=کردنەوە
 print.title=چاپکردن
+print_label=چاپکردن
 download.title=داگرتن
+download_label=داگرتن
+bookmark.title=پێشبینینی ئێستا(لەبەریبگرەوە یان پەنجەرەیەکی نوێ بکەرەوە)
+bookmark_label=پیشبینینی ئێستا
 
 # Secondary toolbar and context menu
 tools.title=ئامرازەکان
+tools_label=ئامرازەکان
 first_page.title=برۆ بۆ یەکەم پەڕە
-
-
+first_page.label=بڕۆ بۆ یەکەم پەڕە
+first_page_label=بڕۆ بۆ یەکەم پەڕە
+last_page.title=بڕۆ بۆ کۆتا پەڕە
+last_page.label=بڕۆ بۆ کۆتا پەڕە
+last_page_label=بڕۆ بۆ کۆتا پەڕە
+page_rotate_cw.title=ئاڕاستەی میلی کاتژمێر
+page_rotate_cw.label=ئاڕاستەی میلی کاتژمێر
+page_rotate_cw_label=ئاڕاستەی میلی کاتژمێر
+page_rotate_ccw.title=پێچەوانەی میلی کاتژمێر
+page_rotate_ccw.label=پێچەوانەی میلی کاتژمێر
+page_rotate_ccw_label=پێچەوانەی میلی کاتژمێر
+
+cursor_text_select_tool.title=توڵامرازی نیشانکەری دەق چالاک بکە
+cursor_text_select_tool_label=توڵامرازی نیشانکەری دەق
+cursor_hand_tool.title=توڵامرازی دەستی چالاک بکە
+cursor_hand_tool_label=توڵامرازی دەستی
+
+scroll_vertical.title=ناردنی ئەستوونی بەکاربێنە
+scroll_vertical_label=ناردنی ئەستوونی
+scroll_horizontal.title=ناردنی ئاسۆیی بەکاربێنە
+scroll_horizontal_label=ناردنی ئاسۆیی 
+scroll_wrapped.title=ناردنی لوولکراو بەکاربێنە
+scroll_wrapped_label=ناردنی لوولکراو 
 
 
 # Document properties dialog box
+document_properties.title=تایبەتمەندییەکانی بەڵگەنامە...
+document_properties_label=تایبەتمەندییەکانی بەڵگەنامە...
 document_properties_file_name=ناوی پەڕگە:
 document_properties_file_size=قەبارەی پەڕگە:
 # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
 # will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} کب ({{size_b}} بایت)
 # LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
 # will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} مب ({{size_b}} بایت)
 document_properties_title=سەردێڕ:
 document_properties_author=نووسەر
+document_properties_subject=بابەت:
 document_properties_keywords=کلیلەوشە:
+document_properties_creation_date=بەرواری درووستکردن:
+document_properties_modification_date=بەرواری دەستکاریکردن:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
 # will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=درووستکەر:
+document_properties_producer=بەرهەمهێنەری PDF:
+document_properties_version=وەشانی PDF:
+document_properties_page_count=ژمارەی پەرەکان:
+document_properties_page_size=قەبارەی پەڕە:
+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=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=نامە
+document_properties_page_size_name_legal=یاسایی
 # LOCALIZATION NOTE (document_properties_page_size_dimension_string):
 # "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
 # the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})
 # LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
 # "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
 # the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
 # LOCALIZATION NOTE (document_properties_linearized): The linearization status of
 # the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=پیشاندانی وێبی خێرا:
+document_properties_linearized_yes=بەڵێ
+document_properties_linearized_no=نەخێر
 document_properties_close=داخستن
 
+print_progress_message=بەڵگەنامە ئامادەدەکرێت بۆ چاپکردن...
 # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
 # a numerical per cent value.
+print_progress_percent={{progress}}%
 print_progress_close=پاشگەزبوونەوە
 
 # Tooltips and alt text for side panel toolbar buttons
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
+toggle_sidebar.title=لاتەنیشت پیشاندان/شاردنەوە
+toggle_sidebar_label=لاتەنیشت پیشاندان/شاردنەوە
+document_outline_label=سنووری چوارچێوە
+attachments.title=پاشکۆکان پیشان بدە
+attachments_label=پاشکۆکان
+layers_label=چینەکان
+thumbs.title=وێنۆچکە پیشان بدە
+thumbs_label=وێنۆچکە
+findbar.title=لە بەڵگەنامە بگەرێ
 findbar_label=دۆزینەوە
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=پەڕەی {{page}}
+
+additional_layers=چینی زیاتر
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
+thumb_page_title=پەڕەی {{page}}
 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
 # number.
+thumb_page_canvas=وێنۆچکەی پەڕەی {{page}}
 
 # Find panel button title and messages
 find_input.title=دۆزینەوە
+find_input.placeholder=لە بەڵگەنامە بگەرێ...
+find_previous.title=هەبوونی پێشوو بدۆزرەوە لە ڕستەکەدا
+find_previous_label=پێشوو
+find_next.title=هەبوونی داهاتوو بدۆزەرەوە لە ڕستەکەدا
+find_next_label=دوواتر
+find_highlight=هەمووی نیشانە بکە
+find_match_case_label=دۆخی لەیەکچوون
+find_entire_word_label=هەموو وشەکان
+find_reached_top=گەشتیتە سەرەوەی بەڵگەنامە، لە خوارەوە دەستت پێکرد
+find_reached_bottom=گەشتیتە کۆتایی بەڵگەنامە. لەسەرەوە دەستت پێکرد
 # LOCALIZATION NOTE (find_match_count): The supported plural forms are
 # [one|two|few|many|other], with [other] as the default value.
 # "{{current}}" and "{{total}}" will be replaced by a number representing the
 # index of the currently active find result, respectively a number representing
 # the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} لە کۆی {{total}} لەیەکچوو
+find_match_count[two]={{current}} لە کۆی {{total}} لەیەکچوو
+find_match_count[few]={{current}} لە کۆی {{total}} لەیەکچوو
+find_match_count[many]={{current}} لە کۆی {{total}} لەیەکچوو
+find_match_count[other]={{current}} لە کۆی {{total}} لەیەکچوو
 # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
 # [zero|one|two|few|many|other], with [other] as the default value.
 # "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=زیاتر لە {{limit}} لەیەکچوو
+find_match_count_limit[one]=زیاتر لە {{limit}} لەیەکچوو
+find_match_count_limit[two]=زیاتر لە {{limit}} لەیەکچوو
+find_match_count_limit[few]=زیاتر لە {{limit}} لەیەکچوو
+find_match_count_limit[many]=زیاتر لە {{limit}} لەیەکچوو
+find_match_count_limit[other]=زیاتر لە {{limit}} لەیەکچوو
+find_not_found=نووسین نەدۆزرایەوە
 
 # Error panel labels
+error_more_info=زانیاری زیاتر
+error_less_info=زانیاری کەمتر
+error_close=داخستن
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
 # replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
 # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
 # english string describing the error.
+error_message=پەیام: {{message}}
 # LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
 # trace.
+error_stack=لەسەریەک: {{stack}}
 # LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=پەڕگە: {{file}}
 # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=هێڵ: {{line}}
+rendering_error=هەڵەیەک ڕوویدا لە کاتی پوختەکردنی (ڕێندەر) پەڕە.
 
 # Predefined zoom values
+page_scale_width=پانی پەڕە
+page_scale_fit=پڕبوونی پەڕە
+page_scale_auto=زوومی خۆکار
+page_scale_actual=قەبارەی ڕاستی
 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
 # numerical scale value.
+page_scale_percent={{scale}}%
 
 # Loading indicator messages
+loading_error_indicator=هەڵە
+
+loading_error=هەڵەیەک ڕوویدا لە کاتی بارکردنی  PDF.
+invalid_file_error=پەڕگەی pdf تێکچووە یان نەگونجاوە.
+missing_file_error=پەڕگەی pdf بوونی نیە.
+unexpected_response_error=وەڵامی ڕاژەخوازی نەخوازراو.
 
 # LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
 # replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}}, {{time}}
 
 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
 # "{{type}}" will be replaced with an annotation type from a list defined in
 # the PDF spec (32000-1:2008 Table 169 – Annotation types).
 # Some common types are e.g.: "Check", "Text", "Comment", "Note"
-
+text_annotation_type.alt=[{{type}} سەرنج]
+password_label=وشەی تێپەڕ بنووسە بۆ کردنەوەی پەڕگەی pdf.
+password_invalid=وشەی تێپەڕ هەڵەیە. تکایە دووبارە هەوڵ بدەرەوە.
+password_ok=باشە
+password_cancel=پاشگەزبوونەوە
+
+printing_not_supported=ئاگاداربە: چاپکردن بە تەواوی پشتگیر ناکرێت لەم وێبگەڕە.
+printing_not_ready=ئاگاداربە: PDF بە تەواوی بارنەبووە بۆ چاپکردن.
+web_fonts_disabled=جۆرەپیتی وێب ناچالاکە: نەتوانی جۆرەپیتی تێخراوی ناو pdfـەکە بەکاربێت.
diff --git a/third-party/pdfjs/web/locale/cs/viewer.properties 
b/third-party/pdfjs/web/locale/cs/viewer.properties
index 646f410bb..8829097e8 100644
--- a/third-party/pdfjs/web/locale/cs/viewer.properties
+++ b/third-party/pdfjs/web/locale/cs/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Zrušit
 # tooltips)
 toggle_sidebar.title=Postranní lišta
 toggle_sidebar_notification.title=Přepne postranní lištu (dokument obsahuje osnovu/přílohy)
+toggle_sidebar_notification2.title=Přepnout postranní lištu (dokument obsahuje osnovu/přílohy/vrstvy)
 toggle_sidebar_label=Postranní lišta
 document_outline.title=Zobrazí osnovu dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky)
 document_outline_label=Osnova dokumentu
 attachments.title=Zobrazí přílohy
 attachments_label=Přílohy
+layers.title=Zobrazit vrstvy (poklepáním obnovíte všechny vrstvy do výchozího stavu)
+layers_label=Vrstvy
 thumbs.title=Zobrazí náhledy
 thumbs_label=Náhledy
+current_outline_item.title=Najít aktuální položku v osnově
+current_outline_item_label=Aktuální položka v osnově
 findbar.title=Najde v dokumentu
 findbar_label=Najít
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Strana {{page}}
+
+additional_layers=Další vrstvy
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Strana {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Chyba
+
+# Loading indicator messages
+loading=Načítání…
 loading_error=Při nahrávání PDF nastala chyba.
 invalid_file_error=Neplatný nebo chybný soubor PDF.
 missing_file_error=Chybí soubor PDF.
diff --git a/third-party/pdfjs/web/locale/cy/viewer.properties 
b/third-party/pdfjs/web/locale/cy/viewer.properties
index 16cda5fd7..e7123fe0b 100644
--- a/third-party/pdfjs/web/locale/cy/viewer.properties
+++ b/third-party/pdfjs/web/locale/cy/viewer.properties
@@ -67,17 +67,17 @@ cursor_hand_tool_label=Offeryn Llaw
 
 scroll_vertical.title=Defnyddio Sgrolio Fertigol
 scroll_vertical_label=Sgrolio Fertigol
-scroll_horizontal.title=Defnyddio Sgrolio Fertigol
-scroll_horizontal_label=Sgrolio Fertigol
+scroll_horizontal.title=Defnyddio Sgrolio Llorweddol
+scroll_horizontal_label=Sgrolio Llorweddol
 scroll_wrapped.title=Defnyddio Sgrolio Amlapio
 scroll_wrapped_label=Sgrolio Amlapio
 
-spread_none.title=Peidio uno taeniadau canol
-spread_none_label=Dim Taeniadau
-spread_odd.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau odrif
-spread_odd_label=Taeniadau Odrifau
-spread_even.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau eilrif
-spread_even_label=Taeniadau Eilrif
+spread_none.title=Peidio uno trawsdaleniadau
+spread_none_label=Dim Trawsdaleniadau
+spread_odd.title=Uno trawsdaleniadau gan gychwyn gyda thudalennau odrif
+spread_odd_label=Trawsdaleniadau Odrif
+spread_even.title=Uno trawsdaleniadau gan gychwyn gyda thudalennau eilrif
+spread_even_label=Trawsdaleniadau Eilrif
 
 # Document properties dialog box
 document_properties.title=Priodweddau Dogfen…
@@ -138,18 +138,27 @@ print_progress_close=Diddymu
 # tooltips)
 toggle_sidebar.title=Toglo'r Bar Ochr
 toggle_sidebar_notification.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys outline/attachments)
+toggle_sidebar_notification2.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys amlinelliadau/atodiadau/haenau)
 toggle_sidebar_label=Toglo'r Bar Ochr
 document_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)
 document_outline_label=Amlinelliad Dogfen
 attachments.title=Dangos Atodiadau
 attachments_label=Atodiadau
+layers.title=Dangos Haenau (cliciwch ddwywaith i ailosod yr holl haenau i'r cyflwr rhagosodedig)
+layers_label=Haenau
 thumbs.title=Dangos Lluniau Bach
 thumbs_label=Lluniau Bach
+current_outline_item.title=Canfod yr Eitem Amlinellol Gyfredol
+current_outline_item_label=Yr Eitem Amlinellol Gyfredol
 findbar.title=Canfod yn y Ddogfen
 findbar_label=Canfod
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Tudalen {{page}}
+
+additional_layers=Haenau Ychwanegol
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Tudalen {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Gwall
+
+# Loading indicator messages
+loading=Yn llwytho…
 loading_error=Digwyddodd gwall wrth lwytho'r PDF.
 invalid_file_error=Ffeil PDF annilys neu llwgr.
 missing_file_error=Ffeil PDF coll.
diff --git a/third-party/pdfjs/web/locale/da/viewer.properties 
b/third-party/pdfjs/web/locale/da/viewer.properties
index 38ed99d0b..149a027b4 100644
--- a/third-party/pdfjs/web/locale/da/viewer.properties
+++ b/third-party/pdfjs/web/locale/da/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Annuller
 # tooltips)
 toggle_sidebar.title=Slå sidepanel til eller fra
 toggle_sidebar_notification.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede 
filer)
+toggle_sidebar_notification2.title=Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede 
filer/lag)
 toggle_sidebar_label=Slå sidepanel til eller fra
 document_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer)
 document_outline_label=Dokument-disposition
 attachments.title=Vis vedhæftede filer
 attachments_label=Vedhæftede filer
+layers.title=Vis lag (dobbeltklik for at nulstille alle lag til standard-tilstanden)
+layers_label=Lag
 thumbs.title=Vis miniaturer
 thumbs_label=Miniaturer
+current_outline_item.title=Find det aktuelle dispositions-element
+current_outline_item_label=Aktuelt dispositions-element
 findbar.title=Find i dokument
 findbar_label=Find
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Side {{page}}
+
+additional_layers=Yderligere lag
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Side {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fejl
+
+# Loading indicator messages
+loading=Indlæser…
 loading_error=Der opstod en fejl ved indlæsning af PDF-filen.
 invalid_file_error=PDF-filen er ugyldig eller ødelagt.
 missing_file_error=Manglende PDF-fil.
diff --git a/third-party/pdfjs/web/locale/de/viewer.properties 
b/third-party/pdfjs/web/locale/de/viewer.properties
index 26b682ebe..89645f482 100644
--- a/third-party/pdfjs/web/locale/de/viewer.properties
+++ b/third-party/pdfjs/web/locale/de/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Abbrechen
 # tooltips)
 toggle_sidebar.title=Sidebar umschalten
 toggle_sidebar_notification.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge)
+toggle_sidebar_notification2.title=Sidebar umschalten (Dokument enthält Dokumentstruktur/Anhänge/Ebenen)
 toggle_sidebar_label=Sidebar umschalten
 document_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen)
 document_outline_label=Dokumentstruktur
 attachments.title=Anhänge anzeigen
 attachments_label=Anhänge
+layers.title=Ebenen anzeigen (Doppelklicken, um alle Ebenen auf den Standardzustand zurückzusetzen)
+layers_label=Ebenen
 thumbs.title=Miniaturansichten anzeigen
 thumbs_label=Miniaturansichten
+current_outline_item.title=Aktuelles Struktur-Element finden
+current_outline_item_label=Aktuelles Struktur-Element
 findbar.title=Dokument durchsuchen
 findbar_label=Suchen
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Seite {{page}}
+
+additional_layers=Zusätzliche Ebenen
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Seite {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Fehler
+
+# Loading indicator messages
+loading=Wird geladen…
 loading_error=Beim Laden der PDF-Datei trat ein Fehler auf.
 invalid_file_error=Ungültige oder beschädigte PDF-Datei
 missing_file_error=Fehlende PDF-Datei
diff --git a/third-party/pdfjs/web/locale/dsb/viewer.properties 
b/third-party/pdfjs/web/locale/dsb/viewer.properties
index 468ccd745..dd131bc6a 100644
--- a/third-party/pdfjs/web/locale/dsb/viewer.properties
+++ b/third-party/pdfjs/web/locale/dsb/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Pśetergnuś
 # tooltips)
 toggle_sidebar.title=Bócnicu pokazaś/schowaś
 toggle_sidebar_notification.title=Bocnicu pśešaltowaś (dokument wopśimujo pśeglěd/pśipiski)
+toggle_sidebar_notification2.title=Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo)
 toggle_sidebar_label=Bócnicu pokazaś/schowaś
 document_outline.title=Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski 
pokazali/schowali)
 document_outline_label=Dokumentowa struktura
 attachments.title=Pśidanki pokazaś
 attachments_label=Pśidanki
+layers.title=Warstwy pokazaś (klikniśo dwójcy, aby wšykne warstwy na standardny staw slědk stajił)
+layers_label=Warstwy
 thumbs.title=Miniatury pokazaś
 thumbs_label=Miniatury
+current_outline_item.title=Aktualny rozrědowański zapisk pytaś
+current_outline_item_label=Aktualny rozrědowański zapisk
 findbar.title=W dokumenśe pytaś
 findbar_label=Pytaś
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Bok {{page}}
+
+additional_layers=Dalšne warstwy
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Bok {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Zmólka
+
+# Loading indicator messages
+loading=Zacytujo se…
 loading_error=Pśi zacytowanju PDF jo zmólka nastała.
 invalid_file_error=Njepłaśiwa abo wobškóźona PDF-dataja.
 missing_file_error=Felujuca PDF-dataja.
diff --git a/third-party/pdfjs/web/locale/el/viewer.properties 
b/third-party/pdfjs/web/locale/el/viewer.properties
index 896bbeefc..3b1b6e201 100644
--- a/third-party/pdfjs/web/locale/el/viewer.properties
+++ b/third-party/pdfjs/web/locale/el/viewer.properties
@@ -105,7 +105,7 @@ document_properties_version=Έκδοση PDF:
 document_properties_page_count=Αριθμός σελίδων:
 document_properties_page_size=Μέγεθος σελίδας:
 document_properties_page_size_unit_inches=ίντσες
-document_properties_page_size_unit_millimeters=χιλιοστά
+document_properties_page_size_unit_millimeters=mm
 document_properties_page_size_orientation_portrait=κατακόρυφα
 document_properties_page_size_orientation_landscape=οριζόντια
 document_properties_page_size_name_a3=A3
@@ -131,25 +131,34 @@ print_progress_message=Προετοιμασία του εγγράφου για 
 # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
 # a numerical per cent value.
 print_progress_percent={{progress}}%
-print_progress_close=Άκυρο
+print_progress_close=Ακύρωση
 
 # Tooltips and alt text for side panel toolbar buttons
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
 toggle_sidebar.title=(Απ)ενεργοποίηση πλευρικής στήλης
 toggle_sidebar_notification.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει 
περίγραμμα/συνημμένα)
+toggle_sidebar_notification2.title=(Απ)ενεργοποίηση πλευρικής στήλης (το έγγραφο περιέχει 
περίγραμμα/συνημμένα/επίπεδα)
 toggle_sidebar_label=(Απ)ενεργοποίηση πλευρικής στήλης
 document_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων)
 document_outline_label=Διάρθρωση εγγράφου
 attachments.title=Προβολή συνημμένων
 attachments_label=Συνημμένα
+layers.title=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση)
+layers_label=Επίπεδα
 thumbs.title=Προβολή μικρογραφιών
 thumbs_label=Μικρογραφίες
+current_outline_item.title=Εύρεση τρέχοντος στοιχείου διάρθρωσης
+current_outline_item_label=Τρέχον στοιχείο διάρθρωσης
 findbar.title=Εύρεση στο έγγραφο
 findbar_label=Εύρεση
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Σελίδα {{page}}
+
+additional_layers=Επιπρόσθετα επίπεδα
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Σελίδα {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -166,7 +175,7 @@ find_previous_label=Προηγούμενο
 find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης
 find_next_label=Επόμενο
 find_highlight=Επισήμανση όλων
-find_match_case_label=Ταίριασμα χαρακτήρα
+find_match_case_label=Συμφωνία πεζών/κεφαλαίων
 find_entire_word_label=Ολόκληρες λέξεις
 find_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος
 find_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή
@@ -199,7 +208,7 @@ error_less_info=Λιγότερες πληροφορίες
 error_close=Κλείσιμο
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
 # replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
+error_version_info=PDF.js v{{version}} (έκδοση: {{build}})
 # LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
 # english string describing the error.
 error_message=Μήνυμα: {{message}}
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Σφάλμα
+
+# Loading indicator messages
+loading=Φόρτωση…
 loading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.
 invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.
 missing_file_error=Λείπει αρχείο PDF.
@@ -239,9 +251,9 @@ annotation_date_string={{date}}, {{time}}
 text_annotation_type.alt=[{{type}} Σχόλιο]
 password_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου.
 password_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά.
-password_ok=ΟΚ
+password_ok=OK
 password_cancel=Ακύρωση
 
-printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.
+printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από το πρόγραμμα περιήγησης.
 printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.
 web_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών 
PDF.
diff --git a/third-party/pdfjs/web/locale/en-CA/viewer.properties 
b/third-party/pdfjs/web/locale/en-CA/viewer.properties
index 554a0e176..49e5d90c9 100644
--- a/third-party/pdfjs/web/locale/en-CA/viewer.properties
+++ b/third-party/pdfjs/web/locale/en-CA/viewer.properties
@@ -56,9 +56,9 @@ last_page_label=Go to Last Page
 page_rotate_cw.title=Rotate Clockwise
 page_rotate_cw.label=Rotate Clockwise
 page_rotate_cw_label=Rotate Clockwise
-page_rotate_ccw.title=Rotate Anti-Clockwise
-page_rotate_ccw.label=Rotate Anti-Clockwise
-page_rotate_ccw_label=Rotate Anti-Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+page_rotate_ccw_label=Rotate Counterclockwise
 
 cursor_text_select_tool.title=Enable Text Selection Tool
 cursor_text_select_tool_label=Text Selection Tool
@@ -138,18 +138,27 @@ print_progress_close=Cancel
 # tooltips)
 toggle_sidebar.title=Toggle Sidebar
 toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers)
 toggle_sidebar_label=Toggle Sidebar
 document_outline.title=Show Document Outline (double-click to expand/collapse all items)
 document_outline_label=Document Outline
 attachments.title=Show Attachments
 attachments_label=Attachments
+layers.title=Show Layers (double-click to reset all layers to the default state)
+layers_label=Layers
 thumbs.title=Show Thumbnails
 thumbs_label=Thumbnails
+current_outline_item.title=Find Current Outline Item
+current_outline_item_label=Current Outline Item
 findbar.title=Find in Document
 findbar_label=Find
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Page {{page}}
+
+additional_layers=Additional Layers
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Page {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Loading…
 loading_error=An error occurred while loading the PDF.
 invalid_file_error=Invalid or corrupted PDF file.
 missing_file_error=Missing PDF file.
diff --git a/third-party/pdfjs/web/locale/en-GB/viewer.properties 
b/third-party/pdfjs/web/locale/en-GB/viewer.properties
index 554a0e176..1b50cb379 100644
--- a/third-party/pdfjs/web/locale/en-GB/viewer.properties
+++ b/third-party/pdfjs/web/locale/en-GB/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancel
 # tooltips)
 toggle_sidebar.title=Toggle Sidebar
 toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_notification2.title=Toggle Sidebar (document contains outline/attachments/layers)
 toggle_sidebar_label=Toggle Sidebar
 document_outline.title=Show Document Outline (double-click to expand/collapse all items)
 document_outline_label=Document Outline
 attachments.title=Show Attachments
 attachments_label=Attachments
+layers.title=Show Layers (double-click to reset all layers to the default state)
+layers_label=Layers
 thumbs.title=Show Thumbnails
 thumbs_label=Thumbnails
+current_outline_item.title=Find Current Outline Item
+current_outline_item_label=Current Outline Item
 findbar.title=Find in Document
 findbar_label=Find
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Page {{page}}
+
+additional_layers=Additional Layers
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Page {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Loading…
 loading_error=An error occurred while loading the PDF.
 invalid_file_error=Invalid or corrupted PDF file.
 missing_file_error=Missing PDF file.
diff --git a/third-party/pdfjs/web/locale/en-US/viewer.properties 
b/third-party/pdfjs/web/locale/en-US/viewer.properties
index d31103c00..5fe094b76 100644
--- a/third-party/pdfjs/web/locale/en-US/viewer.properties
+++ b/third-party/pdfjs/web/locale/en-US/viewer.properties
@@ -48,16 +48,12 @@ bookmark_label=Current View
 tools.title=Tools
 tools_label=Tools
 first_page.title=Go to First Page
-first_page.label=Go to First Page
 first_page_label=Go to First Page
 last_page.title=Go to Last Page
-last_page.label=Go to Last Page
 last_page_label=Go to Last Page
 page_rotate_cw.title=Rotate Clockwise
-page_rotate_cw.label=Rotate Clockwise
 page_rotate_cw_label=Rotate Clockwise
 page_rotate_ccw.title=Rotate Counterclockwise
-page_rotate_ccw.label=Rotate Counterclockwise
 page_rotate_ccw_label=Rotate Counterclockwise
 
 cursor_text_select_tool.title=Enable Text Selection Tool
@@ -147,12 +143,14 @@ layers.title=Show Layers (double-click to reset all layers to the default state)
 layers_label=Layers
 thumbs.title=Show Thumbnails
 thumbs_label=Thumbnails
+current_outline_item.title=Find Current Outline Item
+current_outline_item_label=Current Outline Item
 findbar.title=Find in Document
 findbar_label=Find
 
 additional_layers=Additional Layers
-# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
-page_canvas=Page {{page}}
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Page {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -225,7 +223,7 @@ page_scale_actual=Actual Size
 page_scale_percent={{scale}}%
 
 # Loading indicator messages
-loading_error_indicator=Error
+loading=Loading…
 loading_error=An error occurred while loading the PDF.
 invalid_file_error=Invalid or corrupted PDF file.
 missing_file_error=Missing PDF file.
diff --git a/third-party/pdfjs/web/locale/eo/viewer.properties 
b/third-party/pdfjs/web/locale/eo/viewer.properties
index 804bd9842..9500e8270 100644
--- a/third-party/pdfjs/web/locale/eo/viewer.properties
+++ b/third-party/pdfjs/web/locale/eo/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Nuligi
 # tooltips)
 toggle_sidebar.title=Montri/kaŝi flankan strion
 toggle_sidebar_notification.title=Montri/kaŝi flankan strion (la dokumento enhavas konturon/aneksaĵojn)
+toggle_sidebar_notification2.title=Montri/kaŝi flankan strion (la dokumento enhavas 
konturon/kunsendaĵojn/tavolojn)
 toggle_sidebar_label=Montri/kaŝi flankan strion
 document_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn)
 document_outline_label=Konturo de dokumento
 attachments.title=Montri kunsendaĵojn
 attachments_label=Kunsendaĵojn
+layers.title=Montri tavolojn (duoble alklaku por remeti ĉiujn tavolojn en la norman staton)
+layers_label=Tavoloj
 thumbs.title=Montri miniaturojn
 thumbs_label=Miniaturoj
+current_outline_item.title=Trovi nunan konturan elementon
+current_outline_item_label=Nuna kontura elemento
 findbar.title=Serĉi en dokumento
 findbar_label=Serĉi
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Paĝo {{page}}
+
+additional_layers=Aldonaj tavoloj
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Paĝo {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Eraro
+
+# Loading indicator messages
+loading=Ŝargado…
 loading_error=Okazis eraro dum la ŝargado de la PDF dosiero.
 invalid_file_error=Nevalida aŭ difektita PDF dosiero.
 missing_file_error=Mankas dosiero PDF.
diff --git a/third-party/pdfjs/web/locale/es-AR/viewer.properties 
b/third-party/pdfjs/web/locale/es-AR/viewer.properties
index ca2c87ba6..5e97d6ebc 100644
--- a/third-party/pdfjs/web/locale/es-AR/viewer.properties
+++ b/third-party/pdfjs/web/locale/es-AR/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Alternar barra lateral
 toggle_sidebar_notification.title=Intercambiar barra lateral (el documento contiene esquema/adjuntos)
+toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
 toggle_sidebar_label=Alternar barra lateral
 document_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems)
 document_outline_label=Esquema del documento
 attachments.title=Mostrar adjuntos
 attachments_label=Adjuntos
+layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+layers_label=Capas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Buscar elemento de esquema actual
+current_outline_item_label=Elemento de esquema actual
 findbar.title=Buscar en documento
 findbar_label=Buscar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Capas adicionales
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Cargando…
 loading_error=Ocurrió un error al cargar el PDF.
 invalid_file_error=Archivo PDF no válido o cocrrupto.
 missing_file_error=Archivo PDF faltante.
diff --git a/third-party/pdfjs/web/locale/es-CL/viewer.properties 
b/third-party/pdfjs/web/locale/es-CL/viewer.properties
index b6ac40939..23669e68d 100644
--- a/third-party/pdfjs/web/locale/es-CL/viewer.properties
+++ b/third-party/pdfjs/web/locale/es-CL/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Barra lateral
 toggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)
+toggle_sidebar_notification2.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos/capas)
 toggle_sidebar_label=Mostrar u ocultar la barra lateral
 document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
 document_outline_label=Esquema del documento
 attachments.title=Mostrar adjuntos
 attachments_label=Adjuntos
+layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+layers_label=Capas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Buscar elemento de esquema actual
+current_outline_item_label=Elemento de esquema actual
 findbar.title=Buscar en el documento
 findbar_label=Buscar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Capas adicionales
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Cargando…
 loading_error=Ocurrió un error al cargar el PDF.
 invalid_file_error=Archivo PDF inválido o corrupto.
 missing_file_error=Falta el archivo PDF.
diff --git a/third-party/pdfjs/web/locale/es-ES/viewer.properties 
b/third-party/pdfjs/web/locale/es-ES/viewer.properties
index 75e5f0ad4..ef8c135ce 100644
--- a/third-party/pdfjs/web/locale/es-ES/viewer.properties
+++ b/third-party/pdfjs/web/locale/es-ES/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Cambiar barra lateral
 toggle_sidebar_notification.title=Alternar panel lateral (el documento contiene un esquema o adjuntos)
+toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
 toggle_sidebar_label=Cambiar barra lateral
 document_outline.title=Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)
 document_outline_label=Resumen de documento
 attachments.title=Mostrar adjuntos
 attachments_label=Adjuntos
+layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+layers_label=Capas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Encontrar elemento de esquema actual
+current_outline_item_label=Elemento de esquema actual
 findbar.title=Buscar en el documento
 findbar_label=Buscar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Capas adicionales
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Cargando…
 loading_error=Ocurrió un error al cargar el PDF.
 invalid_file_error=Fichero PDF no válido o corrupto.
 missing_file_error=No hay fichero PDF.
diff --git a/third-party/pdfjs/web/locale/es-MX/viewer.properties 
b/third-party/pdfjs/web/locale/es-MX/viewer.properties
index 5098ad195..217b2bfb1 100644
--- a/third-party/pdfjs/web/locale/es-MX/viewer.properties
+++ b/third-party/pdfjs/web/locale/es-MX/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Cambiar barra lateral
 toggle_sidebar_notification.title=Cambiar barra lateral (índice de contenidos del documento/adjuntos)
+toggle_sidebar_notification2.title=Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
 toggle_sidebar_label=Cambiar barra lateral
 document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
 document_outline_label=Esquema del documento
 attachments.title=Mostrar adjuntos
 attachments_label=Adjuntos
+layers.title=Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+layers_label=Capas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Buscar elemento de esquema actual
+current_outline_item_label=Elemento de esquema actual
 findbar.title=Buscar en el documento
 findbar_label=Buscar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Capas adicionales
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Cargando…
 loading_error=Un error ocurrió al cargar el PDF.
 invalid_file_error=Archivo PDF invalido o dañado.
 missing_file_error=Archivo PDF no encontrado.
diff --git a/third-party/pdfjs/web/locale/et/viewer.properties 
b/third-party/pdfjs/web/locale/et/viewer.properties
index 97f2c9bd7..cab1ad4ba 100644
--- a/third-party/pdfjs/web/locale/et/viewer.properties
+++ b/third-party/pdfjs/web/locale/et/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Viga
+
 loading_error=PDFi laadimisel esines viga.
 invalid_file_error=Vigane või rikutud PDF-fail.
 missing_file_error=PDF-fail puudub.
diff --git a/third-party/pdfjs/web/locale/eu/viewer.properties 
b/third-party/pdfjs/web/locale/eu/viewer.properties
index 5700d6019..7d73e3ede 100644
--- a/third-party/pdfjs/web/locale/eu/viewer.properties
+++ b/third-party/pdfjs/web/locale/eu/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Utzi
 # tooltips)
 toggle_sidebar.title=Txandakatu alboko barra
 toggle_sidebar_notification.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak ditu)
+toggle_sidebar_notification2.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak/geruzak ditu)
 toggle_sidebar_label=Txandakatu alboko barra
 document_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)
 document_outline_label=Dokumentuaren eskema
 attachments.title=Erakutsi eranskinak
 attachments_label=Eranskinak
+layers.title=Erakutsi geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko)
+layers_label=Geruzak
 thumbs.title=Erakutsi koadro txikiak
 thumbs_label=Koadro txikiak
+current_outline_item.title=Bilatu uneko eskemaren elementua
+current_outline_item_label=Uneko eskemaren elementua
 findbar.title=Bilatu dokumentuan
 findbar_label=Bilatu
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}}. orria
+
+additional_layers=Geruza gehigarriak
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}}. orria
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent=%{{scale}}
 
 # Loading indicator messages
 loading_error_indicator=Errorea
+
+# Loading indicator messages
+loading=Kargatzen…
 loading_error=Errorea gertatu da PDFa kargatzean.
 invalid_file_error=PDF fitxategi baliogabe edo hondatua.
 missing_file_error=PDF fitxategia falta da.
diff --git a/third-party/pdfjs/web/locale/fa/viewer.properties 
b/third-party/pdfjs/web/locale/fa/viewer.properties
index 9886b39d2..00eb8b6e4 100644
--- a/third-party/pdfjs/web/locale/fa/viewer.properties
+++ b/third-party/pdfjs/web/locale/fa/viewer.properties
@@ -202,6 +202,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=خطا
+
 loading_error=هنگام بارگیری پرونده PDF خطایی رخ داد.
 invalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد.
 missing_file_error=پرونده PDF یافت نشد.
diff --git a/third-party/pdfjs/web/locale/ff/viewer.properties 
b/third-party/pdfjs/web/locale/ff/viewer.properties
index 0a081021b..eb5ca99be 100644
--- a/third-party/pdfjs/web/locale/ff/viewer.properties
+++ b/third-party/pdfjs/web/locale/ff/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Juumre
+
 loading_error=Juumre waɗii tuma nde loowata PDF oo.
 invalid_file_error=Fiilde PDF moƴƴaani walla jiibii.
 missing_file_error=Fiilde PDF ena ŋakki.
diff --git a/third-party/pdfjs/web/locale/fi/viewer.properties 
b/third-party/pdfjs/web/locale/fi/viewer.properties
index 38c40a395..a6d46e1bd 100644
--- a/third-party/pdfjs/web/locale/fi/viewer.properties
+++ b/third-party/pdfjs/web/locale/fi/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Peruuta
 # tooltips)
 toggle_sidebar.title=Näytä/piilota sivupaneeli
 toggle_sidebar_notification.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys tai liitteitä)
+toggle_sidebar_notification2.title=Näytä/piilota sivupaneeli (dokumentissa on sisällys/liitteitä/tasoja)
 toggle_sidebar_label=Näytä/piilota sivupaneeli
 document_outline.title=Näytä dokumentin sisällys (laajenna tai kutista kohdat kaksoisnapsauttamalla)
 document_outline_label=Dokumentin sisällys
 attachments.title=Näytä liitteet
 attachments_label=Liitteet
+layers.title=Näytä tasot (kaksoisnapsauta palauttaaksesi kaikki tasot oletustilaan)
+layers_label=Tasot
 thumbs.title=Näytä pienoiskuvat
 thumbs_label=Pienoiskuvat
+current_outline_item.title=Etsi nykyinen sisällyksen kohta
+current_outline_item_label=Nykyinen sisällyksen kohta
 findbar.title=Etsi dokumentista
 findbar_label=Etsi
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Sivu {{page}}
+
+additional_layers=Lisätasot
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Sivu {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Virhe
+
+# Loading indicator messages
+loading=Ladataan…
 loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.
 invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.
 missing_file_error=Puuttuva PDF-tiedosto.
diff --git a/third-party/pdfjs/web/locale/fr/viewer.properties 
b/third-party/pdfjs/web/locale/fr/viewer.properties
index 589a4185c..addb629ef 100644
--- a/third-party/pdfjs/web/locale/fr/viewer.properties
+++ b/third-party/pdfjs/web/locale/fr/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Annuler
 # tooltips)
 toggle_sidebar.title=Afficher/Masquer le panneau latéral
 toggle_sidebar_notification.title=Afficher/Masquer le panneau latéral (le document contient des 
signets/pièces jointes)
+toggle_sidebar_notification2.title=Afficher/Masquer le panneau latéral (le document contient des 
signets/pièces jointes/calques)
 toggle_sidebar_label=Afficher/Masquer le panneau latéral
 document_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les 
éléments)
 document_outline_label=Signets du document
 attachments.title=Afficher les pièces jointes
 attachments_label=Pièces jointes
+layers.title=Afficher les calques (double-cliquer pour réinitialiser tous les calques à l’état par défaut)
+layers_label=Calques
 thumbs.title=Afficher les vignettes
 thumbs_label=Vignettes
+current_outline_item.title=Trouver l’élément de plan actuel
+current_outline_item_label=Élément de plan actuel
 findbar.title=Rechercher dans le document
 findbar_label=Rechercher
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Page {{page}}
+
+additional_layers=Calques additionnels
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Page {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Erreur
+
+# Loading indicator messages
+loading=Chargement…
 loading_error=Une erreur s’est produite lors du chargement du fichier PDF.
 invalid_file_error=Fichier PDF invalide ou corrompu.
 missing_file_error=Fichier PDF manquant.
diff --git a/third-party/pdfjs/web/locale/fy-NL/viewer.properties 
b/third-party/pdfjs/web/locale/fy-NL/viewer.properties
index 5a506540b..5fe493450 100644
--- a/third-party/pdfjs/web/locale/fy-NL/viewer.properties
+++ b/third-party/pdfjs/web/locale/fy-NL/viewer.properties
@@ -22,7 +22,7 @@ next_label=Folgjende
 page.title=Side
 # LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
 # representing the total number of pages in the document.
-of_pages=fa {{pagesCount}}
+of_pages=fan {{pagesCount}}
 # LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
 # will be replaced by a number representing the currently visible page,
 # respectively a number representing the total number of pages in the document.
@@ -138,18 +138,27 @@ print_progress_close=Annulearje
 # tooltips)
 toggle_sidebar.title=Sidebalke yn-/útskeakelje
 toggle_sidebar_notification.title=Sidebalke yn-/útskeakelje (dokumint befettet outline/bylagen)
+toggle_sidebar_notification2.title=Sidebalke yn-/útskeakelje (dokumint befettet oersjoch/bylagen/lagen)
 toggle_sidebar_label=Sidebalke yn-/útskeakelje
 document_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen)
 document_outline_label=Dokumintoersjoch
 attachments.title=Bylagen toane
 attachments_label=Bylagen
+layers.title=Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten)
+layers_label=Lagen
 thumbs.title=Foarbylden toane
 thumbs_label=Foarbylden
+current_outline_item.title=Aktueel item yn ynhâldsopjefte sykje
+current_outline_item_label=Aktueel item yn ynhâldsopjefte
 findbar.title=Sykje yn dokumint
 findbar_label=Sykje
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Side {{page}}
+
+additional_layers=Oanfoljende lagen
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Side {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Flater
+
+# Loading indicator messages
+loading=Lade…
 loading_error=Der is in flater bard by it laden fan de PDF.
 invalid_file_error=Ynfalide of korruptearre PDF-bestân.
 missing_file_error=PDF-bestân ûntbrekt.
diff --git a/third-party/pdfjs/web/locale/ga-IE/viewer.properties 
b/third-party/pdfjs/web/locale/ga-IE/viewer.properties
index f606e81b0..07ae1f933 100644
--- a/third-party/pdfjs/web/locale/ga-IE/viewer.properties
+++ b/third-party/pdfjs/web/locale/ga-IE/viewer.properties
@@ -163,6 +163,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Earráid
+
 loading_error=Tharla earráid agus an cháipéis PDF á lódáil.
 invalid_file_error=Comhad neamhbhailí nó truaillithe PDF.
 missing_file_error=Comhad PDF ar iarraidh.
diff --git a/third-party/pdfjs/web/locale/gd/viewer.properties 
b/third-party/pdfjs/web/locale/gd/viewer.properties
index af4433e3f..d1e54caa6 100644
--- a/third-party/pdfjs/web/locale/gd/viewer.properties
+++ b/third-party/pdfjs/web/locale/gd/viewer.properties
@@ -138,16 +138,27 @@ print_progress_close=Sguir dheth
 # tooltips)
 toggle_sidebar.title=Toglaich am bàr-taoibh
 toggle_sidebar_notification.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain aig an sgrìobhainn)
+toggle_sidebar_notification2.title=Toglaich am bàr-taoibh (tha oir-loidhne/ceanglachain/breathan aig an 
sgrìobhainn)
 toggle_sidebar_label=Toglaich am bàr-taoibh
 document_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a 
leudachadh/a cho-theannadh)
 document_outline_label=Oir-loidhne na sgrìobhainne
 attachments.title=Seall na ceanglachain
 attachments_label=Ceanglachain
+layers.title=Seall na breathan (dèan briogadh dùbailte airson a h-uile breath ath-shuidheachadh dhan staid 
thùsail)
+layers_label=Breathan
 thumbs.title=Seall na dealbhagan
 thumbs_label=Dealbhagan
+current_outline_item.title=Lorg nì làithreach na h-oir-loidhne
+current_outline_item_label=Nì làithreach na h-oir-loidhne
 findbar.title=Lorg san sgrìobhainn
 findbar_label=Lorg
 
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=Duilleag {{page}}
+
+additional_layers=Barrachd breathan
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Duilleag {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -221,11 +232,18 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Mearachd
+
+# Loading indicator messages
+loading=’Ga luchdadh…
 loading_error=Thachair mearachd rè luchdadh a' PDF.
 invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.
 missing_file_error=Faidhle PDF a tha a dhìth.
 unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.
 
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}}, {{time}}
+
 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
 # "{{type}}" will be replaced with an annotation type from a list defined in
 # the PDF spec (32000-1:2008 Table 169 – Annotation types).
@@ -233,7 +251,7 @@ unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.
 text_annotation_type.alt=[Nòtachadh {{type}}]
 password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.
 password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?
-password_ok=Ceart ma-tha
+password_ok=Ceart ma-thà
 password_cancel=Sguir dheth
 
 printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.
diff --git a/third-party/pdfjs/web/locale/gl/viewer.properties 
b/third-party/pdfjs/web/locale/gl/viewer.properties
index c3a30fecd..efbabc0da 100644
--- a/third-party/pdfjs/web/locale/gl/viewer.properties
+++ b/third-party/pdfjs/web/locale/gl/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Amosar/agochar a barra lateral
 toggle_sidebar_notification.title=Amosar/agochar a barra lateral (o documento contén un esquema ou anexos)
+toggle_sidebar_notification2.title=Alternar barra lateral (o documento contén esquema/anexos/capas)
 toggle_sidebar_label=Amosar/agochar a barra lateral
 document_outline.title=Amosar o esquema do documento (prema dúas veces para expandir/contraer todos os 
elementos)
 document_outline_label=Esquema do documento
 attachments.title=Amosar anexos
 attachments_label=Anexos
+layers.title=Mostrar capas (prema dúas veces para restaurar todas as capas o estado predeterminado)
+layers_label=Capas
 thumbs.title=Amosar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Atopar o elemento delimitado actualmente
+current_outline_item_label=Elemento delimitado actualmente
 findbar.title=Atopar no documento
 findbar_label=Atopar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Páxina {{page}}
+
+additional_layers=Capas adicionais
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Páxina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Erro
+
+# Loading indicator messages
+loading=A cargar…
 loading_error=Produciuse un erro ao cargar o PDF.
 invalid_file_error=Ficheiro PDF danado ou non válido.
 missing_file_error=Falta o ficheiro PDF.
diff --git a/third-party/pdfjs/web/locale/gn/viewer.properties 
b/third-party/pdfjs/web/locale/gn/viewer.properties
index 4b893971d..301698028 100644
--- a/third-party/pdfjs/web/locale/gn/viewer.properties
+++ b/third-party/pdfjs/web/locale/gn/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Heja
 # tooltips)
 toggle_sidebar.title=Tenda yke moambue
 toggle_sidebar_notification.title=Embojopyru tenda ykegua (kuatia oguereko kora/marandurenda moirũha)
+toggle_sidebar_notification2.title=Embojopyru tenda ykegua (kuatia oguereko kuaakaha/moirũha/ñuãha)
 toggle_sidebar_label=Tenda yke moambue
 document_outline.title=Ehechauka kuatia rape (eikutu mokõi jey embotuicha/emomichĩ hag̃ua opavavete 
mba’epuru)
 document_outline_label=Kuatia apopyre
 attachments.title=Moirũha jehechauka
 attachments_label=Moirũha
+layers.title=Ehechauka ñuãha (eikutu jo’a emomba’apo hag̃ua opaite ñuãha tekoypýpe)
+layers_label=Ñuãha
 thumbs.title=Mba’emirĩ jehechauka
 thumbs_label=Mba’emirĩ
+current_outline_item.title=Eheka mba’epuru ag̃aguaitéva
+current_outline_item_label=Mba’epuru ag̃aguaitéva
 findbar.title=Kuatiápe jeheka
 findbar_label=Juhu
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Kuatiarogue {{page}}
+
+additional_layers=Ñuãha moirũguáva
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Kuatiarogue {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Oĩvaíva
+
+# Loading indicator messages
+loading=Henyhẽhína…
 loading_error=Oiko jejavy PDF oñemyeñyhẽnguévo.
 invalid_file_error=PDF marandurenda ndoikóiva térã ivaipyréva.
 missing_file_error=Ndaipóri PDF marandurenda
diff --git a/third-party/pdfjs/web/locale/gu-IN/viewer.properties 
b/third-party/pdfjs/web/locale/gu-IN/viewer.properties
index 579c068d9..d1b7040be 100644
--- a/third-party/pdfjs/web/locale/gu-IN/viewer.properties
+++ b/third-party/pdfjs/web/locale/gu-IN/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=ભૂલ
+
 loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.
 invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.
 missing_file_error=ગુમ થયેલ PDF ફાઇલ.
diff --git a/third-party/pdfjs/web/locale/he/viewer.properties 
b/third-party/pdfjs/web/locale/he/viewer.properties
index 066478921..0ed86b7cf 100644
--- a/third-party/pdfjs/web/locale/he/viewer.properties
+++ b/third-party/pdfjs/web/locale/he/viewer.properties
@@ -137,19 +137,28 @@ print_progress_close=ביטול
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
 toggle_sidebar.title=הצגה/הסתרה של סרגל הצד
-toggle_sidebar_notification.title=החלפת תצוגת סרגל צד (מסמך שמכיל מתאר/צרופות)
+toggle_sidebar_notification.title=החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים)
+toggle_sidebar_notification2.title=החלפת תצוגת סרגל צד (מסמך שמכיל תוכן עניינים/קבצים מצורפים/שכבות)
 toggle_sidebar_label=הצגה/הסתרה של סרגל הצד
-document_outline.title=הצגת מתאר מסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים)
-document_outline_label=מתאר מסמך
+document_outline.title=הצגת תוכן העניינים של המסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים)
+document_outline_label=תוכן העניינים של המסמך
 attachments.title=הצגת צרופות
 attachments_label=צרופות
+layers.title=הצגת שכבות (יש ללחוץ לחיצה כפולה כדי לאפס את כל השכבות למצב ברירת המחדל)
+layers_label=שכבות
 thumbs.title=הצגת תצוגה מקדימה
 thumbs_label=תצוגה מקדימה
+current_outline_item.title=מציאת פריט תוכן העניינים הנוכחי
+current_outline_item_label=פריט תוכן העניינים הנוכחי
 findbar.title=חיפוש במסמך
 findbar_label=חיפוש
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=עמוד {{page}}
+
+additional_layers=שכבות נוספות
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=עמוד {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=שגיאה
+
+# Loading indicator messages
+loading=בטעינה…
 loading_error=אירעה שגיאה בעת טעינת ה־PDF.
 invalid_file_error=קובץ PDF פגום או לא תקין.
 missing_file_error=קובץ PDF חסר.
@@ -243,5 +255,5 @@ password_ok=אישור
 password_cancel=ביטול
 
 printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.
-printing_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.
+printing_not_ready=אזהרה: מסמך ה־PDF לא נטען לחלוטין עד מצב שמאפשר הדפסה.
 web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.
diff --git a/third-party/pdfjs/web/locale/hi-IN/viewer.properties 
b/third-party/pdfjs/web/locale/hi-IN/viewer.properties
index 6a49a9a98..e69c9df69 100644
--- a/third-party/pdfjs/web/locale/hi-IN/viewer.properties
+++ b/third-party/pdfjs/web/locale/hi-IN/viewer.properties
@@ -146,6 +146,7 @@ findbar_label=ढूँढें
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=पृष्ठ {{page}}
+
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -219,6 +220,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=त्रुटि
+
 loading_error=PDF लोड करते समय एक त्रुटि हुई.
 invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.
 missing_file_error=\u0020अनुपस्थित PDF फ़ाइल.
diff --git a/third-party/pdfjs/web/locale/hr/viewer.properties 
b/third-party/pdfjs/web/locale/hr/viewer.properties
index bfe10f808..53f1edfbf 100644
--- a/third-party/pdfjs/web/locale/hr/viewer.properties
+++ b/third-party/pdfjs/web/locale/hr/viewer.properties
@@ -137,19 +137,28 @@ print_progress_close=Odustani
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
 toggle_sidebar.title=Prikaži/sakrij bočnu traku
-toggle_sidebar_notification.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži konturu/privitke)
+toggle_sidebar_notification.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke)
+toggle_sidebar_notification2.title=Prikazivanje i sklanjanje bočne trake (dokument sadrži 
strukturu/privitke/slojeve)
 toggle_sidebar_label=Prikaži/sakrij bočnu traku
 document_outline.title=Prikaži strukturu dokumenta (dvostruki klik za rasklapanje/sklapanje svih stavki)
 document_outline_label=Struktura dokumenta
 attachments.title=Prikaži privitke
 attachments_label=Privitci
+layers.title=Prikaži slojeve (dvoklik za vraćanje svih slojeva u zadano stanje)
+layers_label=Slojevi
 thumbs.title=Prikaži minijature
 thumbs_label=Minijature
-findbar.title=Traži u dokumentu
-findbar_label=Traži
+current_outline_item.title=Pronađi trenutačni element strukture
+current_outline_item_label=Trenutačni element strukture
+findbar.title=Pronađi u dokumentu
+findbar_label=Pronađi
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Stranica br. {{page}}
+
+additional_layers=Dodatni slojevi
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Stranica {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -159,8 +168,8 @@ thumb_page_title=Stranica {{page}}
 thumb_page_canvas=Minijatura stranice {{page}}
 
 # Find panel button title and messages
-find_input.title=Traži
-find_input.placeholder=Traži u dokumentu…
+find_input.title=Pronađi
+find_input.placeholder=Pronađi u dokumentu …
 find_previous.title=Pronađi prethodno pojavljivanje ovog izraza
 find_previous_label=Prethodno
 find_next.title=Pronađi sljedeće pojavljivanje ovog izraza
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Greška
+
+# Loading indicator messages
+loading=Učitavanje…
 loading_error=Došlo je do greške pri učitavanju PDF-a.
 invalid_file_error=Neispravna ili oštećena PDF datoteka.
 missing_file_error=Nedostaje PDF datoteka.
diff --git a/third-party/pdfjs/web/locale/hsb/viewer.properties 
b/third-party/pdfjs/web/locale/hsb/viewer.properties
index 9ba3c15a2..3c692f690 100644
--- a/third-party/pdfjs/web/locale/hsb/viewer.properties
+++ b/third-party/pdfjs/web/locale/hsb/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Přetorhnyć
 # tooltips)
 toggle_sidebar.title=Bóčnicu pokazać/schować
 toggle_sidebar_notification.title=Bóčnicu přepinać (dokument wobsahuje wobrys/přiwěški)
+toggle_sidebar_notification2.title=Bóčnicu přepinać (dokument rozrjad/přiwěški/woršty wobsahuje)
 toggle_sidebar_label=Bóčnicu pokazać/schować
 document_outline.title=Dokumentowy naćisk pokazać (dwójne kliknjenje, zo bychu so wšě zapiski 
pokazali/schowali)
 document_outline_label=Dokumentowa struktura
 attachments.title=Přiwěški pokazać
 attachments_label=Přiwěški
+layers.title=Woršty pokazać (klikńće dwójce, zo byšće wšě woršty na standardny staw wróćo stajił)
+layers_label=Woršty
 thumbs.title=Miniatury pokazać
 thumbs_label=Miniatury
+current_outline_item.title=Aktualny rozrjadowy zapisk pytać
+current_outline_item_label=Aktualny rozrjadowy zapisk
 findbar.title=W dokumenće pytać
 findbar_label=Pytać
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Strona {{page}}
+
+additional_layers=Dalše woršty
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Strona {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Zmylk
+
+# Loading indicator messages
+loading=Začituje so…
 loading_error=Při začitowanju PDF je zmylk wustupił.
 invalid_file_error=Njepłaćiwa abo wobškodźena PDF-dataja.
 missing_file_error=Falowaca PDF-dataja.
diff --git a/third-party/pdfjs/web/locale/hu/viewer.properties 
b/third-party/pdfjs/web/locale/hu/viewer.properties
index 88c1d0796..99cd45755 100644
--- a/third-party/pdfjs/web/locale/hu/viewer.properties
+++ b/third-party/pdfjs/web/locale/hu/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Mégse
 # tooltips)
 toggle_sidebar.title=Oldalsáv be/ki
 toggle_sidebar_notification.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket tartalmaz)
+toggle_sidebar_notification2.title=Oldalsáv be/ki (a dokumentum vázlatot/mellékleteket/rétegeket tartalmaz)
 toggle_sidebar_label=Oldalsáv be/ki
 document_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem 
kinyitásához/összecsukásához)
 document_outline_label=Dokumentumvázlat
 attachments.title=Mellékletek megjelenítése
 attachments_label=Van melléklet
+layers.title=Rétegek megjelenítése (dupla kattintás az összes réteg alapértelmezett állapotra 
visszaállításához)
+layers_label=Rétegek
 thumbs.title=Bélyegképek megjelenítése
 thumbs_label=Bélyegképek
+current_outline_item.title=Jelenlegi vázlatelem megkeresése
+current_outline_item_label=Jelenlegi vázlatelem
 findbar.title=Keresés a dokumentumban
 findbar_label=Keresés
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}}. oldal
+
+additional_layers=További rétegek
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}}. oldal
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Hiba
+
+# Loading indicator messages
+loading=Betöltés…
 loading_error=Hiba történt a PDF betöltésekor.
 invalid_file_error=Érvénytelen vagy sérült PDF fájl.
 missing_file_error=Hiányzó PDF fájl.
diff --git a/third-party/pdfjs/web/locale/hy-AM/viewer.properties 
b/third-party/pdfjs/web/locale/hy-AM/viewer.properties
index 09394f7d8..2b3f0356d 100644
--- a/third-party/pdfjs/web/locale/hy-AM/viewer.properties
+++ b/third-party/pdfjs/web/locale/hy-AM/viewer.properties
@@ -150,6 +150,7 @@ findbar_label=Որոնում
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Էջ {{page}}
+
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +224,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Սխալ
+
 loading_error=Սխալ՝ PDF ֆայլը բացելիս։
 invalid_file_error=Սխալ կամ վնասված PDF ֆայլ:
 missing_file_error=PDF ֆայլը բացակայում է:
diff --git a/third-party/pdfjs/web/locale/hye/viewer.properties 
b/third-party/pdfjs/web/locale/hye/viewer.properties
index 80d43019e..7bbfe1422 100644
--- a/third-party/pdfjs/web/locale/hye/viewer.properties
+++ b/third-party/pdfjs/web/locale/hye/viewer.properties
@@ -77,6 +77,7 @@ spread_none_label=Չկայ կոնտեքստ
 spread_odd.title=Միացէք էջի կոնտեքստին սկսելով՝ կենտ համարակալուած էջերով
 spread_odd_label=Տարաւրինակ կոնտեքստ
 spread_even.title=Միացէք էջի կոնտեքստին սկսելով՝ զոյգ համարակալուած էջերով
+spread_even_label=Հաւասար վերածածկեր
 
 # Document properties dialog box
 document_properties.title=Փաստաթղթի հատկութիւնները…
@@ -137,18 +138,25 @@ print_progress_close=Չեղարկել
 # tooltips)
 toggle_sidebar.title=Փոխարկել կողային վահանակը
 toggle_sidebar_notification.title=Փոխարկել կողային վահանակը (փաստաթուղթը պարունակում է ուրուագիծ/կցորդ)
+toggle_sidebar_notification2.title=Փոխանջատել կողմնասիւնը (փաստաթուղթը պարունակում է 
ուրուագիծ/կցորդներ/շերտեր)
 toggle_sidebar_label=Փոխարկել կողային վահանակը
 document_outline.title=Ցուցադրել փաստաթղթի ուրուագիծը (կրկնակի սեղմէք՝ միաւորները ընդարձակելու/կոծկելու 
համար)
 document_outline_label=Փաստաթղթի ուրուագիծ
 attachments.title=Ցուցադրել կցորդները
 attachments_label=Կցորդներ
+layers.title=Ցուցադրել շերտերը (կրկնահպել վերակայելու բոլոր շերտերը սկզբնադիր վիճակի)
+layers_label=Շերտեր
 thumbs.title=Ցուցադրել մանրապատկերը
 thumbs_label=Մանրապատկեր
+current_outline_item.title=Գտէք ընթացիկ գծագրման տարրը
+current_outline_item_label=Ընթացիկ գծագրման տարր
 findbar.title=Գտնել փաստաթղթում
 findbar_label=Որոնում
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Էջ {{page}}
+
+additional_layers=Լրացուցիչ շերտեր
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -212,7 +220,7 @@ error_line=Տողը. {{line}}
 rendering_error=Սխալ է տեղի ունեցել էջի մեկնաբանման ժամանակ
 
 # Predefined zoom values
-page_scale_width=Էջի լայնքը
+page_scale_width=Էջի լայնութիւն
 page_scale_fit=Հարմարեցնել էջը
 page_scale_auto=Ինքնաշխատ խոշորացում
 page_scale_actual=Իրական չափը
@@ -222,6 +230,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Սխալ
+
 loading_error=PDF նիշքը բացելիս սխալ է տեղի ունեցել։
 invalid_file_error=Սխալ կամ վնասուած PDF նիշք։
 missing_file_error=PDF նիշքը բացակաիւմ է։
diff --git a/third-party/pdfjs/web/locale/ia/viewer.properties 
b/third-party/pdfjs/web/locale/ia/viewer.properties
index 167547adc..4ae9850e6 100644
--- a/third-party/pdfjs/web/locale/ia/viewer.properties
+++ b/third-party/pdfjs/web/locale/ia/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancellar
 # tooltips)
 toggle_sidebar.title=Monstrar/celar le barra lateral
 toggle_sidebar_notification.title=Monstrar/celar le barra lateral (le documento contine 
structura/attachamentos)
+toggle_sidebar_notification2.title=Monstrar/celar le barra lateral (le documento contine 
structura/attachamentos/stratos)
 toggle_sidebar_label=Monstrar/celar le barra lateral
 document_outline.title=Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos)
 document_outline_label=Schema del documento
 attachments.title=Monstrar le annexos
 attachments_label=Annexos
+layers.title=Monstrar stratos (clicca duple pro remontar tote le stratos al stato predefinite)
+layers_label=Stratos
 thumbs.title=Monstrar le vignettes
 thumbs_label=Vignettes
+current_outline_item.title=Trovar le elemento de structura actual
+current_outline_item_label=Elemento de structura actual
 findbar.title=Cercar in le documento
 findbar_label=Cercar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pagina {{page}}
+
+additional_layers=Altere stratos
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pagina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -213,7 +222,7 @@ error_line=Linea: {{line}}
 rendering_error=Un error occurreva durante que on processava le pagina.
 
 # Predefined zoom values
-page_scale_width=Largessa pagina plen
+page_scale_width=Plen largor del pagina
 page_scale_fit=Pagina integre
 page_scale_auto=Zoom automatic
 page_scale_actual=Dimension actual
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Cargante…
 loading_error=Un error occurreva durante que on cargava le file PDF.
 invalid_file_error=File PDF corrumpite o non valide.
 missing_file_error=File PDF mancante.
diff --git a/third-party/pdfjs/web/locale/id/viewer.properties 
b/third-party/pdfjs/web/locale/id/viewer.properties
index b9b9a730b..2bdc8d566 100644
--- a/third-party/pdfjs/web/locale/id/viewer.properties
+++ b/third-party/pdfjs/web/locale/id/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Batalkan
 # tooltips)
 toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping
 toggle_sidebar_notification.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran)
+toggle_sidebar_notification2.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran/lapisan)
 toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping
 document_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)
 document_outline_label=Kerangka Dokumen
 attachments.title=Tampilkan Lampiran
 attachments_label=Lampiran
+layers.title=Tampilkan Lapisan (klik ganda untuk mengatur ulang semua lapisan ke keadaan baku)
+layers_label=Lapisan
 thumbs.title=Tampilkan Miniatur
 thumbs_label=Miniatur
+current_outline_item.title=Cari Butir Ikhtisar Saat Ini
+current_outline_item_label=Butir Ikhtisar Saat Ini
 findbar.title=Temukan di Dokumen
 findbar_label=Temukan
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Laman {{page}}
+
+additional_layers=Lapisan Tambahan
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Halaman {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Galat
+
+# Loading indicator messages
+loading=Memuat…
 loading_error=Galat terjadi saat memuat PDF.
 invalid_file_error=Berkas PDF tidak valid atau rusak.
 missing_file_error=Berkas PDF tidak ada.
diff --git a/third-party/pdfjs/web/locale/is/viewer.properties 
b/third-party/pdfjs/web/locale/is/viewer.properties
index 72dc8acd6..5fb4b0196 100644
--- a/third-party/pdfjs/web/locale/is/viewer.properties
+++ b/third-party/pdfjs/web/locale/is/viewer.properties
@@ -218,6 +218,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Villa
+
 loading_error=Villa kom upp við að hlaða inn PDF.
 invalid_file_error=Ógild eða skemmd PDF skrá.
 missing_file_error=Vantar PDF skrá.
diff --git a/third-party/pdfjs/web/locale/it/viewer.properties 
b/third-party/pdfjs/web/locale/it/viewer.properties
index 87c4050d8..325f697c9 100644
--- a/third-party/pdfjs/web/locale/it/viewer.properties
+++ b/third-party/pdfjs/web/locale/it/viewer.properties
@@ -114,17 +114,25 @@ print_progress_close = Annulla
 
 toggle_sidebar.title = Attiva/disattiva barra laterale
 toggle_sidebar_notification.title = Attiva/disattiva barra laterale (il documento contiene 
struttura/allegati)
+toggle_sidebar_notification2.title = Attiva/disattiva barra laterale (il documento contiene 
struttura/allegati/livelli)
 toggle_sidebar_label = Attiva/disattiva barra laterale
 document_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/comprimere 
tutti gli elementi)
 document_outline_label = Struttura documento
 attachments.title = Visualizza allegati
 attachments_label = Allegati
+layers.title = Visualizza livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito)
+layers_label = Livelli
 thumbs.title = Mostra le miniature
 thumbs_label = Miniature
+current_outline_item.title = Trova elemento struttura corrente
+current_outline_item_label = Elemento struttura corrente
 findbar.title = Trova nel documento
 findbar_label = Trova
 
 page_canvas = Pagina {{page}}
+
+additional_layers = Livelli aggiuntivi
+page_landmark = Pagina {{page}}
 thumb_page_title = Pagina {{page}}
 thumb_page_canvas = Miniatura della pagina {{page}}
 
@@ -171,6 +179,8 @@ page_scale_actual = Dimensioni effettive
 page_scale_percent = {{scale}}%
 
 loading_error_indicator = Errore
+
+loading = Caricamento in corso…
 loading_error = Si è verificato un errore durante il caricamento del PDF.
 invalid_file_error = File PDF non valido o danneggiato.
 missing_file_error = File PDF non disponibile.
diff --git a/third-party/pdfjs/web/locale/ja/viewer.properties 
b/third-party/pdfjs/web/locale/ja/viewer.properties
index 95732a07f..ac51fa7e7 100644
--- a/third-party/pdfjs/web/locale/ja/viewer.properties
+++ b/third-party/pdfjs/web/locale/ja/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=キャンセル
 # tooltips)
 toggle_sidebar.title=サイドバー表示を切り替えます
 toggle_sidebar_notification.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付)
+toggle_sidebar_notification2.title=サイドバー表示を切り替えます (文書に含まれるアウトライン / 添付 / レイヤー)
 toggle_sidebar_label=サイドバーの切り替え
 document_outline.title=文書の目次を表示します (ダブルクリックで項目を開閉します)
 document_outline_label=文書の目次
 attachments.title=添付ファイルを表示します
 attachments_label=添付ファイル
+layers.title=レイヤーを表示します (ダブルクリックですべてのレイヤーが初期状態に戻ります)
+layers_label=レイヤー
 thumbs.title=縮小版を表示します
 thumbs_label=縮小版
+current_outline_item.title=現在のアウトライン項目を検索
+current_outline_item_label=現在のアウトライン項目
 findbar.title=文書内を検索します
 findbar_label=検索
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}} ページ
+
+additional_layers=追加レイヤー
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}} ページ
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=エラー
+
+# Loading indicator messages
+loading=読み込み中...
 loading_error=PDF の読み込み中にエラーが発生しました。
 invalid_file_error=無効または破損した PDF ファイル。
 missing_file_error=PDF ファイルが見つかりません。
@@ -245,4 +257,6 @@ password_cancel=キャンセル
 printing_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません。
 printing_not_ready=警告: PDF を印刷するための読み込みが終了していません。
 web_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。
-document_colors_not_allowed=PDF 文書は、ウェブページが指定した配色を使用することができません: 'ウェブページが指定した配色' はブラウザーで無効になっています。
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
+unsupported_feature_signatures=この PDF ドキュメントは、デジタル署名が含まれています。署名の検証はサポートされていません。
diff --git a/third-party/pdfjs/web/locale/ka/viewer.properties 
b/third-party/pdfjs/web/locale/ka/viewer.properties
index 86e91bbd1..d6c32e8c2 100644
--- a/third-party/pdfjs/web/locale/ka/viewer.properties
+++ b/third-party/pdfjs/web/locale/ka/viewer.properties
@@ -91,18 +91,18 @@ document_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი)
 # will be replaced by the PDF file size in megabytes, respectively in bytes.
 document_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი)
 document_properties_title=სათაური:
-document_properties_author=შემდგენი:
+document_properties_author=შემქმნელი:
 document_properties_subject=თემა:
 document_properties_keywords=საკვანძო სიტყვები:
-document_properties_creation_date=შექმნის თარიღი:
-document_properties_modification_date=ჩასწორების თარიღი:
+document_properties_creation_date=შექმნის დრო:
+document_properties_modification_date=ჩასწორების დრო:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
 # will be replaced by the creation/modification date, and time, of the PDF file.
 document_properties_date_string={{date}}, {{time}}
-document_properties_creator=შემქმნელი:
-document_properties_producer=PDF-შემქმნელი:
+document_properties_creator=გამომშვები:
+document_properties_producer=PDF-გამომშვები:
 document_properties_version=PDF-ვერსია:
-document_properties_page_count=გვერდების რაოდენობა:
+document_properties_page_count=გვერდები:
 document_properties_page_size=გვერდის ზომა:
 document_properties_page_size_unit_inches=დუიმი
 document_properties_page_size_unit_millimeters=მმ
@@ -137,19 +137,28 @@ print_progress_close=გაუქმება
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
 toggle_sidebar.title=გვერდითა ზოლის გამოჩენა/დამალვა
-toggle_sidebar_notification.title=გვერდითა ზოლის ჩართვა/გამორთვა (დოკუმენტი შეიცავს სარჩევს/დანართს)
+toggle_sidebar_notification.title=გვერდითა ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს)
+toggle_sidebar_notification2.title=გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/ფენებს)
 toggle_sidebar_label=გვერდითა ზოლის გამოჩენა/დამალვა
-document_outline.title=დოკუმენტის სარჩევის ჩვენება (ორჯერ დაწკაპებით ყველა ელემენტის ჩამოშლა/აკეცვა)
+document_outline.title=დოკუმენტის სარჩევის ჩვენება (ორმაგი წკაპით თითოეულის ჩამოშლა/აკეცვა)
 document_outline_label=დოკუმენტის სარჩევი
 attachments.title=დანართების ჩვენება
 attachments_label=დანართები
+layers.title=ფენების გამოჩენა (ორმაგი წკაპით ყველა ფენის ნაგულისხმევზე დაბრუნება)
+layers_label=ფენები
 thumbs.title=შეთვალიერება
 thumbs_label=ესკიზები
+current_outline_item.title=მიმდინარე გვერდის მონახვა სარჩევში
+current_outline_item_label=მიმდინარე გვერდი სარჩევში
 findbar.title=პოვნა დოკუმენტში
 findbar_label=ძიება
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=გვერდი {{page}}
+
+additional_layers=დამატებითი ფენები
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=გვერდი {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=შეცდომა
+
+# Loading indicator messages
+loading=ჩატვირთვა…
 loading_error=შეცდომა, PDF-ფაილის ჩატვირთვისას.
 invalid_file_error=არამართებული ან დაზიანებული PDF-ფაილი.
 missing_file_error=ნაკლული PDF-ფაილი.
diff --git a/third-party/pdfjs/web/locale/kab/viewer.properties 
b/third-party/pdfjs/web/locale/kab/viewer.properties
index a6f07f169..a145dae07 100644
--- a/third-party/pdfjs/web/locale/kab/viewer.properties
+++ b/third-party/pdfjs/web/locale/kab/viewer.properties
@@ -39,7 +39,7 @@ open_file.title=Ldi Afaylu
 open_file_label=Ldi
 print.title=Siggez
 print_label=Siggez
-download.title=Sider
+download.title=Sader
 download_label=Azdam
 bookmark.title=Timeẓri tamirant (nɣel neɣ ldi ɣef usfaylu amaynut)
 bookmark_label=Askan amiran
@@ -102,7 +102,7 @@ document_properties_date_string={{date}}, {{time}}
 document_properties_creator=Yerna-t:
 document_properties_producer=Afecku n uselket PDF:
 document_properties_version=Lqem PDF:
-document_properties_page_count=Amḍan n isebtar:
+document_properties_page_count=Amḍan n yisebtar:
 document_properties_page_size=Tuγzi n usebter:
 document_properties_page_size_unit_inches=deg
 document_properties_page_size_unit_millimeters=mm
@@ -138,18 +138,27 @@ print_progress_close=Sefsex
 # tooltips)
 toggle_sidebar.title=Sken/Fer agalis adisan
 toggle_sidebar_notification.title=Ffer/Sken agalis adisan (isemli yegber aɣawas/imeddayen)
+toggle_sidebar_notification2.title=Ffer/Sekn agalis adisan (isemli yegber aɣawas/ticeqqufin yeddan/tissiwin)
 toggle_sidebar_label=Sken/Fer agalis adisan
 document_outline.title=Sken isemli (Senned snat tikal i wesemɣer/Afneẓ n iferdisen meṛṛa)
 document_outline_label=Isɣalen n isebtar
 attachments.title=Sken ticeqqufin yeddan
 attachments_label=Ticeqqufin yeddan
+layers.title=Skeen tissiwin (sit sin yiberdan i uwennez n meṛṛa tissiwin ɣer waddad amezwer)
+layers_label=Tissiwin
 thumbs.title=Sken tanfult.
 thumbs_label=Tinfulin
+current_outline_item.title=Af-d aferdis n uɣawas amiran
+current_outline_item_label=Aferdis n uɣawas amiran
 findbar.title=Nadi deg isemli
 findbar_label=Nadi
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Asebter {{page}}
+
+additional_layers=Tissiwin-nniḍen
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Asebter {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
+
+# Loading indicator messages
+loading=Asali…
 loading_error=Teḍra-d tuccḍa deg alluy n PDF:
 invalid_file_error=Afaylu PDF arameɣtu neɣ yexṣeṛ.
 missing_file_error=Ulac afaylu PDF.
diff --git a/third-party/pdfjs/web/locale/kk/viewer.properties 
b/third-party/pdfjs/web/locale/kk/viewer.properties
index afd679ac7..de41d9d4f 100644
--- a/third-party/pdfjs/web/locale/kk/viewer.properties
+++ b/third-party/pdfjs/web/locale/kk/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Бас тарту
 # tooltips)
 toggle_sidebar.title=Бүйір панелін көрсету/жасыру
 toggle_sidebar_notification.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар бар)
+toggle_sidebar_notification2.title=Бүйір панелін көрсету/жасыру (құжатта құрылымы/салынымдар/қабаттар бар)
 toggle_sidebar_label=Бүйір панелін көрсету/жасыру
 document_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек)
 document_outline_label=Құжат құрамасы
 attachments.title=Салынымдарды көрсету
 attachments_label=Салынымдар
+layers.title=Қабаттарды көрсету (барлық қабаттарды бастапқы күйге келтіру үшін екі рет шертіңіз)
+layers_label=Қабаттар
 thumbs.title=Кіші көріністерді көрсету
 thumbs_label=Кіші көріністер
+current_outline_item.title=Құрылымның ағымдағы элементін табу
+current_outline_item_label=Құрылымның ағымдағы элементі
 findbar.title=Құжаттан табу
 findbar_label=Табу
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Бет {{page}}
+
+additional_layers=Қосымша қабаттар
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Бет {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Қате
+
+# Loading indicator messages
+loading=Жүктелуде…
 loading_error=PDF жүктеу кезінде қате кетті.
 invalid_file_error=Зақымдалған немесе қате PDF файл.
 missing_file_error=PDF файлы жоқ.
diff --git a/third-party/pdfjs/web/locale/km/viewer.properties 
b/third-party/pdfjs/web/locale/km/viewer.properties
index 8615e8389..cce6a81ae 100644
--- a/third-party/pdfjs/web/locale/km/viewer.properties
+++ b/third-party/pdfjs/web/locale/km/viewer.properties
@@ -65,6 +65,8 @@ cursor_text_select_tool_label=ឧបករណ៍​ជ្រើស​អត្
 cursor_hand_tool.title=បើក​ឧបករណ៍​ដៃ
 cursor_hand_tool_label=ឧបករណ៍​ដៃ
 
+
+
 # Document properties dialog box
 document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…
 document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…
@@ -89,6 +91,25 @@ document_properties_creator=អ្នក​បង្កើត៖
 document_properties_producer=កម្មវិធី​បង្កើត PDF ៖
 document_properties_version=កំណែ PDF ៖
 document_properties_page_count=ចំនួន​ទំព័រ៖
+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=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=សំបុត្រ
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=បាទ/ចាស
+document_properties_linearized_no=ទេ
 document_properties_close=បិទ
 
 print_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព…
@@ -112,6 +133,7 @@ thumbs_label=រួបភាព​តូចៗ
 findbar.title=រក​នៅ​ក្នុង​ឯកសារ
 findbar_label=រក
 
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -131,6 +153,14 @@ find_highlight=បន្លិច​ទាំងអស់
 find_match_case_label=ករណី​ដំណូច
 find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ
 find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
 find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា
 
 # Error panel labels
@@ -163,11 +193,15 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=កំហុស
+
 loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។
 invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។
 missing_file_error=បាត់​ឯកសារ PDF
 unexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។
 
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+
 # LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
 # "{{type}}" will be replaced with an annotation type from a list defined in
 # the PDF spec (32000-1:2008 Table 169 – Annotation types).
diff --git a/third-party/pdfjs/web/locale/kn/viewer.properties 
b/third-party/pdfjs/web/locale/kn/viewer.properties
index b37a71c2e..19f23b5b8 100644
--- a/third-party/pdfjs/web/locale/kn/viewer.properties
+++ b/third-party/pdfjs/web/locale/kn/viewer.properties
@@ -172,6 +172,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=ದೋಷ
+
 loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.
 invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.
 missing_file_error=PDF ಕಡತ ಇಲ್ಲ.
diff --git a/third-party/pdfjs/web/locale/ko/viewer.properties 
b/third-party/pdfjs/web/locale/ko/viewer.properties
index 727f8d5c9..33172673a 100644
--- a/third-party/pdfjs/web/locale/ko/viewer.properties
+++ b/third-party/pdfjs/web/locale/ko/viewer.properties
@@ -69,14 +69,14 @@ scroll_vertical.title=세로 스크롤 사용
 scroll_vertical_label=세로 스크롤
 scroll_horizontal.title=가로 스크롤 사용
 scroll_horizontal_label=가로 스크롤
-scroll_wrapped.title=감싼 스크롤 사용
-scroll_wrapped_label=감싼 스크롤
+scroll_wrapped.title=래핑(자동 줄 바꿈) 스크롤 사용
+scroll_wrapped_label=래핑 스크롤
 
-spread_none.title=펼쳐진 페이지를 합치지 않음
+spread_none.title=한 페이지 보기
 spread_none_label=펼쳐짐 없음
-spread_odd.title=홀수 페이지로 시작하게 펼쳐진 페이지 합침
+spread_odd.title=홀수 페이지로 시작하는 두 페이지 보기
 spread_odd_label=홀수 펼쳐짐
-spread_even.title=짝수 페이지로 시작하게 펼쳐진 페이지 합침
+spread_even.title=짝수 페이지로 시작하는 두 페이지 보기
 spread_even_label=짝수 펼쳐짐
 
 # Document properties dialog box
@@ -138,18 +138,27 @@ print_progress_close=취소
 # tooltips)
 toggle_sidebar.title=탐색창 표시/숨기기
 toggle_sidebar_notification.title=탐색창 표시/숨기기 (문서에 아웃라인/첨부파일 포함됨)
+toggle_sidebar_notification2.title=탐색창 표시/숨기기 (문서에 아웃라인/첨부파일/레이어 포함됨)
 toggle_sidebar_label=탐색창 표시/숨기기
-document_outline.title=문서 아웃라인 보기(더블 클릭해서 모든 항목 펼치기/접기)
+document_outline.title=문서 아웃라인 보기 (더블 클릭해서 모든 항목 펼치기/접기)
 document_outline_label=문서 아웃라인
 attachments.title=첨부파일 보기
 attachments_label=첨부파일
+layers.title=레이어 보기 (더블 클릭해서 모든 레이어를 기본 상태로 재설정)
+layers_label=레이어
 thumbs.title=미리보기
 thumbs_label=미리보기
+current_outline_item.title=현재 아웃라인 항목 찾기
+current_outline_item_label=현재 아웃라인 항목
 findbar.title=검색
 findbar_label=검색
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}} 페이지
+
+additional_layers=추가 레이어
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}} 페이지
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -213,16 +222,19 @@ error_line=줄 번호: {{line}}
 rendering_error=페이지를 렌더링하는 동안 오류가 발생했습니다.
 
 # Predefined zoom values
-page_scale_width=페이지 너비에 맞춤
-page_scale_fit=페이지에 맞춤
-page_scale_auto=자동 맞춤
-page_scale_actual=실제 크기에 맞춤
+page_scale_width=페이지 너비에 맞추기
+page_scale_fit=페이지에 맞추기
+page_scale_auto=자동
+page_scale_actual=실제 크기
 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
 # numerical scale value.
 page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=오류
+
+# Loading indicator messages
+loading=로드 중…
 loading_error=PDF를 로드하는 동안 오류가 발생했습니다.
 invalid_file_error=잘못되었거나 손상된 PDF 파일.
 missing_file_error=PDF 파일 없음.
diff --git a/third-party/pdfjs/web/locale/lij/viewer.properties 
b/third-party/pdfjs/web/locale/lij/viewer.properties
index 0cfa7d27f..c1d8757a8 100644
--- a/third-party/pdfjs/web/locale/lij/viewer.properties
+++ b/third-party/pdfjs/web/locale/lij/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Erô
+
 loading_error=S'é verificou 'n'erô itno caregamento do PDF.
 invalid_file_error=O schedaio PDF o l'é no valido ò aroinou.
 missing_file_error=O schedaio PDF o no gh'é.
diff --git a/third-party/pdfjs/web/locale/lo/viewer.properties 
b/third-party/pdfjs/web/locale/lo/viewer.properties
index 00d3309c0..d21a687fa 100644
--- a/third-party/pdfjs/web/locale/lo/viewer.properties
+++ b/third-party/pdfjs/web/locale/lo/viewer.properties
@@ -140,6 +140,7 @@ rendering_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະ
 
 # Loading indicator messages
 loading_error_indicator=ຂໍ້ຜິດພາດ
+
 loading_error=ມີຂໍ້ຜິດພາດເກີດຂື້ນຂະນະທີ່ກຳລັງໂຫລດ PDF.
 invalid_file_error=ໄຟລ໌ PDF ບໍ່ຖືກຕ້ອງຫລືເສຍຫາຍ.
 
diff --git a/third-party/pdfjs/web/locale/locale.properties b/third-party/pdfjs/web/locale/locale.properties
index 372dd5d32..6be6adfb2 100644
--- a/third-party/pdfjs/web/locale/locale.properties
+++ b/third-party/pdfjs/web/locale/locale.properties
@@ -247,6 +247,9 @@
 [scn]
 @import url(scn/viewer.properties)
 
+[sco]
+@import url(sco/viewer.properties)
+
 [si]
 @import url(si/viewer.properties)
 
@@ -277,6 +280,9 @@
 [te]
 @import url(te/viewer.properties)
 
+[tg]
+@import url(tg/viewer.properties)
+
 [th]
 @import url(th/viewer.properties)
 
diff --git a/third-party/pdfjs/web/locale/lt/viewer.properties 
b/third-party/pdfjs/web/locale/lt/viewer.properties
index daa76787c..78158fd3a 100644
--- a/third-party/pdfjs/web/locale/lt/viewer.properties
+++ b/third-party/pdfjs/web/locale/lt/viewer.properties
@@ -72,12 +72,12 @@ scroll_horizontal_label=Horizontalus slinkimas
 scroll_wrapped.title=Naudoti išklotą slinkimą
 scroll_wrapped_label=Išklotas slinkimas
 
-spread_none.title=Nesujungti puslapių sklaidų
-spread_none_label=Be sklaidų
-spread_odd.title=Sujungti puslapių sklaidas pradedant nelyginiais puslapiais
-spread_odd_label=Nelyginės sklaidos
-spread_even.title=Sujungti puslapių sklaidas pradedant lyginiais puslapiais
-spread_even_label=Lyginės sklaidos
+spread_none.title=Nejungti puslapių į dvilapius
+spread_none_label=Be dvilapių
+spread_odd.title=Sujungti į dvilapius pradedant nelyginiais puslapiais
+spread_odd_label=Nelyginiai dvilapiai
+spread_even.title=Sujungti į dvilapius pradedant lyginiais puslapiais
+spread_even_label=Lyginiai dvilapiai
 
 # Document properties dialog box
 document_properties.title=Dokumento savybės…
@@ -138,18 +138,27 @@ print_progress_close=Atsisakyti
 # tooltips)
 toggle_sidebar.title=Rodyti / slėpti šoninį polangį
 toggle_sidebar_notification.title=Parankinė (dokumentas turi struktūrą / priedų)
+toggle_sidebar_notification2.title=Parankinė (dokumentas turi struktūrą / priedų / sluoksnių)
 toggle_sidebar_label=Šoninis polangis
 document_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus 
elementus)
 document_outline_label=Dokumento struktūra
 attachments.title=Rodyti priedus
 attachments_label=Priedai
+layers.title=Rodyti sluoksnius (spustelėkite dukart, norėdami atstatyti visus sluoksnius į numatytąją būseną)
+layers_label=Sluoksniai
 thumbs.title=Rodyti puslapių miniatiūras
 thumbs_label=Miniatiūros
+current_outline_item.title=Rasti dabartinį struktūros elementą
+current_outline_item_label=Dabartinis struktūros elementas
 findbar.title=Ieškoti dokumente
 findbar_label=Rasti
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}} puslapis
+
+additional_layers=Papildomi sluoksniai
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}} puslapis
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Klaida
+
+# Loading indicator messages
+loading=Įkeliama…
 loading_error=Įkeliant PDF failą įvyko klaida.
 invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.
 missing_file_error=PDF failas nerastas.
diff --git a/third-party/pdfjs/web/locale/ltg/viewer.properties 
b/third-party/pdfjs/web/locale/ltg/viewer.properties
index 4fffa864d..277aab56c 100644
--- a/third-party/pdfjs/web/locale/ltg/viewer.properties
+++ b/third-party/pdfjs/web/locale/ltg/viewer.properties
@@ -199,6 +199,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Klaida
+
 loading_error=Īluodejūt PDF nūtyka klaida.
 invalid_file_error=Nadereigs voi būjuots PDF fails.
 missing_file_error=PDF fails nav atrosts.
diff --git a/third-party/pdfjs/web/locale/lv/viewer.properties 
b/third-party/pdfjs/web/locale/lv/viewer.properties
index b6d6ad38f..d6f89984d 100644
--- a/third-party/pdfjs/web/locale/lv/viewer.properties
+++ b/third-party/pdfjs/web/locale/lv/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Kļūda
+
 loading_error=Ielādējot PDF notika kļūda.
 invalid_file_error=Nederīgs vai bojāts PDF fails.
 missing_file_error=PDF fails nav atrasts.
diff --git a/third-party/pdfjs/web/locale/mk/viewer.properties 
b/third-party/pdfjs/web/locale/mk/viewer.properties
index c1b091ed6..b6bb2f11b 100644
--- a/third-party/pdfjs/web/locale/mk/viewer.properties
+++ b/third-party/pdfjs/web/locale/mk/viewer.properties
@@ -129,6 +129,7 @@ page_scale_actual=Вистинска големина
 
 # Loading indicator messages
 loading_error_indicator=Грешка
+
 loading_error=Настана грешка при вчитувањето на PDF-от.
 invalid_file_error=Невалидна или корумпирана PDF датотека.
 missing_file_error=Недостасува PDF документ.
diff --git a/third-party/pdfjs/web/locale/mr/viewer.properties 
b/third-party/pdfjs/web/locale/mr/viewer.properties
index b33646f51..0b2bd93bc 100644
--- a/third-party/pdfjs/web/locale/mr/viewer.properties
+++ b/third-party/pdfjs/web/locale/mr/viewer.properties
@@ -213,6 +213,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=त्रुटी
+
 loading_error=PDF लोड करतेवेळी त्रुटी आढळली.
 invalid_file_error=अवैध किंवा दोषीत PDF फाइल.
 missing_file_error=न आढळणारी PDF फाइल.
diff --git a/third-party/pdfjs/web/locale/ms/viewer.properties 
b/third-party/pdfjs/web/locale/ms/viewer.properties
index 61f155397..6ca482beb 100644
--- a/third-party/pdfjs/web/locale/ms/viewer.properties
+++ b/third-party/pdfjs/web/locale/ms/viewer.properties
@@ -221,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Ralat
+
 loading_error=Masalah berlaku semasa menuatkan sebuah PDF.
 invalid_file_error=Tidak sah atau fail PDF rosak.
 missing_file_error=Fail PDF Hilang.
diff --git a/third-party/pdfjs/web/locale/my/viewer.properties 
b/third-party/pdfjs/web/locale/my/viewer.properties
index 3e6f2c305..7fc26092f 100644
--- a/third-party/pdfjs/web/locale/my/viewer.properties
+++ b/third-party/pdfjs/web/locale/my/viewer.properties
@@ -177,6 +177,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=အမှား
+
 loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။
 invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်
 missing_file_error=PDF ပျောက်ဆုံး
diff --git a/third-party/pdfjs/web/locale/nb-NO/viewer.properties 
b/third-party/pdfjs/web/locale/nb-NO/viewer.properties
index 47b209048..3555c04b6 100644
--- a/third-party/pdfjs/web/locale/nb-NO/viewer.properties
+++ b/third-party/pdfjs/web/locale/nb-NO/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Avbryt
 # tooltips)
 toggle_sidebar.title=Slå av/på sidestolpe
 toggle_sidebar_notification.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg)
+toggle_sidebar_notification2.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg/lag)
 toggle_sidebar_label=Slå av/på sidestolpe
 document_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer)
 document_outline_label=Dokumentdisposisjon
 attachments.title=Vis vedlegg
 attachments_label=Vedlegg
+layers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand)
+layers_label=Lag
 thumbs.title=Vis miniatyrbilde
 thumbs_label=Miniatyrbilde
+current_outline_item.title=Finn gjeldende disposisjonselement
+current_outline_item_label=Gjeldende disposisjonselement
 findbar.title=Finn i dokumentet
 findbar_label=Finn
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Side {{page}}
+
+additional_layers=Ytterligere lag
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Side {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Feil
+
+# Loading indicator messages
+loading=Laster…
 loading_error=En feil oppstod ved lasting av PDF.
 invalid_file_error=Ugyldig eller skadet PDF-fil.
 missing_file_error=Manglende PDF-fil.
diff --git a/third-party/pdfjs/web/locale/ne-NP/viewer.properties 
b/third-party/pdfjs/web/locale/ne-NP/viewer.properties
index 3bf8ed8f3..4232c56a6 100644
--- a/third-party/pdfjs/web/locale/ne-NP/viewer.properties
+++ b/third-party/pdfjs/web/locale/ne-NP/viewer.properties
@@ -163,6 +163,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=त्रुटि
+
 loading_error=यो PDF लोड गर्दा एउटा त्रुटि देखापर्‍यो।
 invalid_file_error=अवैध वा दुषित PDF फाइल।
 missing_file_error=हराईरहेको PDF फाइल।
diff --git a/third-party/pdfjs/web/locale/nl/viewer.properties 
b/third-party/pdfjs/web/locale/nl/viewer.properties
index b37f1abf5..fd19d6c81 100644
--- a/third-party/pdfjs/web/locale/nl/viewer.properties
+++ b/third-party/pdfjs/web/locale/nl/viewer.properties
@@ -93,7 +93,7 @@ document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
 document_properties_title=Titel:
 document_properties_author=Auteur:
 document_properties_subject=Onderwerp:
-document_properties_keywords=Trefwoorden:
+document_properties_keywords=Sleutelwoorden:
 document_properties_creation_date=Aanmaakdatum:
 document_properties_modification_date=Wijzigingsdatum:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
@@ -138,18 +138,27 @@ print_progress_close=Annuleren
 # tooltips)
 toggle_sidebar.title=Zijbalk in-/uitschakelen
 toggle_sidebar_notification.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen)
+toggle_sidebar_notification2.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen/lagen)
 toggle_sidebar_label=Zijbalk in-/uitschakelen
 document_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)
 document_outline_label=Documentoverzicht
 attachments.title=Bijlagen tonen
 attachments_label=Bijlagen
+layers.title=Lagen tonen (dubbelklik om alle lagen naar de standaardstatus terug te zetten)
+layers_label=Lagen
 thumbs.title=Miniaturen tonen
 thumbs_label=Miniaturen
+current_outline_item.title=Huidig item in inhoudsopgave zoeken
+current_outline_item_label=Huidig item in inhoudsopgave
 findbar.title=Zoeken in document
 findbar_label=Zoeken
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pagina {{page}}
+
+additional_layers=Aanvullende lagen
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pagina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fout
+
+# Loading indicator messages
+loading=Laden…
 loading_error=Er is een fout opgetreden bij het laden van de PDF.
 invalid_file_error=Ongeldig of beschadigd PDF-bestand.
 missing_file_error=PDF-bestand ontbreekt. 
diff --git a/third-party/pdfjs/web/locale/nn-NO/viewer.properties 
b/third-party/pdfjs/web/locale/nn-NO/viewer.properties
index c9bac1010..0e228c31c 100644
--- a/third-party/pdfjs/web/locale/nn-NO/viewer.properties
+++ b/third-party/pdfjs/web/locale/nn-NO/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Avbryt
 # tooltips)
 toggle_sidebar.title=Slå av/på sidestolpe
 toggle_sidebar_notification.title=Vis/gøym sidestolpen (dokumentet inneheld oversikt/vedlegg)
+toggle_sidebar_notification2.title=Vis/gøym sidestolpe (dokumentet inneheld oversikt/vedlegg/lag)
 toggle_sidebar_label=Slå av/på sidestolpe
 document_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvide/gøyme alle elementa)
 document_outline_label=Dokumentdisposisjon
 attachments.title=Vis vedlegg
 attachments_label=Vedlegg
+layers.title=Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand)
+layers_label=Lag
 thumbs.title=Vis miniatyrbilde
 thumbs_label=Miniatyrbilde
+current_outline_item.title=Finn gjeldande disposisjonselement
+current_outline_item_label=Gjeldande disposisjonselement
 findbar.title=Finn i dokumentet
 findbar_label=Finn
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Side {{page}}
+
+additional_layers=Ytterlegare lag
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Side {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Feil
+
+# Loading indicator messages
+loading=Lastar…
 loading_error=Ein feil oppstod ved lasting av PDF.
 invalid_file_error=Ugyldig eller korrupt PDF-fil.
 missing_file_error=Manglande PDF-fil.
diff --git a/third-party/pdfjs/web/locale/oc/viewer.properties 
b/third-party/pdfjs/web/locale/oc/viewer.properties
index b1c6a3a0c..80348ab8d 100644
--- a/third-party/pdfjs/web/locale/oc/viewer.properties
+++ b/third-party/pdfjs/web/locale/oc/viewer.properties
@@ -26,7 +26,7 @@ of_pages=sus {{pagesCount}}
 # LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
 # will be replaced by a number representing the currently visible page,
 # respectively a number representing the total number of pages in the document.
-page_of_pages=({{pageNumber}} sus {{pagesCount}})
+page_of_pages=({{pageNumber}} de {{pagesCount}})
 
 zoom_out.title=Zoom arrièr
 zoom_out_label=Zoom arrièr
@@ -106,7 +106,7 @@ document_properties_page_count=Nombre de paginas :
 document_properties_page_size=Talha de la pagina :
 document_properties_page_size_unit_inches=in
 document_properties_page_size_unit_millimeters=mm
-document_properties_page_size_orientation_portrait=retrait
+document_properties_page_size_orientation_portrait=retrach
 document_properties_page_size_orientation_landscape=païsatge
 document_properties_page_size_name_a3=A3
 document_properties_page_size_name_a4=A4
@@ -138,18 +138,27 @@ print_progress_close=Anullar
 # tooltips)
 toggle_sidebar.title=Afichar/amagar lo panèl lateral
 toggle_sidebar_notification.title=Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças juntas)
+toggle_sidebar_notification2.title=Afichar/amagar lo panèl lateral (lo document conten esquèmas/pèças 
juntas/calques)
 toggle_sidebar_label=Afichar/amagar lo panèl lateral
 document_outline.title=Mostrar los esquèmas del document (dobleclicar per espandre/reduire totes los 
elements)
 document_outline_label=Marcapaginas del document
 attachments.title=Visualizar las pèças juntas
 attachments_label=Pèças juntas
+layers.title=Afichar los calques (doble-clicar per reïnicializar totes los calques a l’estat per defaut)
+layers_label=Calques
 thumbs.title=Afichar las vinhetas
 thumbs_label=Vinhetas
+current_outline_item.title=Trobar l’element de plan actual
+current_outline_item_label=Element de plan actual
 findbar.title=Cercar dins lo document
 findbar_label=Recercar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pagina {{page}}
+
+additional_layers=Calques suplementaris
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pagina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -176,21 +185,21 @@ find_reached_bottom=Bas de la pagina atench, perseguida al començament
 # index of the currently active find result, respectively a number representing
 # the total number of matches in the document.
 find_match_count={[ plural(total) ]}
-find_match_count[one]=Occuréncia {{current}} sus {{total}}
-find_match_count[two]=Occuréncia {{current}} sus {{total}}
-find_match_count[few]=Occuréncia {{current}} sus {{total}}
-find_match_count[many]=Occuréncia {{current}} sus {{total}}
-find_match_count[other]=Occuréncia {{current}} sus {{total}}
+find_match_count[one]=Ocuréncia {{current}} sus {{total}}
+find_match_count[two]=Ocuréncia {{current}} sus {{total}}
+find_match_count[few]=Ocuréncia {{current}} sus {{total}}
+find_match_count[many]=Ocuréncia {{current}} sus {{total}}
+find_match_count[other]=Ocuréncia {{current}} sus {{total}}
 # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
 # [zero|one|two|few|many|other], with [other] as the default value.
 # "{{limit}}" will be replaced by a numerical value.
 find_match_count_limit={[ plural(limit) ]}
-find_match_count_limit[zero]=Mai de {{limit}} occuréncias
-find_match_count_limit[one]=Mai de {{limit}} occuréncia
-find_match_count_limit[two]=Mai de {{limit}} occuréncias
-find_match_count_limit[few]=Mai de {{limit}} occuréncias
-find_match_count_limit[many]=Mai de {{limit}} occuréncias
-find_match_count_limit[other]=Mai de {{limit}} occuréncias
+find_match_count_limit[zero]=Mai de {{limit}} ocuréncias
+find_match_count_limit[one]=Mai de {{limit}} ocuréncia
+find_match_count_limit[two]=Mai de {{limit}} ocuréncias
+find_match_count_limit[few]=Mai de {{limit}} ocuréncias
+find_match_count_limit[many]=Mai de {{limit}} ocuréncias
+find_match_count_limit[other]=Mai de {{limit}} ocuréncias
 find_not_found=Frasa pas trobada
 
 # Error panel labels
@@ -210,7 +219,7 @@ error_stack=Pila : {{stack}}
 error_file=Fichièr : {{file}}
 # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
 error_line=Linha : {{line}}
-rendering_error=Una error s'es produita pendent l'afichatge de la pagina.
+rendering_error=Una error s'es producha pendent l'afichatge de la pagina.
 
 # Predefined zoom values
 page_scale_width=Largor plena
@@ -223,7 +232,10 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
-loading_error=Una error s'es produita pendent lo cargament del fichièr PDF.
+
+# Loading indicator messages
+loading=Cargament…
+loading_error=Una error s'es producha pendent lo cargament del fichièr PDF.
 invalid_file_error=Fichièr PDF invalid o corromput.
 missing_file_error=Fichièr PDF mancant.
 unexpected_response_error=Responsa de servidor imprevista.
diff --git a/third-party/pdfjs/web/locale/pa-IN/viewer.properties 
b/third-party/pdfjs/web/locale/pa-IN/viewer.properties
index 0ab56319e..010db9942 100644
--- a/third-party/pdfjs/web/locale/pa-IN/viewer.properties
+++ b/third-party/pdfjs/web/locale/pa-IN/viewer.properties
@@ -74,8 +74,10 @@ scroll_wrapped_label=ਸਮੇਟਿਆ ਸਰਕਾਉਣਾ
 
 spread_none.title=ਸਫ਼ਾ ਫੈਲਾਅ ਵਿੱਚ ਸ਼ਾਮਲ ਨਾ ਹੋਵੋ
 spread_none_label=ਕੋਈ ਫੈਲਾਅ ਨਹੀਂ
-spread_odd.title=ਅਜੀਬ-ਨੰਬਰ ਵਾਲੇ ਪੰਨਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਪੰਨੇ ਸਪਰਸ਼ਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ
-spread_even.title=ਜਿਸਤ ਨੰਬਰ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ
+spread_odd.title=ਟਾਂਕ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ
+spread_odd_label=ਟਾਂਕ ਫੈਲਾਅ
+spread_even.title=ਜਿਸਤ ਅੰਕ ਵਾਲੇ ਸਫ਼ਿਆਂ ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੇ ਸਫਿਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ
+spread_even_label=ਜਿਸਤ ਫੈਲਾਅ
 
 # Document properties dialog box
 document_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ
@@ -136,18 +138,27 @@ print_progress_close=ਰੱਦ ਕਰੋ
 # tooltips)
 toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ
 toggle_sidebar_notification.title=ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟਾਂ ਰੱਖਦਾ ਹੈ)
+toggle_sidebar_notification2.title=ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਖਾਕਾ/ਅਟੈਚਮੈਂਟ/ਪਰਤਾਂ ਰੱਖਦਾ ਹੈ)
 toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ
 document_outline.title=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ ਦਿਖਾਓ (ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਫੈਲਾਉਣ/ਸਮੇਟਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ)
 document_outline_label=ਦਸਤਾਵੇਜ਼ ਖਾਕਾ
 attachments.title=ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ
 attachments_label=ਅਟੈਚਮੈਂਟਾਂ
+layers.title=ਪਰਤਾਂ ਵੇਖਾਓ (ਸਾਰੀਆਂ ਪਰਤਾਂ ਨੂੰ ਮੂਲ ਹਾਲਤ ਉੱਤੇ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ)
+layers_label=ਪਰਤਾਂ
 thumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ
 thumbs_label=ਥੰਮਨੇਲ
+current_outline_item.title=ਮੌੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼ ਲੱਭੋ
+current_outline_item_label=ਮੌਜੂਦਾ ਖਾਕਾ ਚੀਜ਼
 findbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ
 findbar_label=ਲੱਭੋ
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=ਸਫ਼ਾ {{page}}
+
+additional_layers=ਵਾਧੂ ਪਰਤਾਂ
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=ਸਫ਼ਾ {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -221,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=ਗਲਤੀ
+
+# Loading indicator messages
+loading=…ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ
 loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।
 invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ।
 missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ।
diff --git a/third-party/pdfjs/web/locale/pl/viewer.properties 
b/third-party/pdfjs/web/locale/pl/viewer.properties
index cf170c8d2..83be380af 100644
--- a/third-party/pdfjs/web/locale/pl/viewer.properties
+++ b/third-party/pdfjs/web/locale/pl/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Anuluj
 # tooltips)
 toggle_sidebar.title=Przełącz panel boczny
 toggle_sidebar_notification.title=Przełącz panel boczny (dokument zawiera konspekt/załączniki)
+toggle_sidebar_notification2.title=Przełącz panel boczny (dokument zawiera konspekt/załączniki/warstwy)
 toggle_sidebar_label=Przełącz panel boczny
 document_outline.title=Konspekt dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje)
 document_outline_label=Konspekt dokumentu
 attachments.title=Załączniki
 attachments_label=Załączniki
+layers.title=Warstwy (podwójne kliknięcie przywraca wszystkie warstwy do stanu domyślnego)
+layers_label=Warstwy
 thumbs.title=Miniatury
 thumbs_label=Miniatury
+current_outline_item.title=Znajdź bieżący element konspektu
+current_outline_item_label=Bieżący element konspektu
 findbar.title=Znajdź w dokumencie
 findbar_label=Znajdź
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas={{page}}. strona
+
+additional_layers=Dodatkowe warstwy
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark={{page}}. strona
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Błąd
+
+# Loading indicator messages
+loading=Wczytywanie…
 loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.
 invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.
 missing_file_error=Brak pliku PDF.
diff --git a/third-party/pdfjs/web/locale/pt-BR/viewer.properties 
b/third-party/pdfjs/web/locale/pt-BR/viewer.properties
index ca592b8f1..8a0884da8 100644
--- a/third-party/pdfjs/web/locale/pt-BR/viewer.properties
+++ b/third-party/pdfjs/web/locale/pt-BR/viewer.properties
@@ -39,8 +39,8 @@ open_file.title=Abrir arquivo
 open_file_label=Abrir
 print.title=Imprimir
 print_label=Imprimir
-download.title=Download
-download_label=Download
+download.title=Baixar
+download_label=Baixar
 bookmark.title=Visão atual (copiar ou abrir em nova janela)
 bookmark_label=Visualização atual
 
@@ -62,15 +62,15 @@ page_rotate_ccw_label=Girar no sentido anti-horário
 
 cursor_text_select_tool.title=Ativar a ferramenta de seleção de texto
 cursor_text_select_tool_label=Ferramenta de seleção de texto
-cursor_hand_tool.title=Ativar ferramenta de mão
-cursor_hand_tool_label=Ferramenta de mão
+cursor_hand_tool.title=Ativar ferramenta de deslocamento
+cursor_hand_tool_label=Ferramenta de deslocamento
 
-scroll_vertical.title=Usar rolagem vertical
-scroll_vertical_label=Rolagem vertical
-scroll_horizontal.title=Usar rolagem horizontal
-scroll_horizontal_label=Rolagem horizontal
-scroll_wrapped.title=Usar rolagem contida
-scroll_wrapped_label=Rolagem contida
+scroll_vertical.title=Usar deslocamento vertical
+scroll_vertical_label=Deslocamento vertical
+scroll_horizontal.title=Usar deslocamento horizontal
+scroll_horizontal_label=Deslocamento horizontal
+scroll_wrapped.title=Usar deslocamento contido
+scroll_wrapped_label=Deslocamento contido
 
 spread_none.title=Não reagrupar páginas
 spread_none_label=Não estender
@@ -122,7 +122,7 @@ document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}
 document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
 # LOCALIZATION NOTE (document_properties_linearized): The linearization status of
 # the document; usually called "Fast Web View" in English locales of Adobe software.
-document_properties_linearized=Visualização rápida da Web:
+document_properties_linearized=Exibição web rápida:
 document_properties_linearized_yes=Sim
 document_properties_linearized_no=Não
 document_properties_close=Fechar
@@ -136,20 +136,29 @@ print_progress_close=Cancelar
 # Tooltips and alt text for side panel toolbar buttons
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
-toggle_sidebar.title=Alternar painel
-toggle_sidebar_notification.title=Alternar o painel (documento contém marcadores e anexos)
-toggle_sidebar_label=Alternar painel
-document_outline.title=Mostrar a estrutura do documento (duplo-clique para expandir/recolher todos os ítens)
+toggle_sidebar.title=Exibir/ocultar painel lateral
+toggle_sidebar_notification.title=Exibir/ocultar painel lateral (documento contém estrutura/anexos)
+toggle_sidebar_notification2.title=Exibir/ocultar painel (documento contém estrutura/anexos/camadas)
+toggle_sidebar_label=Exibir/ocultar painel
+document_outline.title=Mostrar a estrutura do documento (dê um duplo-clique para expandir/recolher todos os 
itens)
 document_outline_label=Estrutura do documento
 attachments.title=Mostrar anexos
 attachments_label=Anexos
+layers.title=Exibir camadas (duplo-clique para redefinir todas as camadas ao estado predefinido)
+layers_label=Camadas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Encontrar item atual da estrutura
+current_outline_item_label=Item atual da estrutura
 findbar.title=Procurar no documento
 findbar_label=Procurar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Camadas adicionais
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Erro
+
+# Loading indicator messages
+loading=Carregando…
 loading_error=Ocorreu um erro ao carregar o PDF.
 invalid_file_error=Arquivo PDF corrompido ou inválido.
 missing_file_error=Arquivo PDF ausente.
diff --git a/third-party/pdfjs/web/locale/pt-PT/viewer.properties 
b/third-party/pdfjs/web/locale/pt-PT/viewer.properties
index 57f481416..1a5e60df9 100644
--- a/third-party/pdfjs/web/locale/pt-PT/viewer.properties
+++ b/third-party/pdfjs/web/locale/pt-PT/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Cancelar
 # tooltips)
 toggle_sidebar.title=Alternar barra lateral
 toggle_sidebar_notification.title=Alternar barra lateral (documento contém contorno/anexos)
+toggle_sidebar_notification2.title=Alternar barra lateral (o documento contém contornos/anexos/camadas)
 toggle_sidebar_label=Alternar barra lateral
 document_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)
 document_outline_label=Esquema do documento
 attachments.title=Mostrar anexos
 attachments_label=Anexos
+layers.title=Mostrar camadas (clique duas vezes para repor todas as camadas para o estado predefinido)
+layers_label=Camadas
 thumbs.title=Mostrar miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Encontrar o item atualmente destacado
+current_outline_item_label=Item atualmente destacado
 findbar.title=Localizar em documento
 findbar_label=Localizar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Página {{page}}
+
+additional_layers=Camadas adicionais
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Página {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Erro
+
+# Loading indicator messages
+loading=A carregar…
 loading_error=Ocorreu um erro ao carregar o PDF.
 invalid_file_error=Ficheiro PDF inválido ou danificado.
 missing_file_error=Ficheiro PDF inexistente.
diff --git a/third-party/pdfjs/web/locale/rm/viewer.properties 
b/third-party/pdfjs/web/locale/rm/viewer.properties
index 8c8cab892..fc4a9e112 100644
--- a/third-party/pdfjs/web/locale/rm/viewer.properties
+++ b/third-party/pdfjs/web/locale/rm/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Interrumper
 # tooltips)
 toggle_sidebar.title=Activar/deactivar la trav laterala
 toggle_sidebar_notification.title=Activar/deactivar la trav laterala (structura dal document/agiuntas)
+toggle_sidebar_notification2.title=Activar/deactivar la trav laterala (il document cuntegna structura dal 
document/agiuntas/nivels)
 toggle_sidebar_label=Activar/deactivar la trav laterala
 document_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils 
elements)
 document_outline_label=Structura dal document
 attachments.title=Mussar agiuntas
 attachments_label=Agiuntas
+layers.title=Mussar ils nivels (cliccar dubel per restaurar il stadi da standard da tut ils nivels)
+layers_label=Nivels
 thumbs.title=Mussar las miniaturas
 thumbs_label=Miniaturas
+current_outline_item.title=Tschertgar l'element da structura actual
+current_outline_item_label=Element da structura actual
 findbar.title=Tschertgar en il document
 findbar_label=Tschertgar
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pagina {{page}}
+
+additional_layers=Nivels supplementars
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Pagina {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Errur
+
+# Loading indicator messages
+loading=Chargiar…
 loading_error=Ina errur è cumparida cun chargiar il PDF.
 invalid_file_error=Datoteca PDF nunvalida u donnegiada.
 missing_file_error=Datoteca PDF manconta.
diff --git a/third-party/pdfjs/web/locale/ro/viewer.properties 
b/third-party/pdfjs/web/locale/ro/viewer.properties
index 0e4fbf70e..2e580f0d3 100644
--- a/third-party/pdfjs/web/locale/ro/viewer.properties
+++ b/third-party/pdfjs/web/locale/ro/viewer.properties
@@ -150,6 +150,7 @@ findbar_label=Caută
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pagina {{page}}
+
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +224,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Eroare
+
 loading_error=A intervenit o eroare la încărcarea PDF-ului.
 invalid_file_error=Fișier PDF nevalid sau corupt.
 missing_file_error=Fișier PDF lipsă.
diff --git a/third-party/pdfjs/web/locale/ru/viewer.properties 
b/third-party/pdfjs/web/locale/ru/viewer.properties
index dd4ee4810..402e0e5c3 100644
--- a/third-party/pdfjs/web/locale/ru/viewer.properties
+++ b/third-party/pdfjs/web/locale/ru/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Отмена
 # tooltips)
 toggle_sidebar.title=Показать/скрыть боковую панель
 toggle_sidebar_notification.title=Показать/скрыть боковую панель (документ имеет содержание/вложения)
+toggle_sidebar_notification2.title=Показать/скрыть боковую панель (документ имеет содержание/вложения/слои)
 toggle_sidebar_label=Показать/скрыть боковую панель
 document_outline.title=Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы)
 document_outline_label=Содержание документа
 attachments.title=Показать вложения
 attachments_label=Вложения
+layers.title=Показать слои (дважды щёлкните, чтобы сбросить все слои к состоянию по умолчанию)
+layers_label=Слои
 thumbs.title=Показать миниатюры
 thumbs_label=Миниатюры
+current_outline_item.title=Найти текущий элемент структуры
+current_outline_item_label=Текущий элемент структуры
 findbar.title=Найти в документе
 findbar_label=Найти
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Страница {{page}}
+
+additional_layers=Дополнительные слои
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Страница {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Ошибка
+
+# Loading indicator messages
+loading=Загрузка…
 loading_error=При загрузке PDF произошла ошибка.
 invalid_file_error=Некорректный или повреждённый PDF-файл.
 missing_file_error=PDF-файл отсутствует.
@@ -244,4 +256,4 @@ password_cancel=Отмена
 
 printing_not_supported=Предупреждение: В этом браузере не полностью поддерживается печать.
 printing_not_ready=Предупреждение: PDF не полностью загружен для печати.
-web_fonts_disabled=Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.
+web_fonts_disabled=Веб-шрифты отключены: не удалось задействовать встроенные PDF-шрифты.
diff --git a/third-party/pdfjs/web/locale/sco/viewer.properties 
b/third-party/pdfjs/web/locale/sco/viewer.properties
new file mode 100644
index 000000000..d101f28fb
--- /dev/null
+++ b/third-party/pdfjs/web/locale/sco/viewer.properties
@@ -0,0 +1,259 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Page Afore
+previous_label=Previous
+next.title=Page Efter
+next_label=Neist
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Page
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=o {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} o {{pagesCount}})
+
+zoom_out.title=Zoom Oot
+zoom_out_label=Zoom Oot
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Flit tae Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Prent
+print_label=Prent
+download.title=Doonload
+download_label=Doonload
+bookmark.title=View the noo (copy or open in new windae)
+bookmark_label=View The Noo
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Gang tae First Page
+first_page.label=Gang tae First Page
+first_page_label=Gang tae First Page
+last_page.title=Gang tae Lest Page
+last_page.label=Gang tae Lest Page
+last_page_label=Gang tae Lest Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Coonterclockwise
+page_rotate_ccw.label=Rotate Coonterclockwise
+page_rotate_ccw_label=Rotate Coonterclockwise
+
+cursor_text_select_tool.title=Enable Text Walin Tool
+cursor_text_select_tool_label=Text Walin Tool
+cursor_hand_tool.title=Enable Haun Tool
+cursor_hand_tool_label=Haun Tool
+
+scroll_vertical.title=Yaise Vertical Scrollin
+scroll_vertical_label=Vertical Scrollin
+scroll_horizontal.title=Yaise Horizontal Scrollin
+scroll_horizontal_label=Horizontal Scrollin
+scroll_wrapped.title=Yaise Wrapped Scrollin
+scroll_wrapped_label=Wrapped Scrollin
+
+spread_none.title=Dinnae jyn page spreids
+spread_none_label=Nae Spreids
+spread_odd.title=Jyn page spreids stertin wi odd-numbered pages
+spread_odd_label=Odd Spreids
+spread_even.title=Jyn page spreids stertin wi even-numbered pages
+spread_even_label=Even Spreids
+
+# Document properties dialog box
+document_properties.title=Document Properties…
+document_properties_label=Document Properties…
+document_properties_file_name=File nemme:
+document_properties_file_size=File size:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subjeck:
+document_properties_keywords=Keywirds:
+document_properties_creation_date=Date o Makkin:
+document_properties_modification_date=Date o Chynges:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Makker:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Coont:
+document_properties_page_size=Page Size:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portrait
+document_properties_page_size_orientation_landscape=landscape
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Wab View:
+document_properties_linearized_yes=Aye
+document_properties_linearized_no=Naw
+document_properties_close=Sneck
+
+print_progress_message=Reddin document fur prentin…
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Stap
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebaur
+toggle_sidebar_notification.title=Toggle Sidebaur (document conteens ootline/attachments)
+toggle_sidebar_notification2.title=Toggle Sidebaur (document conteens ootline/attachments/layers)
+toggle_sidebar_label=Toggle Sidebaur
+document_outline.title=Kythe Document Ootline (double-click fur tae oot-fauld/in-fauld aw items)
+document_outline_label=Document Ootline
+attachments.title=Kythe Attachments
+attachments_label=Attachments
+layers.title=Kythe Layers (double-click fur tae reset aw layers tae the staunart state)
+layers_label=Layers
+thumbs.title=Kythe Thumbnails
+thumbs_label=Thumbnails
+current_outline_item.title=Find Current Ootline Item
+current_outline_item_label=Current Ootline Item
+findbar.title=Find in Document
+findbar_label=Find
+
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=Page {{page}}
+
+additional_layers=Mair Layers
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Page {{page}}
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail o Page {{page}}
+
+# Find panel button title and messages
+find_input.title=Find
+find_input.placeholder=Find in document…
+find_previous.title=Airt oot the last time this phrase occurred
+find_previous_label=Previous
+find_next.title=Airt oot the neist time this phrase occurs
+find_next_label=Neist
+find_highlight=Highlicht aw
+find_match_case_label=Match case
+find_entire_word_label=Hale Wirds
+find_reached_top=Raxed tap o document, went on fae the dowp end
+find_reached_bottom=Raxed end o document, went on fae the tap
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} o {{total}} match
+find_match_count[two]={{current}} o {{total}} matches
+find_match_count[few]={{current}} o {{total}} matches
+find_match_count[many]={{current}} o {{total}} matches
+find_match_count[other]={{current}} o {{total}} matches
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mair nor {{limit}} matches
+find_match_count_limit[one]=Mair nor {{limit}} match
+find_match_count_limit[two]=Mair nor {{limit}} matches
+find_match_count_limit[few]=Mair nor {{limit}} matches
+find_match_count_limit[many]=Mair nor {{limit}} matches
+find_match_count_limit[other]=Mair nor {{limit}} matches
+find_not_found=Phrase no fund
+
+# Error panel labels
+error_more_info=Mair Information
+error_less_info=Less Information
+error_close=Sneck
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=A mishanter tuik place while renderin the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Mishanter
+
+# Loading indicator messages
+loading=Loadin…
+loading_error=An mishanter tuik place while loadin the PDF.
+invalid_file_error=No suithfest or camshauchlet PDF file.
+missing_file_error=PDF file tint.
+unexpected_response_error=Unexpectit server repone.
+
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}}, {{time}}
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Inpit the passwird fur tae open this PDF file.
+password_invalid=Passwird no suithfest. Gonnae gie it anither shot.
+password_ok=OK
+password_cancel=Stap
+
+printing_not_supported=Tak tent: Prentin isnae richt supportit by this stravaiger.
+printing_not_ready=Tak tent: The PDF isnae richt loadit fur prentin.
+web_fonts_disabled=Wab fonts are disabled: cannae yaise embeddit PDF fonts.
diff --git a/third-party/pdfjs/web/locale/si/viewer.properties 
b/third-party/pdfjs/web/locale/si/viewer.properties
index 9a1d1e8bc..9ab24bb51 100644
--- a/third-party/pdfjs/web/locale/si/viewer.properties
+++ b/third-party/pdfjs/web/locale/si/viewer.properties
@@ -187,6 +187,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=දෝෂය
+
 loading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.
 invalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව.
 missing_file_error=නැතිවූ PDF ගොනුව.
diff --git a/third-party/pdfjs/web/locale/sk/viewer.properties 
b/third-party/pdfjs/web/locale/sk/viewer.properties
index d86d77cfa..b58f4c42c 100644
--- a/third-party/pdfjs/web/locale/sk/viewer.properties
+++ b/third-party/pdfjs/web/locale/sk/viewer.properties
@@ -39,8 +39,8 @@ open_file.title=Otvoriť súbor
 open_file_label=Otvoriť
 print.title=Tlačiť
 print_label=Tlačiť
-download.title=Prevziať
-download_label=Prevziať
+download.title=Stiahnuť
+download_label=Stiahnuť
 bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)
 bookmark_label=Aktuálne zobrazenie
 
@@ -138,18 +138,27 @@ print_progress_close=Zrušiť
 # tooltips)
 toggle_sidebar.title=Prepnúť bočný panel
 toggle_sidebar_notification.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy)
+toggle_sidebar_notification2.title=Prepnúť bočný panel (dokument obsahuje osnovu/prílohy/vrstvy)
 toggle_sidebar_label=Prepnúť bočný panel
 document_outline.title=Zobraziť osnovu dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky)
 document_outline_label=Osnova dokumentu
 attachments.title=Zobraziť prílohy
 attachments_label=Prílohy
+layers.title=Zobraziť vrstvy (dvojitým kliknutím uvediete všetky vrstvy do pôvodného stavu)
+layers_label=Vrstvy
 thumbs.title=Zobraziť miniatúry
 thumbs_label=Miniatúry
+current_outline_item.title=Nájsť aktuálnu položku v osnove
+current_outline_item_label=Aktuálna položka v osnove
 findbar.title=Hľadať v dokumente
 findbar_label=Hľadať
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Strana {{page}}
+
+additional_layers=Ďalšie vrstvy
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Strana {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -194,7 +203,7 @@ find_match_count_limit[other]=Viac než {{limit}} výsledkov
 find_not_found=Výraz nebol nájdený
 
 # Error panel labels
-error_more_info=Viac informácií
+error_more_info=Ďalšie informácie
 error_less_info=Menej informácií
 error_close=Zavrieť
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Chyba
+
+# Loading indicator messages
+loading=Načítava sa…
 loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.
 invalid_file_error=Neplatný alebo poškodený súbor PDF.
 missing_file_error=Chýbajúci súbor PDF.
diff --git a/third-party/pdfjs/web/locale/sl/viewer.properties 
b/third-party/pdfjs/web/locale/sl/viewer.properties
index 25a5e9c50..aacf99554 100644
--- a/third-party/pdfjs/web/locale/sl/viewer.properties
+++ b/third-party/pdfjs/web/locale/sl/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Prekliči
 # tooltips)
 toggle_sidebar.title=Preklopi stransko vrstico
 toggle_sidebar_notification.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke)
+toggle_sidebar_notification2.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke/plasti)
 toggle_sidebar_label=Preklopi stransko vrstico
 document_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov)
 document_outline_label=Oris dokumenta
 attachments.title=Prikaži priponke
 attachments_label=Priponke
+layers.title=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)
+layers_label=Plasti
 thumbs.title=Prikaži sličice
 thumbs_label=Sličice
+current_outline_item.title=Najdi trenutni predmet orisa
+current_outline_item_label=Trenutni predmet orisa
 findbar.title=Iskanje po dokumentu
 findbar_label=Najdi
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Stran {{page}}
+
+additional_layers=Dodatne plasti
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Stran {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}} %
 
 # Loading indicator messages
 loading_error_indicator=Napaka
+
+# Loading indicator messages
+loading=Nalaganje …
 loading_error=Med nalaganjem datoteke PDF je prišlo do napake.
 invalid_file_error=Neveljavna ali pokvarjena datoteka PDF.
 missing_file_error=Ni datoteke PDF.
diff --git a/third-party/pdfjs/web/locale/son/viewer.properties 
b/third-party/pdfjs/web/locale/son/viewer.properties
index 683ed14d4..4f16cd96c 100644
--- a/third-party/pdfjs/web/locale/son/viewer.properties
+++ b/third-party/pdfjs/web/locale/son/viewer.properties
@@ -159,6 +159,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Firka
+
 loading_error=Firka bangay kaŋ PDF goo ma zumandi.
 invalid_file_error=PDF tuku laala wala laybante.
 missing_file_error=PDF tuku kumante.
diff --git a/third-party/pdfjs/web/locale/sq/viewer.properties 
b/third-party/pdfjs/web/locale/sq/viewer.properties
index f0710af5f..62fb33ccd 100644
--- a/third-party/pdfjs/web/locale/sq/viewer.properties
+++ b/third-party/pdfjs/web/locale/sq/viewer.properties
@@ -131,11 +131,14 @@ print_progress_close=Anuloje
 # tooltips)
 toggle_sidebar.title=Shfaqni/Fshihni Anështyllën
 toggle_sidebar_notification.title=Shfaqni Anështyllën (dokumenti përmban përvijim/bashkëngjitje)
+toggle_sidebar_notification2.title=Hap/Mbyll Anështylë (dokumenti përmban përvijim/nashkëngjitje/shtresa)
 toggle_sidebar_label=Shfaq/Fshih Anështyllën
 document_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët)
 document_outline_label=Përvijim Dokumenti
 attachments.title=Shfaqni Bashkëngjitje
 attachments_label=Bashkëngjitje
+layers.title=Shfaq Shtresa (dyklikoni që të rikthehen krejt shtresat në gjendjen e tyre parazgjedhje)
+layers_label=Shtresa
 thumbs.title=Shfaqni Miniatura
 thumbs_label=Miniatura
 findbar.title=Gjeni në Dokument
@@ -143,6 +146,8 @@ findbar_label=Gjej
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Faqja {{page}}
+
+additional_layers=Shtresa Shtesë
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -216,6 +221,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Gabim
+
 loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.
 invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.
 missing_file_error=Kartelë PDF që mungon.
diff --git a/third-party/pdfjs/web/locale/sr/viewer.properties 
b/third-party/pdfjs/web/locale/sr/viewer.properties
index 8c4e92411..ea18b4031 100644
--- a/third-party/pdfjs/web/locale/sr/viewer.properties
+++ b/third-party/pdfjs/web/locale/sr/viewer.properties
@@ -41,7 +41,7 @@ print.title=Штампај
 print_label=Штампај
 download.title=Преузми
 download_label=Преузми
-bookmark.title=Тренутни приказ (копирај или отвори нови прозор)
+bookmark.title=Тренутни приказ (копирај или отвори у новом прозору)
 bookmark_label=Тренутни приказ
 
 # Secondary toolbar and context menu
@@ -138,18 +138,27 @@ print_progress_close=Откажи
 # tooltips)
 toggle_sidebar.title=Прикажи додатну палету
 toggle_sidebar_notification.title=Прикажи додатну траку (докуменат садржи оквире/прилоге)
+toggle_sidebar_notification2.title=Прикажи/сакриј бочну траку (документ садржи контуру/прилоге/слојеве)
 toggle_sidebar_label=Прикажи додатну палету
-document_outline.title=Прикажи контуру документа (дупли клик за проширење/скупљање елемената)
+document_outline.title=Прикажи структуру документа (двоструким кликом проширујете/скупљате све ставке)
 document_outline_label=Контура документа
 attachments.title=Прикажи прилоге
 attachments_label=Прилози
+layers.title=Прикажи слојеве (дупли клик за враћање свих слојева у подразумевано стање)
+layers_label=Слојеви
 thumbs.title=Прикажи сличице
 thumbs_label=Сличице
+current_outline_item.title=Пронађите тренутни елемент структуре
+current_outline_item_label=Тренутна контура
 findbar.title=Пронађи у документу
 findbar_label=Пронађи
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Страница {{page}}
+
+additional_layers=Додатни слојеви
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Страница {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -161,9 +170,9 @@ thumb_page_canvas=Сличица од странице {{page}}
 # Find panel button title and messages
 find_input.title=Пронађи
 find_input.placeholder=Пронађи у документу…
-find_previous.title=Пронађи претходну појаву фразе
+find_previous.title=Пронађи претходно појављивање фразе
 find_previous_label=Претходна
-find_next.title=Пронађи следећу појаву фразе
+find_next.title=Пронађи следеће појављивање фразе
 find_next_label=Следећа
 find_highlight=Истакнути све
 find_match_case_label=Подударања
@@ -223,9 +232,12 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Грешка
+
+# Loading indicator messages
+loading=Учитавање…
 loading_error=Дошло је до грешке приликом учитавања PDF-а.
-invalid_file_error=PDF датотека је оштећена или је неисправна.
-missing_file_error=PDF датотека није пронађена.
+invalid_file_error=PDF датотека је неважећа или је оштећена.
+missing_file_error=Недостаје PDF датотека.
 unexpected_response_error=Неочекиван одговор од сервера.
 
 # LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
@@ -245,3 +257,5 @@ password_cancel=Откажи
 printing_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.
 printing_not_ready=Упозорење: PDF није у потпуности учитан за штампу.
 web_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
diff --git a/third-party/pdfjs/web/locale/sv-SE/viewer.properties 
b/third-party/pdfjs/web/locale/sv-SE/viewer.properties
index 7c75281c3..60299d14b 100644
--- a/third-party/pdfjs/web/locale/sv-SE/viewer.properties
+++ b/third-party/pdfjs/web/locale/sv-SE/viewer.properties
@@ -137,22 +137,28 @@ print_progress_close=Avbryt
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
 toggle_sidebar.title=Visa/dölj sidofält
-toggle_sidebar_notification2.title=Visa/dölj sidofält (dokument innehåller översikt/bilagor/lager)
+toggle_sidebar_notification.title=Visa/dölj sidofält (dokument innehåller översikt/bilagor)
+toggle_sidebar_notification2.title=Växla sidofält (dokumentet innehåller dokumentstruktur/bilagor/lager)
 toggle_sidebar_label=Visa/dölj sidofält
 document_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt)
 document_outline_label=Dokumentöversikt
 attachments.title=Visa Bilagor
 attachments_label=Bilagor
-layers.title=Visa lager (dubbelklicka för att återställa alla lager till ursrungligt läge)
+layers.title=Visa lager (dubbelklicka för att återställa alla lager till standardläge)
 layers_label=Lager
 thumbs.title=Visa miniatyrer
 thumbs_label=Miniatyrer
+current_outline_item.title=Hitta aktuellt dispositionsobjekt
+current_outline_item_label=Aktuellt dispositionsobjekt
 findbar.title=Sök i dokument
 findbar_label=Sök
 
-additional_layers=Ytterligare lager
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Sida {{page}}
+
+additional_layers=Ytterligare lager
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Sida {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -226,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Fel
+
+# Loading indicator messages
+loading=Laddar…
 loading_error=Ett fel uppstod vid laddning av PDF-filen.
 invalid_file_error=Ogiltig eller korrupt PDF-fil.
 missing_file_error=Saknad PDF-fil.
diff --git a/third-party/pdfjs/web/locale/szl/viewer.properties 
b/third-party/pdfjs/web/locale/szl/viewer.properties
index 282c59509..ed4bbd4e8 100644
--- a/third-party/pdfjs/web/locale/szl/viewer.properties
+++ b/third-party/pdfjs/web/locale/szl/viewer.properties
@@ -138,11 +138,14 @@ print_progress_close=Pociep
 # tooltips)
 toggle_sidebar.title=Przełōncz posek na rancie
 toggle_sidebar_notification.title=Przełōncz posek na rancie (dokumynt mo struktura/przidowki)
+toggle_sidebar_notification2.title=Przełōncz posek na rancie (dokumynt mo struktura/przidowki/warstwy)
 toggle_sidebar_label=Przełōncz posek na rancie
-document_outline.title=Pokoż struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynty)
+document_outline.title=Pokoż struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynta)
 document_outline_label=Struktura dokumyntu
 attachments.title=Pokoż przidowki
 attachments_label=Przidowki
+layers.title=Pokoż warstwy (tuplowane klikniyncie resetuje wszyskie warstwy do bazowego stanu)
+layers_label=Warstwy
 thumbs.title=Pokoż miniatury
 thumbs_label=Miniatury
 findbar.title=Znojdź w dokumyncie
@@ -150,6 +153,9 @@ findbar_label=Znojdź
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Strōna {{page}}
+
+additional_layers=Nadbytnie warstwy
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -165,7 +171,7 @@ find_previous.title=Znojdź piyrwyjsze pokozanie sie tyj frazy
 find_previous_label=Piyrwyjszo
 find_next.title=Znojdź nastympne pokozanie sie tyj frazy
 find_next_label=Dalij
-find_highlight=Ôbznocz wszysko
+find_highlight=Zaznacz wszysko
 find_match_case_label=Poznowej srogość liter
 find_entire_word_label=Cołke słowa
 find_reached_top=Doszło do samego wiyrchu strōny, dalij ôd spodku
@@ -223,6 +229,8 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Feler
+
+# Loading indicator messages
 loading_error=Przi ladowaniu PDFa pokozoł sie feler.
 invalid_file_error=Zły abo felerny zbiōr PDF.
 missing_file_error=Chybio zbioru PDF.
@@ -245,3 +253,5 @@ password_cancel=Pociep
 printing_not_supported=Pozōr: Ta przeglōndarka niy cołkiym ôbsuguje durk.
 printing_not_ready=Pozōr: Tyn PDF niy ma za tela zaladowany do durku.
 web_fonts_disabled=Necowe fōnty sōm zastawiōne: niy idzie użyć wkludzōnych fōntōw PDF.
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
diff --git a/third-party/pdfjs/web/locale/ta/viewer.properties 
b/third-party/pdfjs/web/locale/ta/viewer.properties
index 669ba0c56..cade21bc7 100644
--- a/third-party/pdfjs/web/locale/ta/viewer.properties
+++ b/third-party/pdfjs/web/locale/ta/viewer.properties
@@ -180,6 +180,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=பிழை
+
 loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.
 invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.
 missing_file_error=PDF கோப்பு காணவில்லை.
diff --git a/third-party/pdfjs/web/locale/te/viewer.properties 
b/third-party/pdfjs/web/locale/te/viewer.properties
index 498b64c8d..517509324 100644
--- a/third-party/pdfjs/web/locale/te/viewer.properties
+++ b/third-party/pdfjs/web/locale/te/viewer.properties
@@ -130,11 +130,16 @@ document_outline.title=పత్రము రూపము చూపించు
 document_outline_label=పత్రము అవుట్‌లైన్
 attachments.title=అనుబంధాలు చూపు
 attachments_label=అనుబంధాలు
+layers_label=పొరలు
 thumbs.title=థంబ్‌నైల్స్ చూపు
 thumbs_label=థంబ్‌నైల్స్
 findbar.title=పత్రములో కనుగొనుము
 findbar_label=కనుగొను
 
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+page_canvas=పేజి {{page}}
+
+additional_layers=అదనపు పొరలు
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -197,6 +202,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=దోషం
+
 loading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది.
 invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.
 missing_file_error=దొరకని PDF ఫైలు.
diff --git a/third-party/pdfjs/web/locale/tg/viewer.properties 
b/third-party/pdfjs/web/locale/tg/viewer.properties
new file mode 100644
index 000000000..95967e32f
--- /dev/null
+++ b/third-party/pdfjs/web/locale/tg/viewer.properties
@@ -0,0 +1,142 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Саҳифаи қаблӣ
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Хурд кардан
+zoom_out_label=Хурд кардан
+zoom_in.title=Калон кардан
+zoom_in_label=Калон кардан
+zoom.title=Танзими андоза
+open_file.title=Кушодани файл
+open_file_label=Кушодан
+print.title=Чоп кардан
+print_label=Чоп кардан
+download.title=Боргирӣ кардан
+download_label=Боргирӣ кардан
+bookmark.title=Намуди ҷорӣ (нусха бардоштан ё кушодан дар равзанаи нав)
+bookmark_label=Намуди ҷорӣ
+
+# Secondary toolbar and context menu
+tools.title=Абзорҳо
+
+
+
+
+# Document properties dialog box
+document_properties_file_name=Номи файл:
+document_properties_file_size=Андозаи файл:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} КБ ({{size_b}} байт)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} МБ ({{size_b}} байт)
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Мактуб
+document_properties_page_size_name_legal=Ҳуқуқӣ
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+
+print_progress_message=Омодасозии ҳуҷҷат барои чоп…
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Бекор кардан
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Фаъол кардани навори ҷонибӣ
+
+# LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit[zero]=Зиёда аз {{limit}} мувофиқат
+find_match_count_limit[one]=Зиёда аз {{limit}} мувофиқат
+find_match_count_limit[two]=Зиёда аз {{limit}} мувофиқат
+find_match_count_limit[few]=Зиёда аз {{limit}} мувофиқат
+find_match_count_limit[many]=Зиёда аз {{limit}} мувофиқат
+find_match_count_limit[other]=Зиёда аз {{limit}} мувофиқат
+
+# Error panel labels
+error_more_info=Маълумоти бештар
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Файл: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+page_scale_width=Аз рӯи паҳнои саҳифа
+page_scale_auto=Андозаи худкор
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+
+# Loading indicator messages
+invalid_file_error=Файли PDF нодуруст ё вайроншуда мебошад.
+missing_file_error=Файли PDF ғоиб аст.
+
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_label=Барои кушодани ин файли PDF ниҳонвожаро ворид кунед.
+password_cancel=Бекор кардан
+
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
+
diff --git a/third-party/pdfjs/web/locale/th/viewer.properties 
b/third-party/pdfjs/web/locale/th/viewer.properties
index a4ef7db14..4ce6147d0 100644
--- a/third-party/pdfjs/web/locale/th/viewer.properties
+++ b/third-party/pdfjs/web/locale/th/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=ยกเลิก
 # tooltips)
 toggle_sidebar.title=เปิด/ปิดแถบข้าง
 toggle_sidebar_notification.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ)
+toggle_sidebar_notification2.title=เปิด/ปิดแถบข้าง (เอกสารมีเค้าร่าง/ไฟล์แนบ/เลเยอร์)
 toggle_sidebar_label=เปิด/ปิดแถบข้าง
 document_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด)
 document_outline_label=เค้าร่างเอกสาร
 attachments.title=แสดงไฟล์แนบ
 attachments_label=ไฟล์แนบ
+layers.title=แสดงเลเยอร์ (คลิกสองครั้งเพื่อรีเซ็ตเลเยอร์ทั้งหมดเป็นสถานะเริ่มต้น)
+layers_label=เลเยอร์
 thumbs.title=แสดงภาพขนาดย่อ
 thumbs_label=ภาพขนาดย่อ
+current_outline_item.title=ค้นหารายการเค้าร่างปัจจุบัน
+current_outline_item_label=รายการเค้าร่างปัจจุบัน
 findbar.title=ค้นหาในเอกสาร
 findbar_label=ค้นหา
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=หน้า {{page}}
+
+additional_layers=เลเยอร์เพิ่มเติม
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=หน้า {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=ข้อผิดพลาด
+
+# Loading indicator messages
+loading=กำลังโหลด…
 loading_error=เกิดข้อผิดพลาดขณะโหลด PDF
 invalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย
 missing_file_error=ไฟล์ PDF หายไป
diff --git a/third-party/pdfjs/web/locale/tl/viewer.properties 
b/third-party/pdfjs/web/locale/tl/viewer.properties
index 0209da154..6a9fd03b1 100644
--- a/third-party/pdfjs/web/locale/tl/viewer.properties
+++ b/third-party/pdfjs/web/locale/tl/viewer.properties
@@ -33,14 +33,14 @@ zoom_out_label=Paliitin
 zoom_in.title=Palakihin
 zoom_in_label=Palakihin
 zoom.title=Mag-zoom
-presentation_mode.title=Switch to Presentation Mode
+presentation_mode.title=Lumipat sa Presentation Mode
 presentation_mode_label=Presentation Mode
 open_file.title=Magbukas ng file
 open_file_label=Buksan
 print.title=i-Print
 print_label=i-Print
-download.title=Download
-download_label=Download
+download.title=i-Download
+download_label=i-Download
 bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)
 bookmark_label=Kasalukuyang tingin
 
@@ -53,35 +53,35 @@ first_page_label=Pumunta sa Unang Pahina
 last_page.title=Pumunta sa Huling Pahina
 last_page.label=Pumunta sa Huling Pahina
 last_page_label=Pumunta sa Huling Pahina
-page_rotate_cw.title=Paikutin ang Clockwise
-page_rotate_cw.label=Paikutin ang Clockwise
-page_rotate_cw_label=Paikutin ang Clockwise
-page_rotate_ccw.title=Paikutin ang Counterclockwise
-page_rotate_ccw.label=Paikutin ang Counterclockwise
-page_rotate_ccw_label=Paikutin ang Counterclockwise
-
-cursor_text_select_tool.title=Enable Text Selection Tool
+page_rotate_cw.title=Paikutin Pakanan
+page_rotate_cw.label=Paikutin Pakanan
+page_rotate_cw_label=Paikutin Pakanan
+page_rotate_ccw.title=Paikutin Pakaliwa
+page_rotate_ccw.label=Paikutin Pakaliwa
+page_rotate_ccw_label=Paikutin Pakaliwa
+
+cursor_text_select_tool.title=I-enable ang Text Selection Tool
 cursor_text_select_tool_label=Text Selection Tool
-cursor_hand_tool.title=Enable Hand Tool
+cursor_hand_tool.title=I-enable ang Hand Tool
 cursor_hand_tool_label=Hand Tool
 
-scroll_vertical.title=Use Vertical Scrolling
+scroll_vertical.title=Gumamit ng Vertical Scrolling
 scroll_vertical_label=Vertical Scrolling
-scroll_horizontal.title=Use Horizontal Scrolling
+scroll_horizontal.title=Gumamit ng Horizontal Scrolling
 scroll_horizontal_label=Horizontal Scrolling
-scroll_wrapped.title=Use Wrapped Scrolling
+scroll_wrapped.title=Gumamit ng Wrapped Scrolling
 scroll_wrapped_label=Wrapped Scrolling
 
-spread_none.title=Do not join page spreads
+spread_none.title=Huwag pagsamahin ang mga page spread
 spread_none_label=No Spreads
 spread_odd.title=Join page spreads starting with odd-numbered pages
-spread_odd_label=Odd Spreads
-spread_even.title=Join page spreads starting with even-numbered pages
-spread_even_label=Even Spreads
+spread_odd_label=Mga Odd Spread
+spread_even.title=Pagsamahin ang mga page spread na nagsisimula sa mga even-numbered na pahina
+spread_even_label=Mga Even Spread
 
 # Document properties dialog box
-document_properties.title=Document Properties…
-document_properties_label=Document Properties…
+document_properties.title=Mga Katangian ng Dokumento…
+document_properties_label=Mga Katangian ng Dokumento…
 document_properties_file_name=File name:
 document_properties_file_size=File size:
 # LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
@@ -91,23 +91,23 @@ document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
 # will be replaced by the PDF file size in megabytes, respectively in bytes.
 document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
 document_properties_title=Pamagat:
-document_properties_author=May Akda:
-document_properties_subject=Subject:
+document_properties_author=May-akda:
+document_properties_subject=Paksa:
 document_properties_keywords=Mga keyword:
-document_properties_creation_date=Creation Date:
-document_properties_modification_date=Modification Date:
+document_properties_creation_date=Petsa ng Pagkakagawa:
+document_properties_modification_date=Petsa ng Pagkakabago:
 # LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
 # will be replaced by the creation/modification date, and time, of the PDF file.
 document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creator:
+document_properties_creator=Tagalikha:
 document_properties_producer=PDF Producer:
 document_properties_version=PDF Version:
-document_properties_page_count=Page Count:
-document_properties_page_size=Page Size:
-document_properties_page_size_unit_inches=in
+document_properties_page_count=Bilang ng Pahina:
+document_properties_page_size=Laki ng Pahina:
+document_properties_page_size_unit_inches=pulgada
 document_properties_page_size_unit_millimeters=mm
-document_properties_page_size_orientation_portrait=portrait
-document_properties_page_size_orientation_landscape=landscape
+document_properties_page_size_orientation_portrait=patayo
+document_properties_page_size_orientation_landscape=pahiga
 document_properties_page_size_name_a3=A3
 document_properties_page_size_name_a4=A4
 document_properties_page_size_name_letter=Letter
@@ -127,7 +127,7 @@ document_properties_linearized_yes=Oo
 document_properties_linearized_no=Hindi
 document_properties_close=Isara
 
-print_progress_message=Preparing document for printing…
+print_progress_message=Inihahanda ang dokumento para sa pag-print…
 # LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
 # a numerical per cent value.
 print_progress_percent={{progress}}%
@@ -136,20 +136,25 @@ print_progress_close=Kanselahin
 # Tooltips and alt text for side panel toolbar buttons
 # (the _label strings are alt text for the buttons, the .title strings are
 # tooltips)
-toggle_sidebar.title=Toggle Sidebar
-toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
-toggle_sidebar_label=Toggle Sidebar
-document_outline.title=Show Document Outline (double-click to expand/collapse all items)
-document_outline_label=Document Outline
-attachments.title=Show Attachments
-attachments_label=Attachments
-thumbs.title=Ipakita ang mga Thumbnails
-thumbs_label=Thumbnails
-findbar.title=Find in Document
+toggle_sidebar.title=Ipakita/Itago ang Sidebar
+toggle_sidebar_notification.title=Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga 
attachment)
+toggle_sidebar_notification2.title=Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga 
attachment/mga layer)
+toggle_sidebar_label=Ipakita/Itago ang Sidebar
+document_outline.title=Ipakita ang Document Outline (mag-double-click para i-expand/collapse ang laman)
+document_outline_label=Balangkas ng Dokumento
+attachments.title=Ipakita ang mga Attachment
+attachments_label=Mga attachment
+layers.title=Ipakita ang mga Layer (mag-double click para mareset ang lahat ng layer sa orihinal na estado)
+layers_label=Mga layer
+thumbs.title=Ipakita ang mga Thumbnail
+thumbs_label=Mga thumbnail
+findbar.title=Hanapin sa Dokumento
 findbar_label=Hanapin
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Pahina {{page}}
+
+additional_layers=Mga Karagdagang Layer
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -160,43 +165,43 @@ thumb_page_canvas=Thumbnail ng Pahina {{page}}
 
 # Find panel button title and messages
 find_input.title=Hanapin
-find_input.placeholder=Find in document…
+find_input.placeholder=Hanapin sa dokumento…
 find_previous.title=Hanapin ang nakaraang pangyayari ng parirala
-find_previous_label=Nakaraang
+find_previous_label=Nakaraan
 find_next.title=Hanapin ang susunod na pangyayari ng parirala
 find_next_label=Susunod
 find_highlight=I-highlight lahat
-find_match_case_label=Match case
-find_entire_word_label=Whole words
-find_reached_top=Reached top of document, continued from bottom
-find_reached_bottom=Reached end of document, continued from top
+find_match_case_label=Itugma ang case
+find_entire_word_label=Buong salita
+find_reached_top=Naabot na ang tuktok ng dokumento, ipinagpatuloy mula sa ilalim
+find_reached_bottom=Naabot na ang dulo ng dokumento, ipinagpatuloy mula sa tuktok
 # LOCALIZATION NOTE (find_match_count): The supported plural forms are
 # [one|two|few|many|other], with [other] as the default value.
 # "{{current}}" and "{{total}}" will be replaced by a number representing the
 # index of the currently active find result, respectively a number representing
 # the total number of matches in the document.
 find_match_count={[ plural(total) ]}
-find_match_count[one]={{current}} of {{total}} match
-find_match_count[two]={{current}} of {{total}} matches
-find_match_count[few]={{current}} of {{total}} matches
-find_match_count[many]={{current}} of {{total}} matches
-find_match_count[other]={{current}} of {{total}} matches
+find_match_count[one]={{current}} ng {{total}} tugma
+find_match_count[two]={{current}} ng {{total}} tugma
+find_match_count[few]={{current}} ng {{total}} tugma
+find_match_count[many]={{current}} ng {{total}} tugma
+find_match_count[other]={{current}} ng {{total}} tugma
 # LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
 # [zero|one|two|few|many|other], with [other] as the default value.
 # "{{limit}}" will be replaced by a numerical value.
 find_match_count_limit={[ plural(limit) ]}
-find_match_count_limit[zero]=More than {{limit}} matches
-find_match_count_limit[one]=More than {{limit}} match
-find_match_count_limit[two]=More than {{limit}} matches
-find_match_count_limit[few]=More than {{limit}} matches
-find_match_count_limit[many]=More than {{limit}} matches
-find_match_count_limit[other]=More than {{limit}} matches
-find_not_found=Hindi nakita ang prasko
+find_match_count_limit[zero]=Higit sa {{limit}} tugma
+find_match_count_limit[one]=Higit sa {{limit}} tugma
+find_match_count_limit[two]=Higit sa {{limit}} tugma
+find_match_count_limit[few]=Higit sa {{limit}} tugma
+find_match_count_limit[many]=Higit sa {{limit}} tugma
+find_match_count_limit[other]=Higit sa {{limit}} tugma
+find_not_found=Hindi natagpuan ang parirala
 
 # Error panel labels
 error_more_info=Karagdagang Impormasyon
 error_less_info=Mas Kaunting Impormasyon
-error_close=Sarado
+error_close=Isara
 # LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
 # replaced by the PDF.JS version and build ID.
 error_version_info=PDF.js v{{version}} (build: {{build}})
@@ -210,11 +215,11 @@ error_stack=Stack: {{stack}}
 error_file=File: {{file}}
 # LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
 error_line=Linya: {{line}}
-rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.
+rendering_error=Nagkaproblema habang nirerender ang pahina.
 
 # Predefined zoom values
 page_scale_width=Lapad ng Pahina
-page_scale_fit=ang pahina ay angkop
+page_scale_fit=Pagkasyahin ang Pahina
 page_scale_auto=Automatic Zoom
 page_scale_actual=Totoong sukat
 # LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
@@ -223,8 +228,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Error
-loading_error=May maling nangyari habang kinakarga ang PDF.
-invalid_file_error=Di-wasto o masira ang PDF file.
+
+loading_error=Nagkaproblema habang niloload ang PDF.
+invalid_file_error=Di-wasto o sira ang PDF file.
 missing_file_error=Nawawalang PDF file.
 unexpected_response_error=Hindi inaasahang tugon ng server.
 
@@ -238,10 +244,10 @@ annotation_date_string={{date}}, {{time}}
 # Some common types are e.g.: "Check", "Text", "Comment", "Note"
 text_annotation_type.alt=[{{type}} Annotation]
 password_label=Ipasok ang password upang buksan ang PDF file na ito.
-password_invalid=Invalid password. Please try again.
+password_invalid=Maling password. Subukan uli.
 password_ok=OK
 password_cancel=Kanselahin
 
-printing_not_supported=Warning: Printing is not fully supported by this browser.
-printing_not_ready=Warning: The PDF is not fully loaded for printing.
-web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+printing_not_supported=Babala: Hindi pa ganap na suportado ang pag-print sa browser na ito.
+printing_not_ready=Babala: Hindi ganap na nabuksan ang PDF para sa pag-print.
+web_fonts_disabled=Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font.
diff --git a/third-party/pdfjs/web/locale/tr/viewer.properties 
b/third-party/pdfjs/web/locale/tr/viewer.properties
index b189186c2..7e14fbba2 100644
--- a/third-party/pdfjs/web/locale/tr/viewer.properties
+++ b/third-party/pdfjs/web/locale/tr/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=İptal
 # tooltips)
 toggle_sidebar.title=Kenar çubuğunu aç/kapat
 toggle_sidebar_notification.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler içeriyor)
+toggle_sidebar_notification2.title=Kenar çubuğunu aç/kapat (Belge ana hat/ekler/katmanlar içeriyor)
 toggle_sidebar_label=Kenar çubuğunu aç/kapat
 document_outline.title=Belge ana hatlarını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın)
 document_outline_label=Belge ana hatları
 attachments.title=Ekleri göster
 attachments_label=Ekler
+layers.title=Katmanları göster (tüm katmanları varsayılan duruma sıfırlamak için çift tıklayın)
+layers_label=Katmanlar
 thumbs.title=Küçük resimleri göster
 thumbs_label=Küçük resimler
+current_outline_item.title=Mevcut ana hat öğesini bul
+current_outline_item_label=Mevcut ana hat öğesi
 findbar.title=Belgede bul
 findbar_label=Bul
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Sayfa {{page}}
+
+additional_layers=Ek katmanlar
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Sayfa {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent=%{{scale}}
 
 # Loading indicator messages
 loading_error_indicator=Hata
+
+# Loading indicator messages
+loading=Yükleniyor…
 loading_error=PDF yüklenirken bir hata oluştu.
 invalid_file_error=Geçersiz veya bozulmuş PDF dosyası.
 missing_file_error=PDF dosyası eksik.
diff --git a/third-party/pdfjs/web/locale/uk/viewer.properties 
b/third-party/pdfjs/web/locale/uk/viewer.properties
index 7b3a69c55..87d407c99 100644
--- a/third-party/pdfjs/web/locale/uk/viewer.properties
+++ b/third-party/pdfjs/web/locale/uk/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Скасувати
 # tooltips)
 toggle_sidebar.title=Бічна панель
 toggle_sidebar_notification.title=Перемкнути бічну панель (документ має вміст/вкладення)
+toggle_sidebar_notification2.title=Перемкнути бічну панель (документ містить ескіз/вкладення/шари)
 toggle_sidebar_label=Перемкнути бічну панель
 document_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів)
 document_outline_label=Схема документа
 attachments.title=Показати прикріплення
 attachments_label=Прикріплення
+layers.title=Показати шари (двічі клацніть, щоб скинути всі шари до типового стану)
+layers_label=Шари
 thumbs.title=Показувати ескізи
 thumbs_label=Ескізи
+current_outline_item.title=Знайти поточний елемент змісту
+current_outline_item_label=Поточний елемент змісту
 findbar.title=Знайти в документі
-findbar_label=Пошук
+findbar_label=Знайти
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Сторінка {{page}}
+
+additional_layers=Додаткові шари
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Сторінка {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Помилка
+
+# Loading indicator messages
+loading=Завантаження…
 loading_error=Під час завантаження PDF сталася помилка.
 invalid_file_error=Недійсний або пошкоджений PDF-файл.
 missing_file_error=Відсутній PDF-файл.
diff --git a/third-party/pdfjs/web/locale/ur/viewer.properties 
b/third-party/pdfjs/web/locale/ur/viewer.properties
index 162ca1475..beaa4cfbf 100644
--- a/third-party/pdfjs/web/locale/ur/viewer.properties
+++ b/third-party/pdfjs/web/locale/ur/viewer.properties
@@ -145,6 +145,9 @@ findbar_label=ڈھونڈیں
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=صفحہ {{page}}
+
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=صفحہ {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -217,6 +220,8 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=نقص
+
+# Loading indicator messages
 loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔
 invalid_file_error=ناجائز یا خراب PDF مسل
 missing_file_error=PDF مسل غائب ہے۔
@@ -239,3 +244,5 @@ password_cancel=منسوخ کریں
 printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔
 printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔
 web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔
+# LOCALIZATION NOTE (unsupported_feature_signatures): Should contain the same
+# exact string as in the `chrome.properties` file.
diff --git a/third-party/pdfjs/web/locale/uz/viewer.properties 
b/third-party/pdfjs/web/locale/uz/viewer.properties
index 6ad24319e..638fde579 100644
--- a/third-party/pdfjs/web/locale/uz/viewer.properties
+++ b/third-party/pdfjs/web/locale/uz/viewer.properties
@@ -149,6 +149,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Xato
+
 loading_error=PDF yuklanayotganda xato yuz berdi.
 invalid_file_error=Xato yoki buzuq PDF fayli.
 missing_file_error=PDF fayl kerak.
diff --git a/third-party/pdfjs/web/locale/vi/viewer.properties 
b/third-party/pdfjs/web/locale/vi/viewer.properties
index 64ae6e3a2..a8aa396da 100644
--- a/third-party/pdfjs/web/locale/vi/viewer.properties
+++ b/third-party/pdfjs/web/locale/vi/viewer.properties
@@ -138,18 +138,27 @@ print_progress_close=Hủy bỏ
 # tooltips)
 toggle_sidebar.title=Bật/Tắt thanh lề
 toggle_sidebar_notification.title=Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm)
+toggle_sidebar_notification2.title=Bật tắt thanh lề (tài liệu bao gồm bản phác thảo/tập tin đính kèm/lớp)
 toggle_sidebar_label=Bật/Tắt thanh lề
 document_outline.title=Hiện tài liệu phác thảo (nhấp đúp vào để mở rộng/thu gọn tất cả các mục)
 document_outline_label=Bản phác tài liệu
 attachments.title=Hiện nội dung đính kèm
 attachments_label=Nội dung đính kèm
+layers.title=Hiển thị các lớp (nhấp đúp để đặt lại tất cả các lớp về trạng thái mặc định)
+layers_label=Lớp
 thumbs.title=Hiển thị ảnh thu nhỏ
 thumbs_label=Ảnh thu nhỏ
+current_outline_item.title=Tìm mục phác thảo hiện tại
+current_outline_item_label=Mục phác thảo hiện tại
 findbar.title=Tìm trong tài liệu
 findbar_label=Tìm
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=Trang {{page}}
+
+additional_layers=Các lớp bổ sung
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=Trang {{page}}
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Lỗi
+
+# Loading indicator messages
+loading=Đang tải…
 loading_error=Lỗi khi tải tài liệu PDF.
 invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.
 missing_file_error=Thiếu tập tin PDF.
diff --git a/third-party/pdfjs/web/locale/wo/viewer.properties 
b/third-party/pdfjs/web/locale/wo/viewer.properties
index 38c7bc184..3c7b89942 100644
--- a/third-party/pdfjs/web/locale/wo/viewer.properties
+++ b/third-party/pdfjs/web/locale/wo/viewer.properties
@@ -110,6 +110,7 @@ page_scale_actual=Dayo bi am
 
 # Loading indicator messages
 loading_error_indicator=Njumte
+
 loading_error=Am na njumte ci yebum dencukaay PDF bi.
 invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.
 
diff --git a/third-party/pdfjs/web/locale/xh/viewer.properties 
b/third-party/pdfjs/web/locale/xh/viewer.properties
index 52cd75e5b..6f76c4523 100644
--- a/third-party/pdfjs/web/locale/xh/viewer.properties
+++ b/third-party/pdfjs/web/locale/xh/viewer.properties
@@ -163,6 +163,7 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=Imposiso
+
 loading_error=Imposiso yenzekile xa kulayishwa i-PDF.
 invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.
 missing_file_error=Ifayile ye-PDF edukileyo.
diff --git a/third-party/pdfjs/web/locale/zh-CN/viewer.properties 
b/third-party/pdfjs/web/locale/zh-CN/viewer.properties
index 214c746f1..0648ee277 100644
--- a/third-party/pdfjs/web/locale/zh-CN/viewer.properties
+++ b/third-party/pdfjs/web/locale/zh-CN/viewer.properties
@@ -138,22 +138,31 @@ print_progress_close=取消
 # tooltips)
 toggle_sidebar.title=切换侧栏
 toggle_sidebar_notification.title=切换侧栏(文档所含的大纲/附件)
+toggle_sidebar_notification2.title=切换侧栏(文档所含的大纲/附件/图层)
 toggle_sidebar_label=切换侧栏
 document_outline.title=显示文档大纲(双击展开/折叠所有项)
 document_outline_label=文档大纲
 attachments.title=显示附件
 attachments_label=附件
+layers.title=显示图层(双击即可将所有图层重置为默认状态)
+layers_label=图层
 thumbs.title=显示缩略图
 thumbs_label=缩略图
+current_outline_item.title=查找当前大纲项目
+current_outline_item_label=当前大纲项目
 findbar.title=在文档中查找
 findbar_label=查找
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
-page_canvas=页码 {{page}}
+page_canvas=第 {{page}} 页
+
+additional_layers=其他图层
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=第 {{page}} 页
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
-thumb_page_title=页码 {{page}}
+thumb_page_title=第 {{page}} 页
 # LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
 # number.
 thumb_page_canvas=页面 {{page}} 的缩略图
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=错误
+
+# Loading indicator messages
+loading=正在载入…
 loading_error=载入 PDF 时发生错误。
 invalid_file_error=无效或损坏的 PDF 文件。
 missing_file_error=缺少 PDF 文件。
diff --git a/third-party/pdfjs/web/locale/zh-TW/viewer.properties 
b/third-party/pdfjs/web/locale/zh-TW/viewer.properties
index 55626cabd..e29bcf428 100644
--- a/third-party/pdfjs/web/locale/zh-TW/viewer.properties
+++ b/third-party/pdfjs/web/locale/zh-TW/viewer.properties
@@ -41,7 +41,7 @@ print.title=列印
 print_label=列印
 download.title=下載
 download_label=下載
-bookmark.title=目前檢視的內容(複製或開啟於新視窗)
+bookmark.title=目前畫面(複製或開啟於新視窗)
 bookmark_label=目前檢視
 
 # Secondary toolbar and context menu
@@ -138,18 +138,27 @@ print_progress_close=取消
 # tooltips)
 toggle_sidebar.title=切換側邊欄
 toggle_sidebar_notification.title=切換側邊攔(文件包含大綱或附件)
+toggle_sidebar_notification2.title=切換側邊欄(包含大綱、附件、圖層的文件)
 toggle_sidebar_label=切換側邊欄
 document_outline.title=顯示文件大綱(雙擊展開/摺疊所有項目)
 document_outline_label=文件大綱
 attachments.title=顯示附件
 attachments_label=附件
+layers.title=顯示圖層(滑鼠雙擊即可將所有圖層重設為預設狀態)
+layers_label=圖層
 thumbs.title=顯示縮圖
 thumbs_label=縮圖
+current_outline_item.title=尋找目前的大綱項目
+current_outline_item_label=目前的大綱項目
 findbar.title=在文件中尋找
 findbar_label=尋找
 
 # LOCALIZATION NOTE (page_canvas): "{{page}}" will be replaced by the page number.
 page_canvas=第 {{page}} 頁
+
+additional_layers=其他圖層
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=第 {{page}} 頁
 # Thumbnails panel item (tooltip and alt text for images)
 # LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
 # number.
@@ -223,6 +232,9 @@ page_scale_percent={{scale}}%
 
 # Loading indicator messages
 loading_error_indicator=錯誤
+
+# Loading indicator messages
+loading=載入中…
 loading_error=載入 PDF 時發生錯誤。
 invalid_file_error=無效或毀損的 PDF 檔案。
 missing_file_error=找不到 PDF 檔案。
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitDingbats.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitDingbats.pfb
new file mode 100644
index 000000000..30d52963e
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitDingbats.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitFixed.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitFixed.pfb
new file mode 100644
index 000000000..f12dcbce5
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitFixed.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitFixedBold.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitFixedBold.pfb
new file mode 100644
index 000000000..cf8e24aee
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitFixedBold.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb
new file mode 100644
index 000000000..d2880017c
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb
new file mode 100644
index 000000000..d71697d4b
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSans.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSans.pfb
new file mode 100644
index 000000000..37f244bd9
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSans.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSansBold.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSansBold.pfb
new file mode 100644
index 000000000..affcf316d
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSansBold.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSansBoldItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSansBoldItalic.pfb
new file mode 100644
index 000000000..e1f60b754
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSansBoldItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSansItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSansItalic.pfb
new file mode 100644
index 000000000..c04b0a5ae
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSansItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSerif.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSerif.pfb
new file mode 100644
index 000000000..3fa682efb
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSerif.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSerifBold.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSerifBold.pfb
new file mode 100644
index 000000000..ff7c6ddec
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSerifBold.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb
new file mode 100644
index 000000000..460231fb8
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb
new file mode 100644
index 000000000..d03a7c781
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/FoxitSymbol.pfb 
b/third-party/pdfjs/web/standard_fonts/FoxitSymbol.pfb
new file mode 100644
index 000000000..c8f9bca78
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/FoxitSymbol.pfb differ
diff --git a/third-party/pdfjs/web/standard_fonts/LICENSE_FOXIT 
b/third-party/pdfjs/web/standard_fonts/LICENSE_FOXIT
new file mode 100644
index 000000000..8b4ed6ddd
--- /dev/null
+++ b/third-party/pdfjs/web/standard_fonts/LICENSE_FOXIT
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third-party/pdfjs/web/standard_fonts/LICENSE_LIBERATION 
b/third-party/pdfjs/web/standard_fonts/LICENSE_LIBERATION
new file mode 100644
index 000000000..aba73e8a4
--- /dev/null
+++ b/third-party/pdfjs/web/standard_fonts/LICENSE_LIBERATION
@@ -0,0 +1,102 @@
+Digitized data copyright (c) 2010 Google Corporation
+       with Reserved Font Arimo, Tinos and Cousine.
+Copyright (c) 2012 Red Hat, Inc.
+       with Reserved Font Name Liberation.
+
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+
+PREAMBLE The goals of the Open Font License (OFL) are to stimulate
+worldwide development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to provide
+a free and open framework in which fonts may be shared and improved in
+partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves.
+The fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works.  The fonts and derivatives,
+however, cannot be released under any other type of license.  The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+ 
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such.
+This may include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components
+as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting ? in part or in whole ?
+any of the components of the Original Version, by changing formats or
+by porting the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer
+or other person who contributed to the Font Software.
+
+
+PERMISSION & CONDITIONS
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,in
+   Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+   redistributed and/or sold with any software, provided that each copy
+   contains the above copyright notice and this license. These can be
+   included either as stand-alone text files, human-readable headers or
+   in the appropriate machine-readable metadata fields within text or
+   binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+   Name(s) unless explicit written permission is granted by the
+   corresponding Copyright Holder. This restriction only applies to the
+   primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+   Software shall not be used to promote, endorse or advertise any
+   Modified Version, except to acknowledge the contribution(s) of the
+   Copyright Holder(s) and the Author(s) or with their explicit written
+   permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must
+   be distributed entirely under this license, and must not be distributed
+   under any other license. The requirement for fonts to remain under
+   this license does not apply to any document created using the Font
+   Software.
+
+
+ 
+TERMINATION
+This license becomes null and void if any of the above conditions are not met.
+
+ 
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT.  IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
+DEALINGS IN THE FONT SOFTWARE.
+
diff --git a/third-party/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf 
b/third-party/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf
new file mode 100644
index 000000000..ee2371540
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf differ
diff --git a/third-party/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf 
b/third-party/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf
new file mode 100644
index 000000000..42b5717dd
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf differ
diff --git a/third-party/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf 
b/third-party/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf
new file mode 100644
index 000000000..0cf612634
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf differ
diff --git a/third-party/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf 
b/third-party/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf
new file mode 100644
index 000000000..366d1489c
Binary files /dev/null and b/third-party/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf differ
diff --git a/third-party/pdfjs/web/viewer.css b/third-party/pdfjs/web/viewer.css
index 21af9931d..5261568a8 100644
--- a/third-party/pdfjs/web/viewer.css
+++ b/third-party/pdfjs/web/viewer.css
@@ -16,6 +16,7 @@
 
 .textLayer {
   position: absolute;
+  text-align: initial;
   left: 0;
   top: 0;
   right: 0;
@@ -25,7 +26,8 @@
   line-height: 1;
 }
 
-.textLayer > span {
+.textLayer span,
+.textLayer br {
   color: transparent;
   position: absolute;
   white-space: pre;
@@ -40,16 +42,20 @@
   border-radius: 4px;
 }
 
+.textLayer .highlight.appended {
+  position: initial;
+}
+
 .textLayer .highlight.begin {
-  border-radius: 4px 0px 0px 4px;
+  border-radius: 4px 0 0 4px;
 }
 
 .textLayer .highlight.end {
-  border-radius: 0px 4px 4px 0px;
+  border-radius: 0 4px 4px 0;
 }
 
 .textLayer .highlight.middle {
-  border-radius: 0px;
+  border-radius: 0;
 }
 
 .textLayer .highlight.selected {
@@ -67,25 +73,25 @@
 .textLayer .endOfContent {
   display: block;
   position: absolute;
-  left: 0px;
+  left: 0;
   top: 100%;
-  right: 0px;
-  bottom: 0px;
+  right: 0;
+  bottom: 0;
   z-index: -1;
   cursor: default;
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
 }
 
 .textLayer .endOfContent.active {
-  top: 0px;
+  top: 0;
 }
 
 
 .annotationLayer section {
   position: absolute;
+  text-align: initial;
 }
 
 .annotationLayer .linkAnnotation > a,
@@ -102,7 +108,7 @@
 .annotationLayer .buttonWidgetAnnotation.pushButton > a:hover {
   opacity: 0.2;
   background: rgba(255, 255, 0, 1);
-  box-shadow: 0px 2px 10px rgba(255, 255, 0, 1);
+  box-shadow: 0 2px 10px rgba(255, 255, 0, 1);
 }
 
 .annotationLayer .textAnnotation img {
@@ -210,7 +216,7 @@
    * area, causing horizontal scrolling. We avoid this by extending the width
    * when the element has focus and revert this when it loses focus.
    */
-  width: 115%;
+  width: 103%;
 }
 
 .annotationLayer .buttonWidgetAnnotation.checkBox input,
@@ -231,13 +237,14 @@
   z-index: 200;
   max-width: 20em;
   background-color: rgba(255, 255, 153, 1);
-  box-shadow: 0px 2px 5px rgba(136, 136, 136, 1);
+  box-shadow: 0 2px 5px rgba(136, 136, 136, 1);
   border-radius: 2px;
   padding: 6px;
   margin-left: 5px;
   cursor: pointer;
   font: message-box;
   font-size: 9px;
+  white-space: normal;
   word-wrap: break-word;
 }
 
@@ -277,6 +284,283 @@
   cursor: pointer;
 }
 
+
+.xfaPage {
+  overflow: hidden;
+  position: relative;
+}
+
+.xfaContentarea {
+  position: absolute;
+}
+
+.xfaPrintOnly {
+  display: none;
+}
+
+.xfaLayer {
+  position: absolute;
+  text-align: initial;
+  top: 0;
+  left: 0;
+  transform-origin: 0 0;
+  line-height: 1.2;
+}
+
+.xfaLayer * {
+  color: inherit;
+  font: inherit;
+  font-style: inherit;
+  font-weight: inherit;
+  font-kerning: inherit;
+  letter-spacing: -0.01px;
+  text-align: inherit;
+  text-decoration: inherit;
+  box-sizing: border-box;
+  background: transparent;
+  padding: 0;
+  margin: 0;
+  pointer-events: auto;
+}
+
+.xfaLayer div {
+  pointer-events: none;
+}
+
+.xfaLayer svg {
+  pointer-events: none;
+}
+
+.xfaLayer svg * {
+  pointer-events: none;
+}
+
+.xfaLayer a {
+  color: blue;
+}
+
+.xfaRich li {
+  margin-left: 3em;
+}
+
+.xfaFont {
+  color: black;
+  font-weight: normal;
+  font-kerning: none;
+  font-size: 10px;
+  font-style: normal;
+  letter-spacing: 0;
+  text-decoration: none;
+  vertical-align: 0;
+}
+
+.xfaCaption {
+  overflow: hidden;
+  flex: 0 1 auto;
+}
+
+.xfaCaptionForCheckButton {
+  overflow: hidden;
+  flex: 1 1 auto;
+}
+
+.xfaLabel {
+  height: 100%;
+  width: 100%;
+}
+
+.xfaLeft {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+
+.xfaLeft > .xfaCaption,
+.xfaLeft > .xfaCaptionForCheckButton {
+  max-height: 100%;
+}
+
+.xfaTop {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+.xfaTop > .xfaCaption,
+.xfaTop > .xfaCaptionForCheckButton {
+  width: 100%;
+}
+
+.xfaBorder {
+  background: transparent;
+  position: absolute;
+  pointer-events: none;
+}
+
+.xfaWrapped {
+  width: 100%;
+  height: 100%;
+}
+
+.xfaTextfield,
+.xfaSelect {
+  background-color: rgba(0, 54, 255, 0.13);
+}
+
+.xfaTextfield:focus,
+.xfaSelect:focus {
+  background-color: transparent;
+  outline: none;
+}
+
+.xfaTextfield,
+.xfaSelect {
+  width: 100%;
+  height: 100%;
+  flex: 1 1 0;
+  border: none;
+  resize: none;
+}
+
+.xfaButton {
+  cursor: pointer;
+  width: 100%;
+  height: 100%;
+  border: none;
+  text-align: center;
+}
+
+.xfaButton:hover {
+  background: Highlight;
+}
+
+.xfaCheckbox,
+.xfaRadio {
+  width: 100%;
+  height: 100%;
+  flex: 0 0 auto;
+  border: none;
+}
+
+.xfaRich {
+  white-space: pre-wrap;
+  width: 100%;
+  height: 100%;
+}
+
+.xfaImage {
+  -o-object-position: left top;
+     object-position: left top;
+  -o-object-fit: contain;
+     object-fit: contain;
+  width: 100%;
+  height: 100%;
+}
+
+.xfaLrTb,
+.xfaRlTb,
+.xfaTb {
+  display: flex;
+  flex-direction: column;
+  align-items: stretch;
+}
+
+.xfaLr {
+  display: flex;
+  flex-direction: row;
+  align-items: stretch;
+}
+
+.xfaRl {
+  display: flex;
+  flex-direction: row-reverse;
+  align-items: stretch;
+}
+
+.xfaTb > div {
+  justify-content: left;
+}
+
+.xfaPosition {
+  position: relative;
+}
+
+.xfaArea {
+  position: relative;
+}
+
+.xfaValignMiddle {
+  display: flex;
+  align-items: center;
+}
+
+.xfaTable {
+  display: flex;
+  flex-direction: column;
+  align-items: stretch;
+}
+
+.xfaTable .xfaRow {
+  display: flex;
+  flex-direction: row;
+  align-items: stretch;
+}
+
+.xfaTable .xfaRlRow {
+  display: flex;
+  flex-direction: row-reverse;
+  align-items: stretch;
+  flex: 1;
+}
+
+.xfaTable .xfaRlRow > div {
+  flex: 1;
+}
+
+.xfaNonInteractive input,
+.xfaNonInteractive textarea,
+.xfaDisabled input,
+.xfaDisabled textarea,
+.xfaReadOnly input,
+.xfaReadOnly textarea {
+  background: initial;
+}
+
+@media print {
+  .xfaTextfield,
+  .xfaSelect {
+    background-color: transparent;
+  }
+
+  .xfaSelect {
+    -webkit-appearance: none;
+       -moz-appearance: none;
+            appearance: none;
+    text-indent: 1px;
+    text-overflow: "";
+  }
+}
+
+:root {
+  --pdfViewer-padding-bottom: none;
+  --page-margin: 1px auto -8px;
+  --page-border: 9px solid transparent;
+  --spreadHorizontalWrapped-margin-LR: -3.5px;
+}
+
+@media screen and (forced-colors: active) {
+  :root {
+    --pdfViewer-padding-bottom: 9px;
+    --page-margin: 9px auto 0;
+    --page-border: none;
+    --spreadHorizontalWrapped-margin-LR: 4.5px;
+  }
+}
+
+.pdfViewer {
+  padding-bottom: var(--pdfViewer-padding-bottom);
+}
+
 .pdfViewer .canvasWrapper {
   overflow: hidden;
 }
@@ -285,10 +569,10 @@
   direction: ltr;
   width: 816px;
   height: 1056px;
-  margin: 1px auto -8px auto;
+  margin: var(--page-margin);
   position: relative;
   overflow: visible;
-  border: 9px solid transparent;
+  border: var(--page-border);
   background-clip: content-box;
   -o-border-image: url(images/shadow.png) 9 9 repeat;
      border-image: url(images/shadow.png) 9 9 repeat;
@@ -296,7 +580,7 @@
 }
 
 .pdfViewer.removePageBorders .page {
-  margin: 0px auto 10px auto;
+  margin: 0 auto 10px;
   border: none;
 }
 
@@ -341,8 +625,8 @@
 .spread .page,
 .pdfViewer.scrollHorizontal .page,
 .pdfViewer.scrollWrapped .page {
-  margin-left: -3.5px;
-  margin-right: -3.5px;
+  margin-left: var(--spreadHorizontalWrapped-margin-LR);
+  margin-right: var(--spreadHorizontalWrapped-margin-LR);
 }
 
 .pdfViewer.removePageBorders .spread .page,
@@ -387,20 +671,11 @@
   margin-right: auto;
 }
 
-.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {
-  margin-bottom: 100% !important;
-}
-
 .pdfPresentationMode:-webkit-full-screen .pdfViewer .page {
   margin-bottom: 100%;
   border: 0;
 }
 
-.pdfPresentationMode:-moz-full-screen .pdfViewer .page {
-  margin-bottom: 100%;
-  border: 0;
-}
-
 .pdfPresentationMode:fullscreen .pdfViewer .page {
   margin-bottom: 100%;
   border: 0;
@@ -410,41 +685,49 @@
   --sidebar-width: 200px;
   --sidebar-transition-duration: 200ms;
   --sidebar-transition-timing-function: ease;
+  --loadingBar-end-offset: 0;
 
   --toolbar-icon-opacity: 0.7;
   --doorhanger-icon-opacity: 0.9;
 
   --main-color: rgba(12, 12, 13, 1);
   --body-bg-color: rgba(237, 237, 240, 1);
-  --errorWrapper-bg-color: rgba(255, 74, 74, 1);
+  --errorWrapper-bg-color: rgba(255, 110, 110, 1);
   --progressBar-color: rgba(10, 132, 255, 1);
   --progressBar-indeterminate-bg-color: rgba(221, 221, 222, 1);
   --progressBar-indeterminate-blend-color: rgba(116, 177, 239, 1);
   --scrollbar-color: auto;
   --scrollbar-bg-color: auto;
+  --toolbar-icon-bg-color: rgba(0, 0, 0, 1);
+  --toolbar-icon-hover-bg-color: rgba(0, 0, 0, 1);
 
-  --sidebar-bg-color: rgba(245, 246, 247, 1);
+  --sidebar-narrow-bg-color: rgba(237, 237, 240, 0.9);
+  --sidebar-toolbar-bg-color: rgba(245, 246, 247, 1);
   --toolbar-bg-color: rgba(249, 249, 250, 1);
   --toolbar-border-color: rgba(204, 204, 204, 1);
   --button-hover-color: rgba(221, 222, 223, 1);
+  --toggled-btn-color: rgba(0, 0, 0, 1);
   --toggled-btn-bg-color: rgba(0, 0, 0, 0.3);
+  --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4);
   --dropdown-btn-bg-color: rgba(215, 215, 219, 1);
   --separator-color: rgba(0, 0, 0, 0.3);
   --field-color: rgba(6, 6, 6, 1);
   --field-bg-color: rgba(255, 255, 255, 1);
   --field-border-color: rgba(187, 187, 188, 1);
   --findbar-nextprevious-btn-bg-color: rgba(227, 228, 230, 1);
-  --outline-color: rgba(0, 0, 0, 0.8);
-  --outline-hover-color: rgba(0, 0, 0, 0.9);
-  --outline-active-color: rgba(0, 0, 0, 0.08);
-  --outline-active-bg-color: rgba(0, 0, 0, 1);
+  --treeitem-color: rgba(0, 0, 0, 0.8);
+  --treeitem-hover-color: rgba(0, 0, 0, 0.9);
+  --treeitem-selected-color: rgba(0, 0, 0, 0.9);
+  --treeitem-selected-bg-color: rgba(0, 0, 0, 0.25);
   --sidebaritem-bg-color: rgba(0, 0, 0, 0.15);
   --doorhanger-bg-color: rgba(255, 255, 255, 1);
   --doorhanger-border-color: rgba(12, 12, 13, 0.2);
-  --doorhanger-hover-color: rgba(237, 237, 237, 1);
+  --doorhanger-hover-color: rgba(12, 12, 13, 1);
+  --doorhanger-hover-bg-color: rgba(237, 237, 237, 1);
   --doorhanger-separator-color: rgba(222, 222, 222, 1);
+  --overlay-button-border: 0 none;
   --overlay-button-bg-color: rgba(12, 12, 13, 0.1);
-  --overlay-button-hover-color: rgba(12, 12, 13, 0.3);
+  --overlay-button-hover-bg-color: rgba(12, 12, 13, 0.3);
 
   --loading-icon: url(images/loading.svg);
   --treeitem-expanded-icon: url(images/treeitem-expanded.svg);
@@ -465,6 +748,7 @@
   --toolbarButton-viewOutline-icon: url(images/toolbarButton-viewOutline.svg);
   --toolbarButton-viewAttachments-icon: url(images/toolbarButton-viewAttachments.svg);
   --toolbarButton-viewLayers-icon: url(images/toolbarButton-viewLayers.svg);
+  --toolbarButton-currentOutlineItem-icon: url(images/toolbarButton-currentOutlineItem.svg);
   --toolbarButton-search-icon: url(images/toolbarButton-search.svg);
   --findbarButton-previous-icon: url(images/findbarButton-previous.svg);
   --findbarButton-next-icon: url(images/findbarButton-next.svg);
@@ -487,71 +771,66 @@
   :root {
     --main-color: rgba(249, 249, 250, 1);
     --body-bg-color: rgba(42, 42, 46, 1);
-    --errorWrapper-bg-color: rgba(199, 17, 17, 1);
+    --errorWrapper-bg-color: rgba(169, 14, 14, 1);
     --progressBar-color: rgba(0, 96, 223, 1);
     --progressBar-indeterminate-bg-color: rgba(40, 40, 43, 1);
     --progressBar-indeterminate-blend-color: rgba(20, 68, 133, 1);
     --scrollbar-color: rgba(121, 121, 123, 1);
     --scrollbar-bg-color: rgba(35, 35, 39, 1);
+    --toolbar-icon-bg-color: rgba(255, 255, 255, 1);
+    --toolbar-icon-hover-bg-color: rgba(255, 255, 255, 1);
 
-    --sidebar-bg-color: rgba(50, 50, 52, 1);
+    --sidebar-narrow-bg-color: rgba(42, 42, 46, 0.9);
+    --sidebar-toolbar-bg-color: rgba(50, 50, 52, 1);
     --toolbar-bg-color: rgba(56, 56, 61, 1);
     --toolbar-border-color: rgba(12, 12, 13, 1);
     --button-hover-color: rgba(102, 102, 103, 1);
+    --toggled-btn-color: rgba(255, 255, 255, 1);
     --toggled-btn-bg-color: rgba(0, 0, 0, 0.3);
+    --toggled-hover-active-btn-color: rgba(0, 0, 0, 0.4);
     --dropdown-btn-bg-color: rgba(74, 74, 79, 1);
     --separator-color: rgba(0, 0, 0, 0.3);
     --field-color: rgba(250, 250, 250, 1);
     --field-bg-color: rgba(64, 64, 68, 1);
     --field-border-color: rgba(115, 115, 115, 1);
     --findbar-nextprevious-btn-bg-color: rgba(89, 89, 89, 1);
-    --outline-color: rgba(255, 255, 255, 0.8);
-    --outline-hover-color: rgba(255, 255, 255, 0.9);
-    --outline-active-color: rgba(255, 255, 255, 0.08);
-    --outline-active-bg-color: rgba(255, 255, 255, 1);
+    --treeitem-color: rgba(255, 255, 255, 0.8);
+    --treeitem-hover-color: rgba(255, 255, 255, 0.9);
+    --treeitem-selected-color: rgba(255, 255, 255, 0.9);
+    --treeitem-selected-bg-color: rgba(255, 255, 255, 0.25);
     --sidebaritem-bg-color: rgba(255, 255, 255, 0.15);
     --doorhanger-bg-color: rgba(74, 74, 79, 1);
     --doorhanger-border-color: rgba(39, 39, 43, 1);
-    --doorhanger-hover-color: rgba(93, 94, 98, 1);
+    --doorhanger-hover-color: rgba(249, 249, 250, 1);
+    --doorhanger-hover-bg-color: rgba(93, 94, 98, 1);
     --doorhanger-separator-color: rgba(92, 92, 97, 1);
     --overlay-button-bg-color: rgba(92, 92, 97, 1);
-    --overlay-button-hover-color: rgba(115, 115, 115, 1);
+    --overlay-button-hover-bg-color: rgba(115, 115, 115, 1);
 
+    /* This image is used in <input> elements, which unfortunately means that
+     * the `mask-image` approach used with all of the other images doesn't work
+     * here; hence why we still have two versions of this particular image. */
     --loading-icon: url(images/loading-dark.svg);
-    --treeitem-expanded-icon: url(images/treeitem-expanded-dark.svg);
-    --treeitem-collapsed-icon: url(images/treeitem-collapsed-dark.svg);
-    --toolbarButton-menuArrow-icon: url(images/toolbarButton-menuArrow-dark.svg);
-    --toolbarButton-sidebarToggle-icon: url(images/toolbarButton-sidebarToggle-dark.svg);
-    --toolbarButton-secondaryToolbarToggle-icon: url(images/toolbarButton-secondaryToolbarToggle-dark.svg);
-    --toolbarButton-pageUp-icon: url(images/toolbarButton-pageUp-dark.svg);
-    --toolbarButton-pageDown-icon: url(images/toolbarButton-pageDown-dark.svg);
-    --toolbarButton-zoomOut-icon: url(images/toolbarButton-zoomOut-dark.svg);
-    --toolbarButton-zoomIn-icon: url(images/toolbarButton-zoomIn-dark.svg);
-    --toolbarButton-presentationMode-icon: url(images/toolbarButton-presentationMode-dark.svg);
-    --toolbarButton-print-icon: url(images/toolbarButton-print-dark.svg);
-    --toolbarButton-openFile-icon: url(images/toolbarButton-openFile-dark.svg);
-    --toolbarButton-download-icon: url(images/toolbarButton-download-dark.svg);
-    --toolbarButton-bookmark-icon: url(images/toolbarButton-bookmark-dark.svg);
-    --toolbarButton-viewThumbnail-icon: url(images/toolbarButton-viewThumbnail-dark.svg);
-    --toolbarButton-viewOutline-icon: url(images/toolbarButton-viewOutline-dark.svg);
-    --toolbarButton-viewAttachments-icon: url(images/toolbarButton-viewAttachments-dark.svg);
-    --toolbarButton-viewLayers-icon: url(images/toolbarButton-viewLayers-dark.svg);
-    --toolbarButton-search-icon: url(images/toolbarButton-search-dark.svg);
-    --findbarButton-previous-icon: url(images/findbarButton-previous-dark.svg);
-    --findbarButton-next-icon: url(images/findbarButton-next-dark.svg);
-    --secondaryToolbarButton-firstPage-icon: url(images/secondaryToolbarButton-firstPage-dark.svg);
-    --secondaryToolbarButton-lastPage-icon: url(images/secondaryToolbarButton-lastPage-dark.svg);
-    --secondaryToolbarButton-rotateCcw-icon: url(images/secondaryToolbarButton-rotateCcw-dark.svg);
-    --secondaryToolbarButton-rotateCw-icon: url(images/secondaryToolbarButton-rotateCw-dark.svg);
-    --secondaryToolbarButton-selectTool-icon: url(images/secondaryToolbarButton-selectTool-dark.svg);
-    --secondaryToolbarButton-handTool-icon: url(images/secondaryToolbarButton-handTool-dark.svg);
-    --secondaryToolbarButton-scrollVertical-icon: url(images/secondaryToolbarButton-scrollVertical-dark.svg);
-    --secondaryToolbarButton-scrollHorizontal-icon: 
url(images/secondaryToolbarButton-scrollHorizontal-dark.svg);
-    --secondaryToolbarButton-scrollWrapped-icon: url(images/secondaryToolbarButton-scrollWrapped-dark.svg);
-    --secondaryToolbarButton-spreadNone-icon: url(images/secondaryToolbarButton-spreadNone-dark.svg);
-    --secondaryToolbarButton-spreadOdd-icon: url(images/secondaryToolbarButton-spreadOdd-dark.svg);
-    --secondaryToolbarButton-spreadEven-icon: url(images/secondaryToolbarButton-spreadEven-dark.svg);
-    --secondaryToolbarButton-documentProperties-icon: 
url(images/secondaryToolbarButton-documentProperties-dark.svg);
+  }
+}
+
+@media screen and (forced-colors: active) {
+  :root {
+    --main-color: ButtonText;
+    --button-hover-color: Highlight;
+    --doorhanger-hover-bg-color: Highlight;
+    --toolbar-icon-opacity: 1;
+    --toolbar-icon-bg-color: ButtonText;
+    --toolbar-icon-hover-bg-color: ButtonFace;
+    --toggled-btn-color: HighlightText;
+    --toggled-btn-bg-color: LinkText;
+    --doorhanger-hover-color: ButtonFace;
+    --doorhanger-border-color-whcm: 1px solid ButtonText;
+    --doorhanger-triangle-opacity-whcm: 0;
+    --overlay-button-border: 1px solid Highlight;
+    --overlay-button-hover-bg-color: Highlight;
+    --overlay-button-hover-color: ButtonFace;
+    --field-border-color: ButtonText;
   }
 }
 
@@ -570,318 +849,104 @@ html {
 body {
   height: 100%;
   width: 100%;
-  background-color: rgba(237, 237, 240, 1);
-  background-color: var(--body-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  body {
-  background-color: rgba(42, 42, 46, 1);
   background-color: var(--body-bg-color);
-  }
 }
 
-body {
+body,
+input,
+button,
+select {
   font: message-box;
   outline: none;
-  scrollbar-color: auto auto;
   scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  body {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.hidden {
+  display: none !important;
 }
-
-@media (prefers-color-scheme: dark) {
-
-  body {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+[hidden] {
+  display: none !important;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  body {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.pdfViewer.enablePermissions .textLayer span {
+  -webkit-user-select: none !important;
+     -moz-user-select: none !important;
+          user-select: none !important;
+  cursor: not-allowed;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  body {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+#viewerContainer.pdfPresentationMode:-webkit-full-screen {
+  top: 0;
+  border-top: 2px solid rgba(0, 0, 0, 0);
+  background-color: rgba(0, 0, 0, 1);
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -webkit-user-select: none;
+          user-select: none;
 }
 
-input {
-  font: message-box;
-  outline: none;
-  scrollbar-color: auto auto;
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
+#viewerContainer.pdfPresentationMode:fullscreen {
+  top: 0;
+  border-top: 2px solid rgba(0, 0, 0, 0);
+  background-color: rgba(0, 0, 0, 1);
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+          user-select: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  input {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {
+  display: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  input {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.pdfPresentationMode:fullscreen a:not(.internalLink) {
+  display: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  input {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.pdfPresentationMode:-webkit-full-screen .textLayer span {
+  cursor: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  input {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
+.pdfPresentationMode:fullscreen .textLayer span {
+  cursor: none;
 }
 
-button {
-  font: message-box;
-  outline: none;
-  scrollbar-color: auto auto;
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
+.pdfPresentationMode.pdfPresentationModeControls > *,
+.pdfPresentationMode.pdfPresentationModeControls .textLayer span {
+  cursor: default;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  button {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  button {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  button {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  button {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-select {
-  font: message-box;
-  outline: none;
-  scrollbar-color: auto auto;
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  select {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  select {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  select {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  select {
-  scrollbar-color: rgba(121, 121, 123, 1) rgba(35, 35, 39, 1);
-  scrollbar-color: var(--scrollbar-color) var(--scrollbar-bg-color);
-  }
-}
-
-.hidden {
-  display: none !important;
-}
-[hidden] {
-  display: none !important;
-}
-
-.pdfViewer.enablePermissions .textLayer > span {
-  -webkit-user-select: none !important;
-     -moz-user-select: none !important;
-      -ms-user-select: none !important;
-          user-select: none !important;
-  cursor: not-allowed;
-}
-
-#viewerContainer.pdfPresentationMode:-ms-fullscreen {
-  top: 0px !important;
-  overflow: hidden !important;
-}
-
-#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {
-  background-color: rgba(0, 0, 0, 1);
-}
-
-#viewerContainer.pdfPresentationMode:-webkit-full-screen {
-  top: 0px;
-  border-top: 2px solid rgba(0, 0, 0, 0);
-  background-color: rgba(0, 0, 0, 1);
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -webkit-user-select: none;
-          user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:-moz-full-screen {
-  top: 0px;
-  border-top: 2px solid rgba(0, 0, 0, 0);
-  background-color: rgba(0, 0, 0, 1);
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -moz-user-select: none;
-       user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:-ms-fullscreen {
-  top: 0px;
-  border-top: 2px solid rgba(0, 0, 0, 0);
-  background-color: rgba(0, 0, 0, 1);
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -ms-user-select: none;
-      user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:fullscreen {
-  top: 0px;
-  border-top: 2px solid rgba(0, 0, 0, 0);
-  background-color: rgba(0, 0, 0, 1);
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
-
-.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:fullscreen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-webkit-full-screen .textLayer > span {
-  cursor: none;
-}
-
-.pdfPresentationMode:-moz-full-screen .textLayer > span {
-  cursor: none;
-}
-
-.pdfPresentationMode:-ms-fullscreen .textLayer > span {
-  cursor: none;
-}
-
-.pdfPresentationMode:fullscreen .textLayer > span {
-  cursor: none;
-}
-
-.pdfPresentationMode.pdfPresentationModeControls > *,
-.pdfPresentationMode.pdfPresentationModeControls .textLayer > span {
-  cursor: default;
-}
-
-#outerContainer {
-  width: 100%;
-  height: 100%;
-  position: relative;
+#outerContainer {
+  width: 100%;
+  height: 100%;
+  position: relative;
 }
 
 #sidebarContainer {
   position: absolute;
   top: 32px;
   bottom: 0;
-  width: 200px;
   width: var(--sidebar-width);
   visibility: hidden;
   z-index: 100;
   border-top: 1px solid rgba(51, 51, 51, 1);
-  transition-duration: 200ms;
   transition-duration: var(--sidebar-transition-duration);
-  transition-timing-function: ease;
   transition-timing-function: var(--sidebar-transition-timing-function);
 }
 html[dir="ltr"] #sidebarContainer {
   transition-property: left;
-  left: -200px;
   left: calc(0px - var(--sidebar-width));
+  border-right: var(--doorhanger-border-color-whcm);
 }
 html[dir="rtl"] #sidebarContainer {
   transition-property: right;
-  right: -200px;
   right: calc(0px - var(--sidebar-width));
-}
-
-.loadingInProgress #sidebarContainer {
-  top: 36px;
+  border-left: var(--doorhanger-border-color-whcm);
 }
 
 #outerContainer.sidebarResizing #sidebarContainer {
@@ -890,7 +955,6 @@ html[dir="rtl"] #sidebarContainer {
   /* Prevent e.g. the thumbnails being selected when the sidebar is resized. */
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
 }
 
@@ -899,10 +963,10 @@ html[dir="rtl"] #sidebarContainer {
   visibility: visible;
 }
 html[dir="ltr"] #outerContainer.sidebarOpen #sidebarContainer {
-  left: 0px;
+  left: 0;
 }
 html[dir="rtl"] #outerContainer.sidebarOpen #sidebarContainer {
-  right: 0px;
+  right: 0;
 }
 
 #mainContainer {
@@ -943,9 +1007,7 @@ html[dir="rtl"] #sidebarContent {
   outline: none;
 }
 #viewerContainer:not(.pdfPresentationMode) {
-  transition-duration: 200ms;
   transition-duration: var(--sidebar-transition-duration);
-  transition-timing-function: ease;
   transition-timing-function: var(--sidebar-transition-timing-function);
 }
 
@@ -958,14 +1020,12 @@ html[dir="ltr"]
   #outerContainer.sidebarOpen
   #viewerContainer:not(.pdfPresentationMode) {
   transition-property: left;
-  left: 200px;
   left: var(--sidebar-width);
 }
 html[dir="rtl"]
   #outerContainer.sidebarOpen
   #viewerContainer:not(.pdfPresentationMode) {
   transition-property: right;
-  right: 200px;
   right: var(--sidebar-width);
 }
 
@@ -984,16 +1044,7 @@ html[dir="rtl"]
 #toolbarSidebar {
   width: 100%;
   height: 32px;
-  background-color: rgba(245, 246, 247, 1);
-  background-color: var(--sidebar-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #toolbarSidebar {
-  background-color: rgba(50, 50, 52, 1);
-  background-color: var(--sidebar-bg-color);
-  }
+  background-color: var(--sidebar-toolbar-bg-color);
 }
 html[dir="ltr"] #toolbarSidebar {
   box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(0, 0, 0, 0.15),
@@ -1011,6 +1062,13 @@ html[dir="rtl"] #toolbarSidebar .toolbarButton {
   margin-left: 2px !important;
 }
 
+html[dir="ltr"] #toolbarSidebarRight .toolbarButton {
+  margin-right: 3px !important;
+}
+html[dir="rtl"] #toolbarSidebarRight .toolbarButton {
+  margin-left: 3px !important;
+}
+
 #sidebarResizer {
   position: absolute;
   top: 0;
@@ -1026,145 +1084,49 @@ html[dir="rtl"] #sidebarResizer {
   left: -6px;
 }
 
-#toolbarContainer {
-  position: relative;
-  height: 32px;
-  background-color: rgba(249, 249, 250, 1);
-  background-color: var(--toolbar-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #toolbarContainer {
-  background-color: rgba(56, 56, 61, 1);
-  background-color: var(--toolbar-bg-color);
-  }
-}
-
-.findbar {
-  position: relative;
-  height: 32px;
-  background-color: rgba(249, 249, 250, 1);
-  background-color: var(--toolbar-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar {
-  background-color: rgba(56, 56, 61, 1);
-  background-color: var(--toolbar-bg-color);
-  }
-}
-
+#toolbarContainer,
+.findbar,
 .secondaryToolbar {
   position: relative;
   height: 32px;
-  background-color: rgba(249, 249, 250, 1);
-  background-color: var(--toolbar-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbar {
-  background-color: rgba(56, 56, 61, 1);
   background-color: var(--toolbar-bg-color);
-  }
-}
-html[dir="ltr"] #toolbarContainer {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  html[dir="ltr"] #toolbarContainer {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
-.findbar {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
   box-shadow: 0 1px 0 var(--toolbar-border-color);
 }
-@media (prefers-color-scheme: dark) {
-
-  .findbar {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
-.secondaryToolbar {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbar {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
-html[dir="rtl"] #toolbarContainer {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  html[dir="rtl"] #toolbarContainer {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
-.findbar {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .findbar {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
-.secondaryToolbar {
-  box-shadow: 0 1px 0 rgba(204, 204, 204, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbar {
-  box-shadow: 0 1px 0 rgba(12, 12, 13, 1);
-  box-shadow: 0 1px 0 var(--toolbar-border-color);
-  }
-}
 
 #toolbarViewer {
   height: 32px;
 }
 
 #loadingBar {
-  position: relative;
-  width: 100%;
+  position: absolute;
   height: 4px;
-  background-color: rgba(237, 237, 240, 1);
   background-color: var(--body-bg-color);
-  border-bottom: 1px solid rgba(204, 204, 204, 1);
   border-bottom: 1px solid var(--toolbar-border-color);
-}
 
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar {
-  border-bottom: 1px solid rgba(12, 12, 13, 1);
-  border-bottom: 1px solid var(--toolbar-border-color);
-  }
+  transition-duration: var(--sidebar-transition-duration);
+  transition-timing-function: var(--sidebar-transition-timing-function);
+}
+html[dir="ltr"] #loadingBar {
+  transition-property: left;
+  left: 0;
+  right: var(--loadingBar-end-offset);
+}
+html[dir="rtl"] #loadingBar {
+  transition-property: right;
+  left: var(--loadingBar-end-offset);
+  right: 0;
 }
 
-@media (prefers-color-scheme: dark) {
+html[dir="ltr"] #outerContainer.sidebarOpen #loadingBar {
+  left: var(--sidebar-width);
+}
+html[dir="rtl"] #outerContainer.sidebarOpen #loadingBar {
+  right: var(--sidebar-width);
+}
 
-  #loadingBar {
-  background-color: rgba(42, 42, 46, 1);
-  background-color: var(--body-bg-color);
-  }
+#outerContainer.sidebarResizing #loadingBar {
+  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
+  transition-duration: 0s;
 }
 
 #loadingBar .progress {
@@ -1173,20 +1135,11 @@ html[dir="rtl"] #toolbarContainer {
   left: 0;
   width: 0%;
   height: 100%;
-  background-color: rgba(10, 132, 255, 1);
   background-color: var(--progressBar-color);
   overflow: hidden;
   transition: width 200ms;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress {
-  background-color: rgba(0, 96, 223, 1);
-  background-color: var(--progressBar-color);
-  }
-}
-
 @-webkit-keyframes progressIndeterminate {
   0% {
     left: -142px;
@@ -1206,34 +1159,16 @@ html[dir="rtl"] #toolbarContainer {
 }
 
 #loadingBar .progress.indeterminate {
-  background-color: rgba(221, 221, 222, 1);
   background-color: var(--progressBar-indeterminate-bg-color);
   transition: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate {
-  background-color: rgba(40, 40, 43, 1);
-  background-color: var(--progressBar-indeterminate-bg-color);
-  }
-}
-
 #loadingBar .progress.indeterminate .glimmer {
   position: absolute;
   top: 0;
   left: 0;
   height: 100%;
   width: calc(100% + 150px);
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(116, 177, 239, 1) 0,
-    rgba(221, 221, 222, 1) 5px,
-    rgba(221, 221, 222, 1) 45px,
-    rgba(10, 132, 255, 1) 55px,
-    rgba(10, 132, 255, 1) 95px,
-    rgba(116, 177, 239, 1) 100px
-  );
   background: repeating-linear-gradient(
     135deg,
     var(--progressBar-indeterminate-blend-color) 0,
@@ -1247,222 +1182,6 @@ html[dir="rtl"] #toolbarContainer {
           animation: progressIndeterminate 1s linear infinite;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #loadingBar .progress.indeterminate .glimmer {
-  background: repeating-linear-gradient(
-    135deg,
-    rgba(20, 68, 133, 1) 0,
-    rgba(40, 40, 43, 1) 5px,
-    rgba(40, 40, 43, 1) 45px,
-    rgba(0, 96, 223, 1) 55px,
-    rgba(0, 96, 223, 1) 95px,
-    rgba(20, 68, 133, 1) 100px
-  );
-  background: repeating-linear-gradient(
-    135deg,
-    var(--progressBar-indeterminate-blend-color) 0,
-    var(--progressBar-indeterminate-bg-color) 5px,
-    var(--progressBar-indeterminate-bg-color) 45px,
-    var(--progressBar-color) 55px,
-    var(--progressBar-color) 95px,
-    var(--progressBar-indeterminate-blend-color) 100px
-  );
-  }
-}
-
 .findbar,
 .secondaryToolbar {
   top: 32px;
@@ -1470,8 +1189,8 @@ html[dir="rtl"] #toolbarContainer {
   z-index: 10000;
   height: auto;
   min-width: 16px;
-  padding: 0px 4px 0px 4px;
-  margin: 4px 2px 4px 2px;
+  padding: 0 4px;
+  margin: 4px 2px;
   color: rgba(217, 217, 217, 1);
   font-size: 12px;
   line-height: 14px;
@@ -1481,17 +1200,8 @@ html[dir="rtl"] #toolbarContainer {
 
 .findbar {
   min-width: 300px;
-  background-color: rgba(249, 249, 250, 1);
   background-color: var(--toolbar-bg-color);
 }
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar {
-  background-color: rgba(56, 56, 61, 1);
-  background-color: var(--toolbar-bg-color);
-  }
-}
 .findbar > div {
   height: 32px;
 }
@@ -1508,103 +1218,42 @@ html[dir="rtl"] .findbar {
   right: 64px;
 }
 
-html[dir="ltr"] .findbar .splitToolbarButton {
-  margin-left: 0px;
-  margin-top: 3px;
-}
-
-html[dir="rtl"] .findbar .splitToolbarButton {
-  margin-right: 0px;
+.findbar .splitToolbarButton {
   margin-top: 3px;
 }
-
-.findbar .splitToolbarButton .findNext {
-  width: 29px;
-}
-
-html[dir="ltr"] .findbar .splitToolbarButton .findNext {
-  border-right: 1px solid rgba(187, 187, 188, 1);
-  border-right: 1px solid var(--field-border-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  html[dir="ltr"] .findbar .splitToolbarButton .findNext {
-  border-right: 1px solid rgba(115, 115, 115, 1);
-  border-right: 1px solid var(--field-border-color);
-  }
-}
-
-html[dir="rtl"] .findbar .splitToolbarButton .findNext {
-  border-left: 1px solid rgba(187, 187, 188, 1);
-  border-left: 1px solid var(--field-border-color);
+html[dir="ltr"] .findbar .splitToolbarButton {
+  margin-left: 0;
+  margin-right: 5px;
 }
-
-@media (prefers-color-scheme: dark) {
-
-  html[dir="rtl"] .findbar .splitToolbarButton .findNext {
-  border-left: 1px solid rgba(115, 115, 115, 1);
-  border-left: 1px solid var(--field-border-color);
-  }
+html[dir="rtl"] .findbar .splitToolbarButton {
+  margin-left: 5px;
+  margin-right: 0;
 }
 
-.findbar .splitToolbarButton .toolbarButton {
-  background-color: rgba(227, 228, 230, 1);
+.findbar .splitToolbarButton > .toolbarButton {
   background-color: var(--findbar-nextprevious-btn-bg-color);
-  border-radius: 0px;
+  border-radius: 0;
   height: 26px;
-  border-top: 1px solid rgba(187, 187, 188, 1);
   border-top: 1px solid var(--field-border-color);
-  border-bottom: 1px solid rgba(187, 187, 188, 1);
   border-bottom: 1px solid var(--field-border-color);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .findbar .splitToolbarButton .toolbarButton {
-  border-bottom: 1px solid rgba(115, 115, 115, 1);
-  border-bottom: 1px solid var(--field-border-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar .splitToolbarButton .toolbarButton {
-  border-top: 1px solid rgba(115, 115, 115, 1);
-  border-top: 1px solid var(--field-border-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar .splitToolbarButton .toolbarButton {
-  background-color: rgba(89, 89, 89, 1);
-  background-color: var(--findbar-nextprevious-btn-bg-color);
-  }
-}
-
-.findbar .splitToolbarButton .toolbarButton::before {
+.findbar .splitToolbarButton > .toolbarButton::before {
   top: 5px;
 }
 
-html[dir="ltr"] .findbar .splitToolbarButton > .findPrevious {
-  border-radius: 0;
+.findbar .splitToolbarButton > .findNext {
+  width: 29px;
 }
 html[dir="ltr"] .findbar .splitToolbarButton > .findNext {
-  border-bottom-left-radius: 0;
   border-bottom-right-radius: 2px;
-  border-top-left-radius: 0;
   border-top-right-radius: 2px;
-}
-
-html[dir="rtl"] .findbar .splitToolbarButton > .findPrevious {
-  border-radius: 0;
+  border-right: 1px solid var(--field-border-color);
 }
 html[dir="rtl"] .findbar .splitToolbarButton > .findNext {
   border-bottom-left-radius: 2px;
-  border-bottom-right-radius: 0;
   border-top-left-radius: 2px;
-  border-top-right-radius: 0;
+  border-left: 1px solid var(--field-border-color);
 }
 
 .findbar input[type="checkbox"] {
@@ -1614,108 +1263,55 @@ html[dir="rtl"] .findbar .splitToolbarButton > .findNext {
 .findbar label {
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
 }
 
-.findbar label:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar label:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
+.findbar label:hover,
 .findbar input:focus + label {
-  background-color: rgba(221, 222, 223, 1);
+  color: var(--toggled-btn-color);
   background-color: var(--button-hover-color);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .findbar input:focus + label {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
 html[dir="ltr"] #findInput {
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
 }
-
 html[dir="rtl"] #findInput {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
 
 .findbar .toolbarField[type="checkbox"]:checked + .toolbarLabel {
-  background-color: rgba(0, 0, 0, 0.3) !important;
-  background-color: var(--toggled-btn-bg-color) !important;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .findbar .toolbarField[type="checkbox"]:checked + .toolbarLabel {
-  background-color: rgba(0, 0, 0, 0.3) !important;
   background-color: var(--toggled-btn-bg-color) !important;
-  }
+  color: var(--toggled-btn-color);
 }
 
 #findInput {
   width: 200px;
 }
-#findInput::-webkit-input-placeholder {
-  color: rgba(191, 191, 191, 1);
-}
 #findInput::-moz-placeholder {
   font-style: normal;
 }
-#findInput:-ms-input-placeholder {
-  font-style: normal;
-}
-#findInput::-ms-input-placeholder {
-  font-style: normal;
-}
 #findInput::placeholder {
   font-style: normal;
 }
 #findInput[data-status="pending"] {
-  background-image: url(images/loading.svg);
   background-image: var(--loading-icon);
   background-repeat: no-repeat;
   background-position: 98%;
 }
-@media (prefers-color-scheme: dark) {
-
-  #findInput[data-status="pending"] {
-  background-image: url(images/loading-dark.svg);
-  background-image: var(--loading-icon);
-  }
-}
 html[dir="rtl"] #findInput[data-status="pending"] {
   background-position: 3px;
 }
+#findInput[data-status="notFound"] {
+  background-color: rgba(255, 102, 102, 1);
+}
 
 .secondaryToolbar {
-  padding: 6px 0 10px 0;
+  padding: 6px 0 10px;
   height: auto;
   z-index: 30000;
-  background-color: rgba(255, 255, 255, 1);
-  background-color: var(--doorhanger-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbar {
-  background-color: rgba(74, 74, 79, 1);
   background-color: var(--doorhanger-bg-color);
-  }
 }
 html[dir="ltr"] .secondaryToolbar {
   right: 4px;
@@ -1737,40 +1333,12 @@ html[dir="rtl"] .secondaryToolbar {
   display: none !important;
 }
 
-.doorHanger {
-  border-radius: 2px;
-  box-shadow: 0 1px 5px rgba(12, 12, 13, 0.2),
-    0 0 0 1px rgba(12, 12, 13, 0.2);
-  box-shadow: 0 1px 5px var(--doorhanger-border-color),
-    0 0 0 1px var(--doorhanger-border-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .doorHanger {
-  box-shadow: 0 1px 5px rgba(39, 39, 43, 1),
-    0 0 0 1px rgba(39, 39, 43, 1);
-  box-shadow: 0 1px 5px var(--doorhanger-border-color),
-    0 0 0 1px var(--doorhanger-border-color);
-  }
-}
-
+.doorHanger,
 .doorHangerRight {
   border-radius: 2px;
-  box-shadow: 0 1px 5px rgba(12, 12, 13, 0.2),
-    0 0 0 1px rgba(12, 12, 13, 0.2);
-  box-shadow: 0 1px 5px var(--doorhanger-border-color),
-    0 0 0 1px var(--doorhanger-border-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .doorHangerRight {
-  box-shadow: 0 1px 5px rgba(39, 39, 43, 1),
-    0 0 0 1px rgba(39, 39, 43, 1);
   box-shadow: 0 1px 5px var(--doorhanger-border-color),
     0 0 0 1px var(--doorhanger-border-color);
-  }
+  border: var(--doorhanger-border-color-whcm);
 }
 .doorHanger:after,
 .doorHanger:before,
@@ -1783,57 +1351,23 @@ html[dir="rtl"] .secondaryToolbar {
   width: 0;
   position: absolute;
   pointer-events: none;
+  opacity: var(--doorhanger-triangle-opacity-whcm);
 }
 .doorHanger:after,
 .doorHangerRight:after {
   border-width: 8px;
 }
-.doorHanger:after {
-  border-bottom-color: rgba(249, 249, 250, 1);
-  border-bottom-color: var(--toolbar-bg-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .doorHanger:after {
-  border-bottom-color: rgba(56, 56, 61, 1);
+.doorHanger:after {
   border-bottom-color: var(--toolbar-bg-color);
-  }
 }
 .doorHangerRight:after {
-  border-bottom-color: rgba(255, 255, 255, 1);
-  border-bottom-color: var(--doorhanger-bg-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .doorHangerRight:after {
-  border-bottom-color: rgba(74, 74, 79, 1);
   border-bottom-color: var(--doorhanger-bg-color);
-  }
-}
-.doorHanger:before {
-  border-bottom-color: rgba(12, 12, 13, 0.2);
-  border-bottom-color: var(--doorhanger-border-color);
-  border-width: 9px;
-}
-@media (prefers-color-scheme: dark) {
-
-  .doorHanger:before {
-  border-bottom-color: rgba(39, 39, 43, 1);
-  border-bottom-color: var(--doorhanger-border-color);
-  }
 }
+.doorHanger:before,
 .doorHangerRight:before {
-  border-bottom-color: rgba(12, 12, 13, 0.2);
   border-bottom-color: var(--doorhanger-border-color);
   border-width: 9px;
 }
-@media (prefers-color-scheme: dark) {
-
-  .doorHangerRight:before {
-  border-bottom-color: rgba(39, 39, 43, 1);
-  border-bottom-color: var(--doorhanger-border-color);
-  }
-}
 
 html[dir="ltr"] .doorHanger:after,
 html[dir="rtl"] .doorHangerRight:after {
@@ -1863,7 +1397,7 @@ html[dir="ltr"] .doorHangerRight:before {
   background-color: rgba(217, 217, 217, 1);
   color: rgba(82, 82, 82, 1);
   text-align: center;
-  padding: 3px 4px;
+  padding: 4px 5px;
   margin: 5px;
 }
 
@@ -1874,10 +1408,6 @@ html[dir="ltr"] .doorHangerRight:before {
   display: none;
 }
 
-#findInput.notFound {
-  background-color: rgba(255, 102, 102, 1);
-}
-
 #toolbarViewerMiddle {
   position: absolute;
   left: 50%;
@@ -1885,16 +1415,22 @@ html[dir="ltr"] .doorHangerRight:before {
 }
 
 html[dir="ltr"] #toolbarViewerLeft,
-html[dir="rtl"] #toolbarViewerRight {
+html[dir="rtl"] #toolbarViewerRight,
+html[dir="ltr"] #toolbarSidebarLeft,
+html[dir="rtl"] #toolbarSidebarRight {
   float: left;
 }
 html[dir="ltr"] #toolbarViewerRight,
-html[dir="rtl"] #toolbarViewerLeft {
+html[dir="rtl"] #toolbarViewerLeft,
+html[dir="ltr"] #toolbarSidebarRight,
+html[dir="rtl"] #toolbarSidebarLeft {
   float: right;
 }
 html[dir="ltr"] #toolbarViewerLeft > *,
 html[dir="ltr"] #toolbarViewerMiddle > *,
 html[dir="ltr"] #toolbarViewerRight > *,
+html[dir="ltr"] #toolbarSidebarLeft *,
+html[dir="ltr"] #toolbarSidebarRight *,
 html[dir="ltr"] .findbar * {
   position: relative;
   float: left;
@@ -1902,25 +1438,21 @@ html[dir="ltr"] .findbar * {
 html[dir="rtl"] #toolbarViewerLeft > *,
 html[dir="rtl"] #toolbarViewerMiddle > *,
 html[dir="rtl"] #toolbarViewerRight > *,
+html[dir="rtl"] #toolbarSidebarLeft *,
+html[dir="rtl"] #toolbarSidebarRight *,
 html[dir="rtl"] .findbar * {
   position: relative;
   float: right;
 }
 
-html[dir="ltr"] .splitToolbarButton {
-  margin: 2px 2px 0;
-  display: inline-block;
-}
-html[dir="rtl"] .splitToolbarButton {
+.splitToolbarButton {
   margin: 2px 2px 0;
   display: inline-block;
 }
 html[dir="ltr"] .splitToolbarButton > .toolbarButton {
-  border-radius: 2px;
   float: left;
 }
 html[dir="rtl"] .splitToolbarButton > .toolbarButton {
-  border-radius: 2px;
   float: right;
 }
 
@@ -1932,42 +1464,15 @@ html[dir="rtl"] .splitToolbarButton > .toolbarButton {
   width: 28px;
   height: 28px;
 }
-.overlayButton {
-  background-color: rgba(12, 12, 13, 0.1);
-  background-color: var(--overlay-button-bg-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .overlayButton {
-  background-color: rgba(92, 92, 97, 1);
-  background-color: var(--overlay-button-bg-color);
-  }
-}
-
-.overlayButton:hover {
-  background-color: rgba(12, 12, 13, 0.3);
-  background-color: var(--overlay-button-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .overlayButton:hover {
-  background-color: rgba(115, 115, 115, 1);
-  background-color: var(--overlay-button-hover-color);
-  }
-}
 
+.overlayButton:hover,
 .overlayButton:focus {
-  background-color: rgba(12, 12, 13, 0.3);
-  background-color: var(--overlay-button-hover-color);
+  background-color: var(--overlay-button-hover-bg-color);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .overlayButton:focus {
-  background-color: rgba(115, 115, 115, 1);
-  background-color: var(--overlay-button-hover-color);
-  }
+.overlayButton:hover > span,
+.overlayButton:focus > span {
+  color: var(--overlay-button-hover-color);
 }
 
 .toolbarButton > span {
@@ -1987,120 +1492,40 @@ html[dir="rtl"] .splitToolbarButton > .toolbarButton {
   margin: 0;
 }
 
-.splitToolbarButton > .toolbarButton:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-  z-index: 199;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .splitToolbarButton > .toolbarButton:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
-.splitToolbarButton > .toolbarButton:focus {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-  z-index: 199;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .splitToolbarButton > .toolbarButton:focus {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
-.dropdownToolbarButton:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-  z-index: 199;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
-.toolbarButton.textButton:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-  z-index: 199;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.textButton:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
+.splitToolbarButton > .toolbarButton:hover,
+.splitToolbarButton > .toolbarButton:focus,
+.dropdownToolbarButton:hover,
+.toolbarButton.textButton:hover,
 .toolbarButton.textButton:focus {
-  background-color: rgba(221, 222, 223, 1);
   background-color: var(--button-hover-color);
   z-index: 199;
 }
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.textButton:focus {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
 .splitToolbarButton > .toolbarButton {
   position: relative;
 }
 html[dir="ltr"] .splitToolbarButton > .toolbarButton:first-child,
 html[dir="rtl"] .splitToolbarButton > .toolbarButton:last-child {
-  position: relative;
   margin: 0;
 }
 html[dir="ltr"] .splitToolbarButton > .toolbarButton:last-child,
 html[dir="rtl"] .splitToolbarButton > .toolbarButton:first-child {
-  position: relative;
   margin: 0;
 }
 .splitToolbarButtonSeparator {
   padding: 10px 0;
   width: 1px;
-  background-color: rgba(0, 0, 0, 0.3);
   background-color: var(--separator-color);
   z-index: 99;
   display: inline-block;
   margin: 4px 0;
 }
-@media (prefers-color-scheme: dark) {
-
-  .splitToolbarButtonSeparator {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--separator-color);
-  }
-}
 
 .findbar .splitToolbarButtonSeparator {
-  background-color: rgba(187, 187, 188, 1);
   background-color: var(--field-border-color);
   margin: 0;
   padding: 13px 0;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .findbar .splitToolbarButtonSeparator {
-  background-color: rgba(115, 115, 115, 1);
-  background-color: var(--field-border-color);
-  }
-}
-
 html[dir="ltr"] .splitToolbarButtonSeparator {
   float: left;
 }
@@ -2108,121 +1533,25 @@ html[dir="rtl"] .splitToolbarButtonSeparator {
   float: right;
 }
 
-.toolbarButton {
-  min-width: 16px;
-  padding: 2px 6px 0;
-  border: none;
-  border-radius: 2px;
-  color: rgba(12, 12, 13, 1);
-  color: var(--main-color);
-  font-size: 12px;
-  line-height: 14px;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  /* Opera does not support user-select, use <... unselectable="on"> instead */
-  cursor: default;
-  box-sizing: border-box;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
-.dropdownToolbarButton {
-  min-width: 16px;
-  padding: 2px 6px 0;
-  border: none;
-  border-radius: 2px;
-  color: rgba(12, 12, 13, 1);
-  color: var(--main-color);
-  font-size: 12px;
-  line-height: 14px;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  /* Opera does not support user-select, use <... unselectable="on"> instead */
-  cursor: default;
-  box-sizing: border-box;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
-.secondaryToolbarButton {
-  min-width: 16px;
-  padding: 2px 6px 0;
-  border: none;
-  border-radius: 2px;
-  color: rgba(12, 12, 13, 1);
-  color: var(--main-color);
-  font-size: 12px;
-  line-height: 14px;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  /* Opera does not support user-select, use <... unselectable="on"> instead */
-  cursor: default;
-  box-sizing: border-box;
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
+.toolbarButton,
+.dropdownToolbarButton,
+.secondaryToolbarButton,
 .overlayButton {
   min-width: 16px;
+  margin: 2px 1px;
   padding: 2px 6px 0;
   border: none;
   border-radius: 2px;
-  color: rgba(12, 12, 13, 1);
   color: var(--main-color);
   font-size: 12px;
   line-height: 14px;
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
-  /* Opera does not support user-select, use <... unselectable="on"> instead */
   cursor: default;
   box-sizing: border-box;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .overlayButton {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
-html[dir="ltr"] .toolbarButton,
-html[dir="ltr"] .overlayButton,
-html[dir="ltr"] .dropdownToolbarButton {
-  margin: 2px 1px;
-}
-html[dir="rtl"] .toolbarButton,
-html[dir="rtl"] .overlayButton,
-html[dir="rtl"] .dropdownToolbarButton {
-  margin: 2px 1px;
-}
-
 html[dir="ltr"] #toolbarViewerLeft > .toolbarButton:first-child,
 html[dir="rtl"] #toolbarViewerRight > .toolbarButton:last-child {
   margin-left: 2px;
@@ -2232,127 +1561,50 @@ html[dir="ltr"] #toolbarViewerRight > .toolbarButton:last-child,
 html[dir="rtl"] #toolbarViewerLeft > .toolbarButton:first-child {
   margin-right: 2px;
 }
-.toolbarButton:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
+.toolbarButton:hover,
 .toolbarButton:focus {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton:focus {
-  background-color: rgba(102, 102, 103, 1);
   background-color: var(--button-hover-color);
-  }
-}
-.secondaryToolbarButton:hover {
-  background-color: rgba(237, 237, 237, 1);
-  background-color: var(--doorhanger-hover-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton:hover {
-  background-color: rgba(93, 94, 98, 1);
-  background-color: var(--doorhanger-hover-color);
-  }
 }
+.secondaryToolbarButton:hover,
 .secondaryToolbarButton:focus {
-  background-color: rgba(237, 237, 237, 1);
-  background-color: var(--doorhanger-hover-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton:focus {
-  background-color: rgba(93, 94, 98, 1);
-  background-color: var(--doorhanger-hover-color);
-  }
-}
-
-.toolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--toggled-btn-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--toggled-btn-bg-color);
-  }
-}
-
-.splitToolbarButton.toggled > .toolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--toggled-btn-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .splitToolbarButton.toggled > .toolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--toggled-btn-bg-color);
-  }
+  background-color: var(--doorhanger-hover-bg-color);
+  color: var(--doorhanger-hover-color);
 }
 
+.toolbarButton.toggled,
+.splitToolbarButton.toggled > .toolbarButton.toggled,
 .secondaryToolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
   background-color: var(--toggled-btn-bg-color);
+  color: var(--toggled-btn-color);
 }
 
-@media (prefers-color-scheme: dark) {
+.secondaryToolbarButton.toggled::before {
+  background-color: var(--toggled-btn-color);
+}
 
-  .secondaryToolbarButton.toggled {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--toggled-btn-bg-color);
-  }
+.toolbarButton.toggled::before {
+  background-color: var(--toggled-btn-color);
 }
 
 .toolbarButton.toggled:hover:active,
 .splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
 .secondaryToolbarButton.toggled:hover:active {
-  background-color: rgba(0, 0, 0, 0.4);
+  background-color: var(--toggled-hover-active-btn-color);
 }
 
 .dropdownToolbarButton {
   width: 140px;
   padding: 0;
   overflow: hidden;
-  background-color: rgba(215, 215, 219, 1);
   background-color: var(--dropdown-btn-bg-color);
   margin-top: 2px !important;
 }
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton {
-  background-color: rgba(74, 74, 79, 1);
-  background-color: var(--dropdown-btn-bg-color);
-  }
-}
 .dropdownToolbarButton::after {
-  position: absolute;
-  display: inline-block;
   top: 6px;
-  content: url(images/toolbarButton-menuArrow.svg);
-  content: var(--toolbarButton-menuArrow-icon);
   pointer-events: none;
-  max-width: 16px;
-}
-@media (prefers-color-scheme: dark) {
 
-  .dropdownToolbarButton::after {
-  content: url(images/toolbarButton-menuArrow-dark.svg);
-  content: var(--toolbarButton-menuArrow-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-menuArrow-icon);
+  mask-image: var(--toolbarButton-menuArrow-icon);
 }
 html[dir="ltr"] .dropdownToolbarButton::after {
   right: 7px;
@@ -2363,32 +1615,14 @@ html[dir="rtl"] .dropdownToolbarButton::after {
 
 .dropdownToolbarButton > select {
   -webkit-appearance: none;
-  width: 162px;
-  height: 28px;
-  font-size: 12px;
-  color: rgba(12, 12, 13, 1);
-  color: var(--main-color);
-  margin: 0;
-  padding: 1px 0 2px;
-  border: none;
-  background-color: rgba(215, 215, 219, 1);
-  background-color: var(--dropdown-btn-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton > select {
-  background-color: rgba(74, 74, 79, 1);
-  background-color: var(--dropdown-btn-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton > select {
-  color: rgba(249, 249, 250, 1);
+  width: 162px;
+  height: 28px;
+  font-size: 12px;
   color: var(--main-color);
-  }
+  margin: 0;
+  padding: 1px 0 2px;
+  border: none;
+  background-color: var(--dropdown-btn-bg-color);
 }
 html[dir="ltr"] .dropdownToolbarButton > select {
   padding-left: 4px;
@@ -2396,42 +1630,15 @@ html[dir="ltr"] .dropdownToolbarButton > select {
 html[dir="rtl"] .dropdownToolbarButton > select {
   padding-right: 4px;
 }
-.dropdownToolbarButton > select:hover {
-  background-color: rgba(221, 222, 223, 1);
-  background-color: var(--button-hover-color);
-}
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton > select:hover {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
-}
-
+.dropdownToolbarButton > select:hover,
 .dropdownToolbarButton > select:focus {
-  background-color: rgba(221, 222, 223, 1);
   background-color: var(--button-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton > select:focus {
-  background-color: rgba(102, 102, 103, 1);
-  background-color: var(--button-hover-color);
-  }
+  color: var(--toggled-btn-color);
 }
 
 .dropdownToolbarButton > select > option {
-  background: rgba(255, 255, 255, 1);
-  background: var(--doorhanger-bg-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dropdownToolbarButton > select > option {
-  background: rgba(74, 74, 79, 1);
   background: var(--doorhanger-bg-color);
-  }
+  color: var(--main-color);
 }
 
 #customScaleOption {
@@ -2448,42 +1655,46 @@ html[dir="rtl"] .dropdownToolbarButton > select {
   height: 1px;
 }
 
-html[dir="ltr"] #findPrevious {
-  margin-left: 0;
-}
-html[dir="ltr"] #findNext {
-  margin-right: 3px;
-}
+.toolbarButton::before,
+.secondaryToolbarButton::before,
+.dropdownToolbarButton::after,
+.treeItemToggler::before {
+  /* All matching images have a size of 16x16
+   * All relevant containers have a size of 28x28 */
+  position: absolute;
+  display: inline-block;
+  width: 16px;
+  height: 16px;
 
-html[dir="rtl"] #findPrevious {
-  margin-right: 0;
+  content: "";
+  background-color: var(--toolbar-icon-bg-color);
+  -webkit-mask-size: cover;
+  mask-size: cover;
 }
-html[dir="rtl"] #findNext {
-  margin-left: 3px;
+
+.dropdownToolbarButton:hover::after,
+.dropdownToolbarButton:focus::after,
+.dropdownToolbarButton:active::after {
+  background-color: var(--toolbar-icon-hover-bg-color);
 }
 
 .toolbarButton::before {
-  opacity: 0.7;
   opacity: var(--toolbar-icon-opacity);
   top: 6px;
+  left: 6px;
 }
 
-.secondaryToolbarButton::before {
-  opacity: 0.9;
-  opacity: var(--doorhanger-icon-opacity);
-  top: 5px;
+.toolbarButton:hover::before,
+.toolbarButton:focus::before,
+.secondaryToolbarButton:hover::before,
+.secondaryToolbarButton:focus::before {
+  background-color: var(--toolbar-icon-hover-bg-color);
 }
 
-.toolbarButton::before,
 .secondaryToolbarButton::before {
-  /* All matching images have a size of 16x16
-   * All relevant containers have a size of 28x28 */
-  position: absolute;
-  display: inline-block;
-  left: 6px;
-  max-width: 16px;
+  opacity: var(--doorhanger-icon-opacity);
+  top: 5px;
 }
-
 html[dir="ltr"] .secondaryToolbarButton::before {
   left: 12px;
 }
@@ -2492,229 +1703,73 @@ html[dir="rtl"] .secondaryToolbarButton::before {
 }
 
 .toolbarButton#sidebarToggle::before {
-  content: url(images/toolbarButton-sidebarToggle.svg);
-  content: var(--toolbarButton-sidebarToggle-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton#sidebarToggle::before {
-  content: url(images/toolbarButton-sidebarToggle-dark.svg);
-  content: var(--toolbarButton-sidebarToggle-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-sidebarToggle-icon);
+  mask-image: var(--toolbarButton-sidebarToggle-icon);
 }
 html[dir="rtl"] .toolbarButton#sidebarToggle::before {
   transform: scaleX(-1);
 }
 
 .toolbarButton#secondaryToolbarToggle::before {
-  content: url(images/toolbarButton-secondaryToolbarToggle.svg);
-  content: var(--toolbarButton-secondaryToolbarToggle-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton#secondaryToolbarToggle::before {
-  content: url(images/toolbarButton-secondaryToolbarToggle-dark.svg);
-  content: var(--toolbarButton-secondaryToolbarToggle-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-secondaryToolbarToggle-icon);
+  mask-image: var(--toolbarButton-secondaryToolbarToggle-icon);
 }
 html[dir="rtl"] .toolbarButton#secondaryToolbarToggle::before {
   transform: scaleX(-1);
 }
 
 .toolbarButton.findPrevious::before {
-  content: url(images/findbarButton-previous.svg);
-  content: var(--findbarButton-previous-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.findPrevious::before {
-  content: url(images/findbarButton-previous-dark.svg);
-  content: var(--findbarButton-previous-icon);
-  }
-}
-html[dir="rtl"] .toolbarButton.findPrevious::before {
-  transform: scaleX(-1);
+  -webkit-mask-image: var(--findbarButton-previous-icon);
+  mask-image: var(--findbarButton-previous-icon);
 }
 
 .toolbarButton.findNext::before {
-  content: url(images/findbarButton-next.svg);
-  content: var(--findbarButton-next-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.findNext::before {
-  content: url(images/findbarButton-next-dark.svg);
-  content: var(--findbarButton-next-icon);
-  }
-}
-html[dir="rtl"] .toolbarButton.findNext::before {
-  transform: scaleX(-1);
+  -webkit-mask-image: var(--findbarButton-next-icon);
+  mask-image: var(--findbarButton-next-icon);
 }
 
 .toolbarButton.pageUp::before {
-  content: url(images/toolbarButton-pageUp.svg);
-  content: var(--toolbarButton-pageUp-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.pageUp::before {
-  content: url(images/toolbarButton-pageUp-dark.svg);
-  content: var(--toolbarButton-pageUp-icon);
-  }
-}
-html[dir="rtl"] .toolbarButton.pageUp::before {
-  transform: scaleX(-1);
+  -webkit-mask-image: var(--toolbarButton-pageUp-icon);
+  mask-image: var(--toolbarButton-pageUp-icon);
 }
 
 .toolbarButton.pageDown::before {
-  content: url(images/toolbarButton-pageDown.svg);
-  content: var(--toolbarButton-pageDown-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.pageDown::before {
-  content: url(images/toolbarButton-pageDown-dark.svg);
-  content: var(--toolbarButton-pageDown-icon);
-  }
-}
-html[dir="rtl"] .toolbarButton.pageDown::before {
-  transform: scaleX(-1);
+  -webkit-mask-image: var(--toolbarButton-pageDown-icon);
+  mask-image: var(--toolbarButton-pageDown-icon);
 }
 
 .toolbarButton.zoomOut::before {
-  content: url(images/toolbarButton-zoomOut.svg);
-  content: var(--toolbarButton-zoomOut-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.zoomOut::before {
-  content: url(images/toolbarButton-zoomOut-dark.svg);
-  content: var(--toolbarButton-zoomOut-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-zoomOut-icon);
+  mask-image: var(--toolbarButton-zoomOut-icon);
 }
 
 .toolbarButton.zoomIn::before {
-  content: url(images/toolbarButton-zoomIn.svg);
-  content: var(--toolbarButton-zoomIn-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.zoomIn::before {
-  content: url(images/toolbarButton-zoomIn-dark.svg);
-  content: var(--toolbarButton-zoomIn-icon);
-  }
-}
-
-.toolbarButton.presentationMode::before {
-  content: url(images/toolbarButton-presentationMode.svg);
-  content: var(--toolbarButton-presentationMode-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.presentationMode::before {
-  content: url(images/toolbarButton-presentationMode-dark.svg);
-  content: var(--toolbarButton-presentationMode-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-zoomIn-icon);
+  mask-image: var(--toolbarButton-zoomIn-icon);
 }
 
+.toolbarButton.presentationMode::before,
 .secondaryToolbarButton.presentationMode::before {
-  content: url(images/toolbarButton-presentationMode.svg);
-  content: var(--toolbarButton-presentationMode-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.presentationMode::before {
-  content: url(images/toolbarButton-presentationMode-dark.svg);
-  content: var(--toolbarButton-presentationMode-icon);
-  }
-}
-
-.toolbarButton.print::before {
-  content: url(images/toolbarButton-print.svg);
-  content: var(--toolbarButton-print-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.print::before {
-  content: url(images/toolbarButton-print-dark.svg);
-  content: var(--toolbarButton-print-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-presentationMode-icon);
+  mask-image: var(--toolbarButton-presentationMode-icon);
 }
 
+.toolbarButton.print::before,
 .secondaryToolbarButton.print::before {
-  content: url(images/toolbarButton-print.svg);
-  content: var(--toolbarButton-print-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.print::before {
-  content: url(images/toolbarButton-print-dark.svg);
-  content: var(--toolbarButton-print-icon);
-  }
-}
-
-.toolbarButton.openFile::before {
-  content: url(images/toolbarButton-openFile.svg);
-  content: var(--toolbarButton-openFile-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.openFile::before {
-  content: url(images/toolbarButton-openFile-dark.svg);
-  content: var(--toolbarButton-openFile-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-print-icon);
+  mask-image: var(--toolbarButton-print-icon);
 }
 
+.toolbarButton.openFile::before,
 .secondaryToolbarButton.openFile::before {
-  content: url(images/toolbarButton-openFile.svg);
-  content: var(--toolbarButton-openFile-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.openFile::before {
-  content: url(images/toolbarButton-openFile-dark.svg);
-  content: var(--toolbarButton-openFile-icon);
-  }
-}
-
-.toolbarButton.download::before {
-  content: url(images/toolbarButton-download.svg);
-  content: var(--toolbarButton-download-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.download::before {
-  content: url(images/toolbarButton-download-dark.svg);
-  content: var(--toolbarButton-download-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-openFile-icon);
+  mask-image: var(--toolbarButton-openFile-icon);
 }
 
+.toolbarButton.download::before,
 .secondaryToolbarButton.download::before {
-  content: url(images/toolbarButton-download.svg);
-  content: var(--toolbarButton-download-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.download::before {
-  content: url(images/toolbarButton-download-dark.svg);
-  content: var(--toolbarButton-download-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-download-icon);
+  mask-image: var(--toolbarButton-download-icon);
 }
 
 .secondaryToolbarButton.bookmark {
@@ -2727,98 +1782,46 @@ html[dir="rtl"] .toolbarButton.pageDown::before {
   pointer-events: none;
 }
 
-.toolbarButton.bookmark::before {
-  content: url(images/toolbarButton-bookmark.svg);
-  content: var(--toolbarButton-bookmark-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarButton.bookmark::before {
-  content: url(images/toolbarButton-bookmark-dark.svg);
-  content: var(--toolbarButton-bookmark-icon);
-  }
-}
-
+.toolbarButton.bookmark::before,
 .secondaryToolbarButton.bookmark::before {
-  content: url(images/toolbarButton-bookmark.svg);
-  content: var(--toolbarButton-bookmark-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.bookmark::before {
-  content: url(images/toolbarButton-bookmark-dark.svg);
-  content: var(--toolbarButton-bookmark-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-bookmark-icon);
+  mask-image: var(--toolbarButton-bookmark-icon);
 }
 
 #viewThumbnail.toolbarButton::before {
-  content: url(images/toolbarButton-viewThumbnail.svg);
-  content: var(--toolbarButton-viewThumbnail-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #viewThumbnail.toolbarButton::before {
-  content: url(images/toolbarButton-viewThumbnail-dark.svg);
-  content: var(--toolbarButton-viewThumbnail-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-viewThumbnail-icon);
+  mask-image: var(--toolbarButton-viewThumbnail-icon);
 }
 
 #viewOutline.toolbarButton::before {
-  content: url(images/toolbarButton-viewOutline.svg);
-  content: var(--toolbarButton-viewOutline-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #viewOutline.toolbarButton::before {
-  content: url(images/toolbarButton-viewOutline-dark.svg);
-  content: var(--toolbarButton-viewOutline-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-viewOutline-icon);
+  mask-image: var(--toolbarButton-viewOutline-icon);
 }
 html[dir="rtl"] #viewOutline.toolbarButton::before {
   transform: scaleX(-1);
 }
 
 #viewAttachments.toolbarButton::before {
-  content: url(images/toolbarButton-viewAttachments.svg);
-  content: var(--toolbarButton-viewAttachments-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #viewAttachments.toolbarButton::before {
-  content: url(images/toolbarButton-viewAttachments-dark.svg);
-  content: var(--toolbarButton-viewAttachments-icon);
-  }
+  -webkit-mask-image: var(--toolbarButton-viewAttachments-icon);
+  mask-image: var(--toolbarButton-viewAttachments-icon);
 }
 
 #viewLayers.toolbarButton::before {
-  content: url(images/toolbarButton-viewLayers.svg);
-  content: var(--toolbarButton-viewLayers-icon);
+  -webkit-mask-image: var(--toolbarButton-viewLayers-icon);
+  mask-image: var(--toolbarButton-viewLayers-icon);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #viewLayers.toolbarButton::before {
-  content: url(images/toolbarButton-viewLayers-dark.svg);
-  content: var(--toolbarButton-viewLayers-icon);
-  }
+#currentOutlineItem.toolbarButton::before {
+  -webkit-mask-image: var(--toolbarButton-currentOutlineItem-icon);
+  mask-image: var(--toolbarButton-currentOutlineItem-icon);
 }
-
-#viewFind.toolbarButton::before {
-  content: url(images/toolbarButton-search.svg);
-  content: var(--toolbarButton-search-icon);
+html[dir="rtl"] #currentOutlineItem.toolbarButton::before {
+  transform: scaleX(-1);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #viewFind.toolbarButton::before {
-  content: url(images/toolbarButton-search-dark.svg);
-  content: var(--toolbarButton-search-icon);
-  }
+#viewFind.toolbarButton::before {
+  -webkit-mask-image: var(--toolbarButton-search-icon);
+  mask-image: var(--toolbarButton-search-icon);
 }
 
 .toolbarButton.pdfSidebarNotification::after {
@@ -2842,7 +1845,7 @@ html[dir="rtl"] .toolbarButton.pdfSidebarNotification::after {
 .secondaryToolbarButton {
   position: relative;
   margin: 0;
-  padding: 0 0 1px 0;
+  padding: 0 0 1px;
   height: auto;
   min-height: 26px;
   width: auto;
@@ -2868,172 +1871,68 @@ html[dir="rtl"] .secondaryToolbarButton > span {
 }
 
 .secondaryToolbarButton.firstPage::before {
-  content: url(images/secondaryToolbarButton-firstPage.svg);
-  content: var(--secondaryToolbarButton-firstPage-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.firstPage::before {
-  content: url(images/secondaryToolbarButton-firstPage-dark.svg);
-  content: var(--secondaryToolbarButton-firstPage-icon);
-  }
+  -webkit-mask-image: var(--secondaryToolbarButton-firstPage-icon);
+  mask-image: var(--secondaryToolbarButton-firstPage-icon);
 }
 
 .secondaryToolbarButton.lastPage::before {
-  content: url(images/secondaryToolbarButton-lastPage.svg);
-  content: var(--secondaryToolbarButton-lastPage-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.lastPage::before {
-  content: url(images/secondaryToolbarButton-lastPage-dark.svg);
-  content: var(--secondaryToolbarButton-lastPage-icon);
-  }
+  -webkit-mask-image: var(--secondaryToolbarButton-lastPage-icon);
+  mask-image: var(--secondaryToolbarButton-lastPage-icon);
 }
 
 .secondaryToolbarButton.rotateCcw::before {
-  content: url(images/secondaryToolbarButton-rotateCcw.svg);
-  content: var(--secondaryToolbarButton-rotateCcw-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.rotateCcw::before {
-  content: url(images/secondaryToolbarButton-rotateCcw-dark.svg);
-  content: var(--secondaryToolbarButton-rotateCcw-icon);
-  }
+  -webkit-mask-image: var(--secondaryToolbarButton-rotateCcw-icon);
+  mask-image: var(--secondaryToolbarButton-rotateCcw-icon);
 }
 
 .secondaryToolbarButton.rotateCw::before {
-  content: url(images/secondaryToolbarButton-rotateCw.svg);
-  content: var(--secondaryToolbarButton-rotateCw-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.rotateCw::before {
-  content: url(images/secondaryToolbarButton-rotateCw-dark.svg);
-  content: var(--secondaryToolbarButton-rotateCw-icon);
-  }
+  -webkit-mask-image: var(--secondaryToolbarButton-rotateCw-icon);
+  mask-image: var(--secondaryToolbarButton-rotateCw-icon);
 }
 
 .secondaryToolbarButton.selectTool::before {
-  content: url(images/secondaryToolbarButton-selectTool.svg);
-  content: var(--secondaryToolbarButton-selectTool-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.selectTool::before {
-  content: url(images/secondaryToolbarButton-selectTool-dark.svg);
-  content: var(--secondaryToolbarButton-selectTool-icon);
-  }
+  -webkit-mask-image: var(--secondaryToolbarButton-selectTool-icon);
+  mask-image: var(--secondaryToolbarButton-selectTool-icon);
 }
 
 .secondaryToolbarButton.handTool::before {
-  content: url(images/secondaryToolbarButton-handTool.svg);
-  content: var(--secondaryToolbarButton-handTool-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.handTool::before {
-  content: url(images/secondaryToolbarButton-handTool-dark.svg);
-  content: var(--secondaryToolbarButton-handTool-icon);
-  }
-}
-
-.secondaryToolbarButton.scrollVertical::before {
-  content: url(images/secondaryToolbarButton-scrollVertical.svg);
-  content: var(--secondaryToolbarButton-scrollVertical-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.scrollVertical::before {
-  content: url(images/secondaryToolbarButton-scrollVertical-dark.svg);
-  content: var(--secondaryToolbarButton-scrollVertical-icon);
-  }
-}
-
-.secondaryToolbarButton.scrollHorizontal::before {
-  content: url(images/secondaryToolbarButton-scrollHorizontal.svg);
-  content: var(--secondaryToolbarButton-scrollHorizontal-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.scrollHorizontal::before {
-  content: url(images/secondaryToolbarButton-scrollHorizontal-dark.svg);
-  content: var(--secondaryToolbarButton-scrollHorizontal-icon);
-  }
-}
-
-.secondaryToolbarButton.scrollWrapped::before {
-  content: url(images/secondaryToolbarButton-scrollWrapped.svg);
-  content: var(--secondaryToolbarButton-scrollWrapped-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.scrollWrapped::before {
-  content: url(images/secondaryToolbarButton-scrollWrapped-dark.svg);
-  content: var(--secondaryToolbarButton-scrollWrapped-icon);
-  }
-}
-
-.secondaryToolbarButton.spreadNone::before {
-  content: url(images/secondaryToolbarButton-spreadNone.svg);
-  content: var(--secondaryToolbarButton-spreadNone-icon);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.spreadNone::before {
-  content: url(images/secondaryToolbarButton-spreadNone-dark.svg);
-  content: var(--secondaryToolbarButton-spreadNone-icon);
-  }
-}
-
-.secondaryToolbarButton.spreadOdd::before {
-  content: url(images/secondaryToolbarButton-spreadOdd.svg);
-  content: var(--secondaryToolbarButton-spreadOdd-icon);
+  -webkit-mask-image: var(--secondaryToolbarButton-handTool-icon);
+  mask-image: var(--secondaryToolbarButton-handTool-icon);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .secondaryToolbarButton.spreadOdd::before {
-  content: url(images/secondaryToolbarButton-spreadOdd-dark.svg);
-  content: var(--secondaryToolbarButton-spreadOdd-icon);
-  }
+.secondaryToolbarButton.scrollVertical::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-scrollVertical-icon);
+  mask-image: var(--secondaryToolbarButton-scrollVertical-icon);
 }
 
-.secondaryToolbarButton.spreadEven::before {
-  content: url(images/secondaryToolbarButton-spreadEven.svg);
-  content: var(--secondaryToolbarButton-spreadEven-icon);
+.secondaryToolbarButton.scrollHorizontal::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon);
+  mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon);
 }
 
-@media (prefers-color-scheme: dark) {
+.secondaryToolbarButton.scrollWrapped::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-scrollWrapped-icon);
+  mask-image: var(--secondaryToolbarButton-scrollWrapped-icon);
+}
 
-  .secondaryToolbarButton.spreadEven::before {
-  content: url(images/secondaryToolbarButton-spreadEven-dark.svg);
-  content: var(--secondaryToolbarButton-spreadEven-icon);
-  }
+.secondaryToolbarButton.spreadNone::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-spreadNone-icon);
+  mask-image: var(--secondaryToolbarButton-spreadNone-icon);
 }
 
-.secondaryToolbarButton.documentProperties::before {
-  content: url(images/secondaryToolbarButton-documentProperties.svg);
-  content: var(--secondaryToolbarButton-documentProperties-icon);
+.secondaryToolbarButton.spreadOdd::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-spreadOdd-icon);
+  mask-image: var(--secondaryToolbarButton-spreadOdd-icon);
 }
 
-@media (prefers-color-scheme: dark) {
+.secondaryToolbarButton.spreadEven::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-spreadEven-icon);
+  mask-image: var(--secondaryToolbarButton-spreadEven-icon);
+}
 
-  .secondaryToolbarButton.documentProperties::before {
-  content: url(images/secondaryToolbarButton-documentProperties-dark.svg);
-  content: var(--secondaryToolbarButton-documentProperties-icon);
-  }
+.secondaryToolbarButton.documentProperties::before {
+  -webkit-mask-image: var(--secondaryToolbarButton-documentProperties-icon);
+  mask-image: var(--secondaryToolbarButton-documentProperties-icon);
 }
 
 .verticalToolbarSeparator {
@@ -3041,17 +1940,8 @@ html[dir="rtl"] .secondaryToolbarButton > span {
   padding: 11px 0;
   margin: 5px 2px;
   width: 1px;
-  background-color: rgba(0, 0, 0, 0.3);
   background-color: var(--separator-color);
 }
-
-@media (prefers-color-scheme: dark) {
-
-  .verticalToolbarSeparator {
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--separator-color);
-  }
-}
 html[dir="ltr"] .verticalToolbarSeparator {
   margin-left: 2px;
 }
@@ -3061,64 +1951,28 @@ html[dir="rtl"] .verticalToolbarSeparator {
 
 .horizontalToolbarSeparator {
   display: block;
-  margin: 6px 0 5px 0;
+  margin: 6px 0 5px;
   height: 1px;
   width: 100%;
-  border-top: 1px solid rgba(222, 222, 222, 1);
-  border-top: 1px solid var(--doorhanger-separator-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .horizontalToolbarSeparator {
-  border-top: 1px solid rgba(92, 92, 97, 1);
   border-top: 1px solid var(--doorhanger-separator-color);
-  }
 }
 
 .toolbarField {
   padding: 4px 7px;
-  margin: 3px 0 3px 0;
+  margin: 3px 0;
   border-radius: 2px;
-  background-color: rgba(255, 255, 255, 1);
   background-color: var(--field-bg-color);
   background-clip: padding-box;
   border-width: 1px;
   border-style: solid;
-  border-color: rgba(187, 187, 188, 1);
   border-color: var(--field-border-color);
   box-shadow: none;
-  color: rgba(6, 6, 6, 1);
   color: var(--field-color);
   font-size: 12px;
   line-height: 16px;
   outline-style: none;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .toolbarField {
-  color: rgba(250, 250, 250, 1);
-  color: var(--field-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarField {
-  border-color: rgba(115, 115, 115, 1);
-  border-color: var(--field-border-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .toolbarField {
-  background-color: rgba(64, 64, 68, 1);
-  background-color: var(--field-bg-color);
-  }
-}
-
 .toolbarField[type="checkbox"] {
   opacity: 0;
   position: absolute !important;
@@ -3142,20 +1996,11 @@ html[dir="rtl"] .toolbarField[type="checkbox"] {
 }
 
 .toolbarField.pageNumber.visiblePageIsLoading {
-  background-image: url(images/loading.svg);
   background-image: var(--loading-icon);
   background-repeat: no-repeat;
   background-position: 3px;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .toolbarField.pageNumber.visiblePageIsLoading {
-  background-image: url(images/loading-dark.svg);
-  background-image: var(--loading-icon);
-  }
-}
-
 .toolbarField.pageNumber::-webkit-inner-spin-button,
 .toolbarField.pageNumber::-webkit-outer-spin-button {
   -webkit-appearance: none;
@@ -3168,35 +2013,24 @@ html[dir="rtl"] .toolbarField[type="checkbox"] {
 
 .toolbarLabel {
   min-width: 16px;
-  padding: 6px;
+  padding: 7px;
   margin: 2px;
-  border: 1px solid rgba(0, 0, 0, 0);
   border-radius: 2px;
-  color: rgba(12, 12, 13, 1);
   color: var(--main-color);
   font-size: 12px;
   line-height: 14px;
   text-align: left;
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
   cursor: default;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .toolbarLabel {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
 html[dir="ltr"] #numPages.toolbarLabel {
-  padding-left: 2px;
+  padding-left: 3px;
 }
 html[dir="rtl"] #numPages.toolbarLabel {
-  padding-right: 2px;
+  padding-right: 3px;
 }
 
 #thumbnailView {
@@ -3215,7 +2049,7 @@ html[dir="rtl"] #numPages.toolbarLabel {
 }
 
 .thumbnail {
-  margin: 0 10px 5px 10px;
+  margin: 0 10px 5px;
 }
 html[dir="ltr"] .thumbnail {
   float: left;
@@ -3234,7 +2068,7 @@ html[dir="rtl"] .thumbnail {
 
 .thumbnail:not([data-loaded]) {
   border: 1px dashed rgba(132, 132, 132, 1);
-  margin: -1px 9px 4px 9px;
+  margin: -1px 9px 4px;
 }
 
 .thumbnailImage {
@@ -3256,55 +2090,23 @@ a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
   opacity: 0.9;
 }
 
-a:focus > .thumbnail > .thumbnailSelectionRing {
-  background-color: rgba(0, 0, 0, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  background-clip: padding-box;
-  color: rgba(255, 255, 255, 0.9);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  a:focus > .thumbnail > .thumbnailSelectionRing {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
+a:focus > .thumbnail > .thumbnailSelectionRing,
 .thumbnail:hover > .thumbnailSelectionRing {
-  background-color: rgba(0, 0, 0, 0.15);
   background-color: var(--sidebaritem-bg-color);
   background-clip: padding-box;
   color: rgba(255, 255, 255, 0.9);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .thumbnail:hover > .thumbnailSelectionRing {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
 .thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
   opacity: 1;
 }
 
 .thumbnail.selected > .thumbnailSelectionRing {
-  background-color: rgba(0, 0, 0, 0.15);
   background-color: var(--sidebaritem-bg-color);
   background-clip: padding-box;
   color: rgba(255, 255, 255, 1);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  .thumbnail.selected > .thumbnailSelectionRing {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
 #outlineView,
 #attachmentsView,
 #layersView {
@@ -3317,7 +2119,6 @@ a:focus > .thumbnail > .thumbnailSelectionRing {
   -webkit-overflow-scrolling: touch;
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
 }
 
@@ -3340,25 +2141,15 @@ html[dir="rtl"] .treeItem > .treeItems {
   height: auto;
   margin-bottom: 1px;
   border-radius: 2px;
-  color: rgba(0, 0, 0, 0.8);
-  color: var(--outline-color);
+  color: var(--treeitem-color);
   font-size: 13px;
   line-height: 15px;
   -webkit-user-select: none;
      -moz-user-select: none;
-      -ms-user-select: none;
           user-select: none;
   white-space: normal;
   cursor: pointer;
 }
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItem > a {
-  color: rgba(255, 255, 255, 0.8);
-  color: var(--outline-color);
-  }
-}
 html[dir="ltr"] .treeItem > a {
   padding: 2px 0 5px 4px;
 }
@@ -3383,30 +2174,12 @@ html[dir="rtl"] #layersView .treesItem > a > label {
   color: rgba(255, 255, 255, 0.5);
 }
 .treeItemToggler::before {
-  content: url(images/treeitem-expanded.svg);
-  content: var(--treeitem-expanded-icon);
-  display: inline-block;
-  position: absolute;
-  max-width: 16px;
-}
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler::before {
-  content: url(images/treeitem-expanded-dark.svg);
-  content: var(--treeitem-expanded-icon);
-  }
+  -webkit-mask-image: var(--treeitem-expanded-icon);
+  mask-image: var(--treeitem-expanded-icon);
 }
 .treeItemToggler.treeItemsHidden::before {
-  content: url(images/treeitem-collapsed.svg);
-  content: var(--treeitem-collapsed-icon);
-  max-width: 16px;
-}
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler.treeItemsHidden::before {
-  content: url(images/treeitem-collapsed-dark.svg);
-  content: var(--treeitem-collapsed-icon);
-  }
+  -webkit-mask-image: var(--treeitem-collapsed-icon);
+  mask-image: var(--treeitem-collapsed-icon);
 }
 html[dir="rtl"] .treeItemToggler.treeItemsHidden::before {
   transform: scaleX(-1);
@@ -3427,135 +2200,19 @@ html[dir="rtl"] .treeItemToggler::before {
   left: 4px;
 }
 
-.treeItemToggler:hover {
-  background-color: rgba(0, 0, 0, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  background-clip: padding-box;
-  border-radius: 2px;
-  color: rgba(0, 0, 0, 0.9);
-  color: var(--outline-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover {
-  color: rgba(255, 255, 255, 0.9);
-  color: var(--outline-hover-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
-.treeItemToggler:hover + a {
-  background-color: rgba(0, 0, 0, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  background-clip: padding-box;
-  border-radius: 2px;
-  color: rgba(0, 0, 0, 0.9);
-  color: var(--outline-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover + a {
-  color: rgba(255, 255, 255, 0.9);
-  color: var(--outline-hover-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover + a {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
-.treeItemToggler:hover ~ .treeItems {
-  background-color: rgba(0, 0, 0, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  background-clip: padding-box;
-  border-radius: 2px;
-  color: rgba(0, 0, 0, 0.9);
-  color: var(--outline-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover ~ .treeItems {
-  color: rgba(255, 255, 255, 0.9);
-  color: var(--outline-hover-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItemToggler:hover ~ .treeItems {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
+.treeItem.selected > a {
+  background-color: var(--treeitem-selected-bg-color);
+  color: var(--treeitem-selected-color);
 }
 
+.treeItemToggler:hover,
+.treeItemToggler:hover + a,
+.treeItemToggler:hover ~ .treeItems,
 .treeItem > a:hover {
-  background-color: rgba(0, 0, 0, 0.15);
   background-color: var(--sidebaritem-bg-color);
   background-clip: padding-box;
   border-radius: 2px;
-  color: rgba(0, 0, 0, 0.9);
-  color: var(--outline-hover-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItem > a:hover {
-  color: rgba(255, 255, 255, 0.9);
-  color: var(--outline-hover-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItem > a:hover {
-  background-color: rgba(255, 255, 255, 0.15);
-  background-color: var(--sidebaritem-bg-color);
-  }
-}
-
-.treeItem.selected {
-  background-color: rgba(0, 0, 0, 1);
-  background-color: var(--outline-active-bg-color);
-  background-clip: padding-box;
-  color: rgba(0, 0, 0, 0.08);
-  color: var(--outline-active-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItem.selected {
-  color: rgba(255, 255, 255, 0.08);
-  color: var(--outline-active-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .treeItem.selected {
-  background-color: rgba(255, 255, 255, 1);
-  background-color: var(--outline-active-bg-color);
-  }
-}
-
-.noResults {
-  font-size: 12px;
-  color: rgba(255, 255, 255, 0.8);
-  font-style: italic;
-  cursor: default;
+  color: var(--treeitem-hover-color);
 }
 
 /* TODO: file FF bug to support ::-moz-selection:window-inactive
@@ -3569,9 +2226,7 @@ html[dir="rtl"] .treeItemToggler::before {
 }
 
 #errorWrapper {
-  background: none repeat scroll 0 0 rgba(255, 74, 74, 1);
   background: none repeat scroll 0 0 var(--errorWrapper-bg-color);
-  color: rgba(12, 12, 13, 1);
   color: var(--main-color);
   left: 0;
   position: absolute;
@@ -3580,25 +2235,6 @@ html[dir="rtl"] .treeItemToggler::before {
   padding: 3px 6px;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #errorWrapper {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #errorWrapper {
-  background: none repeat scroll 0 0 rgba(199, 17, 17, 1);
-  background: none repeat scroll 0 0 var(--errorWrapper-bg-color);
-  }
-}
-.loadingInProgress #errorWrapper {
-  top: 37px;
-}
-
 #errorMessageLeft {
   float: left;
 }
@@ -3608,45 +2244,21 @@ html[dir="rtl"] .treeItemToggler::before {
 }
 
 #errorMoreInfo {
-  background-color: rgba(255, 255, 255, 1);
   background-color: var(--field-bg-color);
-  color: rgba(6, 6, 6, 1);
   color: var(--field-color);
-  border: 1px solid rgba(187, 187, 188, 1);
   border: 1px solid var(--field-border-color);
   padding: 3px;
   margin: 3px;
   width: 98%;
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #errorMoreInfo {
-  border: 1px solid rgba(115, 115, 115, 1);
-  border: 1px solid var(--field-border-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #errorMoreInfo {
-  color: rgba(250, 250, 250, 1);
-  color: var(--field-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #errorMoreInfo {
-  background-color: rgba(64, 64, 68, 1);
-  background-color: var(--field-bg-color);
-  }
-}
-
 .overlayButton {
   width: auto;
-  margin: 3px 4px 2px 4px !important;
-  padding: 2px 11px 2px 11px;
+  margin: 3px 4px 2px !important;
+  padding: 2px 11px;
+  color: var(--main-color);
+  background-color: var(--overlay-button-bg-color);
+  border: var(--overlay-button-border) !important;
 }
 
 #overlayContainer {
@@ -3672,33 +2284,15 @@ html[dir="rtl"] .treeItemToggler::before {
   display: inline-block;
   padding: 15px;
   border-spacing: 4px;
-  color: rgba(12, 12, 13, 1);
   color: var(--main-color);
   font-size: 12px;
   line-height: 14px;
-  background-color: rgba(255, 255, 255, 1);
   background-color: var(--doorhanger-bg-color);
   border: 1px solid rgba(0, 0, 0, 0.5);
   border-radius: 4px;
   box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
 }
 
-@media (prefers-color-scheme: dark) {
-
-  #overlayContainer > .container > .dialog {
-  background-color: rgba(74, 74, 79, 1);
-  background-color: var(--doorhanger-bg-color);
-  }
-}
-
-@media (prefers-color-scheme: dark) {
-
-  #overlayContainer > .container > .dialog {
-  color: rgba(249, 249, 250, 1);
-  color: var(--main-color);
-  }
-}
-
 .dialog > .row {
   display: table-row;
 }
@@ -3713,19 +2307,10 @@ html[dir="rtl"] .treeItemToggler::before {
 
 .dialog .separator {
   display: block;
-  margin: 4px 0 4px 0;
+  margin: 4px 0;
   height: 1px;
   width: 100%;
-  background-color: rgba(0, 0, 0, 0.3);
-  background-color: var(--separator-color);
-}
-
-@media (prefers-color-scheme: dark) {
-
-  .dialog .separator {
-  background-color: rgba(0, 0, 0, 0.3);
   background-color: var(--separator-color);
-  }
 }
 
 .dialog .buttonRow {
@@ -3831,6 +2416,19 @@ html[dir="rtl"] #documentPropertiesOverlay .row > * {
 #PDFBug table {
   font-size: 10px;
 }
+#PDFBug table.showText {
+  border-collapse: collapse;
+  text-align: center;
+}
+#PDFBug table.showText,
+#PDFBug table.showText tr,
+#PDFBug table.showText td {
+  border: 1px solid black;
+  padding: 1px;
+}
+#PDFBug table.showText td.advance {
+  color: grey;
+}
 
 #viewer.textLayer-visible .textLayer {
   opacity: 1;
@@ -3844,19 +2442,19 @@ html[dir="rtl"] #documentPropertiesOverlay .row > * {
   mix-blend-mode: screen;
 }
 
-#viewer.textLayer-visible .textLayer > span {
+#viewer.textLayer-visible .textLayer span {
   background-color: rgba(255, 255, 0, 0.1);
   color: rgba(0, 0, 0, 1);
   border: solid 1px rgba(255, 0, 0, 0.5);
   box-sizing: border-box;
 }
 
-#viewer.textLayer-hover .textLayer > span:hover {
+#viewer.textLayer-hover .textLayer span:hover {
   background-color: rgba(255, 255, 255, 1);
   color: rgba(0, 0, 0, 1);
 }
 
-#viewer.textLayer-shadow .textLayer > span {
+#viewer.textLayer-shadow .textLayer span {
   background-color: rgba(255, 255, 255, 0.6);
   color: rgba(0, 0, 0, 1);
 }
@@ -3906,7 +2504,8 @@ html[dir="rtl"] #documentPropertiesOverlay .row > * {
   .toolbar,
   #loadingBox,
   #errorWrapper,
-  .textLayer {
+  .textLayer,
+  .canvasWrapper {
     display: none;
   }
   #viewerContainer {
@@ -3950,18 +2549,38 @@ html[dir="rtl"] #documentPropertiesOverlay .row > * {
     height: 100%;
   }
   /* wrapper around (scaled) print canvas elements */
-  #printContainer > div {
-    position: relative;
-    top: 0;
-    left: 0;
-    width: 1px;
-    height: 1px;
-    overflow: visible;
+  #printContainer > .printedPage {
+    page-break-after: always;
+    page-break-inside: avoid;
+
+    /* The wrapper always cover the whole page. */
+    height: 100%;
+    width: 100%;
+
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+  }
+
+  #printContainer > .xfaPrintedPage .xfaPage {
+    position: initial;
+  }
+
+  #printContainer > .xfaPrintedPage {
     page-break-after: always;
     page-break-inside: avoid;
+    width: 100%;
+    height: 100%;
+    position: relative;
   }
-  #printContainer canvas,
-  #printContainer img {
+
+  #printContainer > .printedPage canvas,
+  #printContainer > .printedPage img {
+    /* The intrinsic canvas / image size will make sure that we fit the page. */
+    max-width: 100%;
+    max-height: 100%;
+
     direction: ltr;
     display: block;
   }
@@ -3984,15 +2603,15 @@ html[dir="rtl"] #documentPropertiesOverlay .row > * {
 }
 
 @media all and (max-width: 840px) {
-  #sidebarContent {
-    background-color: rgba(0, 0, 0, 0.7);
+  #sidebarContainer {
+    background-color: var(--sidebar-narrow-bg-color);
   }
 
   html[dir="ltr"] #outerContainer.sidebarOpen #viewerContainer {
-    left: 0px !important;
+    left: 0 !important;
   }
   html[dir="rtl"] #outerContainer.sidebarOpen #viewerContainer {
-    right: 0px !important;
+    right: 0 !important;
   }
 
   #outerContainer .hiddenLargeView,
diff --git a/third-party/pdfjs/web/viewer.html b/third-party/pdfjs/web/viewer.html
index ed57f3f1c..db9b7427a 100644
--- a/third-party/pdfjs/web/viewer.html
+++ b/third-party/pdfjs/web/viewer.html
@@ -26,7 +26,6 @@ See https://github.com/adobe-type-tools/cmap-resources
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
     <meta name="google" content="notranslate">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <title>PDF.js viewer</title>
 
     <base href="ephy-resource:///org/gnome/epiphany/pdfjs/web/">
@@ -42,24 +41,36 @@ See https://github.com/adobe-type-tools/cmap-resources
 
   </head>
 
-  <body tabindex="1" class="loadingInProgress">
+  <body tabindex="1">
     <div id="outerContainer">
 
       <div id="sidebarContainer">
         <div id="toolbarSidebar">
-          <div class="splitToolbarButton toggled">
-            <button id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" tabindex="2" 
data-l10n-id="thumbs">
-               <span data-l10n-id="thumbs_label">Thumbnails</span>
-            </button>
-            <button id="viewOutline" class="toolbarButton" title="Show Document Outline (double-click to 
expand/collapse all items)" tabindex="3" data-l10n-id="document_outline">
-               <span data-l10n-id="document_outline_label">Document Outline</span>
-            </button>
-            <button id="viewAttachments" class="toolbarButton" title="Show Attachments" tabindex="4" 
data-l10n-id="attachments">
-               <span data-l10n-id="attachments_label">Attachments</span>
-            </button>
-            <button id="viewLayers" class="toolbarButton" title="Show Layers (double-click to reset all 
layers to the default state)" tabindex="5" data-l10n-id="layers">
-               <span data-l10n-id="layers_label">Layers</span>
-            </button>
+          <div id="toolbarSidebarLeft">
+            <div class="splitToolbarButton toggled">
+              <button id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" tabindex="2" 
data-l10n-id="thumbs">
+                 <span data-l10n-id="thumbs_label">Thumbnails</span>
+              </button>
+              <button id="viewOutline" class="toolbarButton" title="Show Document Outline (double-click to 
expand/collapse all items)" tabindex="3" data-l10n-id="document_outline">
+                 <span data-l10n-id="document_outline_label">Document Outline</span>
+              </button>
+              <button id="viewAttachments" class="toolbarButton" title="Show Attachments" tabindex="4" 
data-l10n-id="attachments">
+                 <span data-l10n-id="attachments_label">Attachments</span>
+              </button>
+              <button id="viewLayers" class="toolbarButton" title="Show Layers (double-click to reset all 
layers to the default state)" tabindex="5" data-l10n-id="layers">
+                 <span data-l10n-id="layers_label">Layers</span>
+              </button>
+            </div>
+          </div>
+
+          <div id="toolbarSidebarRight">
+            <div id="outlineOptionsContainer" class="hidden">
+              <div class="verticalToolbarSeparator"></div>
+
+              <button id="currentOutlineItem" class="toolbarButton" disabled="disabled" title="Find Current 
Outline Item" tabindex="6" data-l10n-id="current_outline_item">
+                <span data-l10n-id="current_outline_item_label">Current Outline Item</span>
+              </button>
+            </div>
           </div>
         </div>
         <div id="sidebarContent">
@@ -72,7 +83,7 @@ See https://github.com/adobe-type-tools/cmap-resources
           <div id="layersView" class="hidden">
           </div>
         </div>
-        <div id="sidebarResizer" class="hidden"></div>
+        <div id="sidebarResizer"></div>
       </div>  <!-- sidebarContainer -->
 
       <div id="mainContainer">
@@ -192,11 +203,11 @@ See https://github.com/adobe-type-tools/cmap-resources
           <div id="toolbarContainer">
             <div id="toolbarViewer">
               <div id="toolbarViewerLeft">
-                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" 
data-l10n-id="toggle_sidebar">
+                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" 
data-l10n-id="toggle_sidebar" aria-expanded="false" aria-controls="sidebarContainer">
                   <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
                 </button>
                 <div class="toolbarButtonSpacer"></div>
-                <button id="viewFind" class="toolbarButton" title="Find in Document" tabindex="12" 
data-l10n-id="findbar">
+                <button id="viewFind" class="toolbarButton" title="Find in Document" tabindex="12" 
data-l10n-id="findbar" aria-expanded="false" aria-controls="findbar">
                   <span data-l10n-id="findbar_label">Find</span>
                 </button>
                 <div class="splitToolbarButton hiddenSmallView">
@@ -233,7 +244,7 @@ See https://github.com/adobe-type-tools/cmap-resources
 
                 <div class="verticalToolbarSeparator hiddenSmallView"></div>
 
-                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" 
data-l10n-id="tools">
+                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" 
data-l10n-id="tools" aria-expanded="false" aria-controls="secondaryToolbar">
                   <span data-l10n-id="tools_label">Tools</span>
                 </button>
               </div>
@@ -275,17 +286,6 @@ See https://github.com/adobe-type-tools/cmap-resources
           </div>
         </div>
 
-        <menu type="context" id="viewerContextMenu">
-          <menuitem id="contextFirstPage" label="First Page"
-                    data-l10n-id="first_page"></menuitem>
-          <menuitem id="contextLastPage" label="Last Page"
-                    data-l10n-id="last_page"></menuitem>
-          <menuitem id="contextPageRotateCw" label="Rotate Clockwise"
-                    data-l10n-id="page_rotate_cw"></menuitem>
-          <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"
-                    data-l10n-id="page_rotate_ccw"></menuitem>
-        </menu>
-
         <div id="viewerContainer" tabindex="0">
           <div id="viewer" class="pdfViewer"></div>
         </div>
@@ -397,4 +397,3 @@ See https://github.com/adobe-type-tools/cmap-resources
     <div id="printContainer"></div>
   </body>
 </html>
-
diff --git a/third-party/pdfjs/web/viewer.js b/third-party/pdfjs/web/viewer.js
index 1d54e92c7..d0064cf18 100644
--- a/third-party/pdfjs/web/viewer.js
+++ b/third-party/pdfjs/web/viewer.js
@@ -2,7 +2,7 @@
  * @licstart The following is the entire license notice for the
  * Javascript code in this page
  *
- * Copyright 2020 Mozilla Foundation
+ * Copyright 2021 Mozilla Foundation
  * Modifications made for Epiphany by Jan-Michael Brummer <jan brummer tabos org>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,279 +21,331 @@
  * Javascript code in this page
  */
 
-/******/ (function(modules) { // webpackBootstrap
-/******/       // The module cache
-/******/       var installedModules = {};
-/******/
-/******/       // The require function
-/******/       function __webpack_require__(moduleId) {
-/******/
-/******/               // Check if module is in cache
-/******/               if(installedModules[moduleId]) {
-/******/                       return installedModules[moduleId].exports;
-/******/               }
-/******/               // Create a new module (and put it into the cache)
-/******/               var module = installedModules[moduleId] = {
-/******/                       i: moduleId,
-/******/                       l: false,
-/******/                       exports: {}
-/******/               };
-/******/
-/******/               // Execute the module function
-/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/               // Flag the module as loaded
-/******/               module.l = true;
-/******/
-/******/               // Return the exports of the module
-/******/               return module.exports;
-/******/       }
-/******/
-/******/
-/******/       // expose the modules object (__webpack_modules__)
-/******/       __webpack_require__.m = modules;
-/******/
-/******/       // expose the module cache
-/******/       __webpack_require__.c = installedModules;
-/******/
-/******/       // define getter function for harmony exports
-/******/       __webpack_require__.d = function(exports, name, getter) {
-/******/               if(!__webpack_require__.o(exports, name)) {
-/******/                       Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/               }
-/******/       };
-/******/
-/******/       // define __esModule on exports
-/******/       __webpack_require__.r = function(exports) {
-/******/               if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/                       Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/               }
-/******/               Object.defineProperty(exports, '__esModule', { value: true });
-/******/       };
-/******/
-/******/       // create a fake namespace object
-/******/       // mode & 1: value is a module id, require it
-/******/       // mode & 2: merge all properties of value into the ns
-/******/       // mode & 4: return value when already ns object
-/******/       // mode & 8|1: behave like require
-/******/       __webpack_require__.t = function(value, mode) {
-/******/               if(mode & 1) value = __webpack_require__(value);
-/******/               if(mode & 8) return value;
-/******/               if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/               var ns = Object.create(null);
-/******/               __webpack_require__.r(ns);
-/******/               Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/               if(mode & 2 && typeof value != 'string') for(var key in value) 
__webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/               return ns;
-/******/       };
-/******/
-/******/       // getDefaultExport function for compatibility with non-harmony modules
-/******/       __webpack_require__.n = function(module) {
-/******/               var getter = module && module.__esModule ?
-/******/                       function getDefault() { return module['default']; } :
-/******/                       function getModuleExports() { return module; };
-/******/               __webpack_require__.d(getter, 'a', getter);
-/******/               return getter;
-/******/       };
-/******/
-/******/       // Object.prototype.hasOwnProperty.call
-/******/       __webpack_require__.o = function(object, property) { return 
Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/       // __webpack_public_path__
-/******/       __webpack_require__.p = "";
-/******/
-/******/
-/******/       // Load entry module and return exports
-/******/       return __webpack_require__(__webpack_require__.s = 0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
+/******/ (() => { // webpackBootstrap
+/******/       "use strict";
+/******/       var __webpack_modules__ = ([
+/* 0 */,
+/* 1 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-;
-let pdfjsWebApp, pdfjsWebAppOptions;
-{
-  pdfjsWebApp = __webpack_require__(1);
-  pdfjsWebAppOptions = __webpack_require__(3);
-}
-;
-{
-  __webpack_require__(35);
-}
-;
-{
-  __webpack_require__(40);
-}
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.OptionKind = exports.AppOptions = void 0;
 
-function getViewerConfiguration() {
-  return {
-    appContainer: document.body,
-    mainContainer: document.getElementById("viewerContainer"),
-    viewerContainer: document.getElementById("viewer"),
-    eventBus: null,
-    toolbar: {
-      container: document.getElementById("toolbarViewer"),
-      numPages: document.getElementById("numPages"),
-      pageNumber: document.getElementById("pageNumber"),
-      scaleSelectContainer: document.getElementById("scaleSelectContainer"),
-      scaleSelect: document.getElementById("scaleSelect"),
-      customScaleOption: document.getElementById("customScaleOption"),
-      previous: document.getElementById("previous"),
-      next: document.getElementById("next"),
-      zoomIn: document.getElementById("zoomIn"),
-      zoomOut: document.getElementById("zoomOut"),
-      viewFind: document.getElementById("viewFind"),
-      openFile: document.getElementById("openFile"),
-      print: document.getElementById("print"),
-      presentationModeButton: document.getElementById("presentationMode"),
-      download: document.getElementById("download"),
-      viewBookmark: document.getElementById("viewBookmark")
-    },
-    secondaryToolbar: {
-      toolbar: document.getElementById("secondaryToolbar"),
-      toggleButton: document.getElementById("secondaryToolbarToggle"),
-      toolbarButtonContainer: document.getElementById("secondaryToolbarButtonContainer"),
-      presentationModeButton: document.getElementById("secondaryPresentationMode"),
-      openFileButton: document.getElementById("secondaryOpenFile"),
-      printButton: document.getElementById("secondaryPrint"),
-      downloadButton: document.getElementById("secondaryDownload"),
-      viewBookmarkButton: document.getElementById("secondaryViewBookmark"),
-      firstPageButton: document.getElementById("firstPage"),
-      lastPageButton: document.getElementById("lastPage"),
-      pageRotateCwButton: document.getElementById("pageRotateCw"),
-      pageRotateCcwButton: document.getElementById("pageRotateCcw"),
-      cursorSelectToolButton: document.getElementById("cursorSelectTool"),
-      cursorHandToolButton: document.getElementById("cursorHandTool"),
-      scrollVerticalButton: document.getElementById("scrollVertical"),
-      scrollHorizontalButton: document.getElementById("scrollHorizontal"),
-      scrollWrappedButton: document.getElementById("scrollWrapped"),
-      spreadNoneButton: document.getElementById("spreadNone"),
-      spreadOddButton: document.getElementById("spreadOdd"),
-      spreadEvenButton: document.getElementById("spreadEven"),
-      documentPropertiesButton: document.getElementById("documentProperties")
-    },
-    fullscreen: {
-      contextFirstPage: document.getElementById("contextFirstPage"),
-      contextLastPage: document.getElementById("contextLastPage"),
-      contextPageRotateCw: document.getElementById("contextPageRotateCw"),
-      contextPageRotateCcw: document.getElementById("contextPageRotateCcw")
-    },
-    sidebar: {
-      outerContainer: document.getElementById("outerContainer"),
-      viewerContainer: document.getElementById("viewerContainer"),
-      toggleButton: document.getElementById("sidebarToggle"),
-      thumbnailButton: document.getElementById("viewThumbnail"),
-      outlineButton: document.getElementById("viewOutline"),
-      attachmentsButton: document.getElementById("viewAttachments"),
-      layersButton: document.getElementById("viewLayers"),
-      thumbnailView: document.getElementById("thumbnailView"),
-      outlineView: document.getElementById("outlineView"),
-      attachmentsView: document.getElementById("attachmentsView"),
-      layersView: document.getElementById("layersView")
-    },
-    sidebarResizer: {
-      outerContainer: document.getElementById("outerContainer"),
-      resizer: document.getElementById("sidebarResizer")
-    },
-    findBar: {
-      bar: document.getElementById("findbar"),
-      toggleButton: document.getElementById("viewFind"),
-      findField: document.getElementById("findInput"),
-      highlightAllCheckbox: document.getElementById("findHighlightAll"),
-      caseSensitiveCheckbox: document.getElementById("findMatchCase"),
-      entireWordCheckbox: document.getElementById("findEntireWord"),
-      findMsg: document.getElementById("findMsg"),
-      findResultsCount: document.getElementById("findResultsCount"),
-      findPreviousButton: document.getElementById("findPrevious"),
-      findNextButton: document.getElementById("findNext")
-    },
-    passwordOverlay: {
-      overlayName: "passwordOverlay",
-      container: document.getElementById("passwordOverlay"),
-      label: document.getElementById("passwordText"),
-      input: document.getElementById("password"),
-      submitButton: document.getElementById("passwordSubmit"),
-      cancelButton: document.getElementById("passwordCancel")
-    },
-    documentProperties: {
-      overlayName: "documentPropertiesOverlay",
-      container: document.getElementById("documentPropertiesOverlay"),
-      closeButton: document.getElementById("documentPropertiesClose"),
-      fields: {
-        fileName: document.getElementById("fileNameField"),
-        fileSize: document.getElementById("fileSizeField"),
-        title: document.getElementById("titleField"),
-        author: document.getElementById("authorField"),
-        subject: document.getElementById("subjectField"),
-        keywords: document.getElementById("keywordsField"),
-        creationDate: document.getElementById("creationDateField"),
-        modificationDate: document.getElementById("modificationDateField"),
-        creator: document.getElementById("creatorField"),
-        producer: document.getElementById("producerField"),
-        version: document.getElementById("versionField"),
-        pageCount: document.getElementById("pageCountField"),
-        pageSize: document.getElementById("pageSizeField"),
-        linearized: document.getElementById("linearizedField")
-      }
-    },
-    errorWrapper: {
-      container: document.getElementById("errorWrapper"),
-      errorMessage: document.getElementById("errorMessage"),
-      closeButton: document.getElementById("errorClose"),
-      errorMoreInfo: document.getElementById("errorMoreInfo"),
-      moreInfoButton: document.getElementById("errorShowMore"),
-      lessInfoButton: document.getElementById("errorShowLess")
-    },
-    printContainer: document.getElementById("printContainer"),
-    openFileInputName: "fileInput",
-    debuggerScriptPath: "./debugger.js"
+var _viewer_compatibility = __webpack_require__(2);
+
+const OptionKind = {
+  VIEWER: 0x02,
+  API: 0x04,
+  WORKER: 0x08,
+  PREFERENCE: 0x80
+};
+exports.OptionKind = OptionKind;
+const defaultOptions = {
+  cursorToolOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  defaultUrl: {
+    value: "compressed.tracemonkey-pldi-09.pdf",
+    kind: OptionKind.VIEWER
+  },
+  defaultZoomValue: {
+    value: "",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  disableHistory: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  disablePageLabels: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enablePermissions: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enablePrintAutoRotate: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableScripting: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  externalLinkRel: {
+    value: "noopener noreferrer nofollow",
+    kind: OptionKind.VIEWER
+  },
+  externalLinkTarget: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  historyUpdateUrl: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  ignoreDestinationZoom: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  imageResourcesPath: {
+    value: "./images/",
+    kind: OptionKind.VIEWER
+  },
+  maxCanvasPixels: {
+    value: 16777216,
+    compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels,
+    kind: OptionKind.VIEWER
+  },
+  pdfBugEnabled: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  printResolution: {
+    value: 150,
+    kind: OptionKind.VIEWER
+  },
+  renderer: {
+    value: "canvas",
+    kind: OptionKind.VIEWER
+  },
+  renderInteractiveForms: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  sidebarViewOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  scrollModeOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  spreadModeOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  textLayerMode: {
+    value: 1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  useOnlyCssZoom: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  viewerCssTheme: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  viewOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  cMapPacked: {
+    value: true,
+    kind: OptionKind.API
+  },
+  cMapUrl: {
+    value: "../web/cmaps/",
+    kind: OptionKind.API
+  },
+  disableAutoFetch: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableFontFace: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableRange: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableStream: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  docBaseUrl: {
+    value: "",
+    kind: OptionKind.API
+  },
+  enableXfa: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  fontExtraProperties: {
+    value: false,
+    kind: OptionKind.API
+  },
+  isEvalSupported: {
+    value: true,
+    kind: OptionKind.API
+  },
+  maxImageSize: {
+    value: -1,
+    kind: OptionKind.API
+  },
+  pdfBug: {
+    value: false,
+    kind: OptionKind.API
+  },
+  standardFontDataUrl: {
+    value: "../web/standard_fonts/",
+    kind: OptionKind.API
+  },
+  verbosity: {
+    value: 1,
+    kind: OptionKind.API
+  },
+  workerPort: {
+    value: null,
+    kind: OptionKind.WORKER
+  },
+  workerSrc: {
+    value: "../build/pdf.worker.js",
+    kind: OptionKind.WORKER
+  }
+};
+{
+  defaultOptions.disablePreferences = {
+    value: false,
+    kind: OptionKind.VIEWER
+  };
+  defaultOptions.locale = {
+    value: typeof navigator !== "undefined" ? navigator.language : "en-US",
+    kind: OptionKind.VIEWER
+  };
+  defaultOptions.sandboxBundleSrc = {
+    value: "../build/pdf.sandbox.js",
+    kind: OptionKind.VIEWER
   };
+  defaultOptions.renderer.kind += OptionKind.PREFERENCE;
 }
+const userOptions = Object.create(null);
 
-function webViewerLoad() {
-  const config = getViewerConfiguration();
-  window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;
-  window.PDFViewerApplicationOptions = pdfjsWebAppOptions.AppOptions;
-  const event = document.createEvent("CustomEvent");
-  event.initCustomEvent("webviewerloaded", true, true, {
-    source: window
-  });
+class AppOptions {
+  constructor() {
+    throw new Error("Cannot initialize AppOptions.");
+  }
 
-  try {
-    parent.document.dispatchEvent(event);
-  } catch (ex) {
-    console.error(`webviewerloaded: ${ex}`);
-    document.dispatchEvent(event);
+  static get(name) {
+    const userOption = userOptions[name];
+
+    if (userOption !== undefined) {
+      return userOption;
+    }
+
+    const defaultOption = defaultOptions[name];
+
+    if (defaultOption !== undefined) {
+      return defaultOption.compatibility ?? defaultOption.value;
+    }
+
+    return undefined;
+  }
+
+  static getAll(kind = null) {
+    const options = Object.create(null);
+
+    for (const name in defaultOptions) {
+      const defaultOption = defaultOptions[name];
+
+      if (kind) {
+        if ((kind & defaultOption.kind) === 0) {
+          continue;
+        }
+
+        if (kind === OptionKind.PREFERENCE) {
+          const value = defaultOption.value,
+                valueType = typeof value;
+
+          if (valueType === "boolean" || valueType === "string" || valueType === "number" && 
Number.isInteger(value)) {
+            options[name] = value;
+            continue;
+          }
+
+          throw new Error(`Invalid type for preference: ${name}`);
+        }
+      }
+
+      const userOption = userOptions[name];
+      options[name] = userOption !== undefined ? userOption : defaultOption.compatibility ?? 
defaultOption.value;
+    }
+
+    return options;
+  }
+
+  static set(name, value) {
+    userOptions[name] = value;
+  }
+
+  static setAll(options) {
+    for (const name in options) {
+      userOptions[name] = options[name];
+    }
+  }
+
+  static remove(name) {
+    delete userOptions[name];
   }
 
-  pdfjsWebApp.PDFViewerApplication.run(config);
 }
 
-if (document.readyState === "interactive" || document.readyState === "complete") {
-  webViewerLoad();
-} else {
-  document.addEventListener("DOMContentLoaded", webViewerLoad, true);
+exports.AppOptions = AppOptions;
+
+/***/ }),
+/* 2 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.viewerCompatibilityParams = void 0;
+const compatibilityParams = Object.create(null);
+{
+  const userAgent = typeof navigator !== "undefined" && navigator.userAgent || "";
+  const platform = typeof navigator !== "undefined" && navigator.platform || "";
+  const maxTouchPoints = typeof navigator !== "undefined" && navigator.maxTouchPoints || 1;
+  const isAndroid = /Android/.test(userAgent);
+  const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1;
+  const isIOSChrome = /CriOS/.test(userAgent);
+
+  (function checkOnBlobSupport() {
+    if (isIOSChrome) {
+      compatibilityParams.disableCreateObjectURL = true;
+    }
+  })();
+
+  (function checkCanvasSizeLimitation() {
+    if (isIOS || isAndroid) {
+      compatibilityParams.maxCanvasPixels = 5242880;
+    }
+  })();
 }
+const viewerCompatibilityParams = Object.freeze(compatibilityParams);
+exports.viewerCompatibilityParams = viewerCompatibilityParams;
 
 /***/ }),
-/* 1 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 3 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = void 0;
+}));
+exports.PDFViewerApplication = exports.PDFPrintServiceFactory = exports.DefaultExternalServices = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
-var _app_options = __webpack_require__(3);
+var _app_options = __webpack_require__(1);
 
 var _pdfjsLib = __webpack_require__(5);
 
@@ -301,43 +353,45 @@ var _pdf_cursor_tools = __webpack_require__(6);
 
 var _pdf_rendering_queue = __webpack_require__(8);
 
-var _pdf_sidebar = __webpack_require__(9);
+var _overlay_manager = __webpack_require__(9);
+
+var _password_prompt = __webpack_require__(10);
 
-var _overlay_manager = __webpack_require__(10);
+var _pdf_attachment_viewer = __webpack_require__(11);
 
-var _password_prompt = __webpack_require__(11);
+var _pdf_document_properties = __webpack_require__(13);
 
-var _pdf_attachment_viewer = __webpack_require__(12);
+var _pdf_find_bar = __webpack_require__(14);
 
-var _pdf_document_properties = __webpack_require__(14);
+var _pdf_find_controller = __webpack_require__(15);
 
-var _pdf_find_bar = __webpack_require__(15);
+var _pdf_history = __webpack_require__(17);
 
-var _pdf_find_controller = __webpack_require__(16);
+var _pdf_layer_viewer = __webpack_require__(18);
 
-var _pdf_history = __webpack_require__(18);
+var _pdf_link_service = __webpack_require__(19);
 
-var _pdf_layer_viewer = __webpack_require__(19);
+var _pdf_outline_viewer = __webpack_require__(20);
 
-var _pdf_link_service = __webpack_require__(20);
+var _pdf_presentation_mode = __webpack_require__(21);
 
-var _pdf_outline_viewer = __webpack_require__(21);
+var _pdf_scripting_manager = __webpack_require__(22);
 
-var _pdf_presentation_mode = __webpack_require__(22);
+var _pdf_sidebar = __webpack_require__(23);
 
-var _pdf_sidebar_resizer = __webpack_require__(23);
+var _pdf_sidebar_resizer = __webpack_require__(24);
 
-var _pdf_thumbnail_viewer = __webpack_require__(24);
+var _pdf_thumbnail_viewer = __webpack_require__(25);
 
-var _pdf_viewer = __webpack_require__(26);
+var _pdf_viewer = __webpack_require__(27);
 
-var _secondary_toolbar = __webpack_require__(31);
+var _secondary_toolbar = __webpack_require__(35);
 
-var _toolbar = __webpack_require__(33);
+var _toolbar = __webpack_require__(37);
 
-var _viewer_compatibility = __webpack_require__(4);
+var _viewer_compatibility = __webpack_require__(2);
 
-var _view_history = __webpack_require__(34);
+var _view_history = __webpack_require__(38);
 
 const DEFAULT_SCALE_DELTA = 1.1;
 const DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
@@ -349,6 +403,11 @@ const ViewOnLoad = {
   PREVIOUS: 0,
   INITIAL: 1
 };
+const ViewerCssTheme = {
+  AUTOMATIC: 0,
+  LIGHT: 1,
+  DARK: 2
+};
 const KNOWN_VERSIONS = ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.1", 
"2.2", "2.3"];
 const KNOWN_GENERATORS = ["acrobat distiller", "acrobat pdfwriter", "adobe livecycle", "adobe pdf library", 
"adobe photoshop", "ghostscript", "tcpdf", "cairo", "dvipdfm", "dvips", "pdftex", "pdfkit", "itext", 
"prince", "quarkxpress", "mac os x", "microsoft", "openoffice", "oracle", "luradocument", "pdf-xchange", 
"antenna house", "aspose.cells", "fpdf"];
 
@@ -363,7 +422,7 @@ class DefaultExternalServices {
 
   static initPassiveLoading(callbacks) {}
 
-  static fallback(data, callback) {}
+  static async fallback(data) {}
 
   static reportTelemetry(data) {}
 
@@ -379,6 +438,10 @@ class DefaultExternalServices {
     throw new Error("Not implemented: createL10n");
   }
 
+  static createScripting(options) {
+    throw new Error("Not implemented: createScripting");
+  }
+
   static get supportsIntegratedFind() {
     return (0, _pdfjsLib.shadow)(this, "supportsIntegratedFind", false);
   }
@@ -404,7 +467,7 @@ exports.DefaultExternalServices = DefaultExternalServices;
 const PDFViewerApplication = {
   initialBookmark: document.location.hash.substring(1),
   _initializedCapability: (0, _pdfjsLib.createPromiseCapability)(),
-  fellback: false,
+  _fellback: false,
   appConfig: null,
   pdfDocument: null,
   pdfLoadingTask: null,
@@ -422,6 +485,7 @@ const PDFViewerApplication = {
   pdfAttachmentViewer: null,
   pdfLayerViewer: null,
   pdfCursorTools: null,
+  pdfScriptingManager: null,
   store: null,
   downloadManager: null,
   overlayManager: null,
@@ -436,17 +500,23 @@ const PDFViewerApplication = {
   url: "",
   baseUrl: "",
   externalServices: DefaultExternalServices,
-  _boundEvents: {},
-  contentDispositionFilename: null,
-  triggerDelayedFallback: null,
+  _boundEvents: Object.create(null),
+  documentInfo: null,
+  metadata: null,
+  _contentDispositionFilename: null,
+  _contentLength: null,
   _saveInProgress: false,
   _wheelUnusedTicks: 0,
+  _idleCallbacks: new Set(),
 
   async initialize(appConfig) {
     this.preferences = this.externalServices.createPreferences();
     this.appConfig = appConfig;
     await this._readPreferences();
     await this._parseHashParameters();
+
+    this._forceCssTheme();
+
     await this._initializeL10n();
 
     if (this.isViewerEmbedded && _app_options.AppOptions.get("externalLinkTarget") === 
_pdfjsLib.LinkTarget.NONE) {
@@ -472,13 +542,9 @@ const PDFViewerApplication = {
     }
 
     try {
-      const prefs = await this.preferences.getAll();
-
-      for (const name in prefs) {
-        _app_options.AppOptions.set(name, prefs[name]);
-      }
+      _app_options.AppOptions.setAll(await this.preferences.getAll());
     } catch (reason) {
-      console.error(`_readPreferences: "${reason.message}".`);
+      console.error(`_readPreferences: "${reason?.message}".`);
     }
   },
 
@@ -520,10 +586,6 @@ const PDFViewerApplication = {
       _app_options.AppOptions.set("disableHistory", hashParams.disablehistory === "true");
     }
 
-    if ("webgl" in hashParams) {
-      _app_options.AppOptions.set("enableWebGL", hashParams.webgl === "true");
-    }
-
     if ("verbosity" in hashParams) {
       _app_options.AppOptions.set("verbosity", hashParams.verbosity | 0);
     }
@@ -557,6 +619,10 @@ const PDFViewerApplication = {
       _app_options.AppOptions.set("locale", hashParams.locale);
     }
 
+    if (waitOn.length === 0) {
+      return undefined;
+    }
+
     return Promise.all(waitOn).catch(reason => {
       console.error(`_parseHashParameters: "${reason.message}".`);
     });
@@ -570,6 +636,44 @@ const PDFViewerApplication = {
     document.getElementsByTagName("html")[0].dir = dir;
   },
 
+  _forceCssTheme() {
+    const cssTheme = _app_options.AppOptions.get("viewerCssTheme");
+
+    if (cssTheme === ViewerCssTheme.AUTOMATIC || !Object.values(ViewerCssTheme).includes(cssTheme)) {
+      return;
+    }
+
+    try {
+      const styleSheet = document.styleSheets[0];
+      const cssRules = styleSheet?.cssRules || [];
+      const mediaMatcher = "prefers-color-scheme";
+      const mediaRule = `(${mediaMatcher}: dark)`;
+      const mediaRegex = new RegExp(`^@media \\(${mediaMatcher}: dark\\) 
{\\n\\s*([\\w\\s-.,:;/\\\\{}()]+)\\n}$`);
+
+      for (let i = 0, ii = cssRules.length; i < ii; i++) {
+        const rule = cssRules[i];
+
+        if (rule instanceof CSSMediaRule && rule.media?.[0] === mediaRule) {
+          if (cssTheme === ViewerCssTheme.LIGHT) {
+            styleSheet.deleteRule(i);
+            return;
+          }
+
+          const darkRules = mediaRegex.exec(rule.cssText);
+
+          if (darkRules?.[1]) {
+            styleSheet.deleteRule(i);
+            styleSheet.insertRule(darkRules[1], i);
+          }
+
+          return;
+        }
+      }
+    } catch (reason) {
+      console.error(`_forceCssTheme: "${reason?.message}".`);
+    }
+  },
+
   async _initializeViewerComponents() {
     const appConfig = this.appConfig;
     const eventBus = appConfig.eventBus || new _ui_utils.EventBus({
@@ -578,7 +682,7 @@ const PDFViewerApplication = {
     this.eventBus = eventBus;
     this.overlayManager = new _overlay_manager.OverlayManager();
     const pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
-    pdfRenderingQueue.onIdle = this.cleanup.bind(this);
+    pdfRenderingQueue.onIdle = this._cleanup.bind(this);
     this.pdfRenderingQueue = pdfRenderingQueue;
     const pdfLinkService = new _pdf_link_service.PDFLinkService({
       eventBus,
@@ -594,6 +698,13 @@ const PDFViewerApplication = {
       eventBus
     });
     this.findController = findController;
+    const pdfScriptingManager = new _pdf_scripting_manager.PDFScriptingManager({
+      eventBus,
+      sandboxBundleSrc: _app_options.AppOptions.get("sandboxBundleSrc"),
+      scriptingFactory: this.externalServices,
+      docPropertiesLookup: this._scriptingDocProperties.bind(this)
+    });
+    this.pdfScriptingManager = pdfScriptingManager;
     const container = appConfig.mainContainer;
     const viewer = appConfig.viewerContainer;
     this.pdfViewer = new _pdf_viewer.PDFViewer({
@@ -604,18 +715,20 @@ const PDFViewerApplication = {
       linkService: pdfLinkService,
       downloadManager,
       findController,
+      scriptingManager: pdfScriptingManager,
       renderer: _app_options.AppOptions.get("renderer"),
-      enableWebGL: _app_options.AppOptions.get("enableWebGL"),
       l10n: this.l10n,
       textLayerMode: _app_options.AppOptions.get("textLayerMode"),
       imageResourcesPath: _app_options.AppOptions.get("imageResourcesPath"),
       renderInteractiveForms: _app_options.AppOptions.get("renderInteractiveForms"),
       enablePrintAutoRotate: _app_options.AppOptions.get("enablePrintAutoRotate"),
       useOnlyCssZoom: _app_options.AppOptions.get("useOnlyCssZoom"),
-      maxCanvasPixels: _app_options.AppOptions.get("maxCanvasPixels")
+      maxCanvasPixels: _app_options.AppOptions.get("maxCanvasPixels"),
+      enableScripting: _app_options.AppOptions.get("enableScripting")
     });
     pdfRenderingQueue.setViewer(this.pdfViewer);
     pdfLinkService.setViewer(this.pdfViewer);
+    pdfScriptingManager.setViewer(this.pdfViewer);
     this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({
       container: appConfig.sidebar.thumbnailView,
       eventBus,
@@ -647,12 +760,11 @@ const PDFViewerApplication = {
       this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({
         container,
         pdfViewer: this.pdfViewer,
-        eventBus,
-        contextMenuItems: appConfig.fullscreen
+        eventBus
       });
     }
 
-    this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, 
this.overlayManager, this.l10n);
+    this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, 
this.overlayManager, this.l10n, this.isViewerEmbedded);
     this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({
       container: appConfig.sidebar.outlineView,
       eventBus,
@@ -743,20 +855,15 @@ const PDFViewerApplication = {
     this.pdfViewer.currentPageNumber = val;
   },
 
-  get printing() {
-    return !!this.printService;
-  },
-
   get supportsPrinting() {
     return PDFPrintServiceFactory.instance.supportsPrinting;
   },
 
   get supportsFullscreen() {
-    let support;
     const doc = document.documentElement;
-    support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || 
doc.msRequestFullscreen);
+    let support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen);
 
-    if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || 
document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {
+    if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || 
document.webkitFullscreenEnabled === false) {
       support = false;
     }
 
@@ -787,7 +894,7 @@ const PDFViewerApplication = {
   setTitleUsingUrl(url = "") {
     this.url = url;
     this.baseUrl = url.split("#")[0];
-    let title = (0, _ui_utils.getPDFFileNameFromURL)(url, "");
+    let title = (0, _pdfjsLib.getPdfFilenameFromUrl)(url, "");
 
     if (!title) {
       try {
@@ -808,15 +915,44 @@ const PDFViewerApplication = {
     document.title = title;
   },
 
+  get _docFilename() {
+    return this._contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url);
+  },
+
+  _cancelIdleCallbacks() {
+    if (!this._idleCallbacks.size) {
+      return;
+    }
+
+    for (const callback of this._idleCallbacks) {
+      window.cancelIdleCallback(callback);
+    }
+
+    this._idleCallbacks.clear();
+  },
+
   async close() {
-    const errorWrapper = this.appConfig.errorWrapper.container;
-    errorWrapper.setAttribute("hidden", "true");
+    this._unblockDocumentLoadEvent();
+
+    const {
+      container
+    } = this.appConfig.errorWrapper;
+    container.hidden = true;
 
     if (!this.pdfLoadingTask) {
-      return undefined;
+      return;
+    }
+
+    if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) {
+      try {
+        await this.save({
+          sourceEventType: "save"
+        });
+      } catch (reason) {}
     }
 
-    const promise = this.pdfLoadingTask.destroy();
+    const promises = [];
+    promises.push(this.pdfLoadingTask.destroy());
     this.pdfLoadingTask = null;
 
     if (this.pdfDocument) {
@@ -828,14 +964,22 @@ const PDFViewerApplication = {
     }
 
     webViewerResetPermissions();
+    this.pdfLinkService.externalLinkEnabled = true;
+    this._fellback = false;
     this.store = null;
     this.isInitialViewSet = false;
     this.downloadComplete = false;
     this.url = "";
     this.baseUrl = "";
-    this.contentDispositionFilename = null;
-    this.triggerDelayedFallback = null;
+    this.documentInfo = null;
+    this.metadata = null;
+    this._contentDispositionFilename = null;
+    this._contentLength = null;
     this._saveInProgress = false;
+
+    this._cancelIdleCallbacks();
+
+    promises.push(this.pdfScriptingManager.destroyPromise);
     this.pdfSidebar.reset();
     this.pdfOutlineViewer.reset();
     this.pdfAttachmentViewer.reset();
@@ -856,7 +1000,7 @@ const PDFViewerApplication = {
       PDFBug.cleanup();
     }
 
-    return promise;
+    await Promise.all(promises);
   },
 
   async open(file, args) {
@@ -894,13 +1038,7 @@ const PDFViewerApplication = {
 
     if (args) {
       for (const key in args) {
-        const value = args[key];
-
-        if (key === "length") {
-          this.pdfDocumentProperties.setFileSize(value);
-        }
-
-        parameters[key] = value;
+        parameters[key] = args[key];
       }
     }
 
@@ -928,104 +1066,88 @@ const PDFViewerApplication = {
         return undefined;
       }
 
-      const message = exception && exception.message;
-      let loadingErrorMessage;
+      let key = "loading_error";
 
       if (exception instanceof _pdfjsLib.InvalidPDFException) {
-        loadingErrorMessage = this.l10n.get("invalid_file_error", null, "Invalid or corrupted PDF file.");
+        key = "invalid_file_error";
       } else if (exception instanceof _pdfjsLib.MissingPDFException) {
-        loadingErrorMessage = this.l10n.get("missing_file_error", null, "Missing PDF file.");
+        key = "missing_file_error";
       } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {
-        loadingErrorMessage = this.l10n.get("unexpected_response_error", null, "Unexpected server 
response.");
-      } else {
-        loadingErrorMessage = this.l10n.get("loading_error", null, "An error occurred while loading the 
PDF.");
+        key = "unexpected_response_error";
       }
 
-      return loadingErrorMessage.then(msg => {
-        this.error(msg, {
-          message
+      return this.l10n.get(key).then(msg => {
+        this._documentError(msg, {
+          message: exception?.message
         });
+
         throw exception;
       });
     });
   },
 
-  download({
-    sourceEventType = "download"
-  } = {}) {
-    function downloadByUrl() {
-      downloadManager.downloadUrl(url, filename);
+  _ensureDownloadComplete() {
+    if (this.pdfDocument && this.downloadComplete) {
+      return;
     }
 
-    const url = this.baseUrl;
-    const filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url);
-    const downloadManager = this.downloadManager;
+    throw new Error("PDF document not downloaded.");
+  },
 
-    downloadManager.onerror = err => {
-      this.error(`PDF failed to download: ${err}`);
-    };
+  async download({
+    sourceEventType = "download"
+  } = {}) {
+    const url = this.baseUrl,
+          filename = this._docFilename;
 
-    if (!this.pdfDocument || !this.downloadComplete) {
-      downloadByUrl();
-      return;
-    }
+    try {
+      this._ensureDownloadComplete();
 
-    this.pdfDocument.getData().then(function (data) {
+      const data = await this.pdfDocument.getData();
       const blob = new Blob([data], {
         type: "application/pdf"
       });
-      downloadManager.download(blob, url, filename, sourceEventType);
-    }).catch(downloadByUrl);
+      await this.downloadManager.download(blob, url, filename, sourceEventType);
+    } catch (reason) {
+      await this.downloadManager.downloadUrl(url, filename);
+    }
   },
 
-  save({
+  async save({
     sourceEventType = "download"
   } = {}) {
     if (this._saveInProgress) {
       return;
     }
 
-    const url = this.baseUrl;
-    const filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url);
-    const downloadManager = this.downloadManager;
-
-    downloadManager.onerror = err => {
-      this.error(`PDF failed to be saved: ${err}`);
-    };
+    this._saveInProgress = true;
+    await this.pdfScriptingManager.dispatchWillSave();
+    const url = this.baseUrl,
+          filename = this._docFilename;
 
-    if (!this.pdfDocument || !this.downloadComplete) {
-      this.download({
-        sourceEventType
-      });
-      return;
-    }
+    try {
+      this._ensureDownloadComplete();
 
-    this._saveInProgress = true;
-    this.pdfDocument.saveDocument(this.pdfDocument.annotationStorage).then(data => {
+      const data = await this.pdfDocument.saveDocument();
       const blob = new Blob([data], {
         type: "application/pdf"
       });
-      downloadManager.download(blob, url, filename, sourceEventType);
-    }).catch(() => {
-      this.download({
+      await this.downloadManager.download(blob, url, filename, sourceEventType);
+    } catch (reason) {
+      await this.download({
         sourceEventType
       });
-    }).finally(() => {
+    } finally {
+      await this.pdfScriptingManager.dispatchDidSave();
       this._saveInProgress = false;
-    });
+    }
   },
 
-  _delayedFallback(featureId) {
-    this.externalServices.reportTelemetry({
-      type: "unsupportedFeature",
-      featureId
-    });
-
-    if (!this.triggerDelayedFallback) {
-      this.triggerDelayedFallback = () => {
-        this.fallback(featureId);
-        this.triggerDelayedFallback = null;
-      };
+  downloadOrSave(options) {
+    if (this.pdfDocument?.annotationStorage.size > 0) {
+      this.save(options);
+    } else {
+      this.download(options);
     }
   },
 
@@ -1035,64 +1157,70 @@ const PDFViewerApplication = {
       featureId
     });
 
-    if (this.fellback) {
+    if (this._fellback) {
       return;
     }
 
-    this.fellback = true;
+    this._fellback = true;
     this.externalServices.fallback({
       featureId,
       url: this.baseUrl
-    }, function response(download) {
+    }).then(download => {
       if (!download) {
         return;
       }
 
-      PDFViewerApplication.download({
+      this.download({
         sourceEventType: "download"
       });
     });
   },
 
-  error(message, moreInfo) {
+  _documentError(message, moreInfo = null) {
+    this._unblockDocumentLoadEvent();
+
+    this._otherError(message, moreInfo);
+  },
+
+  _otherError(message, moreInfo = null) {
     const moreInfoText = [this.l10n.get("error_version_info", {
       version: _pdfjsLib.version || "?",
       build: _pdfjsLib.build || "?"
-    }, "PDF.js v{{version}} (build: {{build}})")];
+    })];
 
     if (moreInfo) {
       moreInfoText.push(this.l10n.get("error_message", {
         message: moreInfo.message
-      }, "Message: {{message}}"));
+      }));
 
       if (moreInfo.stack) {
         moreInfoText.push(this.l10n.get("error_stack", {
           stack: moreInfo.stack
-        }, "Stack: {{stack}}"));
+        }));
       } else {
         if (moreInfo.filename) {
           moreInfoText.push(this.l10n.get("error_file", {
             file: moreInfo.filename
-          }, "File: {{file}}"));
+          }));
         }
 
         if (moreInfo.lineNumber) {
           moreInfoText.push(this.l10n.get("error_line", {
             line: moreInfo.lineNumber
-          }, "Line: {{line}}"));
+          }));
         }
       }
     }
 
     const errorWrapperConfig = this.appConfig.errorWrapper;
     const errorWrapper = errorWrapperConfig.container;
-    errorWrapper.removeAttribute("hidden");
+    errorWrapper.hidden = false;
     const errorMessage = errorWrapperConfig.errorMessage;
     errorMessage.textContent = message;
     const closeButton = errorWrapperConfig.closeButton;
 
     closeButton.onclick = function () {
-      errorWrapper.setAttribute("hidden", "true");
+      errorWrapper.hidden = true;
     };
 
     const errorMoreInfo = errorWrapperConfig.errorMoreInfo;
@@ -1100,23 +1228,23 @@ const PDFViewerApplication = {
     const lessInfoButton = errorWrapperConfig.lessInfoButton;
 
     moreInfoButton.onclick = function () {
-      errorMoreInfo.removeAttribute("hidden");
-      moreInfoButton.setAttribute("hidden", "true");
-      lessInfoButton.removeAttribute("hidden");
+      errorMoreInfo.hidden = false;
+      moreInfoButton.hidden = true;
+      lessInfoButton.hidden = false;
       errorMoreInfo.style.height = errorMoreInfo.scrollHeight + "px";
     };
 
     lessInfoButton.onclick = function () {
-      errorMoreInfo.setAttribute("hidden", "true");
-      moreInfoButton.removeAttribute("hidden");
-      lessInfoButton.setAttribute("hidden", "true");
+      errorMoreInfo.hidden = true;
+      moreInfoButton.hidden = false;
+      lessInfoButton.hidden = true;
     };
 
     moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
     lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
     closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;
-    moreInfoButton.removeAttribute("hidden");
-    lessInfoButton.setAttribute("hidden", "true");
+    moreInfoButton.hidden = false;
+    lessInfoButton.hidden = true;
     Promise.all(moreInfoText).then(parts => {
       errorMoreInfo.value = parts.join("\n");
     });
@@ -1150,7 +1278,10 @@ const PDFViewerApplication = {
 
   load(pdfDocument) {
     this.pdfDocument = pdfDocument;
-    pdfDocument.getDownloadInfo().then(() => {
+    pdfDocument.getDownloadInfo().then(({
+      length
+    }) => {
+      this._contentLength = length;
       this.downloadComplete = true;
       this.loadingBar.hide();
       firstPagePromise.then(() => {
@@ -1168,16 +1299,6 @@ const PDFViewerApplication = {
     baseDocumentUrl = null;
     this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);
     this.pdfDocumentProperties.setDocument(pdfDocument, this.url);
-    const annotationStorage = pdfDocument.annotationStorage;
-
-    annotationStorage.onSetModified = function () {
-      window.addEventListener("beforeunload", beforeUnload);
-    };
-
-    annotationStorage.onResetModified = function () {
-      window.removeEventListener("beforeunload", beforeUnload);
-    };
-
     const pdfViewer = this.pdfViewer;
     pdfViewer.setDocument(pdfDocument);
     const {
@@ -1187,13 +1308,13 @@ const PDFViewerApplication = {
     } = pdfViewer;
     const pdfThumbnailViewer = this.pdfThumbnailViewer;
     pdfThumbnailViewer.setDocument(pdfDocument);
-    const storedPromise = (this.store = new _view_history.ViewHistory(pdfDocument.fingerprint)).getMultiple({
+    const storedPromise = (this.store = new 
_view_history.ViewHistory(pdfDocument.fingerprints[0])).getMultiple({
       page: null,
       zoom: _ui_utils.DEFAULT_SCALE_VALUE,
       scrollLeft: "0",
       scrollTop: "0",
       rotation: null,
-      sidebarView: _pdf_sidebar.SidebarView.UNKNOWN,
+      sidebarView: _ui_utils.SidebarView.UNKNOWN,
       scrollMode: _ui_utils.ScrollMode.UNKNOWN,
       spreadMode: _ui_utils.SpreadMode.UNKNOWN
     }).catch(() => {
@@ -1201,13 +1322,16 @@ const PDFViewerApplication = {
     });
     firstPagePromise.then(pdfPage => {
       this.loadingBar.setWidth(this.appConfig.viewerContainer);
+
+      this._initializeAnnotationStorageCallbacks(pdfDocument);
+
       Promise.all([_ui_utils.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, 
openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {
         const viewOnLoad = _app_options.AppOptions.get("viewOnLoad");
 
         this._initializePdfHistory({
-          fingerprint: pdfDocument.fingerprint,
+          fingerprint: pdfDocument.fingerprints[0],
           viewOnLoad,
-          initialDest: openAction && openAction.dest
+          initialDest: openAction?.dest
         });
 
         const initialBookmark = this.initialBookmark;
@@ -1227,7 +1351,7 @@ const PDFViewerApplication = {
           hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + 
`${stored.scrollLeft},${stored.scrollTop}`;
           rotation = parseInt(stored.rotation, 10);
 
-          if (sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) {
+          if (sidebarView === _ui_utils.SidebarView.UNKNOWN) {
             sidebarView = stored.sidebarView | 0;
           }
 
@@ -1240,12 +1364,12 @@ const PDFViewerApplication = {
           }
         }
 
-        if (pageMode && sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) {
-          sidebarView = apiPageModeToSidebarView(pageMode);
+        if (pageMode && sidebarView === _ui_utils.SidebarView.UNKNOWN) {
+          sidebarView = (0, _ui_utils.apiPageModeToSidebarView)(pageMode);
         }
 
         if (pageLayout && spreadMode === _ui_utils.SpreadMode.UNKNOWN) {
-          spreadMode = apiPageLayoutToSpreadMode(pageLayout);
+          spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(pageLayout);
         }
 
         this.setInitialView(hash, {
@@ -1286,34 +1410,111 @@ const PDFViewerApplication = {
       });
     });
     pagesPromise.then(() => {
+      this._unblockDocumentLoadEvent();
+
       this._initializeAutoPrint(pdfDocument, openActionPromise);
     });
     onePageRendered.then(() => {
       pdfDocument.getOutline().then(outline => {
+        if (pdfDocument !== this.pdfDocument) {
+          return;
+        }
+
         this.pdfOutlineViewer.render({
-          outline
+          outline,
+          pdfDocument
         });
       });
       pdfDocument.getAttachments().then(attachments => {
+        if (pdfDocument !== this.pdfDocument) {
+          return;
+        }
+
         this.pdfAttachmentViewer.render({
           attachments
         });
       });
-      pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {
-        this.pdfLayerViewer.render({
-          optionalContentConfig,
-          pdfDocument
+      pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {
+        if (pdfDocument !== this.pdfDocument) {
+          return;
+        }
+
+        this.pdfLayerViewer.render({
+          optionalContentConfig,
+          pdfDocument
+        });
+      });
+
+      if ("requestIdleCallback" in window) {
+        const callback = window.requestIdleCallback(() => {
+          this._collectTelemetry(pdfDocument);
+
+          this._idleCallbacks.delete(callback);
+        }, {
+          timeout: 1000
+        });
+
+        this._idleCallbacks.add(callback);
+      }
+    });
+
+    this._initializePageLabels(pdfDocument);
+
+    this._initializeMetadata(pdfDocument);
+  },
+
+  async _scriptingDocProperties(pdfDocument) {
+    if (!this.documentInfo) {
+      await new Promise(resolve => {
+        this.eventBus._on("metadataloaded", resolve, {
+          once: true
+        });
+      });
+
+      if (pdfDocument !== this.pdfDocument) {
+        return null;
+      }
+    }
+
+    if (!this._contentLength) {
+      await new Promise(resolve => {
+        this.eventBus._on("documentloaded", resolve, {
+          once: true
         });
       });
-    });
 
-    this._initializePageLabels(pdfDocument);
+      if (pdfDocument !== this.pdfDocument) {
+        return null;
+      }
+    }
 
-    this._initializeMetadata(pdfDocument);
+    return { ...this.documentInfo,
+      baseURL: this.baseUrl,
+      filesize: this._contentLength,
+      filename: this._docFilename,
+      metadata: this.metadata?.getRaw(),
+      authors: this.metadata?.get("dc:creator"),
+      numPages: this.pagesCount,
+      URL: this.url
+    };
+  },
+
+  async _collectTelemetry(pdfDocument) {
+    const markInfo = await this.pdfDocument.getMarkInfo();
+
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+
+    const tagged = markInfo?.Marked || false;
+    this.externalServices.reportTelemetry({
+      type: "tagged",
+      tagged
+    });
   },
 
   async _initializeAutoPrint(pdfDocument, openActionPromise) {
-    const [openAction, javaScript] = await Promise.all([openActionPromise, pdfDocument.getJavaScript()]);
+    const [openAction, javaScript] = await Promise.all([openActionPromise, !this.pdfViewer.enableScripting ? 
pdfDocument.getJavaScript() : null]);
 
     if (pdfDocument !== this.pdfDocument) {
       return;
@@ -1321,7 +1522,7 @@ const PDFViewerApplication = {
 
     let triggerAutoPrint = false;
 
-    if (openAction && openAction.action === "Print") {
+    if (openAction?.action === "Print") {
       triggerAutoPrint = true;
     }
 
@@ -1331,10 +1532,8 @@ const PDFViewerApplication = {
           return false;
         }
 
-        console.warn("Warning: JavaScript is not supported");
-
-        this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
-
+        console.warn("Warning: JavaScript support is not enabled");
+        this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
         return true;
       });
 
@@ -1348,14 +1547,8 @@ const PDFViewerApplication = {
       }
     }
 
-    if (!this.supportsPrinting) {
-      return;
-    }
-
     if (triggerAutoPrint) {
-      setTimeout(function () {
-        window.print();
-      });
+      this.triggerPrinting();
     }
   },
 
@@ -1363,7 +1556,8 @@ const PDFViewerApplication = {
     const {
       info,
       metadata,
-      contentDispositionFilename
+      contentDispositionFilename,
+      contentLength
     } = await pdfDocument.getMetadata();
 
     if (pdfDocument !== this.pdfDocument) {
@@ -1372,16 +1566,11 @@ const PDFViewerApplication = {
 
     this.documentInfo = info;
     this.metadata = metadata;
-    this.contentDispositionFilename = contentDispositionFilename;
-    console.log(`PDF ${pdfDocument.fingerprint} [${info.PDFFormatVersion} ` + `${(info.Producer || 
"-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${_pdfjsLib.version || "-"}` + 
`${this.pdfViewer.enableWebGL ? " [WebGL]" : ""})`);
-    let pdfTitle;
-    const infoTitle = info && info.Title;
-
-    if (infoTitle) {
-      pdfTitle = infoTitle;
-    }
-
-    const metadataTitle = metadata && metadata.get("dc:title");
+    this._contentDispositionFilename ?? (this._contentDispositionFilename = contentDispositionFilename);
+    this._contentLength ?? (this._contentLength = contentLength);
+    console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || 
"-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${_pdfjsLib.version || "-"})`);
+    let pdfTitle = info?.Title;
+    const metadataTitle = metadata?.get("dc:title");
 
     if (metadataTitle) {
       if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) {
@@ -1395,14 +1584,17 @@ const PDFViewerApplication = {
       this.setTitle(contentDispositionFilename);
     }
 
-    if (info.IsXFAPresent && !info.IsAcroFormPresent) {
-      console.warn("Warning: XFA is not supported");
-
-      this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
+    if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) {
+      console.warn("Warning: XFA support is not enabled");
+      this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
     } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderInteractiveForms) {
       console.warn("Warning: Interactive form support is not enabled");
+      this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
+    }
 
-      this._delayedFallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
+    if (info.IsSignaturesPresent) {
+      console.warn("Warning: Digital signatures validation is not supported");
+      this.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.signatures);
     }
 
     let versionId = "other";
@@ -1420,7 +1612,7 @@ const PDFViewerApplication = {
           return false;
         }
 
-        generatorId = generator.replace(/[ .\-]/g, "_");
+        generatorId = generator.replace(/[ .-]/g, "_");
         return true;
       });
     }
@@ -1439,6 +1631,9 @@ const PDFViewerApplication = {
       generator: generatorId,
       formType
     });
+    this.eventBus.dispatch("metadataloaded", {
+      source: this
+    });
   },
 
   async _initializePageLabels(pdfDocument) {
@@ -1525,6 +1720,26 @@ const PDFViewerApplication = {
     }
   },
 
+  _initializeAnnotationStorageCallbacks(pdfDocument) {
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+
+    const {
+      annotationStorage
+    } = pdfDocument;
+
+    annotationStorage.onSetModified = () => {
+      window.addEventListener("beforeunload", beforeUnload);
+      this._annotationStorageModified = true;
+    };
+
+    annotationStorage.onResetModified = () => {
+      window.removeEventListener("beforeunload", beforeUnload);
+      delete this._annotationStorageModified;
+    };
+  },
+
   setInitialView(storedHash, {
     rotation,
     sidebarView,
@@ -1569,40 +1784,39 @@ const PDFViewerApplication = {
     }
   },
 
-  cleanup() {
+  _cleanup() {
     if (!this.pdfDocument) {
       return;
     }
 
     this.pdfViewer.cleanup();
     this.pdfThumbnailViewer.cleanup();
-
-    if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {
-      this.pdfDocument.cleanup();
-    }
+    this.pdfDocument.cleanup(this.pdfViewer.renderer === _ui_utils.RendererType.SVG);
   },
 
   forceRendering() {
-    this.pdfRenderingQueue.printing = this.printing;
+    this.pdfRenderingQueue.printing = !!this.printService;
     this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;
     this.pdfRenderingQueue.renderHighestPriority();
   },
 
   beforePrint() {
+    this.pdfScriptingManager.dispatchWillPrint();
+
     if (this.printService) {
       return;
     }
 
     if (!this.supportsPrinting) {
-      this.l10n.get("printing_not_supported", null, "Warning: Printing is not fully supported by this 
browser.").then(printMessage => {
-        this.error(printMessage);
+      this.l10n.get("printing_not_supported").then(msg => {
+        this._otherError(msg);
       });
       return;
     }
 
     if (!this.pdfViewer.pageViewsReady) {
-      this.l10n.get("printing_not_ready", null, "Warning: The PDF is not fully loaded for 
printing.").then(notReadyMessage => {
-        window.alert(notReadyMessage);
+      this.l10n.get("printing_not_ready").then(msg => {
+        window.alert(msg);
       });
       return;
     }
@@ -1623,6 +1837,8 @@ const PDFViewerApplication = {
   },
 
   afterPrint() {
+    this.pdfScriptingManager.dispatchDidPrint();
+
     if (this.printService) {
       this.printService.destroy();
       this.printService = null;
@@ -1636,12 +1852,7 @@ const PDFViewerApplication = {
   },
 
   rotatePages(delta) {
-    if (!this.pdfDocument) {
-      return;
-    }
-
-    const newRotation = (this.pdfViewer.pagesRotation + 360 + delta) % 360;
-    this.pdfViewer.pagesRotation = newRotation;
+    this.pdfViewer.pagesRotation += delta;
   },
 
   requestPresentationMode() {
@@ -1652,6 +1863,14 @@ const PDFViewerApplication = {
     this.pdfPresentationMode.request();
   },
 
+  triggerPrinting() {
+    if (!this.supportsPrinting) {
+      return;
+    }
+
+    window.print();
+  },
+
   bindEvents() {
     const {
       eventBus,
@@ -1736,6 +1955,14 @@ const PDFViewerApplication = {
 
     eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState);
 
+    if (_app_options.AppOptions.get("pdfBug")) {
+      _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug;
+
+      eventBus._on("pagerendered", _boundEvents.reportPageStatsPDFBug);
+
+      eventBus._on("pagechanging", _boundEvents.reportPageStatsPDFBug);
+    }
+
     eventBus._on("fileinputchange", webViewerFileInputChange);
 
     eventBus._on("openfile", webViewerOpenFile);
@@ -1772,6 +1999,13 @@ const PDFViewerApplication = {
       });
     };
 
+    _boundEvents.windowUpdateFromSandbox = event => {
+      eventBus.dispatch("updatefromsandbox", {
+        source: window,
+        detail: event.detail
+      });
+    };
+
     window.addEventListener("visibilitychange", webViewerVisibilityChange);
     window.addEventListener("wheel", webViewerWheel, {
       passive: false
@@ -1781,11 +2015,11 @@ const PDFViewerApplication = {
     });
     window.addEventListener("click", webViewerClick);
     window.addEventListener("keydown", webViewerKeyDown);
-    window.addEventListener("keyup", webViewerKeyUp);
     window.addEventListener("resize", _boundEvents.windowResize);
     window.addEventListener("hashchange", _boundEvents.windowHashChange);
     window.addEventListener("beforeprint", _boundEvents.windowBeforePrint);
     window.addEventListener("afterprint", _boundEvents.windowAfterPrint);
+    window.addEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox);
   },
 
   unbindEvents() {
@@ -1870,6 +2104,14 @@ const PDFViewerApplication = {
 
     eventBus._off("updatefindcontrolstate", webViewerUpdateFindControlState);
 
+    if (_boundEvents.reportPageStatsPDFBug) {
+      eventBus._off("pagerendered", _boundEvents.reportPageStatsPDFBug);
+
+      eventBus._off("pagechanging", _boundEvents.reportPageStatsPDFBug);
+
+      _boundEvents.reportPageStatsPDFBug = null;
+    }
+
     eventBus._off("fileinputchange", webViewerFileInputChange);
 
     eventBus._off("openfile", webViewerOpenFile);
@@ -1891,15 +2133,16 @@ const PDFViewerApplication = {
     });
     window.removeEventListener("click", webViewerClick);
     window.removeEventListener("keydown", webViewerKeyDown);
-    window.removeEventListener("keyup", webViewerKeyUp);
     window.removeEventListener("resize", _boundEvents.windowResize);
     window.removeEventListener("hashchange", _boundEvents.windowHashChange);
     window.removeEventListener("beforeprint", _boundEvents.windowBeforePrint);
     window.removeEventListener("afterprint", _boundEvents.windowAfterPrint);
+    window.removeEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox);
     _boundEvents.windowResize = null;
     _boundEvents.windowHashChange = null;
     _boundEvents.windowBeforePrint = null;
     _boundEvents.windowAfterPrint = null;
+    _boundEvents.windowUpdateFromSandbox = null;
   },
 
   accumulateWheelTicks(ticks) {
@@ -1911,6 +2154,18 @@ const PDFViewerApplication = {
     const wholeTicks = Math.sign(this._wheelUnusedTicks) * Math.floor(Math.abs(this._wheelUnusedTicks));
     this._wheelUnusedTicks -= wholeTicks;
     return wholeTicks;
+  },
+
+  _unblockDocumentLoadEvent() {
+    if (document.blockUnblockOnload) {
+      document.blockUnblockOnload(false);
+    }
+
+    this._unblockDocumentLoadEvent = () => {};
+  },
+
+  get scriptingReady() {
+    return this.pdfScriptingManager.ready;
   }
 
 };
@@ -1940,10 +2195,9 @@ let validateFileURL;
         throw new Error("file origin does not match viewer's");
       }
     } catch (ex) {
-      const message = ex && ex.message;
-      PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the 
PDF.").then(loadingErrorMessage => {
-        PDFViewerApplication.error(loadingErrorMessage, {
-          message
+      PDFViewerApplication.l10n.get("loading_error").then(msg => {
+        PDFViewerApplication._documentError(msg, {
+          message: ex?.message
         });
       });
       throw ex;
@@ -1969,6 +2223,23 @@ function loadAndEnablePDFBug(enabledTabs) {
   });
 }
 
+function reportPageStatsPDFBug({
+  pageNumber
+}) {
+  if (typeof Stats === "undefined" || !Stats.enabled) {
+    return;
+  }
+
+  const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);
+  const pageStats = pageView?.pdfPage?.stats;
+
+  if (!pageStats) {
+    return;
+  }
+
+  Stats.add(pageNumber, pageStats);
+}
+
 function webViewerInitialized() {
   const appConfig = PDFViewerApplication.appConfig;
   let file;
@@ -2018,7 +2289,7 @@ function webViewerInitialized() {
   if (!PDFViewerApplication.supportsDocumentFonts) {
     _app_options.AppOptions.set("disableFontFace", true);
 
-    PDFViewerApplication.l10n.get("web_fonts_disabled", null, "Web fonts are disabled: unable to use 
embedded PDF fonts.").then(msg => {
+    PDFViewerApplication.l10n.get("web_fonts_disabled").then(msg => {
       console.warn(msg);
     });
   }
@@ -2058,33 +2329,16 @@ function webViewerInitialized() {
     PDFViewerApplication.open(array);
     PDFViewerApplication.setTitleUsingUrl(file_name);
   } catch (reason) {
-    PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the 
PDF.").then(msg => {
-      PDFViewerApplication.error(msg, reason);
+    PDFViewerApplication.l10n.get("loading_error").then(msg => {
+      PDFViewerApplication._documentError(msg, reason);
     });
   }
 }
 
-let webViewerOpenFileViaURL;
-{
-  webViewerOpenFileViaURL = function (file) {
-    if (file && file.lastIndexOf("file:", 0) === 0) {
-      PDFViewerApplication.setTitleUsingUrl(file);
-      const xhr = new XMLHttpRequest();
-
-      xhr.onload = function () {
-        PDFViewerApplication.open(new Uint8Array(xhr.response));
-      };
-
-      xhr.open("GET", file);
-      xhr.responseType = "arraybuffer";
-      xhr.send();
-      return;
-    }
-
-    if (file) {
-      PDFViewerApplication.open(file);
-    }
-  };
+function webViewerOpenFileViaURL(file) {
+  if (file) {
+    PDFViewerApplication.open(file);
+  }
 }
 
 function webViewerResetPermissions() {
@@ -2099,37 +2353,33 @@ function webViewerResetPermissions() {
   appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS);
 }
 
-function webViewerPageRendered(evt) {
-  const pageNumber = evt.pageNumber;
-  const pageIndex = pageNumber - 1;
-  const pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
-
+function webViewerPageRendered({
+  pageNumber,
+  timestamp,
+  error
+}) {
   if (pageNumber === PDFViewerApplication.page) {
     PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);
   }
 
-  if (!pageView) {
-    return;
-  }
-
   if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
-    const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);
-    thumbnailView.setImage(pageView);
-  }
+    const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1);
+    const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageNumber - 1);
 
-  if (typeof Stats !== "undefined" && Stats.enabled && pageView.stats) {
-    Stats.add(pageNumber, pageView.stats);
+    if (pageView && thumbnailView) {
+      thumbnailView.setImage(pageView);
+    }
   }
 
-  if (pageView.error) {
-    PDFViewerApplication.l10n.get("rendering_error", null, "An error occurred while rendering the 
page.").then(msg => {
-      PDFViewerApplication.error(msg, pageView.error);
+  if (error) {
+    PDFViewerApplication.l10n.get("rendering_error").then(msg => {
+      PDFViewerApplication._otherError(msg, error);
     });
   }
 
   PDFViewerApplication.externalServices.reportTelemetry({
     type: "pageInfo",
-    timestamp: evt.timestamp
+    timestamp
   });
   PDFViewerApplication.pdfDocument.getStats().then(function (stats) {
     PDFViewerApplication.externalServices.reportTelemetry({
@@ -2146,24 +2396,24 @@ function webViewerPageMode({
 
   switch (mode) {
     case "thumbs":
-      view = _pdf_sidebar.SidebarView.THUMBS;
+      view = _ui_utils.SidebarView.THUMBS;
       break;
 
     case "bookmarks":
     case "outline":
-      view = _pdf_sidebar.SidebarView.OUTLINE;
+      view = _ui_utils.SidebarView.OUTLINE;
       break;
 
     case "attachments":
-      view = _pdf_sidebar.SidebarView.ATTACHMENTS;
+      view = _ui_utils.SidebarView.ATTACHMENTS;
       break;
 
     case "layers":
-      view = _pdf_sidebar.SidebarView.LAYERS;
+      view = _ui_utils.SidebarView.LAYERS;
       break;
 
     case "none":
-      view = _pdf_sidebar.SidebarView.NONE;
+      view = _ui_utils.SidebarView.NONE;
       break;
 
     default:
@@ -2188,10 +2438,7 @@ function webViewerNamedAction(evt) {
       break;
 
     case "Print":
-      if (PDFViewerApplication.supportsPrinting) {
-        webViewerPrint();
-      }
-
+      PDFViewerApplication.triggerPrinting();
       break;
 
     case "SaveAs":
@@ -2200,19 +2447,8 @@ function webViewerNamedAction(evt) {
   }
 }
 
-function webViewerPresentationModeChanged({
-  active,
-  switchInProgress
-}) {
-  let state = _ui_utils.PresentationModeState.NORMAL;
-
-  if (switchInProgress) {
-    state = _ui_utils.PresentationModeState.CHANGING;
-  } else if (active) {
-    state = _ui_utils.PresentationModeState.FULLSCREEN;
-  }
-
-  PDFViewerApplication.pdfViewer.presentationModeState = state;
+function webViewerPresentationModeChanged(evt) {
+  PDFViewerApplication.pdfViewer.presentationModeState = evt.state;
 }
 
 function webViewerSidebarViewChanged(evt) {
@@ -2242,7 +2478,7 @@ function webViewerUpdateViewarea(evt) {
   PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;
   PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;
   const currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
-  const loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
+  const loading = currentPage?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
   PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);
 }
 
@@ -2298,7 +2534,7 @@ function webViewerHashchange(evt) {
 let webViewerFileInputChange, webViewerOpenFile;
 {
   webViewerFileInputChange = function (evt) {
-    if (PDFViewerApplication.pdfViewer && PDFViewerApplication.pdfViewer.isInPresentationMode) {
+    if (PDFViewerApplication.pdfViewer?.isInPresentationMode) {
       return;
     }
 
@@ -2328,10 +2564,10 @@ let webViewerFileInputChange, webViewerOpenFile;
     }
 
     const appConfig = PDFViewerApplication.appConfig;
-    appConfig.toolbar.viewBookmark.setAttribute("hidden", "true");
-    appConfig.secondaryToolbar.viewBookmarkButton.setAttribute("hidden", "true");
-    appConfig.toolbar.download.setAttribute("hidden", "true");
-    appConfig.secondaryToolbar.downloadButton.setAttribute("hidden", "true");
+    appConfig.toolbar.viewBookmark.hidden = true;
+    appConfig.secondaryToolbar.viewBookmarkButton.hidden = true;
+    appConfig.toolbar.download.hidden = true;
+    appConfig.secondaryToolbar.downloadButton.hidden = true;
   };
 
   webViewerOpenFile = function (evt) {
@@ -2345,27 +2581,19 @@ function webViewerPresentationMode() {
 }
 
 function webViewerPrint() {
-  window.print();
-}
-
-function webViewerDownloadOrSave(sourceEventType) {
-  if (PDFViewerApplication.pdfDocument && PDFViewerApplication.pdfDocument.annotationStorage.size > 0) {
-    PDFViewerApplication.save({
-      sourceEventType
-    });
-  } else {
-    PDFViewerApplication.download({
-      sourceEventType
-    });
-  }
+  PDFViewerApplication.triggerPrinting();
 }
 
 function webViewerDownload() {
-  webViewerDownloadOrSave("download");
+  PDFViewerApplication.downloadOrSave({
+    sourceEventType: "download"
+  });
 }
 
 function webViewerSave() {
-  webViewerDownloadOrSave("save");
+  PDFViewerApplication.downloadOrSave({
+    sourceEventType: "save"
+  });
 }
 
 function webViewerFirstPage() {
@@ -2381,11 +2609,11 @@ function webViewerLastPage() {
 }
 
 function webViewerNextPage() {
-  PDFViewerApplication.page++;
+  PDFViewerApplication.pdfViewer.nextPage();
 }
 
 function webViewerPreviousPage() {
-  PDFViewerApplication.page--;
+  PDFViewerApplication.pdfViewer.previousPage();
 }
 
 function webViewerZoomIn() {
@@ -2404,7 +2632,7 @@ function webViewerPageNumberChanged(evt) {
   const pdfViewer = PDFViewerApplication.pdfViewer;
 
   if (evt.value !== "") {
-    pdfViewer.currentPageLabel = evt.value;
+    PDFViewerApplication.pdfLinkService.goToPage(evt.value);
   }
 
   if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {
@@ -2501,21 +2729,15 @@ function webViewerRotationChanging(evt) {
   PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;
 }
 
-function webViewerPageChanging(evt) {
-  const page = evt.pageNumber;
-  PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);
-  PDFViewerApplication.secondaryToolbar.setPageNumber(page);
+function webViewerPageChanging({
+  pageNumber,
+  pageLabel
+}) {
+  PDFViewerApplication.toolbar.setPageNumber(pageNumber, pageLabel);
+  PDFViewerApplication.secondaryToolbar.setPageNumber(pageNumber);
 
   if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
-    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
-  }
-
-  if (typeof Stats !== "undefined" && Stats.enabled) {
-    const pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);
-
-    if (pageView && pageView.stats) {
-      Stats.add(page, pageView.stats);
-    }
+    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(pageNumber);
   }
 }
 
@@ -2597,10 +2819,6 @@ function webViewerTouchStart(evt) {
 }
 
 function webViewerClick(evt) {
-  if (PDFViewerApplication.triggerDelayedFallback && 
PDFViewerApplication.pdfViewer.containsElement(evt.target)) {
-    PDFViewerApplication.triggerDelayedFallback();
-  }
-
   if (!PDFViewerApplication.secondaryToolbar.isOpen) {
     return;
   }
@@ -2612,14 +2830,6 @@ function webViewerClick(evt) {
   }
 }
 
-function webViewerKeyUp(evt) {
-  if (evt.keyCode === 9) {
-    if (PDFViewerApplication.triggerDelayedFallback) {
-      PDFViewerApplication.triggerDelayedFallback();
-    }
-  }
-}
-
 function webViewerKeyDown(evt) {
   if (PDFViewerApplication.overlayManager.active) {
     return;
@@ -2629,12 +2839,12 @@ function webViewerKeyDown(evt) {
       ensureViewerFocused = false;
   const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);
   const pdfViewer = PDFViewerApplication.pdfViewer;
-  const isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;
+  const isViewerInPresentationMode = pdfViewer?.isInPresentationMode;
 
   if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
     switch (evt.keyCode) {
       case 70:
-        if (!PDFViewerApplication.supportsIntegratedFind) {
+        if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) {
           PDFViewerApplication.findBar.open();
           handled = true;
         }
@@ -2760,10 +2970,10 @@ function webViewerKeyDown(evt) {
     return;
   }
 
-  const curElement = document.activeElement || document.querySelector(":focus");
-  const curElementTagName = curElement && curElement.tagName.toUpperCase();
+  const curElement = (0, _ui_utils.getActiveOrFocusedElement)();
+  const curElementTagName = curElement?.tagName.toUpperCase();
 
-  if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || 
curElement && curElement.isContentEditable) {
+  if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || 
curElement?.isContentEditable) {
     if (evt.keyCode !== 27) {
       return;
     }
@@ -2879,13 +3089,9 @@ function webViewerKeyDown(evt) {
 
     if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) {
       if (turnPage > 0) {
-        if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
-          PDFViewerApplication.page++;
-        }
+        pdfViewer.nextPage();
       } else {
-        if (PDFViewerApplication.page > 1) {
-          PDFViewerApplication.page--;
-        }
+        pdfViewer.previousPage();
       }
 
       handled = true;
@@ -2934,45 +3140,6 @@ function beforeUnload(evt) {
   return false;
 }
 
-function apiPageLayoutToSpreadMode(layout) {
-  switch (layout) {
-    case "SinglePage":
-    case "OneColumn":
-      return _ui_utils.SpreadMode.NONE;
-
-    case "TwoColumnLeft":
-    case "TwoPageLeft":
-      return _ui_utils.SpreadMode.ODD;
-
-    case "TwoColumnRight":
-    case "TwoPageRight":
-      return _ui_utils.SpreadMode.EVEN;
-  }
-
-  return _ui_utils.SpreadMode.NONE;
-}
-
-function apiPageModeToSidebarView(mode) {
-  switch (mode) {
-    case "UseNone":
-      return _pdf_sidebar.SidebarView.NONE;
-
-    case "UseThumbs":
-      return _pdf_sidebar.SidebarView.THUMBS;
-
-    case "UseOutlines":
-      return _pdf_sidebar.SidebarView.OUTLINE;
-
-    case "UseAttachments":
-      return _pdf_sidebar.SidebarView.ATTACHMENTS;
-
-    case "UseOC":
-      return _pdf_sidebar.SidebarView.LAYERS;
-  }
-
-  return _pdf_sidebar.SidebarView.NONE;
-}
-
 const PDFPrintServiceFactory = {
   instance: {
     supportsPrinting: false,
@@ -2986,37 +3153,37 @@ const PDFPrintServiceFactory = {
 exports.PDFPrintServiceFactory = PDFPrintServiceFactory;
 
 /***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 4 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
+exports.apiPageLayoutToSpreadMode = apiPageLayoutToSpreadMode;
+exports.apiPageModeToSidebarView = apiPageModeToSidebarView;
+exports.approximateFraction = approximateFraction;
+exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
+exports.binarySearchFirstItem = binarySearchFirstItem;
+exports.getActiveOrFocusedElement = getActiveOrFocusedElement;
+exports.getOutputScale = getOutputScale;
+exports.getPageSizeInches = getPageSizeInches;
+exports.getVisibleElements = getVisibleElements;
+exports.isPortraitOrientation = isPortraitOrientation;
 exports.isValidRotation = isValidRotation;
 exports.isValidScrollMode = isValidScrollMode;
 exports.isValidSpreadMode = isValidSpreadMode;
-exports.isPortraitOrientation = isPortraitOrientation;
-exports.clamp = clamp;
-exports.getPDFFileNameFromURL = getPDFFileNameFromURL;
+exports.moveToEndOfArray = moveToEndOfArray;
 exports.noContextMenuHandler = noContextMenuHandler;
+exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
+exports.normalizeWheelEventDirection = normalizeWheelEventDirection;
 exports.parseQueryString = parseQueryString;
-exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
-exports.getVisibleElements = getVisibleElements;
 exports.roundToDivide = roundToDivide;
-exports.getPageSizeInches = getPageSizeInches;
-exports.approximateFraction = approximateFraction;
-exports.getOutputScale = getOutputScale;
 exports.scrollIntoView = scrollIntoView;
-exports.watchScroll = watchScroll;
-exports.binarySearchFirstItem = binarySearchFirstItem;
-exports.normalizeWheelEventDirection = normalizeWheelEventDirection;
-exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
 exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
-exports.moveToEndOfArray = moveToEndOfArray;
-exports.WaitOnType = exports.animationStarted = exports.ProgressBar = exports.EventBus = exports.NullL10n = 
exports.SpreadMode = exports.ScrollMode = exports.TextLayerMode = exports.RendererType = 
exports.PresentationModeState = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE 
= exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = 
exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = exports.AutoPrintRegExp = void 0;
+exports.watchScroll = watchScroll;
+exports.WaitOnType = exports.VERTICAL_PADDING = exports.UNKNOWN_SCALE = exports.TextLayerMode = 
exports.SpreadMode = exports.SidebarView = exports.ScrollMode = exports.SCROLLBAR_PADDING = 
exports.RendererType = exports.ProgressBar = exports.PresentationModeState = exports.MIN_SCALE = 
exports.MAX_SCALE = exports.MAX_AUTO_SCALE = exports.EventBus = exports.DEFAULT_SCALE_VALUE = 
exports.DEFAULT_SCALE = exports.CSS_UNITS = exports.AutoPrintRegExp = exports.animationStarted = void 0;
 const CSS_UNITS = 96.0 / 72.0;
 exports.CSS_UNITS = CSS_UNITS;
 const DEFAULT_SCALE_VALUE = "auto";
@@ -3035,6 +3202,7 @@ const SCROLLBAR_PADDING = 40;
 exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;
 const VERTICAL_PADDING = 5;
 exports.VERTICAL_PADDING = VERTICAL_PADDING;
+const LOADINGBAR_END_OFFSET_VAR = "--loadingBar-end-offset";
 const PresentationModeState = {
   UNKNOWN: 0,
   NORMAL: 1,
@@ -3042,6 +3210,15 @@ const PresentationModeState = {
   FULLSCREEN: 3
 };
 exports.PresentationModeState = PresentationModeState;
+const SidebarView = {
+  UNKNOWN: -1,
+  NONE: 0,
+  THUMBS: 1,
+  OUTLINE: 2,
+  ATTACHMENTS: 3,
+  LAYERS: 4
+};
+exports.SidebarView = SidebarView;
 const RendererType = {
   CANVAS: "canvas",
   SVG: "svg"
@@ -3070,37 +3247,9 @@ exports.SpreadMode = SpreadMode;
 const AutoPrintRegExp = /\bprint\s*\(/;
 exports.AutoPrintRegExp = AutoPrintRegExp;
 
-function formatL10nValue(text, args) {
-  if (!args) {
-    return text;
-  }
-
-  return text.replace(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => {
-    return name in args ? args[name] : "{{" + name + "}}";
-  });
-}
-
-const NullL10n = {
-  async getLanguage() {
-    return "en-us";
-  },
-
-  async getDirection() {
-    return "ltr";
-  },
-
-  async get(property, args, fallback) {
-    return formatL10nValue(fallback, args);
-  },
-
-  async translate(element) {}
-
-};
-exports.NullL10n = NullL10n;
-
 function getOutputScale(ctx) {
   const devicePixelRatio = window.devicePixelRatio || 1;
-  const backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || 
ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
+  const backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || 
ctx.backingStorePixelRatio || 1;
   const pixelRatio = devicePixelRatio / backingStoreRatio;
   return {
     sx: pixelRatio,
@@ -3109,7 +3258,7 @@ function getOutputScale(ctx) {
   };
 }
 
-function scrollIntoView(element, spot, skipOverflowHiddenElements = false) {
+function scrollIntoView(element, spot, scrollMatches = false) {
   let parent = element.offsetParent;
 
   if (!parent) {
@@ -3120,12 +3269,7 @@ function scrollIntoView(element, spot, skipOverflowHiddenElements = false) {
   let offsetY = element.offsetTop + element.clientTop;
   let offsetX = element.offsetLeft + element.clientLeft;
 
-  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || 
skipOverflowHiddenElements && getComputedStyle(parent).overflow === "hidden") {
-    if (parent.dataset._scaleY) {
-      offsetY /= parent.dataset._scaleY;
-      offsetX /= parent.dataset._scaleX;
-    }
-
+  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || 
scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === 
"hidden")) {
     offsetY += parent.offsetTop;
     offsetX += parent.offsetLeft;
     parent = parent.offsetParent;
@@ -3323,7 +3467,13 @@ function backtrackBeforeAllVisibleElements(index, views, top) {
   return index;
 }
 
-function getVisibleElements(scrollEl, views, sortByVisibility = false, horizontal = false) {
+function getVisibleElements({
+  scrollEl,
+  views,
+  sortByVisibility = false,
+  horizontal = false,
+  rtl = false
+}) {
   const top = scrollEl.scrollTop,
         bottom = top + scrollEl.clientHeight;
   const left = scrollEl.scrollLeft,
@@ -3335,15 +3485,16 @@ function getVisibleElements(scrollEl, views, sortByVisibility = false, horizonta
     return elementBottom > top;
   }
 
-  function isElementRightAfterViewLeft(view) {
+  function isElementNextAfterViewHorizontally(view) {
     const element = view.div;
-    const elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;
-    return elementRight > left;
+    const elementLeft = element.offsetLeft + element.clientLeft;
+    const elementRight = elementLeft + element.clientWidth;
+    return rtl ? elementLeft < right : elementRight > left;
   }
 
   const visible = [],
         numViews = views.length;
-  let firstVisibleElementInd = numViews === 0 ? 0 : binarySearchFirstItem(views, horizontal ? 
isElementRightAfterViewLeft : isElementBottomAfterViewTop);
+  let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally 
: isElementBottomAfterViewTop);
 
   if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {
     firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
@@ -3375,13 +3526,16 @@ function getVisibleElements(scrollEl, views, sortByVisibility = false, horizonta
 
     const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);
     const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);
-    const percent = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 
0;
+    const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,
+          fractionWidth = (viewWidth - hiddenWidth) / viewWidth;
+    const percent = fractionHeight * fractionWidth * 100 | 0;
     visible.push({
       id: view.id,
       x: currentWidth,
       y: currentHeight,
       view,
-      percent
+      percent,
+      widthPercent: fractionWidth * 100 | 0
     });
   }
 
@@ -3411,47 +3565,8 @@ function noContextMenuHandler(evt) {
   evt.preventDefault();
 }
 
-function isDataSchema(url) {
-  let i = 0;
-  const ii = url.length;
-
-  while (i < ii && url[i].trim() === "") {
-    i++;
-  }
-
-  return url.substring(i, i + 5).toLowerCase() === "data:";
-}
-
-function getPDFFileNameFromURL(url, defaultFilename = "document.pdf") {
-  if (typeof url !== "string") {
-    return defaultFilename;
-  }
-
-  if (isDataSchema(url)) {
-    console.warn("getPDFFileNameFromURL: " + 'ignoring "data:" URL for performance reasons.');
-    return defaultFilename;
-  }
-
-  const reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
-  const reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
-  const splitURI = reURI.exec(url);
-  let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || 
reFilename.exec(splitURI[3]);
-
-  if (suggestedFilename) {
-    suggestedFilename = suggestedFilename[0];
-
-    if (suggestedFilename.includes("%")) {
-      try {
-        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];
-      } catch (ex) {}
-    }
-  }
-
-  return suggestedFilename || defaultFilename;
-}
-
 function normalizeWheelEventDirection(evt) {
-  let delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);
+  let delta = Math.hypot(evt.deltaX, evt.deltaY);
   const angle = Math.atan2(evt.deltaY, evt.deltaX);
 
   if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
@@ -3550,15 +3665,17 @@ class EventBus {
     this._listeners = Object.create(null);
   }
 
-  on(eventName, listener) {
+  on(eventName, listener, options = null) {
     this._on(eventName, listener, {
-      external: true
+      external: true,
+      once: options?.once
     });
   }
 
-  off(eventName, listener) {
+  off(eventName, listener, options = null) {
     this._off(eventName, listener, {
-      external: true
+      external: true,
+      once: options?.once
     });
   }
 
@@ -3571,40 +3688,41 @@ class EventBus {
 
     const args = Array.prototype.slice.call(arguments, 1);
     let externalListeners;
-    eventListeners.slice(0).forEach(function ({
+
+    for (const {
       listener,
-      external
-    }) {
-      if (external) {
-        if (!externalListeners) {
-          externalListeners = [];
-        }
+      external,
+      once
+    } of eventListeners.slice(0)) {
+      if (once) {
+        this._off(eventName, listener);
+      }
 
-        externalListeners.push(listener);
-        return;
+      if (external) {
+        (externalListeners || (externalListeners = [])).push(listener);
+        continue;
       }
 
       listener.apply(null, args);
-    });
+    }
 
     if (externalListeners) {
-      externalListeners.forEach(function (listener) {
+      for (const listener of externalListeners) {
         listener.apply(null, args);
-      });
+      }
+
       externalListeners = null;
     }
   }
 
   _on(eventName, listener, options = null) {
-    let eventListeners = this._listeners[eventName];
-
-    if (!eventListeners) {
-      this._listeners[eventName] = eventListeners = [];
-    }
+    var _this$_listeners;
 
+    const eventListeners = (_this$_listeners = this._listeners)[eventName] || (_this$_listeners[eventName] = 
[]);
     eventListeners.push({
       listener,
-      external: (options && options.external) === true
+      external: options?.external === true,
+      once: options?.once === true
     });
   }
 
@@ -3679,7 +3797,8 @@ class ProgressBar {
     const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
 
     if (scrollbarWidth > 0) {
-      this.bar.style.width = `calc(100% - ${scrollbarWidth}px)`;
+      const doc = document.documentElement;
+      doc.style.setProperty(LOADINGBAR_END_OFFSET_VAR, `${scrollbarWidth}px`);
     }
   }
 
@@ -3690,7 +3809,6 @@ class ProgressBar {
 
     this.visible = false;
     this.bar.classList.add("hidden");
-    document.body.classList.remove("loadingInProgress");
   }
 
   show() {
@@ -3699,7 +3817,6 @@ class ProgressBar {
     }
 
     this.visible = true;
-    document.body.classList.add("loadingInProgress");
     this.bar.classList.remove("hidden");
   }
 
@@ -3714,311 +3831,73 @@ function moveToEndOfArray(arr, condition) {
 
   for (let read = 0; read < len; ++read) {
     if (condition(arr[read])) {
-      moved.push(arr[read]);
-    } else {
-      arr[write] = arr[read];
-      ++write;
-    }
-  }
-
-  for (let read = 0; write < len; ++read, ++write) {
-    arr[write] = moved[read];
-  }
-}
-
-/***/ }),
-/* 3 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.OptionKind = exports.AppOptions = void 0;
-
-var _viewer_compatibility = __webpack_require__(4);
-
-const OptionKind = {
-  VIEWER: 0x02,
-  API: 0x04,
-  WORKER: 0x08,
-  PREFERENCE: 0x80
-};
-exports.OptionKind = OptionKind;
-const defaultOptions = {
-  cursorToolOnLoad: {
-    value: 0,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  defaultUrl: {
-    value: "compressed.tracemonkey-pldi-09.pdf",
-    kind: OptionKind.VIEWER
-  },
-  defaultZoomValue: {
-    value: "",
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  disableHistory: {
-    value: false,
-    kind: OptionKind.VIEWER
-  },
-  disablePageLabels: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  enablePermissions: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  enablePrintAutoRotate: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  enableWebGL: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  externalLinkRel: {
-    value: "noopener noreferrer nofollow",
-    kind: OptionKind.VIEWER
-  },
-  externalLinkTarget: {
-    value: 0,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  historyUpdateUrl: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  ignoreDestinationZoom: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  imageResourcesPath: {
-    value: "./images/",
-    kind: OptionKind.VIEWER
-  },
-  maxCanvasPixels: {
-    value: 16777216,
-    compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels,
-    kind: OptionKind.VIEWER
-  },
-  pdfBugEnabled: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  printResolution: {
-    value: 150,
-    kind: OptionKind.VIEWER
-  },
-  renderer: {
-    value: "canvas",
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  renderInteractiveForms: {
-    value: true,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  sidebarViewOnLoad: {
-    value: -1,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  scrollModeOnLoad: {
-    value: -1,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  spreadModeOnLoad: {
-    value: -1,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  textLayerMode: {
-    value: 1,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  useOnlyCssZoom: {
-    value: false,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  viewOnLoad: {
-    value: 0,
-    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
-  },
-  cMapPacked: {
-    value: true,
-    kind: OptionKind.API
-  },
-  cMapUrl: {
-    value: "../web/cmaps/",
-    kind: OptionKind.API
-  },
-  disableAutoFetch: {
-    value: false,
-    kind: OptionKind.API + OptionKind.PREFERENCE
-  },
-  disableFontFace: {
-    value: false,
-    kind: OptionKind.API + OptionKind.PREFERENCE
-  },
-  disableRange: {
-    value: false,
-    kind: OptionKind.API + OptionKind.PREFERENCE
-  },
-  disableStream: {
-    value: false,
-    kind: OptionKind.API + OptionKind.PREFERENCE
-  },
-  docBaseUrl: {
-    value: "",
-    kind: OptionKind.API
-  },
-  fontExtraProperties: {
-    value: false,
-    kind: OptionKind.API
-  },
-  isEvalSupported: {
-    value: true,
-    kind: OptionKind.API
-  },
-  maxImageSize: {
-    value: -1,
-    kind: OptionKind.API
-  },
-  pdfBug: {
-    value: false,
-    kind: OptionKind.API
-  },
-  verbosity: {
-    value: 1,
-    kind: OptionKind.API
-  },
-  workerPort: {
-    value: null,
-    kind: OptionKind.WORKER
-  },
-  workerSrc: {
-    value: "../build/pdf.worker.js",
-    kind: OptionKind.WORKER
-  }
-};
-{
-  defaultOptions.disablePreferences = {
-    value: false,
-    kind: OptionKind.VIEWER
-  };
-  defaultOptions.locale = {
-    value: typeof navigator !== "undefined" ? navigator.language : "en-US",
-    kind: OptionKind.VIEWER
-  };
-}
-const userOptions = Object.create(null);
-
-class AppOptions {
-  constructor() {
-    throw new Error("Cannot initialize AppOptions.");
-  }
-
-  static get(name) {
-    const userOption = userOptions[name];
-
-    if (userOption !== undefined) {
-      return userOption;
-    }
-
-    const defaultOption = defaultOptions[name];
-
-    if (defaultOption !== undefined) {
-      return defaultOption.compatibility || defaultOption.value;
-    }
-
-    return undefined;
-  }
-
-  static getAll(kind = null) {
-    const options = Object.create(null);
-
-    for (const name in defaultOptions) {
-      const defaultOption = defaultOptions[name];
-
-      if (kind) {
-        if ((kind & defaultOption.kind) === 0) {
-          continue;
-        }
-
-        if (kind === OptionKind.PREFERENCE) {
-          const value = defaultOption.value,
-                valueType = typeof value;
-
-          if (valueType === "boolean" || valueType === "string" || valueType === "number" && 
Number.isInteger(value)) {
-            options[name] = value;
-            continue;
-          }
-
-          throw new Error(`Invalid type for preference: ${name}`);
-        }
-      }
-
-      const userOption = userOptions[name];
-      options[name] = userOption !== undefined ? userOption : defaultOption.compatibility || 
defaultOption.value;
+      moved.push(arr[read]);
+    } else {
+      arr[write] = arr[read];
+      ++write;
     }
-
-    return options;
   }
 
-  static set(name, value) {
-    userOptions[name] = value;
+  for (let read = 0; write < len; ++read, ++write) {
+    arr[write] = moved[read];
   }
+}
 
-  static remove(name) {
-    delete userOptions[name];
+function getActiveOrFocusedElement() {
+  let curRoot = document;
+  let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
+
+  while (curActiveOrFocused?.shadowRoot) {
+    curRoot = curActiveOrFocused.shadowRoot;
+    curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
   }
 
+  return curActiveOrFocused;
 }
 
-exports.AppOptions = AppOptions;
+function apiPageLayoutToSpreadMode(layout) {
+  switch (layout) {
+    case "SinglePage":
+    case "OneColumn":
+      return SpreadMode.NONE;
 
-/***/ }),
-/* 4 */
-/***/ (function(module, exports, __webpack_require__) {
+    case "TwoColumnLeft":
+    case "TwoPageLeft":
+      return SpreadMode.ODD;
 
-"use strict";
+    case "TwoColumnRight":
+    case "TwoPageRight":
+      return SpreadMode.EVEN;
+  }
 
+  return SpreadMode.NONE;
+}
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.viewerCompatibilityParams = void 0;
-const compatibilityParams = Object.create(null);
-{
-  const userAgent = typeof navigator !== "undefined" && navigator.userAgent || "";
-  const platform = typeof navigator !== "undefined" && navigator.platform || "";
-  const maxTouchPoints = typeof navigator !== "undefined" && navigator.maxTouchPoints || 1;
-  const isAndroid = /Android/.test(userAgent);
-  const isIE = /Trident/.test(userAgent);
-  const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1;
-  const isIOSChrome = /CriOS/.test(userAgent);
+function apiPageModeToSidebarView(mode) {
+  switch (mode) {
+    case "UseNone":
+      return SidebarView.NONE;
 
-  (function checkOnBlobSupport() {
-    if (isIE || isIOSChrome) {
-      compatibilityParams.disableCreateObjectURL = true;
-    }
-  })();
+    case "UseThumbs":
+      return SidebarView.THUMBS;
 
-  (function checkCanvasSizeLimitation() {
-    if (isIOS || isAndroid) {
-      compatibilityParams.maxCanvasPixels = 5242880;
-    }
-  })();
+    case "UseOutlines":
+      return SidebarView.OUTLINE;
+
+    case "UseAttachments":
+      return SidebarView.ATTACHMENTS;
+
+    case "UseOC":
+      return SidebarView.LAYERS;
+  }
+
+  return SidebarView.NONE;
 }
-const viewerCompatibilityParams = Object.freeze(compatibilityParams);
-exports.viewerCompatibilityParams = viewerCompatibilityParams;
 
 /***/ }),
 /* 5 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ ((module) => {
 
-"use strict";
 
 
 let pdfjsLib;
@@ -4033,18 +3912,19 @@ module.exports = pdfjsLib;
 
 /***/ }),
 /* 6 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFCursorTools = exports.CursorTool = void 0;
 
 var _grab_to_pan = __webpack_require__(7);
 
+var _ui_utils = __webpack_require__(4);
+
 const CursorTool = {
   SELECT: 0,
   HAND: 1,
@@ -4133,20 +4013,22 @@ class PDFCursorTools {
     });
 
     this.eventBus._on("presentationmodechanged", evt => {
-      if (evt.switchInProgress) {
-        return;
-      }
-
-      let previouslyActive;
+      switch (evt.state) {
+        case _ui_utils.PresentationModeState.FULLSCREEN:
+          {
+            const previouslyActive = this.active;
+            this.switchTool(CursorTool.SELECT);
+            this.activeBeforePresentationMode = previouslyActive;
+            break;
+          }
 
-      if (evt.active) {
-        previouslyActive = this.active;
-        this.switchTool(CursorTool.SELECT);
-        this.activeBeforePresentationMode = previouslyActive;
-      } else {
-        previouslyActive = this.activeBeforePresentationMode;
-        this.activeBeforePresentationMode = null;
-        this.switchTool(previouslyActive);
+        case _ui_utils.PresentationModeState.NORMAL:
+          {
+            const previouslyActive = this.activeBeforePresentationMode;
+            this.activeBeforePresentationMode = null;
+            this.switchTool(previouslyActive);
+            break;
+          }
       }
     });
   }
@@ -4157,14 +4039,13 @@ exports.PDFCursorTools = PDFCursorTools;
 
 /***/ }),
 /* 7 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.GrabToPan = GrabToPan;
 
 function GrabToPan(options) {
@@ -4221,7 +4102,7 @@ GrabToPan.prototype = {
     }
   },
   ignoreTarget: function GrabToPan_ignoreTarget(node) {
-    return node[matchesSelector]("a[href], a[href] *, input, textarea, button, button *, select, option");
+    return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option");
   },
   _onmousedown: function GrabToPan__onmousedown(event) {
     if (event.button !== 0 || this.ignoreTarget(event.target)) {
@@ -4287,32 +4168,16 @@ GrabToPan.prototype = {
     this.overlay.remove();
   }
 };
-let matchesSelector;
-["webkitM", "mozM", "msM", "oM", "m"].some(function (prefix) {
-  let name = prefix + "atches";
-
-  if (name in document.documentElement) {
-    matchesSelector = name;
-  }
-
-  name += "Selector";
-
-  if (name in document.documentElement) {
-    matchesSelector = name;
-  }
-
-  return matchesSelector;
-});
-const isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
-const chrome = window.chrome;
-const isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
-const isSafari6plus = /Apple/.test(navigator.vendor) && 
/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
 
 function isLeftMouseReleased(event) {
-  if ("buttons" in event && isNotIEorIsIE10plus) {
+  if ("buttons" in event) {
     return !(event.buttons & 1);
   }
 
+  const chrome = window.chrome;
+  const isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
+  const isSafari6plus = /Apple/.test(navigator.vendor) && 
/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
+
   if (isChrome15OrOpera15plus || isSafari6plus) {
     return event.which === 0;
   }
@@ -4322,15 +4187,17 @@ function isLeftMouseReleased(event) {
 
 /***/ }),
 /* 8 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFRenderingQueue = exports.RenderingStates = void 0;
+}));
+exports.RenderingStates = exports.PDFRenderingQueue = void 0;
+
+var _pdfjsLib = __webpack_require__(5);
+
 const CLEANUP_TIMEOUT = 30000;
 const RenderingStates = {
   INITIAL: 0,
@@ -4396,2900 +4263,3252 @@ class PDFRenderingQueue {
       return null;
     }
 
-    for (let i = 0; i < numVisible; ++i) {
-      const view = visibleViews[i].view;
+    for (let i = 0; i < numVisible; ++i) {
+      const view = visibleViews[i].view;
+
+      if (!this.isViewFinished(view)) {
+        return view;
+      }
+    }
+
+    if (scrolledDown) {
+      const nextPageIndex = visible.last.id;
+
+      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
+        return views[nextPageIndex];
+      }
+    } else {
+      const previousPageIndex = visible.first.id - 2;
+
+      if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {
+        return views[previousPageIndex];
+      }
+    }
+
+    return null;
+  }
+
+  isViewFinished(view) {
+    return view.renderingState === RenderingStates.FINISHED;
+  }
+
+  renderView(view) {
+    switch (view.renderingState) {
+      case RenderingStates.FINISHED:
+        return false;
+
+      case RenderingStates.PAUSED:
+        this.highestPriorityPage = view.renderingId;
+        view.resume();
+        break;
+
+      case RenderingStates.RUNNING:
+        this.highestPriorityPage = view.renderingId;
+        break;
+
+      case RenderingStates.INITIAL:
+        this.highestPriorityPage = view.renderingId;
+        view.draw().finally(() => {
+          this.renderHighestPriority();
+        }).catch(reason => {
+          if (reason instanceof _pdfjsLib.RenderingCancelledException) {
+            return;
+          }
+
+          console.error(`renderView: "${reason}"`);
+        });
+        break;
+    }
+
+    return true;
+  }
+
+}
+
+exports.PDFRenderingQueue = PDFRenderingQueue;
+
+/***/ }),
+/* 9 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.OverlayManager = void 0;
+
+class OverlayManager {
+  constructor() {
+    this._overlays = {};
+    this._active = null;
+    this._keyDownBound = this._keyDown.bind(this);
+  }
+
+  get active() {
+    return this._active;
+  }
+
+  async register(name, element, callerCloseMethod = null, canForceClose = false) {
+    let container;
+
+    if (!name || !element || !(container = element.parentNode)) {
+      throw new Error("Not enough parameters.");
+    } else if (this._overlays[name]) {
+      throw new Error("The overlay is already registered.");
+    }
+
+    this._overlays[name] = {
+      element,
+      container,
+      callerCloseMethod,
+      canForceClose
+    };
+  }
+
+  async unregister(name) {
+    if (!this._overlays[name]) {
+      throw new Error("The overlay does not exist.");
+    } else if (this._active === name) {
+      throw new Error("The overlay cannot be removed while it is active.");
+    }
+
+    delete this._overlays[name];
+  }
+
+  async open(name) {
+    if (!this._overlays[name]) {
+      throw new Error("The overlay does not exist.");
+    } else if (this._active) {
+      if (this._overlays[name].canForceClose) {
+        this._closeThroughCaller();
+      } else if (this._active === name) {
+        throw new Error("The overlay is already active.");
+      } else {
+        throw new Error("Another overlay is currently active.");
+      }
+    }
+
+    this._active = name;
+
+    this._overlays[this._active].element.classList.remove("hidden");
+
+    this._overlays[this._active].container.classList.remove("hidden");
+
+    window.addEventListener("keydown", this._keyDownBound);
+  }
+
+  async close(name) {
+    if (!this._overlays[name]) {
+      throw new Error("The overlay does not exist.");
+    } else if (!this._active) {
+      throw new Error("The overlay is currently not active.");
+    } else if (this._active !== name) {
+      throw new Error("Another overlay is currently active.");
+    }
+
+    this._overlays[this._active].container.classList.add("hidden");
+
+    this._overlays[this._active].element.classList.add("hidden");
+
+    this._active = null;
+    window.removeEventListener("keydown", this._keyDownBound);
+  }
+
+  _keyDown(evt) {
+    if (this._active && evt.keyCode === 27) {
+      this._closeThroughCaller();
+
+      evt.preventDefault();
+    }
+  }
+
+  _closeThroughCaller() {
+    if (this._overlays[this._active].callerCloseMethod) {
+      this._overlays[this._active].callerCloseMethod();
+    }
+
+    if (this._active) {
+      this.close(this._active);
+    }
+  }
+
+}
+
+exports.OverlayManager = OverlayManager;
+
+/***/ }),
+/* 10 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
 
-      if (!this.isViewFinished(view)) {
-        return view;
-      }
-    }
 
-    if (scrolledDown) {
-      const nextPageIndex = visible.last.id;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PasswordPrompt = void 0;
 
-      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
-        return views[nextPageIndex];
-      }
-    } else {
-      const previousPageIndex = visible.first.id - 2;
+var _pdfjsLib = __webpack_require__(5);
 
-      if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {
-        return views[previousPageIndex];
+class PasswordPrompt {
+  constructor(options, overlayManager, l10n, isViewerEmbedded = false) {
+    this.overlayName = options.overlayName;
+    this.container = options.container;
+    this.label = options.label;
+    this.input = options.input;
+    this.submitButton = options.submitButton;
+    this.cancelButton = options.cancelButton;
+    this.overlayManager = overlayManager;
+    this.l10n = l10n;
+    this._isViewerEmbedded = isViewerEmbedded;
+    this.updateCallback = null;
+    this.reason = null;
+    this.submitButton.addEventListener("click", this.verify.bind(this));
+    this.cancelButton.addEventListener("click", this.close.bind(this));
+    this.input.addEventListener("keydown", e => {
+      if (e.keyCode === 13) {
+        this.verify();
       }
+    });
+    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);
+  }
+
+  async open() {
+    await this.overlayManager.open(this.overlayName);
+    const passwordIncorrect = this.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD;
+
+    if (!this._isViewerEmbedded || passwordIncorrect) {
+      this.input.focus();
     }
 
-    return null;
+    this.label.textContent = await this.l10n.get(`password_${passwordIncorrect ? "invalid" : "label"}`);
   }
 
-  isViewFinished(view) {
-    return view.renderingState === RenderingStates.FINISHED;
+  close() {
+    this.overlayManager.close(this.overlayName).then(() => {
+      this.input.value = "";
+    });
   }
 
-  renderView(view) {
-    switch (view.renderingState) {
-      case RenderingStates.FINISHED:
-        return false;
-
-      case RenderingStates.PAUSED:
-        this.highestPriorityPage = view.renderingId;
-        view.resume();
-        break;
-
-      case RenderingStates.RUNNING:
-        this.highestPriorityPage = view.renderingId;
-        break;
+  verify() {
+    const password = this.input.value;
 
-      case RenderingStates.INITIAL:
-        this.highestPriorityPage = view.renderingId;
-        view.draw().finally(() => {
-          this.renderHighestPriority();
-        }).catch(reason => {
-          console.error(`renderView: "${reason}"`);
-        });
-        break;
+    if (password?.length > 0) {
+      this.close();
+      this.updateCallback(password);
     }
+  }
 
-    return true;
+  setUpdateCallback(updateCallback, reason) {
+    this.updateCallback = updateCallback;
+    this.reason = reason;
   }
 
 }
 
-exports.PDFRenderingQueue = PDFRenderingQueue;
+exports.PasswordPrompt = PasswordPrompt;
 
 /***/ }),
-/* 9 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 11 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFSidebar = exports.SidebarView = void 0;
-
-var _ui_utils = __webpack_require__(2);
+}));
+exports.PDFAttachmentViewer = void 0;
 
-var _pdf_rendering_queue = __webpack_require__(8);
+var _pdfjsLib = __webpack_require__(5);
 
-const UI_NOTIFICATION_CLASS = "pdfSidebarNotification";
-const SidebarView = {
-  UNKNOWN: -1,
-  NONE: 0,
-  THUMBS: 1,
-  OUTLINE: 2,
-  ATTACHMENTS: 3,
-  LAYERS: 4
-};
-exports.SidebarView = SidebarView;
+var _base_tree_viewer = __webpack_require__(12);
 
-class PDFSidebar {
-  constructor({
-    elements,
-    pdfViewer,
-    pdfThumbnailViewer,
-    eventBus,
-    l10n = _ui_utils.NullL10n,
-    disableNotification = false
-  }) {
-    this.isOpen = false;
-    this.active = SidebarView.THUMBS;
-    this.isInitialViewSet = false;
-    this.onToggled = null;
-    this.pdfViewer = pdfViewer;
-    this.pdfThumbnailViewer = pdfThumbnailViewer;
-    this.outerContainer = elements.outerContainer;
-    this.viewerContainer = elements.viewerContainer;
-    this.toggleButton = elements.toggleButton;
-    this.thumbnailButton = elements.thumbnailButton;
-    this.outlineButton = elements.outlineButton;
-    this.attachmentsButton = elements.attachmentsButton;
-    this.layersButton = elements.layersButton;
-    this.thumbnailView = elements.thumbnailView;
-    this.outlineView = elements.outlineView;
-    this.attachmentsView = elements.attachmentsView;
-    this.layersView = elements.layersView;
-    this.eventBus = eventBus;
-    this.l10n = l10n;
-    this._disableNotification = disableNotification;
+class PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer {
+  constructor(options) {
+    super(options);
+    this.downloadManager = options.downloadManager;
 
-    this._addEventListeners();
+    this.eventBus._on("fileattachmentannotation", this._appendAttachment.bind(this));
   }
 
-  reset() {
-    this.isInitialViewSet = false;
+  reset(keepRenderedCapability = false) {
+    super.reset();
+    this._attachments = null;
 
-    this._hideUINotification(null);
+    if (!keepRenderedCapability) {
+      this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();
+    }
 
-    this.switchView(SidebarView.THUMBS);
-    this.outlineButton.disabled = false;
-    this.attachmentsButton.disabled = false;
-    this.layersButton.disabled = false;
-  }
+    if (this._pendingDispatchEvent) {
+      clearTimeout(this._pendingDispatchEvent);
+    }
 
-  get visibleView() {
-    return this.isOpen ? this.active : SidebarView.NONE;
+    this._pendingDispatchEvent = null;
   }
 
-  get isThumbnailViewVisible() {
-    return this.isOpen && this.active === SidebarView.THUMBS;
-  }
+  _dispatchEvent(attachmentsCount) {
+    this._renderedCapability.resolve();
 
-  get isOutlineViewVisible() {
-    return this.isOpen && this.active === SidebarView.OUTLINE;
-  }
+    if (this._pendingDispatchEvent) {
+      clearTimeout(this._pendingDispatchEvent);
+      this._pendingDispatchEvent = null;
+    }
 
-  get isAttachmentsViewVisible() {
-    return this.isOpen && this.active === SidebarView.ATTACHMENTS;
+    if (attachmentsCount === 0) {
+      this._pendingDispatchEvent = setTimeout(() => {
+        this.eventBus.dispatch("attachmentsloaded", {
+          source: this,
+          attachmentsCount: 0
+        });
+        this._pendingDispatchEvent = null;
+      });
+      return;
+    }
+
+    this.eventBus.dispatch("attachmentsloaded", {
+      source: this,
+      attachmentsCount
+    });
   }
 
-  get isLayersViewVisible() {
-    return this.isOpen && this.active === SidebarView.LAYERS;
+  _bindLink(element, {
+    content,
+    filename
+  }) {
+    element.onclick = () => {
+      this.downloadManager.openOrDownloadData(element, content, filename);
+      return false;
+    };
   }
 
-  setInitialView(view = SidebarView.NONE) {
-    if (this.isInitialViewSet) {
-      return;
+  render({
+    attachments,
+    keepRenderedCapability = false
+  }) {
+    if (this._attachments) {
+      this.reset(keepRenderedCapability);
     }
 
-    this.isInitialViewSet = true;
+    this._attachments = attachments || null;
 
-    if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) {
-      this._dispatchEvent();
+    if (!attachments) {
+      this._dispatchEvent(0);
 
       return;
     }
 
-    if (!this._switchView(view, true)) {
-      this._dispatchEvent();
-    }
-  }
-
-  switchView(view, forceOpen = false) {
-    this._switchView(view, forceOpen);
-  }
-
-  _switchView(view, forceOpen = false) {
-    const isViewChanged = view !== this.active;
-    let shouldForceRendering = false;
-
-    switch (view) {
-      case SidebarView.NONE:
-        if (this.isOpen) {
-          this.close();
-          return true;
-        }
-
-        return false;
+    const names = Object.keys(attachments).sort(function (a, b) {
+      return a.toLowerCase().localeCompare(b.toLowerCase());
+    });
+    const fragment = document.createDocumentFragment();
+    let attachmentsCount = 0;
 
-      case SidebarView.THUMBS:
-        if (this.isOpen && isViewChanged) {
-          shouldForceRendering = true;
-        }
+    for (const name of names) {
+      const item = attachments[name];
+      const content = item.content,
+            filename = (0, _pdfjsLib.getFilenameFromUrl)(item.filename);
+      const div = document.createElement("div");
+      div.className = "treeItem";
+      const element = document.createElement("a");
 
-        break;
+      this._bindLink(element, {
+        content,
+        filename
+      });
 
-      case SidebarView.OUTLINE:
-        if (this.outlineButton.disabled) {
-          return false;
-        }
+      element.textContent = this._normalizeTextContent(filename);
+      div.appendChild(element);
+      fragment.appendChild(div);
+      attachmentsCount++;
+    }
 
-        break;
+    this._finishRendering(fragment, attachmentsCount);
+  }
 
-      case SidebarView.ATTACHMENTS:
-        if (this.attachmentsButton.disabled) {
-          return false;
-        }
+  _appendAttachment({
+    id,
+    filename,
+    content
+  }) {
+    const renderedPromise = this._renderedCapability.promise;
+    renderedPromise.then(() => {
+      if (renderedPromise !== this._renderedCapability.promise) {
+        return;
+      }
 
-        break;
+      let attachments = this._attachments;
 
-      case SidebarView.LAYERS:
-        if (this.layersButton.disabled) {
-          return false;
+      if (!attachments) {
+        attachments = Object.create(null);
+      } else {
+        for (const name in attachments) {
+          if (id === name) {
+            return;
+          }
         }
+      }
 
-        break;
+      attachments[id] = {
+        filename,
+        content
+      };
+      this.render({
+        attachments,
+        keepRenderedCapability: true
+      });
+    });
+  }
 
-      default:
-        console.error(`PDFSidebar._switchView: "${view}" is not a valid view.`);
-        return false;
-    }
+}
 
-    this.active = view;
-    this.thumbnailButton.classList.toggle("toggled", view === SidebarView.THUMBS);
-    this.outlineButton.classList.toggle("toggled", view === SidebarView.OUTLINE);
-    this.attachmentsButton.classList.toggle("toggled", view === SidebarView.ATTACHMENTS);
-    this.layersButton.classList.toggle("toggled", view === SidebarView.LAYERS);
-    this.thumbnailView.classList.toggle("hidden", view !== SidebarView.THUMBS);
-    this.outlineView.classList.toggle("hidden", view !== SidebarView.OUTLINE);
-    this.attachmentsView.classList.toggle("hidden", view !== SidebarView.ATTACHMENTS);
-    this.layersView.classList.toggle("hidden", view !== SidebarView.LAYERS);
+exports.PDFAttachmentViewer = PDFAttachmentViewer;
 
-    if (forceOpen && !this.isOpen) {
-      this.open();
-      return true;
-    }
+/***/ }),
+/* 12 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-    if (shouldForceRendering) {
-      this._updateThumbnailViewer();
 
-      this._forceRendering();
-    }
 
-    if (isViewChanged) {
-      this._dispatchEvent();
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.BaseTreeViewer = void 0;
 
-    this._hideUINotification(this.active);
+var _pdfjsLib = __webpack_require__(5);
 
-    return isViewChanged;
-  }
+const TREEITEM_OFFSET_TOP = -100;
+const TREEITEM_SELECTED_CLASS = "selected";
 
-  open() {
-    if (this.isOpen) {
-      return;
+class BaseTreeViewer {
+  constructor(options) {
+    if (this.constructor === BaseTreeViewer) {
+      throw new Error("Cannot initialize BaseTreeViewer.");
     }
 
-    this.isOpen = true;
-    this.toggleButton.classList.add("toggled");
-    this.outerContainer.classList.add("sidebarMoving", "sidebarOpen");
+    this.container = options.container;
+    this.eventBus = options.eventBus;
+    this.reset();
+  }
 
-    if (this.active === SidebarView.THUMBS) {
-      this._updateThumbnailViewer();
-    }
+  reset() {
+    this._pdfDocument = null;
+    this._lastToggleIsShow = true;
+    this._currentTreeItem = null;
+    this.container.textContent = "";
+    this.container.classList.remove("treeWithDeepNesting");
+  }
 
-    this._forceRendering();
+  _dispatchEvent(count) {
+    throw new Error("Not implemented: _dispatchEvent");
+  }
 
-    this._dispatchEvent();
+  _bindLink(element, params) {
+    throw new Error("Not implemented: _bindLink");
+  }
 
-    this._hideUINotification(this.active);
+  _normalizeTextContent(str) {
+    return (0, _pdfjsLib.removeNullCharacters)(str) || "\u2013";
   }
 
-  close() {
-    if (!this.isOpen) {
-      return;
+  _addToggleButton(div, hidden = false) {
+    const toggler = document.createElement("div");
+    toggler.className = "treeItemToggler";
+
+    if (hidden) {
+      toggler.classList.add("treeItemsHidden");
     }
 
-    this.isOpen = false;
-    this.toggleButton.classList.remove("toggled");
-    this.outerContainer.classList.add("sidebarMoving");
-    this.outerContainer.classList.remove("sidebarOpen");
+    toggler.onclick = evt => {
+      evt.stopPropagation();
+      toggler.classList.toggle("treeItemsHidden");
 
-    this._forceRendering();
+      if (evt.shiftKey) {
+        const shouldShowAll = !toggler.classList.contains("treeItemsHidden");
 
-    this._dispatchEvent();
-  }
+        this._toggleTreeItem(div, shouldShowAll);
+      }
+    };
 
-  toggle() {
-    if (this.isOpen) {
-      this.close();
-    } else {
-      this.open();
-    }
+    div.insertBefore(toggler, div.firstChild);
   }
 
-  _dispatchEvent() {
-    this.eventBus.dispatch("sidebarviewchanged", {
-      source: this,
-      view: this.visibleView
-    });
-  }
+  _toggleTreeItem(root, show = false) {
+    this._lastToggleIsShow = show;
 
-  _forceRendering() {
-    if (this.onToggled) {
-      this.onToggled();
-    } else {
-      this.pdfViewer.forceRendering();
-      this.pdfThumbnailViewer.forceRendering();
+    for (const toggler of root.querySelectorAll(".treeItemToggler")) {
+      toggler.classList.toggle("treeItemsHidden", !show);
     }
   }
 
-  _updateThumbnailViewer() {
-    const {
-      pdfViewer,
-      pdfThumbnailViewer
-    } = this;
-    const pagesCount = pdfViewer.pagesCount;
-
-    for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
-      const pageView = pdfViewer.getPageView(pageIndex);
+  _toggleAllTreeItems() {
+    this._toggleTreeItem(this.container, !this._lastToggleIsShow);
+  }
 
-      if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
-        const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);
-        thumbnailView.setImage(pageView);
-      }
+  _finishRendering(fragment, count, hasAnyNesting = false) {
+    if (hasAnyNesting) {
+      this.container.classList.add("treeWithDeepNesting");
+      this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden");
     }
 
-    pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
+    this.container.appendChild(fragment);
+
+    this._dispatchEvent(count);
   }
 
-  _showUINotification(view) {
-    if (this._disableNotification) {
-      return;
-    }
+  render(params) {
+    throw new Error("Not implemented: render");
+  }
 
-    this.l10n.get("toggle_sidebar_notification2.title", null, "Toggle Sidebar (document contains 
outline/attachments/layers)").then(msg => {
-      this.toggleButton.title = msg;
-    });
+  _updateCurrentTreeItem(treeItem = null) {
+    if (this._currentTreeItem) {
+      this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);
 
-    if (!this.isOpen) {
-      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
-    } else if (view === this.active) {
-      return;
+      this._currentTreeItem = null;
     }
 
-    switch (view) {
-      case SidebarView.OUTLINE:
-        this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);
-        break;
-
-      case SidebarView.ATTACHMENTS:
-        this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);
-        break;
-
-      case SidebarView.LAYERS:
-        this.layersButton.classList.add(UI_NOTIFICATION_CLASS);
-        break;
+    if (treeItem) {
+      treeItem.classList.add(TREEITEM_SELECTED_CLASS);
+      this._currentTreeItem = treeItem;
     }
   }
 
-  _hideUINotification(view) {
-    if (this._disableNotification) {
+  _scrollToCurrentTreeItem(treeItem) {
+    if (!treeItem) {
       return;
     }
 
-    const removeNotification = sidebarView => {
-      switch (sidebarView) {
-        case SidebarView.OUTLINE:
-          this.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);
-          break;
-
-        case SidebarView.ATTACHMENTS:
-          this.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);
-          break;
+    let currentNode = treeItem.parentNode;
 
-        case SidebarView.LAYERS:
-          this.layersButton.classList.remove(UI_NOTIFICATION_CLASS);
-          break;
+    while (currentNode && currentNode !== this.container) {
+      if (currentNode.classList.contains("treeItem")) {
+        const toggler = currentNode.firstElementChild;
+        toggler?.classList.remove("treeItemsHidden");
       }
-    };
-
-    if (!this.isOpen && view !== null) {
-      return;
-    }
 
-    this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
-
-    if (view !== null) {
-      removeNotification(view);
-      return;
+      currentNode = currentNode.parentNode;
     }
 
-    for (view in SidebarView) {
-      removeNotification(SidebarView[view]);
-    }
+    this._updateCurrentTreeItem(treeItem);
 
-    this.l10n.get("toggle_sidebar.title", null, "Toggle Sidebar").then(msg => {
-      this.toggleButton.title = msg;
-    });
+    this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP);
   }
 
-  _addEventListeners() {
-    this.viewerContainer.addEventListener("transitionend", evt => {
-      if (evt.target === this.viewerContainer) {
-        this.outerContainer.classList.remove("sidebarMoving");
-      }
-    });
-    this.toggleButton.addEventListener("click", () => {
-      this.toggle();
-    });
-    this.thumbnailButton.addEventListener("click", () => {
-      this.switchView(SidebarView.THUMBS);
-    });
-    this.outlineButton.addEventListener("click", () => {
-      this.switchView(SidebarView.OUTLINE);
-    });
-    this.outlineButton.addEventListener("dblclick", () => {
-      this.eventBus.dispatch("toggleoutlinetree", {
-        source: this
-      });
-    });
-    this.attachmentsButton.addEventListener("click", () => {
-      this.switchView(SidebarView.ATTACHMENTS);
-    });
-    this.layersButton.addEventListener("click", () => {
-      this.switchView(SidebarView.LAYERS);
-    });
-    this.layersButton.addEventListener("dblclick", () => {
-      this.eventBus.dispatch("resetlayers", {
-        source: this
-      });
-    });
+}
 
-    const onTreeLoaded = (count, button, view) => {
-      button.disabled = !count;
+exports.BaseTreeViewer = BaseTreeViewer;
 
-      if (count) {
-        this._showUINotification(view);
-      } else if (this.active === view) {
-        this.switchView(SidebarView.THUMBS);
-      }
-    };
+/***/ }),
+/* 13 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-    this.eventBus._on("outlineloaded", evt => {
-      onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE);
-    });
 
-    this.eventBus._on("attachmentsloaded", evt => {
-      onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS);
-    });
 
-    this.eventBus._on("layersloaded", evt => {
-      onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS);
-    });
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PDFDocumentProperties = void 0;
 
-    this.eventBus._on("presentationmodechanged", evt => {
-      if (!evt.active && !evt.switchInProgress && this.isThumbnailViewVisible) {
-        this._updateThumbnailViewer();
-      }
-    });
-  }
+var _pdfjsLib = __webpack_require__(5);
 
-}
+var _ui_utils = __webpack_require__(4);
 
-exports.PDFSidebar = PDFSidebar;
+const DEFAULT_FIELD_CONTENT = "-";
+const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"];
+const US_PAGE_NAMES = {
+  "8.5x11": "Letter",
+  "8.5x14": "Legal"
+};
+const METRIC_PAGE_NAMES = {
+  "297x420": "A3",
+  "210x297": "A4"
+};
 
-/***/ }),
-/* 10 */
-/***/ (function(module, exports, __webpack_require__) {
+function getPageName(size, isPortrait, pageNames) {
+  const width = isPortrait ? size.width : size.height;
+  const height = isPortrait ? size.height : size.width;
+  return pageNames[`${width}x${height}`];
+}
 
-"use strict";
+class PDFDocumentProperties {
+  constructor({
+    overlayName,
+    fields,
+    container,
+    closeButton
+  }, overlayManager, eventBus, l10n) {
+    this.overlayName = overlayName;
+    this.fields = fields;
+    this.container = container;
+    this.overlayManager = overlayManager;
+    this.l10n = l10n;
 
+    this._reset();
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.OverlayManager = void 0;
+    closeButton.addEventListener("click", this.close.bind(this));
+    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));
 
-class OverlayManager {
-  constructor() {
-    this._overlays = {};
-    this._active = null;
-    this._keyDownBound = this._keyDown.bind(this);
-  }
+    eventBus._on("pagechanging", evt => {
+      this._currentPageNumber = evt.pageNumber;
+    });
 
-  get active() {
-    return this._active;
+    eventBus._on("rotationchanging", evt => {
+      this._pagesRotation = evt.pagesRotation;
+    });
+
+    this._isNonMetricLocale = true;
+    l10n.getLanguage().then(locale => {
+      this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);
+    });
   }
 
-  async register(name, element, callerCloseMethod = null, canForceClose = false) {
-    let container;
+  async open() {
+    const freezeFieldData = data => {
+      Object.defineProperty(this, "fieldData", {
+        value: Object.freeze(data),
+        writable: false,
+        enumerable: true,
+        configurable: true
+      });
+    };
 
-    if (!name || !element || !(container = element.parentNode)) {
-      throw new Error("Not enough parameters.");
-    } else if (this._overlays[name]) {
-      throw new Error("The overlay is already registered.");
-    }
+    await Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]);
+    const currentPageNumber = this._currentPageNumber;
+    const pagesRotation = this._pagesRotation;
 
-    this._overlays[name] = {
-      element,
-      container,
-      callerCloseMethod,
-      canForceClose
-    };
-  }
+    if (this.fieldData && currentPageNumber === this.fieldData._currentPageNumber && pagesRotation === 
this.fieldData._pagesRotation) {
+      this._updateUI();
 
-  async unregister(name) {
-    if (!this._overlays[name]) {
-      throw new Error("The overlay does not exist.");
-    } else if (this._active === name) {
-      throw new Error("The overlay cannot be removed while it is active.");
+      return;
     }
 
-    delete this._overlays[name];
-  }
+    const {
+      info,
+      contentDispositionFilename,
+      contentLength
+    } = await this.pdfDocument.getMetadata();
+    const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await 
Promise.all([contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(this.url), 
this._parseFileSize(contentLength), this._parseDate(info.CreationDate), this._parseDate(info.ModDate), 
this.pdfDocument.getPage(currentPageNumber).then(pdfPage => {
+      return this._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);
+    }), this._parseLinearization(info.IsLinearized)]);
+    freezeFieldData({
+      fileName,
+      fileSize,
+      title: info.Title,
+      author: info.Author,
+      subject: info.Subject,
+      keywords: info.Keywords,
+      creationDate,
+      modificationDate,
+      creator: info.Creator,
+      producer: info.Producer,
+      version: info.PDFFormatVersion,
+      pageCount: this.pdfDocument.numPages,
+      pageSize,
+      linearized: isLinearized,
+      _currentPageNumber: currentPageNumber,
+      _pagesRotation: pagesRotation
+    });
+
+    this._updateUI();
 
-  async open(name) {
-    if (!this._overlays[name]) {
-      throw new Error("The overlay does not exist.");
-    } else if (this._active) {
-      if (this._overlays[name].canForceClose) {
-        this._closeThroughCaller();
-      } else if (this._active === name) {
-        throw new Error("The overlay is already active.");
-      } else {
-        throw new Error("Another overlay is currently active.");
-      }
-    }
+    const {
+      length
+    } = await this.pdfDocument.getDownloadInfo();
 
-    this._active = name;
+    if (contentLength === length) {
+      return;
+    }
 
-    this._overlays[this._active].element.classList.remove("hidden");
+    const data = Object.assign(Object.create(null), this.fieldData);
+    data.fileSize = await this._parseFileSize(length);
+    freezeFieldData(data);
 
-    this._overlays[this._active].container.classList.remove("hidden");
+    this._updateUI();
+  }
 
-    window.addEventListener("keydown", this._keyDownBound);
+  close() {
+    this.overlayManager.close(this.overlayName);
   }
 
-  async close(name) {
-    if (!this._overlays[name]) {
-      throw new Error("The overlay does not exist.");
-    } else if (!this._active) {
-      throw new Error("The overlay is currently not active.");
-    } else if (this._active !== name) {
-      throw new Error("Another overlay is currently active.");
+  setDocument(pdfDocument, url = null) {
+    if (this.pdfDocument) {
+      this._reset();
+
+      this._updateUI(true);
     }
 
-    this._overlays[this._active].container.classList.add("hidden");
+    if (!pdfDocument) {
+      return;
+    }
 
-    this._overlays[this._active].element.classList.add("hidden");
+    this.pdfDocument = pdfDocument;
+    this.url = url;
 
-    this._active = null;
-    window.removeEventListener("keydown", this._keyDownBound);
+    this._dataAvailableCapability.resolve();
   }
 
-  _keyDown(evt) {
-    if (this._active && evt.keyCode === 27) {
-      this._closeThroughCaller();
+  _reset() {
+    this.pdfDocument = null;
+    this.url = null;
+    delete this.fieldData;
+    this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();
+    this._currentPageNumber = 1;
+    this._pagesRotation = 0;
+  }
 
-      evt.preventDefault();
+  _updateUI(reset = false) {
+    if (reset || !this.fieldData) {
+      for (const id in this.fields) {
+        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;
+      }
+
+      return;
     }
-  }
 
-  _closeThroughCaller() {
-    if (this._overlays[this._active].callerCloseMethod) {
-      this._overlays[this._active].callerCloseMethod();
+    if (this.overlayManager.active !== this.overlayName) {
+      return;
     }
 
-    if (this._active) {
-      this.close(this._active);
+    for (const id in this.fields) {
+      const content = this.fieldData[id];
+      this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;
     }
   }
 
-}
-
-exports.OverlayManager = OverlayManager;
-
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
+  async _parseFileSize(fileSize = 0) {
+    const kb = fileSize / 1024,
+          mb = kb / 1024;
 
-"use strict";
+    if (!kb) {
+      return undefined;
+    }
 
+    return this.l10n.get(`document_properties_${mb >= 1 ? "mb" : "kb"}`, {
+      size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(),
+      size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(),
+      size_b: fileSize.toLocaleString()
+    });
+  }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PasswordPrompt = void 0;
+  async _parsePageSize(pageSizeInches, pagesRotation) {
+    if (!pageSizeInches) {
+      return undefined;
+    }
 
-var _ui_utils = __webpack_require__(2);
+    if (pagesRotation % 180 !== 0) {
+      pageSizeInches = {
+        width: pageSizeInches.height,
+        height: pageSizeInches.width
+      };
+    }
 
-var _pdfjsLib = __webpack_require__(5);
+    const isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);
+    let sizeInches = {
+      width: Math.round(pageSizeInches.width * 100) / 100,
+      height: Math.round(pageSizeInches.height * 100) / 100
+    };
+    let sizeMillimeters = {
+      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
+      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
+    };
+    let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, 
isPortrait, METRIC_PAGE_NAMES);
 
-class PasswordPrompt {
-  constructor(options, overlayManager, l10n = _ui_utils.NullL10n) {
-    this.overlayName = options.overlayName;
-    this.container = options.container;
-    this.label = options.label;
-    this.input = options.input;
-    this.submitButton = options.submitButton;
-    this.cancelButton = options.cancelButton;
-    this.overlayManager = overlayManager;
-    this.l10n = l10n;
-    this.updateCallback = null;
-    this.reason = null;
-    this.submitButton.addEventListener("click", this.verify.bind(this));
-    this.cancelButton.addEventListener("click", this.close.bind(this));
-    this.input.addEventListener("keydown", e => {
-      if (e.keyCode === 13) {
-        this.verify();
-      }
-    });
-    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);
-  }
+    if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
+      const exactMillimeters = {
+        width: pageSizeInches.width * 25.4,
+        height: pageSizeInches.height * 25.4
+      };
+      const intMillimeters = {
+        width: Math.round(sizeMillimeters.width),
+        height: Math.round(sizeMillimeters.height)
+      };
 
-  open() {
-    this.overlayManager.open(this.overlayName).then(() => {
-      this.input.focus();
-      let promptString;
+      if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height 
- intMillimeters.height) < 0.1) {
+        rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
 
-      if (this.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
-        promptString = this.l10n.get("password_invalid", null, "Invalid password. Please try again.");
-      } else {
-        promptString = this.l10n.get("password_label", null, "Enter the password to open this PDF file.");
+        if (rawName) {
+          sizeInches = {
+            width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
+            height: Math.round(intMillimeters.height / 25.4 * 100) / 100
+          };
+          sizeMillimeters = intMillimeters;
+        }
       }
+    }
 
-      promptString.then(msg => {
-        this.label.textContent = msg;
-      });
-    });
-  }
-
-  close() {
-    this.overlayManager.close(this.overlayName).then(() => {
-      this.input.value = "";
+    const [{
+      width,
+      height
+    }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, 
this.l10n.get(`document_properties_page_size_unit_${this._isNonMetricLocale ? "inches" : "millimeters"}`), 
rawName && this.l10n.get(`document_properties_page_size_name_${rawName.toLowerCase()}`), 
this.l10n.get(`document_properties_page_size_orientation_${isPortrait ? "portrait" : "landscape"}`)]);
+    return this.l10n.get(`document_properties_page_size_dimension_${name ? "name_" : ""}string`, {
+      width: width.toLocaleString(),
+      height: height.toLocaleString(),
+      unit,
+      name,
+      orientation
     });
   }
 
-  verify() {
-    const password = this.input.value;
+  async _parseDate(inputDate) {
+    const dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate);
 
-    if (password && password.length > 0) {
-      this.close();
-      this.updateCallback(password);
+    if (!dateObject) {
+      return undefined;
     }
+
+    return this.l10n.get("document_properties_date_string", {
+      date: dateObject.toLocaleDateString(),
+      time: dateObject.toLocaleTimeString()
+    });
   }
 
-  setUpdateCallback(updateCallback, reason) {
-    this.updateCallback = updateCallback;
-    this.reason = reason;
+  _parseLinearization(isLinearized) {
+    return this.l10n.get(`document_properties_linearized_${isLinearized ? "yes" : "no"}`);
   }
 
 }
 
-exports.PasswordPrompt = PasswordPrompt;
+exports.PDFDocumentProperties = PDFDocumentProperties;
 
 /***/ }),
-/* 12 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 14 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFAttachmentViewer = void 0;
+}));
+exports.PDFFindBar = void 0;
 
-var _pdfjsLib = __webpack_require__(5);
+var _pdf_find_controller = __webpack_require__(15);
+
+const MATCHES_COUNT_LIMIT = 1000;
 
-var _base_tree_viewer = __webpack_require__(13);
+class PDFFindBar {
+  constructor(options, eventBus, l10n) {
+    this.opened = false;
+    this.bar = options.bar;
+    this.toggleButton = options.toggleButton;
+    this.findField = options.findField;
+    this.highlightAll = options.highlightAllCheckbox;
+    this.caseSensitive = options.caseSensitiveCheckbox;
+    this.entireWord = options.entireWordCheckbox;
+    this.findMsg = options.findMsg;
+    this.findResultsCount = options.findResultsCount;
+    this.findPreviousButton = options.findPreviousButton;
+    this.findNextButton = options.findNextButton;
+    this.eventBus = eventBus;
+    this.l10n = l10n;
+    this.toggleButton.addEventListener("click", () => {
+      this.toggle();
+    });
+    this.findField.addEventListener("input", () => {
+      this.dispatchEvent("");
+    });
+    this.bar.addEventListener("keydown", e => {
+      switch (e.keyCode) {
+        case 13:
+          if (e.target === this.findField) {
+            this.dispatchEvent("again", e.shiftKey);
+          }
 
-var _viewer_compatibility = __webpack_require__(4);
+          break;
 
-const PdfFileRegExp = /\.pdf$/i;
+        case 27:
+          this.close();
+          break;
+      }
+    });
+    this.findPreviousButton.addEventListener("click", () => {
+      this.dispatchEvent("again", true);
+    });
+    this.findNextButton.addEventListener("click", () => {
+      this.dispatchEvent("again", false);
+    });
+    this.highlightAll.addEventListener("click", () => {
+      this.dispatchEvent("highlightallchange");
+    });
+    this.caseSensitive.addEventListener("click", () => {
+      this.dispatchEvent("casesensitivitychange");
+    });
+    this.entireWord.addEventListener("click", () => {
+      this.dispatchEvent("entirewordchange");
+    });
 
-class PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer {
-  constructor(options) {
-    super(options);
-    this.downloadManager = options.downloadManager;
+    this.eventBus._on("resize", this._adjustWidth.bind(this));
+  }
 
-    this.eventBus._on("fileattachmentannotation", this._appendAttachment.bind(this));
+  reset() {
+    this.updateUIState();
   }
 
-  reset(keepRenderedCapability = false) {
-    super.reset();
-    this._attachments = null;
+  dispatchEvent(type, findPrev) {
+    this.eventBus.dispatch("find", {
+      source: this,
+      type,
+      query: this.findField.value,
+      phraseSearch: true,
+      caseSensitive: this.caseSensitive.checked,
+      entireWord: this.entireWord.checked,
+      highlightAll: this.highlightAll.checked,
+      findPrevious: findPrev
+    });
+  }
 
-    if (!keepRenderedCapability) {
-      this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();
-    }
+  updateUIState(state, previous, matchesCount) {
+    let findMsg = Promise.resolve("");
+    let status = "";
 
-    if (this._pendingDispatchEvent) {
-      clearTimeout(this._pendingDispatchEvent);
-    }
+    switch (state) {
+      case _pdf_find_controller.FindState.FOUND:
+        break;
 
-    this._pendingDispatchEvent = null;
-  }
+      case _pdf_find_controller.FindState.PENDING:
+        status = "pending";
+        break;
 
-  _dispatchEvent(attachmentsCount) {
-    this._renderedCapability.resolve();
+      case _pdf_find_controller.FindState.NOT_FOUND:
+        findMsg = this.l10n.get("find_not_found");
+        status = "notFound";
+        break;
 
-    if (this._pendingDispatchEvent) {
-      clearTimeout(this._pendingDispatchEvent);
-      this._pendingDispatchEvent = null;
+      case _pdf_find_controller.FindState.WRAPPED:
+        findMsg = this.l10n.get(`find_reached_${previous ? "top" : "bottom"}`);
+        break;
     }
 
-    if (attachmentsCount === 0) {
-      this._pendingDispatchEvent = setTimeout(() => {
-        this.eventBus.dispatch("attachmentsloaded", {
-          source: this,
-          attachmentsCount: 0
-        });
-        this._pendingDispatchEvent = null;
-      });
-      return;
-    }
+    this.findField.setAttribute("data-status", status);
+    findMsg.then(msg => {
+      this.findMsg.textContent = msg;
 
-    this.eventBus.dispatch("attachmentsloaded", {
-      source: this,
-      attachmentsCount
+      this._adjustWidth();
     });
+    this.updateResultsCount(matchesCount);
   }
 
-  _bindPdfLink(element, {
-    content,
-    filename
-  }) {
-    let blobUrl;
-
-    element.onclick = () => {
-      if (!blobUrl) {
-        blobUrl = URL.createObjectURL(new Blob([content], {
-          type: "application/pdf"
-        }));
-      }
-
-      let viewerUrl;
-      viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
+  updateResultsCount({
+    current = 0,
+    total = 0
+  } = {}) {
+    const limit = MATCHES_COUNT_LIMIT;
+    let matchCountMsg = Promise.resolve("");
 
-      try {
-        window.open(viewerUrl);
-      } catch (ex) {
-        console.error(`_bindPdfLink: ${ex}`);
-        URL.revokeObjectURL(blobUrl);
-        blobUrl = null;
-        this.downloadManager.downloadData(content, filename, "application/pdf");
+    if (total > 0) {
+      if (total > limit) {
+        let key = "find_match_count_limit";
+        matchCountMsg = this.l10n.get(key, {
+          limit
+        });
+      } else {
+        let key = "find_match_count";
+        matchCountMsg = this.l10n.get(key, {
+          current,
+          total
+        });
       }
+    }
 
-      return false;
-    };
-  }
+    matchCountMsg.then(msg => {
+      this.findResultsCount.textContent = msg;
+      this.findResultsCount.classList.toggle("hidden", !total);
 
-  _bindLink(element, {
-    content,
-    filename
-  }) {
-    element.onclick = () => {
-      const contentType = PdfFileRegExp.test(filename) ? "application/pdf" : "";
-      this.downloadManager.downloadData(content, filename, contentType);
-      return false;
-    };
+      this._adjustWidth();
+    });
   }
 
-  render({
-    attachments,
-    keepRenderedCapability = false
-  }) {
-    if (this._attachments) {
-      this.reset(keepRenderedCapability);
+  open() {
+    if (!this.opened) {
+      this.opened = true;
+      this.toggleButton.classList.add("toggled");
+      this.toggleButton.setAttribute("aria-expanded", "true");
+      this.bar.classList.remove("hidden");
     }
 
-    this._attachments = attachments || null;
+    this.findField.select();
+    this.findField.focus();
 
-    if (!attachments) {
-      this._dispatchEvent(0);
+    this._adjustWidth();
+  }
 
+  close() {
+    if (!this.opened) {
       return;
     }
 
-    const names = Object.keys(attachments).sort(function (a, b) {
-      return a.toLowerCase().localeCompare(b.toLowerCase());
+    this.opened = false;
+    this.toggleButton.classList.remove("toggled");
+    this.toggleButton.setAttribute("aria-expanded", "false");
+    this.bar.classList.add("hidden");
+    this.eventBus.dispatch("findbarclose", {
+      source: this
     });
-    const fragment = document.createDocumentFragment();
-    let attachmentsCount = 0;
-
-    for (const name of names) {
-      const item = attachments[name];
-      const filename = (0, _pdfjsLib.getFilenameFromUrl)(item.filename);
-      const div = document.createElement("div");
-      div.className = "treeItem";
-      const element = document.createElement("a");
+  }
 
-      if (PdfFileRegExp.test(filename) && 
!_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
-        this._bindPdfLink(element, {
-          content: item.content,
-          filename
-        });
-      } else {
-        this._bindLink(element, {
-          content: item.content,
-          filename
-        });
-      }
+  toggle() {
+    if (this.opened) {
+      this.close();
+    } else {
+      this.open();
+    }
+  }
 
-      element.textContent = this._normalizeTextContent(filename);
-      div.appendChild(element);
-      fragment.appendChild(div);
-      attachmentsCount++;
+  _adjustWidth() {
+    if (!this.opened) {
+      return;
     }
 
-    this.container.appendChild(fragment);
+    this.bar.classList.remove("wrapContainers");
+    const findbarHeight = this.bar.clientHeight;
+    const inputContainerHeight = this.bar.firstElementChild.clientHeight;
 
-    this._dispatchEvent(attachmentsCount);
+    if (findbarHeight > inputContainerHeight) {
+      this.bar.classList.add("wrapContainers");
+    }
   }
 
-  _appendAttachment({
-    id,
-    filename,
-    content
-  }) {
-    const renderedPromise = this._renderedCapability.promise;
-    renderedPromise.then(() => {
-      if (renderedPromise !== this._renderedCapability.promise) {
-        return;
-      }
+}
 
-      let attachments = this._attachments;
+exports.PDFFindBar = PDFFindBar;
 
-      if (!attachments) {
-        attachments = Object.create(null);
-      } else {
-        for (const name in attachments) {
-          if (id === name) {
-            return;
-          }
-        }
-      }
+/***/ }),
+/* 15 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-      attachments[id] = {
-        filename,
-        content
-      };
-      this.render({
-        attachments,
-        keepRenderedCapability: true
-      });
-    });
-  }
 
-}
 
-exports.PDFAttachmentViewer = PDFAttachmentViewer;
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PDFFindController = exports.FindState = void 0;
 
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __webpack_require__) {
+var _pdfjsLib = __webpack_require__(5);
+
+var _pdf_find_utils = __webpack_require__(16);
 
-"use strict";
+var _ui_utils = __webpack_require__(4);
 
+const FindState = {
+  FOUND: 0,
+  NOT_FOUND: 1,
+  WRAPPED: 2,
+  PENDING: 3
+};
+exports.FindState = FindState;
+const FIND_TIMEOUT = 250;
+const MATCH_SCROLL_OFFSET_TOP = -50;
+const MATCH_SCROLL_OFFSET_LEFT = -400;
+const CHARACTERS_TO_NORMALIZE = {
+  "\u2010": "-",
+  "\u2018": "'",
+  "\u2019": "'",
+  "\u201A": "'",
+  "\u201B": "'",
+  "\u201C": '"',
+  "\u201D": '"',
+  "\u201E": '"',
+  "\u201F": '"',
+  "\u00BC": "1/4",
+  "\u00BD": "1/2",
+  "\u00BE": "3/4"
+};
+let normalizationRegex = null;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.BaseTreeViewer = void 0;
+function normalize(text) {
+  if (!normalizationRegex) {
+    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join("");
+    normalizationRegex = new RegExp(`[${replace}]`, "g");
+  }
 
-var _pdfjsLib = __webpack_require__(5);
+  let diffs = null;
+  const normalizedText = text.replace(normalizationRegex, function (ch, index) {
+    const normalizedCh = CHARACTERS_TO_NORMALIZE[ch],
+          diff = normalizedCh.length - ch.length;
 
-class BaseTreeViewer {
-  constructor(options) {
-    if (this.constructor === BaseTreeViewer) {
-      throw new Error("Cannot initialize BaseTreeViewer.");
+    if (diff !== 0) {
+      (diffs || (diffs = [])).push([index, diff]);
     }
 
-    this.container = options.container;
-    this.eventBus = options.eventBus;
-    this.reset();
-  }
-
-  reset() {
-    this._lastToggleIsShow = true;
-    this.container.textContent = "";
-    this.container.classList.remove("treeWithDeepNesting");
-  }
-
-  _dispatchEvent(count) {
-    throw new Error("Not implemented: _dispatchEvent");
-  }
+    return normalizedCh;
+  });
+  return [normalizedText, diffs];
+}
 
-  _bindLink(element, params) {
-    throw new Error("Not implemented: _bindLink");
+function getOriginalIndex(matchIndex, diffs = null) {
+  if (!diffs) {
+    return matchIndex;
   }
 
-  _normalizeTextContent(str) {
-    return (0, _pdfjsLib.removeNullCharacters)(str) || "\u2013";
-  }
+  let totalDiff = 0;
 
-  _addToggleButton(div, hidden = false) {
-    const toggler = document.createElement("div");
-    toggler.className = "treeItemToggler";
+  for (const [index, diff] of diffs) {
+    const currentIndex = index + totalDiff;
 
-    if (hidden) {
-      toggler.classList.add("treeItemsHidden");
+    if (currentIndex >= matchIndex) {
+      break;
     }
 
-    toggler.onclick = evt => {
-      evt.stopPropagation();
-      toggler.classList.toggle("treeItemsHidden");
+    if (currentIndex + diff > matchIndex) {
+      totalDiff += matchIndex - currentIndex;
+      break;
+    }
 
-      if (evt.shiftKey) {
-        const shouldShowAll = !toggler.classList.contains("treeItemsHidden");
+    totalDiff += diff;
+  }
 
-        this._toggleTreeItem(div, shouldShowAll);
-      }
-    };
+  return matchIndex - totalDiff;
+}
 
-    div.insertBefore(toggler, div.firstChild);
-  }
+class PDFFindController {
+  constructor({
+    linkService,
+    eventBus
+  }) {
+    this._linkService = linkService;
+    this._eventBus = eventBus;
 
-  _toggleTreeItem(root, show = false) {
-    this._lastToggleIsShow = show;
+    this._reset();
 
-    for (const toggler of root.querySelectorAll(".treeItemToggler")) {
-      toggler.classList.toggle("treeItemsHidden", !show);
-    }
+    eventBus._on("findbarclose", this._onFindBarClose.bind(this));
   }
 
-  _toggleAllTreeItems() {
-    this._toggleTreeItem(this.container, !this._lastToggleIsShow);
+  get highlightMatches() {
+    return this._highlightMatches;
   }
 
-  render(params) {
-    throw new Error("Not implemented: render");
+  get pageMatches() {
+    return this._pageMatches;
   }
 
-}
-
-exports.BaseTreeViewer = BaseTreeViewer;
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
+  get pageMatchesLength() {
+    return this._pageMatchesLength;
+  }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PDFDocumentProperties = void 0;
+  get selected() {
+    return this._selected;
+  }
 
-var _pdfjsLib = __webpack_require__(5);
+  get state() {
+    return this._state;
+  }
 
-var _ui_utils = __webpack_require__(2);
+  setDocument(pdfDocument) {
+    if (this._pdfDocument) {
+      this._reset();
+    }
 
-const DEFAULT_FIELD_CONTENT = "-";
-const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"];
-const US_PAGE_NAMES = {
-  "8.5x11": "Letter",
-  "8.5x14": "Legal"
-};
-const METRIC_PAGE_NAMES = {
-  "297x420": "A3",
-  "210x297": "A4"
-};
+    if (!pdfDocument) {
+      return;
+    }
 
-function getPageName(size, isPortrait, pageNames) {
-  const width = isPortrait ? size.width : size.height;
-  const height = isPortrait ? size.height : size.width;
-  return pageNames[`${width}x${height}`];
-}
+    this._pdfDocument = pdfDocument;
 
-class PDFDocumentProperties {
-  constructor({
-    overlayName,
-    fields,
-    container,
-    closeButton
-  }, overlayManager, eventBus, l10n = _ui_utils.NullL10n) {
-    this.overlayName = overlayName;
-    this.fields = fields;
-    this.container = container;
-    this.overlayManager = overlayManager;
-    this.l10n = l10n;
+    this._firstPageCapability.resolve();
+  }
 
-    this._reset();
+  executeCommand(cmd, state) {
+    if (!state) {
+      return;
+    }
 
-    closeButton.addEventListener("click", this.close.bind(this));
-    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));
+    const pdfDocument = this._pdfDocument;
 
-    eventBus._on("pagechanging", evt => {
-      this._currentPageNumber = evt.pageNumber;
-    });
+    if (this._state === null || this._shouldDirtyMatch(cmd, state)) {
+      this._dirtyMatch = true;
+    }
 
-    eventBus._on("rotationchanging", evt => {
-      this._pagesRotation = evt.pagesRotation;
-    });
+    this._state = state;
 
-    this._isNonMetricLocale = true;
-    l10n.getLanguage().then(locale => {
-      this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);
-    });
-  }
+    if (cmd !== "findhighlightallchange") {
+      this._updateUIState(FindState.PENDING);
+    }
 
-  open() {
-    const freezeFieldData = data => {
-      Object.defineProperty(this, "fieldData", {
-        value: Object.freeze(data),
-        writable: false,
-        enumerable: true,
-        configurable: true
-      });
-    };
+    this._firstPageCapability.promise.then(() => {
+      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
+        return;
+      }
 
-    Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(() 
=> {
-      const currentPageNumber = this._currentPageNumber;
-      const pagesRotation = this._pagesRotation;
+      this._extractText();
 
-      if (this.fieldData && currentPageNumber === this.fieldData._currentPageNumber && pagesRotation === 
this.fieldData._pagesRotation) {
-        this._updateUI();
+      const findbarClosed = !this._highlightMatches;
+      const pendingTimeout = !!this._findTimeout;
 
-        return;
+      if (this._findTimeout) {
+        clearTimeout(this._findTimeout);
+        this._findTimeout = null;
       }
 
-      this.pdfDocument.getMetadata().then(({
-        info,
-        metadata,
-        contentDispositionFilename
-      }) => {
-        return Promise.all([info, metadata, contentDispositionFilename || (0, 
_ui_utils.getPDFFileNameFromURL)(this.url), this._parseFileSize(this.maybeFileSize), 
this._parseDate(info.CreationDate), this._parseDate(info.ModDate), 
this.pdfDocument.getPage(currentPageNumber).then(pdfPage => {
-          return this._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);
-        }), this._parseLinearization(info.IsLinearized)]);
-      }).then(([info, metadata, fileName, fileSize, creationDate, modDate, pageSize, isLinearized]) => {
-        freezeFieldData({
-          fileName,
-          fileSize,
-          title: info.Title,
-          author: info.Author,
-          subject: info.Subject,
-          keywords: info.Keywords,
-          creationDate,
-          modificationDate: modDate,
-          creator: info.Creator,
-          producer: info.Producer,
-          version: info.PDFFormatVersion,
-          pageCount: this.pdfDocument.numPages,
-          pageSize,
-          linearized: isLinearized,
-          _currentPageNumber: currentPageNumber,
-          _pagesRotation: pagesRotation
-        });
+      if (cmd === "find") {
+        this._findTimeout = setTimeout(() => {
+          this._nextMatch();
 
-        this._updateUI();
+          this._findTimeout = null;
+        }, FIND_TIMEOUT);
+      } else if (this._dirtyMatch) {
+        this._nextMatch();
+      } else if (cmd === "findagain") {
+        this._nextMatch();
 
-        return this.pdfDocument.getDownloadInfo();
-      }).then(({
-        length
-      }) => {
-        this.maybeFileSize = length;
-        return this._parseFileSize(length);
-      }).then(fileSize => {
-        if (fileSize === this.fieldData.fileSize) {
-          return;
+        if (findbarClosed && this._state.highlightAll) {
+          this._updateAllPages();
+        }
+      } else if (cmd === "findhighlightallchange") {
+        if (pendingTimeout) {
+          this._nextMatch();
+        } else {
+          this._highlightMatches = true;
         }
 
-        const data = Object.assign(Object.create(null), this.fieldData);
-        data.fileSize = fileSize;
-        freezeFieldData(data);
-
-        this._updateUI();
-      });
+        this._updateAllPages();
+      } else {
+        this._nextMatch();
+      }
     });
   }
 
-  close() {
-    this.overlayManager.close(this.overlayName);
-  }
-
-  setDocument(pdfDocument, url = null) {
-    if (this.pdfDocument) {
-      this._reset();
-
-      this._updateUI(true);
-    }
-
-    if (!pdfDocument) {
+  scrollMatchIntoView({
+    element = null,
+    selectedLeft = 0,
+    pageIndex = -1,
+    matchIndex = -1
+  }) {
+    if (!this._scrollMatches || !element) {
+      return;
+    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {
+      return;
+    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {
       return;
     }
 
-    this.pdfDocument = pdfDocument;
-    this.url = url;
+    this._scrollMatches = false;
+    const spot = {
+      top: MATCH_SCROLL_OFFSET_TOP,
+      left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT
+    };
+    (0, _ui_utils.scrollIntoView)(element, spot, true);
+  }
 
-    this._dataAvailableCapability.resolve();
+  _reset() {
+    this._highlightMatches = false;
+    this._scrollMatches = false;
+    this._pdfDocument = null;
+    this._pageMatches = [];
+    this._pageMatchesLength = [];
+    this._state = null;
+    this._selected = {
+      pageIdx: -1,
+      matchIdx: -1
+    };
+    this._offset = {
+      pageIdx: null,
+      matchIdx: null,
+      wrapped: false
+    };
+    this._extractTextPromises = [];
+    this._pageContents = [];
+    this._pageDiffs = [];
+    this._matchesCountTotal = 0;
+    this._pagesToSearch = null;
+    this._pendingFindMatches = new Set();
+    this._resumePageIdx = null;
+    this._dirtyMatch = false;
+    clearTimeout(this._findTimeout);
+    this._findTimeout = null;
+    this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
   }
 
-  setFileSize(fileSize) {
-    if (Number.isInteger(fileSize) && fileSize > 0) {
-      this.maybeFileSize = fileSize;
+  get _query() {
+    if (this._state.query !== this._rawQuery) {
+      this._rawQuery = this._state.query;
+      [this._normalizedQuery] = normalize(this._state.query);
     }
-  }
 
-  _reset() {
-    this.pdfDocument = null;
-    this.url = null;
-    this.maybeFileSize = 0;
-    delete this.fieldData;
-    this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();
-    this._currentPageNumber = 1;
-    this._pagesRotation = 0;
+    return this._normalizedQuery;
   }
 
-  _updateUI(reset = false) {
-    if (reset || !this.fieldData) {
-      for (const id in this.fields) {
-        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;
-      }
-
-      return;
+  _shouldDirtyMatch(cmd, state) {
+    if (state.query !== this._state.query) {
+      return true;
     }
 
-    if (this.overlayManager.active !== this.overlayName) {
-      return;
-    }
+    switch (cmd) {
+      case "findagain":
+        const pageNumber = this._selected.pageIdx + 1;
+        const linkService = this._linkService;
 
-    for (const id in this.fields) {
-      const content = this.fieldData[id];
-      this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;
-    }
-  }
+        if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && 
!linkService.isPageVisible(pageNumber)) {
+          return true;
+        }
 
-  async _parseFileSize(fileSize = 0) {
-    const kb = fileSize / 1024;
+        return false;
 
-    if (!kb) {
-      return undefined;
-    } else if (kb < 1024) {
-      return this.l10n.get("document_properties_kb", {
-        size_kb: (+kb.toPrecision(3)).toLocaleString(),
-        size_b: fileSize.toLocaleString()
-      }, "{{size_kb}} KB ({{size_b}} bytes)");
+      case "findhighlightallchange":
+        return false;
     }
 
-    return this.l10n.get("document_properties_mb", {
-      size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
-      size_b: fileSize.toLocaleString()
-    }, "{{size_mb}} MB ({{size_b}} bytes)");
+    return true;
   }
 
-  async _parsePageSize(pageSizeInches, pagesRotation) {
-    if (!pageSizeInches) {
-      return undefined;
-    }
+  _prepareMatches(matchesWithLength, matches, matchesLength) {
+    function isSubTerm(currentIndex) {
+      const currentElem = matchesWithLength[currentIndex];
+      const nextElem = matchesWithLength[currentIndex + 1];
 
-    if (pagesRotation % 180 !== 0) {
-      pageSizeInches = {
-        width: pageSizeInches.height,
-        height: pageSizeInches.width
-      };
-    }
+      if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {
+        currentElem.skipped = true;
+        return true;
+      }
 
-    const isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);
-    let sizeInches = {
-      width: Math.round(pageSizeInches.width * 100) / 100,
-      height: Math.round(pageSizeInches.height * 100) / 100
-    };
-    let sizeMillimeters = {
-      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
-      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
-    };
-    let pageName = null;
-    let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, 
isPortrait, METRIC_PAGE_NAMES);
+      for (let i = currentIndex - 1; i >= 0; i--) {
+        const prevElem = matchesWithLength[i];
 
-    if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
-      const exactMillimeters = {
-        width: pageSizeInches.width * 25.4,
-        height: pageSizeInches.height * 25.4
-      };
-      const intMillimeters = {
-        width: Math.round(sizeMillimeters.width),
-        height: Math.round(sizeMillimeters.height)
-      };
+        if (prevElem.skipped) {
+          continue;
+        }
 
-      if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height 
- intMillimeters.height) < 0.1) {
-        rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
+        if (prevElem.match + prevElem.matchLength < currentElem.match) {
+          break;
+        }
 
-        if (rawName) {
-          sizeInches = {
-            width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
-            height: Math.round(intMillimeters.height / 25.4 * 100) / 100
-          };
-          sizeMillimeters = intMillimeters;
+        if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {
+          currentElem.skipped = true;
+          return true;
         }
       }
-    }
 
-    if (rawName) {
-      pageName = this.l10n.get("document_properties_page_size_name_" + rawName.toLowerCase(), null, rawName);
+      return false;
     }
 
-    return Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, 
this.l10n.get("document_properties_page_size_unit_" + (this._isNonMetricLocale ? "inches" : "millimeters"), 
null, this._isNonMetricLocale ? "in" : "mm"), pageName, 
this.l10n.get("document_properties_page_size_orientation_" + (isPortrait ? "portrait" : "landscape"), null, 
isPortrait ? "portrait" : "landscape")]).then(([{
-      width,
-      height
-    }, unit, name, orientation]) => {
-      return this.l10n.get("document_properties_page_size_dimension_" + (name ? "name_" : "") + "string", {
-        width: width.toLocaleString(),
-        height: height.toLocaleString(),
-        unit,
-        name,
-        orientation
-      }, "{{width}} × {{height}} {{unit}} (" + (name ? "{{name}}, " : "") + "{{orientation}})");
+    matchesWithLength.sort(function (a, b) {
+      return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;
     });
+
+    for (let i = 0, len = matchesWithLength.length; i < len; i++) {
+      if (isSubTerm(i)) {
+        continue;
+      }
+
+      matches.push(matchesWithLength[i].match);
+      matchesLength.push(matchesWithLength[i].matchLength);
+    }
   }
 
-  async _parseDate(inputDate) {
-    const dateObject = _pdfjsLib.PDFDateString.toDateObject(inputDate);
+  _isEntireWord(content, startIdx, length) {
+    if (startIdx > 0) {
+      const first = content.charCodeAt(startIdx);
+      const limit = content.charCodeAt(startIdx - 1);
 
-    if (!dateObject) {
-      return undefined;
+      if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {
+        return false;
+      }
     }
 
-    return this.l10n.get("document_properties_date_string", {
-      date: dateObject.toLocaleDateString(),
-      time: dateObject.toLocaleTimeString()
-    }, "{{date}}, {{time}}");
-  }
+    const endIdx = startIdx + length - 1;
 
-  _parseLinearization(isLinearized) {
-    return this.l10n.get("document_properties_linearized_" + (isLinearized ? "yes" : "no"), null, 
isLinearized ? "Yes" : "No");
-  }
+    if (endIdx < content.length - 1) {
+      const last = content.charCodeAt(endIdx);
+      const limit = content.charCodeAt(endIdx + 1);
 
-}
+      if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) {
+        return false;
+      }
+    }
 
-exports.PDFDocumentProperties = PDFDocumentProperties;
+    return true;
+  }
 
-/***/ }),
-/* 15 */
-/***/ (function(module, exports, __webpack_require__) {
+  _calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {
+    const matches = [],
+          matchesLength = [];
+    const queryLen = query.length;
+    let matchIdx = -queryLen;
 
-"use strict";
+    while (true) {
+      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
 
+      if (matchIdx === -1) {
+        break;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PDFFindBar = void 0;
+      if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {
+        continue;
+      }
 
-var _pdf_find_controller = __webpack_require__(16);
+      const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),
+            matchEnd = matchIdx + queryLen - 1,
+            originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;
+      matches.push(originalMatchIdx);
+      matchesLength.push(originalQueryLen);
+    }
 
-var _ui_utils = __webpack_require__(2);
+    this._pageMatches[pageIndex] = matches;
+    this._pageMatchesLength[pageIndex] = matchesLength;
+  }
 
-const MATCHES_COUNT_LIMIT = 1000;
+  _calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord) {
+    const matchesWithLength = [];
+    const queryArray = query.match(/\S+/g);
 
-class PDFFindBar {
-  constructor(options, eventBus, l10n = _ui_utils.NullL10n) {
-    this.opened = false;
-    this.bar = options.bar || null;
-    this.toggleButton = options.toggleButton || null;
-    this.findField = options.findField || null;
-    this.highlightAll = options.highlightAllCheckbox || null;
-    this.caseSensitive = options.caseSensitiveCheckbox || null;
-    this.entireWord = options.entireWordCheckbox || null;
-    this.findMsg = options.findMsg || null;
-    this.findResultsCount = options.findResultsCount || null;
-    this.findPreviousButton = options.findPreviousButton || null;
-    this.findNextButton = options.findNextButton || null;
-    this.eventBus = eventBus;
-    this.l10n = l10n;
-    this.toggleButton.addEventListener("click", () => {
-      this.toggle();
-    });
-    this.findField.addEventListener("input", () => {
-      this.dispatchEvent("");
-    });
-    this.bar.addEventListener("keydown", e => {
-      switch (e.keyCode) {
-        case 13:
-          if (e.target === this.findField) {
-            this.dispatchEvent("again", e.shiftKey);
-          }
+    for (let i = 0, len = queryArray.length; i < len; i++) {
+      const subquery = queryArray[i];
+      const subqueryLen = subquery.length;
+      let matchIdx = -subqueryLen;
 
-          break;
+      while (true) {
+        matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);
 
-        case 27:
-          this.close();
+        if (matchIdx === -1) {
           break;
+        }
+
+        if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {
+          continue;
+        }
+
+        const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs),
+              matchEnd = matchIdx + subqueryLen - 1,
+              originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1;
+        matchesWithLength.push({
+          match: originalMatchIdx,
+          matchLength: originalQueryLen,
+          skipped: false
+        });
       }
-    });
-    this.findPreviousButton.addEventListener("click", () => {
-      this.dispatchEvent("again", true);
-    });
-    this.findNextButton.addEventListener("click", () => {
-      this.dispatchEvent("again", false);
-    });
-    this.highlightAll.addEventListener("click", () => {
-      this.dispatchEvent("highlightallchange");
-    });
-    this.caseSensitive.addEventListener("click", () => {
-      this.dispatchEvent("casesensitivitychange");
-    });
-    this.entireWord.addEventListener("click", () => {
-      this.dispatchEvent("entirewordchange");
-    });
+    }
 
-    this.eventBus._on("resize", this._adjustWidth.bind(this));
-  }
+    this._pageMatchesLength[pageIndex] = [];
+    this._pageMatches[pageIndex] = [];
 
-  reset() {
-    this.updateUIState();
+    this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], 
this._pageMatchesLength[pageIndex]);
   }
 
-  dispatchEvent(type, findPrev) {
-    this.eventBus.dispatch("find", {
-      source: this,
-      type,
-      query: this.findField.value,
-      phraseSearch: true,
-      caseSensitive: this.caseSensitive.checked,
-      entireWord: this.entireWord.checked,
-      highlightAll: this.highlightAll.checked,
-      findPrevious: findPrev
-    });
-  }
+  _calculateMatch(pageIndex) {
+    let pageContent = this._pageContents[pageIndex];
+    const pageDiffs = this._pageDiffs[pageIndex];
+    let query = this._query;
+    const {
+      caseSensitive,
+      entireWord,
+      phraseSearch
+    } = this._state;
 
-  updateUIState(state, previous, matchesCount) {
-    let notFound = false;
-    let findMsg = "";
-    let status = "";
+    if (query.length === 0) {
+      return;
+    }
 
-    switch (state) {
-      case _pdf_find_controller.FindState.FOUND:
-        break;
+    if (!caseSensitive) {
+      pageContent = pageContent.toLowerCase();
+      query = query.toLowerCase();
+    }
 
-      case _pdf_find_controller.FindState.PENDING:
-        status = "pending";
-        break;
+    if (phraseSearch) {
+      this._calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord);
+    } else {
+      this._calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord);
+    }
 
-      case _pdf_find_controller.FindState.NOT_FOUND:
-        findMsg = this.l10n.get("find_not_found", null, "Phrase not found");
-        notFound = true;
-        break;
+    if (this._state.highlightAll) {
+      this._updatePage(pageIndex);
+    }
 
-      case _pdf_find_controller.FindState.WRAPPED:
-        if (previous) {
-          findMsg = this.l10n.get("find_reached_top", null, "Reached top of document, continued from 
bottom");
-        } else {
-          findMsg = this.l10n.get("find_reached_bottom", null, "Reached end of document, continued from 
top");
-        }
+    if (this._resumePageIdx === pageIndex) {
+      this._resumePageIdx = null;
 
-        break;
+      this._nextPageMatch();
     }
 
-    this.findField.classList.toggle("notFound", notFound);
-    this.findField.setAttribute("data-status", status);
-    Promise.resolve(findMsg).then(msg => {
-      this.findMsg.textContent = msg;
+    const pageMatchesCount = this._pageMatches[pageIndex].length;
 
-      this._adjustWidth();
-    });
-    this.updateResultsCount(matchesCount);
+    if (pageMatchesCount > 0) {
+      this._matchesCountTotal += pageMatchesCount;
+
+      this._updateUIResultsCount();
+    }
   }
 
-  updateResultsCount({
-    current = 0,
-    total = 0
-  } = {}) {
-    if (!this.findResultsCount) {
+  _extractText() {
+    if (this._extractTextPromises.length > 0) {
       return;
     }
 
-    const limit = MATCHES_COUNT_LIMIT;
-    let matchesCountMsg = "";
+    let promise = Promise.resolve();
 
-    if (total > 0) {
-      if (total > limit) {
-        matchesCountMsg = this.l10n.get("find_match_count_limit", {
-          limit
-        }, "More than {{limit}} match" + (limit !== 1 ? "es" : ""));
-      } else {
-        matchesCountMsg = this.l10n.get("find_match_count", {
-          current,
-          total
-        }, "{{current}} of {{total}} match" + (total !== 1 ? "es" : ""));
-      }
-    }
+    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
+      const extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();
+      this._extractTextPromises[i] = extractTextCapability.promise;
+      promise = promise.then(() => {
+        return this._pdfDocument.getPage(i + 1).then(pdfPage => {
+          return pdfPage.getTextContent({
+            normalizeWhitespace: true
+          });
+        }).then(textContent => {
+          const textItems = textContent.items;
+          const strBuf = [];
 
-    Promise.resolve(matchesCountMsg).then(msg => {
-      this.findResultsCount.textContent = msg;
-      this.findResultsCount.classList.toggle("hidden", !total);
+          for (let j = 0, jj = textItems.length; j < jj; j++) {
+            strBuf.push(textItems[j].str);
+          }
 
-      this._adjustWidth();
-    });
+          [this._pageContents[i], this._pageDiffs[i]] = normalize(strBuf.join(""));
+          extractTextCapability.resolve(i);
+        }, reason => {
+          console.error(`Unable to get text content for page ${i + 1}`, reason);
+          this._pageContents[i] = "";
+          this._pageDiffs[i] = null;
+          extractTextCapability.resolve(i);
+        });
+      });
+    }
   }
 
-  open() {
-    if (!this.opened) {
-      this.opened = true;
-      this.toggleButton.classList.add("toggled");
-      this.bar.classList.remove("hidden");
+  _updatePage(index) {
+    if (this._scrollMatches && this._selected.pageIdx === index) {
+      this._linkService.page = index + 1;
     }
 
-    this.findField.select();
-    this.findField.focus();
-
-    this._adjustWidth();
+    this._eventBus.dispatch("updatetextlayermatches", {
+      source: this,
+      pageIndex: index
+    });
   }
 
-  close() {
-    if (!this.opened) {
-      return;
-    }
-
-    this.opened = false;
-    this.toggleButton.classList.remove("toggled");
-    this.bar.classList.add("hidden");
-    this.eventBus.dispatch("findbarclose", {
-      source: this
+  _updateAllPages() {
+    this._eventBus.dispatch("updatetextlayermatches", {
+      source: this,
+      pageIndex: -1
     });
   }
 
-  toggle() {
-    if (this.opened) {
-      this.close();
-    } else {
-      this.open();
+  _nextMatch() {
+    const previous = this._state.findPrevious;
+    const currentPageIndex = this._linkService.page - 1;
+    const numPages = this._linkService.pagesCount;
+    this._highlightMatches = true;
+
+    if (this._dirtyMatch) {
+      this._dirtyMatch = false;
+      this._selected.pageIdx = this._selected.matchIdx = -1;
+      this._offset.pageIdx = currentPageIndex;
+      this._offset.matchIdx = null;
+      this._offset.wrapped = false;
+      this._resumePageIdx = null;
+      this._pageMatches.length = 0;
+      this._pageMatchesLength.length = 0;
+      this._matchesCountTotal = 0;
+
+      this._updateAllPages();
+
+      for (let i = 0; i < numPages; i++) {
+        if (this._pendingFindMatches.has(i)) {
+          continue;
+        }
+
+        this._pendingFindMatches.add(i);
+
+        this._extractTextPromises[i].then(pageIdx => {
+          this._pendingFindMatches.delete(pageIdx);
+
+          this._calculateMatch(pageIdx);
+        });
+      }
     }
-  }
 
-  _adjustWidth() {
-    if (!this.opened) {
+    if (this._query === "") {
+      this._updateUIState(FindState.FOUND);
+
       return;
     }
 
-    this.bar.classList.remove("wrapContainers");
-    const findbarHeight = this.bar.clientHeight;
-    const inputContainerHeight = this.bar.firstElementChild.clientHeight;
-
-    if (findbarHeight > inputContainerHeight) {
-      this.bar.classList.add("wrapContainers");
+    if (this._resumePageIdx) {
+      return;
     }
-  }
 
-}
+    const offset = this._offset;
+    this._pagesToSearch = numPages;
 
-exports.PDFFindBar = PDFFindBar;
+    if (offset.matchIdx !== null) {
+      const numPageMatches = this._pageMatches[offset.pageIdx].length;
 
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __webpack_require__) {
+      if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
+        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
 
-"use strict";
+        this._updateMatch(true);
 
+        return;
+      }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PDFFindController = exports.FindState = void 0;
+      this._advanceOffsetPage(previous);
+    }
 
-var _pdfjsLib = __webpack_require__(5);
+    this._nextPageMatch();
+  }
 
-var _pdf_find_utils = __webpack_require__(17);
+  _matchesReady(matches) {
+    const offset = this._offset;
+    const numMatches = matches.length;
+    const previous = this._state.findPrevious;
 
-var _ui_utils = __webpack_require__(2);
+    if (numMatches) {
+      offset.matchIdx = previous ? numMatches - 1 : 0;
 
-const FindState = {
-  FOUND: 0,
-  NOT_FOUND: 1,
-  WRAPPED: 2,
-  PENDING: 3
-};
-exports.FindState = FindState;
-const FIND_TIMEOUT = 250;
-const MATCH_SCROLL_OFFSET_TOP = -50;
-const MATCH_SCROLL_OFFSET_LEFT = -400;
-const CHARACTERS_TO_NORMALIZE = {
-  "\u2018": "'",
-  "\u2019": "'",
-  "\u201A": "'",
-  "\u201B": "'",
-  "\u201C": '"',
-  "\u201D": '"',
-  "\u201E": '"',
-  "\u201F": '"',
-  "\u00BC": "1/4",
-  "\u00BD": "1/2",
-  "\u00BE": "3/4"
-};
-let normalizationRegex = null;
+      this._updateMatch(true);
 
-function normalize(text) {
-  if (!normalizationRegex) {
-    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join("");
-    normalizationRegex = new RegExp(`[${replace}]`, "g");
-  }
+      return true;
+    }
 
-  return text.replace(normalizationRegex, function (ch) {
-    return CHARACTERS_TO_NORMALIZE[ch];
-  });
-}
+    this._advanceOffsetPage(previous);
 
-class PDFFindController {
-  constructor({
-    linkService,
-    eventBus
-  }) {
-    this._linkService = linkService;
-    this._eventBus = eventBus;
+    if (offset.wrapped) {
+      offset.matchIdx = null;
 
-    this._reset();
+      if (this._pagesToSearch < 0) {
+        this._updateMatch(false);
 
-    eventBus._on("findbarclose", this._onFindBarClose.bind(this));
-  }
+        return true;
+      }
+    }
 
-  get highlightMatches() {
-    return this._highlightMatches;
+    return false;
   }
 
-  get pageMatches() {
-    return this._pageMatches;
+  _nextPageMatch() {
+    if (this._resumePageIdx !== null) {
+      console.error("There can only be one pending page.");
+    }
+
+    let matches = null;
+
+    do {
+      const pageIdx = this._offset.pageIdx;
+      matches = this._pageMatches[pageIdx];
+
+      if (!matches) {
+        this._resumePageIdx = pageIdx;
+        break;
+      }
+    } while (!this._matchesReady(matches));
   }
 
-  get pageMatchesLength() {
-    return this._pageMatchesLength;
-  }
+  _advanceOffsetPage(previous) {
+    const offset = this._offset;
+    const numPages = this._linkService.pagesCount;
+    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
+    offset.matchIdx = null;
+    this._pagesToSearch--;
 
-  get selected() {
-    return this._selected;
+    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
+      offset.pageIdx = previous ? numPages - 1 : 0;
+      offset.wrapped = true;
+    }
   }
 
-  get state() {
-    return this._state;
-  }
+  _updateMatch(found = false) {
+    let state = FindState.NOT_FOUND;
+    const wrapped = this._offset.wrapped;
+    this._offset.wrapped = false;
 
-  setDocument(pdfDocument) {
-    if (this._pdfDocument) {
-      this._reset();
-    }
+    if (found) {
+      const previousPage = this._selected.pageIdx;
+      this._selected.pageIdx = this._offset.pageIdx;
+      this._selected.matchIdx = this._offset.matchIdx;
+      state = wrapped ? FindState.WRAPPED : FindState.FOUND;
 
-    if (!pdfDocument) {
-      return;
+      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
+        this._updatePage(previousPage);
+      }
     }
 
-    this._pdfDocument = pdfDocument;
+    this._updateUIState(state, this._state.findPrevious);
 
-    this._firstPageCapability.resolve();
-  }
+    if (this._selected.pageIdx !== -1) {
+      this._scrollMatches = true;
 
-  executeCommand(cmd, state) {
-    if (!state) {
-      return;
+      this._updatePage(this._selected.pageIdx);
     }
+  }
 
+  _onFindBarClose(evt) {
     const pdfDocument = this._pdfDocument;
 
-    if (this._state === null || this._shouldDirtyMatch(cmd, state)) {
-      this._dirtyMatch = true;
-    }
-
-    this._state = state;
-
-    if (cmd !== "findhighlightallchange") {
-      this._updateUIState(FindState.PENDING);
-    }
-
     this._firstPageCapability.promise.then(() => {
       if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
         return;
       }
 
-      this._extractText();
-
-      const findbarClosed = !this._highlightMatches;
-      const pendingTimeout = !!this._findTimeout;
-
       if (this._findTimeout) {
         clearTimeout(this._findTimeout);
         this._findTimeout = null;
       }
 
-      if (cmd === "find") {
-        this._findTimeout = setTimeout(() => {
-          this._nextMatch();
+      if (this._resumePageIdx) {
+        this._resumePageIdx = null;
+        this._dirtyMatch = true;
+      }
 
-          this._findTimeout = null;
-        }, FIND_TIMEOUT);
-      } else if (this._dirtyMatch) {
-        this._nextMatch();
-      } else if (cmd === "findagain") {
-        this._nextMatch();
+      this._updateUIState(FindState.FOUND);
 
-        if (findbarClosed && this._state.highlightAll) {
-          this._updateAllPages();
-        }
-      } else if (cmd === "findhighlightallchange") {
-        if (pendingTimeout) {
-          this._nextMatch();
-        } else {
-          this._highlightMatches = true;
-        }
+      this._highlightMatches = false;
 
-        this._updateAllPages();
-      } else {
-        this._nextMatch();
-      }
+      this._updateAllPages();
     });
   }
 
-  scrollMatchIntoView({
-    element = null,
-    pageIndex = -1,
-    matchIndex = -1
-  }) {
-    if (!this._scrollMatches || !element) {
-      return;
-    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {
-      return;
-    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {
-      return;
+  _requestMatchesCount() {
+    const {
+      pageIdx,
+      matchIdx
+    } = this._selected;
+    let current = 0,
+        total = this._matchesCountTotal;
+
+    if (matchIdx !== -1) {
+      for (let i = 0; i < pageIdx; i++) {
+        current += this._pageMatches[i]?.length || 0;
+      }
+
+      current += matchIdx + 1;
     }
 
-    this._scrollMatches = false;
-    const spot = {
-      top: MATCH_SCROLL_OFFSET_TOP,
-      left: MATCH_SCROLL_OFFSET_LEFT
+    if (current < 1 || current > total) {
+      current = total = 0;
+    }
+
+    return {
+      current,
+      total
     };
-    (0, _ui_utils.scrollIntoView)(element, spot, true);
   }
 
-  _reset() {
-    this._highlightMatches = false;
-    this._scrollMatches = false;
-    this._pdfDocument = null;
-    this._pageMatches = [];
-    this._pageMatchesLength = [];
-    this._state = null;
-    this._selected = {
-      pageIdx: -1,
-      matchIdx: -1
-    };
-    this._offset = {
-      pageIdx: null,
-      matchIdx: null,
-      wrapped: false
-    };
-    this._extractTextPromises = [];
-    this._pageContents = [];
-    this._matchesCountTotal = 0;
-    this._pagesToSearch = null;
-    this._pendingFindMatches = Object.create(null);
-    this._resumePageIdx = null;
-    this._dirtyMatch = false;
-    clearTimeout(this._findTimeout);
-    this._findTimeout = null;
-    this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
+  _updateUIResultsCount() {
+    this._eventBus.dispatch("updatefindmatchescount", {
+      source: this,
+      matchesCount: this._requestMatchesCount()
+    });
   }
 
-  get _query() {
-    if (this._state.query !== this._rawQuery) {
-      this._rawQuery = this._state.query;
-      this._normalizedQuery = normalize(this._state.query);
+  _updateUIState(state, previous) {
+    this._eventBus.dispatch("updatefindcontrolstate", {
+      source: this,
+      state,
+      previous,
+      matchesCount: this._requestMatchesCount(),
+      rawQuery: this._state?.query ?? null
+    });
+  }
+
+}
+
+exports.PDFFindController = PDFFindController;
+
+/***/ }),
+/* 16 */
+/***/ ((__unused_webpack_module, exports) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getCharacterType = getCharacterType;
+exports.CharacterType = void 0;
+const CharacterType = {
+  SPACE: 0,
+  ALPHA_LETTER: 1,
+  PUNCT: 2,
+  HAN_LETTER: 3,
+  KATAKANA_LETTER: 4,
+  HIRAGANA_LETTER: 5,
+  HALFWIDTH_KATAKANA_LETTER: 6,
+  THAI_LETTER: 7
+};
+exports.CharacterType = CharacterType;
+
+function isAlphabeticalScript(charCode) {
+  return charCode < 0x2e80;
+}
+
+function isAscii(charCode) {
+  return (charCode & 0xff80) === 0;
+}
+
+function isAsciiAlpha(charCode) {
+  return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;
+}
+
+function isAsciiDigit(charCode) {
+  return charCode >= 0x30 && charCode <= 0x39;
+}
+
+function isAsciiSpace(charCode) {
+  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;
+}
+
+function isHan(charCode) {
+  return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;
+}
+
+function isKatakana(charCode) {
+  return charCode >= 0x30a0 && charCode <= 0x30ff;
+}
+
+function isHiragana(charCode) {
+  return charCode >= 0x3040 && charCode <= 0x309f;
+}
+
+function isHalfwidthKatakana(charCode) {
+  return charCode >= 0xff60 && charCode <= 0xff9f;
+}
+
+function isThai(charCode) {
+  return (charCode & 0xff80) === 0x0e00;
+}
+
+function getCharacterType(charCode) {
+  if (isAlphabeticalScript(charCode)) {
+    if (isAscii(charCode)) {
+      if (isAsciiSpace(charCode)) {
+        return CharacterType.SPACE;
+      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {
+        return CharacterType.ALPHA_LETTER;
+      }
+
+      return CharacterType.PUNCT;
+    } else if (isThai(charCode)) {
+      return CharacterType.THAI_LETTER;
+    } else if (charCode === 0xa0) {
+      return CharacterType.SPACE;
     }
 
-    return this._normalizedQuery;
+    return CharacterType.ALPHA_LETTER;
+  }
+
+  if (isHan(charCode)) {
+    return CharacterType.HAN_LETTER;
+  } else if (isKatakana(charCode)) {
+    return CharacterType.KATAKANA_LETTER;
+  } else if (isHiragana(charCode)) {
+    return CharacterType.HIRAGANA_LETTER;
+  } else if (isHalfwidthKatakana(charCode)) {
+    return CharacterType.HALFWIDTH_KATAKANA_LETTER;
   }
 
-  _shouldDirtyMatch(cmd, state) {
-    if (state.query !== this._state.query) {
-      return true;
-    }
+  return CharacterType.ALPHA_LETTER;
+}
 
-    switch (cmd) {
-      case "findagain":
-        const pageNumber = this._selected.pageIdx + 1;
-        const linkService = this._linkService;
+/***/ }),
+/* 17 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-        if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && 
!linkService.isPageVisible(pageNumber)) {
-          return true;
-        }
 
-        return false;
 
-      case "findhighlightallchange":
-        return false;
-    }
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.isDestArraysEqual = isDestArraysEqual;
+exports.isDestHashesEqual = isDestHashesEqual;
+exports.PDFHistory = void 0;
 
-    return true;
-  }
+var _ui_utils = __webpack_require__(4);
 
-  _prepareMatches(matchesWithLength, matches, matchesLength) {
-    function isSubTerm(currentIndex) {
-      const currentElem = matchesWithLength[currentIndex];
-      const nextElem = matchesWithLength[currentIndex + 1];
+const HASH_CHANGE_TIMEOUT = 1000;
+const POSITION_UPDATED_THRESHOLD = 50;
+const UPDATE_VIEWAREA_TIMEOUT = 1000;
 
-      if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {
-        currentElem.skipped = true;
-        return true;
-      }
+function getCurrentHash() {
+  return document.location.hash;
+}
 
-      for (let i = currentIndex - 1; i >= 0; i--) {
-        const prevElem = matchesWithLength[i];
+class PDFHistory {
+  constructor({
+    linkService,
+    eventBus
+  }) {
+    this.linkService = linkService;
+    this.eventBus = eventBus;
+    this._initialized = false;
+    this._fingerprint = "";
+    this.reset();
+    this._boundEvents = null;
+    this._isViewerInPresentationMode = false;
 
-        if (prevElem.skipped) {
-          continue;
-        }
+    this.eventBus._on("presentationmodechanged", evt => {
+      this._isViewerInPresentationMode = evt.state !== _ui_utils.PresentationModeState.NORMAL;
+    });
 
-        if (prevElem.match + prevElem.matchLength < currentElem.match) {
-          break;
-        }
+    this.eventBus._on("pagesinit", () => {
+      this._isPagesLoaded = false;
 
-        if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {
-          currentElem.skipped = true;
-          return true;
-        }
-      }
+      this.eventBus._on("pagesloaded", evt => {
+        this._isPagesLoaded = !!evt.pagesCount;
+      }, {
+        once: true
+      });
+    });
+  }
 
-      return false;
+  initialize({
+    fingerprint,
+    resetHistory = false,
+    updateUrl = false
+  }) {
+    if (!fingerprint || typeof fingerprint !== "string") {
+      console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
+      return;
     }
 
-    matchesWithLength.sort(function (a, b) {
-      return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;
-    });
+    if (this._initialized) {
+      this.reset();
+    }
 
-    for (let i = 0, len = matchesWithLength.length; i < len; i++) {
-      if (isSubTerm(i)) {
-        continue;
-      }
+    const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint;
+    this._fingerprint = fingerprint;
+    this._updateUrl = updateUrl === true;
+    this._initialized = true;
 
-      matches.push(matchesWithLength[i].match);
-      matchesLength.push(matchesWithLength[i].matchLength);
-    }
-  }
+    this._bindEvents();
 
-  _isEntireWord(content, startIdx, length) {
-    if (startIdx > 0) {
-      const first = content.charCodeAt(startIdx);
-      const limit = content.charCodeAt(startIdx - 1);
+    const state = window.history.state;
+    this._popStateInProgress = false;
+    this._blockHashChange = 0;
+    this._currentHash = getCurrentHash();
+    this._numPositionUpdates = 0;
+    this._uid = this._maxUid = 0;
+    this._destination = null;
+    this._position = null;
 
-      if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {
-        return false;
+    if (!this._isValidState(state, true) || resetHistory) {
+      const {
+        hash,
+        page,
+        rotation
+      } = this._parseCurrentHash(true);
+
+      if (!hash || reInitialized || resetHistory) {
+        this._pushOrReplaceState(null, true);
+
+        return;
       }
+
+      this._pushOrReplaceState({
+        hash,
+        page,
+        rotation
+      }, true);
+
+      return;
     }
 
-    const endIdx = startIdx + length - 1;
+    const destination = state.destination;
 
-    if (endIdx < content.length - 1) {
-      const last = content.charCodeAt(endIdx);
-      const limit = content.charCodeAt(endIdx + 1);
+    this._updateInternalState(destination, state.uid, true);
 
-      if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) {
-        return false;
-      }
+    if (destination.rotation !== undefined) {
+      this._initialRotation = destination.rotation;
     }
 
-    return true;
+    if (destination.dest) {
+      this._initialBookmark = JSON.stringify(destination.dest);
+      this._destination.page = null;
+    } else if (destination.hash) {
+      this._initialBookmark = destination.hash;
+    } else if (destination.page) {
+      this._initialBookmark = `page=${destination.page}`;
+    }
   }
 
-  _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {
-    const matches = [];
-    const queryLen = query.length;
-    let matchIdx = -queryLen;
-
-    while (true) {
-      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
+  reset() {
+    if (this._initialized) {
+      this._pageHide();
 
-      if (matchIdx === -1) {
-        break;
-      }
+      this._initialized = false;
 
-      if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {
-        continue;
-      }
+      this._unbindEvents();
+    }
 
-      matches.push(matchIdx);
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
     }
 
-    this._pageMatches[pageIndex] = matches;
+    this._initialBookmark = null;
+    this._initialRotation = null;
   }
 
-  _calculateWordMatch(query, pageIndex, pageContent, entireWord) {
-    const matchesWithLength = [];
-    const queryArray = query.match(/\S+/g);
-
-    for (let i = 0, len = queryArray.length; i < len; i++) {
-      const subquery = queryArray[i];
-      const subqueryLen = subquery.length;
-      let matchIdx = -subqueryLen;
-
-      while (true) {
-        matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);
+  push({
+    namedDest = null,
+    explicitDest,
+    pageNumber
+  }) {
+    if (!this._initialized) {
+      return;
+    }
 
-        if (matchIdx === -1) {
-          break;
-        }
+    if (namedDest && typeof namedDest !== "string") {
+      console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`);
+      return;
+    } else if (!Array.isArray(explicitDest)) {
+      console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`);
+      return;
+    } else if (!this._isValidPage(pageNumber)) {
+      if (pageNumber !== null || this._destination) {
+        console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`);
+        return;
+      }
+    }
 
-        if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {
-          continue;
-        }
+    const hash = namedDest || JSON.stringify(explicitDest);
 
-        matchesWithLength.push({
-          match: matchIdx,
-          matchLength: subqueryLen,
-          skipped: false
-        });
-      }
+    if (!hash) {
+      return;
     }
 
-    this._pageMatchesLength[pageIndex] = [];
-    this._pageMatches[pageIndex] = [];
+    let forceReplace = false;
 
-    this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], 
this._pageMatchesLength[pageIndex]);
-  }
+    if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || 
isDestArraysEqual(this._destination.dest, explicitDest))) {
+      if (this._destination.page) {
+        return;
+      }
 
-  _calculateMatch(pageIndex) {
-    let pageContent = this._pageContents[pageIndex];
-    let query = this._query;
-    const {
-      caseSensitive,
-      entireWord,
-      phraseSearch
-    } = this._state;
+      forceReplace = true;
+    }
 
-    if (query.length === 0) {
+    if (this._popStateInProgress && !forceReplace) {
       return;
     }
 
-    if (!caseSensitive) {
-      pageContent = pageContent.toLowerCase();
-      query = query.toLowerCase();
+    this._pushOrReplaceState({
+      dest: explicitDest,
+      hash,
+      page: pageNumber,
+      rotation: this.linkService.rotation
+    }, forceReplace);
+
+    if (!this._popStateInProgress) {
+      this._popStateInProgress = true;
+      Promise.resolve().then(() => {
+        this._popStateInProgress = false;
+      });
     }
+  }
 
-    if (phraseSearch) {
-      this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);
-    } else {
-      this._calculateWordMatch(query, pageIndex, pageContent, entireWord);
+  pushPage(pageNumber) {
+    if (!this._initialized) {
+      return;
     }
 
-    if (this._state.highlightAll) {
-      this._updatePage(pageIndex);
+    if (!this._isValidPage(pageNumber)) {
+      console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`);
+      return;
     }
 
-    if (this._resumePageIdx === pageIndex) {
-      this._resumePageIdx = null;
-
-      this._nextPageMatch();
+    if (this._destination?.page === pageNumber) {
+      return;
     }
 
-    const pageMatchesCount = this._pageMatches[pageIndex].length;
+    if (this._popStateInProgress) {
+      return;
+    }
 
-    if (pageMatchesCount > 0) {
-      this._matchesCountTotal += pageMatchesCount;
+    this._pushOrReplaceState({
+      dest: null,
+      hash: `page=${pageNumber}`,
+      page: pageNumber,
+      rotation: this.linkService.rotation
+    });
 
-      this._updateUIResultsCount();
+    if (!this._popStateInProgress) {
+      this._popStateInProgress = true;
+      Promise.resolve().then(() => {
+        this._popStateInProgress = false;
+      });
     }
   }
 
-  _extractText() {
-    if (this._extractTextPromises.length > 0) {
+  pushCurrentPosition() {
+    if (!this._initialized || this._popStateInProgress) {
       return;
     }
 
-    let promise = Promise.resolve();
+    this._tryPushCurrentPosition();
+  }
 
-    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
-      const extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();
-      this._extractTextPromises[i] = extractTextCapability.promise;
-      promise = promise.then(() => {
-        return this._pdfDocument.getPage(i + 1).then(pdfPage => {
-          return pdfPage.getTextContent({
-            normalizeWhitespace: true
-          });
-        }).then(textContent => {
-          const textItems = textContent.items;
-          const strBuf = [];
+  back() {
+    if (!this._initialized || this._popStateInProgress) {
+      return;
+    }
 
-          for (let j = 0, jj = textItems.length; j < jj; j++) {
-            strBuf.push(textItems[j].str);
-          }
+    const state = window.history.state;
 
-          this._pageContents[i] = normalize(strBuf.join(""));
-          extractTextCapability.resolve(i);
-        }, reason => {
-          console.error(`Unable to get text content for page ${i + 1}`, reason);
-          this._pageContents[i] = "";
-          extractTextCapability.resolve(i);
-        });
-      });
+    if (this._isValidState(state) && state.uid > 0) {
+      window.history.back();
     }
   }
 
-  _updatePage(index) {
-    if (this._scrollMatches && this._selected.pageIdx === index) {
-      this._linkService.page = index + 1;
+  forward() {
+    if (!this._initialized || this._popStateInProgress) {
+      return;
     }
 
-    this._eventBus.dispatch("updatetextlayermatches", {
-      source: this,
-      pageIndex: index
-    });
+    const state = window.history.state;
+
+    if (this._isValidState(state) && state.uid < this._maxUid) {
+      window.history.forward();
+    }
   }
 
-  _updateAllPages() {
-    this._eventBus.dispatch("updatetextlayermatches", {
-      source: this,
-      pageIndex: -1
-    });
+  get popStateInProgress() {
+    return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);
   }
 
-  _nextMatch() {
-    const previous = this._state.findPrevious;
-    const currentPageIndex = this._linkService.page - 1;
-    const numPages = this._linkService.pagesCount;
-    this._highlightMatches = true;
+  get initialBookmark() {
+    return this._initialized ? this._initialBookmark : null;
+  }
 
-    if (this._dirtyMatch) {
-      this._dirtyMatch = false;
-      this._selected.pageIdx = this._selected.matchIdx = -1;
-      this._offset.pageIdx = currentPageIndex;
-      this._offset.matchIdx = null;
-      this._offset.wrapped = false;
-      this._resumePageIdx = null;
-      this._pageMatches.length = 0;
-      this._pageMatchesLength.length = 0;
-      this._matchesCountTotal = 0;
+  get initialRotation() {
+    return this._initialized ? this._initialRotation : null;
+  }
 
-      this._updateAllPages();
+  _pushOrReplaceState(destination, forceReplace = false) {
+    const shouldReplace = forceReplace || !this._destination;
+    const newState = {
+      fingerprint: this._fingerprint,
+      uid: shouldReplace ? this._uid : this._uid + 1,
+      destination
+    };
 
-      for (let i = 0; i < numPages; i++) {
-        if (this._pendingFindMatches[i] === true) {
-          continue;
-        }
+    this._updateInternalState(destination, newState.uid);
 
-        this._pendingFindMatches[i] = true;
+    let newUrl;
 
-        this._extractTextPromises[i].then(pageIdx => {
-          delete this._pendingFindMatches[pageIdx];
+    if (this._updateUrl && destination?.hash) {
+      const baseUrl = document.location.href.split("#")[0];
 
-          this._calculateMatch(pageIdx);
-        });
+      if (!baseUrl.startsWith("file://")) {
+        newUrl = `${baseUrl}#${destination.hash}`;
       }
     }
 
-    if (this._query === "") {
-      this._updateUIState(FindState.FOUND);
+    // FIXME: This currently breaks Epiphany due to rewriting history with baseUrl
+    return;
+    if (shouldReplace) {
+      window.history.replaceState(newState, "", newUrl);
+    } else {
+      window.history.pushState(newState, "", newUrl);
+    }
+  }
 
+  _tryPushCurrentPosition(temporary = false) {
+    if (!this._position) {
       return;
     }
 
-    if (this._resumePageIdx) {
+    let position = this._position;
+
+    if (temporary) {
+      position = Object.assign(Object.create(null), this._position);
+      position.temporary = true;
+    }
+
+    if (!this._destination) {
+      this._pushOrReplaceState(position);
+
       return;
     }
 
-    const offset = this._offset;
-    this._pagesToSearch = numPages;
+    if (this._destination.temporary) {
+      this._pushOrReplaceState(position, true);
 
-    if (offset.matchIdx !== null) {
-      const numPageMatches = this._pageMatches[offset.pageIdx].length;
+      return;
+    }
 
-      if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
-        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
+    if (this._destination.hash === position.hash) {
+      return;
+    }
 
-        this._updateMatch(true);
+    if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= 
POSITION_UPDATED_THRESHOLD)) {
+      return;
+    }
 
+    let forceReplace = false;
+
+    if (this._destination.page >= position.first && this._destination.page <= position.page) {
+      if (this._destination.dest !== undefined || !this._destination.first) {
         return;
       }
 
-      this._advanceOffsetPage(previous);
+      forceReplace = true;
     }
 
-    this._nextPageMatch();
+    this._pushOrReplaceState(position, forceReplace);
   }
 
-  _matchesReady(matches) {
-    const offset = this._offset;
-    const numMatches = matches.length;
-    const previous = this._state.findPrevious;
-
-    if (numMatches) {
-      offset.matchIdx = previous ? numMatches - 1 : 0;
-
-      this._updateMatch(true);
+  _isValidPage(val) {
+    return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount;
+  }
 
-      return true;
+  _isValidState(state, checkReload = false) {
+    if (!state) {
+      return false;
     }
 
-    this._advanceOffsetPage(previous);
-
-    if (offset.wrapped) {
-      offset.matchIdx = null;
+    if (state.fingerprint !== this._fingerprint) {
+      if (checkReload) {
+        if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) {
+          return false;
+        }
 
-      if (this._pagesToSearch < 0) {
-        this._updateMatch(false);
+        const [perfEntry] = performance.getEntriesByType("navigation");
 
-        return true;
+        if (perfEntry?.type !== "reload") {
+          return false;
+        }
+      } else {
+        return false;
       }
     }
 
-    return false;
-  }
+    if (!Number.isInteger(state.uid) || state.uid < 0) {
+      return false;
+    }
 
-  _nextPageMatch() {
-    if (this._resumePageIdx !== null) {
-      console.error("There can only be one pending page.");
+    if (state.destination === null || typeof state.destination !== "object") {
+      return false;
     }
 
-    let matches = null;
+    return true;
+  }
 
-    do {
-      const pageIdx = this._offset.pageIdx;
-      matches = this._pageMatches[pageIdx];
+  _updateInternalState(destination, uid, removeTemporary = false) {
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
+    }
 
-      if (!matches) {
-        this._resumePageIdx = pageIdx;
-        break;
-      }
-    } while (!this._matchesReady(matches));
+    if (removeTemporary && destination?.temporary) {
+      delete destination.temporary;
+    }
+
+    this._destination = destination;
+    this._uid = uid;
+    this._maxUid = Math.max(this._maxUid, uid);
+    this._numPositionUpdates = 0;
   }
 
-  _advanceOffsetPage(previous) {
-    const offset = this._offset;
-    const numPages = this._linkService.pagesCount;
-    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
-    offset.matchIdx = null;
-    this._pagesToSearch--;
+  _parseCurrentHash(checkNameddest = false) {
+    const hash = unescape(getCurrentHash()).substring(1);
+    const params = (0, _ui_utils.parseQueryString)(hash);
+    const nameddest = params.nameddest || "";
+    let page = params.page | 0;
 
-    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
-      offset.pageIdx = previous ? numPages - 1 : 0;
-      offset.wrapped = true;
+    if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) {
+      page = null;
     }
+
+    return {
+      hash,
+      page,
+      rotation: this.linkService.rotation
+    };
   }
 
-  _updateMatch(found = false) {
-    let state = FindState.NOT_FOUND;
-    const wrapped = this._offset.wrapped;
-    this._offset.wrapped = false;
+  _updateViewarea({
+    location
+  }) {
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
+    }
 
-    if (found) {
-      const previousPage = this._selected.pageIdx;
-      this._selected.pageIdx = this._offset.pageIdx;
-      this._selected.matchIdx = this._offset.matchIdx;
-      state = wrapped ? FindState.WRAPPED : FindState.FOUND;
+    this._position = {
+      hash: this._isViewerInPresentationMode ? `page=${location.pageNumber}` : 
location.pdfOpenParams.substring(1),
+      page: this.linkService.page,
+      first: location.pageNumber,
+      rotation: location.rotation
+    };
 
-      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
-        this._updatePage(previousPage);
-      }
+    if (this._popStateInProgress) {
+      return;
     }
 
-    this._updateUIState(state, this._state.findPrevious);
+    if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && 
!this._destination.page) {
+      this._numPositionUpdates++;
+    }
 
-    if (this._selected.pageIdx !== -1) {
-      this._scrollMatches = true;
+    if (UPDATE_VIEWAREA_TIMEOUT > 0) {
+      this._updateViewareaTimeout = setTimeout(() => {
+        if (!this._popStateInProgress) {
+          this._tryPushCurrentPosition(true);
+        }
 
-      this._updatePage(this._selected.pageIdx);
+        this._updateViewareaTimeout = null;
+      }, UPDATE_VIEWAREA_TIMEOUT);
     }
   }
 
-  _onFindBarClose(evt) {
-    const pdfDocument = this._pdfDocument;
+  _popState({
+    state
+  }) {
+    const newHash = getCurrentHash(),
+          hashChanged = this._currentHash !== newHash;
+    this._currentHash = newHash;
 
-    this._firstPageCapability.promise.then(() => {
-      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
-        return;
-      }
+    if (!state) {
+      this._uid++;
 
-      if (this._findTimeout) {
-        clearTimeout(this._findTimeout);
-        this._findTimeout = null;
-      }
+      const {
+        hash,
+        page,
+        rotation
+      } = this._parseCurrentHash();
 
-      if (this._resumePageIdx) {
-        this._resumePageIdx = null;
-        this._dirtyMatch = true;
-      }
+      this._pushOrReplaceState({
+        hash,
+        page,
+        rotation
+      }, true);
 
-      this._updateUIState(FindState.FOUND);
+      return;
+    }
 
-      this._highlightMatches = false;
+    if (!this._isValidState(state)) {
+      return;
+    }
 
-      this._updateAllPages();
-    });
-  }
+    this._popStateInProgress = true;
 
-  _requestMatchesCount() {
-    const {
-      pageIdx,
-      matchIdx
-    } = this._selected;
-    let current = 0,
-        total = this._matchesCountTotal;
+    if (hashChanged) {
+      this._blockHashChange++;
+      (0, _ui_utils.waitOnEventOrTimeout)({
+        target: window,
+        name: "hashchange",
+        delay: HASH_CHANGE_TIMEOUT
+      }).then(() => {
+        this._blockHashChange--;
+      });
+    }
 
-    if (matchIdx !== -1) {
-      for (let i = 0; i < pageIdx; i++) {
-        current += this._pageMatches[i] && this._pageMatches[i].length || 0;
-      }
+    const destination = state.destination;
 
-      current += matchIdx + 1;
-    }
+    this._updateInternalState(destination, state.uid, true);
 
-    if (current < 1 || current > total) {
-      current = total = 0;
+    if ((0, _ui_utils.isValidRotation)(destination.rotation)) {
+      this.linkService.rotation = destination.rotation;
     }
 
-    return {
-      current,
-      total
-    };
-  }
+    if (destination.dest) {
+      this.linkService.goToDestination(destination.dest);
+    } else if (destination.hash) {
+      this.linkService.setHash(destination.hash);
+    } else if (destination.page) {
+      this.linkService.page = destination.page;
+    }
 
-  _updateUIResultsCount() {
-    this._eventBus.dispatch("updatefindmatchescount", {
-      source: this,
-      matchesCount: this._requestMatchesCount()
+    Promise.resolve().then(() => {
+      this._popStateInProgress = false;
     });
   }
 
-  _updateUIState(state, previous) {
-    this._eventBus.dispatch("updatefindcontrolstate", {
-      source: this,
-      state,
-      previous,
-      matchesCount: this._requestMatchesCount(),
-      rawQuery: this._state ? this._state.query : null
-    });
+  _pageHide() {
+    if (!this._destination || this._destination.temporary) {
+      this._tryPushCurrentPosition();
+    }
   }
 
-}
+  _bindEvents() {
+    if (this._boundEvents) {
+      return;
+    }
 
-exports.PDFFindController = PDFFindController;
+    this._boundEvents = {
+      updateViewarea: this._updateViewarea.bind(this),
+      popState: this._popState.bind(this),
+      pageHide: this._pageHide.bind(this)
+    };
 
-/***/ }),
-/* 17 */
-/***/ (function(module, exports, __webpack_require__) {
+    this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea);
 
-"use strict";
+    window.addEventListener("popstate", this._boundEvents.popState);
+    window.addEventListener("pagehide", this._boundEvents.pageHide);
+  }
 
+  _unbindEvents() {
+    if (!this._boundEvents) {
+      return;
+    }
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getCharacterType = getCharacterType;
-exports.CharacterType = void 0;
-const CharacterType = {
-  SPACE: 0,
-  ALPHA_LETTER: 1,
-  PUNCT: 2,
-  HAN_LETTER: 3,
-  KATAKANA_LETTER: 4,
-  HIRAGANA_LETTER: 5,
-  HALFWIDTH_KATAKANA_LETTER: 6,
-  THAI_LETTER: 7
-};
-exports.CharacterType = CharacterType;
+    this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea);
 
-function isAlphabeticalScript(charCode) {
-  return charCode < 0x2e80;
-}
+    window.removeEventListener("popstate", this._boundEvents.popState);
+    window.removeEventListener("pagehide", this._boundEvents.pageHide);
+    this._boundEvents = null;
+  }
 
-function isAscii(charCode) {
-  return (charCode & 0xff80) === 0;
 }
 
-function isAsciiAlpha(charCode) {
-  return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;
-}
+exports.PDFHistory = PDFHistory;
 
-function isAsciiDigit(charCode) {
-  return charCode >= 0x30 && charCode <= 0x39;
-}
+function isDestHashesEqual(destHash, pushHash) {
+  if (typeof destHash !== "string" || typeof pushHash !== "string") {
+    return false;
+  }
 
-function isAsciiSpace(charCode) {
-  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;
-}
+  if (destHash === pushHash) {
+    return true;
+  }
 
-function isHan(charCode) {
-  return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;
-}
+  const {
+    nameddest
+  } = (0, _ui_utils.parseQueryString)(destHash);
 
-function isKatakana(charCode) {
-  return charCode >= 0x30a0 && charCode <= 0x30ff;
-}
+  if (nameddest === pushHash) {
+    return true;
+  }
 
-function isHiragana(charCode) {
-  return charCode >= 0x3040 && charCode <= 0x309f;
+  return false;
 }
 
-function isHalfwidthKatakana(charCode) {
-  return charCode >= 0xff60 && charCode <= 0xff9f;
-}
+function isDestArraysEqual(firstDest, secondDest) {
+  function isEntryEqual(first, second) {
+    if (typeof first !== typeof second) {
+      return false;
+    }
 
-function isThai(charCode) {
-  return (charCode & 0xff80) === 0x0e00;
-}
+    if (Array.isArray(first) || Array.isArray(second)) {
+      return false;
+    }
 
-function getCharacterType(charCode) {
-  if (isAlphabeticalScript(charCode)) {
-    if (isAscii(charCode)) {
-      if (isAsciiSpace(charCode)) {
-        return CharacterType.SPACE;
-      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {
-        return CharacterType.ALPHA_LETTER;
+    if (first !== null && typeof first === "object" && second !== null) {
+      if (Object.keys(first).length !== Object.keys(second).length) {
+        return false;
       }
 
-      return CharacterType.PUNCT;
-    } else if (isThai(charCode)) {
-      return CharacterType.THAI_LETTER;
-    } else if (charCode === 0xa0) {
-      return CharacterType.SPACE;
+      for (const key in first) {
+        if (!isEntryEqual(first[key], second[key])) {
+          return false;
+        }
+      }
+
+      return true;
     }
 
-    return CharacterType.ALPHA_LETTER;
+    return first === second || Number.isNaN(first) && Number.isNaN(second);
   }
 
-  if (isHan(charCode)) {
-    return CharacterType.HAN_LETTER;
-  } else if (isKatakana(charCode)) {
-    return CharacterType.KATAKANA_LETTER;
-  } else if (isHiragana(charCode)) {
-    return CharacterType.HIRAGANA_LETTER;
-  } else if (isHalfwidthKatakana(charCode)) {
-    return CharacterType.HALFWIDTH_KATAKANA_LETTER;
+  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
+    return false;
   }
 
-  return CharacterType.ALPHA_LETTER;
+  if (firstDest.length !== secondDest.length) {
+    return false;
+  }
+
+  for (let i = 0, ii = firstDest.length; i < ii; i++) {
+    if (!isEntryEqual(firstDest[i], secondDest[i])) {
+      return false;
+    }
+  }
+
+  return true;
 }
 
 /***/ }),
 /* 18 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.isDestHashesEqual = isDestHashesEqual;
-exports.isDestArraysEqual = isDestArraysEqual;
-exports.PDFHistory = void 0;
-
-var _ui_utils = __webpack_require__(2);
-
-const HASH_CHANGE_TIMEOUT = 1000;
-const POSITION_UPDATED_THRESHOLD = 50;
-const UPDATE_VIEWAREA_TIMEOUT = 1000;
-
-function getCurrentHash() {
-  return document.location.hash;
-}
+}));
+exports.PDFLayerViewer = void 0;
 
-class PDFHistory {
-  constructor({
-    linkService,
-    eventBus
-  }) {
-    this.linkService = linkService;
-    this.eventBus = eventBus;
-    this._initialized = false;
-    this._fingerprint = "";
-    this.reset();
-    this._boundEvents = null;
-    this._isViewerInPresentationMode = false;
+var _base_tree_viewer = __webpack_require__(12);
 
-    this.eventBus._on("presentationmodechanged", evt => {
-      this._isViewerInPresentationMode = evt.active || evt.switchInProgress;
-    });
+class PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer {
+  constructor(options) {
+    super(options);
+    this.l10n = options.l10n;
 
-    this.eventBus._on("pagesinit", () => {
-      this._isPagesLoaded = false;
+    this.eventBus._on("resetlayers", this._resetLayers.bind(this));
 
-      const onPagesLoaded = evt => {
-        this.eventBus._off("pagesloaded", onPagesLoaded);
+    this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this));
+  }
 
-        this._isPagesLoaded = !!evt.pagesCount;
-      };
+  reset() {
+    super.reset();
+    this._optionalContentConfig = null;
+  }
 
-      this.eventBus._on("pagesloaded", onPagesLoaded);
+  _dispatchEvent(layersCount) {
+    this.eventBus.dispatch("layersloaded", {
+      source: this,
+      layersCount
     });
   }
 
-  initialize({
-    fingerprint,
-    resetHistory = false,
-    updateUrl = false
+  _bindLink(element, {
+    groupId,
+    input
   }) {
-    if (!fingerprint || typeof fingerprint !== "string") {
-      console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
-      return;
-    }
-
-    if (this._initialized) {
-      this.reset();
-    }
-
-    const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint;
-    this._fingerprint = fingerprint;
-    this._updateUrl = updateUrl === true;
-    this._initialized = true;
-
-    this._bindEvents();
-
-    const state = window.history.state;
-    this._popStateInProgress = false;
-    this._blockHashChange = 0;
-    this._currentHash = getCurrentHash();
-    this._numPositionUpdates = 0;
-    this._uid = this._maxUid = 0;
-    this._destination = null;
-    this._position = null;
-
-    if (!this._isValidState(state, true) || resetHistory) {
-      const {
-        hash,
-        page,
-        rotation
-      } = this._parseCurrentHash(true);
+    const setVisibility = () => {
+      this._optionalContentConfig.setVisibility(groupId, input.checked);
 
-      if (!hash || reInitialized || resetHistory) {
-        this._pushOrReplaceState(null, true);
+      this.eventBus.dispatch("optionalcontentconfig", {
+        source: this,
+        promise: Promise.resolve(this._optionalContentConfig)
+      });
+    };
 
-        return;
+    element.onclick = evt => {
+      if (evt.target === input) {
+        setVisibility();
+        return true;
+      } else if (evt.target !== element) {
+        return true;
       }
 
-      this._pushOrReplaceState({
-        hash,
-        page,
-        rotation
-      }, true);
+      input.checked = !input.checked;
+      setVisibility();
+      return false;
+    };
+  }
 
+  async _setNestedName(element, {
+    name = null
+  }) {
+    if (typeof name === "string") {
+      element.textContent = this._normalizeTextContent(name);
       return;
     }
 
-    const destination = state.destination;
+    element.textContent = await this.l10n.get("additional_layers");
+    element.style.fontStyle = "italic";
+  }
 
-    this._updateInternalState(destination, state.uid, true);
+  _addToggleButton(div, {
+    name = null
+  }) {
+    super._addToggleButton(div, name === null);
+  }
 
-    if (this._uid > this._maxUid) {
-      this._maxUid = this._uid;
+  _toggleAllTreeItems() {
+    if (!this._optionalContentConfig) {
+      return;
     }
 
-    if (destination.rotation !== undefined) {
-      this._initialRotation = destination.rotation;
-    }
+    super._toggleAllTreeItems();
+  }
 
-    if (destination.dest) {
-      this._initialBookmark = JSON.stringify(destination.dest);
-      this._destination.page = null;
-    } else if (destination.hash) {
-      this._initialBookmark = destination.hash;
-    } else if (destination.page) {
-      this._initialBookmark = `page=${destination.page}`;
+  render({
+    optionalContentConfig,
+    pdfDocument
+  }) {
+    if (this._optionalContentConfig) {
+      this.reset();
     }
-  }
 
-  reset() {
-    if (this._initialized) {
-      this._pageHide();
+    this._optionalContentConfig = optionalContentConfig || null;
+    this._pdfDocument = pdfDocument || null;
+    const groups = optionalContentConfig?.getOrder();
 
-      this._initialized = false;
+    if (!groups) {
+      this._dispatchEvent(0);
 
-      this._unbindEvents();
+      return;
     }
 
-    if (this._updateViewareaTimeout) {
-      clearTimeout(this._updateViewareaTimeout);
-      this._updateViewareaTimeout = null;
-    }
+    const fragment = document.createDocumentFragment(),
+          queue = [{
+      parent: fragment,
+      groups
+    }];
+    let layersCount = 0,
+        hasAnyNesting = false;
 
-    this._initialBookmark = null;
-    this._initialRotation = null;
-  }
+    while (queue.length > 0) {
+      const levelData = queue.shift();
 
-  push({
-    namedDest = null,
-    explicitDest,
-    pageNumber
-  }) {
-    if (!this._initialized) {
-      return;
-    }
+      for (const groupId of levelData.groups) {
+        const div = document.createElement("div");
+        div.className = "treeItem";
+        const element = document.createElement("a");
+        div.appendChild(element);
 
-    if (namedDest && typeof namedDest !== "string") {
-      console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`);
-      return;
-    } else if (!Array.isArray(explicitDest)) {
-      console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`);
-      return;
-    } else if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= 
this.linkService.pagesCount)) {
-      if (pageNumber !== null || this._destination) {
-        console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`);
-        return;
-      }
-    }
+        if (typeof groupId === "object") {
+          hasAnyNesting = true;
 
-    const hash = namedDest || JSON.stringify(explicitDest);
+          this._addToggleButton(div, groupId);
 
-    if (!hash) {
-      return;
-    }
+          this._setNestedName(element, groupId);
 
-    let forceReplace = false;
+          const itemsDiv = document.createElement("div");
+          itemsDiv.className = "treeItems";
+          div.appendChild(itemsDiv);
+          queue.push({
+            parent: itemsDiv,
+            groups: groupId.order
+          });
+        } else {
+          const group = optionalContentConfig.getGroup(groupId);
+          const input = document.createElement("input");
+
+          this._bindLink(element, {
+            groupId,
+            input
+          });
+
+          input.type = "checkbox";
+          input.id = groupId;
+          input.checked = group.visible;
+          const label = document.createElement("label");
+          label.setAttribute("for", groupId);
+          label.textContent = this._normalizeTextContent(group.name);
+          element.appendChild(input);
+          element.appendChild(label);
+          layersCount++;
+        }
 
-    if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || 
isDestArraysEqual(this._destination.dest, explicitDest))) {
-      if (this._destination.page) {
-        return;
+        levelData.parent.appendChild(div);
       }
-
-      forceReplace = true;
-    }
-
-    if (this._popStateInProgress && !forceReplace) {
-      return;
     }
 
-    this._pushOrReplaceState({
-      dest: explicitDest,
-      hash,
-      page: pageNumber,
-      rotation: this.linkService.rotation
-    }, forceReplace);
-
-    if (!this._popStateInProgress) {
-      this._popStateInProgress = true;
-      Promise.resolve().then(() => {
-        this._popStateInProgress = false;
-      });
-    }
+    this._finishRendering(fragment, layersCount, hasAnyNesting);
   }
 
-  pushCurrentPosition() {
-    if (!this._initialized || this._popStateInProgress) {
+  async _resetLayers() {
+    if (!this._optionalContentConfig) {
       return;
     }
 
-    this._tryPushCurrentPosition();
+    const optionalContentConfig = await this._pdfDocument.getOptionalContentConfig();
+    this.eventBus.dispatch("optionalcontentconfig", {
+      source: this,
+      promise: Promise.resolve(optionalContentConfig)
+    });
+    this.render({
+      optionalContentConfig,
+      pdfDocument: this._pdfDocument
+    });
   }
 
-  back() {
-    if (!this._initialized || this._popStateInProgress) {
-      return;
-    }
+}
 
-    const state = window.history.state;
+exports.PDFLayerViewer = PDFLayerViewer;
 
-    if (this._isValidState(state) && state.uid > 0) {
-      window.history.back();
-    }
+/***/ }),
+/* 19 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.SimpleLinkService = exports.PDFLinkService = void 0;
+
+var _ui_utils = __webpack_require__(4);
+
+class PDFLinkService {
+  constructor({
+    eventBus,
+    externalLinkTarget = null,
+    externalLinkRel = null,
+    ignoreDestinationZoom = false
+  } = {}) {
+    this.eventBus = eventBus;
+    this.externalLinkTarget = externalLinkTarget;
+    this.externalLinkRel = externalLinkRel;
+    this.externalLinkEnabled = true;
+    this._ignoreDestinationZoom = ignoreDestinationZoom;
+    this.baseUrl = null;
+    this.pdfDocument = null;
+    this.pdfViewer = null;
+    this.pdfHistory = null;
+    this._pagesRefCache = null;
   }
 
-  forward() {
-    if (!this._initialized || this._popStateInProgress) {
-      return;
-    }
+  setDocument(pdfDocument, baseUrl = null) {
+    this.baseUrl = baseUrl;
+    this.pdfDocument = pdfDocument;
+    this._pagesRefCache = Object.create(null);
+  }
 
-    const state = window.history.state;
+  setViewer(pdfViewer) {
+    this.pdfViewer = pdfViewer;
+  }
 
-    if (this._isValidState(state) && state.uid < this._maxUid) {
-      window.history.forward();
-    }
+  setHistory(pdfHistory) {
+    this.pdfHistory = pdfHistory;
   }
 
-  get popStateInProgress() {
-    return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);
+  get pagesCount() {
+    return this.pdfDocument ? this.pdfDocument.numPages : 0;
   }
 
-  get initialBookmark() {
-    return this._initialized ? this._initialBookmark : null;
+  get page() {
+    return this.pdfViewer.currentPageNumber;
   }
 
-  get initialRotation() {
-    return this._initialized ? this._initialRotation : null;
+  set page(value) {
+    this.pdfViewer.currentPageNumber = value;
   }
 
-  _pushOrReplaceState(destination, forceReplace = false) {
-    const shouldReplace = forceReplace || !this._destination;
-    const newState = {
-      fingerprint: this._fingerprint,
-      uid: shouldReplace ? this._uid : this._uid + 1,
-      destination
-    };
+  get rotation() {
+    return this.pdfViewer.pagesRotation;
+  }
 
-    this._updateInternalState(destination, newState.uid);
+  set rotation(value) {
+    this.pdfViewer.pagesRotation = value;
+  }
 
-    let newUrl;
+  _goToDestinationHelper(rawDest, namedDest = null, explicitDest) {
+    const destRef = explicitDest[0];
+    let pageNumber;
 
-    if (this._updateUrl && destination && destination.hash) {
-      const baseUrl = document.location.href.split("#")[0];
+    if (typeof destRef === "object" && destRef !== null) {
+      pageNumber = this._cachedPageNumber(destRef);
 
-      if (!baseUrl.startsWith("file://")) {
-        newUrl = `${baseUrl}#${destination.hash}`;
+      if (pageNumber === null) {
+        this.pdfDocument.getPageIndex(destRef).then(pageIndex => {
+          this.cachePageRef(pageIndex + 1, destRef);
+
+          this._goToDestinationHelper(rawDest, namedDest, explicitDest);
+        }).catch(() => {
+          console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid page 
reference, for dest="${rawDest}".`);
+        });
+        return;
       }
+    } else if (Number.isInteger(destRef)) {
+      pageNumber = destRef + 1;
+    } else {
+      console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid destination 
reference, for dest="${rawDest}".`);
+      return;
     }
 
-    // FIXME: This currently breaks Epiphany due to rewriting history with baseUrl
-    return;
-    if (shouldReplace) {
-      window.history.replaceState(newState, "", newUrl);
-    } else {
-      this._maxUid = this._uid;
-      window.history.pushState(newState, "", newUrl);
+    if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {
+      console.error(`PDFLinkService._goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, 
for dest="${rawDest}".`);
+      return;
+    }
+
+    if (this.pdfHistory) {
+      this.pdfHistory.pushCurrentPosition();
+      this.pdfHistory.push({
+        namedDest,
+        explicitDest,
+        pageNumber
+      });
     }
+
+    this.pdfViewer.scrollPageIntoView({
+      pageNumber,
+      destArray: explicitDest,
+      ignoreDestinationZoom: this._ignoreDestinationZoom
+    });
   }
 
-  _tryPushCurrentPosition(temporary = false) {
-    if (!this._position) {
+  async goToDestination(dest) {
+    if (!this.pdfDocument) {
       return;
     }
 
-    let position = this._position;
+    let namedDest, explicitDest;
 
-    if (temporary) {
-      position = Object.assign(Object.create(null), this._position);
-      position.temporary = true;
+    if (typeof dest === "string") {
+      namedDest = dest;
+      explicitDest = await this.pdfDocument.getDestination(dest);
+    } else {
+      namedDest = null;
+      explicitDest = await dest;
     }
 
-    if (!this._destination) {
-      this._pushOrReplaceState(position);
-
+    if (!Array.isArray(explicitDest)) {
+      console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination 
array, for dest="${dest}".`);
       return;
     }
 
-    if (this._destination.temporary) {
-      this._pushOrReplaceState(position, true);
+    this._goToDestinationHelper(dest, namedDest, explicitDest);
+  }
 
+  goToPage(val) {
+    if (!this.pdfDocument) {
       return;
     }
 
-    if (this._destination.hash === position.hash) {
+    const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0;
+
+    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
+      console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`);
       return;
     }
 
-    if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= 
POSITION_UPDATED_THRESHOLD)) {
-      return;
+    if (this.pdfHistory) {
+      this.pdfHistory.pushCurrentPosition();
+      this.pdfHistory.pushPage(pageNumber);
     }
 
-    let forceReplace = false;
+    this.pdfViewer.scrollPageIntoView({
+      pageNumber
+    });
+  }
 
-    if (this._destination.page >= position.first && this._destination.page <= position.page) {
-      if (this._destination.dest || !this._destination.first) {
-        return;
+  getDestinationHash(dest) {
+    if (typeof dest === "string") {
+      if (dest.length > 0) {
+        return this.getAnchorUrl("#" + escape(dest));
       }
+    } else if (Array.isArray(dest)) {
+      const str = JSON.stringify(dest);
 
-      forceReplace = true;
+      if (str.length > 0) {
+        return this.getAnchorUrl("#" + escape(str));
+      }
     }
 
-    this._pushOrReplaceState(position, forceReplace);
+    return this.getAnchorUrl("");
   }
 
-  _isValidState(state, checkReload = false) {
-    if (!state) {
-      return false;
+  getAnchorUrl(anchor) {
+    return (this.baseUrl || "") + anchor;
+  }
+
+  setHash(hash) {
+    if (!this.pdfDocument) {
+      return;
     }
 
-    if (state.fingerprint !== this._fingerprint) {
-      if (checkReload) {
-        if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) {
-          return false;
+    let pageNumber, dest;
+
+    if (hash.includes("=")) {
+      const params = (0, _ui_utils.parseQueryString)(hash);
+
+      if ("search" in params) {
+        this.eventBus.dispatch("findfromurlhash", {
+          source: this,
+          query: params.search.replace(/"/g, ""),
+          phraseSearch: params.phrase === "true"
+        });
+      }
+
+      if ("page" in params) {
+        pageNumber = params.page | 0 || 1;
+      }
+
+      if ("zoom" in params) {
+        const zoomArgs = params.zoom.split(",");
+        const zoomArg = zoomArgs[0];
+        const zoomArgNumber = parseFloat(zoomArg);
+
+        if (!zoomArg.includes("Fit")) {
+          dest = [null, {
+            name: "XYZ"
+          }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, 
zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
+        } else {
+          if (zoomArg === "Fit" || zoomArg === "FitB") {
+            dest = [null, {
+              name: zoomArg
+            }];
+          } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") 
{
+            dest = [null, {
+              name: zoomArg
+            }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
+          } else if (zoomArg === "FitR") {
+            if (zoomArgs.length !== 5) {
+              console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
+            } else {
+              dest = [null, {
+                name: zoomArg
+              }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
+            }
+          } else {
+            console.error(`PDFLinkService.setHash: "${zoomArg}" is not ` + "a valid zoom value.");
+          }
         }
+      }
+
+      if (dest) {
+        this.pdfViewer.scrollPageIntoView({
+          pageNumber: pageNumber || this.page,
+          destArray: dest,
+          allowNegativeOffset: true
+        });
+      } else if (pageNumber) {
+        this.page = pageNumber;
+      }
+
+      if ("pagemode" in params) {
+        this.eventBus.dispatch("pagemode", {
+          source: this,
+          mode: params.pagemode
+        });
+      }
+
+      if ("nameddest" in params) {
+        this.goToDestination(params.nameddest);
+      }
+    } else {
+      dest = unescape(hash);
 
-        const [perfEntry] = performance.getEntriesByType("navigation");
+      try {
+        dest = JSON.parse(dest);
 
-        if (!perfEntry || perfEntry.type !== "reload") {
-          return false;
+        if (!Array.isArray(dest)) {
+          dest = dest.toString();
         }
-      } else {
-        return false;
+      } catch (ex) {}
+
+      if (typeof dest === "string" || isValidExplicitDestination(dest)) {
+        this.goToDestination(dest);
+        return;
       }
-    }
 
-    if (!Number.isInteger(state.uid) || state.uid < 0) {
-      return false;
+      console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not ` + "a valid destination.");
     }
+  }
 
-    if (state.destination === null || typeof state.destination !== "object") {
-      return false;
-    }
+  executeNamedAction(action) {
+    switch (action) {
+      case "GoBack":
+        if (this.pdfHistory) {
+          this.pdfHistory.back();
+        }
 
-    return true;
-  }
+        break;
 
-  _updateInternalState(destination, uid, removeTemporary = false) {
-    if (this._updateViewareaTimeout) {
-      clearTimeout(this._updateViewareaTimeout);
-      this._updateViewareaTimeout = null;
-    }
+      case "GoForward":
+        if (this.pdfHistory) {
+          this.pdfHistory.forward();
+        }
 
-    if (removeTemporary && destination && destination.temporary) {
-      delete destination.temporary;
-    }
+        break;
 
-    this._destination = destination;
-    this._uid = uid;
-    this._numPositionUpdates = 0;
-  }
+      case "NextPage":
+        this.pdfViewer.nextPage();
+        break;
 
-  _parseCurrentHash(checkNameddest = false) {
-    const hash = unescape(getCurrentHash()).substring(1);
-    const params = (0, _ui_utils.parseQueryString)(hash);
-    const nameddest = params.nameddest || "";
-    let page = params.page | 0;
+      case "PrevPage":
+        this.pdfViewer.previousPage();
+        break;
 
-    if (!(Number.isInteger(page) && page > 0 && page <= this.linkService.pagesCount) || checkNameddest && 
nameddest.length > 0) {
-      page = null;
-    }
+      case "LastPage":
+        this.page = this.pagesCount;
+        break;
 
-    return {
-      hash,
-      page,
-      rotation: this.linkService.rotation
-    };
-  }
+      case "FirstPage":
+        this.page = 1;
+        break;
 
-  _updateViewarea({
-    location
-  }) {
-    if (this._updateViewareaTimeout) {
-      clearTimeout(this._updateViewareaTimeout);
-      this._updateViewareaTimeout = null;
+      default:
+        break;
     }
 
-    this._position = {
-      hash: this._isViewerInPresentationMode ? `page=${location.pageNumber}` : 
location.pdfOpenParams.substring(1),
-      page: this.linkService.page,
-      first: location.pageNumber,
-      rotation: location.rotation
-    };
+    this.eventBus.dispatch("namedaction", {
+      source: this,
+      action
+    });
+  }
 
-    if (this._popStateInProgress) {
+  cachePageRef(pageNum, pageRef) {
+    if (!pageRef) {
       return;
     }
 
-    if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && 
!this._destination.page) {
-      this._numPositionUpdates++;
-    }
+    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
+    this._pagesRefCache[refStr] = pageNum;
+  }
 
-    if (UPDATE_VIEWAREA_TIMEOUT > 0) {
-      this._updateViewareaTimeout = setTimeout(() => {
-        if (!this._popStateInProgress) {
-          this._tryPushCurrentPosition(true);
-        }
+  _cachedPageNumber(pageRef) {
+    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
+    return this._pagesRefCache?.[refStr] || null;
+  }
 
-        this._updateViewareaTimeout = null;
-      }, UPDATE_VIEWAREA_TIMEOUT);
-    }
+  isPageVisible(pageNumber) {
+    return this.pdfViewer.isPageVisible(pageNumber);
   }
 
-  _popState({
-    state
-  }) {
-    const newHash = getCurrentHash(),
-          hashChanged = this._currentHash !== newHash;
-    this._currentHash = newHash;
+  isPageCached(pageNumber) {
+    return this.pdfViewer.isPageCached(pageNumber);
+  }
 
-    if (!state) {
-      this._uid++;
+}
 
-      const {
-        hash,
-        page,
-        rotation
-      } = this._parseCurrentHash();
+exports.PDFLinkService = PDFLinkService;
 
-      this._pushOrReplaceState({
-        hash,
-        page,
-        rotation
-      }, true);
+function isValidExplicitDestination(dest) {
+  if (!Array.isArray(dest)) {
+    return false;
+  }
 
-      return;
-    }
+  const destLength = dest.length;
 
-    if (!this._isValidState(state)) {
-      return;
-    }
+  if (destLength < 2) {
+    return false;
+  }
 
-    this._popStateInProgress = true;
+  const page = dest[0];
 
-    if (hashChanged) {
-      this._blockHashChange++;
-      (0, _ui_utils.waitOnEventOrTimeout)({
-        target: window,
-        name: "hashchange",
-        delay: HASH_CHANGE_TIMEOUT
-      }).then(() => {
-        this._blockHashChange--;
-      });
-    }
+  if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && 
!(Number.isInteger(page) && page >= 0)) {
+    return false;
+  }
 
-    const destination = state.destination;
+  const zoom = dest[1];
 
-    this._updateInternalState(destination, state.uid, true);
+  if (!(typeof zoom === "object" && typeof zoom.name === "string")) {
+    return false;
+  }
 
-    if (this._uid > this._maxUid) {
-      this._maxUid = this._uid;
-    }
+  let allowNull = true;
 
-    if ((0, _ui_utils.isValidRotation)(destination.rotation)) {
-      this.linkService.rotation = destination.rotation;
-    }
+  switch (zoom.name) {
+    case "XYZ":
+      if (destLength !== 5) {
+        return false;
+      }
 
-    if (destination.dest) {
-      this.linkService.navigateTo(destination.dest);
-    } else if (destination.hash) {
-      this.linkService.setHash(destination.hash);
-    } else if (destination.page) {
-      this.linkService.page = destination.page;
-    }
+      break;
 
-    Promise.resolve().then(() => {
-      this._popStateInProgress = false;
-    });
-  }
+    case "Fit":
+    case "FitB":
+      return destLength === 2;
 
-  _pageHide() {
-    if (!this._destination || this._destination.temporary) {
-      this._tryPushCurrentPosition();
-    }
-  }
+    case "FitH":
+    case "FitBH":
+    case "FitV":
+    case "FitBV":
+      if (destLength !== 3) {
+        return false;
+      }
 
-  _bindEvents() {
-    if (this._boundEvents) {
-      return;
-    }
+      break;
 
-    this._boundEvents = {
-      updateViewarea: this._updateViewarea.bind(this),
-      popState: this._popState.bind(this),
-      pageHide: this._pageHide.bind(this)
-    };
+    case "FitR":
+      if (destLength !== 6) {
+        return false;
+      }
 
-    this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea);
+      allowNull = false;
+      break;
 
-    window.addEventListener("popstate", this._boundEvents.popState);
-    window.addEventListener("pagehide", this._boundEvents.pageHide);
+    default:
+      return false;
   }
 
-  _unbindEvents() {
-    if (!this._boundEvents) {
-      return;
-    }
-
-    this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea);
+  for (let i = 2; i < destLength; i++) {
+    const param = dest[i];
 
-    window.removeEventListener("popstate", this._boundEvents.popState);
-    window.removeEventListener("pagehide", this._boundEvents.pageHide);
-    this._boundEvents = null;
+    if (!(typeof param === "number" || allowNull && param === null)) {
+      return false;
+    }
   }
 
+  return true;
 }
 
-exports.PDFHistory = PDFHistory;
+class SimpleLinkService {
+  constructor() {
+    this.externalLinkTarget = null;
+    this.externalLinkRel = null;
+    this.externalLinkEnabled = true;
+    this._ignoreDestinationZoom = false;
+  }
 
-function isDestHashesEqual(destHash, pushHash) {
-  if (typeof destHash !== "string" || typeof pushHash !== "string") {
-    return false;
+  get pagesCount() {
+    return 0;
   }
 
-  if (destHash === pushHash) {
-    return true;
+  get page() {
+    return 0;
   }
 
-  const {
-    nameddest
-  } = (0, _ui_utils.parseQueryString)(destHash);
+  set page(value) {}
 
-  if (nameddest === pushHash) {
-    return true;
+  get rotation() {
+    return 0;
   }
 
-  return false;
-}
+  set rotation(value) {}
 
-function isDestArraysEqual(firstDest, secondDest) {
-  function isEntryEqual(first, second) {
-    if (typeof first !== typeof second) {
-      return false;
-    }
+  async goToDestination(dest) {}
 
-    if (Array.isArray(first) || Array.isArray(second)) {
-      return false;
-    }
+  goToPage(val) {}
 
-    if (first !== null && typeof first === "object" && second !== null) {
-      if (Object.keys(first).length !== Object.keys(second).length) {
-        return false;
-      }
+  getDestinationHash(dest) {
+    return "#";
+  }
 
-      for (const key in first) {
-        if (!isEntryEqual(first[key], second[key])) {
-          return false;
-        }
-      }
+  getAnchorUrl(hash) {
+    return "#";
+  }
 
-      return true;
-    }
+  setHash(hash) {}
 
-    return first === second || Number.isNaN(first) && Number.isNaN(second);
-  }
+  executeNamedAction(action) {}
 
-  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
-    return false;
-  }
+  cachePageRef(pageNum, pageRef) {}
 
-  if (firstDest.length !== secondDest.length) {
-    return false;
+  isPageVisible(pageNumber) {
+    return true;
   }
 
-  for (let i = 0, ii = firstDest.length; i < ii; i++) {
-    if (!isEntryEqual(firstDest[i], secondDest[i])) {
-      return false;
-    }
+  isPageCached(pageNumber) {
+    return true;
   }
 
-  return true;
 }
 
+exports.SimpleLinkService = SimpleLinkService;
+
 /***/ }),
-/* 19 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 20 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFLayerViewer = void 0;
+}));
+exports.PDFOutlineViewer = void 0;
 
-var _base_tree_viewer = __webpack_require__(13);
+var _pdfjsLib = __webpack_require__(5);
 
-class PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer {
+var _base_tree_viewer = __webpack_require__(12);
+
+var _ui_utils = __webpack_require__(4);
+
+class PDFOutlineViewer extends _base_tree_viewer.BaseTreeViewer {
   constructor(options) {
     super(options);
-    this.l10n = options.l10n;
+    this.linkService = options.linkService;
 
-    this.eventBus._on("resetlayers", this._resetLayers.bind(this));
+    this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this));
 
-    this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this));
+    this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this));
+
+    this.eventBus._on("pagechanging", evt => {
+      this._currentPageNumber = evt.pageNumber;
+    });
+
+    this.eventBus._on("pagesloaded", evt => {
+      this._isPagesLoaded = !!evt.pagesCount;
+
+      if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) {
+        this._currentOutlineItemCapability.resolve(this._isPagesLoaded);
+      }
+    });
+
+    this.eventBus._on("sidebarviewchanged", evt => {
+      this._sidebarView = evt.view;
+    });
   }
 
   reset() {
     super.reset();
-    this._optionalContentConfig = null;
-    this._pdfDocument = null;
+    this._outline = null;
+    this._pageNumberToDestHashCapability = null;
+    this._currentPageNumber = 1;
+    this._isPagesLoaded = false;
+
+    if (this._currentOutlineItemCapability && !this._currentOutlineItemCapability.settled) {
+      this._currentOutlineItemCapability.resolve(false);
+    }
+
+    this._currentOutlineItemCapability = null;
   }
 
-  _dispatchEvent(layersCount) {
-    this.eventBus.dispatch("layersloaded", {
+  _dispatchEvent(outlineCount) {
+    this._currentOutlineItemCapability = (0, _pdfjsLib.createPromiseCapability)();
+
+    if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) {
+      this._currentOutlineItemCapability.resolve(false);
+    } else if (this._isPagesLoaded) {
+      this._currentOutlineItemCapability.resolve(true);
+    }
+
+    this.eventBus.dispatch("outlineloaded", {
       source: this,
-      layersCount
+      outlineCount,
+      currentOutlineItemPromise: this._currentOutlineItemCapability.promise
     });
   }
 
   _bindLink(element, {
-    groupId,
-    input
+    url,
+    newWindow,
+    dest
   }) {
-    const setVisibility = () => {
-      this._optionalContentConfig.setVisibility(groupId, input.checked);
+    const {
+      linkService
+    } = this;
 
-      this.eventBus.dispatch("optionalcontentconfig", {
-        source: this,
-        promise: Promise.resolve(this._optionalContentConfig)
+    if (url) {
+      (0, _pdfjsLib.addLinkAttributes)(element, {
+        url,
+        target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,
+        rel: linkService.externalLinkRel,
+        enabled: linkService.externalLinkEnabled
       });
-    };
+      return;
+    }
+
+    element.href = linkService.getDestinationHash(dest);
 
     element.onclick = evt => {
-      if (evt.target === input) {
-        setVisibility();
-        return true;
-      } else if (evt.target !== element) {
-        return true;
+      this._updateCurrentTreeItem(evt.target.parentNode);
+
+      if (dest) {
+        linkService.goToDestination(dest);
       }
 
-      input.checked = !input.checked;
-      setVisibility();
       return false;
     };
   }
 
-  async _setNestedName(element, {
-    name = null
+  _setStyles(element, {
+    bold,
+    italic
   }) {
-    if (typeof name === "string") {
-      element.textContent = this._normalizeTextContent(name);
-      return;
+    if (bold) {
+      element.style.fontWeight = "bold";
     }
 
-    element.textContent = await this.l10n.get("additional_layers", null, "Additional Layers");
-    element.style.fontStyle = "italic";
+    if (italic) {
+      element.style.fontStyle = "italic";
+    }
   }
 
   _addToggleButton(div, {
-    name = null
+    count,
+    items
   }) {
-    super._addToggleButton(div, name === null);
+    let hidden = false;
+
+    if (count < 0) {
+      let totalCount = items.length;
+
+      if (totalCount > 0) {
+        const queue = [...items];
+
+        while (queue.length > 0) {
+          const {
+            count: nestedCount,
+            items: nestedItems
+          } = queue.shift();
+
+          if (nestedCount > 0 && nestedItems.length > 0) {
+            totalCount += nestedItems.length;
+            queue.push(...nestedItems);
+          }
+        }
+      }
+
+      if (Math.abs(count) === totalCount) {
+        hidden = true;
+      }
+    }
+
+    super._addToggleButton(div, hidden);
   }
 
   _toggleAllTreeItems() {
-    if (!this._optionalContentConfig) {
+    if (!this._outline) {
       return;
     }
 
@@ -7297,1144 +7516,1369 @@ class PDFLayerViewer extends _base_tree_viewer.BaseTreeViewer {
   }
 
   render({
-    optionalContentConfig,
+    outline,
     pdfDocument
   }) {
-    if (this._optionalContentConfig) {
+    if (this._outline) {
       this.reset();
     }
 
-    this._optionalContentConfig = optionalContentConfig || null;
+    this._outline = outline || null;
     this._pdfDocument = pdfDocument || null;
-    const groups = optionalContentConfig && optionalContentConfig.getOrder();
 
-    if (!groups) {
+    if (!outline) {
       this._dispatchEvent(0);
 
       return;
     }
 
-    const fragment = document.createDocumentFragment(),
-          queue = [{
+    const fragment = document.createDocumentFragment();
+    const queue = [{
       parent: fragment,
-      groups
+      items: outline
     }];
-    let layersCount = 0,
+    let outlineCount = 0,
         hasAnyNesting = false;
 
     while (queue.length > 0) {
       const levelData = queue.shift();
 
-      for (const groupId of levelData.groups) {
+      for (const item of levelData.items) {
         const div = document.createElement("div");
         div.className = "treeItem";
         const element = document.createElement("a");
+
+        this._bindLink(element, item);
+
+        this._setStyles(element, item);
+
+        element.textContent = this._normalizeTextContent(item.title);
         div.appendChild(element);
 
-        if (typeof groupId === "object") {
+        if (item.items.length > 0) {
           hasAnyNesting = true;
 
-          this._addToggleButton(div, groupId);
-
-          this._setNestedName(element, groupId);
+          this._addToggleButton(div, item);
 
           const itemsDiv = document.createElement("div");
           itemsDiv.className = "treeItems";
           div.appendChild(itemsDiv);
           queue.push({
             parent: itemsDiv,
-            groups: groupId.order
-          });
-        } else {
-          const group = optionalContentConfig.getGroup(groupId);
-          const input = document.createElement("input");
-
-          this._bindLink(element, {
-            groupId,
-            input
+            items: item.items
           });
-
-          input.type = "checkbox";
-          input.id = groupId;
-          input.checked = group.visible;
-          const label = document.createElement("label");
-          label.setAttribute("for", groupId);
-          label.textContent = this._normalizeTextContent(group.name);
-          element.appendChild(input);
-          element.appendChild(label);
-          layersCount++;
         }
 
         levelData.parent.appendChild(div);
+        outlineCount++;
       }
     }
 
-    if (hasAnyNesting) {
-      this.container.classList.add("treeWithDeepNesting");
-      this._lastToggleIsShow = fragment.querySelectorAll(".treeItemsHidden").length === 0;
+    this._finishRendering(fragment, outlineCount, hasAnyNesting);
+  }
+
+  async _currentOutlineItem() {
+    if (!this._isPagesLoaded) {
+      throw new Error("_currentOutlineItem: All pages have not been loaded.");
+    }
+
+    if (!this._outline || !this._pdfDocument) {
+      return;
+    }
+
+    const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument);
+
+    if (!pageNumberToDestHash) {
+      return;
+    }
+
+    this._updateCurrentTreeItem(null);
+
+    if (this._sidebarView !== _ui_utils.SidebarView.OUTLINE) {
+      return;
+    }
+
+    for (let i = this._currentPageNumber; i > 0; i--) {
+      const destHash = pageNumberToDestHash.get(i);
+
+      if (!destHash) {
+        continue;
+      }
+
+      const linkElement = this.container.querySelector(`a[href="${destHash}"]`);
+
+      if (!linkElement) {
+        continue;
+      }
+
+      this._scrollToCurrentTreeItem(linkElement.parentNode);
+
+      break;
+    }
+  }
+
+  async _getPageNumberToDestHash(pdfDocument) {
+    if (this._pageNumberToDestHashCapability) {
+      return this._pageNumberToDestHashCapability.promise;
     }
 
-    this.container.appendChild(fragment);
+    this._pageNumberToDestHashCapability = (0, _pdfjsLib.createPromiseCapability)();
+    const pageNumberToDestHash = new Map(),
+          pageNumberNesting = new Map();
+    const queue = [{
+      nesting: 0,
+      items: this._outline
+    }];
+
+    while (queue.length > 0) {
+      const levelData = queue.shift(),
+            currentNesting = levelData.nesting;
+
+      for (const {
+        dest,
+        items
+      } of levelData.items) {
+        let explicitDest, pageNumber;
+
+        if (typeof dest === "string") {
+          explicitDest = await pdfDocument.getDestination(dest);
+
+          if (pdfDocument !== this._pdfDocument) {
+            return null;
+          }
+        } else {
+          explicitDest = dest;
+        }
+
+        if (Array.isArray(explicitDest)) {
+          const [destRef] = explicitDest;
+
+          if (typeof destRef === "object" && destRef !== null) {
+            pageNumber = this.linkService._cachedPageNumber(destRef);
+
+            if (!pageNumber) {
+              try {
+                pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1;
+
+                if (pdfDocument !== this._pdfDocument) {
+                  return null;
+                }
 
-    this._dispatchEvent(layersCount);
-  }
+                this.linkService.cachePageRef(pageNumber, destRef);
+              } catch (ex) {}
+            }
+          } else if (Number.isInteger(destRef)) {
+            pageNumber = destRef + 1;
+          }
 
-  async _resetLayers() {
-    if (!this._optionalContentConfig) {
-      return;
+          if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > 
pageNumberNesting.get(pageNumber))) {
+            const destHash = this.linkService.getDestinationHash(dest);
+            pageNumberToDestHash.set(pageNumber, destHash);
+            pageNumberNesting.set(pageNumber, currentNesting);
+          }
+        }
+
+        if (items.length > 0) {
+          queue.push({
+            nesting: currentNesting + 1,
+            items
+          });
+        }
+      }
     }
 
-    const optionalContentConfig = await this._pdfDocument.getOptionalContentConfig();
-    this.eventBus.dispatch("optionalcontentconfig", {
-      source: this,
-      promise: Promise.resolve(optionalContentConfig)
-    });
-    this.render({
-      optionalContentConfig,
-      pdfDocument: this._pdfDocument
-    });
+    this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : 
null);
+
+    return this._pageNumberToDestHashCapability.promise;
   }
 
 }
 
-exports.PDFLayerViewer = PDFLayerViewer;
+exports.PDFOutlineViewer = PDFOutlineViewer;
 
 /***/ }),
-/* 20 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 21 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.SimpleLinkService = exports.PDFLinkService = void 0;
+}));
+exports.PDFPresentationMode = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
-class PDFLinkService {
+const DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;
+const DELAY_BEFORE_HIDING_CONTROLS = 3000;
+const ACTIVE_SELECTOR = "pdfPresentationMode";
+const CONTROLS_SELECTOR = "pdfPresentationModeControls";
+const MOUSE_SCROLL_COOLDOWN_TIME = 50;
+const PAGE_SWITCH_THRESHOLD = 0.1;
+const SWIPE_MIN_DISTANCE_THRESHOLD = 50;
+const SWIPE_ANGLE_THRESHOLD = Math.PI / 6;
+
+class PDFPresentationMode {
   constructor({
-    eventBus,
-    externalLinkTarget = null,
-    externalLinkRel = null,
-    externalLinkEnabled = true,
-    ignoreDestinationZoom = false
-  } = {}) {
+    container,
+    pdfViewer,
+    eventBus
+  }) {
+    this.container = container;
+    this.pdfViewer = pdfViewer;
     this.eventBus = eventBus;
-    this.externalLinkTarget = externalLinkTarget;
-    this.externalLinkRel = externalLinkRel;
-    this.externalLinkEnabled = externalLinkEnabled;
-    this._ignoreDestinationZoom = ignoreDestinationZoom;
-    this.baseUrl = null;
-    this.pdfDocument = null;
-    this.pdfViewer = null;
-    this.pdfHistory = null;
-    this._pagesRefCache = null;
+    this.active = false;
+    this.args = null;
+    this.contextMenuOpen = false;
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+    this.touchSwipeState = null;
   }
 
-  setDocument(pdfDocument, baseUrl = null) {
-    this.baseUrl = baseUrl;
-    this.pdfDocument = pdfDocument;
-    this._pagesRefCache = Object.create(null);
-  }
+  request() {
+    if (this.switchInProgress || this.active || !this.pdfViewer.pagesCount) {
+      return false;
+    }
 
-  setViewer(pdfViewer) {
-    this.pdfViewer = pdfViewer;
-  }
+    this._addFullscreenChangeListeners();
 
-  setHistory(pdfHistory) {
-    this.pdfHistory = pdfHistory;
-  }
+    this._setSwitchInProgress();
 
-  get pagesCount() {
-    return this.pdfDocument ? this.pdfDocument.numPages : 0;
-  }
+    this._notifyStateChange();
 
-  get page() {
-    return this.pdfViewer.currentPageNumber;
-  }
+    if (this.container.requestFullscreen) {
+      this.container.requestFullscreen();
+    } else if (this.container.mozRequestFullScreen) {
+      this.container.mozRequestFullScreen();
+    } else if (this.container.webkitRequestFullscreen) {
+      this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
+    } else {
+      return false;
+    }
 
-  set page(value) {
-    this.pdfViewer.currentPageNumber = value;
+    this.args = {
+      page: this.pdfViewer.currentPageNumber,
+      previousScale: this.pdfViewer.currentScaleValue
+    };
+    return true;
   }
 
-  get rotation() {
-    return this.pdfViewer.pagesRotation;
-  }
+  _mouseWheel(evt) {
+    if (!this.active) {
+      return;
+    }
 
-  set rotation(value) {
-    this.pdfViewer.pagesRotation = value;
-  }
+    evt.preventDefault();
+    const delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
+    const currentTime = Date.now();
+    const storedTime = this.mouseScrollTimeStamp;
 
-  navigateTo(dest) {
-    const goToDestination = ({
-      namedDest,
-      explicitDest
-    }) => {
-      const destRef = explicitDest[0];
-      let pageNumber;
-
-      if (destRef instanceof Object) {
-        pageNumber = this._cachedPageNumber(destRef);
-
-        if (pageNumber === null) {
-          this.pdfDocument.getPageIndex(destRef).then(pageIndex => {
-            this.cachePageRef(pageIndex + 1, destRef);
-            goToDestination({
-              namedDest,
-              explicitDest
-            });
-          }).catch(() => {
-            console.error(`PDFLinkService.navigateTo: "${destRef}" is not ` + `a valid page reference, for 
dest="${dest}".`);
-          });
-          return;
-        }
-      } else if (Number.isInteger(destRef)) {
-        pageNumber = destRef + 1;
-      } else {
-        console.error(`PDFLinkService.navigateTo: "${destRef}" is not ` + `a valid destination reference, 
for dest="${dest}".`);
-        return;
-      }
+    if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+      return;
+    }
 
-      if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {
-        console.error(`PDFLinkService.navigateTo: "${pageNumber}" is not ` + `a valid page number, for 
dest="${dest}".`);
-        return;
-      }
+    if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
+      this._resetMouseScrollState();
+    }
 
-      if (this.pdfHistory) {
-        this.pdfHistory.pushCurrentPosition();
-        this.pdfHistory.push({
-          namedDest,
-          explicitDest,
-          pageNumber
-        });
-      }
+    this.mouseScrollDelta += delta;
 
-      this.pdfViewer.scrollPageIntoView({
-        pageNumber,
-        destArray: explicitDest,
-        ignoreDestinationZoom: this._ignoreDestinationZoom
-      });
-    };
+    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
+      const totalDelta = this.mouseScrollDelta;
 
-    new Promise((resolve, reject) => {
-      if (typeof dest === "string") {
-        this.pdfDocument.getDestination(dest).then(destArray => {
-          resolve({
-            namedDest: dest,
-            explicitDest: destArray
-          });
-        });
-        return;
-      }
+      this._resetMouseScrollState();
 
-      resolve({
-        namedDest: "",
-        explicitDest: dest
-      });
-    }).then(data => {
-      if (!Array.isArray(data.explicitDest)) {
-        console.error(`PDFLinkService.navigateTo: "${data.explicitDest}" is` + ` not a valid destination 
array, for dest="${dest}".`);
-        return;
+      const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage();
+
+      if (success) {
+        this.mouseScrollTimeStamp = currentTime;
       }
+    }
+  }
 
-      goToDestination(data);
-    });
+  get isFullscreen() {
+    return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen);
   }
 
-  getDestinationHash(dest) {
-    if (typeof dest === "string") {
-      return this.getAnchorUrl("#" + escape(dest));
+  _notifyStateChange() {
+    let state = _ui_utils.PresentationModeState.NORMAL;
+
+    if (this.switchInProgress) {
+      state = _ui_utils.PresentationModeState.CHANGING;
+    } else if (this.active) {
+      state = _ui_utils.PresentationModeState.FULLSCREEN;
     }
 
-    if (Array.isArray(dest)) {
-      const str = JSON.stringify(dest);
-      return this.getAnchorUrl("#" + escape(str));
+    this.eventBus.dispatch("presentationmodechanged", {
+      source: this,
+      state
+    });
+  }
+
+  _setSwitchInProgress() {
+    if (this.switchInProgress) {
+      clearTimeout(this.switchInProgress);
     }
 
-    return this.getAnchorUrl("");
+    this.switchInProgress = setTimeout(() => {
+      this._removeFullscreenChangeListeners();
+
+      delete this.switchInProgress;
+
+      this._notifyStateChange();
+    }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
   }
 
-  getAnchorUrl(anchor) {
-    return (this.baseUrl || "") + anchor;
+  _resetSwitchInProgress() {
+    if (this.switchInProgress) {
+      clearTimeout(this.switchInProgress);
+      delete this.switchInProgress;
+    }
   }
 
-  setHash(hash) {
-    let pageNumber, dest;
+  _enter() {
+    this.active = true;
 
-    if (hash.includes("=")) {
-      const params = (0, _ui_utils.parseQueryString)(hash);
+    this._resetSwitchInProgress();
 
-      if ("search" in params) {
-        this.eventBus.dispatch("findfromurlhash", {
-          source: this,
-          query: params.search.replace(/"/g, ""),
-          phraseSearch: params.phrase === "true"
-        });
-      }
+    this._notifyStateChange();
 
-      if ("page" in params) {
-        pageNumber = params.page | 0 || 1;
-      }
+    this.container.classList.add(ACTIVE_SELECTOR);
+    setTimeout(() => {
+      this.pdfViewer.currentPageNumber = this.args.page;
+      this.pdfViewer.currentScaleValue = "page-fit";
+    }, 0);
 
-      if ("zoom" in params) {
-        const zoomArgs = params.zoom.split(",");
-        const zoomArg = zoomArgs[0];
-        const zoomArgNumber = parseFloat(zoomArg);
+    this._addWindowListeners();
+
+    this._showControls();
+
+    this.contextMenuOpen = false;
+    window.getSelection().removeAllRanges();
+  }
+
+  _exit() {
+    const page = this.pdfViewer.currentPageNumber;
+    this.container.classList.remove(ACTIVE_SELECTOR);
+    setTimeout(() => {
+      this.active = false;
+
+      this._removeFullscreenChangeListeners();
+
+      this._notifyStateChange();
+
+      this.pdfViewer.currentScaleValue = this.args.previousScale;
+      this.pdfViewer.currentPageNumber = page;
+      this.args = null;
+    }, 0);
+
+    this._removeWindowListeners();
+
+    this._hideControls();
+
+    this._resetMouseScrollState();
+
+    this.contextMenuOpen = false;
+  }
+
+  _mouseDown(evt) {
+    if (this.contextMenuOpen) {
+      this.contextMenuOpen = false;
+      evt.preventDefault();
+      return;
+    }
+
+    if (evt.button === 0) {
+      const isInternalLink = evt.target.href && evt.target.classList.contains("internalLink");
+
+      if (!isInternalLink) {
+        evt.preventDefault();
 
-        if (!zoomArg.includes("Fit")) {
-          dest = [null, {
-            name: "XYZ"
-          }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, 
zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
+        if (evt.shiftKey) {
+          this.pdfViewer.previousPage();
         } else {
-          if (zoomArg === "Fit" || zoomArg === "FitB") {
-            dest = [null, {
-              name: zoomArg
-            }];
-          } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") 
{
-            dest = [null, {
-              name: zoomArg
-            }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
-          } else if (zoomArg === "FitR") {
-            if (zoomArgs.length !== 5) {
-              console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
-            } else {
-              dest = [null, {
-                name: zoomArg
-              }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
-            }
-          } else {
-            console.error(`PDFLinkService.setHash: "${zoomArg}" is not ` + "a valid zoom value.");
-          }
+          this.pdfViewer.nextPage();
         }
       }
+    }
+  }
 
-      if (dest) {
-        this.pdfViewer.scrollPageIntoView({
-          pageNumber: pageNumber || this.page,
-          destArray: dest,
-          allowNegativeOffset: true
-        });
-      } else if (pageNumber) {
-        this.page = pageNumber;
-      }
-
-      if ("pagemode" in params) {
-        this.eventBus.dispatch("pagemode", {
-          source: this,
-          mode: params.pagemode
-        });
-      }
+  _contextMenu() {
+    this.contextMenuOpen = true;
+  }
 
-      if ("nameddest" in params) {
-        this.navigateTo(params.nameddest);
-      }
+  _showControls() {
+    if (this.controlsTimeout) {
+      clearTimeout(this.controlsTimeout);
     } else {
-      dest = unescape(hash);
-
-      try {
-        dest = JSON.parse(dest);
-
-        if (!Array.isArray(dest)) {
-          dest = dest.toString();
-        }
-      } catch (ex) {}
+      this.container.classList.add(CONTROLS_SELECTOR);
+    }
 
-      if (typeof dest === "string" || isValidExplicitDestination(dest)) {
-        this.navigateTo(dest);
-        return;
-      }
+    this.controlsTimeout = setTimeout(() => {
+      this.container.classList.remove(CONTROLS_SELECTOR);
+      delete this.controlsTimeout;
+    }, DELAY_BEFORE_HIDING_CONTROLS);
+  }
 
-      console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not ` + "a valid destination.");
+  _hideControls() {
+    if (!this.controlsTimeout) {
+      return;
     }
+
+    clearTimeout(this.controlsTimeout);
+    this.container.classList.remove(CONTROLS_SELECTOR);
+    delete this.controlsTimeout;
   }
 
-  executeNamedAction(action) {
-    switch (action) {
-      case "GoBack":
-        if (this.pdfHistory) {
-          this.pdfHistory.back();
-        }
+  _resetMouseScrollState() {
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+  }
 
-        break;
+  _touchSwipe(evt) {
+    if (!this.active) {
+      return;
+    }
 
-      case "GoForward":
-        if (this.pdfHistory) {
-          this.pdfHistory.forward();
-        }
+    if (evt.touches.length > 1) {
+      this.touchSwipeState = null;
+      return;
+    }
 
+    switch (evt.type) {
+      case "touchstart":
+        this.touchSwipeState = {
+          startX: evt.touches[0].pageX,
+          startY: evt.touches[0].pageY,
+          endX: evt.touches[0].pageX,
+          endY: evt.touches[0].pageY
+        };
         break;
 
-      case "NextPage":
-        if (this.page < this.pagesCount) {
-          this.page++;
+      case "touchmove":
+        if (this.touchSwipeState === null) {
+          return;
         }
 
+        this.touchSwipeState.endX = evt.touches[0].pageX;
+        this.touchSwipeState.endY = evt.touches[0].pageY;
+        evt.preventDefault();
         break;
 
-      case "PrevPage":
-        if (this.page > 1) {
-          this.page--;
+      case "touchend":
+        if (this.touchSwipeState === null) {
+          return;
         }
 
-        break;
+        let delta = 0;
+        const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
+        const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
+        const absAngle = Math.abs(Math.atan2(dy, dx));
 
-      case "LastPage":
-        this.page = this.pagesCount;
-        break;
+        if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= 
Math.PI - SWIPE_ANGLE_THRESHOLD)) {
+          delta = dx;
+        } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= 
SWIPE_ANGLE_THRESHOLD) {
+          delta = dy;
+        }
 
-      case "FirstPage":
-        this.page = 1;
-        break;
+        if (delta > 0) {
+          this.pdfViewer.previousPage();
+        } else if (delta < 0) {
+          this.pdfViewer.nextPage();
+        }
 
-      default:
         break;
     }
+  }
 
-    this.eventBus.dispatch("namedaction", {
-      source: this,
-      action
+  _addWindowListeners() {
+    this.showControlsBind = this._showControls.bind(this);
+    this.mouseDownBind = this._mouseDown.bind(this);
+    this.mouseWheelBind = this._mouseWheel.bind(this);
+    this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
+    this.contextMenuBind = this._contextMenu.bind(this);
+    this.touchSwipeBind = this._touchSwipe.bind(this);
+    window.addEventListener("mousemove", this.showControlsBind);
+    window.addEventListener("mousedown", this.mouseDownBind);
+    window.addEventListener("wheel", this.mouseWheelBind, {
+      passive: false
+    });
+    window.addEventListener("keydown", this.resetMouseScrollStateBind);
+    window.addEventListener("contextmenu", this.contextMenuBind);
+    window.addEventListener("touchstart", this.touchSwipeBind);
+    window.addEventListener("touchmove", this.touchSwipeBind);
+    window.addEventListener("touchend", this.touchSwipeBind);
+  }
+
+  _removeWindowListeners() {
+    window.removeEventListener("mousemove", this.showControlsBind);
+    window.removeEventListener("mousedown", this.mouseDownBind);
+    window.removeEventListener("wheel", this.mouseWheelBind, {
+      passive: false
     });
+    window.removeEventListener("keydown", this.resetMouseScrollStateBind);
+    window.removeEventListener("contextmenu", this.contextMenuBind);
+    window.removeEventListener("touchstart", this.touchSwipeBind);
+    window.removeEventListener("touchmove", this.touchSwipeBind);
+    window.removeEventListener("touchend", this.touchSwipeBind);
+    delete this.showControlsBind;
+    delete this.mouseDownBind;
+    delete this.mouseWheelBind;
+    delete this.resetMouseScrollStateBind;
+    delete this.contextMenuBind;
+    delete this.touchSwipeBind;
   }
 
-  cachePageRef(pageNum, pageRef) {
-    if (!pageRef) {
-      return;
+  _fullscreenChange() {
+    if (this.isFullscreen) {
+      this._enter();
+    } else {
+      this._exit();
     }
-
-    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
-    this._pagesRefCache[refStr] = pageNum;
   }
 
-  _cachedPageNumber(pageRef) {
-    const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
-    return this._pagesRefCache && this._pagesRefCache[refStr] || null;
+  _addFullscreenChangeListeners() {
+    this.fullscreenChangeBind = this._fullscreenChange.bind(this);
+    window.addEventListener("fullscreenchange", this.fullscreenChangeBind);
+    window.addEventListener("mozfullscreenchange", this.fullscreenChangeBind);
+    window.addEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
   }
 
-  isPageVisible(pageNumber) {
-    return this.pdfViewer.isPageVisible(pageNumber);
+  _removeFullscreenChangeListeners() {
+    window.removeEventListener("fullscreenchange", this.fullscreenChangeBind);
+    window.removeEventListener("mozfullscreenchange", this.fullscreenChangeBind);
+    window.removeEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
+    delete this.fullscreenChangeBind;
   }
 
 }
 
-exports.PDFLinkService = PDFLinkService;
+exports.PDFPresentationMode = PDFPresentationMode;
 
-function isValidExplicitDestination(dest) {
-  if (!Array.isArray(dest)) {
-    return false;
-  }
+/***/ }),
+/* 22 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-  const destLength = dest.length;
 
-  if (destLength < 2) {
-    return false;
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.PDFScriptingManager = void 0;
+
+var _pdfjsLib = __webpack_require__(5);
+
+var _ui_utils = __webpack_require__(4);
+
+var _pdf_rendering_queue = __webpack_require__(8);
+
+class PDFScriptingManager {
+  constructor({
+    eventBus,
+    sandboxBundleSrc = null,
+    scriptingFactory = null,
+    docPropertiesLookup = null
+  }) {
+    this._pdfDocument = null;
+    this._pdfViewer = null;
+    this._closeCapability = null;
+    this._destroyCapability = null;
+    this._scripting = null;
+    this._mouseState = Object.create(null);
+    this._ready = false;
+    this._eventBus = eventBus;
+    this._sandboxBundleSrc = sandboxBundleSrc;
+    this._scriptingFactory = scriptingFactory;
+    this._docPropertiesLookup = docPropertiesLookup;
+  }
+
+  setViewer(pdfViewer) {
+    this._pdfViewer = pdfViewer;
   }
 
-  const page = dest[0];
+  async setDocument(pdfDocument) {
+    if (this._pdfDocument) {
+      await this._destroyScripting();
+    }
+
+    this._pdfDocument = pdfDocument;
+
+    if (!pdfDocument) {
+      return;
+    }
+
+    const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), 
pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]);
+
+    if (!objects && !docActions) {
+      await this._destroyScripting();
+      return;
+    }
+
+    if (pdfDocument !== this._pdfDocument) {
+      return;
+    }
+
+    try {
+      this._scripting = this._createScripting();
+    } catch (error) {
+      console.error(`PDFScriptingManager.setDocument: "${error?.message}".`);
+      await this._destroyScripting();
+      return;
+    }
+
+    this._internalEvents.set("updatefromsandbox", event => {
+      if (event?.source !== window) {
+        return;
+      }
+
+      this._updateFromSandbox(event.detail);
+    });
+
+    this._internalEvents.set("dispatcheventinsandbox", event => {
+      this._scripting?.dispatchEventInSandbox(event.detail);
+    });
 
-  if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && 
!(Number.isInteger(page) && page >= 0)) {
-    return false;
-  }
+    this._internalEvents.set("pagechanging", ({
+      pageNumber,
+      previous
+    }) => {
+      if (pageNumber === previous) {
+        return;
+      }
 
-  const zoom = dest[1];
+      this._dispatchPageClose(previous);
 
-  if (!(typeof zoom === "object" && typeof zoom.name === "string")) {
-    return false;
-  }
+      this._dispatchPageOpen(pageNumber);
+    });
 
-  let allowNull = true;
+    this._internalEvents.set("pagerendered", ({
+      pageNumber
+    }) => {
+      if (!this._pageOpenPending.has(pageNumber)) {
+        return;
+      }
 
-  switch (zoom.name) {
-    case "XYZ":
-      if (destLength !== 5) {
-        return false;
+      if (pageNumber !== this._pdfViewer.currentPageNumber) {
+        return;
       }
 
-      break;
+      this._dispatchPageOpen(pageNumber);
+    });
 
-    case "Fit":
-    case "FitB":
-      return destLength === 2;
+    this._internalEvents.set("pagesdestroy", async event => {
+      await this._dispatchPageClose(this._pdfViewer.currentPageNumber);
+      await this._scripting?.dispatchEventInSandbox({
+        id: "doc",
+        name: "WillClose"
+      });
+      this._closeCapability?.resolve();
+    });
 
-    case "FitH":
-    case "FitBH":
-    case "FitV":
-    case "FitBV":
-      if (destLength !== 3) {
-        return false;
-      }
+    this._domEvents.set("mousedown", event => {
+      this._mouseState.isDown = true;
+    });
 
-      break;
+    this._domEvents.set("mouseup", event => {
+      this._mouseState.isDown = false;
+    });
 
-    case "FitR":
-      if (destLength !== 6) {
-        return false;
-      }
+    for (const [name, listener] of this._internalEvents) {
+      this._eventBus._on(name, listener);
+    }
 
-      allowNull = false;
-      break;
+    for (const [name, listener] of this._domEvents) {
+      window.addEventListener(name, listener);
+    }
 
-    default:
-      return false;
-  }
+    try {
+      const docProperties = await this._getDocProperties();
 
-  for (let i = 2; i < destLength; i++) {
-    const param = dest[i];
+      if (pdfDocument !== this._pdfDocument) {
+        return;
+      }
 
-    if (!(typeof param === "number" || allowNull && param === null)) {
-      return false;
+      await this._scripting.createSandbox({
+        objects,
+        calculationOrder,
+        appInfo: {
+          platform: navigator.platform,
+          language: navigator.language
+        },
+        docInfo: { ...docProperties,
+          actions: docActions
+        }
+      });
+
+      this._eventBus.dispatch("sandboxcreated", {
+        source: this
+      });
+    } catch (error) {
+      console.error(`PDFScriptingManager.setDocument: "${error?.message}".`);
+      await this._destroyScripting();
+      return;
     }
+
+    await this._scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "Open"
+    });
+    await this._dispatchPageOpen(this._pdfViewer.currentPageNumber, true);
+    Promise.resolve().then(() => {
+      if (pdfDocument === this._pdfDocument) {
+        this._ready = true;
+      }
+    });
   }
 
-  return true;
-}
+  async dispatchWillSave(detail) {
+    return this._scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "WillSave"
+    });
+  }
 
-class SimpleLinkService {
-  constructor() {
-    this.externalLinkTarget = null;
-    this.externalLinkRel = null;
-    this.externalLinkEnabled = true;
-    this._ignoreDestinationZoom = false;
+  async dispatchDidSave(detail) {
+    return this._scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "DidSave"
+    });
   }
 
-  get pagesCount() {
-    return 0;
+  async dispatchWillPrint(detail) {
+    return this._scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "WillPrint"
+    });
   }
 
-  get page() {
-    return 0;
+  async dispatchDidPrint(detail) {
+    return this._scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "DidPrint"
+    });
   }
 
-  set page(value) {}
+  get mouseState() {
+    return this._mouseState;
+  }
 
-  get rotation() {
-    return 0;
+  get destroyPromise() {
+    return this._destroyCapability?.promise || null;
   }
 
-  set rotation(value) {}
+  get ready() {
+    return this._ready;
+  }
 
-  navigateTo(dest) {}
+  get _internalEvents() {
+    return (0, _pdfjsLib.shadow)(this, "_internalEvents", new Map());
+  }
 
-  getDestinationHash(dest) {
-    return "#";
+  get _domEvents() {
+    return (0, _pdfjsLib.shadow)(this, "_domEvents", new Map());
   }
 
-  getAnchorUrl(hash) {
-    return "#";
+  get _pageOpenPending() {
+    return (0, _pdfjsLib.shadow)(this, "_pageOpenPending", new Set());
   }
 
-  setHash(hash) {}
+  get _visitedPages() {
+    return (0, _pdfjsLib.shadow)(this, "_visitedPages", new Map());
+  }
 
-  executeNamedAction(action) {}
+  async _updateFromSandbox(detail) {
+    const isInPresentationMode = this._pdfViewer.isInPresentationMode || 
this._pdfViewer.isChangingPresentationMode;
+    const {
+      id,
+      siblings,
+      command,
+      value
+    } = detail;
+
+    if (!id) {
+      switch (command) {
+        case "clear":
+          console.clear();
+          break;
 
-  cachePageRef(pageNum, pageRef) {}
+        case "error":
+          console.error(value);
+          break;
 
-  isPageVisible(pageNumber) {
-    return true;
-  }
+        case "layout":
+          this._pdfViewer.spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(value);
+          break;
 
-}
+        case "page-num":
+          this._pdfViewer.currentPageNumber = value + 1;
+          break;
 
-exports.SimpleLinkService = SimpleLinkService;
+        case "print":
+          await this._pdfViewer.pagesPromise;
 
-/***/ }),
-/* 21 */
-/***/ (function(module, exports, __webpack_require__) {
+          this._eventBus.dispatch("print", {
+            source: this
+          });
 
-"use strict";
+          break;
 
+        case "println":
+          console.log(value);
+          break;
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PDFOutlineViewer = void 0;
+        case "zoom":
+          if (isInPresentationMode) {
+            return;
+          }
 
-var _pdfjsLib = __webpack_require__(5);
+          this._pdfViewer.currentScaleValue = value;
+          break;
+      }
+
+      return;
+    }
 
-var _base_tree_viewer = __webpack_require__(13);
+    if (isInPresentationMode) {
+      if (detail.focus) {
+        return;
+      }
+    }
 
-class PDFOutlineViewer extends _base_tree_viewer.BaseTreeViewer {
-  constructor(options) {
-    super(options);
-    this.linkService = options.linkService;
+    delete detail.id;
+    delete detail.siblings;
+    const ids = siblings ? [id, ...siblings] : [id];
 
-    this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this));
-  }
+    for (const elementId of ids) {
+      const element = document.getElementById(elementId);
 
-  reset() {
-    super.reset();
-    this._outline = null;
+      if (element) {
+        element.dispatchEvent(new CustomEvent("updatefromsandbox", {
+          detail
+        }));
+      } else {
+        this._pdfDocument?.annotationStorage.setValue(elementId, detail);
+      }
+    }
   }
 
-  _dispatchEvent(outlineCount) {
-    this.eventBus.dispatch("outlineloaded", {
-      source: this,
-      outlineCount
-    });
-  }
+  async _dispatchPageOpen(pageNumber, initialize = false) {
+    const pdfDocument = this._pdfDocument,
+          visitedPages = this._visitedPages;
 
-  _bindLink(element, {
-    url,
-    newWindow,
-    dest
-  }) {
-    const {
-      linkService
-    } = this;
+    if (initialize) {
+      this._closeCapability = (0, _pdfjsLib.createPromiseCapability)();
+    }
 
-    if (url) {
-      (0, _pdfjsLib.addLinkAttributes)(element, {
-        url,
-        target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,
-        rel: linkService.externalLinkRel,
-        enabled: linkService.externalLinkEnabled
-      });
+    if (!this._closeCapability) {
       return;
     }
 
-    element.href = linkService.getDestinationHash(dest);
-
-    element.onclick = () => {
-      if (dest) {
-        linkService.navigateTo(dest);
-      }
+    const pageView = this._pdfViewer.getPageView(pageNumber - 1);
 
-      return false;
-    };
-  }
+    if (pageView?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
+      this._pageOpenPending.add(pageNumber);
 
-  _setStyles(element, {
-    bold,
-    italic
-  }) {
-    if (bold) {
-      element.style.fontWeight = "bold";
+      return;
     }
 
-    if (italic) {
-      element.style.fontStyle = "italic";
-    }
-  }
+    this._pageOpenPending.delete(pageNumber);
 
-  _addToggleButton(div, {
-    count,
-    items
-  }) {
-    const hidden = count < 0 && Math.abs(count) === items.length;
+    const actionsPromise = (async () => {
+      const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null);
 
-    super._addToggleButton(div, hidden);
+      if (pdfDocument !== this._pdfDocument) {
+        return;
+      }
+
+      await this._scripting?.dispatchEventInSandbox({
+        id: "page",
+        name: "PageOpen",
+        pageNumber,
+        actions
+      });
+    })();
+
+    visitedPages.set(pageNumber, actionsPromise);
   }
 
-  _toggleAllTreeItems() {
-    if (!this._outline) {
+  async _dispatchPageClose(pageNumber) {
+    const pdfDocument = this._pdfDocument,
+          visitedPages = this._visitedPages;
+
+    if (!this._closeCapability) {
       return;
     }
 
-    super._toggleAllTreeItems();
-  }
-
-  render({
-    outline
-  }) {
-    if (this._outline) {
-      this.reset();
+    if (this._pageOpenPending.has(pageNumber)) {
+      return;
     }
 
-    this._outline = outline || null;
+    const actionsPromise = visitedPages.get(pageNumber);
 
-    if (!outline) {
-      this._dispatchEvent(0);
+    if (!actionsPromise) {
+      return;
+    }
+
+    visitedPages.set(pageNumber, null);
+    await actionsPromise;
 
+    if (pdfDocument !== this._pdfDocument) {
       return;
     }
 
-    const fragment = document.createDocumentFragment();
-    const queue = [{
-      parent: fragment,
-      items: outline
-    }];
-    let outlineCount = 0,
-        hasAnyNesting = false;
+    await this._scripting?.dispatchEventInSandbox({
+      id: "page",
+      name: "PageClose",
+      pageNumber
+    });
+  }
 
-    while (queue.length > 0) {
-      const levelData = queue.shift();
+  async _getDocProperties() {
+    if (this._docPropertiesLookup) {
+      return this._docPropertiesLookup(this._pdfDocument);
+    }
 
-      for (const item of levelData.items) {
-        const div = document.createElement("div");
-        div.className = "treeItem";
-        const element = document.createElement("a");
+    throw new Error("_getDocProperties: Unable to lookup properties.");
+  }
 
-        this._bindLink(element, item);
+  _createScripting() {
+    this._destroyCapability = (0, _pdfjsLib.createPromiseCapability)();
 
-        this._setStyles(element, item);
+    if (this._scripting) {
+      throw new Error("_createScripting: Scripting already exists.");
+    }
 
-        element.textContent = this._normalizeTextContent(item.title);
-        div.appendChild(element);
+    if (this._scriptingFactory) {
+      return this._scriptingFactory.createScripting({
+        sandboxBundleSrc: this._sandboxBundleSrc
+      });
+    }
 
-        if (item.items.length > 0) {
-          hasAnyNesting = true;
+    throw new Error("_createScripting: Cannot create scripting.");
+  }
 
-          this._addToggleButton(div, item);
+  async _destroyScripting() {
+    if (!this._scripting) {
+      this._pdfDocument = null;
+      this._destroyCapability?.resolve();
+      return;
+    }
 
-          const itemsDiv = document.createElement("div");
-          itemsDiv.className = "treeItems";
-          div.appendChild(itemsDiv);
-          queue.push({
-            parent: itemsDiv,
-            items: item.items
-          });
-        }
+    if (this._closeCapability) {
+      await Promise.race([this._closeCapability.promise, new Promise(resolve => {
+        setTimeout(resolve, 1000);
+      })]).catch(reason => {});
+      this._closeCapability = null;
+    }
+
+    this._pdfDocument = null;
 
-        levelData.parent.appendChild(div);
-        outlineCount++;
-      }
+    try {
+      await this._scripting.destroySandbox();
+    } catch (ex) {}
+
+    for (const [name, listener] of this._internalEvents) {
+      this._eventBus._off(name, listener);
     }
 
-    if (hasAnyNesting) {
-      this.container.classList.add("treeWithDeepNesting");
-      this._lastToggleIsShow = fragment.querySelectorAll(".treeItemsHidden").length === 0;
+    this._internalEvents.clear();
+
+    for (const [name, listener] of this._domEvents) {
+      window.removeEventListener(name, listener);
     }
 
-    this.container.appendChild(fragment);
+    this._domEvents.clear();
+
+    this._pageOpenPending.clear();
 
-    this._dispatchEvent(outlineCount);
+    this._visitedPages.clear();
+
+    this._scripting = null;
+    delete this._mouseState.isDown;
+    this._ready = false;
+    this._destroyCapability?.resolve();
   }
 
 }
 
-exports.PDFOutlineViewer = PDFOutlineViewer;
+exports.PDFScriptingManager = PDFScriptingManager;
 
 /***/ }),
-/* 22 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 23 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFPresentationMode = void 0;
+}));
+exports.PDFSidebar = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
-const DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;
-const DELAY_BEFORE_HIDING_CONTROLS = 3000;
-const ACTIVE_SELECTOR = "pdfPresentationMode";
-const CONTROLS_SELECTOR = "pdfPresentationModeControls";
-const MOUSE_SCROLL_COOLDOWN_TIME = 50;
-const PAGE_SWITCH_THRESHOLD = 0.1;
-const SWIPE_MIN_DISTANCE_THRESHOLD = 50;
-const SWIPE_ANGLE_THRESHOLD = Math.PI / 6;
+var _pdf_rendering_queue = __webpack_require__(8);
 
-class PDFPresentationMode {
+const UI_NOTIFICATION_CLASS = "pdfSidebarNotification";
+
+class PDFSidebar {
   constructor({
-    container,
+    elements,
     pdfViewer,
+    pdfThumbnailViewer,
     eventBus,
-    contextMenuItems = null
+    l10n
   }) {
-    this.container = container;
+    this.isOpen = false;
+    this.active = _ui_utils.SidebarView.THUMBS;
+    this.isInitialViewSet = false;
+    this.onToggled = null;
     this.pdfViewer = pdfViewer;
+    this.pdfThumbnailViewer = pdfThumbnailViewer;
+    this.outerContainer = elements.outerContainer;
+    this.viewerContainer = elements.viewerContainer;
+    this.toggleButton = elements.toggleButton;
+    this.thumbnailButton = elements.thumbnailButton;
+    this.outlineButton = elements.outlineButton;
+    this.attachmentsButton = elements.attachmentsButton;
+    this.layersButton = elements.layersButton;
+    this.thumbnailView = elements.thumbnailView;
+    this.outlineView = elements.outlineView;
+    this.attachmentsView = elements.attachmentsView;
+    this.layersView = elements.layersView;
+    this._outlineOptionsContainer = elements.outlineOptionsContainer;
+    this._currentOutlineItemButton = elements.currentOutlineItemButton;
     this.eventBus = eventBus;
-    this.active = false;
-    this.args = null;
-    this.contextMenuOpen = false;
-    this.mouseScrollTimeStamp = 0;
-    this.mouseScrollDelta = 0;
-    this.touchSwipeState = null;
+    this.l10n = l10n;
 
-    if (contextMenuItems) {
-      contextMenuItems.contextFirstPage.addEventListener("click", () => {
-        this.contextMenuOpen = false;
-        this.eventBus.dispatch("firstpage", {
-          source: this
-        });
-      });
-      contextMenuItems.contextLastPage.addEventListener("click", () => {
-        this.contextMenuOpen = false;
-        this.eventBus.dispatch("lastpage", {
-          source: this
-        });
-      });
-      contextMenuItems.contextPageRotateCw.addEventListener("click", () => {
-        this.contextMenuOpen = false;
-        this.eventBus.dispatch("rotatecw", {
-          source: this
-        });
-      });
-      contextMenuItems.contextPageRotateCcw.addEventListener("click", () => {
-        this.contextMenuOpen = false;
-        this.eventBus.dispatch("rotateccw", {
-          source: this
-        });
-      });
-    }
+    this._addEventListeners();
   }
 
-  request() {
-    if (this.switchInProgress || this.active || !this.pdfViewer.pagesCount) {
-      return false;
-    }
+  reset() {
+    this.isInitialViewSet = false;
 
-    this._addFullscreenChangeListeners();
+    this._hideUINotification(true);
 
-    this._setSwitchInProgress();
+    this.switchView(_ui_utils.SidebarView.THUMBS);
+    this.outlineButton.disabled = false;
+    this.attachmentsButton.disabled = false;
+    this.layersButton.disabled = false;
+    this._currentOutlineItemButton.disabled = true;
+  }
 
-    this._notifyStateChange();
+  get visibleView() {
+    return this.isOpen ? this.active : _ui_utils.SidebarView.NONE;
+  }
 
-    if (this.container.requestFullscreen) {
-      this.container.requestFullscreen();
-    } else if (this.container.mozRequestFullScreen) {
-      this.container.mozRequestFullScreen();
-    } else if (this.container.webkitRequestFullscreen) {
-      this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
-    } else if (this.container.msRequestFullscreen) {
-      this.container.msRequestFullscreen();
-    } else {
-      return false;
-    }
+  get isThumbnailViewVisible() {
+    return this.isOpen && this.active === _ui_utils.SidebarView.THUMBS;
+  }
 
-    this.args = {
-      page: this.pdfViewer.currentPageNumber,
-      previousScale: this.pdfViewer.currentScaleValue
-    };
-    return true;
+  get isOutlineViewVisible() {
+    return this.isOpen && this.active === _ui_utils.SidebarView.OUTLINE;
   }
 
-  _mouseWheel(evt) {
-    if (!this.active) {
-      return;
-    }
+  get isAttachmentsViewVisible() {
+    return this.isOpen && this.active === _ui_utils.SidebarView.ATTACHMENTS;
+  }
 
-    evt.preventDefault();
-    const delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
-    const currentTime = new Date().getTime();
-    const storedTime = this.mouseScrollTimeStamp;
+  get isLayersViewVisible() {
+    return this.isOpen && this.active === _ui_utils.SidebarView.LAYERS;
+  }
 
-    if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+  setInitialView(view = _ui_utils.SidebarView.NONE) {
+    if (this.isInitialViewSet) {
       return;
     }
 
-    if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
-      this._resetMouseScrollState();
-    }
-
-    this.mouseScrollDelta += delta;
-
-    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
-      const totalDelta = this.mouseScrollDelta;
+    this.isInitialViewSet = true;
 
-      this._resetMouseScrollState();
+    if (view === _ui_utils.SidebarView.NONE || view === _ui_utils.SidebarView.UNKNOWN) {
+      this._dispatchEvent();
 
-      const success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();
+      return;
+    }
 
-      if (success) {
-        this.mouseScrollTimeStamp = currentTime;
-      }
+    if (!this._switchView(view, true)) {
+      this._dispatchEvent();
     }
   }
 
-  get isFullscreen() {
-    return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || 
document.msFullscreenElement);
+  switchView(view, forceOpen = false) {
+    this._switchView(view, forceOpen);
   }
 
-  _goToPreviousPage() {
-    const page = this.pdfViewer.currentPageNumber;
+  _switchView(view, forceOpen = false) {
+    const isViewChanged = view !== this.active;
+    let shouldForceRendering = false;
 
-    if (page <= 1) {
-      return false;
-    }
+    switch (view) {
+      case _ui_utils.SidebarView.NONE:
+        if (this.isOpen) {
+          this.close();
+          return true;
+        }
 
-    this.pdfViewer.currentPageNumber = page - 1;
-    return true;
-  }
+        return false;
 
-  _goToNextPage() {
-    const page = this.pdfViewer.currentPageNumber;
+      case _ui_utils.SidebarView.THUMBS:
+        if (this.isOpen && isViewChanged) {
+          shouldForceRendering = true;
+        }
 
-    if (page >= this.pdfViewer.pagesCount) {
-      return false;
-    }
+        break;
 
-    this.pdfViewer.currentPageNumber = page + 1;
-    return true;
-  }
+      case _ui_utils.SidebarView.OUTLINE:
+        if (this.outlineButton.disabled) {
+          return false;
+        }
 
-  _notifyStateChange() {
-    this.eventBus.dispatch("presentationmodechanged", {
-      source: this,
-      active: this.active,
-      switchInProgress: !!this.switchInProgress
-    });
-  }
+        break;
 
-  _setSwitchInProgress() {
-    if (this.switchInProgress) {
-      clearTimeout(this.switchInProgress);
-    }
+      case _ui_utils.SidebarView.ATTACHMENTS:
+        if (this.attachmentsButton.disabled) {
+          return false;
+        }
 
-    this.switchInProgress = setTimeout(() => {
-      this._removeFullscreenChangeListeners();
+        break;
 
-      delete this.switchInProgress;
+      case _ui_utils.SidebarView.LAYERS:
+        if (this.layersButton.disabled) {
+          return false;
+        }
 
-      this._notifyStateChange();
-    }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
-  }
+        break;
 
-  _resetSwitchInProgress() {
-    if (this.switchInProgress) {
-      clearTimeout(this.switchInProgress);
-      delete this.switchInProgress;
+      default:
+        console.error(`PDFSidebar._switchView: "${view}" is not a valid view.`);
+        return false;
     }
-  }
 
-  _enter() {
-    this.active = true;
+    this.active = view;
+    this.thumbnailButton.classList.toggle("toggled", view === _ui_utils.SidebarView.THUMBS);
+    this.outlineButton.classList.toggle("toggled", view === _ui_utils.SidebarView.OUTLINE);
+    this.attachmentsButton.classList.toggle("toggled", view === _ui_utils.SidebarView.ATTACHMENTS);
+    this.layersButton.classList.toggle("toggled", view === _ui_utils.SidebarView.LAYERS);
+    this.thumbnailView.classList.toggle("hidden", view !== _ui_utils.SidebarView.THUMBS);
+    this.outlineView.classList.toggle("hidden", view !== _ui_utils.SidebarView.OUTLINE);
+    this.attachmentsView.classList.toggle("hidden", view !== _ui_utils.SidebarView.ATTACHMENTS);
+    this.layersView.classList.toggle("hidden", view !== _ui_utils.SidebarView.LAYERS);
 
-    this._resetSwitchInProgress();
+    this._outlineOptionsContainer.classList.toggle("hidden", view !== _ui_utils.SidebarView.OUTLINE);
 
-    this._notifyStateChange();
+    if (forceOpen && !this.isOpen) {
+      this.open();
+      return true;
+    }
 
-    this.container.classList.add(ACTIVE_SELECTOR);
-    setTimeout(() => {
-      this.pdfViewer.currentPageNumber = this.args.page;
-      this.pdfViewer.currentScaleValue = "page-fit";
-    }, 0);
+    if (shouldForceRendering) {
+      this._updateThumbnailViewer();
 
-    this._addWindowListeners();
+      this._forceRendering();
+    }
 
-    this._showControls();
+    if (isViewChanged) {
+      this._dispatchEvent();
+    }
 
-    this.contextMenuOpen = false;
-    this.container.setAttribute("contextmenu", "viewerContextMenu");
-    window.getSelection().removeAllRanges();
+    return isViewChanged;
   }
 
-  _exit() {
-    const page = this.pdfViewer.currentPageNumber;
-    this.container.classList.remove(ACTIVE_SELECTOR);
-    setTimeout(() => {
-      this.active = false;
-
-      this._removeFullscreenChangeListeners();
-
-      this._notifyStateChange();
+  open() {
+    if (this.isOpen) {
+      return;
+    }
 
-      this.pdfViewer.currentScaleValue = this.args.previousScale;
-      this.pdfViewer.currentPageNumber = page;
-      this.args = null;
-    }, 0);
+    this.isOpen = true;
+    this.toggleButton.classList.add("toggled");
+    this.toggleButton.setAttribute("aria-expanded", "true");
+    this.outerContainer.classList.add("sidebarMoving", "sidebarOpen");
 
-    this._removeWindowListeners();
+    if (this.active === _ui_utils.SidebarView.THUMBS) {
+      this._updateThumbnailViewer();
+    }
 
-    this._hideControls();
+    this._forceRendering();
 
-    this._resetMouseScrollState();
+    this._dispatchEvent();
 
-    this.container.removeAttribute("contextmenu");
-    this.contextMenuOpen = false;
+    this._hideUINotification();
   }
 
-  _mouseDown(evt) {
-    if (this.contextMenuOpen) {
-      this.contextMenuOpen = false;
-      evt.preventDefault();
+  close() {
+    if (!this.isOpen) {
       return;
     }
 
-    if (evt.button === 0) {
-      const isInternalLink = evt.target.href && evt.target.classList.contains("internalLink");
+    this.isOpen = false;
+    this.toggleButton.classList.remove("toggled");
+    this.toggleButton.setAttribute("aria-expanded", "false");
+    this.outerContainer.classList.add("sidebarMoving");
+    this.outerContainer.classList.remove("sidebarOpen");
+
+    this._forceRendering();
 
-      if (!isInternalLink) {
-        evt.preventDefault();
+    this._dispatchEvent();
+  }
 
-        if (evt.shiftKey) {
-          this._goToPreviousPage();
-        } else {
-          this._goToNextPage();
-        }
-      }
+  toggle() {
+    if (this.isOpen) {
+      this.close();
+    } else {
+      this.open();
     }
   }
 
-  _contextMenu() {
-    this.contextMenuOpen = true;
+  _dispatchEvent() {
+    this.eventBus.dispatch("sidebarviewchanged", {
+      source: this,
+      view: this.visibleView
+    });
   }
 
-  _showControls() {
-    if (this.controlsTimeout) {
-      clearTimeout(this.controlsTimeout);
+  _forceRendering() {
+    if (this.onToggled) {
+      this.onToggled();
     } else {
-      this.container.classList.add(CONTROLS_SELECTOR);
+      this.pdfViewer.forceRendering();
+      this.pdfThumbnailViewer.forceRendering();
     }
-
-    this.controlsTimeout = setTimeout(() => {
-      this.container.classList.remove(CONTROLS_SELECTOR);
-      delete this.controlsTimeout;
-    }, DELAY_BEFORE_HIDING_CONTROLS);
   }
 
-  _hideControls() {
-    if (!this.controlsTimeout) {
-      return;
+  _updateThumbnailViewer() {
+    const {
+      pdfViewer,
+      pdfThumbnailViewer
+    } = this;
+    const pagesCount = pdfViewer.pagesCount;
+
+    for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
+      const pageView = pdfViewer.getPageView(pageIndex);
+
+      if (pageView?.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
+        const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);
+        thumbnailView.setImage(pageView);
+      }
     }
 
-    clearTimeout(this.controlsTimeout);
-    this.container.classList.remove(CONTROLS_SELECTOR);
-    delete this.controlsTimeout;
+    pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
   }
 
-  _resetMouseScrollState() {
-    this.mouseScrollTimeStamp = 0;
-    this.mouseScrollDelta = 0;
-  }
+  _showUINotification() {
+    this.l10n.get("toggle_sidebar_notification2.title").then(msg => {
+      this.toggleButton.title = msg;
+    });
 
-  _touchSwipe(evt) {
-    if (!this.active) {
-      return;
+    if (!this.isOpen) {
+      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
     }
+  }
 
-    if (evt.touches.length > 1) {
-      this.touchSwipeState = null;
-      return;
+  _hideUINotification(reset = false) {
+    if (this.isOpen || reset) {
+      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
     }
 
-    switch (evt.type) {
-      case "touchstart":
-        this.touchSwipeState = {
-          startX: evt.touches[0].pageX,
-          startY: evt.touches[0].pageY,
-          endX: evt.touches[0].pageX,
-          endY: evt.touches[0].pageY
-        };
-        break;
-
-      case "touchmove":
-        if (this.touchSwipeState === null) {
-          return;
-        }
+    if (reset) {
+      this.l10n.get("toggle_sidebar.title").then(msg => {
+        this.toggleButton.title = msg;
+      });
+    }
+  }
 
-        this.touchSwipeState.endX = evt.touches[0].pageX;
-        this.touchSwipeState.endY = evt.touches[0].pageY;
-        evt.preventDefault();
-        break;
+  _addEventListeners() {
+    this.viewerContainer.addEventListener("transitionend", evt => {
+      if (evt.target === this.viewerContainer) {
+        this.outerContainer.classList.remove("sidebarMoving");
+      }
+    });
+    this.toggleButton.addEventListener("click", () => {
+      this.toggle();
+    });
+    this.thumbnailButton.addEventListener("click", () => {
+      this.switchView(_ui_utils.SidebarView.THUMBS);
+    });
+    this.outlineButton.addEventListener("click", () => {
+      this.switchView(_ui_utils.SidebarView.OUTLINE);
+    });
+    this.outlineButton.addEventListener("dblclick", () => {
+      this.eventBus.dispatch("toggleoutlinetree", {
+        source: this
+      });
+    });
+    this.attachmentsButton.addEventListener("click", () => {
+      this.switchView(_ui_utils.SidebarView.ATTACHMENTS);
+    });
+    this.layersButton.addEventListener("click", () => {
+      this.switchView(_ui_utils.SidebarView.LAYERS);
+    });
+    this.layersButton.addEventListener("dblclick", () => {
+      this.eventBus.dispatch("resetlayers", {
+        source: this
+      });
+    });
 
-      case "touchend":
-        if (this.touchSwipeState === null) {
-          return;
-        }
+    this._currentOutlineItemButton.addEventListener("click", () => {
+      this.eventBus.dispatch("currentoutlineitem", {
+        source: this
+      });
+    });
 
-        let delta = 0;
-        const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
-        const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
-        const absAngle = Math.abs(Math.atan2(dy, dx));
+    const onTreeLoaded = (count, button, view) => {
+      button.disabled = !count;
 
-        if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= 
Math.PI - SWIPE_ANGLE_THRESHOLD)) {
-          delta = dx;
-        } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= 
SWIPE_ANGLE_THRESHOLD) {
-          delta = dy;
-        }
+      if (count) {
+        this._showUINotification();
+      } else if (this.active === view) {
+        this.switchView(_ui_utils.SidebarView.THUMBS);
+      }
+    };
 
-        if (delta > 0) {
-          this._goToPreviousPage();
-        } else if (delta < 0) {
-          this._goToNextPage();
+    this.eventBus._on("outlineloaded", evt => {
+      onTreeLoaded(evt.outlineCount, this.outlineButton, _ui_utils.SidebarView.OUTLINE);
+      evt.currentOutlineItemPromise.then(enabled => {
+        if (!this.isInitialViewSet) {
+          return;
         }
 
-        break;
-    }
-  }
-
-  _addWindowListeners() {
-    this.showControlsBind = this._showControls.bind(this);
-    this.mouseDownBind = this._mouseDown.bind(this);
-    this.mouseWheelBind = this._mouseWheel.bind(this);
-    this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
-    this.contextMenuBind = this._contextMenu.bind(this);
-    this.touchSwipeBind = this._touchSwipe.bind(this);
-    window.addEventListener("mousemove", this.showControlsBind);
-    window.addEventListener("mousedown", this.mouseDownBind);
-    window.addEventListener("wheel", this.mouseWheelBind, {
-      passive: false
+        this._currentOutlineItemButton.disabled = !enabled;
+      });
     });
-    window.addEventListener("keydown", this.resetMouseScrollStateBind);
-    window.addEventListener("contextmenu", this.contextMenuBind);
-    window.addEventListener("touchstart", this.touchSwipeBind);
-    window.addEventListener("touchmove", this.touchSwipeBind);
-    window.addEventListener("touchend", this.touchSwipeBind);
-  }
 
-  _removeWindowListeners() {
-    window.removeEventListener("mousemove", this.showControlsBind);
-    window.removeEventListener("mousedown", this.mouseDownBind);
-    window.removeEventListener("wheel", this.mouseWheelBind, {
-      passive: false
+    this.eventBus._on("attachmentsloaded", evt => {
+      onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, _ui_utils.SidebarView.ATTACHMENTS);
     });
-    window.removeEventListener("keydown", this.resetMouseScrollStateBind);
-    window.removeEventListener("contextmenu", this.contextMenuBind);
-    window.removeEventListener("touchstart", this.touchSwipeBind);
-    window.removeEventListener("touchmove", this.touchSwipeBind);
-    window.removeEventListener("touchend", this.touchSwipeBind);
-    delete this.showControlsBind;
-    delete this.mouseDownBind;
-    delete this.mouseWheelBind;
-    delete this.resetMouseScrollStateBind;
-    delete this.contextMenuBind;
-    delete this.touchSwipeBind;
-  }
-
-  _fullscreenChange() {
-    if (this.isFullscreen) {
-      this._enter();
-    } else {
-      this._exit();
-    }
-  }
 
-  _addFullscreenChangeListeners() {
-    this.fullscreenChangeBind = this._fullscreenChange.bind(this);
-    window.addEventListener("fullscreenchange", this.fullscreenChangeBind);
-    window.addEventListener("mozfullscreenchange", this.fullscreenChangeBind);
-    window.addEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
-    window.addEventListener("MSFullscreenChange", this.fullscreenChangeBind);
-  }
+    this.eventBus._on("layersloaded", evt => {
+      onTreeLoaded(evt.layersCount, this.layersButton, _ui_utils.SidebarView.LAYERS);
+    });
 
-  _removeFullscreenChangeListeners() {
-    window.removeEventListener("fullscreenchange", this.fullscreenChangeBind);
-    window.removeEventListener("mozfullscreenchange", this.fullscreenChangeBind);
-    window.removeEventListener("webkitfullscreenchange", this.fullscreenChangeBind);
-    window.removeEventListener("MSFullscreenChange", this.fullscreenChangeBind);
-    delete this.fullscreenChangeBind;
+    this.eventBus._on("presentationmodechanged", evt => {
+      if (evt.state === _ui_utils.PresentationModeState.NORMAL && this.isThumbnailViewVisible) {
+        this._updateThumbnailViewer();
+      }
+    });
   }
 
 }
 
-exports.PDFPresentationMode = PDFPresentationMode;
+exports.PDFSidebar = PDFSidebar;
 
 /***/ }),
-/* 23 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 24 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFSidebarResizer = void 0;
-
-var _ui_utils = __webpack_require__(2);
-
 const SIDEBAR_WIDTH_VAR = "--sidebar-width";
 const SIDEBAR_MIN_WIDTH = 200;
 const SIDEBAR_RESIZING_CLASS = "sidebarResizing";
 
 class PDFSidebarResizer {
-  constructor(options, eventBus, l10n = _ui_utils.NullL10n) {
-    this.enabled = false;
+  constructor(options, eventBus, l10n) {
     this.isRTL = false;
     this.sidebarOpen = false;
     this.doc = document.documentElement;
@@ -8444,16 +8888,7 @@ class PDFSidebarResizer {
     this.outerContainer = options.outerContainer;
     this.resizer = options.resizer;
     this.eventBus = eventBus;
-    this.l10n = l10n;
-
-    if (typeof CSS === "undefined" || typeof CSS.supports !== "function" || !CSS.supports(SIDEBAR_WIDTH_VAR, 
`calc(-1 * ${SIDEBAR_MIN_WIDTH}px)`)) {
-      console.warn("PDFSidebarResizer: " + "The browser does not support resizing of the sidebar.");
-      return;
-    }
-
-    this.enabled = true;
-    this.resizer.classList.remove("hidden");
-    this.l10n.getDirection().then(dir => {
+    l10n.getDirection().then(dir => {
       this.isRTL = dir === "rtl";
     });
 
@@ -8461,26 +8896,26 @@ class PDFSidebarResizer {
   }
 
   get outerContainerWidth() {
-    if (!this._outerContainerWidth) {
-      this._outerContainerWidth = this.outerContainer.clientWidth;
-    }
-
-    return this._outerContainerWidth;
+    return this._outerContainerWidth || (this._outerContainerWidth = this.outerContainer.clientWidth);
   }
 
   _updateWidth(width = 0) {
-    if (!this.enabled) {
-      return false;
+    const maxWidth = Math.floor(this.outerContainerWidth / 2);
+
+    if (width > maxWidth) {
+      width = maxWidth;
     }
 
-    const newWidth = (0, _ui_utils.clamp)(width, SIDEBAR_MIN_WIDTH, Math.floor(this.outerContainerWidth / 
2));
+    if (width < SIDEBAR_MIN_WIDTH) {
+      width = SIDEBAR_MIN_WIDTH;
+    }
 
-    if (newWidth === this._width) {
+    if (width === this._width) {
       return false;
     }
 
-    this._width = newWidth;
-    this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`);
+    this._width = width;
+    this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);
     return true;
   }
 
@@ -8505,10 +8940,6 @@ class PDFSidebarResizer {
   }
 
   _addEventListeners() {
-    if (!this.enabled) {
-      return;
-    }
-
     const _boundEvents = this._boundEvents;
     _boundEvents.mouseMove = this._mouseMove.bind(this);
     _boundEvents.mouseUp = this._mouseUp.bind(this);
@@ -8523,11 +8954,11 @@ class PDFSidebarResizer {
     });
 
     this.eventBus._on("sidebarviewchanged", evt => {
-      this.sidebarOpen = !!(evt && evt.view);
+      this.sidebarOpen = !!evt?.view;
     });
 
     this.eventBus._on("resize", evt => {
-      if (!evt || evt.source !== window) {
+      if (evt?.source !== window) {
         return;
       }
 
@@ -8564,20 +8995,21 @@ class PDFSidebarResizer {
 exports.PDFSidebarResizer = PDFSidebarResizer;
 
 /***/ }),
-/* 24 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 25 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFThumbnailViewer = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
-var _pdf_thumbnail_view = __webpack_require__(25);
+var _pdf_thumbnail_view = __webpack_require__(26);
+
+var _pdf_rendering_queue = __webpack_require__(8);
 
 const THUMBNAIL_SCROLL_MARGIN = -19;
 const THUMBNAIL_SELECTED_CLASS = "selected";
@@ -8588,7 +9020,7 @@ class PDFThumbnailViewer {
     eventBus,
     linkService,
     renderingQueue,
-    l10n = _ui_utils.NullL10n
+    l10n
   }) {
     this.container = container;
     this.linkService = linkService;
@@ -8612,7 +9044,10 @@ class PDFThumbnailViewer {
   }
 
   _getVisibleThumbs() {
-    return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);
+    return (0, _ui_utils.getVisibleElements)({
+      scrollEl: this.container,
+      views: this._thumbnails
+    });
   }
 
   scrollThumbnailIntoView(pageNumber) {
@@ -8690,7 +9125,13 @@ class PDFThumbnailViewer {
   }
 
   cleanup() {
-    _pdf_thumbnail_view.PDFThumbnailView.cleanup();
+    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
+      if (this._thumbnails[i] && this._thumbnails[i].renderingState !== 
_pdf_rendering_queue.RenderingStates.FINISHED) {
+        this._thumbnails[i].reset();
+      }
+    }
+
+    _pdf_thumbnail_view.TempImageFactory.destroyCanvas();
   }
 
   _resetView() {
@@ -8739,7 +9180,6 @@ class PDFThumbnailViewer {
           linkService: this.linkService,
           renderingQueue: this.renderingQueue,
           checkSetImageDisabled,
-          disableCanvasToImageConversion: false,
           l10n: this.l10n
         });
 
@@ -8782,9 +9222,7 @@ class PDFThumbnailViewer {
     }
 
     for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
-      const label = this._pageLabels && this._pageLabels[i];
-
-      this._thumbnails[i].setPageLabel(label);
+      this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);
     }
   }
 
@@ -8837,23 +9275,23 @@ class PDFThumbnailViewer {
 exports.PDFThumbnailViewer = PDFThumbnailViewer;
 
 /***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 26 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.PDFThumbnailView = void 0;
+}));
+exports.TempImageFactory = exports.PDFThumbnailView = void 0;
 
-var _pdfjsLib = __webpack_require__(5);
+var _ui_utils = __webpack_require__(4);
 
-var _ui_utils = __webpack_require__(2);
+var _pdfjsLib = __webpack_require__(5);
 
 var _pdf_rendering_queue = __webpack_require__(8);
 
+const DRAW_UPSCALE_FACTOR = 2;
 const MAX_NUM_SCALING_STEPS = 3;
 const THUMBNAIL_CANVAS_BORDER_WIDTH = 1;
 const THUMBNAIL_WIDTH = 98;
@@ -8879,7 +9317,7 @@ const TempImageFactory = function TempImageFactoryClosure() {
       ctx.fillStyle = "rgb(255, 255, 255)";
       ctx.fillRect(0, 0, width, height);
       ctx.restore();
-      return tempCanvas;
+      return [tempCanvas, tempCanvas.getContext("2d")];
     },
 
     destroyCanvas() {
@@ -8896,6 +9334,8 @@ const TempImageFactory = function TempImageFactoryClosure() {
   };
 }();
 
+exports.TempImageFactory = TempImageFactory;
+
 class PDFThumbnailView {
   constructor({
     container,
@@ -8905,8 +9345,7 @@ class PDFThumbnailView {
     linkService,
     renderingQueue,
     checkSetImageDisabled,
-    disableCanvasToImageConversion = false,
-    l10n = _ui_utils.NullL10n
+    l10n
   }) {
     this.id = id;
     this.renderingId = "thumbnail" + id;
@@ -8926,13 +9365,12 @@ class PDFThumbnailView {
       return false;
     };
 
-    this.disableCanvasToImageConversion = disableCanvasToImageConversion;
-    this.pageWidth = this.viewport.width;
-    this.pageHeight = this.viewport.height;
-    this.pageRatio = this.pageWidth / this.pageHeight;
+    const pageWidth = this.viewport.width,
+          pageHeight = this.viewport.height,
+          pageRatio = pageWidth / pageHeight;
     this.canvasWidth = THUMBNAIL_WIDTH;
-    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
-    this.scale = this.canvasWidth / this.pageWidth;
+    this.canvasHeight = this.canvasWidth / pageRatio | 0;
+    this.scale = this.canvasWidth / pageWidth;
     this.l10n = l10n;
     const anchor = document.createElement("a");
     anchor.href = linkService.getAnchorUrl("#page=" + id);
@@ -8942,7 +9380,7 @@ class PDFThumbnailView {
     });
 
     anchor.onclick = function () {
-      linkService.page = id;
+      linkService.goToPage(id);
       return false;
     };
 
@@ -8976,19 +9414,14 @@ class PDFThumbnailView {
   reset() {
     this.cancelRendering();
     this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
-    this.pageWidth = this.viewport.width;
-    this.pageHeight = this.viewport.height;
-    this.pageRatio = this.pageWidth / this.pageHeight;
-    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
-    this.scale = this.canvasWidth / this.pageWidth;
-    this.div.removeAttribute("data-loaded");
-    const ring = this.ring;
-    const childNodes = ring.childNodes;
-
-    for (let i = childNodes.length - 1; i >= 0; i--) {
-      ring.removeChild(childNodes[i]);
-    }
-
+    const pageWidth = this.viewport.width,
+          pageHeight = this.viewport.height,
+          pageRatio = pageWidth / pageHeight;
+    this.canvasHeight = this.canvasWidth / pageRatio | 0;
+    this.scale = this.canvasWidth / pageWidth;
+    this.div.removeAttribute("data-loaded");
+    const ring = this.ring;
+    ring.textContent = "";
     const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
     ring.style.width = this.canvasWidth + borderAdjustment + "px";
     ring.style.height = this.canvasHeight + borderAdjustment + "px";
@@ -9027,51 +9460,32 @@ class PDFThumbnailView {
     this.resume = null;
   }
 
-  _getPageDrawContext(noCtxScale = false) {
+  _getPageDrawContext(upscaleFactor = 1) {
     const canvas = document.createElement("canvas");
-    this.canvas = canvas;
     canvas.mozOpaque = true;
     const ctx = canvas.getContext("2d", {
       alpha: false
     });
     const outputScale = (0, _ui_utils.getOutputScale)(ctx);
-    canvas.width = this.canvasWidth * outputScale.sx | 0;
-    canvas.height = this.canvasHeight * outputScale.sy | 0;
-    canvas.style.width = this.canvasWidth + "px";
-    canvas.style.height = this.canvasHeight + "px";
-
-    if (!noCtxScale && outputScale.scaled) {
-      ctx.scale(outputScale.sx, outputScale.sy);
-    }
-
-    return ctx;
+    canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0;
+    canvas.height = upscaleFactor * this.canvasHeight * outputScale.sy | 0;
+    const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null;
+    return {
+      ctx,
+      canvas,
+      transform
+    };
   }
 
-  _convertCanvasToImage() {
-    if (!this.canvas) {
-      return;
-    }
-
+  _convertCanvasToImage(canvas) {
     if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
-      return;
+      throw new Error("_convertCanvasToImage: Rendering has not finished.");
     }
 
-    const className = "thumbnailImage";
-
-    if (this.disableCanvasToImageConversion) {
-      this.canvas.className = className;
-
-      this._thumbPageCanvas.then(msg => {
-        this.canvas.setAttribute("aria-label", msg);
-      });
-
-      this.div.setAttribute("data-loaded", true);
-      this.ring.appendChild(this.canvas);
-      return;
-    }
+    const reducedCanvas = this._reduceImage(canvas);
 
     const image = document.createElement("img");
-    image.className = className;
+    image.className = "thumbnailImage";
 
     this._thumbPageCanvas.then(msg => {
       image.setAttribute("aria-label", msg);
@@ -9079,13 +9493,12 @@ class PDFThumbnailView {
 
     image.style.width = this.canvasWidth + "px";
     image.style.height = this.canvasHeight + "px";
-    image.src = this.canvas.toDataURL();
+    image.src = reducedCanvas.toDataURL();
     this.image = image;
     this.div.setAttribute("data-loaded", true);
     this.ring.appendChild(image);
-    this.canvas.width = 0;
-    this.canvas.height = 0;
-    delete this.canvas;
+    reducedCanvas.width = 0;
+    reducedCanvas.height = 0;
   }
 
   draw() {
@@ -9104,33 +9517,33 @@ class PDFThumbnailView {
     }
 
     this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
-    const renderCapability = (0, _pdfjsLib.createPromiseCapability)();
 
-    const finishRenderTask = error => {
+    const finishRenderTask = async (error = null) => {
       if (renderTask === this.renderTask) {
         this.renderTask = null;
       }
 
       if (error instanceof _pdfjsLib.RenderingCancelledException) {
-        renderCapability.resolve(undefined);
         return;
       }
 
       this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
 
-      this._convertCanvasToImage();
+      this._convertCanvasToImage(canvas);
 
-      if (!error) {
-        renderCapability.resolve(undefined);
-      } else {
-        renderCapability.reject(error);
+      if (error) {
+        throw error;
       }
     };
 
-    const ctx = this._getPageDrawContext();
+    const {
+      ctx,
+      canvas,
+      transform
+    } = this._getPageDrawContext(DRAW_UPSCALE_FACTOR);
 
     const drawViewport = this.viewport.clone({
-      scale: this.scale
+      scale: DRAW_UPSCALE_FACTOR * this.scale
     });
 
     const renderContinueCallback = cont => {
@@ -9150,17 +9563,27 @@ class PDFThumbnailView {
 
     const renderContext = {
       canvasContext: ctx,
+      transform,
       viewport: drawViewport,
       optionalContentConfigPromise: this._optionalContentConfigPromise
     };
     const renderTask = this.renderTask = pdfPage.render(renderContext);
     renderTask.onContinue = renderContinueCallback;
-    renderTask.promise.then(function () {
-      finishRenderTask(null);
+    const resultPromise = renderTask.promise.then(function () {
+      return finishRenderTask(null);
     }, function (error) {
-      finishRenderTask(error);
+      return finishRenderTask(error);
+    });
+    resultPromise.finally(() => {
+      canvas.width = 0;
+      canvas.height = 0;
+      const pageCached = this.linkService.isPageCached(this.id);
+
+      if (!pageCached) {
+        this.pdfPage?.cleanup();
+      }
     });
-    return renderCapability.promise;
+    return resultPromise;
   }
 
   setImage(pageView) {
@@ -9172,34 +9595,38 @@ class PDFThumbnailView {
       return;
     }
 
-    const img = pageView.canvas;
+    const {
+      canvas,
+      pdfPage
+    } = pageView;
 
-    if (!img) {
+    if (!canvas) {
       return;
     }
 
     if (!this.pdfPage) {
-      this.setPdfPage(pageView.pdfPage);
+      this.setPdfPage(pdfPage);
     }
 
     this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
 
-    const ctx = this._getPageDrawContext(true);
+    this._convertCanvasToImage(canvas);
+  }
 
-    const canvas = ctx.canvas;
+  _reduceImage(img) {
+    const {
+      ctx,
+      canvas
+    } = this._getPageDrawContext();
 
     if (img.width <= 2 * canvas.width) {
       ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);
-
-      this._convertCanvasToImage();
-
-      return;
+      return canvas;
     }
 
     let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;
     let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
-    const reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);
-    const reducedImageCtx = reducedImage.getContext("2d");
+    const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight);
 
     while (reducedWidth > img.width || reducedHeight > img.height) {
       reducedWidth >>= 1;
@@ -9215,24 +9642,19 @@ class PDFThumbnailView {
     }
 
     ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);
-
-    this._convertCanvasToImage();
+    return canvas;
   }
 
   get _thumbPageTitle() {
-    var _this$pageLabel;
-
     return this.l10n.get("thumb_page_title", {
-      page: (_this$pageLabel = this.pageLabel) != null ? _this$pageLabel : this.id
-    }, "Page {{page}}");
+      page: this.pageLabel ?? this.id
+    });
   }
 
   get _thumbPageCanvas() {
-    var _this$pageLabel2;
-
     return this.l10n.get("thumb_page_canvas", {
-      page: (_this$pageLabel2 = this.pageLabel) != null ? _this$pageLabel2 : this.id
-    }, "Thumbnail of Page {{page}}");
+      page: this.pageLabel ?? this.id
+    });
   }
 
   setPageLabel(label) {
@@ -9247,35 +9669,28 @@ class PDFThumbnailView {
     }
 
     this._thumbPageCanvas.then(msg => {
-      if (this.image) {
-        this.image.setAttribute("aria-label", msg);
-      } else if (this.disableCanvasToImageConversion && this.canvas) {
-        this.canvas.setAttribute("aria-label", msg);
-      }
+      this.image?.setAttribute("aria-label", msg);
     });
   }
 
-  static cleanup() {
-    TempImageFactory.destroyCanvas();
-  }
-
 }
 
 exports.PDFThumbnailView = PDFThumbnailView;
 
 /***/ }),
-/* 26 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 27 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFViewer = void 0;
 
-var _base_viewer = __webpack_require__(27);
+var _ui_utils = __webpack_require__(4);
+
+var _base_viewer = __webpack_require__(28);
 
 var _pdfjsLib = __webpack_require__(5);
 
@@ -9333,7 +9748,7 @@ class PDFViewer extends _base_viewer.BaseViewer {
         break;
       }
 
-      if (page.id === currentId) {
+      if (page.id === currentId && this._scrollMode === _ui_utils.ScrollMode.VERTICAL && this._spreadMode 
=== _ui_utils.SpreadMode.NONE) {
         stillFullyVisible = true;
         break;
       }
@@ -9351,30 +9766,35 @@ class PDFViewer extends _base_viewer.BaseViewer {
 exports.PDFViewer = PDFViewer;
 
 /***/ }),
-/* 27 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 28 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.BaseViewer = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _pdfjsLib = __webpack_require__(5);
+
+var _ui_utils = __webpack_require__(4);
 
 var _pdf_rendering_queue = __webpack_require__(8);
 
-var _annotation_layer_builder = __webpack_require__(28);
+var _annotation_layer_builder = __webpack_require__(29);
 
-var _pdfjsLib = __webpack_require__(5);
+var _l10n_utils = __webpack_require__(30);
+
+var _pdf_page_view = __webpack_require__(31);
+
+var _pdf_link_service = __webpack_require__(19);
 
-var _pdf_page_view = __webpack_require__(29);
+var _struct_tree_layer_builder = __webpack_require__(32);
 
-var _pdf_link_service = __webpack_require__(20);
+var _text_layer_builder = __webpack_require__(33);
 
-var _text_layer_builder = __webpack_require__(30);
+var _xfa_layer_builder = __webpack_require__(34);
 
 const DEFAULT_CACHE_SIZE = 10;
 
@@ -9414,6 +9834,10 @@ function PDFPageViewBuffer(size) {
       data.shift().destroy();
     }
   };
+
+  this.has = function (view) {
+    return data.includes(view);
+  };
 }
 
 function isSameScale(oldScale, newScale) {
@@ -9434,28 +9858,39 @@ class BaseViewer {
       throw new Error("Cannot initialize BaseViewer.");
     }
 
+    const viewerVersion = '2.10.377';
+
+    if (_pdfjsLib.version !== viewerVersion) {
+      throw new Error(`The API version "${_pdfjsLib.version}" does not match the Viewer version 
"${viewerVersion}".`);
+    }
+
     this._name = this.constructor.name;
     this.container = options.container;
     this.viewer = options.viewer || options.container.firstElementChild;
 
-    if (!(this.container instanceof HTMLDivElement && this.viewer instanceof HTMLDivElement)) {
+    if (!(this.container?.tagName.toUpperCase() === "DIV" && this.viewer?.tagName.toUpperCase() === "DIV")) {
       throw new Error("Invalid `container` and/or `viewer` option.");
     }
 
+    if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") {
+      throw new Error("The `container` must be absolutely positioned.");
+    }
+
     this.eventBus = options.eventBus;
     this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();
     this.downloadManager = options.downloadManager || null;
     this.findController = options.findController || null;
+    this._scriptingManager = options.scriptingManager || null;
     this.removePageBorders = options.removePageBorders || false;
     this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : 
_ui_utils.TextLayerMode.ENABLE;
     this.imageResourcesPath = options.imageResourcesPath || "";
-    this.renderInteractiveForms = typeof options.renderInteractiveForms === "boolean" ? 
options.renderInteractiveForms : true;
+    this.renderInteractiveForms = options.renderInteractiveForms !== false;
     this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;
     this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
-    this.enableWebGL = options.enableWebGL || false;
     this.useOnlyCssZoom = options.useOnlyCssZoom || false;
     this.maxCanvasPixels = options.maxCanvasPixels;
-    this.l10n = options.l10n || _ui_utils.NullL10n;
+    this.l10n = options.l10n || _l10n_utils.NullL10n;
+    this.enableScripting = options.enableScripting === true && !!this._scriptingManager;
     this.defaultRenderingQueue = !options.renderingQueue;
 
     if (this.defaultRenderingQueue) {
@@ -9496,7 +9931,7 @@ class BaseViewer {
     }
 
     return this._pages.every(function (pageView) {
-      return pageView && pageView.pdfPage;
+      return pageView?.pdfPage;
     });
   }
 
@@ -9531,11 +9966,13 @@ class BaseViewer {
       return false;
     }
 
+    const previous = this._currentPageNumber;
     this._currentPageNumber = val;
     this.eventBus.dispatch("pagechanging", {
       source: this,
       pageNumber: val,
-      pageLabel: this._pageLabels && this._pageLabels[val - 1]
+      pageLabel: this._pageLabels?.[val - 1] ?? null,
+      previous
     });
 
     if (resetCurrentPageView) {
@@ -9546,7 +9983,7 @@ class BaseViewer {
   }
 
   get currentPageLabel() {
-    return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];
+    return this._pageLabels?.[this._currentPageNumber - 1] ?? null;
   }
 
   set currentPageLabel(val) {
@@ -9610,6 +10047,12 @@ class BaseViewer {
       return;
     }
 
+    rotation %= 360;
+
+    if (rotation < 0) {
+      rotation += 360;
+    }
+
     if (this._pagesRotation === rotation) {
       return;
     }
@@ -9663,6 +10106,10 @@ class BaseViewer {
 
   setDocument(pdfDocument) {
     if (this.pdfDocument) {
+      this.eventBus.dispatch("pagesdestroy", {
+        source: this
+      });
+
       this._cancelRendering();
 
       this._resetView();
@@ -9670,6 +10117,10 @@ class BaseViewer {
       if (this.findController) {
         this.findController.setDocument(null);
       }
+
+      if (this._scriptingManager) {
+        this._scriptingManager.setDocument(null);
+      }
     }
 
     this.pdfDocument = pdfDocument;
@@ -9678,9 +10129,9 @@ class BaseViewer {
       return;
     }
 
+    const isPureXfa = pdfDocument.isPureXfa;
     const pagesCount = pdfDocument.numPages;
     const firstPagePromise = pdfDocument.getPage(1);
-    const annotationStorage = pdfDocument.annotationStorage;
     const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
 
     this._pagesCapability.promise.then(() => {
@@ -9725,6 +10176,7 @@ class BaseViewer {
         scale: scale * _ui_utils.CSS_UNITS
       });
       const textLayerFactory = this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE ? this : null;
+      const xfaLayerFactory = isPureXfa ? this : null;
 
       for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
         const pageView = new _pdf_page_view.PDFPageView({
@@ -9733,16 +10185,16 @@ class BaseViewer {
           id: pageNum,
           scale,
           defaultViewport: viewport.clone(),
-          annotationStorage,
           optionalContentConfigPromise,
           renderingQueue: this.renderingQueue,
           textLayerFactory,
           textLayerMode: this.textLayerMode,
           annotationLayerFactory: this,
+          xfaLayerFactory,
+          structTreeLayerFactory: this,
           imageResourcesPath: this.imageResourcesPath,
           renderInteractiveForms: this.renderInteractiveForms,
           renderer: this.renderer,
-          enableWebGL: this.enableWebGL,
           useOnlyCssZoom: this.useOnlyCssZoom,
           maxCanvasPixels: this.maxCanvasPixels,
           l10n: this.l10n
@@ -9767,6 +10219,10 @@ class BaseViewer {
           this.findController.setDocument(pdfDocument);
         }
 
+        if (this.enableScripting) {
+          this._scriptingManager.setDocument(pdfDocument);
+        }
+
         if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {
           this._pagesCapability.resolve();
 
@@ -9831,9 +10287,7 @@ class BaseViewer {
     }
 
     for (let i = 0, ii = this._pages.length; i < ii; i++) {
-      const pageView = this._pages[i];
-      const label = this._pageLabels && this._pageLabels[i];
-      pageView.setPageLabel(label);
+      this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);
     }
   }
 
@@ -9937,6 +10391,14 @@ class BaseViewer {
     }
   }
 
+  get _pageWidthScaleFactor() {
+    if (this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== 
_ui_utils.ScrollMode.HORIZONTAL && !this.isInPresentationMode) {
+      return 2;
+    }
+
+    return 1;
+  }
+
   _setScale(value, noScroll = false) {
     let scale = parseFloat(value);
 
@@ -9957,7 +10419,7 @@ class BaseViewer {
         [hPadding, vPadding] = [vPadding, hPadding];
       }
 
-      const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;
+      const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale 
/ this._pageWidthScaleFactor;
       const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * 
currentPage.scale;
 
       switch (value) {
@@ -10003,6 +10465,20 @@ class BaseViewer {
     });
   }
 
+  pageLabelToPageNumber(label) {
+    if (!this._pageLabels) {
+      return null;
+    }
+
+    const i = this._pageLabels.indexOf(label);
+
+    if (i < 0) {
+      return null;
+    }
+
+    return i + 1;
+  }
+
   scrollPageIntoView({
     pageNumber,
     destArray = null,
@@ -10059,6 +10535,8 @@ class BaseViewer {
         if (y === null && this._location) {
           x = this._location.left;
           y = this._location.top;
+        } else if (typeof y !== "number") {
+          y = pageHeight;
         }
 
         break;
@@ -10189,6 +10667,10 @@ class BaseViewer {
     return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;
   }
 
+  get _isContainerRtl() {
+    return getComputedStyle(this.container).direction === "rtl";
+  }
+
   get isInPresentationMode() {
     return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;
   }
@@ -10228,7 +10710,13 @@ class BaseViewer {
   }
 
   _getVisiblePages() {
-    return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, 
this._isScrollModeHorizontal);
+    return (0, _ui_utils.getVisibleElements)({
+      scrollEl: this.container,
+      views: this._pages,
+      sortByVisibility: true,
+      horizontal: this._isScrollModeHorizontal,
+      rtl: this._isScrollModeHorizontal && this._isContainerRtl
+    });
   }
 
   isPageVisible(pageNumber) {
@@ -10236,8 +10724,8 @@ class BaseViewer {
       return false;
     }
 
-    if (pageNumber < 1 || pageNumber > this.pagesCount) {
-      console.error(`${this._name}.isPageVisible: "${pageNumber}" is out of bounds.`);
+    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
+      console.error(`${this._name}.isPageVisible: "${pageNumber}" is not a valid page.`);
       return false;
     }
 
@@ -10246,6 +10734,25 @@ class BaseViewer {
     });
   }
 
+  isPageCached(pageNumber) {
+    if (!this.pdfDocument || !this._buffer) {
+      return false;
+    }
+
+    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
+      console.error(`${this._name}.isPageCached: "${pageNumber}" is not a valid page.`);
+      return false;
+    }
+
+    const pageView = this._pages[pageNumber - 1];
+
+    if (!pageView) {
+      return false;
+    }
+
+    return this._buffer.has(pageView);
+  }
+
   cleanup() {
     for (let i = 0, ii = this._pages.length; i < ii; i++) {
       if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) 
{
@@ -10318,16 +10825,33 @@ class BaseViewer {
     });
   }
 
-  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", 
renderInteractiveForms = false, l10n = _ui_utils.NullL10n) {
+  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", 
renderInteractiveForms = false, l10n = _l10n_utils.NullL10n, enableScripting = null, hasJSActionsPromise = 
null, mouseState = null) {
     return new _annotation_layer_builder.AnnotationLayerBuilder({
       pageDiv,
       pdfPage,
-      annotationStorage,
+      annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage,
       imageResourcesPath,
       renderInteractiveForms,
       linkService: this.linkService,
       downloadManager: this.downloadManager,
-      l10n
+      l10n,
+      enableScripting: enableScripting ?? this.enableScripting,
+      hasJSActionsPromise: hasJSActionsPromise || this.pdfDocument?.hasJSActions(),
+      mouseState: mouseState || this._scriptingManager?.mouseState
+    });
+  }
+
+  createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null) {
+    return new _xfa_layer_builder.XfaLayerBuilder({
+      pageDiv,
+      pdfPage,
+      annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage
+    });
+  }
+
+  createStructTreeLayerBuilder(pdfPage) {
+    return new _struct_tree_layer_builder.StructTreeLayerBuilder({
+      pdfPage
     });
   }
 
@@ -10346,30 +10870,23 @@ class BaseViewer {
   }
 
   getPagesOverview() {
-    const pagesOverview = this._pages.map(function (pageView) {
+    return this._pages.map(pageView => {
       const viewport = pageView.pdfPage.getViewport({
         scale: 1
       });
-      return {
-        width: viewport.width,
-        height: viewport.height,
-        rotation: viewport.rotation
-      };
-    });
-
-    if (!this.enablePrintAutoRotate) {
-      return pagesOverview;
-    }
 
-    return pagesOverview.map(function (size) {
-      if ((0, _ui_utils.isPortraitOrientation)(size)) {
-        return size;
+      if (!this.enablePrintAutoRotate || (0, _ui_utils.isPortraitOrientation)(viewport)) {
+        return {
+          width: viewport.width,
+          height: viewport.height,
+          rotation: viewport.rotation
+        };
       }
 
       return {
-        width: size.height,
-        height: size.width,
-        rotation: (size.rotation + 90) % 360
+        width: viewport.height,
+        height: viewport.width,
+        rotation: (viewport.rotation - 90) % 360
       };
     });
   }
@@ -10510,32 +11027,192 @@ class BaseViewer {
       return;
     }
 
+    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
+      this._setScale(this._currentScaleValue, true);
+    }
+
     this._setCurrentPageNumber(pageNumber, true);
 
     this.update();
   }
 
+  _getPageAdvance(currentPageNumber, previous = false) {
+    if (this.isInPresentationMode) {
+      return 1;
+    }
+
+    switch (this._scrollMode) {
+      case _ui_utils.ScrollMode.WRAPPED:
+        {
+          const {
+            views
+          } = this._getVisiblePages(),
+                pageLayout = new Map();
+
+          for (const {
+            id,
+            y,
+            percent,
+            widthPercent
+          } of views) {
+            if (percent === 0 || widthPercent < 100) {
+              continue;
+            }
+
+            let yArray = pageLayout.get(y);
+
+            if (!yArray) {
+              pageLayout.set(y, yArray || (yArray = []));
+            }
+
+            yArray.push(id);
+          }
+
+          for (const yArray of pageLayout.values()) {
+            const currentIndex = yArray.indexOf(currentPageNumber);
+
+            if (currentIndex === -1) {
+              continue;
+            }
+
+            const numPages = yArray.length;
+
+            if (numPages === 1) {
+              break;
+            }
+
+            if (previous) {
+              for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {
+                const currentId = yArray[i],
+                      expectedId = yArray[i + 1] - 1;
+
+                if (currentId < expectedId) {
+                  return currentPageNumber - expectedId;
+                }
+              }
+            } else {
+              for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {
+                const currentId = yArray[i],
+                      expectedId = yArray[i - 1] + 1;
+
+                if (currentId > expectedId) {
+                  return expectedId - currentPageNumber;
+                }
+              }
+            }
+
+            if (previous) {
+              const firstId = yArray[0];
+
+              if (firstId < currentPageNumber) {
+                return currentPageNumber - firstId + 1;
+              }
+            } else {
+              const lastId = yArray[numPages - 1];
+
+              if (lastId > currentPageNumber) {
+                return lastId - currentPageNumber + 1;
+              }
+            }
+
+            break;
+          }
+
+          break;
+        }
+
+      case _ui_utils.ScrollMode.HORIZONTAL:
+        {
+          break;
+        }
+
+      case _ui_utils.ScrollMode.VERTICAL:
+        {
+          if (this._spreadMode === _ui_utils.SpreadMode.NONE) {
+            break;
+          }
+
+          const parity = this._spreadMode - 1;
+
+          if (previous && currentPageNumber % 2 !== parity) {
+            break;
+          } else if (!previous && currentPageNumber % 2 === parity) {
+            break;
+          }
+
+          const {
+            views
+          } = this._getVisiblePages(),
+                expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;
+
+          for (const {
+            id,
+            percent,
+            widthPercent
+          } of views) {
+            if (id !== expectedId) {
+              continue;
+            }
+
+            if (percent > 0 && widthPercent === 100) {
+              return 2;
+            }
+
+            break;
+          }
+
+          break;
+        }
+    }
+
+    return 1;
+  }
+
+  nextPage() {
+    const currentPageNumber = this._currentPageNumber,
+          pagesCount = this.pagesCount;
+
+    if (currentPageNumber >= pagesCount) {
+      return false;
+    }
+
+    const advance = this._getPageAdvance(currentPageNumber, false) || 1;
+    this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);
+    return true;
+  }
+
+  previousPage() {
+    const currentPageNumber = this._currentPageNumber;
+
+    if (currentPageNumber <= 1) {
+      return false;
+    }
+
+    const advance = this._getPageAdvance(currentPageNumber, true) || 1;
+    this.currentPageNumber = Math.max(currentPageNumber - advance, 1);
+    return true;
+  }
+
 }
 
 exports.BaseViewer = BaseViewer;
 
 /***/ }),
-/* 28 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 29 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0;
 
 var _pdfjsLib = __webpack_require__(5);
 
-var _ui_utils = __webpack_require__(2);
+var _l10n_utils = __webpack_require__(30);
 
-var _pdf_link_service = __webpack_require__(20);
+var _pdf_link_service = __webpack_require__(19);
 
 class AnnotationLayerBuilder {
   constructor({
@@ -10546,7 +11223,10 @@ class AnnotationLayerBuilder {
     annotationStorage = null,
     imageResourcesPath = "",
     renderInteractiveForms = true,
-    l10n = _ui_utils.NullL10n
+    l10n = _l10n_utils.NullL10n,
+    enableScripting = false,
+    hasJSActionsPromise = null,
+    mouseState = null
   }) {
     this.pageDiv = pageDiv;
     this.pdfPage = pdfPage;
@@ -10556,14 +11236,17 @@ class AnnotationLayerBuilder {
     this.renderInteractiveForms = renderInteractiveForms;
     this.l10n = l10n;
     this.annotationStorage = annotationStorage;
+    this.enableScripting = enableScripting;
+    this._hasJSActionsPromise = hasJSActionsPromise;
+    this._mouseState = mouseState;
     this.div = null;
     this._cancelled = false;
   }
 
   render(viewport, intent = "display") {
-    return this.pdfPage.getAnnotations({
+    return Promise.all([this.pdfPage.getAnnotations({
       intent
-    }).then(annotations => {
+    }), this._hasJSActionsPromise]).then(([annotations, hasJSActions = false]) => {
       if (this._cancelled) {
         return;
       }
@@ -10583,7 +11266,10 @@ class AnnotationLayerBuilder {
         renderInteractiveForms: this.renderInteractiveForms,
         linkService: this.linkService,
         downloadManager: this.downloadManager,
-        annotationStorage: this.annotationStorage
+        annotationStorage: this.annotationStorage,
+        enableScripting: this.enableScripting,
+        hasJSActions,
+        mouseState: this._mouseState
       };
 
       if (this.div) {
@@ -10610,7 +11296,7 @@ class AnnotationLayerBuilder {
       return;
     }
 
-    this.div.setAttribute("hidden", "true");
+    this.div.hidden = true;
   }
 
 }
@@ -10618,7 +11304,7 @@ class AnnotationLayerBuilder {
 exports.AnnotationLayerBuilder = AnnotationLayerBuilder;
 
 class DefaultAnnotationLayerFactory {
-  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", 
renderInteractiveForms = true, l10n = _ui_utils.NullL10n) {
+  createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", 
renderInteractiveForms = true, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = 
null, mouseState = null) {
     return new AnnotationLayerBuilder({
       pageDiv,
       pdfPage,
@@ -10626,7 +11312,10 @@ class DefaultAnnotationLayerFactory {
       renderInteractiveForms,
       linkService: new _pdf_link_service.SimpleLinkService(),
       l10n,
-      annotationStorage
+      annotationStorage,
+      enableScripting,
+      hasJSActionsPromise,
+      mouseState
     });
   }
 
@@ -10635,24 +11324,153 @@ class DefaultAnnotationLayerFactory {
 exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
 
 /***/ }),
-/* 29 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 30 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
+exports.fixupLangCode = fixupLangCode;
+exports.getL10nFallback = getL10nFallback;
+exports.NullL10n = void 0;
+const DEFAULT_L10N_STRINGS = {
+  of_pages: "of {{pagesCount}}",
+  page_of_pages: "({{pageNumber}} of {{pagesCount}})",
+  document_properties_kb: "{{size_kb}} KB ({{size_b}} bytes)",
+  document_properties_mb: "{{size_mb}} MB ({{size_b}} bytes)",
+  document_properties_date_string: "{{date}}, {{time}}",
+  document_properties_page_size_unit_inches: "in",
+  document_properties_page_size_unit_millimeters: "mm",
+  document_properties_page_size_orientation_portrait: "portrait",
+  document_properties_page_size_orientation_landscape: "landscape",
+  document_properties_page_size_name_a3: "A3",
+  document_properties_page_size_name_a4: "A4",
+  document_properties_page_size_name_letter: "Letter",
+  document_properties_page_size_name_legal: "Legal",
+  document_properties_page_size_dimension_string: "{{width}} × {{height}} {{unit}} ({{orientation}})",
+  document_properties_page_size_dimension_name_string: "{{width}} × {{height}} {{unit}} ({{name}}, 
{{orientation}})",
+  document_properties_linearized_yes: "Yes",
+  document_properties_linearized_no: "No",
+  print_progress_percent: "{{progress}}%",
+  "toggle_sidebar.title": "Toggle Sidebar",
+  "toggle_sidebar_notification2.title": "Toggle Sidebar (document contains outline/attachments/layers)",
+  additional_layers: "Additional Layers",
+  page_landmark: "Page {{page}}",
+  thumb_page_title: "Page {{page}}",
+  thumb_page_canvas: "Thumbnail of Page {{page}}",
+  find_reached_top: "Reached top of document, continued from bottom",
+  find_reached_bottom: "Reached end of document, continued from top",
+  "find_match_count[one]": "{{current}} of {{total}} match",
+  "find_match_count[other]": "{{current}} of {{total}} matches",
+  "find_match_count_limit[one]": "More than {{limit}} match",
+  "find_match_count_limit[other]": "More than {{limit}} matches",
+  find_not_found: "Phrase not found",
+  error_version_info: "PDF.js v{{version}} (build: {{build}})",
+  error_message: "Message: {{message}}",
+  error_stack: "Stack: {{stack}}",
+  error_file: "File: {{file}}",
+  error_line: "Line: {{line}}",
+  rendering_error: "An error occurred while rendering the page.",
+  page_scale_width: "Page Width",
+  page_scale_fit: "Page Fit",
+  page_scale_auto: "Automatic Zoom",
+  page_scale_actual: "Actual Size",
+  page_scale_percent: "{{scale}}%",
+  loading: "Loading…",
+  loading_error: "An error occurred while loading the PDF.",
+  invalid_file_error: "Invalid or corrupted PDF file.",
+  missing_file_error: "Missing PDF file.",
+  unexpected_response_error: "Unexpected server response.",
+  printing_not_supported: "Warning: Printing is not fully supported by this browser.",
+  printing_not_ready: "Warning: The PDF is not fully loaded for printing.",
+  web_fonts_disabled: "Web fonts are disabled: unable to use embedded PDF fonts."
+};
+
+function getL10nFallback(key, args) {
+  switch (key) {
+    case "find_match_count":
+      key = `find_match_count[${args.total === 1 ? "one" : "other"}]`;
+      break;
+
+    case "find_match_count_limit":
+      key = `find_match_count_limit[${args.limit === 1 ? "one" : "other"}]`;
+      break;
+  }
+
+  return DEFAULT_L10N_STRINGS[key] || "";
+}
+
+const PARTIAL_LANG_CODES = {
+  en: "en-US",
+  es: "es-ES",
+  fy: "fy-NL",
+  ga: "ga-IE",
+  gu: "gu-IN",
+  hi: "hi-IN",
+  hy: "hy-AM",
+  nb: "nb-NO",
+  ne: "ne-NP",
+  nn: "nn-NO",
+  pa: "pa-IN",
+  pt: "pt-PT",
+  sv: "sv-SE",
+  zh: "zh-CN"
+};
+
+function fixupLangCode(langCode) {
+  return PARTIAL_LANG_CODES[langCode?.toLowerCase()] || langCode;
+}
+
+function formatL10nValue(text, args) {
+  if (!args) {
+    return text;
+  }
+
+  return text.replace(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => {
+    return name in args ? args[name] : "{{" + name + "}}";
+  });
+}
+
+const NullL10n = {
+  async getLanguage() {
+    return "en-us";
+  },
+
+  async getDirection() {
+    return "ltr";
+  },
+
+  async get(key, args = null, fallback = getL10nFallback(key, args)) {
+    return formatL10nValue(fallback, args);
+  },
+
+  async translate(element) {}
+
+};
+exports.NullL10n = NullL10n;
+
+/***/ }),
+/* 31 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
 exports.PDFPageView = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
 var _pdfjsLib = __webpack_require__(5);
 
+var _l10n_utils = __webpack_require__(30);
+
 var _pdf_rendering_queue = __webpack_require__(8);
 
-var _viewer_compatibility = __webpack_require__(4);
+var _viewer_compatibility = __webpack_require__(2);
 
 const MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;
 
@@ -10668,34 +11486,42 @@ class PDFPageView {
     this.scale = options.scale || _ui_utils.DEFAULT_SCALE;
     this.viewport = defaultViewport;
     this.pdfPageRotate = defaultViewport.rotation;
-    this._annotationStorage = options.annotationStorage || null;
     this._optionalContentConfigPromise = options.optionalContentConfigPromise || null;
     this.hasRestrictedScaling = false;
     this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : 
_ui_utils.TextLayerMode.ENABLE;
     this.imageResourcesPath = options.imageResourcesPath || "";
-    this.renderInteractiveForms = typeof options.renderInteractiveForms === "boolean" ? 
options.renderInteractiveForms : true;
+    this.renderInteractiveForms = options.renderInteractiveForms !== false;
     this.useOnlyCssZoom = options.useOnlyCssZoom || false;
     this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;
     this.eventBus = options.eventBus;
     this.renderingQueue = options.renderingQueue;
     this.textLayerFactory = options.textLayerFactory;
     this.annotationLayerFactory = options.annotationLayerFactory;
+    this.xfaLayerFactory = options.xfaLayerFactory;
+    this.structTreeLayerFactory = options.structTreeLayerFactory;
     this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
-    this.enableWebGL = options.enableWebGL || false;
-    this.l10n = options.l10n || _ui_utils.NullL10n;
+    this.l10n = options.l10n || _l10n_utils.NullL10n;
     this.paintTask = null;
     this.paintedViewportMap = new WeakMap();
     this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
     this.resume = null;
-    this.error = null;
+    this._renderError = null;
     this.annotationLayer = null;
     this.textLayer = null;
     this.zoomLayer = null;
+    this.xfaLayer = null;
+    this.structTreeLayer = null;
     const div = document.createElement("div");
     div.className = "page";
     div.style.width = Math.floor(this.viewport.width) + "px";
     div.style.height = Math.floor(this.viewport.height) + "px";
     div.setAttribute("data-page-number", this.id);
+    div.setAttribute("role", "region");
+    this.l10n.get("page_landmark", {
+      page: this.id
+    }).then(msg => {
+      div.setAttribute("aria-label", msg);
+    });
     this.div = div;
     container.appendChild(div);
   }
@@ -10708,7 +11534,6 @@ class PDFPageView {
       scale: this.scale * _ui_utils.CSS_UNITS,
       rotation: totalRotation
     });
-    this.stats = pdfPage.stats;
     this.reset();
   }
 
@@ -10736,6 +11561,22 @@ class PDFPageView {
     }
   }
 
+  async _renderXfaLayer() {
+    let error = null;
+
+    try {
+      await this.xfaLayer.render(this.viewport, "display");
+    } catch (ex) {
+      error = ex;
+    } finally {
+      this.eventBus.dispatch("xfalayerrendered", {
+        source: this,
+        pageNumber: this.id,
+        error
+      });
+    }
+  }
+
   _resetZoomLayer(removeFromDOM = false) {
     if (!this.zoomLayer) {
       return;
@@ -10753,21 +11594,32 @@ class PDFPageView {
     this.zoomLayer = null;
   }
 
-  reset(keepZoomLayer = false, keepAnnotations = false) {
-    this.cancelRendering(keepAnnotations);
+  reset({
+    keepZoomLayer = false,
+    keepAnnotationLayer = false,
+    keepXfaLayer = false
+  } = {}) {
+    this.cancelRendering({
+      keepAnnotationLayer,
+      keepXfaLayer
+    });
     this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
     const div = this.div;
     div.style.width = Math.floor(this.viewport.width) + "px";
     div.style.height = Math.floor(this.viewport.height) + "px";
-    const childNodes = div.childNodes;
-    const currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;
-    const currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || 
null;
+    const childNodes = div.childNodes,
+          zoomLayerNode = keepZoomLayer && this.zoomLayer || null,
+          annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null,
+          xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null;
 
     for (let i = childNodes.length - 1; i >= 0; i--) {
       const node = childNodes[i];
 
-      if (currentZoomLayerNode === node || currentAnnotationNode === node) {
-        continue;
+      switch (node) {
+        case zoomLayerNode:
+        case annotationLayerNode:
+        case xfaLayerNode:
+          continue;
       }
 
       div.removeChild(node);
@@ -10775,14 +11627,15 @@ class PDFPageView {
 
     div.removeAttribute("data-loaded");
 
-    if (currentAnnotationNode) {
+    if (annotationLayerNode) {
       this.annotationLayer.hide();
-    } else if (this.annotationLayer) {
-      this.annotationLayer.cancel();
-      this.annotationLayer = null;
     }
 
-    if (!currentZoomLayerNode) {
+    if (xfaLayerNode) {
+      this.xfaLayer.hide();
+    }
+
+    if (!zoomLayerNode) {
       if (this.canvas) {
         this.paintedViewportMap.delete(this.canvas);
         this.canvas.width = 0;
@@ -10800,6 +11653,10 @@ class PDFPageView {
 
     this.loadingIconDiv = document.createElement("div");
     this.loadingIconDiv.className = "loadingIcon";
+    this.loadingIconDiv.setAttribute("role", "img");
+    this.l10n.get("loading").then(msg => {
+      this.loadingIconDiv?.setAttribute("aria-label", msg);
+    });
     div.appendChild(this.loadingIconDiv);
   }
 
@@ -10821,12 +11678,17 @@ class PDFPageView {
     });
 
     if (this.svg) {
-      this.cssTransform(this.svg, true);
+      this.cssTransform({
+        target: this.svg,
+        redrawAnnotationLayer: true,
+        redrawXfaLayer: true
+      });
       this.eventBus.dispatch("pagerendered", {
         source: this,
         pageNumber: this.id,
         cssTransform: true,
-        timestamp: performance.now()
+        timestamp: performance.now(),
+        error: this._renderError
       });
       return;
     }
@@ -10843,30 +11705,44 @@ class PDFPageView {
 
     if (this.canvas) {
       if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {
-        this.cssTransform(this.canvas, true);
+        this.cssTransform({
+          target: this.canvas,
+          redrawAnnotationLayer: true,
+          redrawXfaLayer: true
+        });
         this.eventBus.dispatch("pagerendered", {
           source: this,
           pageNumber: this.id,
           cssTransform: true,
-          timestamp: performance.now()
+          timestamp: performance.now(),
+          error: this._renderError
         });
         return;
       }
 
-      if (!this.zoomLayer && !this.canvas.hasAttribute("hidden")) {
+      if (!this.zoomLayer && !this.canvas.hidden) {
         this.zoomLayer = this.canvas.parentNode;
         this.zoomLayer.style.position = "absolute";
       }
     }
 
     if (this.zoomLayer) {
-      this.cssTransform(this.zoomLayer.firstChild);
+      this.cssTransform({
+        target: this.zoomLayer.firstChild
+      });
     }
 
-    this.reset(true, true);
+    this.reset({
+      keepZoomLayer: true,
+      keepAnnotationLayer: true,
+      keepXfaLayer: true
+    });
   }
 
-  cancelRendering(keepAnnotations = false) {
+  cancelRendering({
+    keepAnnotationLayer = false,
+    keepXfaLayer = false
+  } = {}) {
     if (this.paintTask) {
       this.paintTask.cancel();
       this.paintTask = null;
@@ -10879,13 +11755,28 @@ class PDFPageView {
       this.textLayer = null;
     }
 
-    if (!keepAnnotations && this.annotationLayer) {
+    if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) {
       this.annotationLayer.cancel();
       this.annotationLayer = null;
     }
+
+    if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {
+      this.xfaLayer.cancel();
+      this.xfaLayer = null;
+    }
+
+    if (this._onTextLayerRendered) {
+      this.eventBus._off("textlayerrendered", this._onTextLayerRendered);
+
+      this._onTextLayerRendered = null;
+    }
   }
 
-  cssTransform(target, redrawAnnotations = false) {
+  cssTransform({
+    target,
+    redrawAnnotationLayer = false,
+    redrawXfaLayer = false
+  }) {
     const width = this.viewport.width;
     const height = this.viewport.height;
     const div = this.div;
@@ -10901,8 +11792,7 @@ class PDFPageView {
       scaleY = width / height;
     }
 
-    const cssTransform = "rotate(" + relativeRotation + "deg) " + "scale(" + scaleX + "," + scaleY + ")";
-    target.style.transform = cssTransform;
+    target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`;
 
     if (this.textLayer) {
       const textLayerViewport = this.textLayer.viewport;
@@ -10942,13 +11832,17 @@ class PDFPageView {
           break;
       }
 
-      textLayerDiv.style.transform = "rotate(" + textAbsRotation + "deg) " + "scale(" + scale + ", " + scale 
+ ") " + "translate(" + transX + ", " + transY + ")";
+      textLayerDiv.style.transform = `rotate(${textAbsRotation}deg) ` + `scale(${scale}) ` + 
`translate(${transX}, ${transY})`;
       textLayerDiv.style.transformOrigin = "0% 0%";
     }
 
-    if (redrawAnnotations && this.annotationLayer) {
+    if (redrawAnnotationLayer && this.annotationLayer) {
       this._renderAnnotationLayer();
     }
+
+    if (redrawXfaLayer && this.xfaLayer) {
+      this._renderXfaLayer();
+    }
   }
 
   get width() {
@@ -10991,7 +11885,7 @@ class PDFPageView {
     canvasWrapper.style.height = div.style.height;
     canvasWrapper.classList.add("canvasWrapper");
 
-    if (this.annotationLayer && this.annotationLayer.div) {
+    if (this.annotationLayer?.div) {
       div.insertBefore(canvasWrapper, this.annotationLayer.div);
     } else {
       div.appendChild(canvasWrapper);
@@ -11005,7 +11899,7 @@ class PDFPageView {
       textLayerDiv.style.width = canvasWrapper.style.width;
       textLayerDiv.style.height = canvasWrapper.style.height;
 
-      if (this.annotationLayer && this.annotationLayer.div) {
+      if (this.annotationLayer?.div) {
         div.insertBefore(textLayerDiv, this.annotationLayer.div);
       } else {
         div.appendChild(textLayerDiv);
@@ -11015,6 +11909,11 @@ class PDFPageView {
     }
 
     this.textLayer = textLayer;
+
+    if (this.xfaLayer?.div) {
+      div.appendChild(this.xfaLayer.div);
+    }
+
     let renderContinueCallback = null;
 
     if (this.renderingQueue) {
@@ -11034,16 +11933,17 @@ class PDFPageView {
       };
     }
 
-    const finishPaintTask = async error => {
+    const finishPaintTask = async (error = null) => {
       if (paintTask === this.paintTask) {
         this.paintTask = null;
       }
 
       if (error instanceof _pdfjsLib.RenderingCancelledException) {
-        this.error = null;
+        this._renderError = null;
         return;
       }
 
+      this._renderError = error;
       this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
 
       if (this.loadingIconDiv) {
@@ -11053,13 +11953,12 @@ class PDFPageView {
 
       this._resetZoomLayer(true);
 
-      this.error = error;
-      this.stats = pdfPage.stats;
       this.eventBus.dispatch("pagerendered", {
         source: this,
         pageNumber: this.id,
         cssTransform: false,
-        timestamp: performance.now()
+        timestamp: performance.now(),
+        error: this._renderError
       });
 
       if (error) {
@@ -11070,11 +11969,12 @@ class PDFPageView {
     const paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : 
this.paintOnCanvas(canvasWrapper);
     paintTask.onRenderContinue = renderContinueCallback;
     this.paintTask = paintTask;
-    const resultPromise = paintTask.promise.then(function () {
-      return finishPaintTask(null).then(function () {
+    const resultPromise = paintTask.promise.then(() => {
+      return finishPaintTask(null).then(() => {
         if (textLayer) {
           const readableStream = pdfPage.streamTextContent({
-            normalizeWhitespace: true
+            normalizeWhitespace: true,
+            includeMarkedContent: true
           });
           textLayer.setTextContentStream(readableStream);
           textLayer.render();
@@ -11086,12 +11986,54 @@ class PDFPageView {
 
     if (this.annotationLayerFactory) {
       if (!this.annotationLayer) {
-        this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, 
this._annotationStorage, this.imageResourcesPath, this.renderInteractiveForms, this.l10n);
+        this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, null, 
this.imageResourcesPath, this.renderInteractiveForms, this.l10n, null, null, null);
       }
 
       this._renderAnnotationLayer();
     }
 
+    if (this.xfaLayerFactory) {
+      if (!this.xfaLayer) {
+        this.xfaLayer = this.xfaLayerFactory.createXfaLayerBuilder(div, pdfPage, null);
+      }
+
+      this._renderXfaLayer();
+    }
+
+    if (this.structTreeLayerFactory && this.textLayer && this.canvas) {
+      this._onTextLayerRendered = event => {
+        if (event.pageNumber !== this.id) {
+          return;
+        }
+
+        this.eventBus._off("textlayerrendered", this._onTextLayerRendered);
+
+        this._onTextLayerRendered = null;
+
+        if (!this.canvas) {
+          return;
+        }
+
+        this.pdfPage.getStructTree().then(tree => {
+          if (!tree) {
+            return;
+          }
+
+          if (!this.canvas) {
+            return;
+          }
+
+          const treeDom = this.structTreeLayer.render(tree);
+          treeDom.classList.add("structTree");
+          this.canvas.appendChild(treeDom);
+        });
+      };
+
+      this.eventBus._on("textlayerrendered", this._onTextLayerRendered);
+
+      this.structTreeLayer = this.structTreeLayerFactory.createStructTreeLayerBuilder(pdfPage);
+    }
+
     div.setAttribute("data-loaded", true);
     this.eventBus.dispatch("pagerender", {
       source: this,
@@ -11116,17 +12058,12 @@ class PDFPageView {
     };
     const viewport = this.viewport;
     const canvas = document.createElement("canvas");
-    this.l10n.get("page_canvas", {
-      page: this.id
-    }, "Page {{page}}").then(msg => {
-      canvas.setAttribute("aria-label", msg);
-    });
-    canvas.setAttribute("hidden", "hidden");
+    canvas.hidden = true;
     let isCanvasHidden = true;
 
     const showCanvas = function () {
       if (isCanvasHidden) {
-        canvas.removeAttribute("hidden");
+        canvas.hidden = false;
         isCanvasHidden = false;
       }
     };
@@ -11175,7 +12112,6 @@ class PDFPageView {
       canvasContext: ctx,
       transform,
       viewport: this.viewport,
-      enableWebGL: this.enableWebGL,
       renderInteractiveForms: this.renderInteractiveForms,
       optionalContentConfigPromise: this._optionalContentConfigPromise
     };
@@ -11216,7 +12152,7 @@ class PDFPageView {
     });
     const promise = pdfPage.getOperatorList().then(opList => {
       ensureNotCancelled();
-      const svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);
+      const svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs, 
_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);
       return svgGfx.getSVG(opList, actualSizeViewport).then(svg => {
         ensureNotCancelled();
         this.svg = svg;
@@ -11256,16 +12192,141 @@ class PDFPageView {
 exports.PDFPageView = PDFPageView;
 
 /***/ }),
-/* 30 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 32 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
-exports.DefaultTextLayerFactory = exports.TextLayerBuilder = void 0;
+}));
+exports.StructTreeLayerBuilder = exports.DefaultStructTreeLayerFactory = void 0;
+const PDF_ROLE_TO_HTML_ROLE = {
+  Document: null,
+  DocumentFragment: null,
+  Part: "group",
+  Sect: "group",
+  Div: "group",
+  Aside: "note",
+  NonStruct: "none",
+  P: null,
+  H: "heading",
+  Title: null,
+  FENote: "note",
+  Sub: "group",
+  Lbl: null,
+  Span: null,
+  Em: null,
+  Strong: null,
+  Link: "link",
+  Annot: "note",
+  Form: "form",
+  Ruby: null,
+  RB: null,
+  RT: null,
+  RP: null,
+  Warichu: null,
+  WT: null,
+  WP: null,
+  L: "list",
+  LI: "listitem",
+  LBody: null,
+  Table: "table",
+  TR: "row",
+  TH: "columnheader",
+  TD: "cell",
+  THead: "columnheader",
+  TBody: null,
+  TFoot: null,
+  Caption: null,
+  Figure: "figure",
+  Formula: null,
+  Artifact: null
+};
+const HEADING_PATTERN = /^H(\d+)$/;
+
+class StructTreeLayerBuilder {
+  constructor({
+    pdfPage
+  }) {
+    this.pdfPage = pdfPage;
+  }
+
+  render(structTree) {
+    return this._walk(structTree);
+  }
+
+  _setAttributes(structElement, htmlElement) {
+    if (structElement.alt !== undefined) {
+      htmlElement.setAttribute("aria-label", structElement.alt);
+    }
+
+    if (structElement.id !== undefined) {
+      htmlElement.setAttribute("aria-owns", structElement.id);
+    }
+  }
+
+  _walk(node) {
+    if (!node) {
+      return null;
+    }
+
+    const element = document.createElement("span");
+
+    if ("role" in node) {
+      const {
+        role
+      } = node;
+      const match = role.match(HEADING_PATTERN);
+
+      if (match) {
+        element.setAttribute("role", "heading");
+        element.setAttribute("aria-level", match[1]);
+      } else if (PDF_ROLE_TO_HTML_ROLE[role]) {
+        element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]);
+      }
+    }
+
+    this._setAttributes(node, element);
+
+    if (node.children) {
+      if (node.children.length === 1 && "id" in node.children[0]) {
+        this._setAttributes(node.children[0], element);
+      } else {
+        for (const kid of node.children) {
+          element.appendChild(this._walk(kid));
+        }
+      }
+    }
+
+    return element;
+  }
+
+}
+
+exports.StructTreeLayerBuilder = StructTreeLayerBuilder;
+
+class DefaultStructTreeLayerFactory {
+  createStructTreeLayerBuilder(pdfPage) {
+    return new StructTreeLayerBuilder({
+      pdfPage
+    });
+  }
+
+}
+
+exports.DefaultStructTreeLayerFactory = DefaultStructTreeLayerFactory;
+
+/***/ }),
+/* 33 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.TextLayerBuilder = exports.DefaultTextLayerFactory = void 0;
 
 var _pdfjsLib = __webpack_require__(5);
 
@@ -11381,13 +12442,11 @@ class TextLayerBuilder {
     }
 
     const {
-      findController,
       textContentItemsStr
     } = this;
     let i = 0,
         iIndex = 0;
     const end = textContentItemsStr.length - 1;
-    const queryLen = findController.state.query.length;
     const result = [];
 
     for (let m = 0, mm = matches.length; m < mm; m++) {
@@ -11408,12 +12467,7 @@ class TextLayerBuilder {
           offset: matchIdx - iIndex
         }
       };
-
-      if (matchesLength) {
-        matchIdx += matchesLength[m];
-      } else {
-        matchIdx += queryLen;
-      }
+      matchIdx += matchesLength[m];
 
       while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
         iIndex += textContentItemsStr[i].length;
@@ -11453,7 +12507,7 @@ class TextLayerBuilder {
     function beginText(begin, className) {
       const divIdx = begin.divIdx;
       textDivs[divIdx].textContent = "";
-      appendTextToDiv(divIdx, 0, begin.offset, className);
+      return appendTextToDiv(divIdx, 0, begin.offset, className);
     }
 
     function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
@@ -11463,13 +12517,14 @@ class TextLayerBuilder {
 
       if (className) {
         const span = document.createElement("span");
-        span.className = className;
+        span.className = `${className} appended`;
         span.appendChild(node);
         div.appendChild(span);
-        return;
+        return className.includes("selected") ? span.offsetLeft : 0;
       }
 
       div.appendChild(node);
+      return 0;
     }
 
     let i0 = selectedMatchIdx,
@@ -11488,14 +12543,7 @@ class TextLayerBuilder {
       const end = match.end;
       const isSelected = isSelectedPage && i === selectedMatchIdx;
       const highlightSuffix = isSelected ? " selected" : "";
-
-      if (isSelected) {
-        findController.scrollMatchIntoView({
-          element: textDivs[begin.divIdx],
-          pageIndex: pageIdx,
-          matchIndex: selectedMatchIdx
-        });
-      }
+      let selectedLeft = 0;
 
       if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
         if (prevEnd !== null) {
@@ -11508,9 +12556,9 @@ class TextLayerBuilder {
       }
 
       if (begin.divIdx === end.divIdx) {
-        appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix);
+        selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + 
highlightSuffix);
       } else {
-        appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix);
+        selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + 
highlightSuffix);
 
         for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
           textDivs[n0].className = "highlight middle" + highlightSuffix;
@@ -11520,6 +12568,15 @@ class TextLayerBuilder {
       }
 
       prevEnd = end;
+
+      if (isSelected) {
+        findController.scrollMatchIntoView({
+          element: textDivs[begin.divIdx],
+          selectedLeft,
+          pageIndex: pageIdx,
+          matchIndex: selectedMatchIdx
+        });
+      }
     }
 
     if (prevEnd) {
@@ -11554,7 +12611,7 @@ class TextLayerBuilder {
       clearedUntilDivIdx = match.end.divIdx + 1;
     }
 
-    if (!findController || !findController.highlightMatches) {
+    if (!findController?.highlightMatches) {
       return;
     }
 
@@ -11640,22 +12697,130 @@ class DefaultTextLayerFactory {
 exports.DefaultTextLayerFactory = DefaultTextLayerFactory;
 
 /***/ }),
-/* 31 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 34 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
+exports.XfaLayerBuilder = exports.DefaultXfaLayerFactory = void 0;
+
+var _pdfjsLib = __webpack_require__(5);
+
+class XfaLayerBuilder {
+  constructor({
+    pageDiv,
+    pdfPage,
+    xfaHtml,
+    annotationStorage
+  }) {
+    this.pageDiv = pageDiv;
+    this.pdfPage = pdfPage;
+    this.xfaHtml = xfaHtml;
+    this.annotationStorage = annotationStorage;
+    this.div = null;
+    this._cancelled = false;
+  }
+
+  render(viewport, intent = "display") {
+    if (intent === "print") {
+      const parameters = {
+        viewport: viewport.clone({
+          dontFlip: true
+        }),
+        div: this.div,
+        xfa: this.xfaHtml,
+        page: null,
+        annotationStorage: this.annotationStorage,
+        intent
+      };
+      const div = document.createElement("div");
+      this.pageDiv.appendChild(div);
+      parameters.div = div;
+
+      _pdfjsLib.XfaLayer.render(parameters);
+
+      return Promise.resolve();
+    }
+
+    return this.pdfPage.getXfa().then(xfa => {
+      if (this._cancelled) {
+        return;
+      }
+
+      const parameters = {
+        viewport: viewport.clone({
+          dontFlip: true
+        }),
+        div: this.div,
+        xfa,
+        page: this.pdfPage,
+        annotationStorage: this.annotationStorage,
+        intent
+      };
+
+      if (this.div) {
+        _pdfjsLib.XfaLayer.update(parameters);
+      } else {
+        this.div = document.createElement("div");
+        this.pageDiv.appendChild(this.div);
+        parameters.div = this.div;
+
+        _pdfjsLib.XfaLayer.render(parameters);
+      }
+    }).catch(error => {
+      console.error(error);
+    });
+  }
+
+  cancel() {
+    this._cancelled = true;
+  }
+
+  hide() {
+    if (!this.div) {
+      return;
+    }
+
+    this.div.hidden = true;
+  }
+
+}
+
+exports.XfaLayerBuilder = XfaLayerBuilder;
+
+class DefaultXfaLayerFactory {
+  createXfaLayerBuilder(pageDiv, pdfPage, annotationStorage = null, xfaHtml = null) {
+    return new XfaLayerBuilder({
+      pageDiv,
+      pdfPage,
+      annotationStorage,
+      xfaHtml
+    });
+  }
+
+}
+
+exports.DefaultXfaLayerFactory = DefaultXfaLayerFactory;
+
+/***/ }),
+/* 35 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
 exports.SecondaryToolbar = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
 var _pdf_cursor_tools = __webpack_require__(6);
 
-var _pdf_single_page_viewer = __webpack_require__(32);
+var _pdf_single_page_viewer = __webpack_require__(36);
 
 class SecondaryToolbar {
   constructor(options, mainContainer, eventBus) {
@@ -11917,6 +13082,7 @@ class SecondaryToolbar {
     this._setMaxHeight();
 
     this.toggleButton.classList.add("toggled");
+    this.toggleButton.setAttribute("aria-expanded", "true");
     this.toolbar.classList.remove("hidden");
   }
 
@@ -11928,6 +13094,7 @@ class SecondaryToolbar {
     this.opened = false;
     this.toolbar.classList.add("hidden");
     this.toggleButton.classList.remove("toggled");
+    this.toggleButton.setAttribute("aria-expanded", "false");
   }
 
   toggle() {
@@ -11958,18 +13125,17 @@ class SecondaryToolbar {
 exports.SecondaryToolbar = SecondaryToolbar;
 
 /***/ }),
-/* 32 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 36 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.PDFSinglePageViewer = void 0;
 
-var _base_viewer = __webpack_require__(27);
+var _base_viewer = __webpack_require__(28);
 
 var _pdfjsLib = __webpack_require__(5);
 
@@ -11986,6 +13152,10 @@ class PDFSinglePageViewer extends _base_viewer.BaseViewer {
     return (0, _pdfjsLib.shadow)(this, "_viewerElement", this._shadowViewer);
   }
 
+  get _pageWidthScaleFactor() {
+    return 1;
+  }
+
   _resetView() {
     super._resetView();
 
@@ -12075,30 +13245,33 @@ class PDFSinglePageViewer extends _base_viewer.BaseViewer {
 
   _updateSpreadMode() {}
 
+  _getPageAdvance() {
+    return 1;
+  }
+
 }
 
 exports.PDFSinglePageViewer = PDFSinglePageViewer;
 
 /***/ }),
-/* 33 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 37 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.Toolbar = void 0;
 
-var _ui_utils = __webpack_require__(2);
+var _ui_utils = __webpack_require__(4);
 
 const PAGE_NUMBER_LOADING_INDICATOR = "visiblePageIsLoading";
 const SCALE_SELECT_CONTAINER_WIDTH = 140;
 const SCALE_SELECT_WIDTH = 162;
 
 class Toolbar {
-  constructor(options, eventBus, l10n = _ui_utils.NullL10n) {
+  constructor(options, eventBus, l10n) {
     this.toolbar = options.container;
     this.eventBus = eventBus;
     this.l10n = l10n;
@@ -12220,6 +13393,13 @@ class Toolbar {
         value: this.value
       });
     });
+    scaleSelect.addEventListener("click", function (evt) {
+      const target = evt.target;
+
+      if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") {
+        this.blur();
+      }
+    });
     scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;
 
     this.eventBus._on("localized", () => {
@@ -12251,7 +13431,7 @@ class Toolbar {
         items.pageNumber.type = "number";
         this.l10n.get("of_pages", {
           pagesCount
-        }, "of {{pagesCount}}").then(msg => {
+        }).then(msg => {
           items.numPages.textContent = msg;
         });
       }
@@ -12264,7 +13444,7 @@ class Toolbar {
       this.l10n.get("page_of_pages", {
         pageNumber,
         pagesCount
-      }, "({{pageNumber}} of {{pagesCount}})").then(msg => {
+      }).then(msg => {
         items.numPages.textContent = msg;
       });
     } else {
@@ -12275,10 +13455,9 @@ class Toolbar {
     items.next.disabled = pageNumber >= pagesCount;
     items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE;
     items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE;
-    const customScale = Math.round(pageScale * 10000) / 100;
     this.l10n.get("page_scale_percent", {
-      scale: customScale
-    }, "{{scale}}%").then(msg => {
+      scale: Math.round(pageScale * 10000) / 100
+    }).then(msg => {
       let predefinedValueFound = false;
 
       for (const option of items.scaleSelect.options) {
@@ -12308,7 +13487,7 @@ class Toolbar {
       items,
       l10n
     } = this;
-    const predefinedValuesPromise = Promise.all([l10n.get("page_scale_auto", null, "Automatic Zoom"), 
l10n.get("page_scale_actual", null, "Actual Size"), l10n.get("page_scale_fit", null, "Page Fit"), 
l10n.get("page_scale_width", null, "Page Width")]);
+    const predefinedValuesPromise = Promise.all([l10n.get("page_scale_auto"), l10n.get("page_scale_actual"), 
l10n.get("page_scale_fit"), l10n.get("page_scale_width")]);
     let canvas = document.createElement("canvas");
     canvas.mozOpaque = true;
     let ctx = canvas.getContext("2d", {
@@ -12350,15 +13529,14 @@ class Toolbar {
 exports.Toolbar = Toolbar;
 
 /***/ }),
-/* 34 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 38 */
+/***/ ((__unused_webpack_module, exports) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.ViewHistory = void 0;
 const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
 
@@ -12446,24 +13624,25 @@ class ViewHistory {
 exports.ViewHistory = ViewHistory;
 
 /***/ }),
-/* 35 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 39 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.GenericCom = void 0;
 
-var _app = __webpack_require__(1);
+var _app = __webpack_require__(3);
 
-var _preferences = __webpack_require__(36);
+var _preferences = __webpack_require__(40);
 
-var _download_manager = __webpack_require__(37);
+var _download_manager = __webpack_require__(41);
 
-var _genericl10n = __webpack_require__(38);
+var _genericl10n = __webpack_require__(42);
+
+var _generic_scripting = __webpack_require__(44);
 
 ;
 const GenericCom = {};
@@ -12482,7 +13661,7 @@ class GenericPreferences extends _preferences.BasePreferences {
 
 class GenericExternalServices extends _app.DefaultExternalServices {
   static createDownloadManager(options) {
-    return new _download_manager.DownloadManager(options);
+    return new _download_manager.DownloadManager();
   }
 
   static createPreferences() {
@@ -12495,56 +13674,28 @@ class GenericExternalServices extends _app.DefaultExternalServices {
     return new _genericl10n.GenericL10n(locale);
   }
 
+  static createScripting({
+    sandboxBundleSrc
+  }) {
+    return new _generic_scripting.GenericScripting(sandboxBundleSrc);
+  }
+
 }
 
 _app.PDFViewerApplication.externalServices = GenericExternalServices;
 
 /***/ }),
-/* 36 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 40 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.BasePreferences = void 0;
 
-var _app_options = __webpack_require__(3);
-
-let defaultPreferences = null;
-
-function getDefaultPreferences() {
-  if (!defaultPreferences) {
-    defaultPreferences = Promise.resolve({
-      "cursorToolOnLoad": 0,
-      "defaultZoomValue": "",
-      "disablePageLabels": false,
-      "enablePermissions": false,
-      "enablePrintAutoRotate": false,
-      "enableWebGL": false,
-      "externalLinkTarget": 0,
-      "historyUpdateUrl": false,
-      "ignoreDestinationZoom": false,
-      "pdfBugEnabled": false,
-      "renderer": "canvas",
-      "renderInteractiveForms": true,
-      "sidebarViewOnLoad": -1,
-      "scrollModeOnLoad": -1,
-      "spreadModeOnLoad": -1,
-      "textLayerMode": 1,
-      "useOnlyCssZoom": false,
-      "viewOnLoad": 0,
-      "disableAutoFetch": false,
-      "disableFontFace": false,
-      "disableRange": false,
-      "disableStream": false
-    });
-  }
-
-  return defaultPreferences;
-}
+var _app_options = __webpack_require__(1);
 
 class BasePreferences {
   constructor() {
@@ -12552,30 +13703,45 @@ class BasePreferences {
       throw new Error("Cannot initialize BasePreferences.");
     }
 
-    this.prefs = null;
-    this._initializedPromise = getDefaultPreferences().then(defaults => {
-      Object.defineProperty(this, "defaults", {
-        value: Object.freeze(defaults),
-        writable: false,
-        enumerable: true,
-        configurable: false
-      });
-      this.prefs = Object.assign(Object.create(null), defaults);
-      return this._readFromStorage(defaults);
-    }).then(prefs => {
-      if (!prefs) {
-        return;
-      }
-
-      for (const name in prefs) {
-        const defaultValue = this.defaults[name],
-              prefValue = prefs[name];
+    Object.defineProperty(this, "defaults", {
+      value: Object.freeze({
+        "cursorToolOnLoad": 0,
+        "defaultZoomValue": "",
+        "disablePageLabels": false,
+        "enablePermissions": false,
+        "enablePrintAutoRotate": true,
+        "enableScripting": true,
+        "externalLinkTarget": 0,
+        "historyUpdateUrl": false,
+        "ignoreDestinationZoom": false,
+        "pdfBugEnabled": false,
+        "renderer": "canvas",
+        "renderInteractiveForms": true,
+        "sidebarViewOnLoad": -1,
+        "scrollModeOnLoad": -1,
+        "spreadModeOnLoad": -1,
+        "textLayerMode": 1,
+        "useOnlyCssZoom": false,
+        "viewerCssTheme": 0,
+        "viewOnLoad": 0,
+        "disableAutoFetch": false,
+        "disableFontFace": false,
+        "disableRange": false,
+        "disableStream": false,
+        "enableXfa": false
+      }),
+      writable: false,
+      enumerable: true,
+      configurable: false
+    });
+    this.prefs = Object.create(null);
+    this._initializedPromise = this._readFromStorage(this.defaults).then(prefs => {
+      for (const name in this.defaults) {
+        const prefValue = prefs?.[name];
 
-        if (defaultValue === undefined || typeof prefValue !== typeof defaultValue) {
-          continue;
+        if (typeof prefValue === typeof this.defaults[name]) {
+          this.prefs[name] = prefValue;
         }
-
-        this.prefs[name] = prefValue;
       }
     });
   }
@@ -12590,7 +13756,7 @@ class BasePreferences {
 
   async reset() {
     await this._initializedPromise;
-    this.prefs = Object.assign(Object.create(null), this.defaults);
+    this.prefs = Object.create(null);
     return this._writeToStorage(this.defaults);
   }
 
@@ -12611,7 +13777,7 @@ class BasePreferences {
       if (valueType === "number" && defaultType === "string") {
         value = value.toString();
       } else {
-        throw new Error(`Set preference: "${value}" is a ${valueType}, ` + `expected a ${defaultType}.`);
+        throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`);
       }
     } else {
       if (valueType === "number" && !Number.isInteger(value)) {
@@ -12625,24 +13791,26 @@ class BasePreferences {
 
   async get(name) {
     await this._initializedPromise;
-    const defaultValue = this.defaults[name];
+    const defaultValue = this.defaults[name],
+          prefValue = this.prefs[name];
 
     if (defaultValue === undefined) {
       throw new Error(`Get preference: "${name}" is undefined.`);
-    } else {
-      const prefValue = this.prefs[name];
-
-      if (prefValue !== undefined) {
-        return prefValue;
-      }
     }
 
-    return defaultValue;
+    return prefValue !== undefined ? prefValue : defaultValue;
   }
 
   async getAll() {
     await this._initializedPromise;
-    return Object.assign(Object.create(null), this.defaults, this.prefs);
+    const obj = Object.create(null);
+
+    for (const name in this.defaults) {
+      const prefValue = this.prefs[name];
+      obj[name] = prefValue !== undefined ? prefValue : this.defaults[name];
+    }
+
+    return obj;
   }
 
 }
@@ -12650,20 +13818,19 @@ class BasePreferences {
 exports.BasePreferences = BasePreferences;
 
 /***/ }),
-/* 37 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 41 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.DownloadManager = void 0;
 
 var _pdfjsLib = __webpack_require__(5);
 
-var _viewer_compatibility = __webpack_require__(4);
+var _viewer_compatibility = __webpack_require__(2);
 
 ;
 
@@ -12687,6 +13854,10 @@ function download(blobUrl, filename) {
 }
 
 class DownloadManager {
+  constructor() {
+    this._openBlobUrls = new WeakMap();
+  }
+
   downloadUrl(url, filename) {
     if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, "http://example.com";)) {
       return;
@@ -12696,26 +13867,44 @@ class DownloadManager {
   }
 
   downloadData(data, filename, contentType) {
-    if (navigator.msSaveBlob) {
-      navigator.msSaveBlob(new Blob([data], {
-        type: contentType
-      }), filename);
-      return;
-    }
-
     const blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, 
_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);
     download(blobUrl, filename);
   }
 
-  download(blob, url, filename, sourceEventType = "download") {
-    if (navigator.msSaveBlob) {
-      if (!navigator.msSaveBlob(blob, filename)) {
-        this.downloadUrl(url, filename);
+  openOrDownloadData(element, data, filename) {
+    const isPdfData = (0, _pdfjsLib.isPdfFile)(filename);
+    const contentType = isPdfData ? "application/pdf" : "";
+
+    if (isPdfData && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
+      let blobUrl = this._openBlobUrls.get(element);
+
+      if (!blobUrl) {
+        blobUrl = URL.createObjectURL(new Blob([data], {
+          type: contentType
+        }));
+
+        this._openBlobUrls.set(element, blobUrl);
       }
 
-      return;
+      let viewerUrl;
+      viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
+
+      try {
+        window.open(viewerUrl);
+        return true;
+      } catch (ex) {
+        console.error(`openOrDownloadData: ${ex}`);
+        URL.revokeObjectURL(blobUrl);
+
+        this._openBlobUrls.delete(element);
+      }
     }
 
+    this.downloadData(data, filename, contentType);
+    return false;
+  }
+
+  download(blob, url, filename, sourceEventType = "download") {
     if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
       this.downloadUrl(url, filename);
       return;
@@ -12730,18 +13919,19 @@ class DownloadManager {
 exports.DownloadManager = DownloadManager;
 
 /***/ }),
-/* 38 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 42 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
 exports.GenericL10n = void 0;
 
-__webpack_require__(39);
+__webpack_require__(43);
+
+var _l10n_utils = __webpack_require__(30);
 
 const webL10n = document.webL10n;
 
@@ -12749,7 +13939,7 @@ class GenericL10n {
   constructor(lang) {
     this._lang = lang;
     this._ready = new Promise((resolve, reject) => {
-      webL10n.setLanguage(lang, () => {
+      webL10n.setLanguage((0, _l10n_utils.fixupLangCode)(lang), () => {
         resolve(webL10n);
       });
     });
@@ -12765,9 +13955,9 @@ class GenericL10n {
     return l10n.getDirection();
   }
 
-  async get(property, args, fallback) {
+  async get(key, args = null, fallback = (0, _l10n_utils.getL10nFallback)(key, args)) {
     const l10n = await this._ready;
-    return l10n.get(property, args, fallback);
+    return l10n.get(key, args, fallback);
   }
 
   async translate(element) {
@@ -12780,10 +13970,9 @@ class GenericL10n {
 exports.GenericL10n = GenericL10n;
 
 /***/ }),
-/* 39 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 43 */
+/***/ (() => {
 
-"use strict";
 
 
 document.webL10n = function (window, document, undefined) {
@@ -13603,22 +14792,89 @@ document.webL10n = function (window, document, undefined) {
 }(window, document);
 
 /***/ }),
-/* 40 */
-/***/ (function(module, exports, __webpack_require__) {
+/* 44 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
-"use strict";
 
 
-Object.defineProperty(exports, "__esModule", {
+Object.defineProperty(exports, "__esModule", ({
   value: true
-});
+}));
+exports.docPropertiesLookup = docPropertiesLookup;
+exports.GenericScripting = void 0;
+
+var _pdfjsLib = __webpack_require__(5);
+
+async function docPropertiesLookup(pdfDocument) {
+  const url = "",
+        baseUrl = url.split("#")[0];
+  let {
+    info,
+    metadata,
+    contentDispositionFilename,
+    contentLength
+  } = await pdfDocument.getMetadata();
+
+  if (!contentLength) {
+    const {
+      length
+    } = await pdfDocument.getDownloadInfo();
+    contentLength = length;
+  }
+
+  return { ...info,
+    baseURL: baseUrl,
+    filesize: contentLength,
+    filename: contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(url),
+    metadata: metadata?.getRaw(),
+    authors: metadata?.get("dc:creator"),
+    numPages: pdfDocument.numPages,
+    URL: url
+  };
+}
+
+class GenericScripting {
+  constructor(sandboxBundleSrc) {
+    this._ready = (0, _pdfjsLib.loadScript)(sandboxBundleSrc, true).then(() => {
+      return window.pdfjsSandbox.QuickJSSandbox();
+    });
+  }
+
+  async createSandbox(data) {
+    const sandbox = await this._ready;
+    sandbox.create(data);
+  }
+
+  async dispatchEventInSandbox(event) {
+    const sandbox = await this._ready;
+    sandbox.dispatchEvent(event);
+  }
+
+  async destroySandbox() {
+    const sandbox = await this._ready;
+    sandbox.nukeSandbox();
+  }
+
+}
+
+exports.GenericScripting = GenericScripting;
+
+/***/ }),
+/* 45 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
 exports.PDFPrintService = PDFPrintService;
 
-var _ui_utils = __webpack_require__(2);
+var _app = __webpack_require__(3);
 
-var _app = __webpack_require__(1);
+var _print_utils = __webpack_require__(46);
 
-var _viewer_compatibility = __webpack_require__(4);
+var _viewer_compatibility = __webpack_require__(2);
 
 let activeService = null;
 let overlayManager = null;
@@ -13628,8 +14884,6 @@ function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printRe
   const PRINT_UNITS = printResolution / 72.0;
   scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
   scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
-  const width = Math.floor(size.width * _ui_utils.CSS_UNITS) + "px";
-  const height = Math.floor(size.height * _ui_utils.CSS_UNITS) + "px";
   const ctx = scratchCanvas.getContext("2d");
   ctx.save();
   ctx.fillStyle = "rgb(255, 255, 255)";
@@ -13644,15 +14898,10 @@ function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printRe
         rotation: size.rotation
       }),
       intent: "print",
-      annotationStorage: pdfDocument.annotationStorage,
+      includeAnnotationStorage: true,
       optionalContentConfigPromise
     };
     return pdfPage.render(renderContext).promise;
-  }).then(function () {
-    return {
-      width,
-      height
-    };
   });
 }
 
@@ -13662,7 +14911,7 @@ function PDFPrintService(pdfDocument, pagesOverview, printContainer, printResolu
   this.printContainer = printContainer;
   this._printResolution = printResolution || 150;
   this._optionalContentConfigPromise = optionalContentConfigPromise || 
pdfDocument.getOptionalContentConfig();
-  this.l10n = l10n || _ui_utils.NullL10n;
+  this.l10n = l10n;
   this.currentPage = -1;
   this.scratchCanvas = document.createElement("canvas");
 }
@@ -13682,7 +14931,7 @@ PDFPrintService.prototype = {
 
     this.pageStyleSheet = document.createElement("style");
     const pageSize = this.pagesOverview[0];
-    this.pageStyleSheet.textContent = "@supports ((size:A4) and (size:1pt 1pt)) {" + "@page { size: " + 
pageSize.width + "pt " + pageSize.height + "pt;}" + "}";
+    this.pageStyleSheet.textContent = "@page { size: " + pageSize.width + "pt " + pageSize.height + "pt;}";
     body.appendChild(this.pageStyleSheet);
   },
 
@@ -13713,6 +14962,11 @@ PDFPrintService.prototype = {
   },
 
   renderPages() {
+    if (this.pdfDocument.isPureXfa) {
+      (0, _print_utils.getXfaHtmlForPrinting)(this.printContainer, this.pdfDocument);
+      return Promise.resolve();
+    }
+
     const pageCount = this.pagesOverview.length;
 
     const renderNextPage = (resolve, reject) => {
@@ -13734,11 +14988,9 @@ PDFPrintService.prototype = {
     return new Promise(renderNextPage);
   },
 
-  useRenderedPage(printItem) {
+  useRenderedPage() {
     this.throwIfInactive();
     const img = document.createElement("img");
-    img.style.width = printItem.width;
-    img.style.height = printItem.height;
     const scratchCanvas = this.scratchCanvas;
 
     if ("toBlob" in scratchCanvas && 
!_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
@@ -13750,6 +15002,7 @@ PDFPrintService.prototype = {
     }
 
     const wrapper = document.createElement("div");
+    wrapper.className = "printedPage";
     wrapper.appendChild(img);
     this.printContainer.appendChild(wrapper);
     return new Promise(function (resolve, reject) {
@@ -13843,7 +15096,7 @@ function renderProgress(index, total, l10n) {
   progressBar.value = progress;
   l10n.get("print_progress_percent", {
     progress
-  }, progress + "%").then(msg => {
+  }).then(msg => {
     progressPerc.textContent = msg;
   });
 }
@@ -13903,6 +15156,259 @@ _app.PDFPrintServiceFactory.instance = {
 
 };
 
+/***/ }),
+/* 46 */
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+exports.getXfaHtmlForPrinting = getXfaHtmlForPrinting;
+
+var _ui_utils = __webpack_require__(4);
+
+var _xfa_layer_builder = __webpack_require__(34);
+
+var _pdfjsLib = __webpack_require__(5);
+
+function getXfaHtmlForPrinting(printContainer, pdfDocument) {
+  const xfaHtml = pdfDocument.allXfaHtml;
+  const factory = new _xfa_layer_builder.DefaultXfaLayerFactory();
+  const scale = Math.round(_ui_utils.CSS_UNITS * 100) / 100;
+
+  for (const xfaPage of xfaHtml.children) {
+    const page = document.createElement("div");
+    page.className = "xfaPrintedPage";
+    printContainer.appendChild(page);
+    const builder = factory.createXfaLayerBuilder(page, null, pdfDocument.annotationStorage, xfaPage);
+    const viewport = (0, _pdfjsLib.getXfaPageViewport)(xfaPage, {
+      scale
+    });
+    builder.render(viewport, "print");
+  }
+}
+
 /***/ })
-/******/ ]);
+/******/       ]);
+/************************************************************************/
+/******/       // The module cache
+/******/       var __webpack_module_cache__ = {};
+/******/       
+/******/       // The require function
+/******/       function __webpack_require__(moduleId) {
+/******/               // Check if module is in cache
+/******/               var cachedModule = __webpack_module_cache__[moduleId];
+/******/               if (cachedModule !== undefined) {
+/******/                       return cachedModule.exports;
+/******/               }
+/******/               // Create a new module (and put it into the cache)
+/******/               var module = __webpack_module_cache__[moduleId] = {
+/******/                       // no module.id needed
+/******/                       // no module.loaded needed
+/******/                       exports: {}
+/******/               };
+/******/       
+/******/               // Execute the module function
+/******/               __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/       
+/******/               // Return the exports of the module
+/******/               return module.exports;
+/******/       }
+/******/       
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the 
chunk.
+(() => {
+var exports = __webpack_exports__;
+
+
+Object.defineProperty(exports, "__esModule", ({
+  value: true
+}));
+Object.defineProperty(exports, "PDFViewerApplicationOptions", ({
+  enumerable: true,
+  get: function () {
+    return _app_options.AppOptions;
+  }
+}));
+Object.defineProperty(exports, "PDFViewerApplication", ({
+  enumerable: true,
+  get: function () {
+    return _app.PDFViewerApplication;
+  }
+}));
+
+var _app_options = __webpack_require__(1);
+
+var _app = __webpack_require__(3);
+
+const pdfjsVersion = '2.10.377';
+const pdfjsBuild = '156762c48';
+window.PDFViewerApplication = _app.PDFViewerApplication;
+window.PDFViewerApplicationOptions = _app_options.AppOptions;
+;
+;
+{
+  __webpack_require__(39);
+}
+;
+{
+  __webpack_require__(45);
+}
+
+function getViewerConfiguration() {
+  let errorWrapper = null;
+  errorWrapper = {
+    container: document.getElementById("errorWrapper"),
+    errorMessage: document.getElementById("errorMessage"),
+    closeButton: document.getElementById("errorClose"),
+    errorMoreInfo: document.getElementById("errorMoreInfo"),
+    moreInfoButton: document.getElementById("errorShowMore"),
+    lessInfoButton: document.getElementById("errorShowLess")
+  };
+  return {
+    appContainer: document.body,
+    mainContainer: document.getElementById("viewerContainer"),
+    viewerContainer: document.getElementById("viewer"),
+    eventBus: null,
+    toolbar: {
+      container: document.getElementById("toolbarViewer"),
+      numPages: document.getElementById("numPages"),
+      pageNumber: document.getElementById("pageNumber"),
+      scaleSelectContainer: document.getElementById("scaleSelectContainer"),
+      scaleSelect: document.getElementById("scaleSelect"),
+      customScaleOption: document.getElementById("customScaleOption"),
+      previous: document.getElementById("previous"),
+      next: document.getElementById("next"),
+      zoomIn: document.getElementById("zoomIn"),
+      zoomOut: document.getElementById("zoomOut"),
+      viewFind: document.getElementById("viewFind"),
+      openFile: document.getElementById("openFile"),
+      print: document.getElementById("print"),
+      presentationModeButton: document.getElementById("presentationMode"),
+      download: document.getElementById("download"),
+      viewBookmark: document.getElementById("viewBookmark")
+    },
+    secondaryToolbar: {
+      toolbar: document.getElementById("secondaryToolbar"),
+      toggleButton: document.getElementById("secondaryToolbarToggle"),
+      toolbarButtonContainer: document.getElementById("secondaryToolbarButtonContainer"),
+      presentationModeButton: document.getElementById("secondaryPresentationMode"),
+      openFileButton: document.getElementById("secondaryOpenFile"),
+      printButton: document.getElementById("secondaryPrint"),
+      downloadButton: document.getElementById("secondaryDownload"),
+      viewBookmarkButton: document.getElementById("secondaryViewBookmark"),
+      firstPageButton: document.getElementById("firstPage"),
+      lastPageButton: document.getElementById("lastPage"),
+      pageRotateCwButton: document.getElementById("pageRotateCw"),
+      pageRotateCcwButton: document.getElementById("pageRotateCcw"),
+      cursorSelectToolButton: document.getElementById("cursorSelectTool"),
+      cursorHandToolButton: document.getElementById("cursorHandTool"),
+      scrollVerticalButton: document.getElementById("scrollVertical"),
+      scrollHorizontalButton: document.getElementById("scrollHorizontal"),
+      scrollWrappedButton: document.getElementById("scrollWrapped"),
+      spreadNoneButton: document.getElementById("spreadNone"),
+      spreadOddButton: document.getElementById("spreadOdd"),
+      spreadEvenButton: document.getElementById("spreadEven"),
+      documentPropertiesButton: document.getElementById("documentProperties")
+    },
+    sidebar: {
+      outerContainer: document.getElementById("outerContainer"),
+      viewerContainer: document.getElementById("viewerContainer"),
+      toggleButton: document.getElementById("sidebarToggle"),
+      thumbnailButton: document.getElementById("viewThumbnail"),
+      outlineButton: document.getElementById("viewOutline"),
+      attachmentsButton: document.getElementById("viewAttachments"),
+      layersButton: document.getElementById("viewLayers"),
+      thumbnailView: document.getElementById("thumbnailView"),
+      outlineView: document.getElementById("outlineView"),
+      attachmentsView: document.getElementById("attachmentsView"),
+      layersView: document.getElementById("layersView"),
+      outlineOptionsContainer: document.getElementById("outlineOptionsContainer"),
+      currentOutlineItemButton: document.getElementById("currentOutlineItem")
+    },
+    sidebarResizer: {
+      outerContainer: document.getElementById("outerContainer"),
+      resizer: document.getElementById("sidebarResizer")
+    },
+    findBar: {
+      bar: document.getElementById("findbar"),
+      toggleButton: document.getElementById("viewFind"),
+      findField: document.getElementById("findInput"),
+      highlightAllCheckbox: document.getElementById("findHighlightAll"),
+      caseSensitiveCheckbox: document.getElementById("findMatchCase"),
+      entireWordCheckbox: document.getElementById("findEntireWord"),
+      findMsg: document.getElementById("findMsg"),
+      findResultsCount: document.getElementById("findResultsCount"),
+      findPreviousButton: document.getElementById("findPrevious"),
+      findNextButton: document.getElementById("findNext")
+    },
+    passwordOverlay: {
+      overlayName: "passwordOverlay",
+      container: document.getElementById("passwordOverlay"),
+      label: document.getElementById("passwordText"),
+      input: document.getElementById("password"),
+      submitButton: document.getElementById("passwordSubmit"),
+      cancelButton: document.getElementById("passwordCancel")
+    },
+    documentProperties: {
+      overlayName: "documentPropertiesOverlay",
+      container: document.getElementById("documentPropertiesOverlay"),
+      closeButton: document.getElementById("documentPropertiesClose"),
+      fields: {
+        fileName: document.getElementById("fileNameField"),
+        fileSize: document.getElementById("fileSizeField"),
+        title: document.getElementById("titleField"),
+        author: document.getElementById("authorField"),
+        subject: document.getElementById("subjectField"),
+        keywords: document.getElementById("keywordsField"),
+        creationDate: document.getElementById("creationDateField"),
+        modificationDate: document.getElementById("modificationDateField"),
+        creator: document.getElementById("creatorField"),
+        producer: document.getElementById("producerField"),
+        version: document.getElementById("versionField"),
+        pageCount: document.getElementById("pageCountField"),
+        pageSize: document.getElementById("pageSizeField"),
+        linearized: document.getElementById("linearizedField")
+      }
+    },
+    errorWrapper,
+    printContainer: document.getElementById("printContainer"),
+    openFileInputName: "fileInput",
+    debuggerScriptPath: "./debugger.js"
+  };
+}
+
+function webViewerLoad() {
+  const config = getViewerConfiguration();
+  const event = document.createEvent("CustomEvent");
+  event.initCustomEvent("webviewerloaded", true, true, {
+    source: window
+  });
+
+  try {
+    parent.document.dispatchEvent(event);
+  } catch (ex) {
+    console.error(`webviewerloaded: ${ex}`);
+    document.dispatchEvent(event);
+  }
+
+  _app.PDFViewerApplication.run(config);
+}
+
+if (document.blockUnblockOnload) {
+  document.blockUnblockOnload(true);
+}
+
+if (document.readyState === "interactive" || document.readyState === "complete") {
+  webViewerLoad();
+} else {
+  document.addEventListener("DOMContentLoaded", webViewerLoad, true);
+}
+})();
+
+/******/ })()
+;
 //# sourceMappingURL=viewer.js.map


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]