From 36d0e7883474f54bc1064c5add4baf44aa6726d7 Mon Sep 17 00:00:00 2001 From: Alex <33497058+bexsoft@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:20:45 -0600 Subject: [PATCH] Updated Project dependencies (#3508) Signed-off-by: Benjamin Perez Co-authored-by: Benjamin Perez --- web-app/package.json | 46 +- web-app/public/scripts/pdf.worker.min.mjs | 104146 +++++++++++-------- web-app/src/index.css | 4 +- web-app/src/store.ts | 2 +- web-app/yarn.lock | 992 +- 5 files changed, 58852 insertions(+), 46338 deletions(-) diff --git a/web-app/package.json b/web-app/package.json index d95fbcbf0..ad4d7f8e7 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -8,24 +8,24 @@ "@reduxjs/toolkit": "^1.9.7", "clsx": "^2.1.1", "http-status-codes": "^2.3.0", - "kbar": "^0.1.0-beta.45", - "local-storage-fallback": "^4.1.2", + "kbar": "^0.1.0-beta.46", + "local-storage-fallback": "^4.1.3", "lodash": "^4.17.21", - "luxon": "^3.4.4", + "luxon": "^3.5.0", "mds": "https://github.com/minio/mds.git#v1.0.4", "react": "^18.3.1", "react-component-export-image": "^1.0.6", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", - "react-dropzone": "^14.2.3", + "react-dropzone": "^14.3.5", "react-markdown": "8.0.7", - "react-pdf": "^9.1.0", + "react-pdf": "^9.2.1", "react-redux": "^8.1.3", - "react-router-dom": "6.25.1", - "react-virtualized": "^9.22.5", - "react-window": "^1.8.10", - "react-window-infinite-loader": "^1.0.9", - "recharts": "^2.12.7", + "react-router-dom": "6.29.0", + "react-virtualized": "^9.22.6", + "react-window": "^1.8.11", + "react-window-infinite-loader": "^1.0.10", + "recharts": "^2.15.1", "styled-components": "5.3.11", "superagent": "^9.0.2", "tinycolor2": "^1.6.0" @@ -61,31 +61,31 @@ "proxy": "http://localhost:9090/", "devDependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@playwright/test": "^1.45.2", - "@types/jest": "^29.5.12", - "@types/lodash": "^4.17.7", + "@playwright/test": "^1.50.1", + "@types/jest": "^29.5.14", + "@types/lodash": "^4.17.15", "@types/luxon": "^3.4.2", - "@types/node": "20.14.11", - "@types/react": "18.3.3", + "@types/node": "20.17.19", + "@types/react": "18.3.18", "@types/react-copy-to-clipboard": "^5.0.7", - "@types/react-dom": "18.3.0", - "@types/react-redux": "^7.1.33", - "@types/react-virtualized": "^9.21.30", + "@types/react-dom": "18.3.5", + "@types/react-redux": "^7.1.34", + "@types/react-virtualized": "^9.22.2", "@types/react-window": "^1.8.8", "@types/react-window-infinite-loader": "^1.0.9", "@types/recharts": "^1.8.29", "@types/superagent": "^4.1.24", - "@types/webpack-env": "^1.18.5", + "@types/webpack-env": "^1.18.8", "babel-plugin-istanbul": "^6.1.1", "customize-cra": "^1.0.0", - "knip": "^5.27.2", - "minio": "^8.0.1", + "knip": "^5.44.4", + "minio": "^8.0.4", "nyc": "^15.1.0", - "prettier": "3.3.3", + "prettier": "3.5.1", "react-app-rewire-hot-loader": "^2.0.1", "react-app-rewired": "^2.2.1", "react-scripts": "5.0.1", - "testcafe": "3.6.2", + "testcafe": "3.7.2", "typescript": "^5.5.3" }, "resolutions": { diff --git a/web-app/public/scripts/pdf.worker.min.mjs b/web-app/public/scripts/pdf.worker.min.mjs index 3a7a2d245..6c32a59d7 100644 --- a/web-app/public/scripts/pdf.worker.min.mjs +++ b/web-app/public/scripts/pdf.worker.min.mjs @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,390 +18,540 @@ * * @licend The above is the entire license notice for the * JavaScript code in this page - */ var e = { - d: (t, i) => { - for (var a in i) - e.o(i, a) && - !e.o(t, a) && - Object.defineProperty(t, a, { enumerable: !0, get: i[a] }); - }, - o: (e, t) => Object.prototype.hasOwnProperty.call(e, t), - }, - __webpack_exports__ = (globalThis.pdfjsWorker = {}); -e.d(__webpack_exports__, { WorkerMessageHandler: () => WorkerMessageHandler }); -const t = !( - "object" != typeof process || - process + "" != "[object process]" || - process.versions.nw || - (process.versions.electron && process.type && "browser" !== process.type) - ), - i = [1, 0, 0, 1, 0, 0], - a = [0.001, 0, 0, 0.001, 0, 0], - s = 1.35, - r = 0.35, - n = 0.25925925925925924, - g = 1, - o = 2, - c = 4, - C = 8, - h = 16, - l = 64, - Q = 256, - E = "pdfjs_internal_editor_", - u = 3, - d = 9, - f = 13, - p = 15, - m = { - PRINT: 4, - MODIFY_CONTENTS: 8, - COPY: 16, - MODIFY_ANNOTATIONS: 32, - FILL_INTERACTIVE_FORMS: 256, - COPY_FOR_ACCESSIBILITY: 512, - ASSEMBLE: 1024, - PRINT_HIGH_QUALITY: 2048, - }, - y = 0, - w = 4, - D = 1, - b = 2, - F = 3, - S = 1, - k = 2, - R = 3, - N = 4, - G = 5, - x = 6, - U = 7, - M = 8, - L = 9, - H = 10, - J = 11, - Y = 12, - v = 13, - K = 14, - T = 15, - q = 16, - O = 17, - W = 20, - j = "Group", - X = "R", - Z = 1, - V = 2, - z = 4, - _ = 16, - $ = 32, - AA = 128, - eA = 512, - tA = 1, - iA = 2, - aA = 4096, - sA = 8192, - rA = 32768, - nA = 65536, - gA = 131072, - oA = 1048576, - IA = 2097152, - cA = 8388608, - CA = 16777216, - hA = 1, - BA = 2, - lA = 3, - QA = 4, - EA = 5, - uA = { - 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", - }, - dA = { - WC: "WillClose", - WS: "WillSave", - DS: "DidSave", - WP: "WillPrint", - DP: "DidPrint", - }, - fA = { O: "PageOpen", C: "PageClose" }, - pA = { ERRORS: 0, WARNINGS: 1, INFOS: 5 }, - mA = { NONE: 0, BINARY: 1 }, - yA = 1, - wA = 2, - DA = 3, - bA = 4, - FA = 5, - SA = 6, - kA = 7, - RA = 8, - NA = 9, - GA = 10, - xA = 11, - UA = 12, - MA = 13, - LA = 14, - HA = 15, - JA = 16, - YA = 17, - vA = 18, - KA = 19, - TA = 20, - qA = 21, - OA = 22, - PA = 23, - WA = 24, - jA = 25, - XA = 26, - ZA = 27, - VA = 28, - zA = 29, - _A = 30, - $A = 31, - Ae = 32, - ee = 33, - te = 34, - ie = 35, - ae = 36, - se = 37, - re = 38, - ne = 39, - ge = 40, - oe = 41, - Ie = 42, - ce = 43, - Ce = 44, - he = 45, - Be = 46, - le = 47, - Qe = 48, - Ee = 49, - ue = 50, - de = 51, - fe = 52, - pe = 53, - me = 54, - ye = 55, - we = 56, - De = 57, - be = 58, - Fe = 59, - Se = 60, - ke = 61, - Re = 62, - Ne = 63, - Ge = 64, - xe = 65, - Ue = 66, - Me = 67, - Le = 68, - He = 69, - Je = 70, - Ye = 71, - ve = 72, - Ke = 73, - Te = 74, - qe = 75, - Oe = 76, - Pe = 77, - We = 80, - je = 81, - Xe = 83, - Ze = 84, - Ve = 85, - ze = 86, - _e = 87, - $e = 88, - At = 89, - et = 90, - tt = 91, - it = 1, - at = 2; -let st = pA.WARNINGS; -function getVerbosityLevel() { - return st; -} -function info(e) { - st >= pA.INFOS && console.log(`Info: ${e}`); -} -function warn(e) { - st >= pA.WARNINGS && console.log(`Warning: ${e}`); -} -function unreachable(e) { - throw new Error(e); -} -function assert(e, t) { - e || unreachable(t); -} -function createValidAbsoluteUrl(e, t = null, i = null) { - if (!e) return null; - try { - if (i && "string" == typeof e) { - if (i.addDefaultProtocol && e.startsWith("www.")) { - const t = e.match(/\./g); - t?.length >= 2 && (e = `http://${e}`); + */ + +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { + /******/ // define getter functions for harmony exports + /******/ __webpack_require__.d = (exports, definition) => { + /******/ for (var key in definition) { + /******/ if ( + __webpack_require__.o(definition, key) && + !__webpack_require__.o(exports, key) + ) { + /******/ Object.defineProperty(exports, key, { + enumerable: true, + get: definition[key], + }); + /******/ } - if (i.tryConvertEncoding) - try { - e = stringToUTF8String(e); - } catch {} + /******/ } - const a = t ? new URL(e, t) : new URL(e); - if ( - (function _isValidProtocol(e) { - switch (e?.protocol) { - case "http:": - case "https:": - case "ftp:": - case "mailto:": - case "tel:": - return !0; - default: - return !1; + /******/ + }; + /******/ +})(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { + /******/ __webpack_require__.o = (obj, prop) => + Object.prototype.hasOwnProperty.call(obj, prop); + /******/ +})(); +/******/ +/************************************************************************/ +var __webpack_exports__ = (globalThis.pdfjsWorker = {}); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + WorkerMessageHandler: () => /* reexport */ WorkerMessageHandler, +}); // ./src/shared/util.js + +const isNodeJS = + typeof process === "object" && + process + "" === "[object process]" && + !process.versions.nw && + !(process.versions.electron && process.type && process.type !== "browser"); +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const MAX_IMAGE_SIZE_TO_CACHE = 10e6; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100, +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3, +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_DEFAULT_COLOR: 32, + HIGHLIGHT_THICKNESS: 33, + HIGHLIGHT_FREE: 34, + HIGHLIGHT_SHOW_ALL: 35, +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800, +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4, +}; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3, +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26, +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R", +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200, +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000, +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5, +}; +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", +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint", +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose", +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5, +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93, +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2, +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.log(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.log(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + try { + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; } - })(a) - ) - return a; + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (_isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } } catch {} return null; } -function shadow(e, t, i, a = !1) { - Object.defineProperty(e, t, { - value: i, - enumerable: !a, - configurable: !0, - writable: !1, +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false, }); - return i; + return value; } -const rt = (function BaseExceptionClosure() { - function BaseException(e, t) { - this.constructor === BaseException && - unreachable("Cannot initialize BaseException."); - this.message = e; - this.name = t; +const BaseException = (function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; } BaseException.prototype = new Error(); BaseException.constructor = BaseException; return BaseException; })(); -class PasswordException extends rt { - constructor(e, t) { - super(e, "PasswordException"); - this.code = t; +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; } } -class UnknownErrorException extends rt { - constructor(e, t) { - super(e, "UnknownErrorException"); - this.details = t; +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; } } -class InvalidPDFException extends rt { - constructor(e) { - super(e, "InvalidPDFException"); +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); } } -class MissingPDFException extends rt { - constructor(e) { - super(e, "MissingPDFException"); +class MissingPDFException extends BaseException { + constructor(msg) { + super(msg, "MissingPDFException"); } } -class UnexpectedResponseException extends rt { - constructor(e, t) { - super(e, "UnexpectedResponseException"); - this.status = t; +class UnexpectedResponseException extends BaseException { + constructor(msg, status) { + super(msg, "UnexpectedResponseException"); + this.status = status; } } -class FormatError extends rt { - constructor(e) { - super(e, "FormatError"); +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); } } -class AbortException extends rt { - constructor(e) { - super(e, "AbortException"); +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); } } -function bytesToString(e) { - ("object" == typeof e && void 0 !== e?.length) || +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { unreachable("Invalid argument for bytesToString"); - const t = e.length, - i = 8192; - if (t < i) return String.fromCharCode.apply(null, e); - const a = []; - for (let s = 0; s < t; s += i) { - const r = Math.min(s + i, t), - n = e.subarray(s, r); - a.push(String.fromCharCode.apply(null, n)); } - return a.join(""); + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); } -function stringToBytes(e) { - "string" != typeof e && unreachable("Invalid argument for stringToBytes"); - const t = e.length, - i = new Uint8Array(t); - for (let a = 0; a < t; ++a) i[a] = 255 & e.charCodeAt(a); - return i; +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; } -function string32(e) { +function string32(value) { return String.fromCharCode( - (e >> 24) & 255, - (e >> 16) & 255, - (e >> 8) & 255, - 255 & e, + (value >> 24) & 0xff, + (value >> 16) & 0xff, + (value >> 8) & 0xff, + value & 0xff, ); } -function objectSize(e) { - return Object.keys(e).length; +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; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } } class FeatureTest { static get isLittleEndian() { - return shadow( - this, - "isLittleEndian", - (function isLittleEndian() { - const e = new Uint8Array(4); - e[0] = 1; - return 1 === new Uint32Array(e.buffer, 0, 1)[0]; - })(), - ); + return shadow(this, "isLittleEndian", isLittleEndian()); } static get isEvalSupported() { - return shadow( - this, - "isEvalSupported", - (function isEvalSupported() { - try { - new Function(""); - return !0; - } catch { - return !1; - } - })(), - ); + return shadow(this, "isEvalSupported", isEvalSupported()); } static get isOffscreenCanvasSupported() { return shadow( this, "isOffscreenCanvasSupported", - "undefined" != typeof OffscreenCanvas, + typeof OffscreenCanvas !== "undefined", ); } static get platform() { - return "undefined" != typeof navigator && - "string" == typeof navigator?.platform - ? shadow(this, "platform", { isMac: navigator.platform.includes("Mac") }) - : shadow(this, "platform", { isMac: !1 }); + if ( + typeof navigator !== "undefined" && + typeof navigator?.platform === "string" + ) { + return shadow(this, "platform", { + isMac: navigator.platform.includes("Mac"), + isWindows: navigator.platform.includes("Win"), + isFirefox: + typeof navigator?.userAgent === "string" && + navigator.userAgent.includes("Firefox"), + }); + } + return shadow(this, "platform", { + isMac: false, + isWindows: false, + isFirefox: false, + }); } static get isCSSRoundSupported() { return shadow( @@ -411,346 +561,496 @@ class FeatureTest { ); } } -const nt = Array.from(Array(256).keys(), (e) => - e.toString(16).padStart(2, "0"), +const hexNumbers = Array.from(Array(256).keys(), (n) => + n.toString(16).padStart(2, "0"), ); class Util { - static makeHexColor(e, t, i) { - return `#${nt[e]}${nt[t]}${nt[i]}`; + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; } - static scaleMinMax(e, t) { - let i; - if (e[0]) { - if (e[0] < 0) { - i = t[0]; - t[0] = t[2]; - t[2] = i; + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; } - t[0] *= e[0]; - t[2] *= e[0]; - if (e[3] < 0) { - i = t[1]; - t[1] = t[3]; - t[3] = i; + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; } - t[1] *= e[3]; - t[3] *= e[3]; + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; } else { - i = t[0]; - t[0] = t[1]; - t[1] = i; - i = t[2]; - t[2] = t[3]; - t[3] = i; - if (e[1] < 0) { - i = t[1]; - t[1] = t[3]; - t[3] = i; + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; } - t[1] *= e[1]; - t[3] *= e[1]; - if (e[2] < 0) { - i = t[0]; - t[0] = t[2]; - t[2] = i; + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; } - t[0] *= e[2]; - t[2] *= e[2]; + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; } - t[0] += e[4]; - t[1] += e[5]; - t[2] += e[4]; - t[3] += e[5]; + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; } - static transform(e, t) { + static transform(m1, m2) { return [ - e[0] * t[0] + e[2] * t[1], - e[1] * t[0] + e[3] * t[1], - e[0] * t[2] + e[2] * t[3], - e[1] * t[2] + e[3] * t[3], - e[0] * t[4] + e[2] * t[5] + e[4], - e[1] * t[4] + e[3] * t[5] + e[5], + m1[0] * m2[0] + m1[2] * m2[1], + m1[1] * m2[0] + m1[3] * m2[1], + m1[0] * m2[2] + m1[2] * m2[3], + m1[1] * m2[2] + m1[3] * m2[3], + m1[0] * m2[4] + m1[2] * m2[5] + m1[4], + m1[1] * m2[4] + m1[3] * m2[5] + m1[5], ]; } - static applyTransform(e, t) { - return [e[0] * t[0] + e[1] * t[2] + t[4], e[0] * t[1] + e[1] * t[3] + t[5]]; + static applyTransform(p, m) { + const xt = p[0] * m[0] + p[1] * m[2] + m[4]; + const yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [xt, yt]; } - static applyInverseTransform(e, t) { - const i = t[0] * t[3] - t[1] * t[2]; + static applyInverseTransform(p, m) { + const d = m[0] * m[3] - m[1] * m[2]; + const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [xt, yt]; + } + static getAxialAlignedBoundingBox(r, m) { + const p1 = this.applyTransform(r, m); + const p2 = this.applyTransform(r.slice(2, 4), m); + const p3 = this.applyTransform([r[0], r[3]], m); + const p4 = this.applyTransform([r[2], r[1]], m); return [ - (e[0] * t[3] - e[1] * t[2] + t[2] * t[5] - t[4] * t[3]) / i, - (-e[0] * t[1] + e[1] * t[0] + t[4] * t[1] - t[5] * t[0]) / i, + Math.min(p1[0], p2[0], p3[0], p4[0]), + Math.min(p1[1], p2[1], p3[1], p4[1]), + Math.max(p1[0], p2[0], p3[0], p4[0]), + Math.max(p1[1], p2[1], p3[1], p4[1]), ]; } - static getAxialAlignedBoundingBox(e, t) { - const i = this.applyTransform(e, t), - a = this.applyTransform(e.slice(2, 4), t), - s = this.applyTransform([e[0], e[3]], t), - r = this.applyTransform([e[2], e[1]], t); + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; return [ - Math.min(i[0], a[0], s[0], r[0]), - Math.min(i[1], a[1], s[1], r[1]), - Math.max(i[0], a[0], s[0], r[0]), - Math.max(i[1], a[1], s[1], r[1]), + m[3] / d, + -m[1] / d, + -m[2] / d, + m[0] / d, + (m[2] * m[5] - m[4] * m[3]) / d, + (m[4] * m[1] - m[5] * m[0]) / d, ]; } - static inverseTransform(e) { - const t = e[0] * e[3] - e[1] * e[2]; - return [ - e[3] / t, - -e[1] / t, - -e[2] / t, - e[0] / t, - (e[2] * e[5] - e[4] * e[3]) / t, - (e[4] * e[1] - e[5] * e[0]) / t, - ]; + static singularValueDecompose2dScale(m) { + const transpose = [m[0], m[2], m[1], m[3]]; + const a = m[0] * transpose[0] + m[1] * transpose[2]; + const b = m[0] * transpose[1] + m[1] * transpose[3]; + 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) ** 2 - 4 * (a * d - c * b)) / 2; + const sx = first + second || 1; + const sy = first - second || 1; + return [Math.sqrt(sx), Math.sqrt(sy)]; } - static singularValueDecompose2dScale(e) { - const t = [e[0], e[2], e[1], e[3]], - i = e[0] * t[0] + e[1] * t[2], - a = e[0] * t[1] + e[1] * t[3], - s = e[2] * t[0] + e[3] * t[2], - r = e[2] * t[1] + e[3] * t[3], - n = (i + r) / 2, - g = Math.sqrt((i + r) ** 2 - 4 * (i * r - s * a)) / 2, - o = n + g || 1, - c = n - g || 1; - return [Math.sqrt(o), Math.sqrt(c)]; - } - static normalizeRect(e) { - const t = e.slice(0); - if (e[0] > e[2]) { - t[0] = e[2]; - t[2] = e[0]; + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; } - if (e[1] > e[3]) { - t[1] = e[3]; - t[3] = e[1]; + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; } - return t; + return r; } - static intersect(e, t) { - const i = Math.max(Math.min(e[0], e[2]), Math.min(t[0], t[2])), - a = Math.min(Math.max(e[0], e[2]), Math.max(t[0], t[2])); - if (i > a) return null; - const s = Math.max(Math.min(e[1], e[3]), Math.min(t[1], t[3])), - r = Math.min(Math.max(e[1], e[3]), Math.max(t[1], t[3])); - return s > r ? null : [i, s, a, r]; + static intersect(rect1, rect2) { + const xLow = Math.max( + Math.min(rect1[0], rect1[2]), + Math.min(rect2[0], rect2[2]), + ); + const xHigh = Math.min( + Math.max(rect1[0], rect1[2]), + Math.max(rect2[0], rect2[2]), + ); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max( + Math.min(rect1[1], rect1[3]), + Math.min(rect2[1], rect2[3]), + ); + const yHigh = Math.min( + Math.max(rect1[1], rect1[3]), + Math.max(rect2[1], rect2[3]), + ); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; } - static #A(e, t, i, a, s, r, n, g, o, c) { - if (o <= 0 || o >= 1) return; - const C = 1 - o, - h = o * o, - l = h * o, - Q = C * (C * (C * e + 3 * o * t) + 3 * h * i) + l * a, - E = C * (C * (C * s + 3 * o * r) + 3 * h * n) + l * g; - c[0] = Math.min(c[0], Q); - c[1] = Math.min(c[1], E); - c[2] = Math.max(c[2], Q); - c[3] = Math.max(c[3], E); - } - static #e(e, t, i, a, s, r, n, g, o, c, C, h) { - if (Math.abs(o) < 1e-12) { - Math.abs(c) >= 1e-12 && this.#A(e, t, i, a, s, r, n, g, -C / c, h); + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { return; } - const l = c ** 2 - 4 * C * o; - if (l < 0) return; - const Q = Math.sqrt(l), - E = 2 * o; - this.#A(e, t, i, a, s, r, n, g, (-c + Q) / E, h); - this.#A(e, t, i, a, s, r, n, g, (-c - Q) / E, h); + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); } - static bezierBoundingBox(e, t, i, a, s, r, n, g, o) { - if (o) { - o[0] = Math.min(o[0], e, n); - o[1] = Math.min(o[1], t, g); - o[2] = Math.max(o[2], e, n); - o[3] = Math.max(o[3], t, g); - } else o = [Math.min(e, n), Math.min(t, g), Math.max(e, n), Math.max(t, g)]; - this.#e( - e, - i, - s, - n, - t, - a, - r, - g, - 3 * (3 * (i - s) - e + n), - 6 * (e - 2 * i + s), - 3 * (i - e), - o, + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve( + x0, + x1, + x2, + x3, + y0, + y1, + y2, + y3, + -c / b, + minMax, + ); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve( + x0, + x1, + x2, + x3, + y0, + y1, + y2, + y3, + (-b + sqrtDelta) / a2, + minMax, ); - this.#e( - e, - i, - s, - n, - t, - a, - r, - g, - 3 * (3 * (a - r) - t + g), - 6 * (t - 2 * a + r), - 3 * (a - t), - o, + this.#getExtremumOnCurve( + x0, + x1, + x2, + x3, + y0, + y1, + y2, + y3, + (-b - sqrtDelta) / a2, + minMax, ); - return o; + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + if (minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + } else { + minMax = [ + Math.min(x0, x3), + Math.min(y0, y3), + Math.max(x0, x3), + Math.max(y0, y3), + ]; + } + this.#getExtremum( + x0, + x1, + x2, + x3, + y0, + y1, + y2, + y3, + 3 * (-x0 + 3 * (x1 - x2) + x3), + 6 * (x0 - 2 * x1 + x2), + 3 * (x1 - x0), + minMax, + ); + this.#getExtremum( + x0, + x1, + x2, + x3, + y0, + y1, + y2, + y3, + 3 * (-y0 + 3 * (y1 - y2) + y3), + 6 * (y0 - 2 * y1 + y2), + 3 * (y1 - y0), + minMax, + ); + return minMax; } } -const gt = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, - 711, 710, 729, 733, 731, 730, 732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +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, 8226, 8224, 8225, 8230, 8212, 8211, 402, 8260, 8249, 8250, 8722, - 8240, 8222, 8220, 8221, 8216, 8217, 8218, 8482, 64257, 64258, 321, 338, 352, - 376, 381, 305, 322, 339, 353, 382, 0, 8364, + 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(e) { - if (e[0] >= "ï") { - let t; - if ("þ" === e[0] && "ÿ" === e[1]) { - t = "utf-16be"; - e.length % 2 == 1 && (e = e.slice(0, -1)); - } else if ("ÿ" === e[0] && "þ" === e[1]) { - t = "utf-16le"; - e.length % 2 == 1 && (e = e.slice(0, -1)); - } else "ï" === e[0] && "»" === e[1] && "¿" === e[2] && (t = "utf-8"); - if (t) - try { - const i = new TextDecoder(t, { fatal: !0 }), - a = stringToBytes(e), - s = i.decode(a); - return s.includes("") ? s.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, "") : s; - } catch (e) { - warn(`stringToPDFString: "${e}".`); +function stringToPDFString(str) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true, + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (!decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } } - const t = []; - for (let i = 0, a = e.length; i < a; i++) { - const s = e.charCodeAt(i); - if (27 === s) { - for (; ++i < a && 27 !== e.charCodeAt(i); ); + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} continue; } - const r = gt[s]; - t.push(r ? String.fromCharCode(r) : e.charAt(i)); + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); } - return t.join(""); + return strBuf.join(""); } -function stringToUTF8String(e) { - return decodeURIComponent(escape(e)); +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); } -function utf8StringToString(e) { - return unescape(encodeURIComponent(e)); +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); } -function isArrayEqual(e, t) { - if (e.length !== t.length) return !1; - for (let i = 0, a = e.length; i < a; i++) if (e[i] !== t[i]) return !1; - return !0; +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; } -function getModificationDate(e = new Date()) { - return [ - e.getUTCFullYear().toString(), - (e.getUTCMonth() + 1).toString().padStart(2, "0"), - e.getUTCDate().toString().padStart(2, "0"), - e.getUTCHours().toString().padStart(2, "0"), - e.getUTCMinutes().toString().padStart(2, "0"), - e.getUTCSeconds().toString().padStart(2, "0"), - ].join(""); +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(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = + /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => + p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2), + ); +} +function getUuid() { + if ( + typeof crypto !== "undefined" && + typeof crypto?.randomUUID === "function" + ) { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + if ( + typeof crypto !== "undefined" && + typeof crypto?.getRandomValues === "function" + ) { + crypto.getRandomValues(buf); + } else { + for (let i = 0; i < 32; i++) { + buf[i] = Math.floor(Math.random() * 255); + } + } + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +const FontRenderOps = { + BEZIER_CURVE_TO: 0, + MOVE_TO: 1, + LINE_TO: 2, + QUADRATIC_CURVE_TO: 3, + RESTORE: 4, + SAVE: 5, + SCALE: 6, + TRANSFORM: 7, + TRANSLATE: 8, +}; +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, (num) => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} // ./src/core/primitives.js + +const CIRCULAR_REF = Symbol("CIRCULAR_REF"); +const EOF = Symbol("EOF"); +let CmdCache = Object.create(null); +let NameCache = Object.create(null); +let RefCache = Object.create(null); +function clearPrimitiveCaches() { + CmdCache = Object.create(null); + NameCache = Object.create(null); + RefCache = Object.create(null); } -let ot = null, - It = null; -const ct = 0, - Ct = 1, - ht = 2, - Bt = 3, - lt = 4, - Qt = 5, - Et = 6, - ut = 7, - dt = 8, - ft = Symbol("CIRCULAR_REF"), - pt = Symbol("EOF"); -let mt = Object.create(null), - yt = Object.create(null), - wt = Object.create(null); class Name { - constructor(e) { - this.name = e; + constructor(name) { + this.name = name; } - static get(e) { - return (yt[e] ||= new Name(e)); + static get(name) { + return (NameCache[name] ||= new Name(name)); } } class Cmd { - constructor(e) { - this.cmd = e; + constructor(cmd) { + this.cmd = cmd; } - static get(e) { - return (mt[e] ||= new Cmd(e)); + static get(cmd) { + return (CmdCache[cmd] ||= new Cmd(cmd)); } } -const Dt = function nonSerializableClosure() { - return Dt; +const nonSerializable = function nonSerializableClosure() { + return nonSerializable; }; class Dict { - constructor(e = null) { + constructor(xref = null) { this._map = Object.create(null); - this.xref = e; + this.xref = xref; this.objId = null; - this.suppressEncryption = !1; - this.__nonSerializable__ = Dt; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; } - assignXref(e) { - this.xref = e; + assignXref(newXref) { + this.xref = newXref; } get size() { return Object.keys(this._map).length; } - get(e, t, i) { - let a = this._map[e]; - if (void 0 === a && void 0 !== t) { - a = this._map[t]; - void 0 === a && void 0 !== i && (a = this._map[i]); + get(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } } - return a instanceof Ref && this.xref - ? this.xref.fetch(a, this.suppressEncryption) - : a; + if (value instanceof Ref && this.xref) { + return this.xref.fetch(value, this.suppressEncryption); + } + return value; } - async getAsync(e, t, i) { - let a = this._map[e]; - if (void 0 === a && void 0 !== t) { - a = this._map[t]; - void 0 === a && void 0 !== i && (a = this._map[i]); + async getAsync(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } } - return a instanceof Ref && this.xref - ? this.xref.fetchAsync(a, this.suppressEncryption) - : a; + if (value instanceof Ref && this.xref) { + return this.xref.fetchAsync(value, this.suppressEncryption); + } + return value; } - getArray(e, t, i) { - let a = this._map[e]; - if (void 0 === a && void 0 !== t) { - a = this._map[t]; - void 0 === a && void 0 !== i && (a = this._map[i]); + getArray(key1, key2, key3) { + let value = this._map[key1]; + if (value === undefined && key2 !== undefined) { + value = this._map[key2]; + if (value === undefined && key3 !== undefined) { + value = this._map[key3]; + } } - a instanceof Ref && - this.xref && - (a = this.xref.fetch(a, this.suppressEncryption)); - if (Array.isArray(a)) { - a = a.slice(); - for (let e = 0, t = a.length; e < t; e++) - a[e] instanceof Ref && - this.xref && - (a[e] = this.xref.fetch(a[e], this.suppressEncryption)); + if (value instanceof Ref && this.xref) { + value = this.xref.fetch(value, this.suppressEncryption); } - return a; + if (Array.isArray(value)) { + value = value.slice(); + for (let i = 0, ii = value.length; i < ii; i++) { + if (value[i] instanceof Ref && this.xref) { + value[i] = this.xref.fetch(value[i], this.suppressEncryption); + } + } + } + return value; } - getRaw(e) { - return this._map[e]; + getRaw(key) { + return this._map[key]; } getKeys() { return Object.keys(this._map); @@ -758,88 +1058,115 @@ class Dict { getRawValues() { return Object.values(this._map); } - set(e, t) { - this._map[e] = t; + set(key, value) { + this._map[key] = value; } - has(e) { - return void 0 !== this._map[e]; + has(key) { + return this._map[key] !== undefined; } - forEach(e) { - for (const t in this._map) e(t, this.get(t)); + forEach(callback) { + for (const key in this._map) { + callback(key, this.get(key)); + } } static get empty() { - const e = new Dict(null); - e.set = (e, t) => { + const emptyDict = new Dict(null); + emptyDict.set = (key, value) => { unreachable("Should not call `set` on the empty dictionary."); }; - return shadow(this, "empty", e); + return shadow(this, "empty", emptyDict); } - static merge({ xref: e, dictArray: t, mergeSubDicts: i = !1 }) { - const a = new Dict(e), - s = new Map(); - for (const e of t) - if (e instanceof Dict) - for (const [t, a] of Object.entries(e._map)) { - let e = s.get(t); - if (void 0 === e) { - e = []; - s.set(t, e); - } else if (!(i && a instanceof Dict)) continue; - e.push(a); - } - for (const [t, i] of s) { - if (1 === i.length || !(i[0] instanceof Dict)) { - a._map[t] = i[0]; + static merge({ xref, dictArray, mergeSubDicts = false }) { + const mergedDict = new Dict(xref), + properties = new Map(); + for (const dict of dictArray) { + if (!(dict instanceof Dict)) { continue; } - const s = new Dict(e); - for (const e of i) - for (const [t, i] of Object.entries(e._map)) - void 0 === s._map[t] && (s._map[t] = i); - s.size > 0 && (a._map[t] = s); + for (const [key, value] of Object.entries(dict._map)) { + let property = properties.get(key); + if (property === undefined) { + property = []; + properties.set(key, property); + } else if (!mergeSubDicts || !(value instanceof Dict)) { + continue; + } + property.push(value); + } } - s.clear(); - return a.size > 0 ? a : Dict.empty; + for (const [name, values] of properties) { + if (values.length === 1 || !(values[0] instanceof Dict)) { + mergedDict._map[name] = values[0]; + continue; + } + const subDict = new Dict(xref); + for (const dict of values) { + for (const [key, value] of Object.entries(dict._map)) { + if (subDict._map[key] === undefined) { + subDict._map[key] = value; + } + } + } + if (subDict.size > 0) { + mergedDict._map[name] = subDict; + } + } + properties.clear(); + return mergedDict.size > 0 ? mergedDict : Dict.empty; } clone() { - const e = new Dict(this.xref); - for (const t of this.getKeys()) e.set(t, this.getRaw(t)); - return e; + const dict = new Dict(this.xref); + for (const key of this.getKeys()) { + dict.set(key, this.getRaw(key)); + } + return dict; + } + delete(key) { + delete this._map[key]; } } class Ref { - constructor(e, t) { - this.num = e; - this.gen = t; + constructor(num, gen) { + this.num = num; + this.gen = gen; } toString() { - return 0 === this.gen ? `${this.num}R` : `${this.num}R${this.gen}`; + if (this.gen === 0) { + return `${this.num}R`; + } + return `${this.num}R${this.gen}`; } - static fromString(e) { - const t = wt[e]; - if (t) return t; - const i = /^(\d+)R(\d*)$/.exec(e); - return i && "0" !== i[1] - ? (wt[e] = new Ref(parseInt(i[1]), i[2] ? parseInt(i[2]) : 0)) - : null; + static fromString(str) { + const ref = RefCache[str]; + if (ref) { + return ref; + } + const m = /^(\d+)R(\d*)$/.exec(str); + if (!m || m[1] === "0") { + return null; + } + return (RefCache[str] = new Ref( + parseInt(m[1]), + !m[2] ? 0 : parseInt(m[2]), + )); } - static get(e, t) { - const i = 0 === t ? `${e}R` : `${e}R${t}`; - return (wt[i] ||= new Ref(e, t)); + static get(num, gen) { + const key = gen === 0 ? `${num}R` : `${num}R${gen}`; + return (RefCache[key] ||= new Ref(num, gen)); } } class RefSet { - constructor(e = null) { - this._set = new Set(e?._set); + constructor(parent = null) { + this._set = new Set(parent?._set); } - has(e) { - return this._set.has(e.toString()); + has(ref) { + return this._set.has(ref.toString()); } - put(e) { - this._set.add(e.toString()); + put(ref) { + this._set.add(ref.toString()); } - remove(e) { - this._set.delete(e.toString()); + remove(ref) { + this._set.delete(ref.toString()); } [Symbol.iterator]() { return this._set.values(); @@ -855,17 +1182,17 @@ class RefSetCache { get size() { return this._map.size; } - get(e) { - return this._map.get(e.toString()); + get(ref) { + return this._map.get(ref.toString()); } - has(e) { - return this._map.has(e.toString()); + has(ref) { + return this._map.has(ref.toString()); } - put(e, t) { - this._map.set(e.toString(), t); + put(ref, obj) { + this._map.set(ref.toString(), obj); } - putAlias(e, t) { - this._map.set(e.toString(), this.get(t)); + putAlias(ref, aliasRef) { + this._map.set(ref.toString(), this.get(aliasRef)); } [Symbol.iterator]() { return this._map.values(); @@ -874,26 +1201,27 @@ class RefSetCache { this._map.clear(); } *items() { - for (const [e, t] of this._map) yield [Ref.fromString(e), t]; + for (const [ref, value] of this._map) { + yield [Ref.fromString(ref), value]; + } } } -function isName(e, t) { - return e instanceof Name && (void 0 === t || e.name === t); +function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); } -function isCmd(e, t) { - return e instanceof Cmd && (void 0 === t || e.cmd === t); +function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); } -function isDict(e, t) { - return e instanceof Dict && (void 0 === t || isName(e.get("Type"), t)); -} -function isRefsEqual(e, t) { - return e.num === t.num && e.gen === t.gen; +function isDict(v, type) { + return ( + v instanceof Dict && (type === undefined || isName(v.get("Type"), type)) + ); } +function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; +} // ./src/core/base_stream.js + class BaseStream { - constructor() { - this.constructor === BaseStream && - unreachable("Cannot initialize BaseStream."); - } get length() { unreachable("Abstract getter `length` accessed"); } @@ -901,57 +1229,64 @@ class BaseStream { unreachable("Abstract getter `isEmpty` accessed"); } get isDataLoaded() { - return shadow(this, "isDataLoaded", !0); + return shadow(this, "isDataLoaded", true); } getByte() { unreachable("Abstract method `getByte` called"); } - getBytes(e) { + getBytes(length) { unreachable("Abstract method `getBytes` called"); } - async getImageData(e, t) { - return this.getBytes(e, t); + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); } async asyncGetBytes() { unreachable("Abstract method `asyncGetBytes` called"); } get isAsync() { - return !1; + return false; } get canAsyncDecodeImageFromBuffer() { - return !1; + return false; + } + async getTransferableImage() { + return null; } peekByte() { - const e = this.getByte(); - -1 !== e && this.pos--; - return e; + const peekedByte = this.getByte(); + if (peekedByte !== -1) { + this.pos--; + } + return peekedByte; } - peekBytes(e) { - const t = this.getBytes(e); - this.pos -= t.length; - return t; + peekBytes(length) { + const bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; } getUint16() { - const e = this.getByte(), - t = this.getByte(); - return -1 === e || -1 === t ? -1 : (e << 8) + t; + const b0 = this.getByte(); + const b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; } getInt32() { - return ( - (this.getByte() << 24) + - (this.getByte() << 16) + - (this.getByte() << 8) + - this.getByte() - ); + 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(e, t) { + getByteRange(begin, end) { unreachable("Abstract method `getByteRange` called"); } - getString(e) { - return bytesToString(this.getBytes(e)); + getString(length) { + return bytesToString(this.getBytes(length)); } - skip(e) { - this.pos += e || 1; + skip(n) { + this.pos += n || 1; } reset() { unreachable("Abstract method `reset` called"); @@ -959,82 +1294,93 @@ class BaseStream { moveStart() { unreachable("Abstract method `moveStart` called"); } - makeSubStream(e, t, i = null) { + makeSubStream(start, length, dict = null) { unreachable("Abstract method `makeSubStream` called"); } getBaseStreams() { return null; } -} -const bt = /^[1-9]\.\d$/; -function getLookupTableFactory(e) { - let t; +} // ./src/core/core_utils.js + +const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +function getLookupTableFactory(initializer) { + let lookup; return function () { - if (e) { - t = Object.create(null); - e(t); - e = null; + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; } - return t; + return lookup; }; } -class MissingDataException extends rt { - constructor(e, t) { - super(`Missing data [${e}, ${t})`, "MissingDataException"); - this.begin = e; - this.end = t; +class MissingDataException extends BaseException { + constructor(begin, end) { + super(`Missing data [${begin}, ${end})`, "MissingDataException"); + this.begin = begin; + this.end = end; } } -class ParserEOFException extends rt { - constructor(e) { - super(e, "ParserEOFException"); +class ParserEOFException extends BaseException { + constructor(msg) { + super(msg, "ParserEOFException"); } } -class XRefEntryException extends rt { - constructor(e) { - super(e, "XRefEntryException"); +class XRefEntryException extends BaseException { + constructor(msg) { + super(msg, "XRefEntryException"); } } -class XRefParseException extends rt { - constructor(e) { - super(e, "XRefParseException"); +class XRefParseException extends BaseException { + constructor(msg) { + super(msg, "XRefParseException"); } } -function arrayBuffersToBytes(e) { - const t = e.length; - if (0 === t) return new Uint8Array(0); - if (1 === t) return new Uint8Array(e[0]); - let i = 0; - for (let a = 0; a < t; a++) i += e[a].byteLength; - const a = new Uint8Array(i); - let s = 0; - for (let i = 0; i < t; i++) { - const t = new Uint8Array(e[i]); - a.set(t, s); - s += t.byteLength; +function arrayBuffersToBytes(arr) { + const length = arr.length; + if (length === 0) { + return new Uint8Array(0); } - return a; + if (length === 1) { + return new Uint8Array(arr[0]); + } + let dataLength = 0; + for (let i = 0; i < length; i++) { + dataLength += arr[i].byteLength; + } + const data = new Uint8Array(dataLength); + let pos = 0; + for (let i = 0; i < length; i++) { + const item = new Uint8Array(arr[i]); + data.set(item, pos); + pos += item.byteLength; + } + return data; } function getInheritableProperty({ - dict: e, - key: t, - getArray: i = !1, - stopWhenFound: a = !0, + dict, + key, + getArray = false, + stopWhenFound = true, }) { - let s; - const r = new RefSet(); - for (; e instanceof Dict && (!e.objId || !r.has(e.objId)); ) { - e.objId && r.put(e.objId); - const n = i ? e.getArray(t) : e.get(t); - if (void 0 !== n) { - if (a) return n; - (s ||= []).push(n); + let values; + const visited = new RefSet(); + while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { + if (dict.objId) { + visited.put(dict.objId); } - e = e.get("Parent"); + const value = getArray ? dict.getArray(key) : dict.get(key); + if (value !== undefined) { + if (stopWhenFound) { + return value; + } + (values ||= []).push(value); + } + dict = dict.get("Parent"); } - return s; + return values; } -const Ft = [ +const ROMAN_NUMBER_MAP = [ "", "C", "CC", @@ -1066,326 +1412,465 @@ const Ft = [ "VIII", "IX", ]; -function toRomanNumerals(e, t = !1) { +function toRomanNumerals(number, lowerCase = false) { assert( - Number.isInteger(e) && e > 0, + Number.isInteger(number) && number > 0, "The number should be a positive integer.", ); - const i = []; - let a; - for (; e >= 1e3; ) { - e -= 1e3; - i.push("M"); + const romanBuf = []; + let pos; + while (number >= 1000) { + number -= 1000; + romanBuf.push("M"); } - a = (e / 100) | 0; - e %= 100; - i.push(Ft[a]); - a = (e / 10) | 0; - e %= 10; - i.push(Ft[10 + a]); - i.push(Ft[20 + e]); - const s = i.join(""); - return t ? s.toLowerCase() : s; + pos = (number / 100) | 0; + number %= 100; + romanBuf.push(ROMAN_NUMBER_MAP[pos]); + pos = (number / 10) | 0; + number %= 10; + romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); + romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); + const romanStr = romanBuf.join(""); + return lowerCase ? romanStr.toLowerCase() : romanStr; } -function log2(e) { - return e <= 0 ? 0 : Math.ceil(Math.log2(e)); +function log2(x) { + if (x <= 0) { + return 0; + } + return Math.ceil(Math.log2(x)); } -function readInt8(e, t) { - return (e[t] << 24) >> 24; +function readInt8(data, offset) { + return (data[offset] << 24) >> 24; } -function readUint16(e, t) { - return (e[t] << 8) | e[t + 1]; +function readUint16(data, offset) { + return (data[offset] << 8) | data[offset + 1]; } -function readUint32(e, t) { - return ((e[t] << 24) | (e[t + 1] << 16) | (e[t + 2] << 8) | e[t + 3]) >>> 0; -} -function isWhiteSpace(e) { - return 32 === e || 9 === e || 13 === e || 10 === e; -} -function isNumberArray(e, t) { +function readUint32(data, offset) { return ( - Array.isArray(e) && - (null === t || e.length === t) && - e.every((e) => "number" == typeof e) + ((data[offset] << 24) | + (data[offset + 1] << 16) | + (data[offset + 2] << 8) | + data[offset + 3]) >>> + 0 ); } -function lookupMatrix(e, t) { - return isNumberArray(e, 6) ? e : t; +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; } -function lookupRect(e, t) { - return isNumberArray(e, 4) ? e : t; +function isBooleanArray(arr, len) { + return ( + Array.isArray(arr) && + (len === null || arr.length === len) && + arr.every((x) => typeof x === "boolean") + ); } -function lookupNormalRect(e, t) { - return isNumberArray(e, 4) ? Util.normalizeRect(e) : t; +function isNumberArray(arr, len) { + if (Array.isArray(arr)) { + return ( + (len === null || arr.length === len) && + arr.every((x) => typeof x === "number") + ); + } + return ( + ArrayBuffer.isView(arr) && + (arr.length === 0 || typeof arr[0] === "number") && + (len === null || arr.length === len) + ); } -function parseXFAPath(e) { - const t = /(.+)\[(\d+)\]$/; - return e.split(".").map((e) => { - const i = e.match(t); - return i ? { name: i[1], pos: parseInt(i[2], 10) } : { name: e, pos: 0 }; +function lookupMatrix(arr, fallback) { + return isNumberArray(arr, 6) ? arr : fallback; +} +function lookupRect(arr, fallback) { + return isNumberArray(arr, 4) ? arr : fallback; +} +function lookupNormalRect(arr, fallback) { + return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; +} +function parseXFAPath(path) { + const positionPattern = /(.+)\[(\d+)\]$/; + 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(e) { - const t = []; - let i = 0; - for (let a = 0, s = e.length; a < s; a++) { - const s = e.charCodeAt(a); +function escapePDFName(str) { + const buffer = []; + let start = 0; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); if ( - s < 33 || - s > 126 || - 35 === s || - 40 === s || - 41 === s || - 60 === s || - 62 === s || - 91 === s || - 93 === s || - 123 === s || - 125 === s || - 47 === s || - 37 === s + 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 ) { - i < a && t.push(e.substring(i, a)); - t.push(`#${s.toString(16)}`); - i = a + 1; + if (start < i) { + buffer.push(str.substring(start, i)); + } + buffer.push(`#${char.toString(16)}`); + start = i + 1; } } - if (0 === t.length) return e; - i < e.length && t.push(e.substring(i, e.length)); - return t.join(""); -} -function escapeString(e) { - return e.replaceAll(/([()\\\n\r])/g, (e) => - "\n" === e ? "\\n" : "\r" === e ? "\\r" : `\\${e}`, - ); -} -function _collectJS(e, t, i, a) { - if (!e) return; - let s = null; - if (e instanceof Ref) { - if (a.has(e)) return; - s = e; - a.put(s); - e = t.fetch(e); + if (buffer.length === 0) { + return str; } - if (Array.isArray(e)) for (const s of e) _collectJS(s, t, i, a); - else if (e instanceof Dict) { - if (isName(e.get("S"), "JavaScript")) { - const t = e.get("JS"); - let a; - t instanceof BaseStream - ? (a = t.getString()) - : "string" == typeof t && (a = t); - a &&= stringToPDFString(a).replaceAll("\0", ""); - a && i.push(a); + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); +} +function escapeString(str) { + return str.replaceAll(/([()\\\n\r])/g, (match) => { + if (match === "\n") { + return "\\n"; + } else if (match === "\r") { + return "\\r"; } - _collectJS(e.getRaw("Next"), t, i, a); - } - s && a.remove(s); + return `\\${match}`; + }); } -function collectActions(e, t, i) { - const a = Object.create(null), - s = getInheritableProperty({ dict: t, key: "AA", stopWhenFound: !1 }); - if (s) - for (let t = s.length - 1; t >= 0; t--) { - const r = s[t]; - if (r instanceof Dict) - for (const t of r.getKeys()) { - const s = i[t]; - if (!s) continue; - const n = []; - _collectJS(r.getRaw(t), e, n, new RefSet()); - n.length > 0 && (a[s] = n); +function _collectJS(entry, xref, list, parents) { + if (!entry) { + return; + } + let parent = null; + if (entry instanceof Ref) { + 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 Dict) { + if (isName(entry.get("S"), "JavaScript")) { + const js = entry.get("JS"); + let code; + if (js instanceof BaseStream) { + code = js.getString(); + } else if (typeof js === "string") { + code = js; + } + code &&= stringToPDFString(code).replaceAll("\x00", ""); + 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 Dict)) { + continue; + } + for (const key of additionalActions.getKeys()) { + const action = eventType[key]; + if (!action) { + continue; } + const actionDict = additionalActions.getRaw(key); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions[action] = list; + } + } } - if (t.has("A")) { - const i = []; - _collectJS(t.get("A"), e, i, new RefSet()); - i.length > 0 && (a.Action = i); } - return objectSize(a) > 0 ? a : null; + if (dict.has("A")) { + const actionDict = dict.get("A"); + const parents = new RefSet(); + const list = []; + _collectJS(actionDict, xref, list, parents); + if (list.length > 0) { + actions.Action = list; + } + } + return objectSize(actions) > 0 ? actions : null; } -const St = { 60: "<", 62: ">", 38: "&", 34: """, 39: "'" }; -function* codePointIter(e) { - for (let t = 0, i = e.length; t < i; t++) { - const i = e.codePointAt(t); - i > 55295 && (i < 57344 || i > 65533) && t++; - yield i; +const XMLEntities = { + 0x3c: "<", + 0x3e: ">", + 0x26: "&", + 0x22: """, + 0x27: "'", +}; +function* codePointIter(str) { + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.codePointAt(i); + if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { + i++; + } + yield char; } } -function encodeToXmlString(e) { - const t = []; - let i = 0; - for (let a = 0, s = e.length; a < s; a++) { - const s = e.codePointAt(a); - if (32 <= s && s <= 126) { - const r = St[s]; - if (r) { - i < a && t.push(e.substring(i, a)); - t.push(r); - i = a + 1; +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 { - i < a && t.push(e.substring(i, a)); - t.push(`&#x${s.toString(16).toUpperCase()};`); - s > 55295 && (s < 57344 || s > 65533) && a++; - i = a + 1; + 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 (0 === t.length) return e; - i < e.length && t.push(e.substring(i, e.length)); - return t.join(""); + if (buffer.length === 0) { + return str; + } + if (start < str.length) { + buffer.push(str.substring(start, str.length)); + } + return buffer.join(""); } -function validateFontName(e, t = !1) { - const i = /^("|').*("|')$/.exec(e); - if (i && i[1] === i[2]) { - if (new RegExp(`[^\\\\]${i[1]}`).test(e.slice(1, -1))) { - t && warn(`FontFamily contains unescaped ${i[1]}: ${e}.`); - return !1; - } - } else - for (const i of e.split(/[ \t]+/)) - if (/^(\d|(-(\d|-)))/.test(i) || !/^[\w-\\]+$/.test(i)) { - t && warn(`FontFamily contains invalid : ${e}.`); - return !1; +function validateFontName(fontFamily, mustWarn = false) { + const m = /^("|').*("|')$/.exec(fontFamily); + if (m && m[1] === m[2]) { + const re = new RegExp(`[^\\\\]${m[1]}`); + if (re.test(fontFamily.slice(1, -1))) { + if (mustWarn) { + warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); } - return !0; + return false; + } + } else { + for (const ident of fontFamily.split(/[ \t]+/)) { + if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { + if (mustWarn) { + warn(`FontFamily contains invalid : ${fontFamily}.`); + } + return false; + } + } + } + return true; } -function validateCSSFont(e) { - const t = new Set([ - "100", - "200", - "300", - "400", - "500", - "600", - "700", - "800", - "900", - "1000", - "normal", - "bold", - "bolder", - "lighter", - ]), - { fontFamily: i, fontWeight: a, italicAngle: s } = e; - if (!validateFontName(i, !0)) return !1; - const r = a ? a.toString() : ""; - e.fontWeight = t.has(r) ? r : "400"; - const n = parseFloat(s); - e.italicAngle = isNaN(n) || n < -90 || n > 90 ? "14" : s.toString(); - return !0; +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 (!validateFontName(fontFamily, true)) { + 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; } -function recoverJsURL(e) { - const t = new RegExp( +function recoverJsURL(str) { + const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; + const regex = new RegExp( "^\\s*(" + - ["app.launchURL", "window.open", "xfa.host.gotoURL"] - .join("|") - .replaceAll(".", "\\.") + + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i", - ).exec(e); - if (t?.[2]) { - const e = t[2]; - let i = !1; - "true" === t[3] && "app.launchURL" === t[1] && (i = !0); - return { url: e, newWindow: i }; + ); + const jsUrl = regex.exec(str); + if (jsUrl?.[2]) { + const url = jsUrl[2]; + let newWindow = false; + if (jsUrl[3] === "true" && jsUrl[1] === "app.launchURL") { + newWindow = true; + } + return { + url, + newWindow, + }; } return null; } -function numberToString(e) { - if (Number.isInteger(e)) return e.toString(); - const t = Math.round(100 * e); - return t % 100 == 0 - ? (t / 100).toString() - : t % 10 == 0 - ? e.toFixed(1) - : e.toFixed(2); -} -function getNewAnnotationsMap(e) { - if (!e) return null; - const t = new Map(); - for (const [i, a] of e) { - if (!i.startsWith(E)) continue; - let e = t.get(a.pageIndex); - if (!e) { - e = []; - t.set(a.pageIndex, e); - } - e.push(a); +function numberToString(value) { + if (Number.isInteger(value)) { + return value.toString(); } - return t.size > 0 ? t : null; + 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 isAscii(e) { - return /^[\x00-\x7F]*$/.test(e); +function getNewAnnotationsMap(annotationStorage) { + if (!annotationStorage) { + return null; + } + const newAnnotationsByPage = new Map(); + for (const [key, value] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + let annotations = newAnnotationsByPage.get(value.pageIndex); + if (!annotations) { + annotations = []; + newAnnotationsByPage.set(value.pageIndex, annotations); + } + annotations.push(value); + } + return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; } -function stringToUTF16HexString(e) { - const t = []; - for (let i = 0, a = e.length; i < a; i++) { - const a = e.charCodeAt(i); - t.push( - ((a >> 8) & 255).toString(16).padStart(2, "0"), - (255 & a).toString(16).padStart(2, "0"), +function stringToAsciiOrUTF16BE(str) { + return isAscii(str) ? str : stringToUTF16String(str, true); +} +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(hexNumbers[(char >> 8) & 0xff], hexNumbers[char & 0xff]); + } + return buf.join(""); +} +function stringToUTF16String(str, bigEndian = false) { + const buf = []; + if (bigEndian) { + buf.push("\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 t.join(""); + return buf.join(""); } -function stringToUTF16String(e, t = !1) { - const i = []; - t && i.push("þÿ"); - for (let t = 0, a = e.length; t < a; t++) { - const a = e.charCodeAt(t); - i.push(String.fromCharCode((a >> 8) & 255), String.fromCharCode(255 & a)); - } - return i.join(""); -} -function getRotationMatrix(e, t, i) { - switch (e) { +function getRotationMatrix(rotation, width, height) { + switch (rotation) { case 90: - return [0, 1, -1, 0, t, 0]; + return [0, 1, -1, 0, width, 0]; case 180: - return [-1, 0, 0, -1, t, i]; + return [-1, 0, 0, -1, width, height]; case 270: - return [0, -1, 1, 0, 0, i]; + return [0, -1, 1, 0, 0, height]; default: throw new Error("Invalid rotation"); } } -function getSizeInBytes(e) { - return Math.ceil(Math.ceil(Math.log2(1 + e)) / 8); -} +function getSizeInBytes(x) { + return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); +} // ./src/core/stream.js + class Stream extends BaseStream { - constructor(e, t, i, a) { + constructor(arrayBuffer, start, length, dict) { super(); - this.bytes = e instanceof Uint8Array ? e : new Uint8Array(e); - this.start = t || 0; + this.bytes = + arrayBuffer instanceof Uint8Array + ? arrayBuffer + : new Uint8Array(arrayBuffer); + this.start = start || 0; this.pos = this.start; - this.end = t + i || this.bytes.length; - this.dict = a; + this.end = start + length || this.bytes.length; + this.dict = dict; } get length() { return this.end - this.start; } get isEmpty() { - return 0 === this.length; + return this.length === 0; } getByte() { - return this.pos >= this.end ? -1 : this.bytes[this.pos++]; + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; } - getBytes(e) { - const t = this.bytes, - i = this.pos, - a = this.end; - if (!e) return t.subarray(i, a); - let s = i + e; - s > a && (s = a); - this.pos = s; - return t.subarray(i, s); + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + return bytes.subarray(pos, strEnd); + } + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + return bytes.subarray(pos, end); } - getByteRange(e, t) { - e < 0 && (e = 0); - t > this.end && (t = this.end); - return this.bytes.subarray(e, t); + 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; @@ -1393,35 +1878,39 @@ class Stream extends BaseStream { moveStart() { this.start = this.pos; } - makeSubStream(e, t, i = null) { - return new Stream(this.bytes.buffer, e, t, i); + makeSubStream(start, length, dict = null) { + return new Stream(this.bytes.buffer, start, length, dict); } } class StringStream extends Stream { - constructor(e) { - super(stringToBytes(e)); + constructor(str) { + super(stringToBytes(str)); } } class NullStream extends Stream { constructor() { super(new Uint8Array(0)); } -} +} // ./src/core/chunked_stream.js + class ChunkedStream extends Stream { - constructor(e, t, i) { - super(new Uint8Array(e), 0, e, null); - this.chunkSize = t; + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; this._loadedChunks = new Set(); - this.numChunks = Math.ceil(e / t); - this.manager = i; + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; this.progressiveDataLength = 0; this.lastSuccessfulEnsureByteChunk = -1; } getMissingChunks() { - const e = []; - for (let t = 0, i = this.numChunks; t < i; ++t) - this._loadedChunks.has(t) || e.push(t); - return e; + const chunks = []; + for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + chunks.push(chunk); + } + } + return chunks; } get numChunksLoaded() { return this._loadedChunks.size; @@ -1429,468 +1918,686 @@ class ChunkedStream extends Stream { get isDataLoaded() { return this.numChunksLoaded === this.numChunks; } - onReceiveData(e, t) { - const i = this.chunkSize; - if (e % i != 0) throw new Error(`Bad begin offset: ${e}`); - const a = e + t.byteLength; - if (a % i != 0 && a !== this.bytes.length) - throw new Error(`Bad end offset: ${a}`); - this.bytes.set(new Uint8Array(t), e); - const s = Math.floor(e / i), - r = Math.floor((a - 1) / i) + 1; - for (let e = s; e < r; ++e) this._loadedChunks.add(e); - } - onReceiveProgressiveData(e) { - let t = this.progressiveDataLength; - const i = Math.floor(t / this.chunkSize); - this.bytes.set(new Uint8Array(e), t); - t += e.byteLength; - this.progressiveDataLength = t; - const a = t >= this.end ? this.numChunks : Math.floor(t / this.chunkSize); - for (let e = i; e < a; ++e) this._loadedChunks.add(e); - } - ensureByte(e) { - if (e < this.progressiveDataLength) return; - const t = Math.floor(e / this.chunkSize); - if (!(t > this.numChunks) && t !== this.lastSuccessfulEnsureByteChunk) { - if (!this._loadedChunks.has(t)) throw new MissingDataException(e, e + 1); - this.lastSuccessfulEnsureByteChunk = t; + onReceiveData(begin, chunk) { + const chunkSize = this.chunkSize; + if (begin % chunkSize !== 0) { + throw new Error(`Bad begin offset: ${begin}`); + } + const end = begin + chunk.byteLength; + if (end % chunkSize !== 0 && end !== this.bytes.length) { + throw new Error(`Bad end offset: ${end}`); + } + this.bytes.set(new Uint8Array(chunk), begin); + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = Math.floor((end - 1) / chunkSize) + 1; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); } } - ensureRange(e, t) { - if (e >= t) return; - if (t <= this.progressiveDataLength) return; - const i = Math.floor(e / this.chunkSize); - if (i > this.numChunks) return; - const a = Math.min( - Math.floor((t - 1) / this.chunkSize) + 1, + onReceiveProgressiveData(data) { + let position = this.progressiveDataLength; + const beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + const endChunk = + position >= this.end + ? this.numChunks + : Math.floor(position / this.chunkSize); + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); + if (chunk > this.numChunks) { + return; + } + if (chunk === this.lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(pos, pos + 1); + } + this.lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + return; + } + const beginChunk = Math.floor(begin / this.chunkSize); + if (beginChunk > this.numChunks) { + return; + } + const endChunk = Math.min( + Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks, ); - for (let s = i; s < a; ++s) - if (!this._loadedChunks.has(s)) throw new MissingDataException(e, t); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(begin, end); + } + } } - nextEmptyChunk(e) { - const t = this.numChunks; - for (let i = 0; i < t; ++i) { - const a = (e + i) % t; - if (!this._loadedChunks.has(a)) return a; + nextEmptyChunk(beginChunk) { + const numChunks = this.numChunks; + for (let i = 0; i < numChunks; ++i) { + const chunk = (beginChunk + i) % numChunks; + if (!this._loadedChunks.has(chunk)) { + return chunk; + } } return null; } - hasChunk(e) { - return this._loadedChunks.has(e); + hasChunk(chunk) { + return this._loadedChunks.has(chunk); } getByte() { - const e = this.pos; - if (e >= this.end) return -1; - e >= this.progressiveDataLength && this.ensureByte(e); + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); + } return this.bytes[this.pos++]; } - getBytes(e) { - const t = this.bytes, - i = this.pos, - a = this.end; - if (!e) { - a > this.progressiveDataLength && this.ensureRange(i, a); - return t.subarray(i, a); + getBytes(length) { + const bytes = this.bytes; + const pos = this.pos; + const strEnd = this.end; + if (!length) { + if (strEnd > this.progressiveDataLength) { + this.ensureRange(pos, strEnd); + } + return bytes.subarray(pos, strEnd); } - let s = i + e; - s > a && (s = a); - s > this.progressiveDataLength && this.ensureRange(i, s); - this.pos = s; - return t.subarray(i, s); + let end = pos + length; + if (end > strEnd) { + end = strEnd; + } + if (end > this.progressiveDataLength) { + this.ensureRange(pos, end); + } + this.pos = end; + return bytes.subarray(pos, end); } - getByteRange(e, t) { - e < 0 && (e = 0); - t > this.end && (t = this.end); - t > this.progressiveDataLength && this.ensureRange(e, t); - return this.bytes.subarray(e, t); + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + if (end > this.progressiveDataLength) { + this.ensureRange(begin, end); + } + return this.bytes.subarray(begin, end); } - makeSubStream(e, t, i = null) { - t - ? e + t > this.progressiveDataLength && this.ensureRange(e, e + t) - : e >= this.progressiveDataLength && this.ensureByte(e); + makeSubStream(start, length, dict = null) { + if (length) { + if (start + length > this.progressiveDataLength) { + this.ensureRange(start, start + length); + } + } else if (start >= this.progressiveDataLength) { + this.ensureByte(start); + } function ChunkedStreamSubstream() {} ChunkedStreamSubstream.prototype = Object.create(this); ChunkedStreamSubstream.prototype.getMissingChunks = function () { - const e = this.chunkSize, - t = Math.floor(this.start / e), - i = Math.floor((this.end - 1) / e) + 1, - a = []; - for (let e = t; e < i; ++e) this._loadedChunks.has(e) || a.push(e); - return a; + const chunkSize = this.chunkSize; + const beginChunk = Math.floor(this.start / chunkSize); + const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; + const missingChunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + missingChunks.push(chunk); + } + } + return missingChunks; }; Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { get() { - return ( - this.numChunksLoaded === this.numChunks || - 0 === this.getMissingChunks().length - ); + if (this.numChunksLoaded === this.numChunks) { + return true; + } + return this.getMissingChunks().length === 0; }, - configurable: !0, + configurable: true, }); - const a = new ChunkedStreamSubstream(); - a.pos = a.start = e; - a.end = e + t || this.end; - a.dict = i; - return a; + const subStream = new ChunkedStreamSubstream(); + subStream.pos = subStream.start = start; + subStream.end = start + length || this.end; + subStream.dict = dict; + return subStream; } getBaseStreams() { return [this]; } } class ChunkedStreamManager { - constructor(e, t) { - this.length = t.length; - this.chunkSize = t.rangeChunkSize; + constructor(pdfNetworkStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; this.stream = new ChunkedStream(this.length, this.chunkSize, this); - this.pdfNetworkStream = e; - this.disableAutoFetch = t.disableAutoFetch; - this.msgHandler = t.msgHandler; + this.pdfNetworkStream = pdfNetworkStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; this.currRequestId = 0; this._chunksNeededByRequest = new Map(); this._requestsByChunk = new Map(); this._promisesByRequest = new Map(); this.progressiveDataLength = 0; - this.aborted = !1; + this.aborted = false; this._loadedStreamCapability = Promise.withResolvers(); } - sendRequest(e, t) { - const i = this.pdfNetworkStream.getRangeReader(e, t); - i.isStreamingSupported || (i.onProgress = this.onProgress.bind(this)); - let a = [], - s = 0; - return new Promise((e, t) => { - const readChunk = ({ value: r, done: n }) => { + sendRequest(begin, end) { + const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); + if (!rangeReader.isStreamingSupported) { + rangeReader.onProgress = this.onProgress.bind(this); + } + let chunks = [], + loaded = 0; + return new Promise((resolve, reject) => { + const readChunk = ({ value, done }) => { try { - if (n) { - const t = arrayBuffersToBytes(a); - a = null; - e(t); + if (done) { + const chunkData = arrayBuffersToBytes(chunks); + chunks = null; + resolve(chunkData); return; } - s += r.byteLength; - i.isStreamingSupported && this.onProgress({ loaded: s }); - a.push(r); - i.read().then(readChunk, t); + loaded += value.byteLength; + if (rangeReader.isStreamingSupported) { + this.onProgress({ + loaded, + }); + } + chunks.push(value); + rangeReader.read().then(readChunk, reject); } catch (e) { - t(e); + reject(e); } }; - i.read().then(readChunk, t); - }).then((t) => { - this.aborted || this.onReceiveData({ chunk: t, begin: e }); + rangeReader.read().then(readChunk, reject); + }).then((data) => { + if (this.aborted) { + return; + } + this.onReceiveData({ + chunk: data, + begin, + }); }); } - requestAllChunks(e = !1) { - if (!e) { - const e = this.stream.getMissingChunks(); - this._requestChunks(e); + requestAllChunks(noFetch = false) { + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); } return this._loadedStreamCapability.promise; } - _requestChunks(e) { - const t = this.currRequestId++, - i = new Set(); - this._chunksNeededByRequest.set(t, i); - for (const t of e) this.stream.hasChunk(t) || i.add(t); - if (0 === i.size) return Promise.resolve(); - const a = Promise.withResolvers(); - this._promisesByRequest.set(t, a); - const s = []; - for (const e of i) { - let i = this._requestsByChunk.get(e); - if (!i) { - i = []; - this._requestsByChunk.set(e, i); - s.push(e); - } - i.push(t); - } - if (s.length > 0) { - const e = this.groupChunks(s); - for (const t of e) { - const e = t.beginChunk * this.chunkSize, - i = Math.min(t.endChunk * this.chunkSize, this.length); - this.sendRequest(e, i).catch(a.reject); + _requestChunks(chunks) { + const requestId = this.currRequestId++; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); } } - return a.promise.catch((e) => { - if (!this.aborted) throw e; + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const capability = Promise.withResolvers(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + let requestIds = this._requestsByChunk.get(chunk); + if (!requestIds) { + requestIds = []; + this._requestsByChunk.set(chunk, requestIds); + chunksToRequest.push(chunk); + } + requestIds.push(requestId); + } + if (chunksToRequest.length > 0) { + const groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (const groupedChunk of groupedChunksToRequest) { + const begin = groupedChunk.beginChunk * this.chunkSize; + const end = Math.min( + groupedChunk.endChunk * this.chunkSize, + this.length, + ); + this.sendRequest(begin, end).catch(capability.reject); + } + } + return capability.promise.catch((reason) => { + if (this.aborted) { + return; + } + throw reason; }); } getStream() { return this.stream; } - requestRange(e, t) { - t = Math.min(t, this.length); - const i = this.getBeginChunk(e), - a = this.getEndChunk(t), - s = []; - for (let e = i; e < a; ++e) s.push(e); - return this._requestChunks(s); - } - requestRanges(e = []) { - const t = []; - for (const i of e) { - const e = this.getBeginChunk(i.begin), - a = this.getEndChunk(i.end); - for (let i = e; i < a; ++i) t.includes(i) || t.push(i); + requestRange(begin, end) { + end = Math.min(end, this.length); + const beginChunk = this.getBeginChunk(begin); + const endChunk = this.getEndChunk(end); + const chunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + chunks.push(chunk); } - t.sort(function (e, t) { - return e - t; - }); - return this._requestChunks(t); + return this._requestChunks(chunks); } - groupChunks(e) { - const t = []; - let i = -1, - a = -1; - for (let s = 0, r = e.length; s < r; ++s) { - const r = e[s]; - i < 0 && (i = r); - if (a >= 0 && a + 1 !== r) { - t.push({ beginChunk: i, endChunk: a + 1 }); - i = r; - } - s + 1 === e.length && t.push({ beginChunk: i, endChunk: r + 1 }); - a = r; - } - return t; - } - onProgress(e) { - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize + e.loaded, - total: this.length, - }); - } - onReceiveData(e) { - const t = e.chunk, - i = void 0 === e.begin, - a = i ? this.progressiveDataLength : e.begin, - s = a + t.byteLength, - r = Math.floor(a / this.chunkSize), - n = - s < this.length - ? Math.floor(s / this.chunkSize) - : Math.ceil(s / this.chunkSize); - if (i) { - this.stream.onReceiveProgressiveData(t); - this.progressiveDataLength = s; - } else this.stream.onReceiveData(a, t); - this.stream.isDataLoaded && - this._loadedStreamCapability.resolve(this.stream); - const g = []; - for (let e = r; e < n; ++e) { - const t = this._requestsByChunk.get(e); - if (t) { - this._requestsByChunk.delete(e); - for (const i of t) { - const t = this._chunksNeededByRequest.get(i); - t.has(e) && t.delete(e); - t.size > 0 || g.push(i); + requestRanges(ranges = []) { + const chunksToRequest = []; + for (const range of ranges) { + const beginChunk = this.getBeginChunk(range.begin); + const endChunk = this.getEndChunk(range.end); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!chunksToRequest.includes(chunk)) { + chunksToRequest.push(chunk); } } } - if (!this.disableAutoFetch && 0 === this._requestsByChunk.size) { - let e; - if (1 === this.stream.numChunksLoaded) { - const t = this.stream.numChunks - 1; - this.stream.hasChunk(t) || (e = t); - } else e = this.stream.nextEmptyChunk(n); - Number.isInteger(e) && this._requestChunks([e]); + chunksToRequest.sort(function (a, b) { + return a - b; + }); + return this._requestChunks(chunksToRequest); + } + groupChunks(chunks) { + const groupedChunks = []; + let beginChunk = -1; + let prevChunk = -1; + for (let i = 0, ii = chunks.length; i < ii; ++i) { + const chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && prevChunk + 1 !== chunk) { + groupedChunks.push({ + beginChunk, + endChunk: prevChunk + 1, + }); + beginChunk = chunk; + } + if (i + 1 === chunks.length) { + groupedChunks.push({ + beginChunk, + endChunk: chunk + 1, + }); + } + prevChunk = chunk; } - for (const e of g) { - const t = this._promisesByRequest.get(e); - this._promisesByRequest.delete(e); - t.resolve(); + return groupedChunks; + } + onProgress(args) { + this.msgHandler.send("DocProgress", { + loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, + total: this.length, + }); + } + onReceiveData(args) { + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? this.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / this.chunkSize); + const endChunk = + end < this.length + ? Math.floor(end / this.chunkSize) + : Math.ceil(end / this.chunkSize); + if (isProgressive) { + this.stream.onReceiveProgressiveData(chunk); + this.progressiveDataLength = end; + } else { + this.stream.onReceiveData(begin, chunk); + } + if (this.stream.isDataLoaded) { + this._loadedStreamCapability.resolve(this.stream); + } + const loadedRequests = []; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { + continue; + } + this._requestsByChunk.delete(curChunk); + for (const requestId of requestIds) { + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); + } + if (chunksNeeded.size > 0) { + continue; + } + loadedRequests.push(requestId); + } + } + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { + let nextEmptyChunk; + if (this.stream.numChunksLoaded === 1) { + const lastChunk = this.stream.numChunks - 1; + if (!this.stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); + } + if (Number.isInteger(nextEmptyChunk)) { + this._requestChunks([nextEmptyChunk]); + } + } + for (const requestId of loadedRequests) { + const capability = this._promisesByRequest.get(requestId); + this._promisesByRequest.delete(requestId); + capability.resolve(); } this.msgHandler.send("DocProgress", { loaded: this.stream.numChunksLoaded * this.chunkSize, total: this.length, }); } - onError(e) { - this._loadedStreamCapability.reject(e); + onError(err) { + this._loadedStreamCapability.reject(err); } - getBeginChunk(e) { - return Math.floor(e / this.chunkSize); + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); } - getEndChunk(e) { - return Math.floor((e - 1) / this.chunkSize) + 1; + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; } - abort(e) { - this.aborted = !0; - this.pdfNetworkStream?.cancelAllRequests(e); - for (const t of this._promisesByRequest.values()) t.reject(e); + abort(reason) { + this.aborted = true; + this.pdfNetworkStream?.cancelAllRequests(reason); + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + } +} // ./src/core/colorspace.js + +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 resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0; + const xScaled = new Uint16Array(w2); + if (alpha01 === 1) { + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0; i < h2; i++) { + const buf = src32.subarray(Math.floor(i * yRatio) * w1); + for (let j = 0; j < w2; j++) { + dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; + } + } + } else { + const COMPONENTS = 4; + 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 buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); + for (let j = 0; j < w2; j++) { + const oldIndex = xScaled[j]; + dest[newIndex++] = buf[oldIndex]; + dest[newIndex++] = buf[oldIndex + 1]; + dest[newIndex++] = buf[oldIndex + 2]; + } + } + } +} +function copyRgbaImage(src, dest, alpha01) { + if (alpha01 === 1) { + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0, ii = src32.length; i < ii; i++) { + dest32[i] |= src32[i] & rgbMask; + } + } else { + let j = 0; + for (let i = 0, ii = src.length; i < ii; i += 4) { + dest[j++] = src[i]; + dest[j++] = src[i + 1]; + dest[j++] = src[i + 2]; + } } } class ColorSpace { - constructor(e, t) { - this.constructor === ColorSpace && - unreachable("Cannot initialize ColorSpace."); - this.name = e; - this.numComps = t; + constructor(name, numComps) { + this.name = name; + this.numComps = numComps; } - getRgb(e, t) { - const i = new Uint8ClampedArray(3); - this.getRgbItem(e, t, i, 0); - return i; + getRgb(src, srcOffset) { + const rgb = new Uint8ClampedArray(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; } - getRgbItem(e, t, i, a) { + getRgbItem(src, srcOffset, dest, destOffset) { unreachable("Should not call ColorSpace.getRgbItem"); } - getRgbBuffer(e, t, i, a, s, r, n) { + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { unreachable("Should not call ColorSpace.getRgbBuffer"); } - getOutputLength(e, t) { + getOutputLength(inputLength, alpha01) { unreachable("Should not call ColorSpace.getOutputLength"); } - isPassthrough(e) { - return !1; + isPassthrough(bits) { + return false; } - isDefaultDecode(e, t) { - return ColorSpace.isDefaultDecode(e, this.numComps); + isDefaultDecode(decodeMap, bpc) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); } - fillRgb(e, t, i, a, s, r, n, g, o) { - const c = t * i; - let C = null; - const h = 1 << n, - l = i !== s || t !== a; - if (this.isPassthrough(n)) C = g; - else if ( - 1 === this.numComps && - c > h && - "DeviceGray" !== this.name && - "DeviceRGB" !== this.name + 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.isPassthrough(bpc)) { + rgbBuf = comps; + } else if ( + this.numComps === 1 && + count > numComponentColors && + this.name !== "DeviceGray" && + this.name !== "DeviceRGB" ) { - const t = n <= 8 ? new Uint8Array(h) : new Uint16Array(h); - for (let e = 0; e < h; e++) t[e] = e; - const i = new Uint8ClampedArray(3 * h); - this.getRgbBuffer(t, 0, h, i, 0, n, 0); - if (l) { - C = new Uint8Array(3 * c); - let e = 0; - for (let t = 0; t < c; ++t) { - const a = 3 * g[t]; - C[e++] = i[a]; - C[e++] = i[a + 1]; - C[e++] = i[a + 2]; + const allColors = + bpc <= 8 + ? new Uint8Array(numComponentColors) + : new Uint16Array(numComponentColors); + for (let i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + const colorMap = new Uint8ClampedArray(numComponentColors * 3); + this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); + if (!needsResizing) { + let destPos = 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; } } else { - let t = 0; - for (let a = 0; a < c; ++a) { - const s = 3 * g[a]; - e[t++] = i[s]; - e[t++] = i[s + 1]; - e[t++] = i[s + 2]; - t += o; + 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]; } } - } else if (l) { - C = new Uint8ClampedArray(3 * c); - this.getRgbBuffer(g, 0, c, C, 0, n, 0); - } else this.getRgbBuffer(g, 0, a * r, e, 0, n, o); - if (C) - if (l) - !(function resizeRgbImage(e, t, i, a, s, r, n) { - n = 1 !== n ? 0 : n; - const g = i / s, - o = a / r; - let c, - C = 0; - const h = new Uint16Array(s), - l = 3 * i; - for (let e = 0; e < s; e++) h[e] = 3 * Math.floor(e * g); - for (let i = 0; i < r; i++) { - const a = Math.floor(i * o) * l; - for (let i = 0; i < s; i++) { - c = a + h[i]; - t[C++] = e[c++]; - t[C++] = e[c++]; - t[C++] = e[c++]; - C += n; - } - } - })(C, e, t, i, a, s, o); - else { - let t = 0, - i = 0; - for (let s = 0, n = a * r; s < n; s++) { - e[t++] = C[i++]; - e[t++] = C[i++]; - e[t++] = C[i++]; - t += o; + } 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; } } + } } get usesZeroToOneRange() { - return shadow(this, "usesZeroToOneRange", !0); + return shadow(this, "usesZeroToOneRange", true); } - static _cache(e, t, i, a) { - if (!i) + static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { + if (!localColorSpaceCache) { throw new Error( 'ColorSpace._cache - expected "localColorSpaceCache" argument.', ); - if (!a) + } + if (!parsedColorSpace) { throw new Error( 'ColorSpace._cache - expected "parsedColorSpace" argument.', ); - let s, r; - if (e instanceof Ref) { - r = e; - e = t.fetch(e); } - e instanceof Name && (s = e.name); - (s || r) && i.set(s, r, a); + let csName, csRef; + if (cacheKey instanceof Ref) { + csRef = cacheKey; + cacheKey = xref.fetch(cacheKey); + } + if (cacheKey instanceof Name) { + csName = cacheKey.name; + } + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedColorSpace); + } } - static getCached(e, t, i) { - if (!i) + static getCached(cacheKey, xref, localColorSpaceCache) { + if (!localColorSpaceCache) { throw new Error( 'ColorSpace.getCached - expected "localColorSpaceCache" argument.', ); - if (e instanceof Ref) { - const a = i.getByRef(e); - if (a) return a; + } + if (cacheKey instanceof Ref) { + const localColorSpace = localColorSpaceCache.getByRef(cacheKey); + if (localColorSpace) { + return localColorSpace; + } try { - e = t.fetch(e); - } catch (e) { - if (e instanceof MissingDataException) throw e; + cacheKey = xref.fetch(cacheKey); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } } } - if (e instanceof Name) { - const t = i.getByName(e.name); - if (t) return t; + if (cacheKey instanceof Name) { + const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); + if (localColorSpace) { + return localColorSpace; + } } return null; } static async parseAsync({ - cs: e, - xref: t, - resources: i = null, - pdfFunctionFactory: a, - localColorSpaceCache: s, + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache, }) { - const r = this._parse(e, t, i, a); - this._cache(e, t, s, r); - return r; + const parsedColorSpace = this._parse( + cs, + xref, + resources, + pdfFunctionFactory, + ); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; } static parse({ - cs: e, - xref: t, - resources: i = null, - pdfFunctionFactory: a, - localColorSpaceCache: s, + cs, + xref, + resources = null, + pdfFunctionFactory, + localColorSpaceCache, }) { - const r = this.getCached(e, t, s); - if (r) return r; - const n = this._parse(e, t, i, a); - this._cache(e, t, s, n); - return n; + const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); + if (cachedColorSpace) { + return cachedColorSpace; + } + const parsedColorSpace = this._parse( + cs, + xref, + resources, + pdfFunctionFactory, + ); + this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); + return parsedColorSpace; } - static _parse(e, t, i = null, a) { - if ((e = t.fetchIfRef(e)) instanceof Name) - switch (e.name) { + static _parse(cs, xref, resources = null, pdfFunctionFactory) { + cs = xref.fetchIfRef(cs); + if (cs instanceof Name) { + switch (cs.name) { case "G": case "DeviceGray": return this.singletons.gray; @@ -1905,23 +2612,32 @@ class ColorSpace { case "Pattern": return new PatternCS(null); default: - if (i instanceof Dict) { - const s = i.get("ColorSpace"); - if (s instanceof Dict) { - const r = s.get(e.name); - if (r) { - if (r instanceof Name) return this._parse(r, t, i, a); - e = r; + if (resources instanceof Dict) { + const colorSpaces = resources.get("ColorSpace"); + if (colorSpaces instanceof Dict) { + const resourcesCS = colorSpaces.get(cs.name); + if (resourcesCS) { + if (resourcesCS instanceof Name) { + return this._parse( + resourcesCS, + xref, + resources, + pdfFunctionFactory, + ); + } + cs = resourcesCS; break; } } } - throw new FormatError(`Unrecognized ColorSpace: ${e.name}`); + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.singletons.gray; } - if (Array.isArray(e)) { - const s = t.fetchIfRef(e[0]).name; - let r, n, g, o, c, C; - switch (s) { + } + if (Array.isArray(cs)) { + const mode = xref.fetchIfRef(cs[0]).name; + let params, numComps, baseCS, whitePoint, blackPoint, gamma; + switch (mode) { case "G": case "DeviceGray": return this.singletons.gray; @@ -1932,69 +2648,85 @@ class ColorSpace { case "DeviceCMYK": return this.singletons.cmyk; case "CalGray": - r = t.fetchIfRef(e[1]); - o = r.getArray("WhitePoint"); - c = r.getArray("BlackPoint"); - C = r.get("Gamma"); - return new CalGrayCS(o, c, C); + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); case "CalRGB": - r = t.fetchIfRef(e[1]); - o = r.getArray("WhitePoint"); - c = r.getArray("BlackPoint"); - C = r.getArray("Gamma"); - const h = r.getArray("Matrix"); - return new CalRGBCS(o, c, C, h); + 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 "ICCBased": - const l = t.fetchIfRef(e[1]).dict; - n = l.get("N"); - const Q = l.get("Alternate"); - if (Q) { - const e = this._parse(Q, t, i, a); - if (e.numComps === n) return e; + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + const alt = dict.get("Alternate"); + if (alt) { + const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); + if (altCS.numComps === numComps) { + return altCS; + } warn("ICCBased color space: Ignoring incorrect /Alternate entry."); } - if (1 === n) return this.singletons.gray; - if (3 === n) return this.singletons.rgb; - if (4 === n) return this.singletons.cmyk; + if (numComps === 1) { + return this.singletons.gray; + } else if (numComps === 3) { + return this.singletons.rgb; + } else if (numComps === 4) { + return this.singletons.cmyk; + } break; case "Pattern": - g = e[1] || null; - g && (g = this._parse(g, t, i, a)); - return new PatternCS(g); + baseCS = cs[1] || null; + if (baseCS) { + baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); + } + return new PatternCS(baseCS); case "I": case "Indexed": - g = this._parse(e[1], t, i, a); - const E = t.fetchIfRef(e[2]) + 1, - u = t.fetchIfRef(e[3]); - return new IndexedCS(g, E, u); + baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); + const hiVal = Math.max(0, Math.min(xref.fetchIfRef(cs[2]), 255)); + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); case "Separation": case "DeviceN": - const d = t.fetchIfRef(e[1]); - n = Array.isArray(d) ? d.length : 1; - g = this._parse(e[2], t, i, a); - const f = a.create(e[3]); - return new AlternateCS(n, g, f); + 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); case "Lab": - r = t.fetchIfRef(e[1]); - o = r.getArray("WhitePoint"); - c = r.getArray("BlackPoint"); - const p = r.getArray("Range"); - return new LabCS(o, c, p); + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); default: - throw new FormatError(`Unimplemented ColorSpace object: ${s}`); + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.singletons.gray; } } - throw new FormatError(`Unrecognized ColorSpace object: ${e}`); + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.singletons.gray; } - static isDefaultDecode(e, t) { - if (!Array.isArray(e)) return !0; - if (2 * t !== e.length) { - warn("The decode map is not the correct length"); - return !0; + static isDefaultDecode(decode, numComps) { + if (!Array.isArray(decode)) { + return true; } - for (let t = 0, i = e.length; t < i; t += 2) - if (0 !== e[t] || 1 !== e[t + 1]) return !1; - return !0; + if (numComps * 2 !== decode.length) { + warn("The decode map is not the correct length"); + return true; + } + for (let i = 0, ii = decode.length; i < ii; i += 2) { + if (decode[i] !== 0 || decode[i + 1] !== 1) { + return false; + } + } + return true; } static get singletons() { return shadow(this, "singletons", { @@ -2014,267 +2746,309 @@ class ColorSpace { } } class AlternateCS extends ColorSpace { - constructor(e, t, i) { - super("Alternate", e); - this.base = t; - this.tintFn = i; - this.tmpBuf = new Float32Array(t.numComps); + constructor(numComps, base, tintFn) { + super("Alternate", numComps); + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); } - getRgbItem(e, t, i, a) { - const s = this.tmpBuf; - this.tintFn(e, t, s, 0); - this.base.getRgbItem(s, 0, i, a); + getRgbItem(src, srcOffset, dest, destOffset) { + const tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = this.tintFn, - o = this.base, - c = 1 / ((1 << r) - 1), - C = o.numComps, - h = o.usesZeroToOneRange, - l = (o.isPassthrough(8) || !h) && 0 === n; - let Q = l ? s : 0; - const E = l ? a : new Uint8ClampedArray(C * i), - u = this.numComps, - d = new Float32Array(u), - f = new Float32Array(C); - let p, m; - for (p = 0; p < i; p++) { - for (m = 0; m < u; m++) d[m] = e[t++] * c; - g(d, 0, f, 0); - if (h) for (m = 0; m < C; m++) E[Q++] = 255 * f[m]; - else { - o.getRgbItem(f, 0, E, Q); - Q += C; + 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 (i = 0; i < count; i++) { + for (j = 0; j < numComps; j++) { + scaled[j] = src[srcOffset++] * scale; + } + tintFn(scaled, 0, tinted, 0); + if (usesZeroToOneRange) { + for (j = 0; j < baseNumComps; j++) { + baseBuf[pos++] = tinted[j] * 255; + } + } else { + base.getRgbItem(tinted, 0, baseBuf, pos); + pos += baseNumComps; } } - l || o.getRgbBuffer(E, 0, i, a, s, 8, n); + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } } - getOutputLength(e, t) { + getOutputLength(inputLength, alpha01) { return this.base.getOutputLength( - (e * this.base.numComps) / this.numComps, - t, + (inputLength * this.base.numComps) / this.numComps, + alpha01, ); } } class PatternCS extends ColorSpace { - constructor(e) { + constructor(baseCS) { super("Pattern", null); - this.base = e; + this.base = baseCS; } - isDefaultDecode(e, t) { + isDefaultDecode(decodeMap, bpc) { unreachable("Should not call PatternCS.isDefaultDecode"); } } class IndexedCS extends ColorSpace { - constructor(e, t, i) { + constructor(base, highVal, lookup) { super("Indexed", 1); - this.base = e; - this.highVal = t; - const a = e.numComps * t; - this.lookup = new Uint8Array(a); - if (i instanceof BaseStream) { - const e = i.getBytes(a); - this.lookup.set(e); + this.base = base; + const length = base.numComps * (highVal + 1); + this.lookup = new Uint8Array(length); + if (lookup instanceof BaseStream) { + 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 { - if ("string" != typeof i) - throw new FormatError(`IndexedCS - unrecognized lookup table: ${i}`); - for (let e = 0; e < a; ++e) this.lookup[e] = 255 & i.charCodeAt(e); + throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); } } - getRgbItem(e, t, i, a) { - const s = this.base.numComps, - r = e[t] * s; - this.base.getRgbBuffer(this.lookup, r, 1, i, a, 8, 0); + 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); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = this.base, - o = g.numComps, - c = g.getOutputLength(o, n), - C = this.lookup; - for (let r = 0; r < i; ++r) { - const i = e[t++] * o; - g.getRgbBuffer(C, i, 1, a, s, 8, n); - s += c; + 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; i < count; ++i) { + const lookupPos = src[srcOffset++] * numComps; + base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); + destOffset += outputDelta; } } - getOutputLength(e, t) { - return this.base.getOutputLength(e * this.base.numComps, t); + getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); } - isDefaultDecode(e, t) { - if (!Array.isArray(e)) return !0; - if (2 !== e.length) { + isDefaultDecode(decodeMap, bpc) { + if (!Array.isArray(decodeMap)) { + return true; + } + if (decodeMap.length !== 2) { warn("Decode map length is not correct"); - return !0; + return true; } - if (!Number.isInteger(t) || t < 1) { + if (!Number.isInteger(bpc) || bpc < 1) { warn("Bits per component is not correct"); - return !0; + return true; } - return 0 === e[0] && e[1] === (1 << t) - 1; + return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; } } class DeviceGrayCS extends ColorSpace { constructor() { super("DeviceGray", 1); } - getRgbItem(e, t, i, a) { - const s = 255 * e[t]; - i[a] = i[a + 1] = i[a + 2] = s; + getRgbItem(src, srcOffset, dest, destOffset) { + const c = src[srcOffset] * 255; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = 255 / ((1 << r) - 1); - let o = t, - c = s; - for (let t = 0; t < i; ++t) { - const t = g * e[o++]; - a[c++] = t; - a[c++] = t; - a[c++] = t; - c += n; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 255 / ((1 << bits) - 1); + let j = srcOffset, + q = destOffset; + for (let i = 0; i < count; ++i) { + const c = scale * src[j++]; + dest[q++] = c; + dest[q++] = c; + dest[q++] = c; + q += alpha01; } } - getOutputLength(e, t) { - return e * (3 + t); + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); } } class DeviceRgbCS extends ColorSpace { constructor() { super("DeviceRGB", 3); } - getRgbItem(e, t, i, a) { - i[a] = 255 * e[t]; - i[a + 1] = 255 * e[t + 1]; - i[a + 2] = 255 * e[t + 2]; + 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(e, t, i, a, s, r, n) { - if (8 === r && 0 === n) { - a.set(e.subarray(t, t + 3 * i), s); + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); return; } - const g = 255 / ((1 << r) - 1); - let o = t, - c = s; - for (let t = 0; t < i; ++t) { - a[c++] = g * e[o++]; - a[c++] = g * e[o++]; - a[c++] = g * e[o++]; - c += n; + 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; } } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; + getOutputLength(inputLength, alpha01) { + return ((inputLength * (3 + alpha01)) / 3) | 0; } - isPassthrough(e) { - return 8 === e; + isPassthrough(bits) { + return bits === 8; } } class DeviceRgbaCS extends ColorSpace { constructor() { super("DeviceRGBA", 4); } - getOutputLength(e, t) { - return 4 * e; + getOutputLength(inputLength, _alpha01) { + return inputLength * 4; } - isPassthrough(e) { - return 8 === e; + isPassthrough(bits) { + return bits === 8; + } + fillRgb( + dest, + originalWidth, + originalHeight, + width, + height, + actualHeight, + bpc, + comps, + alpha01, + ) { + if (originalHeight !== height || originalWidth !== width) { + resizeRgbaImage( + comps, + dest, + originalWidth, + originalHeight, + width, + height, + alpha01, + ); + } else { + copyRgbaImage(comps, dest, alpha01); + } } } class DeviceCmykCS extends ColorSpace { constructor() { super("DeviceCMYK", 4); } - #t(e, t, i, a, s) { - const r = e[t] * i, - n = e[t + 1] * i, - g = e[t + 2] * i, - o = e[t + 3] * i; - a[s] = + #toRgb(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 + - r * - (-4.387332384609988 * r + - 54.48615194189176 * n + - 18.82290502165302 * g + - 212.25662451639585 * o - - 285.2331026137004) + - n * - (1.7149763477362134 * n - - 5.6096736904047315 * g + - -17.873870861415444 * o - + 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) + - g * - (-2.5217340131683033 * g - 21.248923337353073 * o + 17.5119270841813) + - o * (-21.86122147463605 * o - 189.48180835922747); - a[s + 1] = + y * + (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + + k * (-21.86122147463605 * k - 189.48180835922747); + dest[destOffset + 1] = 255 + - r * - (8.841041422036149 * r + - 60.118027045597366 * n + - 6.871425592049007 * g + - 31.159100130055922 * o - - 79.2970844816548) + - n * - (-15.310361306967817 * n + - 17.575251261109482 * g + - 131.35250912493976 * o - + 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) + - g * (4.444339102852739 * g + 9.8632861493405 * o - 24.86741582555878) + - o * (-20.737325471181034 * o - 187.80453709719578); - a[s + 2] = + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + + k * (-20.737325471181034 * k - 187.80453709719578); + dest[destOffset + 2] = 255 + - r * - (0.8842522430003296 * r + - 8.078677503112928 * n + - 30.89978309703729 * g - - 0.23883238689178934 * o - - 14.183576799673286) + - n * - (10.49593273432072 * n + - 63.02378494754052 * g + - 50.606957656360734 * o - + 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) + - g * - (0.03296041114873217 * g + - 115.60384449646641 * o - - 193.58209356861505) + - o * (-22.33816807309886 * o - 180.12613974708367); + y * + (0.03296041114873217 * y + + 115.60384449646641 * k + + -193.58209356861505) + + k * (-22.33816807309886 * k - 180.12613974708367); } - getRgbItem(e, t, i, a) { - this.#t(e, t, 1, i, a); + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, 1, dest, destOffset); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = 1 / ((1 << r) - 1); - for (let r = 0; r < i; r++) { - this.#t(e, t, g, a, s); - t += 4; - s += 3 + n; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, scale, dest, destOffset); + srcOffset += 4; + destOffset += 3 + alpha01; } } - getOutputLength(e, t) { - return ((e / 4) * (3 + t)) | 0; + getOutputLength(inputLength, alpha01) { + return ((inputLength / 4) * (3 + alpha01)) | 0; } } class CalGrayCS extends ColorSpace { - constructor(e, t, i) { + constructor(whitePoint, blackPoint, gamma) { super("CalGray", 1); - if (!e) + if (!whitePoint) { throw new FormatError( "WhitePoint missing - required for color space CalGray", ); - [this.XW, this.YW, this.ZW] = e; - [this.XB, this.YB, this.ZB] = t || [0, 0, 0]; - this.G = i || 1; - if (this.XW < 0 || this.ZW < 0 || 1 !== this.YW) + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + this.G = gamma || 1; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { throw new FormatError( `Invalid WhitePoint components for ${this.name}, no fallback available`, ); + } if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { info(`Invalid BlackPoint for ${this.name}, falling back to default.`); this.XB = this.YB = this.ZB = 0; } - (0 === this.XB && 0 === this.YB && 0 === this.ZB) || + if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { warn( - `${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ZB: ${this.ZB}, only default values are supported.`, + `${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + + `ZB: ${this.ZB}, only default values are supported.`, ); + } if (this.G < 1) { info( `Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`, @@ -2282,55 +3056,57 @@ class CalGrayCS extends ColorSpace { this.G = 1; } } - #t(e, t, i, a, s) { - const r = (e[t] * s) ** this.G, - n = this.YW * r, - g = Math.max(295.8 * n ** 0.3333333333333333 - 40.8, 0); - i[a] = g; - i[a + 1] = g; - i[a + 2] = g; + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = src[srcOffset] * scale; + const AG = A ** this.G; + const L = this.YW * AG; + const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); + dest[destOffset] = val; + dest[destOffset + 1] = val; + dest[destOffset + 2] = val; } - getRgbItem(e, t, i, a) { - this.#t(e, t, i, a, 1); + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = 1 / ((1 << r) - 1); - for (let r = 0; r < i; ++r) { - this.#t(e, t, a, s, g); - t += 1; - s += 3 + n; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3 + alpha01; } } - getOutputLength(e, t) { - return e * (3 + t); + getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); } } class CalRGBCS extends ColorSpace { - static #i = new Float32Array([ + static #BRADFORD_SCALE_MATRIX = new Float32Array([ 0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296, ]); - static #a = new Float32Array([ + static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ 0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867, ]); - static #s = new Float32Array([ + static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ 3.2404542, -1.5371385, -0.4985314, -0.969266, 1.8760108, 0.041556, 0.0556434, -0.2040259, 1.0572252, ]); - static #r = new Float32Array([1, 1, 1]); - static #n = new Float32Array(3); - static #g = new Float32Array(3); - static #o = new Float32Array(3); - static #I = (24 / 116) ** 3 / 8; - constructor(e, t, i, a) { + static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); + static #tempNormalizeMatrix = new Float32Array(3); + static #tempConvertMatrix1 = new Float32Array(3); + static #tempConvertMatrix2 = new Float32Array(3); + static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; + constructor(whitePoint, blackPoint, gamma, matrix) { super("CalRGB", 3); - if (!e) + if (!whitePoint) { throw new FormatError( "WhitePoint missing - required for color space CalRGB", ); - const [s, r, n] = (this.whitePoint = e), - [g, o, c] = (this.blackPoint = t || new Float32Array(3)); - [this.GR, this.GG, this.GB] = i || new Float32Array([1, 1, 1]); + } + const [XW, YW, ZW] = (this.whitePoint = whitePoint); + const [XB, YB, ZB] = (this.blackPoint = blackPoint || new Float32Array(3)); + [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]); [ this.MXA, this.MYA, @@ -2341,149 +3117,185 @@ class CalRGBCS extends ColorSpace { this.MXC, this.MYC, this.MZC, - ] = a || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - if (s < 0 || n < 0 || 1 !== r) + ] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); + if (XW < 0 || ZW < 0 || YW !== 1) { throw new FormatError( `Invalid WhitePoint components for ${this.name}, no fallback available`, ); - if (g < 0 || o < 0 || c < 0) { + } + if (XB < 0 || YB < 0 || ZB < 0) { info( - `Invalid BlackPoint for ${this.name} [${g}, ${o}, ${c}], falling back to default.`, + `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) { info( - `Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ${this.name}, falling back to default.`, + `Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + + `${this.name}, falling back to default.`, ); this.GR = this.GG = this.GB = 1; } } - #c(e, t, i) { - i[0] = e[0] * t[0] + e[1] * t[1] + e[2] * t[2]; - i[1] = e[3] * t[0] + e[4] * t[1] + e[5] * t[2]; - i[2] = e[6] * t[0] + e[7] * t[1] + e[8] * t[2]; + #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]; } - #C(e, t, i) { - i[0] = (1 * t[0]) / e[0]; - i[1] = (1 * t[1]) / e[1]; - i[2] = (1 * t[2]) / e[2]; + #toFlat(sourceWhitePoint, LMS, result) { + result[0] = (LMS[0] * 1) / sourceWhitePoint[0]; + result[1] = (LMS[1] * 1) / sourceWhitePoint[1]; + result[2] = (LMS[2] * 1) / sourceWhitePoint[2]; } - #h(e, t, i) { - i[0] = (0.95047 * t[0]) / e[0]; - i[1] = (1 * t[1]) / e[1]; - i[2] = (1.08883 * t[2]) / e[2]; + #toD65(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]; } - #B(e) { - return e <= 0.0031308 - ? this.#l(0, 1, 12.92 * e) - : e >= 0.99554525 - ? 1 - : this.#l(0, 1, 1.055 * e ** (1 / 2.4) - 0.055); + #sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return this.#adjustToRange(0, 1, 12.92 * color); + } + if (color >= 0.99554525) { + return 1; + } + return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); } - #l(e, t, i) { - return Math.max(e, Math.min(t, i)); + #adjustToRange(min, max, value) { + return Math.max(min, Math.min(max, value)); } - #Q(e) { - return e < 0 - ? -this.#Q(-e) - : e > 8 - ? ((e + 16) / 116) ** 3 - : e * CalRGBCS.#I; + #decodeL(L) { + if (L < 0) { + return -this.#decodeL(-L); + } + if (L > 8.0) { + return ((L + 16) / 116) ** 3; + } + return L * CalRGBCS.#DECODE_L_CONSTANT; } - #E(e, t, i) { - if (0 === e[0] && 0 === e[1] && 0 === e[2]) { - i[0] = t[0]; - i[1] = t[1]; - i[2] = t[2]; + #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; } - const a = this.#Q(0), - s = (1 - a) / (1 - this.#Q(e[0])), - r = 1 - s, - n = (1 - a) / (1 - this.#Q(e[1])), - g = 1 - n, - o = (1 - a) / (1 - this.#Q(e[2])), - c = 1 - o; - i[0] = t[0] * s + r; - i[1] = t[1] * n + g; - i[2] = t[2] * o + c; + const zeroDecodeL = this.#decodeL(0); + const X_DST = zeroDecodeL; + const X_SRC = this.#decodeL(sourceBlackPoint[0]); + const Y_DST = zeroDecodeL; + const Y_SRC = this.#decodeL(sourceBlackPoint[1]); + const Z_DST = zeroDecodeL; + const Z_SRC = this.#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; } - #u(e, t, i) { - if (1 === e[0] && 1 === e[2]) { - i[0] = t[0]; - i[1] = t[1]; - i[2] = t[2]; + #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; } - const a = i; - this.#c(CalRGBCS.#i, t, a); - const s = CalRGBCS.#n; - this.#C(e, a, s); - this.#c(CalRGBCS.#a, s, i); + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_Flat = CalRGBCS.#tempNormalizeMatrix; + this.#toFlat(sourceWhitePoint, LMS, LMS_Flat); + this.#matrixProduct( + CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, + LMS_Flat, + result, + ); } - #d(e, t, i) { - const a = i; - this.#c(CalRGBCS.#i, t, a); - const s = CalRGBCS.#n; - this.#h(e, a, s); - this.#c(CalRGBCS.#a, s, i); + #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { + const LMS = result; + this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + const LMS_D65 = CalRGBCS.#tempNormalizeMatrix; + this.#toD65(sourceWhitePoint, LMS, LMS_D65); + this.#matrixProduct( + CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, + LMS_D65, + result, + ); } - #t(e, t, i, a, s) { - const r = this.#l(0, 1, e[t] * s), - n = this.#l(0, 1, e[t + 1] * s), - g = this.#l(0, 1, e[t + 2] * s), - o = 1 === r ? 1 : r ** this.GR, - c = 1 === n ? 1 : n ** this.GG, - C = 1 === g ? 1 : g ** this.GB, - h = this.MXA * o + this.MXB * c + this.MXC * C, - l = this.MYA * o + this.MYB * c + this.MYC * C, - Q = this.MZA * o + this.MZB * c + this.MZC * C, - E = CalRGBCS.#g; - E[0] = h; - E[1] = l; - E[2] = Q; - const u = CalRGBCS.#o; - this.#u(this.whitePoint, E, u); - const d = CalRGBCS.#g; - this.#E(this.blackPoint, u, d); - const f = CalRGBCS.#o; - this.#d(CalRGBCS.#r, d, f); - const p = CalRGBCS.#g; - this.#c(CalRGBCS.#s, f, p); - i[a] = 255 * this.#B(p[0]); - i[a + 1] = 255 * this.#B(p[1]); - i[a + 2] = 255 * this.#B(p[2]); + #toRgb(src, srcOffset, dest, destOffset, scale) { + const A = this.#adjustToRange(0, 1, src[srcOffset] * scale); + const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale); + const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale); + const AGR = A === 1 ? 1 : A ** this.GR; + const BGG = B === 1 ? 1 : B ** this.GG; + const CGB = C === 1 ? 1 : C ** this.GB; + const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB; + const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB; + const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB; + const XYZ = CalRGBCS.#tempConvertMatrix1; + XYZ[0] = X; + XYZ[1] = Y; + XYZ[2] = Z; + const XYZ_Flat = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat); + const XYZ_Black = CalRGBCS.#tempConvertMatrix1; + this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black); + const XYZ_D65 = CalRGBCS.#tempConvertMatrix2; + this.#normalizeWhitePointToD65( + CalRGBCS.#FLAT_WHITEPOINT_MATRIX, + XYZ_Black, + XYZ_D65, + ); + const SRGB = CalRGBCS.#tempConvertMatrix1; + this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); + dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255; + dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255; + dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255; } - getRgbItem(e, t, i, a) { - this.#t(e, t, i, a, 1); + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, dest, destOffset, 1); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = 1 / ((1 << r) - 1); - for (let r = 0; r < i; ++r) { - this.#t(e, t, a, s, g); - t += 3; - s += 3 + n; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const scale = 1 / ((1 << bits) - 1); + for (let i = 0; i < count; ++i) { + this.#toRgb(src, srcOffset, dest, destOffset, scale); + srcOffset += 3; + destOffset += 3 + alpha01; } } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; + getOutputLength(inputLength, alpha01) { + return ((inputLength * (3 + alpha01)) / 3) | 0; } } class LabCS extends ColorSpace { - constructor(e, t, i) { + constructor(whitePoint, blackPoint, range) { super("Lab", 3); - if (!e) + if (!whitePoint) { throw new FormatError( "WhitePoint missing - required for color space Lab", ); - [this.XW, this.YW, this.ZW] = e; - [this.amin, this.amax, this.bmin, this.bmax] = i || [-100, 100, -100, 100]; - [this.XB, this.YB, this.ZB] = t || [0, 0, 0]; - if (this.XW < 0 || this.ZW < 0 || 1 !== this.YW) + } + [this.XW, this.YW, this.ZW] = whitePoint; + [this.amin, this.amax, this.bmin, this.bmax] = range || [ + -100, 100, -100, 100, + ]; + [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { throw new FormatError( "Invalid WhitePoint components, no fallback available", ); + } if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { info("Invalid BlackPoint, falling back to default"); this.XB = this.YB = this.ZB = 0; @@ -2496,1578 +3308,1707 @@ class LabCS extends ColorSpace { this.bmax = 100; } } - #f(e) { - return e >= 6 / 29 ? e ** 3 : (108 / 841) * (e - 4 / 29); + #fn_g(x) { + return x >= 6 / 29 ? x ** 3 : (108 / 841) * (x - 4 / 29); } - #p(e, t, i, a) { - return i + (e * (a - i)) / t; + #decode(value, high1, low2, high2) { + return low2 + (value * (high2 - low2)) / high1; } - #t(e, t, i, a, s) { - let r = e[t], - n = e[t + 1], - g = e[t + 2]; - if (!1 !== i) { - r = this.#p(r, i, 0, 100); - n = this.#p(n, i, this.amin, this.amax); - g = this.#p(g, i, this.bmin, this.bmax); + #toRgb(src, srcOffset, maxVal, dest, destOffset) { + let Ls = src[srcOffset]; + let as = src[srcOffset + 1]; + let bs = src[srcOffset + 2]; + if (maxVal !== false) { + Ls = this.#decode(Ls, maxVal, 0, 100); + as = this.#decode(as, maxVal, this.amin, this.amax); + bs = this.#decode(bs, maxVal, this.bmin, this.bmax); } - n > this.amax ? (n = this.amax) : n < this.amin && (n = this.amin); - g > this.bmax ? (g = this.bmax) : g < this.bmin && (g = this.bmin); - const o = (r + 16) / 116, - c = o + n / 500, - C = o - g / 200, - h = this.XW * this.#f(c), - l = this.YW * this.#f(o), - Q = this.ZW * this.#f(C); - let E, u, d; + if (as > this.amax) { + as = this.amax; + } else if (as < this.amin) { + as = this.amin; + } + if (bs > this.bmax) { + bs = this.bmax; + } else if (bs < this.bmin) { + bs = this.bmin; + } + const M = (Ls + 16) / 116; + const L = M + as / 500; + const N = M - bs / 200; + const X = this.XW * this.#fn_g(L); + const Y = this.YW * this.#fn_g(M); + const Z = this.ZW * this.#fn_g(N); + let r, g, b; if (this.ZW < 1) { - E = 3.1339 * h + -1.617 * l + -0.4906 * Q; - u = -0.9785 * h + 1.916 * l + 0.0333 * Q; - d = 0.072 * h + -0.229 * l + 1.4057 * Q; + 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 { - E = 3.2406 * h + -1.5372 * l + -0.4986 * Q; - u = -0.9689 * h + 1.8758 * l + 0.0415 * Q; - d = 0.0557 * h + -0.204 * l + 1.057 * Q; + 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; } - a[s] = 255 * Math.sqrt(E); - a[s + 1] = 255 * Math.sqrt(u); - a[s + 2] = 255 * Math.sqrt(d); + dest[destOffset] = Math.sqrt(r) * 255; + dest[destOffset + 1] = Math.sqrt(g) * 255; + dest[destOffset + 2] = Math.sqrt(b) * 255; } - getRgbItem(e, t, i, a) { - this.#t(e, t, !1, i, a); + getRgbItem(src, srcOffset, dest, destOffset) { + this.#toRgb(src, srcOffset, false, dest, destOffset); } - getRgbBuffer(e, t, i, a, s, r, n) { - const g = (1 << r) - 1; - for (let r = 0; r < i; r++) { - this.#t(e, t, g, a, s); - t += 3; - s += 3 + n; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + const maxVal = (1 << bits) - 1; + for (let i = 0; i < count; i++) { + this.#toRgb(src, srcOffset, maxVal, dest, destOffset); + srcOffset += 3; + destOffset += 3 + alpha01; } } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; + getOutputLength(inputLength, alpha01) { + return ((inputLength * (3 + alpha01)) / 3) | 0; } - isDefaultDecode(e, t) { - return !0; + isDefaultDecode(decodeMap, bpc) { + return true; } get usesZeroToOneRange() { - return shadow(this, "usesZeroToOneRange", !1); + return shadow(this, "usesZeroToOneRange", false); + } +} // ./src/core/binary_cmap.js + +function hexToInt(a, size) { + let n = 0; + for (let i = 0; i <= size; i++) { + n = (n << 8) | a[i]; + } + return n >>> 0; +} +function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode(...a.subarray(0, size + 1)); +} +function addHex(a, b, size) { + let c = 0; + for (let i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; } } -function hexToInt(e, t) { - let i = 0; - for (let a = 0; a <= t; a++) i = (i << 8) | e[a]; - return i >>> 0; -} -function hexToStr(e, t) { - return 1 === t - ? String.fromCharCode(e[0], e[1]) - : 3 === t - ? String.fromCharCode(e[0], e[1], e[2], e[3]) - : String.fromCharCode(...e.subarray(0, t + 1)); -} -function addHex(e, t, i) { - let a = 0; - for (let s = i; s >= 0; s--) { - a += e[s] + t[s]; - e[s] = 255 & a; - a >>= 8; +function incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; } } -function incHex(e, t) { - let i = 1; - for (let a = t; a >= 0 && i > 0; a--) { - i += e[a]; - e[a] = 255 & i; - i >>= 8; - } -} -const kt = 16; +const MAX_NUM_SIZE = 16; +const MAX_ENCODED_NUM_SIZE = 19; class BinaryCMapStream { - constructor(e) { - this.buffer = e; + constructor(data) { + this.buffer = data; this.pos = 0; - this.end = e.length; - this.tmpBuf = new Uint8Array(19); + this.end = data.length; + this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); } readByte() { - return this.pos >= this.end ? -1 : this.buffer[this.pos++]; + if (this.pos >= this.end) { + return -1; + } + return this.buffer[this.pos++]; } readNumber() { - let e, - t = 0; + let n = 0; + let last; do { - const i = this.readByte(); - if (i < 0) throw new FormatError("unexpected EOF in bcmap"); - e = !(128 & i); - t = (t << 7) | (127 & i); - } while (!e); - return t; + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = (n << 7) | (b & 0x7f); + } while (!last); + return n; } readSigned() { - const e = this.readNumber(); - return 1 & e ? ~(e >>> 1) : e >>> 1; + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; } - readHex(e, t) { - e.set(this.buffer.subarray(this.pos, this.pos + t + 1)); - this.pos += t + 1; + readHex(num, size) { + num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); + this.pos += size + 1; } - readHexNumber(e, t) { - let i; - const a = this.tmpBuf; - let s = 0; + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; do { - const e = this.readByte(); - if (e < 0) throw new FormatError("unexpected EOF in bcmap"); - i = !(128 & e); - a[s++] = 127 & e; - } while (!i); - let r = t, - n = 0, - g = 0; - for (; r >= 0; ) { - for (; g < 8 && a.length > 0; ) { - n |= a[--s] << g; - g += 7; + const b = this.readByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); } - e[r] = 255 & n; - r--; - n >>= 8; - g -= 8; + 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(e, t) { - this.readHexNumber(e, t); - const i = 1 & e[t] ? 255 : 0; - let a = 0; - for (let s = 0; s <= t; s++) { - a = ((1 & a) << 8) | e[s]; - e[s] = (a >> 1) ^ i; + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = ((c & 1) << 8) | num[i]; + num[i] = (c >> 1) ^ sign; } } readString() { - const e = this.readNumber(), - t = new Array(e); - for (let i = 0; i < e; i++) t[i] = this.readNumber(); - return String.fromCharCode(...t); + const len = this.readNumber(), + buf = new Array(len); + for (let i = 0; i < len; i++) { + buf[i] = this.readNumber(); + } + return String.fromCharCode(...buf); } } class BinaryCMapReader { - async process(e, t, i) { - const a = new BinaryCMapStream(e), - s = a.readByte(); - t.vertical = !!(1 & s); - let r = null; - const n = new Uint8Array(kt), - g = new Uint8Array(kt), - o = new Uint8Array(kt), - c = new Uint8Array(kt), - C = new Uint8Array(kt); - let h, l; - for (; (l = a.readByte()) >= 0; ) { - const e = l >> 5; - if (7 === e) { - switch (31 & l) { + 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; + while ((b = stream.readByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { case 0: - a.readString(); + stream.readString(); break; case 1: - r = a.readString(); + useCMap = stream.readString(); + break; } continue; } - const i = !!(16 & l), - s = 15 & l; - if (s + 1 > kt) + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { throw new Error("BinaryCMapReader.process: Invalid dataSize."); - const Q = 1, - E = a.readNumber(); - switch (e) { + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { case 0: - a.readHex(n, s); - a.readHexNumber(g, s); - addHex(g, n, s); - t.addCodespaceRange(s + 1, hexToInt(n, s), hexToInt(g, s)); - for (let e = 1; e < E; e++) { - incHex(g, s); - a.readHexNumber(n, s); - addHex(n, g, s); - a.readHexNumber(g, s); - addHex(g, n, s); - t.addCodespaceRange(s + 1, hexToInt(n, s), hexToInt(g, s)); + 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 = 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: - a.readHex(n, s); - a.readHexNumber(g, s); - addHex(g, n, s); - a.readNumber(); - for (let e = 1; e < E; e++) { - incHex(g, s); - a.readHexNumber(n, s); - addHex(n, g, s); - a.readHexNumber(g, s); - addHex(g, n, s); - a.readNumber(); + 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: - a.readHex(o, s); - h = a.readNumber(); - t.mapOne(hexToInt(o, s), h); - for (let e = 1; e < E; e++) { - incHex(o, s); - if (!i) { - a.readHexNumber(C, s); - addHex(o, C, s); + 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); } - h = a.readSigned() + (h + 1); - t.mapOne(hexToInt(o, s), h); + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); } break; case 3: - a.readHex(n, s); - a.readHexNumber(g, s); - addHex(g, n, s); - h = a.readNumber(); - t.mapCidRange(hexToInt(n, s), hexToInt(g, s), h); - for (let e = 1; e < E; e++) { - incHex(g, s); - if (i) n.set(g); - else { - a.readHexNumber(n, s); - addHex(n, g, s); + 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); } - a.readHexNumber(g, s); - addHex(g, n, s); - h = a.readNumber(); - t.mapCidRange(hexToInt(n, s), hexToInt(g, s), h); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange( + hexToInt(start, dataSize), + hexToInt(end, dataSize), + code, + ); } break; case 4: - a.readHex(o, Q); - a.readHex(c, s); - t.mapOne(hexToInt(o, Q), hexToStr(c, s)); - for (let e = 1; e < E; e++) { - incHex(o, Q); - if (!i) { - a.readHexNumber(C, Q); - addHex(o, C, Q); + 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(c, s); - a.readHexSigned(C, s); - addHex(c, C, s); - t.mapOne(hexToInt(o, Q), hexToStr(c, s)); + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne( + hexToInt(char, ucs2DataSize), + hexToStr(charCode, dataSize), + ); } break; case 5: - a.readHex(n, Q); - a.readHexNumber(g, Q); - addHex(g, n, Q); - a.readHex(c, s); - t.mapBfRange(hexToInt(n, Q), hexToInt(g, Q), hexToStr(c, s)); - for (let e = 1; e < E; e++) { - incHex(g, Q); - if (i) n.set(g); - else { - a.readHexNumber(n, Q); - addHex(n, g, Q); + 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); } - a.readHexNumber(g, Q); - addHex(g, n, Q); - a.readHex(c, s); - t.mapBfRange(hexToInt(n, Q), hexToInt(g, Q), hexToStr(c, s)); + 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: ${e}`); + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); } } - return r ? i(r) : t; + if (useCMap) { + return extend(useCMap); + } + return cMap; } -} -const Rt = new Uint8Array(0); +} // ./src/core/decode_stream.js + +const emptyBuffer = new Uint8Array(0); class DecodeStream extends BaseStream { - constructor(e) { + constructor(maybeMinBufferLength) { super(); - this._rawMinBufferLength = e || 0; + this._rawMinBufferLength = maybeMinBufferLength || 0; this.pos = 0; this.bufferLength = 0; - this.eof = !1; - this.buffer = Rt; + this.eof = false; + this.buffer = emptyBuffer; this.minBufferLength = 512; - if (e) for (; this.minBufferLength < e; ) this.minBufferLength *= 2; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } } get isEmpty() { - for (; !this.eof && 0 === this.bufferLength; ) this.readBlock(); - return 0 === this.bufferLength; + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; } - ensureBuffer(e) { - const t = this.buffer; - if (e <= t.byteLength) return t; - let i = this.minBufferLength; - for (; i < e; ) i *= 2; - const a = new Uint8Array(i); - a.set(t); - return (this.buffer = a); + ensureBuffer(requested) { + const buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + let size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + const buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return (this.buffer = buffer2); } getByte() { - const e = this.pos; - for (; this.bufferLength <= e; ) { - if (this.eof) return -1; + const pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } this.readBlock(); } return this.buffer[this.pos++]; } - getBytes(e, t = null) { - const i = this.pos; - let a; - if (e) { - this.ensureBuffer(i + e); - a = i + e; - for (; !this.eof && this.bufferLength < a; ) this.readBlock(t); - const s = this.bufferLength; - a > s && (a = s); + getBytes(length, decoderOptions = null) { + const pos = this.pos; + let end; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(decoderOptions); + } + const bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } } else { - for (; !this.eof; ) this.readBlock(t); - a = this.bufferLength; + while (!this.eof) { + this.readBlock(decoderOptions); + } + end = this.bufferLength; } - this.pos = a; - return this.buffer.subarray(i, a); + this.pos = end; + return this.buffer.subarray(pos, end); } - async getImageData(e, t = null) { - if (!this.canAsyncDecodeImageFromBuffer) return this.getBytes(e, t); - const i = await this.stream.asyncGetBytes(); - return this.decodeImage(i, t); + async getImageData(length, decoderOptions = null) { + if (!this.canAsyncDecodeImageFromBuffer) { + return this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, decoderOptions); } reset() { this.pos = 0; } - makeSubStream(e, t, i = null) { - if (void 0 === t) for (; !this.eof; ) this.readBlock(); - else { - const i = e + t; - for (; this.bufferLength <= i && !this.eof; ) this.readBlock(); + makeSubStream(start, length, dict = null) { + if (length === undefined) { + while (!this.eof) { + this.readBlock(); + } + } else { + const end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } } - return new Stream(this.buffer, e, t, i); + return new Stream(this.buffer, start, length, dict); } getBaseStreams() { return this.str ? this.str.getBaseStreams() : null; } } class StreamsSequenceStream extends DecodeStream { - constructor(e, t = null) { - let i = 0; - for (const t of e) - i += t instanceof DecodeStream ? t._rawMinBufferLength : t.length; - super(i); - this.streams = e; - this._onError = t; + constructor(streams, onError = null) { + streams = streams.filter((s) => s instanceof BaseStream); + let maybeLength = 0; + for (const stream of streams) { + maybeLength += + stream instanceof DecodeStream + ? stream._rawMinBufferLength + : stream.length; + } + super(maybeLength); + this.streams = streams; + this._onError = onError; } readBlock() { - const e = this.streams; - if (0 === e.length) { - this.eof = !0; + const streams = this.streams; + if (streams.length === 0) { + this.eof = true; return; } - const t = e.shift(); - let i; + const stream = streams.shift(); + let chunk; try { - i = t.getBytes(); - } catch (e) { + chunk = stream.getBytes(); + } catch (reason) { if (this._onError) { - this._onError(e, t.dict?.objId); + this._onError(reason, stream.dict?.objId); return; } - throw e; + throw reason; } - const a = this.bufferLength, - s = a + i.length; - this.ensureBuffer(s).set(i, a); - this.bufferLength = s; + const bufferLength = this.bufferLength; + const newLength = bufferLength + chunk.length; + const buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; } getBaseStreams() { - const e = []; - for (const t of this.streams) { - const i = t.getBaseStreams(); - i && e.push(...i); + const baseStreamsBuf = []; + for (const stream of this.streams) { + const baseStreams = stream.getBaseStreams(); + if (baseStreams) { + baseStreamsBuf.push(...baseStreams); + } } - return e.length > 0 ? e : null; + return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; } -} +} // ./src/core/ascii_85_stream.js + class Ascii85Stream extends DecodeStream { - constructor(e, t) { - t && (t *= 0.8); - super(t); - this.str = e; - this.dict = e.dict; + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; this.input = new Uint8Array(5); } readBlock() { - const e = this.str; - let t = e.getByte(); - for (; isWhiteSpace(t); ) t = e.getByte(); - if (-1 === t || 126 === t) { - this.eof = !0; + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.str; + let c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; return; } - const i = this.bufferLength; - let a, s; - if (122 === t) { - a = this.ensureBuffer(i + 4); - for (s = 0; s < 4; ++s) a[i + s] = 0; + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } this.bufferLength += 4; } else { - const r = this.input; - r[0] = t; - for (s = 1; s < 5; ++s) { - t = e.getByte(); - for (; isWhiteSpace(t); ) t = e.getByte(); - r[s] = t; - if (-1 === t || 126 === t) break; + const input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } } - a = this.ensureBuffer(i + s - 1); - this.bufferLength += s - 1; - if (s < 5) { - for (; s < 5; ++s) r[s] = 117; - this.eof = !0; + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; } - let n = 0; - for (s = 0; s < 5; ++s) n = 85 * n + (r[s] - 33); - for (s = 3; s >= 0; --s) { - a[i + s] = 255 & n; - n >>= 8; + let t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; } } } -} +} // ./src/core/ascii_hex_stream.js + class AsciiHexStream extends DecodeStream { - constructor(e, t) { - t && (t *= 0.5); - super(t); - this.str = e; - this.dict = e.dict; + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.str = str; + this.dict = str.dict; this.firstDigit = -1; } readBlock() { - const e = this.str.getBytes(8e3); - if (!e.length) { - this.eof = !0; + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; return; } - const t = (e.length + 1) >> 1, - i = this.ensureBuffer(this.bufferLength + t); - let a = this.bufferLength, - s = this.firstDigit; - for (const t of e) { - let e; - if (t >= 48 && t <= 57) e = 15 & t; - else { - if (!((t >= 65 && t <= 70) || (t >= 97 && t <= 102))) { - if (62 === t) { - this.eof = !0; - break; - } - continue; - } - e = 9 + (15 & t); + const maxDecodeLength = (bytes.length + 1) >> 1; + const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + let bufferLength = this.bufferLength; + let firstDigit = this.firstDigit; + 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; } - if (s < 0) s = e; - else { - i[a++] = (s << 4) | e; - s = -1; + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = (firstDigit << 4) | digit; + firstDigit = -1; } } - if (s >= 0 && this.eof) { - i[a++] = s << 4; - s = -1; + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; } - this.firstDigit = s; - this.bufferLength = a; + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; } -} -const Nt = -1, - Gt = [ - [-1, -1], - [-1, -1], - [7, 8], - [7, 7], - [6, 6], - [6, 6], - [6, 5], - [6, 5], - [4, 0], - [4, 0], - [4, 0], - [4, 0], - [4, 0], - [4, 0], - [4, 0], - [4, 0], - [3, 1], - [3, 1], - [3, 1], - [3, 1], - [3, 1], - [3, 1], - [3, 1], - [3, 1], - [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], - [3, 4], - [3, 4], - [3, 4], - [3, 4], - [3, 4], - [3, 4], - [3, 4], - [3, 4], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [3, 3], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - [1, 2], - ], - xt = [ - [-1, -1], - [12, -2], - [-1, -1], - [-1, -1], - [-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], - ], - Ut = [ - [-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], - ], - Mt = [ - [-1, -1], - [-1, -1], - [12, -2], - [12, -2], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-1, -1], - [-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], - ], - Lt = [ - [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], - ], - Ht = [ - [-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], - ]; +} // ./src/core/ccitt.js + +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(e, t = {}) { - if (!e || "function" != typeof e.next) + constructor(source, options = {}) { + if (!source || typeof source.next !== "function") { throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); - this.source = e; - this.eof = !1; - this.encoding = t.K || 0; - this.eoline = t.EndOfLine || !1; - this.byteAlign = t.EncodedByteAlign || !1; - this.columns = t.Columns || 1728; - this.rows = t.Rows || 0; - this.eoblock = t.EndOfBlock ?? !0; - this.black = t.BlackIs1 || !1; + } + 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; + this.eoblock = options.EndOfBlock ?? true; + this.black = options.BlackIs1 || false; this.codingLine = new Uint32Array(this.columns + 1); this.refLine = new Uint32Array(this.columns + 2); this.codingLine[0] = this.columns; @@ -4077,4838 +5018,6509 @@ class CCITTFaxDecoder { this.inputBits = 0; this.inputBuf = 0; this.outputBits = 0; - this.rowsDone = !1; - let i; - for (; 0 === (i = this._lookBits(12)); ) this._eatBits(1); - 1 === i && this._eatBits(12); + this.rowsDone = false; + let code1; + while ((code1 = this._lookBits(12)) === 0) { + this._eatBits(1); + } + if (code1 === 1) { + this._eatBits(12); + } if (this.encoding > 0) { this.nextLine2D = !this._lookBits(1); this._eatBits(1); } } readNextChar() { - if (this.eof) return -1; - const e = this.refLine, - t = this.codingLine, - i = this.columns; - let a, s, r, n, g; - if (0 === this.outputBits) { - this.rowsDone && (this.eof = !0); - if (this.eof) return -1; - this.err = !1; - let r, g, o; + if (this.eof) { + return -1; + } + const refLine = this.refLine; + const codingLine = this.codingLine; + const columns = this.columns; + let refPos, blackPixels, bits, i; + if (this.outputBits === 0) { + if (this.rowsDone) { + this.eof = true; + } + if (this.eof) { + return -1; + } + this.err = false; + let code1, code2, code3; if (this.nextLine2D) { - for (n = 0; t[n] < i; ++n) e[n] = t[n]; - e[n++] = i; - e[n] = i; - t[0] = 0; + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; this.codingPos = 0; - a = 0; - s = 0; - for (; t[this.codingPos] < i; ) { - r = this._getTwoDimCode(); - switch (r) { - case 0: - this._addPixels(e[a + 1], s); - e[a + 1] < i && (a += 2); + refPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = this._getTwoDimCode(); + switch (code1) { + case twoDimPass: + this._addPixels(refLine[refPos + 1], blackPixels); + if (refLine[refPos + 1] < columns) { + refPos += 2; + } break; - case 1: - r = g = 0; - if (s) { + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { do { - r += o = this._getBlackCode(); - } while (o >= 64); + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); do { - g += o = this._getWhiteCode(); - } while (o >= 64); + code2 += code3 = this._getWhiteCode(); + } while (code3 >= 64); } else { do { - r += o = this._getWhiteCode(); - } while (o >= 64); + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); do { - g += o = this._getBlackCode(); - } while (o >= 64); + code2 += code3 = this._getBlackCode(); + } while (code3 >= 64); } - this._addPixels(t[this.codingPos] + r, s); - t[this.codingPos] < i && - this._addPixels(t[this.codingPos] + g, 1 ^ s); - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; - break; - case 7: - this._addPixels(e[a] + 3, s); - s ^= 1; - if (t[this.codingPos] < i) { - ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + if (codingLine[this.codingPos] < columns) { + this._addPixels( + codingLine[this.codingPos] + code2, + blackPixels ^ 1, + ); + } + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; } break; - case 5: - this._addPixels(e[a] + 2, s); - s ^= 1; - if (t[this.codingPos] < i) { - ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVertR3: + this._addPixels(refLine[refPos] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case 3: - this._addPixels(e[a] + 1, s); - s ^= 1; - if (t[this.codingPos] < i) { - ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVertR2: + this._addPixels(refLine[refPos] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case 2: - this._addPixels(e[a], s); - s ^= 1; - if (t[this.codingPos] < i) { - ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVertR1: + this._addPixels(refLine[refPos] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case 8: - this._addPixelsNeg(e[a] - 3, s); - s ^= 1; - if (t[this.codingPos] < i) { - a > 0 ? --a : ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVert0: + this._addPixels(refLine[refPos], blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case 6: - this._addPixelsNeg(e[a] - 2, s); - s ^= 1; - if (t[this.codingPos] < i) { - a > 0 ? --a : ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVertL3: + this._addPixelsNeg(refLine[refPos] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case 4: - this._addPixelsNeg(e[a] - 1, s); - s ^= 1; - if (t[this.codingPos] < i) { - a > 0 ? --a : ++a; - for (; e[a] <= t[this.codingPos] && e[a] < i; ) a += 2; + case twoDimVertL2: + this._addPixelsNeg(refLine[refPos] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } } break; - case Nt: - this._addPixels(i, 0); - this.eof = !0; + case twoDimVertL1: + this._addPixelsNeg(refLine[refPos] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while ( + refLine[refPos] <= codingLine[this.codingPos] && + refLine[refPos] < columns + ) { + refPos += 2; + } + } + break; + case ccittEOF: + this._addPixels(columns, 0); + this.eof = true; break; default: info("bad 2d code"); - this._addPixels(i, 0); - this.err = !0; + this._addPixels(columns, 0); + this.err = true; } } } else { - t[0] = 0; + codingLine[0] = 0; this.codingPos = 0; - s = 0; - for (; t[this.codingPos] < i; ) { - r = 0; - if (s) + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = 0; + if (blackPixels) { do { - r += o = this._getBlackCode(); - } while (o >= 64); - else + code1 += code3 = this._getBlackCode(); + } while (code3 >= 64); + } else { do { - r += o = this._getWhiteCode(); - } while (o >= 64); - this._addPixels(t[this.codingPos] + r, s); - s ^= 1; + code1 += code3 = this._getWhiteCode(); + } while (code3 >= 64); + } + this._addPixels(codingLine[this.codingPos] + code1, blackPixels); + blackPixels ^= 1; } } - let c = !1; - this.byteAlign && (this.inputBits &= -8); - if (this.eoblock || this.row !== this.rows - 1) { - r = this._lookBits(12); - if (this.eoline) - for (; r !== Nt && 1 !== r; ) { + let gotEOL = false; + if (this.byteAlign) { + this.inputBits &= ~7; + } + if (!this.eoblock && this.row === this.rows - 1) { + this.rowsDone = true; + } else { + code1 = this._lookBits(12); + if (this.eoline) { + while (code1 !== ccittEOF && code1 !== 1) { this._eatBits(1); - r = this._lookBits(12); + code1 = this._lookBits(12); } - else - for (; 0 === r; ) { + } else { + while (code1 === 0) { this._eatBits(1); - r = this._lookBits(12); + code1 = this._lookBits(12); } - if (1 === r) { + } + if (code1 === 1) { this._eatBits(12); - c = !0; - } else r === Nt && (this.eof = !0); - } else this.rowsDone = !0; + gotEOL = true; + } else if (code1 === ccittEOF) { + this.eof = true; + } + } if (!this.eof && this.encoding > 0 && !this.rowsDone) { this.nextLine2D = !this._lookBits(1); this._eatBits(1); } - if (this.eoblock && c && this.byteAlign) { - r = this._lookBits(12); - if (1 === r) { + if (this.eoblock && gotEOL && this.byteAlign) { + code1 = this._lookBits(12); + if (code1 === 1) { this._eatBits(12); if (this.encoding > 0) { this._lookBits(1); this._eatBits(1); } - if (this.encoding >= 0) - for (n = 0; n < 4; ++n) { - r = this._lookBits(12); - 1 !== r && info("bad rtc code: " + r); + if (this.encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = this._lookBits(12); + if (code1 !== 1) { + info("bad rtc code: " + code1); + } this._eatBits(12); if (this.encoding > 0) { this._lookBits(1); this._eatBits(1); } } - this.eof = !0; + } + this.eof = true; } } else if (this.err && this.eoline) { - for (;;) { - r = this._lookBits(13); - if (r === Nt) { - this.eof = !0; + while (true) { + code1 = this._lookBits(13); + if (code1 === ccittEOF) { + this.eof = true; return -1; } - if (r >> 1 == 1) break; + if (code1 >> 1 === 1) { + break; + } this._eatBits(1); } this._eatBits(12); if (this.encoding > 0) { this._eatBits(1); - this.nextLine2D = !(1 & r); + this.nextLine2D = !(code1 & 1); } } this.outputBits = - t[0] > 0 ? t[(this.codingPos = 0)] : t[(this.codingPos = 1)]; + codingLine[0] > 0 + ? codingLine[(this.codingPos = 0)] + : codingLine[(this.codingPos = 1)]; this.row++; } + let c; if (this.outputBits >= 8) { - g = 1 & this.codingPos ? 0 : 255; + c = this.codingPos & 1 ? 0 : 0xff; this.outputBits -= 8; - if (0 === this.outputBits && t[this.codingPos] < i) { + if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { this.codingPos++; - this.outputBits = t[this.codingPos] - t[this.codingPos - 1]; + this.outputBits = + codingLine[this.codingPos] - codingLine[this.codingPos - 1]; } } else { - r = 8; - g = 0; + bits = 8; + c = 0; do { - if ("number" != typeof this.outputBits) + if (typeof this.outputBits !== "number") { throw new FormatError( 'Invalid /CCITTFaxDecode data, "outputBits" must be a number.', ); - if (this.outputBits > r) { - g <<= r; - 1 & this.codingPos || (g |= 255 >> (8 - r)); - this.outputBits -= r; - r = 0; + } + if (this.outputBits > bits) { + c <<= bits; + if (!(this.codingPos & 1)) { + c |= 0xff >> (8 - bits); + } + this.outputBits -= bits; + bits = 0; } else { - g <<= this.outputBits; - 1 & this.codingPos || (g |= 255 >> (8 - this.outputBits)); - r -= this.outputBits; + c <<= this.outputBits; + if (!(this.codingPos & 1)) { + c |= 0xff >> (8 - this.outputBits); + } + bits -= this.outputBits; this.outputBits = 0; - if (t[this.codingPos] < i) { + if (codingLine[this.codingPos] < columns) { this.codingPos++; - this.outputBits = t[this.codingPos] - t[this.codingPos - 1]; - } else if (r > 0) { - g <<= r; - r = 0; + this.outputBits = + codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } else if (bits > 0) { + c <<= bits; + bits = 0; } } - } while (r); + } while (bits); } - this.black && (g ^= 255); - return g; - } - _addPixels(e, t) { - const i = this.codingLine; - let a = this.codingPos; - if (e > i[a]) { - if (e > this.columns) { - info("row is wrong length"); - this.err = !0; - e = this.columns; - } - (1 & a) ^ t && ++a; - i[a] = e; + if (this.black) { + c ^= 0xff; } - this.codingPos = a; + return c; } - _addPixelsNeg(e, t) { - const i = this.codingLine; - let a = this.codingPos; - if (e > i[a]) { - if (e > this.columns) { + _addPixels(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { info("row is wrong length"); - this.err = !0; - e = this.columns; + this.err = true; + a1 = this.columns; } - (1 & a) ^ t && ++a; - i[a] = e; - } else if (e < i[a]) { - if (e < 0) { + if ((codingPos & 1) ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + } + _addPixelsNeg(a1, blackPixels) { + const codingLine = this.codingLine; + let codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info("row is wrong length"); + this.err = true; + a1 = this.columns; + } + if ((codingPos & 1) ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } else if (a1 < codingLine[codingPos]) { + if (a1 < 0) { info("invalid code"); - this.err = !0; - e = 0; + this.err = true; + a1 = 0; } - for (; a > 0 && e < i[a - 1]; ) --a; - i[a] = e; + while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { + --codingPos; + } + codingLine[codingPos] = a1; } - this.codingPos = a; + this.codingPos = codingPos; } - _findTableCode(e, t, i, a) { - const s = a || 0; - for (let a = e; a <= t; ++a) { - let e = this._lookBits(a); - if (e === Nt) return [!0, 1, !1]; - a < t && (e <<= t - a); - if (!s || e >= s) { - const t = i[e - s]; - if (t[0] === a) { - this._eatBits(a); - return [!0, t[1], !0]; + _findTableCode(start, end, table, limit) { + const limitValue = limit || 0; + for (let i = start; i <= end; ++i) { + let code = this._lookBits(i); + if (code === ccittEOF) { + return [true, 1, false]; + } + if (i < end) { + code <<= end - i; + } + if (!limitValue || code >= limitValue) { + const p = table[code - limitValue]; + if (p[0] === i) { + this._eatBits(i); + return [true, p[1], true]; } } } - return [!1, 0, !1]; + return [false, 0, false]; } _getTwoDimCode() { - let e, - t = 0; + let code = 0; + let p; if (this.eoblock) { - t = this._lookBits(7); - e = Gt[t]; - if (e?.[0] > 0) { - this._eatBits(e[0]); - return e[1]; + code = this._lookBits(7); + p = twoDimTable[code]; + if (p?.[0] > 0) { + this._eatBits(p[0]); + return p[1]; } } else { - const e = this._findTableCode(1, 7, Gt); - if (e[0] && e[2]) return e[1]; + const result = this._findTableCode(1, 7, twoDimTable); + if (result[0] && result[2]) { + return result[1]; + } } info("Bad two dim code"); - return Nt; + return ccittEOF; } _getWhiteCode() { - let e, - t = 0; + let code = 0; + let p; if (this.eoblock) { - t = this._lookBits(12); - if (t === Nt) return 1; - e = t >> 5 == 0 ? xt[t] : Ut[t >> 3]; - if (e[0] > 0) { - this._eatBits(e[0]); - return e[1]; + code = this._lookBits(12); + if (code === ccittEOF) { + return 1; + } + p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; } } else { - let e = this._findTableCode(1, 9, Ut); - if (e[0]) return e[1]; - e = this._findTableCode(11, 12, xt); - if (e[0]) return e[1]; + let result = this._findTableCode(1, 9, whiteTable2); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(11, 12, whiteTable1); + if (result[0]) { + return result[1]; + } } info("bad white code"); this._eatBits(1); return 1; } _getBlackCode() { - let e, t; + let code, p; if (this.eoblock) { - e = this._lookBits(13); - if (e === Nt) return 1; - t = - e >> 7 == 0 - ? Mt[e] - : e >> 9 == 0 && e >> 7 != 0 - ? Lt[(e >> 1) - 64] - : Ht[e >> 7]; - if (t[0] > 0) { - this._eatBits(t[0]); - return t[1]; + code = this._lookBits(13); + if (code === ccittEOF) { + return 1; + } + 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]; + } + if (p[0] > 0) { + this._eatBits(p[0]); + return p[1]; } } else { - let e = this._findTableCode(2, 6, Ht); - if (e[0]) return e[1]; - e = this._findTableCode(7, 12, Lt, 64); - if (e[0]) return e[1]; - e = this._findTableCode(10, 13, Mt); - if (e[0]) return e[1]; + let result = this._findTableCode(2, 6, blackTable3); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(7, 12, blackTable2, 64); + if (result[0]) { + return result[1]; + } + result = this._findTableCode(10, 13, blackTable1); + if (result[0]) { + return result[1]; + } } info("bad black code"); this._eatBits(1); return 1; } - _lookBits(e) { - let t; - for (; this.inputBits < e; ) { - if (-1 === (t = this.source.next())) - return 0 === this.inputBits - ? Nt - : (this.inputBuf << (e - this.inputBits)) & (65535 >> (16 - e)); - this.inputBuf = (this.inputBuf << 8) | t; + _lookBits(n) { + let c; + while (this.inputBits < n) { + if ((c = this.source.next()) === -1) { + if (this.inputBits === 0) { + return ccittEOF; + } + return (this.inputBuf << (n - this.inputBits)) & (0xffff >> (16 - n)); + } + this.inputBuf = (this.inputBuf << 8) | c; this.inputBits += 8; } - return (this.inputBuf >> (this.inputBits - e)) & (65535 >> (16 - e)); + return (this.inputBuf >> (this.inputBits - n)) & (0xffff >> (16 - n)); } - _eatBits(e) { - (this.inputBits -= e) < 0 && (this.inputBits = 0); + _eatBits(n) { + if ((this.inputBits -= n) < 0) { + this.inputBits = 0; + } } -} +} // ./src/core/ccitt_stream.js + class CCITTFaxStream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.str = e; - this.dict = e.dict; - i instanceof Dict || (i = Dict.empty); - const a = { next: () => e.getByte() }; - this.ccittFaxDecoder = new CCITTFaxDecoder(a, { - K: i.get("K"), - EndOfLine: i.get("EndOfLine"), - EncodedByteAlign: i.get("EncodedByteAlign"), - Columns: i.get("Columns"), - Rows: i.get("Rows"), - EndOfBlock: i.get("EndOfBlock"), - BlackIs1: i.get("BlackIs1"), + constructor(str, maybeLength, params) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + if (!(params instanceof Dict)) { + params = Dict.empty; + } + const source = { + next() { + return str.getByte(); + }, + }; + this.ccittFaxDecoder = new 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"), }); } readBlock() { - for (; !this.eof; ) { - const e = this.ccittFaxDecoder.readNextChar(); - if (-1 === e) { - this.eof = !0; + while (!this.eof) { + const c = this.ccittFaxDecoder.readNextChar(); + if (c === -1) { + this.eof = true; return; } this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = e; + this.buffer[this.bufferLength++] = c; } } -} -const Jt = new Int32Array([ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, +} // ./src/core/flate_stream.js + +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, 0x80026, 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, 0x8003d, 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, ]), - Yt = new Int32Array([ - 3, 4, 5, 6, 7, 8, 9, 10, 65547, 65549, 65551, 65553, 131091, 131095, 131099, - 131103, 196643, 196651, 196659, 196667, 262211, 262227, 262243, 262259, - 327811, 327843, 327875, 327907, 258, 258, 258, + 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, ]), - vt = new Int32Array([ - 1, 2, 3, 4, 65541, 65543, 131081, 131085, 196625, 196633, 262177, 262193, - 327745, 327777, 393345, 393409, 459009, 459137, 524801, 525057, 590849, - 591361, 657409, 658433, 724993, 727041, 794625, 798721, 868353, 876545, - ]), - Kt = [ - new Int32Array([ - 459008, 524368, 524304, 524568, 459024, 524400, 524336, 590016, 459016, - 524384, 524320, 589984, 524288, 524416, 524352, 590048, 459012, 524376, - 524312, 589968, 459028, 524408, 524344, 590032, 459020, 524392, 524328, - 59e4, 524296, 524424, 524360, 590064, 459010, 524372, 524308, 524572, - 459026, 524404, 524340, 590024, 459018, 524388, 524324, 589992, 524292, - 524420, 524356, 590056, 459014, 524380, 524316, 589976, 459030, 524412, - 524348, 590040, 459022, 524396, 524332, 590008, 524300, 524428, 524364, - 590072, 459009, 524370, 524306, 524570, 459025, 524402, 524338, 590020, - 459017, 524386, 524322, 589988, 524290, 524418, 524354, 590052, 459013, - 524378, 524314, 589972, 459029, 524410, 524346, 590036, 459021, 524394, - 524330, 590004, 524298, 524426, 524362, 590068, 459011, 524374, 524310, - 524574, 459027, 524406, 524342, 590028, 459019, 524390, 524326, 589996, - 524294, 524422, 524358, 590060, 459015, 524382, 524318, 589980, 459031, - 524414, 524350, 590044, 459023, 524398, 524334, 590012, 524302, 524430, - 524366, 590076, 459008, 524369, 524305, 524569, 459024, 524401, 524337, - 590018, 459016, 524385, 524321, 589986, 524289, 524417, 524353, 590050, - 459012, 524377, 524313, 589970, 459028, 524409, 524345, 590034, 459020, - 524393, 524329, 590002, 524297, 524425, 524361, 590066, 459010, 524373, - 524309, 524573, 459026, 524405, 524341, 590026, 459018, 524389, 524325, - 589994, 524293, 524421, 524357, 590058, 459014, 524381, 524317, 589978, - 459030, 524413, 524349, 590042, 459022, 524397, 524333, 590010, 524301, - 524429, 524365, 590074, 459009, 524371, 524307, 524571, 459025, 524403, - 524339, 590022, 459017, 524387, 524323, 589990, 524291, 524419, 524355, - 590054, 459013, 524379, 524315, 589974, 459029, 524411, 524347, 590038, - 459021, 524395, 524331, 590006, 524299, 524427, 524363, 590070, 459011, - 524375, 524311, 524575, 459027, 524407, 524343, 590030, 459019, 524391, - 524327, 589998, 524295, 524423, 524359, 590062, 459015, 524383, 524319, - 589982, 459031, 524415, 524351, 590046, 459023, 524399, 524335, 590014, - 524303, 524431, 524367, 590078, 459008, 524368, 524304, 524568, 459024, - 524400, 524336, 590017, 459016, 524384, 524320, 589985, 524288, 524416, - 524352, 590049, 459012, 524376, 524312, 589969, 459028, 524408, 524344, - 590033, 459020, 524392, 524328, 590001, 524296, 524424, 524360, 590065, - 459010, 524372, 524308, 524572, 459026, 524404, 524340, 590025, 459018, - 524388, 524324, 589993, 524292, 524420, 524356, 590057, 459014, 524380, - 524316, 589977, 459030, 524412, 524348, 590041, 459022, 524396, 524332, - 590009, 524300, 524428, 524364, 590073, 459009, 524370, 524306, 524570, - 459025, 524402, 524338, 590021, 459017, 524386, 524322, 589989, 524290, - 524418, 524354, 590053, 459013, 524378, 524314, 589973, 459029, 524410, - 524346, 590037, 459021, 524394, 524330, 590005, 524298, 524426, 524362, - 590069, 459011, 524374, 524310, 524574, 459027, 524406, 524342, 590029, - 459019, 524390, 524326, 589997, 524294, 524422, 524358, 590061, 459015, - 524382, 524318, 589981, 459031, 524414, 524350, 590045, 459023, 524398, - 524334, 590013, 524302, 524430, 524366, 590077, 459008, 524369, 524305, - 524569, 459024, 524401, 524337, 590019, 459016, 524385, 524321, 589987, - 524289, 524417, 524353, 590051, 459012, 524377, 524313, 589971, 459028, - 524409, 524345, 590035, 459020, 524393, 524329, 590003, 524297, 524425, - 524361, 590067, 459010, 524373, 524309, 524573, 459026, 524405, 524341, - 590027, 459018, 524389, 524325, 589995, 524293, 524421, 524357, 590059, - 459014, 524381, 524317, 589979, 459030, 524413, 524349, 590043, 459022, - 524397, 524333, 590011, 524301, 524429, 524365, 590075, 459009, 524371, - 524307, 524571, 459025, 524403, 524339, 590023, 459017, 524387, 524323, - 589991, 524291, 524419, 524355, 590055, 459013, 524379, 524315, 589975, - 459029, 524411, 524347, 590039, 459021, 524395, 524331, 590007, 524299, - 524427, 524363, 590071, 459011, 524375, 524311, 524575, 459027, 524407, - 524343, 590031, 459019, 524391, 524327, 589999, 524295, 524423, 524359, - 590063, 459015, 524383, 524319, 589983, 459031, 524415, 524351, 590047, - 459023, 524399, 524335, 590015, 524303, 524431, 524367, 590079, - ]), - 9, - ], - Tt = [ - new Int32Array([ - 327680, 327696, 327688, 327704, 327684, 327700, 327692, 327708, 327682, - 327698, 327690, 327706, 327686, 327702, 327694, 0, 327681, 327697, 327689, - 327705, 327685, 327701, 327693, 327709, 327683, 327699, 327691, 327707, - 327687, 327703, 327695, 0, - ]), - 5, - ]; + 5, +]; class FlateStream extends DecodeStream { - constructor(e, t) { - super(t); - this.str = e; - this.dict = e.dict; - const i = e.getByte(), - a = e.getByte(); - if (-1 === i || -1 === a) - throw new FormatError(`Invalid header in flate stream: ${i}, ${a}`); - if (8 != (15 & i)) + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; + const cmf = str.getByte(); + const flg = str.getByte(); + if (cmf === -1 || flg === -1) { + throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + } + if ((cmf & 0x0f) !== 0x08) { throw new FormatError( - `Unknown compression method in flate stream: ${i}, ${a}`, + `Unknown compression method in flate stream: ${cmf}, ${flg}`, ); - if (((i << 8) + a) % 31 != 0) - throw new FormatError(`Bad FCHECK in flate stream: ${i}, ${a}`); - if (32 & a) - throw new FormatError(`FDICT bit set in flate stream: ${i}, ${a}`); + } + if (((cmf << 8) + flg) % 31 !== 0) { + throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); + } + if (flg & 0x20) { + throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); + } this.codeSize = 0; this.codeBuf = 0; } - async getImageData(e, t) { - const i = await this.asyncGetBytes(); - return i?.subarray(0, e) || this.getBytes(e); + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + return data?.subarray(0, length) || this.getBytes(length); } async asyncGetBytes() { this.str.reset(); - const e = this.str.getBytes(); + const bytes = this.str.getBytes(); try { - const { readable: t, writable: i } = new DecompressionStream("deflate"), - a = i.getWriter(); - a.write(e); - a.close(); - const s = []; - let r = 0; - for await (const e of t) { - s.push(e); - r += e.byteLength; + const { readable, writable } = new DecompressionStream("deflate"); + const writer = writable.getWriter(); + await writer.ready; + writer + .write(bytes) + .then(async () => { + await writer.ready; + await writer.close(); + }) + .catch(() => {}); + const chunks = []; + let totalLength = 0; + for await (const chunk of readable) { + chunks.push(chunk); + totalLength += chunk.byteLength; } - const n = new Uint8Array(r); - let g = 0; - for (const e of s) { - n.set(e, g); - g += e.byteLength; + const data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; } - return n; + return data; } catch { - this.str = new Stream(e, 2, e.length, this.str.dict); + this.str = new Stream(bytes, 2, bytes.length, this.str.dict); this.reset(); return null; } } get isAsync() { - return !0; + return true; } - getBits(e) { - const t = this.str; - let i, - a = this.codeSize, - s = this.codeBuf; - for (; a < e; ) { - if (-1 === (i = t.getByte())) + getBits(bits) { + const str = this.str; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { throw new FormatError("Bad encoding in flate stream"); - s |= i << a; - a += 8; + } + codeBuf |= b << codeSize; + codeSize += 8; } - i = s & ((1 << e) - 1); - this.codeBuf = s >> e; - this.codeSize = a -= e; - return i; + b = codeBuf & ((1 << bits) - 1); + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; } - getCode(e) { - const t = this.str, - i = e[0], - a = e[1]; - let s, - r = this.codeSize, - n = this.codeBuf; - for (; r < a && -1 !== (s = t.getByte()); ) { - n |= s << r; - r += 8; + getCode(table) { + const str = this.str; + const codes = table[0]; + const maxLen = table[1]; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; } - const g = i[n & ((1 << a) - 1)], - o = g >> 16, - c = 65535 & g; - if (o < 1 || r < o) throw new FormatError("Bad encoding in flate stream"); - this.codeBuf = n >> o; - this.codeSize = r - o; - return c; + const code = codes[codeBuf & ((1 << maxLen) - 1)]; + const codeLen = code >> 16; + const codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new FormatError("Bad encoding in flate stream"); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; } - generateHuffmanTable(e) { - const t = e.length; - let i, - a = 0; - for (i = 0; i < t; ++i) e[i] > a && (a = e[i]); - const s = 1 << a, - r = new Int32Array(s); - for (let n = 1, g = 0, o = 2; n <= a; ++n, g <<= 1, o <<= 1) - for (let a = 0; a < t; ++a) - if (e[a] === n) { - let e = 0, - t = g; - for (i = 0; i < n; ++i) { - e = (e << 1) | (1 & t); + generateHuffmanTable(lengths) { + const n = lengths.length; + let maxLen = 0; + let i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + const size = 1 << maxLen; + const codes = new Int32Array(size); + 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 = e; i < s; i += o) r[i] = (n << 16) | a; - ++g; + for (i = code2; i < size; i += skip) { + codes[i] = (len << 16) | val; + } + ++code; } - return [r, a]; + } + } + return [codes, maxLen]; } - #m(e) { - info(e); - this.eof = !0; + #endsStreamOnError(err) { + info(err); + this.eof = true; } readBlock() { - let e, t, i; - const a = this.str; + let buffer, hdr, len; + const str = this.str; try { - t = this.getBits(3); - } catch (e) { - this.#m(e.message); + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); return; } - 1 & t && (this.eof = !0); - t >>= 1; - if (0 === t) { - let t; - if (-1 === (t = a.getByte())) { - this.#m("Bad block header in flate stream"); + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + let b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); return; } - let i = t; - if (-1 === (t = a.getByte())) { - this.#m("Bad block header in flate stream"); + let blockLen = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); return; } - i |= t << 8; - if (-1 === (t = a.getByte())) { - this.#m("Bad block header in flate stream"); + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); return; } - let s = t; - if (-1 === (t = a.getByte())) { - this.#m("Bad block header in flate stream"); + let check = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); return; } - s |= t << 8; - if (s !== (65535 & ~i) && (0 !== i || 0 !== s)) + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { throw new FormatError("Bad uncompressed block length in flate stream"); + } this.codeBuf = 0; this.codeSize = 0; - const r = this.bufferLength, - n = r + i; - e = this.ensureBuffer(n); - this.bufferLength = n; - if (0 === i) -1 === a.peekByte() && (this.eof = !0); - else { - const t = a.getBytes(i); - e.set(t, r); - t.length < i && (this.eof = !0); + const bufferLength = this.bufferLength, + end = bufferLength + blockLen; + buffer = this.ensureBuffer(end); + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } else { + const block = str.getBytes(blockLen); + buffer.set(block, bufferLength); + if (block.length < blockLen) { + this.eof = true; + } } return; } - let s, r; - if (1 === t) { - s = Kt; - r = Tt; - } else { - if (2 !== t) throw new FormatError("Unknown block type in flate stream"); - { - const e = this.getBits(5) + 257, - t = this.getBits(5) + 1, - a = this.getBits(4) + 4, - n = new Uint8Array(Jt.length); - let g; - for (g = 0; g < a; ++g) n[Jt[g]] = this.getBits(3); - const o = this.generateHuffmanTable(n); - i = 0; - g = 0; - const c = e + t, - C = new Uint8Array(c); - let h, l, Q; - for (; g < c; ) { - const e = this.getCode(o); - if (16 === e) { - h = 2; - l = 3; - Q = i; - } else if (17 === e) { - h = 3; - l = 3; - Q = i = 0; - } else { - if (18 !== e) { - C[g++] = i = e; - continue; - } - h = 7; - l = 11; - Q = i = 0; - } - let t = this.getBits(h) + l; - for (; t-- > 0; ) C[g++] = Q; - } - s = this.generateHuffmanTable(C.subarray(0, e)); - r = this.generateHuffmanTable(C.subarray(e, c)); + let litCodeTable; + let distCodeTable; + 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 (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); } - } - e = this.buffer; - let n = e ? e.length : 0, - g = this.bufferLength; - for (;;) { - let t = this.getCode(s); - if (t < 256) { - if (g + 1 >= n) { - e = this.ensureBuffer(g + 1); - n = e.length; + const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + const codes = numLitCodes + numDistCodes; + const codeLengths = new Uint8Array(codes); + let bitsLength, bitsOffset, what; + while (i < codes) { + const code = this.getCode(codeLenCodeTab); + 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; } - e[g++] = t; + let repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable( + codeLengths.subarray(0, numLitCodes), + ); + distCodeTable = this.generateHuffmanTable( + codeLengths.subarray(numLitCodes, codes), + ); + } else { + throw new FormatError("Unknown block type in flate stream"); + } + buffer = this.buffer; + let limit = buffer ? buffer.length : 0; + let pos = this.bufferLength; + while (true) { + let code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; continue; } - if (256 === t) { - this.bufferLength = g; + if (code1 === 256) { + this.bufferLength = pos; return; } - t -= 257; - t = Yt[t]; - let a = t >> 16; - a > 0 && (a = this.getBits(a)); - i = (65535 & t) + a; - t = this.getCode(r); - t = vt[t]; - a = t >> 16; - a > 0 && (a = this.getBits(a)); - const o = (65535 & t) + a; - if (g + i >= n) { - e = this.ensureBuffer(g + i); - n = e.length; + code1 -= 257; + code1 = lengthDecode[code1]; + let code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + const dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (let k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; } - for (let t = 0; t < i; ++t, ++g) e[g] = e[g - o]; } } -} -const qt = [ - { qe: 22017, nmps: 1, nlps: 1, switchFlag: 1 }, - { qe: 13313, nmps: 2, nlps: 6, switchFlag: 0 }, - { qe: 6145, nmps: 3, nlps: 9, switchFlag: 0 }, - { qe: 2753, nmps: 4, nlps: 12, switchFlag: 0 }, - { qe: 1313, nmps: 5, nlps: 29, switchFlag: 0 }, - { qe: 545, nmps: 38, nlps: 33, switchFlag: 0 }, - { qe: 22017, nmps: 7, nlps: 6, switchFlag: 1 }, - { qe: 21505, nmps: 8, nlps: 14, switchFlag: 0 }, - { qe: 18433, nmps: 9, nlps: 14, switchFlag: 0 }, - { qe: 14337, nmps: 10, nlps: 14, switchFlag: 0 }, - { qe: 12289, nmps: 11, nlps: 17, switchFlag: 0 }, - { qe: 9217, nmps: 12, nlps: 18, switchFlag: 0 }, - { qe: 7169, nmps: 13, nlps: 20, switchFlag: 0 }, - { qe: 5633, nmps: 29, nlps: 21, switchFlag: 0 }, - { qe: 22017, nmps: 15, nlps: 14, switchFlag: 1 }, - { qe: 21505, nmps: 16, nlps: 14, switchFlag: 0 }, - { qe: 20737, nmps: 17, nlps: 15, switchFlag: 0 }, - { qe: 18433, nmps: 18, nlps: 16, switchFlag: 0 }, - { qe: 14337, nmps: 19, nlps: 17, switchFlag: 0 }, - { qe: 13313, nmps: 20, nlps: 18, switchFlag: 0 }, - { qe: 12289, nmps: 21, nlps: 19, switchFlag: 0 }, - { qe: 10241, nmps: 22, nlps: 19, switchFlag: 0 }, - { qe: 9217, nmps: 23, nlps: 20, switchFlag: 0 }, - { qe: 8705, nmps: 24, nlps: 21, switchFlag: 0 }, - { qe: 7169, nmps: 25, nlps: 22, switchFlag: 0 }, - { qe: 6145, nmps: 26, nlps: 23, switchFlag: 0 }, - { qe: 5633, nmps: 27, nlps: 24, switchFlag: 0 }, - { qe: 5121, nmps: 28, nlps: 25, switchFlag: 0 }, - { qe: 4609, nmps: 29, nlps: 26, switchFlag: 0 }, - { qe: 4353, nmps: 30, nlps: 27, switchFlag: 0 }, - { qe: 2753, nmps: 31, nlps: 28, switchFlag: 0 }, - { qe: 2497, nmps: 32, nlps: 29, switchFlag: 0 }, - { qe: 2209, nmps: 33, nlps: 30, switchFlag: 0 }, - { qe: 1313, nmps: 34, nlps: 31, switchFlag: 0 }, - { qe: 1089, nmps: 35, nlps: 32, switchFlag: 0 }, - { qe: 673, nmps: 36, nlps: 33, switchFlag: 0 }, - { qe: 545, nmps: 37, nlps: 34, switchFlag: 0 }, - { qe: 321, nmps: 38, nlps: 35, switchFlag: 0 }, - { qe: 273, nmps: 39, nlps: 36, switchFlag: 0 }, - { qe: 133, nmps: 40, nlps: 37, switchFlag: 0 }, - { qe: 73, nmps: 41, nlps: 38, switchFlag: 0 }, - { qe: 37, nmps: 42, nlps: 39, switchFlag: 0 }, - { qe: 21, nmps: 43, nlps: 40, switchFlag: 0 }, - { qe: 9, nmps: 44, nlps: 41, switchFlag: 0 }, - { qe: 5, nmps: 45, nlps: 42, switchFlag: 0 }, - { qe: 1, nmps: 45, nlps: 43, switchFlag: 0 }, - { qe: 22017, nmps: 46, nlps: 46, switchFlag: 0 }, +} // ./src/core/arithmetic_decoder.js + +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(e, t, i) { - this.data = e; - this.bp = t; - this.dataEnd = i; - this.chigh = e[t]; + 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) & 65535) | ((this.clow >> 9) & 127); - this.clow = (this.clow << 7) & 65535; + this.chigh = ((this.chigh << 7) & 0xffff) | ((this.clow >> 9) & 0x7f); + this.clow = (this.clow << 7) & 0xffff; this.ct -= 7; - this.a = 32768; + this.a = 0x8000; } byteIn() { - const e = this.data; - let t = this.bp; - if (255 === e[t]) - if (e[t + 1] > 143) { - this.clow += 65280; + const data = this.data; + let bp = this.bp; + if (data[bp] === 0xff) { + if (data[bp + 1] > 0x8f) { + this.clow += 0xff00; this.ct = 8; } else { - t++; - this.clow += e[t] << 9; + bp++; + this.clow += data[bp] << 9; this.ct = 7; - this.bp = t; + this.bp = bp; } - else { - t++; - this.clow += t < this.dataEnd ? e[t] << 8 : 65280; + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; this.ct = 8; - this.bp = t; + this.bp = bp; } - if (this.clow > 65535) { + if (this.clow > 0xffff) { this.chigh += this.clow >> 16; - this.clow &= 65535; + this.clow &= 0xffff; } } - readBit(e, t) { - let i = e[t] >> 1, - a = 1 & e[t]; - const s = qt[i], - r = s.qe; - let n, - g = this.a - r; - if (this.chigh < r) - if (g < r) { - g = r; - n = a; - i = s.nmps; + 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 { - g = r; - n = 1 ^ a; - 1 === s.switchFlag && (a = n); - i = s.nlps; + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; } - else { - this.chigh -= r; - if (0 != (32768 & g)) { - this.a = g; - return a; + } else { + this.chigh -= qeIcx; + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; } - if (g < r) { - n = 1 ^ a; - 1 === s.switchFlag && (a = n); - i = s.nlps; + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; } else { - n = a; - i = s.nmps; + d = cx_mps; + cx_index = qeTableIcx.nmps; } } do { - 0 === this.ct && this.byteIn(); - g <<= 1; - this.chigh = ((this.chigh << 1) & 65535) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 65535; + 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 (0 == (32768 & g)); - this.a = g; - e[t] = (i << 1) | a; - return n; + } while ((a & 0x8000) === 0); + this.a = a; + contexts[pos] = (cx_index << 1) | cx_mps; + return d; } -} -class Jbig2Error extends rt { - constructor(e) { - super(e, "Jbig2Error"); +} // ./src/core/jbig2.js + +class Jbig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); } } class ContextCache { - getContexts(e) { - return e in this ? this[e] : (this[e] = new Int8Array(65536)); + getContexts(id) { + if (id in this) { + return this[id]; + } + return (this[id] = new Int8Array(1 << 16)); } } class DecodingContext { - constructor(e, t, i) { - this.data = e; - this.start = t; - this.end = i; + constructor(data, start, end) { + this.data = data; + this.start = start; + this.end = end; } get decoder() { - return shadow( - this, - "decoder", - new ArithmeticDecoder(this.data, this.start, this.end), - ); + const decoder = new ArithmeticDecoder(this.data, this.start, this.end); + return shadow(this, "decoder", decoder); } get contextCache() { - return shadow(this, "contextCache", new ContextCache()); + const cache = new ContextCache(); + return shadow(this, "contextCache", cache); } } -const Ot = 2 ** 31 - 1, - Pt = -(2 ** 31); -function decodeInteger(e, t, i) { - const a = e.getContexts(t); - let s = 1; - function readBits(e) { - let t = 0; - for (let r = 0; r < e; r++) { - const e = i.readBit(a, s); - s = s < 256 ? (s << 1) | e : (511 & ((s << 1) | e)) | 256; - t = (t << 1) | e; +const MAX_INT_32 = 2 ** 31 - 1; +const MIN_INT_32 = -(2 ** 31); +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 t >>> 0; + return v >>> 0; } - const r = readBits(1), - n = readBits(1) + const sign = readBits(1); + const value = readBits(1) + ? 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); - let g; - 0 === r ? (g = n) : n > 0 && (g = -n); - return g >= Pt && g <= Ot ? g : null; -} -function decodeIAID(e, t, i) { - const a = e.getContexts("IAID"); - let s = 1; - for (let e = 0; e < i; e++) { - s = (s << 1) | t.readBit(a, s); + ? readBits(32) + 4436 + : readBits(12) + 340 + : readBits(8) + 84 + : readBits(6) + 20 + : readBits(4) + 4 + : readBits(2); + let signedValue; + if (sign === 0) { + signedValue = value; + } else if (value > 0) { + signedValue = -value; } - return i < 31 ? s & ((1 << i) - 1) : 2147483647 & s; + if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { + return signedValue; + } + return null; } -const Wt = [ - "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", - ], - jt = [ - [ - { 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 }, - ], - ], - Xt = [ +function decodeIAID(contextCache, decoder, codeLength) { + const contexts = contextCache.getContexts("IAID"); + let prev = 1; + for (let i = 0; i < codeLength; i++) { + const bit = decoder.readBit(contexts, prev); + prev = (prev << 1) | bit; + } + if (codeLength < 31) { + return prev & ((1 << codeLength) - 1); + } + return prev & 0x7fffffff; +} +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 = [ + [ { - 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 }, - ], + x: -1, + y: -2, }, { - 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 }, - ], + 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, }, ], - Zt = [39717, 1941, 229, 405], - Vt = [32, 8]; -function decodeBitmap(e, t, i, a, s, r, n, g) { - if (e) { - return decodeMMRBitmap(new Reader(g.data, g.start, g.end), t, i, !1); + [ + { + 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]; +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; + 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; +} +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); } if ( - 0 === a && - !r && - !s && - 4 === n.length && - 3 === n[0].x && - -1 === n[0].y && - -3 === n[1].x && - -1 === n[1].y && - 2 === n[2].x && - -2 === n[2].y && - -2 === n[3].x && - -2 === n[3].y - ) - return (function decodeBitmapTemplate0(e, t, i) { - const a = i.decoder, - s = i.contextCache.getContexts("GB"), - r = []; - let n, g, o, c, C, h, l; - for (g = 0; g < t; g++) { - C = r[g] = new Uint8Array(e); - h = g < 1 ? C : r[g - 1]; - l = g < 2 ? C : r[g - 2]; - n = - (l[0] << 13) | - (l[1] << 12) | - (l[2] << 11) | - (h[0] << 7) | - (h[1] << 6) | - (h[2] << 5) | - (h[3] << 4); - for (o = 0; o < e; o++) { - C[o] = c = a.readBit(s, n); - n = - ((31735 & n) << 1) | - (o + 3 < e ? l[o + 3] << 11 : 0) | - (o + 4 < e ? h[o + 4] << 4 : 0) | - c; - } - } - return r; - })(t, i, g); - const o = !!r, - c = jt[a].concat(n); - c.sort(function (e, t) { - return e.y - t.y || e.x - t.x; + 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); + } + const useskip = !!skip; + const template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; }); - const C = c.length, - h = new Int8Array(C), - l = new Int8Array(C), - Q = []; - let E, - u, - d = 0, - f = 0, - p = 0, - m = 0; - for (u = 0; u < C; u++) { - h[u] = c[u].x; - l[u] = c[u].y; - f = Math.min(f, c[u].x); - p = Math.max(p, c[u].x); - m = Math.min(m, c[u].y); - u < C - 1 && c[u].y === c[u + 1].y && c[u].x === c[u + 1].x - 1 - ? (d |= 1 << (C - 1 - u)) - : Q.push(u); + 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); + } } - const y = Q.length, - w = new Int8Array(y), - D = new Int8Array(y), - b = new Uint16Array(y); - for (E = 0; E < y; E++) { - u = Q[E]; - w[E] = c[u].x; - D[E] = c[u].y; - b[E] = 1 << (C - 1 - u); + const changingEntriesLength = changingTemplateEntries.length; + const changingTemplateX = new Int8Array(changingEntriesLength); + const changingTemplateY = new Int8Array(changingEntriesLength); + const changingTemplateBit = new Uint16Array(changingEntriesLength); + 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 F = -f, - S = -m, - k = t - p, - R = Zt[a]; - let N = new Uint8Array(t); - const G = [], - x = g.decoder, - U = g.contextCache.getContexts("GB"); - let M, - L, - H, - J, - Y, - v = 0, - K = 0; - for (let e = 0; e < i; e++) { - if (s) { - v ^= x.readBit(U, R); - if (v) { - G.push(N); + 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; } } - N = new Uint8Array(N); - G.push(N); - for (M = 0; M < t; M++) { - if (o && r[e][M]) { - N[M] = 0; + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; continue; } - if (M >= F && M < k && e >= S) { - K = (K << 1) & d; - for (u = 0; u < y; u++) { - L = e + D[u]; - H = M + w[u]; - J = G[L][H]; - if (J) { - J = b[u]; - K |= J; + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = (contextLabel << 1) & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; } } } else { - K = 0; - Y = C - 1; - for (u = 0; u < C; u++, Y--) { - H = M + h[u]; - if (H >= 0 && H < t) { - L = e + l[u]; - if (L >= 0) { - J = G[L][H]; - J && (K |= J << Y); + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } } } } } - const i = x.readBit(U, K); - N[M] = i; + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; } } - return G; + return bitmap; } -function decodeRefinement(e, t, i, a, s, r, n, g, o) { - let c = Xt[i].coding; - 0 === i && (c = c.concat([g[0]])); - const C = c.length, - h = new Int32Array(C), - l = new Int32Array(C); - let Q; - for (Q = 0; Q < C; Q++) { - h[Q] = c[Q].x; - l[Q] = c[Q].y; +function decodeRefinement( + width, + height, + templateIndex, + referenceBitmap, + offsetX, + offsetY, + prediction, + at, + decodingContext, +) { + let codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); } - let E = Xt[i].reference; - 0 === i && (E = E.concat([g[1]])); - const u = E.length, - d = new Int32Array(u), - f = new Int32Array(u); - for (Q = 0; Q < u; Q++) { - d[Q] = E[Q].x; - f[Q] = E[Q].y; + 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; } - const p = a[0].length, - m = a.length, - y = Vt[i], - w = [], - D = o.decoder, - b = o.contextCache.getContexts("GR"); - let F = 0; - for (let i = 0; i < t; i++) { - if (n) { - F ^= D.readBit(b, y); - if (F) throw new Jbig2Error("prediction is not supported"); + let referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + 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; + } + 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; + for (let i = 0; i < height; i++) { + if (prediction) { + const sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + throw new Jbig2Error("prediction is not supported"); + } } - const t = new Uint8Array(e); - w.push(t); - for (let n = 0; n < e; n++) { - let g, - o, - c = 0; - for (Q = 0; Q < C; Q++) { - g = i + l[Q]; - o = n + h[Q]; - g < 0 || o < 0 || o >= e ? (c <<= 1) : (c = (c << 1) | w[g][o]); + const row = new Uint8Array(width); + bitmap.push(row); + for (let j = 0; j < width; j++) { + let i0, j0; + let contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else { + contextLabel = (contextLabel << 1) | bitmap[i0][j0]; + } } - for (Q = 0; Q < u; Q++) { - g = i + f[Q] - r; - o = n + d[Q] - s; - g < 0 || g >= m || o < 0 || o >= p - ? (c <<= 1) - : (c = (c << 1) | a[g][o]); + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] - offsetY; + j0 = j + referenceTemplateX[k] - offsetX; + if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { + contextLabel <<= 1; + } else { + contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; + } } - const E = D.readBit(b, c); - t[n] = E; + const pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; } } - return w; + 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"); + } + const newSymbols = []; + let currentHeight = 0; + let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let tableB1, symbolWidths; + if (huffman) { + tableB1 = getStandardTable(1); + symbolWidths = []; + symbolCodeLength = Math.max(symbolCodeLength, 1); + } + 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; + while (true) { + const deltaWidth = huffman + ? huffmanTables.tableDeltaWidth.decode(huffmanInput) + : decodeInteger(contextCache, "IADW", decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + let bitmap; + if (refinement) { + const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); + 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, + ); + } + newSymbols.push(bitmap); + } else if (huffman) { + symbolWidths.push(currentWidth); + } else { + bitmap = decodeBitmap( + false, + currentWidth, + currentHeight, + templateIndex, + false, + null, + at, + decodingContext, + ); + newSymbols.push(bitmap); + } + } + if (huffman && !refinement) { + const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); + huffmanInput.byteAlign(); + let collectiveBitmap; + 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; + } + const numberOfSymbolsDecoded = symbolWidths.length; + 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)); + } + newSymbols.push(symbolBitmap); + xMin = xMax; + } + } + } + } + const exportedSymbols = [], + flags = []; + let currentFlag = false, + i, + ii; + const totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + let runLength = huffman + ? tableB1.decode(huffmanInput) + : decodeInteger(contextCache, "IAEX", decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (let j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; } function decodeTextRegion( - e, - t, - i, - a, - s, - r, - n, - g, - o, - c, - C, - h, - l, - Q, - E, - u, - d, - f, - p, + huffman, + refinement, + width, + height, + defaultPixelValue, + numberOfSymbolInstances, + stripSize, + inputSymbols, + symbolCodeLength, + transposed, + dsOffset, + referenceCorner, + combinationOperator, + huffmanTables, + refinementTemplateIndex, + refinementAt, + decodingContext, + logStripSize, + huffmanInput, ) { - if (e && t) throw new Jbig2Error("refinement with Huffman is not supported"); - const m = []; - let y, w; - for (y = 0; y < a; y++) { - w = new Uint8Array(i); - if (s) for (let e = 0; e < i; e++) w[e] = s; - m.push(w); + if (huffman && refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); } - const D = d.decoder, - b = d.contextCache; - let F = e ? -Q.tableDeltaT.decode(p) : -decodeInteger(b, "IADT", D), - S = 0; - y = 0; - for (; y < r; ) { - F += e ? Q.tableDeltaT.decode(p) : decodeInteger(b, "IADT", D); - S += e ? Q.tableFirstS.decode(p) : decodeInteger(b, "IAFS", D); - let a = S; - for (;;) { - let s = 0; - n > 1 && (s = e ? p.readBits(f) : decodeInteger(b, "IAIT", D)); - const r = n * F + s, - S = e ? Q.symbolIDTable.decode(p) : decodeIAID(b, D, o), - k = t && (e ? p.readBit() : decodeInteger(b, "IARI", D)); - let R = g[S], - N = R[0].length, - G = R.length; - if (k) { - const e = decodeInteger(b, "IARDW", D), - t = decodeInteger(b, "IARDH", D); - N += e; - G += t; - R = decodeRefinement( - N, - G, - E, - R, - (e >> 1) + decodeInteger(b, "IARDX", D), - (t >> 1) + decodeInteger(b, "IARDY", D), - !1, - u, - d, + const bitmap = []; + let i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (let j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + const decoder = decodingContext.decoder; + const contextCache = decodingContext.contextCache; + let stripT = huffman + ? -huffmanTables.tableDeltaT.decode(huffmanInput) + : -decodeInteger(contextCache, "IADT", decoder); + let firstS = 0; + i = 0; + 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; + do { + let currentT = 0; + if (stripSize > 1) { + currentT = huffman + ? huffmanInput.readBits(logStripSize) + : decodeInteger(contextCache, "IAIT", decoder); + } + 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; + 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, ); } - let x = 0; - c - ? 1 & h - ? (x = G - 1) - : (a += G - 1) - : h > 1 - ? (a += N - 1) - : (x = N - 1); - const U = r - (1 & h ? 0 : G - 1), - M = a - (2 & h ? N - 1 : 0); - let L, H, J; - if (c) - for (L = 0; L < G; L++) { - w = m[M + L]; - if (!w) continue; - J = R[L]; - const e = Math.min(i - U, N); - switch (l) { + let increment = 0; + if (!transposed) { + if (referenceCorner > 1) { + currentS += symbolWidth - 1; + } else { + increment = symbolWidth - 1; + } + } else if (!(referenceCorner & 1)) { + currentS += symbolHeight - 1; + } else { + increment = symbolHeight - 1; + } + const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); + const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); + let s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + const maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { case 0: - for (H = 0; H < e; H++) w[U + H] |= J[H]; + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } break; case 2: - for (H = 0; H < e; H++) w[U + H] ^= J[H]; + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } break; default: - throw new Jbig2Error(`operator ${l} is not supported`); + throw new Jbig2Error( + `operator ${combinationOperator} is not supported`, + ); } } - else - for (H = 0; H < G; H++) { - w = m[U + H]; - if (w) { - J = R[H]; - switch (l) { - case 0: - for (L = 0; L < N; L++) w[M + L] |= J[L]; - break; - case 2: - for (L = 0; L < N; L++) w[M + L] ^= J[L]; - break; - default: - throw new Jbig2Error(`operator ${l} is not supported`); + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + default: + throw new Jbig2Error( + `operator ${combinationOperator} is not supported`, + ); + } + } + } + i++; + const deltaS = huffman + ? huffmanTables.tableDeltaS.decode(huffmanInput) + : decodeInteger(contextCache, "IADS", decoder); + if (deltaS === null) { + break; + } + currentS += increment + 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, + }, + { + x: 2, + y: -2, + }, + { + x: -2, + y: -2, + }, + ); + } + } + 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 (let y = 0; y < patternHeight; y++) { + patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); + } + 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`, + ); + } + const regionBitmap = []; + let i, j, row; + for (i = 0; i < regionHeight; i++) { + row = new Uint8Array(regionWidth); + if (defaultPixelValue) { + for (j = 0; j < regionWidth; j++) { + row[j] = defaultPixelValue; + } + } + regionBitmap.push(row); + } + const numberOfPatterns = patterns.length; + const pattern0 = patterns[0]; + const patternWidth = pattern0[0].length, + patternHeight = pattern0.length; + const bitsPerValue = log2(numberOfPatterns); + const at = []; + if (!mmr) { + at.push({ + x: template <= 1 ? 3 : 2, + y: -1, + }); + if (template === 0) { + at.push( + { + x: -3, + y: -1, + }, + { + x: 2, + y: -2, + }, + { + x: -2, + y: -2, + }, + ); + } + } + 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, + ); + } + grayScaleBitPlanes[i] = bitmap; + } + 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]; + 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]; + for (j = 0; j < patternWidth; j++) { + regionRow[x + j] |= patternRow[j]; + } + } + } 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; + if (regionX >= 0 && regionX < regionWidth) { + regionRow[regionX] |= patternRow[j]; } } } - y++; - const Y = e ? Q.tableDeltaS.decode(p) : decodeInteger(b, "IADS", D); - if (null === Y) break; - a += x + Y + C; + } } } - return m; + return regionBitmap; } -function readSegmentHeader(e, t) { - const i = {}; - i.number = readUint32(e, t); - const a = e[t + 4], - s = 63 & a; - if (!Wt[s]) throw new Jbig2Error("invalid segment type: " + s); - i.type = s; - i.typeName = Wt[s]; - i.deferredNonRetain = !!(128 & a); - const r = !!(64 & a), - n = e[t + 5]; - let g = (n >> 5) & 7; - const o = [31 & n]; - let c = t + 6; - if (7 === n) { - g = 536870911 & readUint32(e, c - 1); - c += 3; - let t = (g + 7) >> 3; - o[0] = e[c++]; - for (; --t > 0; ) o.push(e[c++]); - } else if (5 === n || 6 === n) - throw new Jbig2Error("invalid referred-to flags"); - i.retainBits = o; - let C = 4; - i.number <= 256 ? (C = 1) : i.number <= 65536 && (C = 2); - const h = []; - let l, Q; - for (l = 0; l < g; l++) { - let t; - t = 1 === C ? e[c] : 2 === C ? readUint16(e, c) : readUint32(e, c); - h.push(t); - c += C; +function readSegmentHeader(data, start) { + const segmentHeader = {}; + segmentHeader.number = readUint32(data, start); + const flags = data[start + 4]; + const segmentType = flags & 0x3f; + if (!SegmentTypes[segmentType]) { + throw new Jbig2Error("invalid segment type: " + segmentType); } - i.referredTo = h; - if (r) { - i.pageAssociation = readUint32(e, c); - c += 4; - } else i.pageAssociation = e[c++]; - i.length = readUint32(e, c); - c += 4; - if (4294967295 === i.length) { - if (38 !== s) throw new Jbig2Error("invalid unknown segment length"); - { - const t = readRegionSegmentInformation(e, c), - a = !!(1 & e[c + zt]), - s = 6, - r = new Uint8Array(s); - if (!a) { - r[0] = 255; - r[1] = 172; + 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; + if (referredFlags === 7) { + referredToCount = readUint32(data, position - 1) & 0x1fffffff; + position += 3; + let 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; + } + const referredTo = []; + let i, ii; + for (i = 0; i < referredToCount; i++) { + let number; + if (referredToSegmentNumberSize === 1) { + number = data[position]; + } else if (referredToSegmentNumberSize === 2) { + number = readUint16(data, position); + } else { + number = readUint32(data, position); + } + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = readUint32(data, position); + position += 4; + } + segmentHeader.length = readUint32(data, position); + position += 4; + 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); + if (!genericRegionMmr) { + searchPattern[0] = 0xff; + searchPattern[1] = 0xac; } - r[2] = (t.height >>> 24) & 255; - r[3] = (t.height >> 16) & 255; - r[4] = (t.height >> 8) & 255; - r[5] = 255 & t.height; - for (l = c, Q = e.length; l < Q; l++) { - let t = 0; - for (; t < s && r[t] === e[l + t]; ) t++; - if (t === s) { - i.length = l + s; + searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xff; + searchPattern[3] = (genericRegionInfo.height >> 16) & 0xff; + searchPattern[4] = (genericRegionInfo.height >> 8) & 0xff; + searchPattern[5] = genericRegionInfo.height & 0xff; + for (i = position, ii = data.length; i < ii; i++) { + let j = 0; + while (j < searchPatternLength && searchPattern[j] === data[i + j]) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; break; } } - if (4294967295 === i.length) + if (segmentHeader.length === 0xffffffff) { throw new Jbig2Error("segment end was not found"); + } + } else { + throw new Jbig2Error("invalid unknown segment length"); } } - i.headerEnd = c; - return i; + segmentHeader.headerEnd = position; + return segmentHeader; } -function readSegments(e, t, i, a) { - const s = []; - let r = i; - for (; r < a; ) { - const i = readSegmentHeader(t, r); - r = i.headerEnd; - const a = { header: i, data: t }; - if (!e.randomAccess) { - a.start = r; - r += i.length; - a.end = r; +function readSegments(header, data, start, end) { + const segments = []; + let position = start; + while (position < end) { + const segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + const segment = { + header: segmentHeader, + data, + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; } - s.push(a); - if (51 === i.type) break; } - if (e.randomAccess) - for (let e = 0, t = s.length; e < t; e++) { - s[e].start = r; - r += s[e].header.length; - s[e].end = r; + 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; } - return s; + } + return segments; } -function readRegionSegmentInformation(e, t) { +function readRegionSegmentInformation(data, start) { return { - width: readUint32(e, t), - height: readUint32(e, t + 4), - x: readUint32(e, t + 8), - y: readUint32(e, t + 12), - combinationOperator: 7 & e[t + 16], + width: readUint32(data, start), + height: readUint32(data, start + 4), + x: readUint32(data, start + 8), + y: readUint32(data, start + 12), + combinationOperator: data[start + 16] & 7, }; } -const zt = 17; -function processSegment(e, t) { - const i = e.header, - a = e.data, - s = e.end; - let r, - n, - g, - o, - c = e.start; - switch (i.type) { +const RegionSegmentInformationFieldLength = 17; +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 e = {}, - t = readUint16(a, c); - e.huffman = !!(1 & t); - e.refinement = !!(2 & t); - e.huffmanDHSelector = (t >> 2) & 3; - e.huffmanDWSelector = (t >> 4) & 3; - e.bitmapSizeSelector = (t >> 6) & 1; - e.aggregationInstancesSelector = (t >> 7) & 1; - e.bitmapCodingContextUsed = !!(256 & t); - e.bitmapCodingContextRetained = !!(512 & t); - e.template = (t >> 10) & 3; - e.refinementTemplate = (t >> 12) & 1; - c += 2; - if (!e.huffman) { - o = 0 === e.template ? 4 : 1; - n = []; - for (g = 0; g < o; g++) { - n.push({ x: readInt8(a, c), y: readInt8(a, c + 1) }); - c += 2; + const dictionary = {}; + const dictionaryFlags = 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: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; } - e.at = n; + dictionary.at = at; } - if (e.refinement && !e.refinementTemplate) { - n = []; - for (g = 0; g < 2; g++) { - n.push({ x: readInt8(a, c), y: readInt8(a, c + 1) }); - c += 2; + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; } - e.refinementAt = n; + dictionary.refinementAt = at; } - e.numberOfExportedSymbols = readUint32(a, c); - c += 4; - e.numberOfNewSymbols = readUint32(a, c); - c += 4; - r = [e, i.number, i.referredTo, a, c, s]; + dictionary.numberOfExportedSymbols = readUint32(data, position); + position += 4; + dictionary.numberOfNewSymbols = readUint32(data, position); + position += 4; + args = [ + dictionary, + header.number, + header.referredTo, + data, + position, + end, + ]; break; case 6: case 7: - const C = {}; - C.info = readRegionSegmentInformation(a, c); - c += zt; - const h = readUint16(a, c); - c += 2; - C.huffman = !!(1 & h); - C.refinement = !!(2 & h); - C.logStripSize = (h >> 2) & 3; - C.stripSize = 1 << C.logStripSize; - C.referenceCorner = (h >> 4) & 3; - C.transposed = !!(64 & h); - C.combinationOperator = (h >> 7) & 3; - C.defaultPixelValue = (h >> 9) & 1; - C.dsOffset = (h << 17) >> 27; - C.refinementTemplate = (h >> 15) & 1; - if (C.huffman) { - const e = readUint16(a, c); - c += 2; - C.huffmanFS = 3 & e; - C.huffmanDS = (e >> 2) & 3; - C.huffmanDT = (e >> 4) & 3; - C.huffmanRefinementDW = (e >> 6) & 3; - C.huffmanRefinementDH = (e >> 8) & 3; - C.huffmanRefinementDX = (e >> 10) & 3; - C.huffmanRefinementDY = (e >> 12) & 3; - C.huffmanRefinementSizeSelector = !!(16384 & e); + const textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + const textRegionSegmentFlags = 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 = 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 (C.refinement && !C.refinementTemplate) { - n = []; - for (g = 0; g < 2; g++) { - n.push({ x: readInt8(a, c), y: readInt8(a, c + 1) }); - c += 2; + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; } - C.refinementAt = n; + textRegion.refinementAt = at; } - C.numberOfSymbolInstances = readUint32(a, c); - c += 4; - r = [C, i.referredTo, a, c, s]; + textRegion.numberOfSymbolInstances = readUint32(data, position); + position += 4; + args = [textRegion, header.referredTo, data, position, end]; break; case 16: - const l = {}, - Q = a[c++]; - l.mmr = !!(1 & Q); - l.template = (Q >> 1) & 3; - l.patternWidth = a[c++]; - l.patternHeight = a[c++]; - l.maxPatternIndex = readUint32(a, c); - c += 4; - r = [l, i.number, a, c, s]; + 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 = readUint32(data, position); + position += 4; + args = [patternDictionary, header.number, data, position, end]; break; case 22: case 23: - const E = {}; - E.info = readRegionSegmentInformation(a, c); - c += zt; - const u = a[c++]; - E.mmr = !!(1 & u); - E.template = (u >> 1) & 3; - E.enableSkip = !!(8 & u); - E.combinationOperator = (u >> 4) & 7; - E.defaultPixelValue = (u >> 7) & 1; - E.gridWidth = readUint32(a, c); - c += 4; - E.gridHeight = readUint32(a, c); - c += 4; - E.gridOffsetX = 4294967295 & readUint32(a, c); - c += 4; - E.gridOffsetY = 4294967295 & readUint32(a, c); - c += 4; - E.gridVectorX = readUint16(a, c); - c += 2; - E.gridVectorY = readUint16(a, c); - c += 2; - r = [E, i.referredTo, a, c, s]; + 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 = readUint32(data, position); + position += 4; + halftoneRegion.gridHeight = readUint32(data, position); + position += 4; + halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; + position += 4; + halftoneRegion.gridVectorX = readUint16(data, position); + position += 2; + halftoneRegion.gridVectorY = readUint16(data, position); + position += 2; + args = [halftoneRegion, header.referredTo, data, position, end]; break; case 38: case 39: - const d = {}; - d.info = readRegionSegmentInformation(a, c); - c += zt; - const f = a[c++]; - d.mmr = !!(1 & f); - d.template = (f >> 1) & 3; - d.prediction = !!(8 & f); - if (!d.mmr) { - o = 0 === d.template ? 4 : 1; - n = []; - for (g = 0; g < o; g++) { - n.push({ x: readInt8(a, c), y: readInt8(a, c + 1) }); - c += 2; + 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: readInt8(data, position), + y: readInt8(data, position + 1), + }); + position += 2; } - d.at = n; + genericRegion.at = at; } - r = [d, a, c, s]; + args = [genericRegion, data, position, end]; break; case 48: - const p = { - width: readUint32(a, c), - height: readUint32(a, c + 4), - resolutionX: readUint32(a, c + 8), - resolutionY: readUint32(a, c + 12), + const pageInfo = { + width: readUint32(data, position), + height: readUint32(data, position + 4), + resolutionX: readUint32(data, position + 8), + resolutionY: readUint32(data, position + 12), }; - 4294967295 === p.height && delete p.height; - const m = a[c + 16]; - readUint16(a, c + 17); - p.lossless = !!(1 & m); - p.refinement = !!(2 & m); - p.defaultPixelValue = (m >> 2) & 1; - p.combinationOperator = (m >> 3) & 3; - p.requiresBuffer = !!(32 & m); - p.combinationOperatorOverride = !!(64 & m); - r = [p]; + if (pageInfo.height === 0xffffffff) { + delete pageInfo.height; + } + const pageSegmentFlags = data[position + 16]; + 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: - case 62: break; case 53: - r = [i.number, a, c, s]; + args = [header.number, data, position, end]; + break; + case 62: break; default: throw new Jbig2Error( - `segment type ${i.typeName}(${i.type}) is not implemented`, + `segment type ${header.typeName}(${header.type}) is not implemented`, ); } - const C = "on" + i.typeName; - C in t && t[C].apply(t, r); + const callbackName = "on" + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } } -function processSegments(e, t) { - for (let i = 0, a = e.length; i < a; i++) processSegment(e[i], t); +function processSegments(segments, visitor) { + for (let i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } +} +function parseJbig2Chunks(chunks) { + const visitor = new SimpleSegmentVisitor(); + 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); + } + return visitor.buffer; +} +function parseJbig2(data) { + throw new Error("Not implemented: parseJbig2"); } class SimpleSegmentVisitor { - onPageInformation(e) { - this.currentPageInfo = e; - const t = (e.width + 7) >> 3, - i = new Uint8ClampedArray(t * e.height); - e.defaultPixelValue && i.fill(255); - this.buffer = i; + onPageInformation(info) { + this.currentPageInfo = info; + const rowSize = (info.width + 7) >> 3; + const buffer = new Uint8ClampedArray(rowSize * info.height); + if (info.defaultPixelValue) { + buffer.fill(0xff); + } + this.buffer = buffer; } - drawBitmap(e, t) { - const i = this.currentPageInfo, - a = e.width, - s = e.height, - r = (i.width + 7) >> 3, - n = i.combinationOperatorOverride - ? e.combinationOperator - : i.combinationOperator, - g = this.buffer, - o = 128 >> (7 & e.x); - let c, - C, - h, - l, - Q = e.y * r + (e.x >> 3); - switch (n) { + 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; + switch (combinationOperator) { case 0: - for (c = 0; c < s; c++) { - h = o; - l = Q; - for (C = 0; C < a; C++) { - t[c][C] && (g[l] |= h); - h >>= 1; - if (!h) { - h = 128; - l++; + 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++; } } - Q += r; + offset0 += rowSize; } break; case 2: - for (c = 0; c < s; c++) { - h = o; - l = Q; - for (C = 0; C < a; C++) { - t[c][C] && (g[l] ^= h); - h >>= 1; - if (!h) { - h = 128; - l++; + 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++; } } - Q += r; + offset0 += rowSize; } break; default: - throw new Jbig2Error(`operator ${n} is not supported`); + throw new Jbig2Error( + `operator ${combinationOperator} is not supported`, + ); } } - onImmediateGenericRegion(e, t, i, a) { - const s = e.info, - r = new DecodingContext(t, i, a), - n = decodeBitmap( - e.mmr, - s.width, - s.height, - e.template, - e.prediction, - null, - e.at, - r, - ); - this.drawBitmap(s, n); + 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); } onImmediateLosslessGenericRegion() { this.onImmediateGenericRegion(...arguments); } - onSymbolDictionary(e, t, i, a, s, r) { - let n, g; - if (e.huffman) { - n = (function getSymbolDictionaryHuffmanTables(e, t, i) { - let a, - s, - r, - n, - g = 0; - switch (e.huffmanDHSelector) { - case 0: - case 1: - a = getStandardTable(e.huffmanDHSelector + 4); - break; - case 3: - a = getCustomHuffmanTable(g, t, i); - g++; - break; - default: - throw new Jbig2Error("invalid Huffman DH selector"); - } - switch (e.huffmanDWSelector) { - case 0: - case 1: - s = getStandardTable(e.huffmanDWSelector + 2); - break; - case 3: - s = getCustomHuffmanTable(g, t, i); - g++; - break; - default: - throw new Jbig2Error("invalid Huffman DW selector"); - } - if (e.bitmapSizeSelector) { - r = getCustomHuffmanTable(g, t, i); - g++; - } else r = getStandardTable(1); - n = e.aggregationInstancesSelector - ? getCustomHuffmanTable(g, t, i) - : getStandardTable(1); - return { - tableDeltaHeight: a, - tableDeltaWidth: s, - tableBitmapSize: r, - tableAggregateInstances: n, - }; - })(e, i, this.customTables); - g = new Reader(a, s, r); + 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); } - let o = this.symbols; - o || (this.symbols = o = {}); - const c = []; - for (const e of i) { - const t = o[e]; - t && c.push(...t); + let symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; } - const C = new DecodingContext(a, s, r); - o[t] = (function decodeSymbolDictionary( - e, - t, - i, - a, - s, - r, - n, - g, - o, - c, - C, - h, - ) { - if (e && t) - throw new Jbig2Error("symbol refinement with Huffman is not supported"); - const l = []; - let Q = 0, - E = log2(i.length + a); - const u = C.decoder, - d = C.contextCache; - let f, p; - if (e) { - f = getStandardTable(1); - p = []; - E = Math.max(E, 1); + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); } - for (; l.length < a; ) { - Q += e ? r.tableDeltaHeight.decode(h) : decodeInteger(d, "IADH", u); - let a = 0, - s = 0; - const f = e ? p.length : 0; - for (;;) { - const f = e - ? r.tableDeltaWidth.decode(h) - : decodeInteger(d, "IADW", u); - if (null === f) break; - a += f; - s += a; - let m; - if (t) { - const s = decodeInteger(d, "IAAI", u); - if (s > 1) - m = decodeTextRegion( - e, - t, - a, - Q, - 0, - s, - 1, - i.concat(l), - E, - 0, - 0, - 1, - 0, - r, - o, - c, - C, - 0, - h, - ); - else { - const e = decodeIAID(d, u, E), - t = decodeInteger(d, "IARDX", u), - s = decodeInteger(d, "IARDY", u); - m = decodeRefinement( - a, - Q, - o, - e < i.length ? i[e] : l[e - i.length], - t, - s, - !1, - c, - C, - ); - } - l.push(m); - } else if (e) p.push(a); - else { - m = decodeBitmap(!1, a, Q, n, !1, null, g, C); - l.push(m); - } - } - if (e && !t) { - const e = r.tableBitmapSize.decode(h); - h.byteAlign(); - let t; - if (0 === e) t = readUncompressedBitmap(h, s, Q); - else { - const i = h.end, - a = h.position + e; - h.end = a; - t = decodeMMRBitmap(h, s, Q, !1); - h.end = i; - h.position = a; - } - const i = p.length; - if (f === i - 1) l.push(t); - else { - let e, - a, - s, - r, - n, - g = 0; - for (e = f; e < i; e++) { - r = p[e]; - s = g + r; - n = []; - for (a = 0; a < Q; a++) n.push(t[a].subarray(g, s)); - l.push(n); - g = s; - } - } - } - } - const m = [], - y = []; - let w, - D, - b = !1; - const F = i.length + a; - for (; y.length < F; ) { - let t = e ? f.decode(h) : decodeInteger(d, "IAEX", u); - for (; t--; ) y.push(b); - b = !b; - } - for (w = 0, D = i.length; w < D; w++) y[w] && m.push(i[w]); - for (let e = 0; e < a; w++, e++) y[w] && m.push(l[e]); - return m; - })( - e.huffman, - e.refinement, - c, - e.numberOfNewSymbols, - e.numberOfExportedSymbols, - n, - e.template, - e.at, - e.refinementTemplate, - e.refinementAt, - C, - g, + } + 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, ); } - onImmediateTextRegion(e, t, i, a, s) { - const r = e.info; - let n, g; - const o = this.symbols, - c = []; - for (const e of t) { - const t = o[e]; - t && c.push(...t); + onImmediateTextRegion(region, referredSegments, data, start, end) { + const regionInfo = region.info; + let huffmanTables, huffmanInput; + const symbols = this.symbols; + const inputSymbols = []; + for (const referredSegment of referredSegments) { + const referredSymbols = symbols[referredSegment]; + if (referredSymbols) { + inputSymbols.push(...referredSymbols); + } } - const C = log2(c.length); - if (e.huffman) { - g = new Reader(i, a, s); - n = (function getTextRegionHuffmanTables(e, t, i, a, s) { - const r = []; - for (let e = 0; e <= 34; e++) { - const t = s.readBits(4); - r.push(new HuffmanLine([e, t, 0, 0])); - } - const n = new HuffmanTable(r, !1); - r.length = 0; - for (let e = 0; e < a; ) { - const t = n.decode(s); - if (t >= 32) { - let i, a, n; - switch (t) { - case 32: - if (0 === e) - throw new Jbig2Error("no previous value in symbol ID table"); - a = s.readBits(2) + 3; - i = r[e - 1].prefixLength; - break; - case 33: - a = s.readBits(3) + 3; - i = 0; - break; - case 34: - a = s.readBits(7) + 11; - i = 0; - break; - default: - throw new Jbig2Error("invalid code length in symbol ID table"); - } - for (n = 0; n < a; n++) { - r.push(new HuffmanLine([e, i, 0, 0])); - e++; - } - } else { - r.push(new HuffmanLine([e, t, 0, 0])); - e++; - } - } - s.byteAlign(); - const g = new HuffmanTable(r, !1); - let o, - c, - C, - h = 0; - switch (e.huffmanFS) { - case 0: - case 1: - o = getStandardTable(e.huffmanFS + 6); - break; - case 3: - o = getCustomHuffmanTable(h, t, i); - h++; - break; - default: - throw new Jbig2Error("invalid Huffman FS selector"); - } - switch (e.huffmanDS) { - case 0: - case 1: - case 2: - c = getStandardTable(e.huffmanDS + 8); - break; - case 3: - c = getCustomHuffmanTable(h, t, i); - h++; - break; - default: - throw new Jbig2Error("invalid Huffman DS selector"); - } - switch (e.huffmanDT) { - case 0: - case 1: - case 2: - C = getStandardTable(e.huffmanDT + 11); - break; - case 3: - C = getCustomHuffmanTable(h, t, i); - h++; - break; - default: - throw new Jbig2Error("invalid Huffman DT selector"); - } - if (e.refinement) - throw new Jbig2Error("refinement with Huffman is not supported"); - return { - symbolIDTable: g, - tableFirstS: o, - tableDeltaS: c, - tableDeltaT: C, - }; - })(e, t, this.customTables, c.length, g); - } - const h = new DecodingContext(i, a, s), - l = decodeTextRegion( - e.huffman, - e.refinement, - r.width, - r.height, - e.defaultPixelValue, - e.numberOfSymbolInstances, - e.stripSize, - c, - C, - e.transposed, - e.dsOffset, - e.referenceCorner, - e.combinationOperator, - n, - e.refinementTemplate, - e.refinementAt, - h, - e.logStripSize, - g, + const symbolCodeLength = log2(inputSymbols.length); + if (region.huffman) { + huffmanInput = new Reader(data, start, end); + huffmanTables = getTextRegionHuffmanTables( + region, + referredSegments, + this.customTables, + inputSymbols.length, + huffmanInput, ); - this.drawBitmap(r, l); + } + 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); } onImmediateLosslessTextRegion() { this.onImmediateTextRegion(...arguments); } - onPatternDictionary(e, t, i, a, s) { - let r = this.patterns; - r || (this.patterns = r = {}); - const n = new DecodingContext(i, a, s); - r[t] = (function decodePatternDictionary(e, t, i, a, s, r) { - const n = []; - if (!e) { - n.push({ x: -t, y: 0 }); - 0 === s && n.push({ x: -3, y: -1 }, { x: 2, y: -2 }, { x: -2, y: -2 }); - } - const g = decodeBitmap(e, (a + 1) * t, i, s, !1, null, n, r), - o = []; - for (let e = 0; e <= a; e++) { - const a = [], - s = t * e, - r = s + t; - for (let e = 0; e < i; e++) a.push(g[e].subarray(s, r)); - o.push(a); - } - return o; - })( - e.mmr, - e.patternWidth, - e.patternHeight, - e.maxPatternIndex, - e.template, - n, + 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(e, t, i, a, s) { - const r = this.patterns[t[0]], - n = e.info, - g = new DecodingContext(i, a, s), - o = (function decodeHalftoneRegion( - e, - t, - i, - a, - s, - r, - n, - g, - o, - c, - C, - h, - l, - Q, - E, - ) { - if (n) throw new Jbig2Error("skip is not supported"); - if (0 !== g) - throw new Jbig2Error( - `operator "${g}" is not supported in halftone region`, - ); - const u = []; - let d, f, p; - for (d = 0; d < s; d++) { - p = new Uint8Array(a); - if (r) for (f = 0; f < a; f++) p[f] = r; - u.push(p); - } - const m = t.length, - y = t[0], - w = y[0].length, - D = y.length, - b = log2(m), - F = []; - if (!e) { - F.push({ x: i <= 1 ? 3 : 2, y: -1 }); - 0 === i && - F.push({ x: -3, y: -1 }, { x: 2, y: -2 }, { x: -2, y: -2 }); - } - const S = []; - let k, R, N, G, x, U, M, L, H, J, Y; - e && (k = new Reader(E.data, E.start, E.end)); - for (d = b - 1; d >= 0; d--) { - R = e - ? decodeMMRBitmap(k, o, c, !0) - : decodeBitmap(!1, o, c, i, !1, null, F, E); - S[d] = R; - } - for (N = 0; N < c; N++) - for (G = 0; G < o; G++) { - x = 0; - U = 0; - for (f = b - 1; f >= 0; f--) { - x ^= S[f][N][G]; - U |= x << f; - } - M = t[U]; - L = (C + N * Q + G * l) >> 8; - H = (h + N * l - G * Q) >> 8; - if (L >= 0 && L + w <= a && H >= 0 && H + D <= s) - for (d = 0; d < D; d++) { - Y = u[H + d]; - J = M[d]; - for (f = 0; f < w; f++) Y[L + f] |= J[f]; - } - else { - let e, t; - for (d = 0; d < D; d++) { - t = H + d; - if (!(t < 0 || t >= s)) { - Y = u[t]; - J = M[d]; - for (f = 0; f < w; f++) { - e = L + f; - e >= 0 && e < a && (Y[e] |= J[f]); - } - } - } - } - } - return u; - })( - e.mmr, - r, - e.template, - n.width, - n.height, - e.defaultPixelValue, - e.enableSkip, - e.combinationOperator, - e.gridWidth, - e.gridHeight, - e.gridOffsetX, - e.gridOffsetY, - e.gridVectorX, - e.gridVectorY, - g, - ); - this.drawBitmap(n, o); + 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(...arguments); } - onTables(e, t, i, a) { - let s = this.customTables; - s || (this.customTables = s = {}); - s[e] = (function decodeTablesSegment(e, t, i) { - const a = e[t], - s = 4294967295 & readUint32(e, t + 1), - r = 4294967295 & readUint32(e, t + 5), - n = new Reader(e, t + 9, i), - g = 1 + ((a >> 1) & 7), - o = 1 + ((a >> 4) & 7), - c = []; - let C, - h, - l = s; - do { - C = n.readBits(g); - h = n.readBits(o); - c.push(new HuffmanLine([l, C, h, 0])); - l += 1 << h; - } while (l < r); - C = n.readBits(g); - c.push(new HuffmanLine([s - 1, C, 32, 0, "lower"])); - C = n.readBits(g); - c.push(new HuffmanLine([r, C, 32, 0])); - if (1 & a) { - C = n.readBits(g); - c.push(new HuffmanLine([C, 0])); - } - return new HuffmanTable(c, !1); - })(t, i, a); + onTables(currentSegment, data, start, end) { + let customTables = this.customTables; + if (!customTables) { + this.customTables = customTables = {}; + } + customTables[currentSegment] = decodeTablesSegment(data, start, end); } } class HuffmanLine { - constructor(e) { - if (2 === e.length) { - this.isOOB = !0; + constructor(lineData) { + if (lineData.length === 2) { + this.isOOB = true; this.rangeLow = 0; - this.prefixLength = e[0]; + this.prefixLength = lineData[0]; this.rangeLength = 0; - this.prefixCode = e[1]; - this.isLowerRange = !1; + this.prefixCode = lineData[1]; + this.isLowerRange = false; } else { - this.isOOB = !1; - this.rangeLow = e[0]; - this.prefixLength = e[1]; - this.rangeLength = e[2]; - this.prefixCode = e[3]; - this.isLowerRange = "lower" === e[4]; + this.isOOB = false; + this.rangeLow = lineData[0]; + this.prefixLength = lineData[1]; + this.rangeLength = lineData[2]; + this.prefixCode = lineData[3]; + this.isLowerRange = lineData[4] === "lower"; } } } class HuffmanTreeNode { - constructor(e) { + constructor(line) { this.children = []; - if (e) { - this.isLeaf = !0; - this.rangeLength = e.rangeLength; - this.rangeLow = e.rangeLow; - this.isLowerRange = e.isLowerRange; - this.isOOB = e.isOOB; - } else this.isLeaf = !1; - } - buildTree(e, t) { - const i = (e.prefixCode >> t) & 1; - if (t <= 0) this.children[i] = new HuffmanTreeNode(e); - else { - let a = this.children[i]; - a || (this.children[i] = a = new HuffmanTreeNode(null)); - a.buildTree(e, t - 1); + 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; } } - decodeNode(e) { + 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 t = e.readBits(this.rangeLength); - return this.rangeLow + (this.isLowerRange ? -t : t); + if (this.isOOB) { + return null; + } + const htOffset = reader.readBits(this.rangeLength); + return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); } - const t = this.children[e.readBit()]; - if (!t) throw new Jbig2Error("invalid Huffman data"); - return t.decodeNode(e); + const node = this.children[reader.readBit()]; + if (!node) { + throw new Jbig2Error("invalid Huffman data"); + } + return node.decodeNode(reader); } } class HuffmanTable { - constructor(e, t) { - t || this.assignPrefixCodes(e); + constructor(lines, prefixCodesDone) { + if (!prefixCodesDone) { + this.assignPrefixCodes(lines); + } this.rootNode = new HuffmanTreeNode(null); - for (let t = 0, i = e.length; t < i; t++) { - const i = e[t]; - i.prefixLength > 0 && this.rootNode.buildTree(i, i.prefixLength - 1); + 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); + } } } - decode(e) { - return this.rootNode.decodeNode(e); + decode(reader) { + return this.rootNode.decodeNode(reader); } - assignPrefixCodes(e) { - const t = e.length; - let i = 0; - for (let a = 0; a < t; a++) i = Math.max(i, e[a].prefixLength); - const a = new Uint32Array(i + 1); - for (let i = 0; i < t; i++) a[e[i].prefixLength]++; - let s, - r, - n, - g = 1, - o = 0; - a[0] = 0; - for (; g <= i; ) { - o = (o + a[g - 1]) << 1; - s = o; - r = 0; - for (; r < t; ) { - n = e[r]; - if (n.prefixLength === g) { - n.prefixCode = s; - s++; + 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); + for (let i = 0; i < linesLength; i++) { + histogram[lines[i].prefixLength]++; + } + let currentLength = 1, + firstCode = 0, + currentCode, + currentTemp, + line; + histogram[0] = 0; + 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++; } - r++; + currentTemp++; } - g++; + currentLength++; } } } -const _t = {}; -function getStandardTable(e) { - let t, - i = _t[e]; - if (i) return i; - switch (e) { +function decodeTablesSegment(data, start, end) { + const flags = data[start]; + const lowestValue = readUint32(data, start + 1) & 0xffffffff; + const highestValue = 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); + 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])); + if (flags & 1) { + prefixLength = reader.readBits(prefixSizeBits); + lines.push(new HuffmanLine([prefixLength, 0])); + } + return new HuffmanTable(lines, false); +} +const standardTablesCache = {}; +function getStandardTable(number) { + let table = standardTablesCache[number]; + if (table) { + return table; + } + let lines; + switch (number) { case 1: - t = [ - [0, 1, 4, 0], - [16, 2, 8, 2], - [272, 3, 16, 6], - [65808, 3, 32, 7], + lines = [ + [0, 1, 4, 0x0], + [16, 2, 8, 0x2], + [272, 3, 16, 0x6], + [65808, 3, 32, 0x7], ]; break; case 2: - t = [ - [0, 1, 0, 0], - [1, 2, 0, 2], - [2, 3, 0, 6], - [3, 4, 3, 14], - [11, 5, 6, 30], - [75, 6, 32, 62], - [6, 63], + 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; case 3: - t = [ - [-256, 8, 8, 254], - [0, 1, 0, 0], - [1, 2, 0, 2], - [2, 3, 0, 6], - [3, 4, 3, 14], - [11, 5, 6, 30], - [-257, 8, 32, 255, "lower"], - [75, 7, 32, 126], - [6, 62], + 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; case 4: - t = [ - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 0, 6], - [4, 4, 3, 14], - [12, 5, 6, 30], - [76, 5, 32, 31], + 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; case 5: - t = [ - [-255, 7, 8, 126], - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 0, 6], - [4, 4, 3, 14], - [12, 5, 6, 30], - [-256, 7, 32, 127, "lower"], - [76, 6, 32, 62], + 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; case 6: - t = [ - [-2048, 5, 10, 28], - [-1024, 4, 9, 8], - [-512, 4, 8, 9], - [-256, 4, 7, 10], - [-128, 5, 6, 29], - [-64, 5, 5, 30], - [-32, 4, 5, 11], - [0, 2, 7, 0], - [128, 3, 7, 2], - [256, 3, 8, 3], - [512, 4, 9, 12], - [1024, 4, 10, 13], - [-2049, 6, 32, 62, "lower"], - [2048, 6, 32, 63], + 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; case 7: - t = [ - [-1024, 4, 9, 8], - [-512, 3, 8, 0], - [-256, 4, 7, 9], - [-128, 5, 6, 26], - [-64, 5, 5, 27], - [-32, 4, 5, 10], - [0, 4, 5, 11], - [32, 5, 5, 28], - [64, 5, 6, 29], - [128, 4, 7, 12], - [256, 3, 8, 1], - [512, 3, 9, 2], - [1024, 3, 10, 3], - [-1025, 5, 32, 30, "lower"], - [2048, 5, 32, 31], + 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; case 8: - t = [ - [-15, 8, 3, 252], - [-7, 9, 1, 508], - [-5, 8, 1, 253], - [-3, 9, 0, 509], - [-2, 7, 0, 124], - [-1, 4, 0, 10], - [0, 2, 1, 0], - [2, 5, 0, 26], - [3, 6, 0, 58], - [4, 3, 4, 4], - [20, 6, 1, 59], - [22, 4, 4, 11], - [38, 4, 5, 12], - [70, 5, 6, 27], - [134, 5, 7, 28], - [262, 6, 7, 60], - [390, 7, 8, 125], - [646, 6, 10, 61], - [-16, 9, 32, 510, "lower"], - [1670, 9, 32, 511], - [2, 1], + 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: - t = [ - [-31, 8, 4, 252], - [-15, 9, 2, 508], - [-11, 8, 2, 253], - [-7, 9, 1, 509], - [-5, 7, 1, 124], - [-3, 4, 1, 10], - [-1, 3, 1, 2], - [1, 3, 1, 3], - [3, 5, 1, 26], - [5, 6, 1, 58], - [7, 3, 5, 4], - [39, 6, 2, 59], - [43, 4, 5, 11], - [75, 4, 6, 12], - [139, 5, 7, 27], - [267, 5, 8, 28], - [523, 6, 8, 60], - [779, 7, 9, 125], - [1291, 6, 11, 61], - [-32, 9, 32, 510, "lower"], - [3339, 9, 32, 511], - [2, 0], + 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; case 10: - t = [ - [-21, 7, 4, 122], - [-5, 8, 0, 252], - [-4, 7, 0, 123], - [-3, 5, 0, 24], - [-2, 2, 2, 0], - [2, 5, 0, 25], - [3, 6, 0, 54], - [4, 7, 0, 124], - [5, 8, 0, 253], - [6, 2, 6, 1], - [70, 5, 5, 26], - [102, 6, 5, 55], - [134, 6, 6, 56], - [198, 6, 7, 57], - [326, 6, 8, 58], - [582, 6, 9, 59], - [1094, 6, 10, 60], - [2118, 7, 11, 125], - [-22, 8, 32, 254, "lower"], - [4166, 8, 32, 255], - [2, 2], + 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; case 11: - t = [ - [1, 1, 0, 0], - [2, 2, 1, 2], - [4, 4, 0, 12], - [5, 4, 1, 13], - [7, 5, 1, 28], - [9, 5, 2, 29], - [13, 6, 2, 60], - [17, 7, 2, 122], - [21, 7, 3, 123], - [29, 7, 4, 124], - [45, 7, 5, 125], - [77, 7, 6, 126], - [141, 7, 32, 127], + 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: - t = [ - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 1, 6], - [5, 5, 0, 28], - [6, 5, 1, 29], - [8, 6, 1, 60], - [10, 7, 0, 122], - [11, 7, 1, 123], - [13, 7, 2, 124], - [17, 7, 3, 125], - [25, 7, 4, 126], - [41, 8, 5, 254], - [73, 8, 32, 255], + 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: - t = [ - [1, 1, 0, 0], - [2, 3, 0, 4], - [3, 4, 0, 12], - [4, 5, 0, 28], - [5, 4, 1, 13], - [7, 3, 3, 5], - [15, 6, 1, 58], - [17, 6, 2, 59], - [21, 6, 3, 60], - [29, 6, 4, 61], - [45, 6, 5, 62], - [77, 7, 6, 126], - [141, 7, 32, 127], + 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; case 14: - t = [ - [-2, 3, 0, 4], - [-1, 3, 0, 5], - [0, 1, 0, 0], - [1, 3, 0, 6], - [2, 3, 0, 7], + lines = [ + [-2, 3, 0, 0x4], + [-1, 3, 0, 0x5], + [0, 1, 0, 0x0], + [1, 3, 0, 0x6], + [2, 3, 0, 0x7], ]; break; case 15: - t = [ - [-24, 7, 4, 124], - [-8, 6, 2, 60], - [-4, 5, 1, 28], - [-2, 4, 0, 12], - [-1, 3, 0, 4], - [0, 1, 0, 0], - [1, 3, 0, 5], - [2, 4, 0, 13], - [3, 5, 1, 29], - [5, 6, 2, 61], - [9, 7, 4, 125], - [-25, 7, 32, 126, "lower"], - [25, 7, 32, 127], + 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; default: - throw new Jbig2Error(`standard table B.${e} does not exist`); + throw new Jbig2Error(`standard table B.${number} does not exist`); } - for (let e = 0, i = t.length; e < i; e++) t[e] = new HuffmanLine(t[e]); - i = new HuffmanTable(t, !0); - _t[e] = i; - return i; + for (let i = 0, ii = lines.length; i < ii; i++) { + lines[i] = new HuffmanLine(lines[i]); + } + table = new HuffmanTable(lines, true); + standardTablesCache[number] = table; + return table; } class Reader { - constructor(e, t, i) { - this.data = e; - this.start = t; - this.end = i; - this.position = t; + 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) + if (this.position >= this.end) { throw new Jbig2Error("end of data while reading bit"); + } this.currentByte = this.data[this.position++]; this.shift = 7; } - const e = (this.currentByte >> this.shift) & 1; + const bit = (this.currentByte >> this.shift) & 1; this.shift--; - return e; + return bit; } - readBits(e) { - let t, - i = 0; - for (t = e - 1; t >= 0; t--) i |= this.readBit() << t; - return i; + readBits(numBits) { + let result = 0, + i; + for (i = numBits - 1; i >= 0; i--) { + result |= this.readBit() << i; + } + return result; } byteAlign() { this.shift = -1; } next() { - return this.position >= this.end ? -1 : this.data[this.position++]; + if (this.position >= this.end) { + return -1; + } + return this.data[this.position++]; } } -function getCustomHuffmanTable(e, t, i) { - let a = 0; - for (let s = 0, r = t.length; s < r; s++) { - const r = i[t[s]]; - if (r) { - if (e === a) return r; - a++; +function getCustomHuffmanTable(index, referredTo, customTables) { + let currentIndex = 0; + for (let i = 0, ii = referredTo.length; i < ii; i++) { + const table = customTables[referredTo[i]]; + if (table) { + if (index === currentIndex) { + return table; + } + currentIndex++; } } throw new Jbig2Error("can't find custom Huffman table"); } -function readUncompressedBitmap(e, t, i) { - const a = []; - for (let s = 0; s < i; s++) { - const i = new Uint8Array(t); - a.push(i); - for (let a = 0; a < t; a++) i[a] = e.readBit(); - e.byteAlign(); +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])); } - return a; -} -function decodeMMRBitmap(e, t, i, a) { - const s = new CCITTFaxDecoder(e, { - K: -1, - Columns: t, - Rows: i, - BlackIs1: !0, - EndOfBlock: a, - }), - r = []; - let n, - g = !1; - for (let e = 0; e < i; e++) { - const e = new Uint8Array(t); - r.push(e); - let i = -1; - for (let a = 0; a < t; a++) { - if (i < 0) { - n = s.readNextChar(); - if (-1 === n) { - n = 0; - g = !0; - } - i = 7; + const runCodesTable = new HuffmanTable(codes, false); + codes.length = 0; + for (let i = 0; i < numberOfSymbols; ) { + const codeLength = runCodesTable.decode(reader); + if (codeLength >= 32) { + let repeatedLength, numberOfRepeats, j; + switch (codeLength) { + case 32: + if (i === 0) { + throw new Jbig2Error("no previous value in symbol ID table"); + } + numberOfRepeats = reader.readBits(2) + 3; + repeatedLength = codes[i - 1].prefixLength; + break; + case 33: + numberOfRepeats = reader.readBits(3) + 3; + repeatedLength = 0; + break; + case 34: + numberOfRepeats = reader.readBits(7) + 11; + repeatedLength = 0; + break; + default: + throw new Jbig2Error("invalid code length in symbol ID table"); } - e[a] = (n >> i) & 1; - i--; + 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++; } } - if (a && !g) { - const e = 5; - for (let t = 0; t < e && -1 !== s.readNextChar(); t++); + reader.byteAlign(); + const symbolIDTable = new HuffmanTable(codes, false); + let customIndex = 0, + tableFirstS, + tableDeltaS, + tableDeltaT; + switch (textRegion.huffmanFS) { + case 0: + case 1: + tableFirstS = getStandardTable(textRegion.huffmanFS + 6); + break; + case 3: + tableFirstS = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman FS selector"); } - return r; + switch (textRegion.huffmanDS) { + case 0: + case 1: + case 2: + tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); + break; + case 3: + tableDeltaS = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DS selector"); + } + switch (textRegion.huffmanDT) { + case 0: + case 1: + case 2: + tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); + break; + case 3: + tableDeltaT = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DT selector"); + } + if (textRegion.refinement) { + throw new Jbig2Error("refinement with Huffman is not supported"); + } + return { + symbolIDTable, + tableFirstS, + tableDeltaS, + tableDeltaT, + }; +} +function getSymbolDictionaryHuffmanTables( + dictionary, + referredTo, + customTables, +) { + let customIndex = 0, + tableDeltaHeight, + tableDeltaWidth; + 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"); + } + switch (dictionary.huffmanDWSelector) { + case 0: + case 1: + tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); + break; + case 3: + tableDeltaWidth = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + customIndex++; + break; + default: + throw new Jbig2Error("invalid Huffman DW selector"); + } + let tableBitmapSize, tableAggregateInstances; + if (dictionary.bitmapSizeSelector) { + tableBitmapSize = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + customIndex++; + } else { + tableBitmapSize = getStandardTable(1); + } + if (dictionary.aggregationInstancesSelector) { + tableAggregateInstances = getCustomHuffmanTable( + customIndex, + referredTo, + customTables, + ); + } else { + tableAggregateInstances = getStandardTable(1); + } + return { + tableDeltaHeight, + tableDeltaWidth, + tableBitmapSize, + tableAggregateInstances, + }; +} +function readUncompressedBitmap(reader, width, height) { + const bitmap = []; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + for (let x = 0; x < width; x++) { + row[x] = reader.readBit(); + } + reader.byteAlign(); + } + return bitmap; +} +function decodeMMRBitmap(input, width, height, endOfBlock) { + const params = { + K: -1, + Columns: width, + Rows: height, + BlackIs1: true, + EndOfBlock: endOfBlock, + }; + const decoder = new CCITTFaxDecoder(input, params); + const bitmap = []; + let currentByte, + eof = false; + for (let y = 0; y < height; y++) { + const row = new Uint8Array(width); + bitmap.push(row); + let shift = -1; + for (let x = 0; x < width; x++) { + if (shift < 0) { + currentByte = decoder.readNextChar(); + if (currentByte === -1) { + currentByte = 0; + eof = true; + } + shift = 7; + } + row[x] = (currentByte >> shift) & 1; + shift--; + } + } + if (endOfBlock && !eof) { + const lookForEOFLimit = 5; + for (let i = 0; i < lookForEOFLimit; i++) { + if (decoder.readNextChar() === -1) { + break; + } + } + } + return bitmap; } class Jbig2Image { - parseChunks(e) { - return (function parseJbig2Chunks(e) { - const t = new SimpleSegmentVisitor(); - for (let i = 0, a = e.length; i < a; i++) { - const a = e[i]; - processSegments(readSegments({}, a.data, a.start, a.end), t); - } - return t.buffer; - })(e); + parseChunks(chunks) { + return parseJbig2Chunks(chunks); } - parse(e) { + parse(data) { throw new Error("Not implemented: Jbig2Image.parse"); } -} +} // ./src/core/jbig2_stream.js + class Jbig2Stream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.stream = e; - this.dict = e.dict; - this.maybeLength = t; - this.params = i; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; } get bytes() { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } - ensureBuffer(e) {} + ensureBuffer(requested) {} readBlock() { this.decodeImage(); } - decodeImage(e) { - if (this.eof) return this.buffer; - e ||= this.bytes; - const t = new Jbig2Image(), - i = []; + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + const jbig2Image = new Jbig2Image(); + const chunks = []; if (this.params instanceof Dict) { - const e = this.params.get("JBIG2Globals"); - if (e instanceof BaseStream) { - const t = e.getBytes(); - i.push({ data: t, start: 0, end: t.length }); + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + const globals = globalsStream.getBytes(); + chunks.push({ + data: globals, + start: 0, + end: globals.length, + }); } } - i.push({ data: e, start: 0, end: e.length }); - const a = t.parseChunks(i), - s = a.length; - for (let e = 0; e < s; e++) a[e] ^= 255; - this.buffer = a; - this.bufferLength = s; - this.eof = !0; + chunks.push({ + data: bytes, + start: 0, + end: 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 this.buffer; } get canAsyncDecodeImageFromBuffer() { return this.stream.isAsync; } -} -function convertToRGBA(e) { - switch (e.kind) { - case D: - return convertBlackAndWhiteToRGBA(e); - case b: - return (function convertRGBToRGBA({ - src: e, - srcPos: t = 0, - dest: i, - destPos: a = 0, - width: s, - height: r, - }) { - let n = 0; - const g = e.length >> 2, - o = new Uint32Array(e.buffer, t, g); - if (FeatureTest.isLittleEndian) { - for (; n < g - 2; n += 3, a += 4) { - const e = o[n], - t = o[n + 1], - s = o[n + 2]; - i[a] = 4278190080 | e; - i[a + 1] = (e >>> 24) | (t << 8) | 4278190080; - i[a + 2] = (t >>> 16) | (s << 16) | 4278190080; - i[a + 3] = (s >>> 8) | 4278190080; - } - for (let t = 4 * n, s = e.length; t < s; t += 3) - i[a++] = e[t] | (e[t + 1] << 8) | (e[t + 2] << 16) | 4278190080; - } else { - for (; n < g - 2; n += 3, a += 4) { - const e = o[n], - t = o[n + 1], - s = o[n + 2]; - i[a] = 255 | e; - i[a + 1] = (e << 24) | (t >>> 8) | 255; - i[a + 2] = (t << 16) | (s >>> 16) | 255; - i[a + 3] = (s << 8) | 255; - } - for (let t = 4 * n, s = e.length; t < s; t += 3) - i[a++] = (e[t] << 24) | (e[t + 1] << 16) | (e[t + 2] << 8) | 255; - } - return { srcPos: t, destPos: a }; - })(e); +} // ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); } return null; } function convertBlackAndWhiteToRGBA({ - src: e, - srcPos: t = 0, - dest: i, - width: a, - height: s, - nonBlackColor: r = 4294967295, - inverseDecode: n = !1, + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false, }) { - const g = FeatureTest.isLittleEndian ? 4278190080 : 255, - [o, c] = n ? [r, g] : [g, r], - C = a >> 3, - h = 7 & a, - l = e.length; - i = new Uint32Array(i.buffer); - let Q = 0; - for (let a = 0; a < s; a++) { - for (const a = t + C; t < a; t++) { - const a = t < l ? e[t] : 255; - i[Q++] = 128 & a ? c : o; - i[Q++] = 64 & a ? c : o; - i[Q++] = 32 & a ? c : o; - i[Q++] = 16 & a ? c : o; - i[Q++] = 8 & a ? c : o; - i[Q++] = 4 & a ? c : o; - i[Q++] = 2 & a ? c : o; - i[Q++] = 1 & a ? c : o; + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode + ? [nonBlackColor, black] + : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & (1 << (7 - j)) ? oneMapping : zeroMapping; } - if (0 === h) continue; - const a = t < l ? e[t++] : 255; - for (let e = 0; e < h; e++) i[Q++] = a & (1 << (7 - e)) ? c : o; } - return { srcPos: t, destPos: Q }; + return { + srcPos, + destPos, + }; } -class JpegError extends rt { - constructor(e) { - super(e, "JpegError"); +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height, +}) { + let i = 0; + const len32 = src.length >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | 0xff000000; + dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | 0xff000000; + dest[destPos + 3] = (s3 >>> 8) | 0xff000000; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = + src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | 0xff; + dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | 0xff; + dest[destPos + 3] = (s3 << 8) | 0xff; + } + for (let j = i * 4, jj = src.length; j < jj; j += 3) { + dest[destPos++] = + (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | 0xff; + } + } + return { + srcPos, + destPos, + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = (src[i] * 0x10101) | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = (src[i] * 0x1010100) | 0x000000ff; + } + } +} // ./src/core/jpg.js + +class JpegError extends BaseException { + constructor(msg) { + super(msg, "JpegError"); } } -class DNLMarkerError extends rt { - constructor(e, t) { - super(e, "DNLMarkerError"); - this.scanLines = t; +class DNLMarkerError extends BaseException { + constructor(message, scanLines) { + super(message, "DNLMarkerError"); + this.scanLines = scanLines; } } -class EOIMarkerError extends rt { - constructor(e) { - super(e, "EOIMarkerError"); +class EOIMarkerError extends BaseException { + constructor(msg) { + super(msg, "EOIMarkerError"); } } -const $t = 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, - ]), - Ai = 4017, - ei = 799, - ti = 3406, - ii = 2276, - ai = 1567, - si = 3784, - ri = 5793, - ni = 2896; -function buildHuffmanTable(e, t) { - let i, - a, - s = 0, - r = 16; - for (; r > 0 && !e[r - 1]; ) r--; - const n = [{ children: [], index: 0 }]; - let g, - o = n[0]; - for (i = 0; i < r; i++) { - for (a = 0; a < e[i]; a++) { - o = n.pop(); - o.children[o.index] = t[s]; - for (; o.index > 0; ) o = n.pop(); - o.index++; - n.push(o); - for (; n.length <= i; ) { - n.push((g = { children: [], index: 0 })); - o.children[o.index] = g.children; - o = g; +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; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + const code = [ + { + children: [], + index: 0, + }, + ]; + let p = code[0], + q; + 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(); } - s++; + p.index++; + code.push(p); + while (code.length <= i) { + code.push( + (q = { + children: [], + index: 0, + }), + ); + p.children[p.index] = q.children; + p = q; + } + k++; } - if (i + 1 < r) { - n.push((g = { children: [], index: 0 })); - o.children[o.index] = g.children; - o = g; + if (i + 1 < length) { + code.push( + (q = { + children: [], + index: 0, + }), + ); + p.children[p.index] = q.children; + p = q; } } - return n[0].children; + return code[0].children; } -function getBlockBufferOffset(e, t, i) { - return 64 * ((e.blocksPerLine + 1) * t + i); +function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); } -function decodeScan(e, t, i, a, s, r, n, g, o, c = !1) { - const C = i.mcusPerLine, - h = i.progressive, - l = t; - let Q = 0, - E = 0; +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; function readBit() { - if (E > 0) { - E--; - return (Q >> E) & 1; + if (bitsCount > 0) { + bitsCount--; + return (bitsData >> bitsCount) & 1; } - Q = e[t++]; - if (255 === Q) { - const a = e[t++]; - if (a) { - if (220 === a && c) { - const a = readUint16(e, (t += 2)); - t += 2; - if (a > 0 && a !== i.scanLines) + bitsData = data[offset++]; + if (bitsData === 0xff) { + const nextByte = data[offset++]; + if (nextByte) { + if (nextByte === 0xdc && parseDNLMarker) { + offset += 2; + const scanLines = readUint16(data, offset); + offset += 2; + if (scanLines > 0 && scanLines !== frame.scanLines) { throw new DNLMarkerError( "Found DNL marker (0xFFDC) while parsing scan data", - a, + scanLines, ); - } else if (217 === a) { - if (c) { - const e = p * (8 === i.precision ? 8 : 0); - if (e > 0 && Math.round(i.scanLines / e) >= 5) + } + } else if (nextByte === 0xd9) { + if (parseDNLMarker) { + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); + if ( + maybeScanLines > 0 && + Math.round(frame.scanLines / maybeScanLines) >= 5 + ) { throw new DNLMarkerError( - "Found EOI marker (0xFFD9) while parsing scan data, possibly caused by incorrect `scanLines` parameter", - e, + "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", ); } - throw new JpegError(`unexpected marker ${((Q << 8) | a).toString(16)}`); + throw new JpegError( + `unexpected marker ${((bitsData << 8) | nextByte).toString(16)}`, + ); } } - E = 7; - return Q >>> 7; + bitsCount = 7; + return bitsData >>> 7; } - function decodeHuffman(e) { - let t = e; - for (;;) { - t = t[readBit()]; - switch (typeof t) { + function decodeHuffman(tree) { + let node = tree; + while (true) { + node = node[readBit()]; + switch (typeof node) { case "number": - return t; + return node; case "object": continue; } throw new JpegError("invalid huffman sequence"); } } - function receive(e) { - let t = 0; - for (; e > 0; ) { - t = (t << 1) | readBit(); - e--; + function receive(length) { + let n = 0; + while (length > 0) { + n = (n << 1) | readBit(); + length--; } - return t; + return n; } - function receiveAndExtend(e) { - if (1 === e) return 1 === readBit() ? 1 : -1; - const t = receive(e); - return t >= 1 << (e - 1) ? t : t + (-1 << e) + 1; - } - let u = 0; - let d, - f = 0; - let p = 0; - function decodeMcu(e, t, i, a, s) { - const r = i % C; - p = ((i / C) | 0) * e.v + a; - const n = r * e.h + s; - t(e, getBlockBufferOffset(e, p, n)); - } - function decodeBlock(e, t, i) { - p = (i / e.blocksPerLine) | 0; - const a = i % e.blocksPerLine; - t(e, getBlockBufferOffset(e, p, a)); - } - const m = a.length; - let y, w, D, b, F, S; - S = h - ? 0 === r - ? 0 === g - ? function decodeDCFirst(e, t) { - const i = decodeHuffman(e.huffmanTableDC), - a = 0 === i ? 0 : receiveAndExtend(i) << o; - e.blockData[t] = e.pred += a; - } - : function decodeDCSuccessive(e, t) { - e.blockData[t] |= readBit() << o; - } - : 0 === g - ? function decodeACFirst(e, t) { - if (u > 0) { - u--; - return; - } - let i = r; - const a = n; - for (; i <= a; ) { - const a = decodeHuffman(e.huffmanTableAC), - s = 15 & a, - r = a >> 4; - if (0 === s) { - if (r < 15) { - u = receive(r) + (1 << r) - 1; - break; - } - i += 16; - continue; - } - i += r; - const n = $t[i]; - e.blockData[t + n] = receiveAndExtend(s) * (1 << o); - i++; - } - } - : function decodeACSuccessive(e, t) { - let i = r; - const a = n; - let s, - g, - c = 0; - for (; i <= a; ) { - const a = t + $t[i], - r = e.blockData[a] < 0 ? -1 : 1; - switch (f) { - case 0: - g = decodeHuffman(e.huffmanTableAC); - s = 15 & g; - c = g >> 4; - if (0 === s) - if (c < 15) { - u = receive(c) + (1 << c); - f = 4; - } else { - c = 16; - f = 1; - } - else { - if (1 !== s) throw new JpegError("invalid ACn encoding"); - d = receiveAndExtend(s); - f = c ? 2 : 3; - } - continue; - case 1: - case 2: - if (e.blockData[a]) e.blockData[a] += r * (readBit() << o); - else { - c--; - 0 === c && (f = 2 === f ? 3 : 0); - } - break; - case 3: - if (e.blockData[a]) e.blockData[a] += r * (readBit() << o); - else { - e.blockData[a] = d << o; - f = 0; - } - break; - case 4: - e.blockData[a] && (e.blockData[a] += r * (readBit() << o)); - } - i++; - } - if (4 === f) { - u--; - 0 === u && (f = 0); - } - } - : function decodeBaseline(e, t) { - const i = decodeHuffman(e.huffmanTableDC), - a = 0 === i ? 0 : receiveAndExtend(i); - e.blockData[t] = e.pred += a; - let s = 1; - for (; s < 64; ) { - const i = decodeHuffman(e.huffmanTableAC), - a = 15 & i, - r = i >> 4; - if (0 === a) { - if (r < 15) break; - s += 16; - continue; - } - s += r; - const n = $t[s]; - e.blockData[t + n] = receiveAndExtend(a); - s++; - } - }; - let k, - R = 0; - const N = - 1 === m ? a[0].blocksPerLine * a[0].blocksPerColumn : C * i.mcusPerColumn; - let G, x; - for (; R <= N; ) { - const i = s ? Math.min(N - R, s) : N; - if (i > 0) { - for (w = 0; w < m; w++) a[w].pred = 0; - u = 0; - if (1 === m) { - y = a[0]; - for (F = 0; F < i; F++) { - decodeBlock(y, S, R); - R++; - } - } else - for (F = 0; F < i; F++) { - for (w = 0; w < m; w++) { - y = a[w]; - G = y.h; - x = y.v; - for (D = 0; D < x; D++) - for (b = 0; b < G; b++) decodeMcu(y, S, R, D, b); - } - R++; - } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; } - E = 0; - k = findNextFileMarker(e, t); - if (!k) break; - if (k.invalid) { + const n = receive(length); + if (n >= 1 << (length - 1)) { + return n; + } + return n + (-1 << length) + 1; + } + 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; + while (k < 64) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, blockOffset) { + const t = decodeHuffman(component.huffmanTableDC); + const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[blockOffset] = component.pred += diff; + } + function decodeDCSuccessive(component, blockOffset) { + component.blockData[blockOffset] |= readBit() << successive; + } + let eobrun = 0; + function decodeACFirst(component, blockOffset) { + if (eobrun > 0) { + eobrun--; + return; + } + let k = spectralStart; + const e = spectralEnd; + while (k <= e) { + const rs = decodeHuffman(component.huffmanTableAC); + const s = rs & 15, + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + const z = dctZigZag[k]; + component.blockData[blockOffset + z] = + receiveAndExtend(s) * (1 << successive); + k++; + } + } + let successiveACState = 0, + successiveACNextValue; + function decodeACSuccessive(component, blockOffset) { + let k = spectralStart; + const e = spectralEnd; + let r = 0; + let s; + let rs; + while (k <= e) { + const offsetZ = blockOffset + dctZigZag[k]; + const sign = component.blockData[offsetZ] < 0 ? -1 : 1; + 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"); + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + case 2: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + case 3: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } else { + component.blockData[offsetZ] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (component.blockData[offsetZ]) { + component.blockData[offsetZ] += sign * (readBit() << successive); + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + let blockRow = 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); + } + function decodeBlock(component, decode, mcu) { + blockRow = (mcu / component.blocksPerLine) | 0; + const blockCol = mcu % component.blocksPerLine; + const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, blockOffset); + } + const componentsLength = components.length; + let component, i, j, k, n; + let decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + let mcu = 0, + fileMarker; + const mcuExpected = + componentsLength === 1 + ? components[0].blocksPerLine * components[0].blocksPerColumn + : mcusPerLine * frame.mcusPerColumn; + let h, v; + while (mcu <= mcuExpected) { + const mcuToRead = resetInterval + ? Math.min(mcuExpected - mcu, resetInterval) + : mcuExpected; + if (mcuToRead > 0) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + 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); + } + } + } + mcu++; + } + } + } + bitsCount = 0; + fileMarker = findNextFileMarker(data, offset); + if (!fileMarker) { + break; + } + if (fileMarker.invalid) { + const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; warn( - `decodeScan - ${i > 0 ? "unexpected" : "excessive"} MCU data, current marker is: ${k.invalid}`, + `decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`, ); - t = k.offset; + offset = fileMarker.offset; } - if (!(k.marker >= 65488 && k.marker <= 65495)) break; - t += 2; - } - return t - l; -} -function quantizeAndInverse(e, t, i) { - const a = e.quantizationTable, - s = e.blockData; - let r, n, g, o, c, C, h, l, Q, E, u, d, f, p, m, y, w; - if (!a) throw new JpegError("missing required Quantization Table."); - for (let e = 0; e < 64; e += 8) { - Q = s[t + e]; - E = s[t + e + 1]; - u = s[t + e + 2]; - d = s[t + e + 3]; - f = s[t + e + 4]; - p = s[t + e + 5]; - m = s[t + e + 6]; - y = s[t + e + 7]; - Q *= a[e]; - if (0 != (E | u | d | f | p | m | y)) { - E *= a[e + 1]; - u *= a[e + 2]; - d *= a[e + 3]; - f *= a[e + 4]; - p *= a[e + 5]; - m *= a[e + 6]; - y *= a[e + 7]; - r = (ri * Q + 128) >> 8; - n = (ri * f + 128) >> 8; - g = u; - o = m; - c = (ni * (E - y) + 128) >> 8; - l = (ni * (E + y) + 128) >> 8; - C = d << 4; - h = p << 4; - r = (r + n + 1) >> 1; - n = r - n; - w = (g * si + o * ai + 128) >> 8; - g = (g * ai - o * si + 128) >> 8; - o = w; - c = (c + h + 1) >> 1; - h = c - h; - l = (l + C + 1) >> 1; - C = l - C; - r = (r + o + 1) >> 1; - o = r - o; - n = (n + g + 1) >> 1; - g = n - g; - w = (c * ii + l * ti + 2048) >> 12; - c = (c * ti - l * ii + 2048) >> 12; - l = w; - w = (C * ei + h * Ai + 2048) >> 12; - C = (C * Ai - h * ei + 2048) >> 12; - h = w; - i[e] = r + l; - i[e + 7] = r - l; - i[e + 1] = n + h; - i[e + 6] = n - h; - i[e + 2] = g + C; - i[e + 5] = g - C; - i[e + 3] = o + c; - i[e + 4] = o - c; + if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { + offset += 2; } else { - w = (ri * Q + 512) >> 10; - i[e] = w; - i[e + 1] = w; - i[e + 2] = w; - i[e + 3] = w; - i[e + 4] = w; - i[e + 5] = w; - i[e + 6] = w; - i[e + 7] = w; + break; } } - for (let e = 0; e < 8; ++e) { - Q = i[e]; - E = i[e + 8]; - u = i[e + 16]; - d = i[e + 24]; - f = i[e + 32]; - p = i[e + 40]; - m = i[e + 48]; - y = i[e + 56]; - if (0 != (E | u | d | f | p | m | y)) { - r = (ri * Q + 2048) >> 12; - n = (ri * f + 2048) >> 12; - g = u; - o = m; - c = (ni * (E - y) + 2048) >> 12; - l = (ni * (E + y) + 2048) >> 12; - C = d; - h = p; - r = 4112 + ((r + n + 1) >> 1); - n = r - n; - w = (g * si + o * ai + 2048) >> 12; - g = (g * ai - o * si + 2048) >> 12; - o = w; - c = (c + h + 1) >> 1; - h = c - h; - l = (l + C + 1) >> 1; - C = l - C; - r = (r + o + 1) >> 1; - o = r - o; - n = (n + g + 1) >> 1; - g = n - g; - w = (c * ii + l * ti + 2048) >> 12; - c = (c * ti - l * ii + 2048) >> 12; - l = w; - w = (C * ei + h * Ai + 2048) >> 12; - C = (C * Ai - h * ei + 2048) >> 12; - h = w; - Q = r + l; - y = r - l; - E = n + h; - m = n - h; - u = g + C; - p = g - C; - d = o + c; - f = o - c; - Q < 16 ? (Q = 0) : Q >= 4080 ? (Q = 255) : (Q >>= 4); - E < 16 ? (E = 0) : E >= 4080 ? (E = 255) : (E >>= 4); - u < 16 ? (u = 0) : u >= 4080 ? (u = 255) : (u >>= 4); - d < 16 ? (d = 0) : d >= 4080 ? (d = 255) : (d >>= 4); - f < 16 ? (f = 0) : f >= 4080 ? (f = 255) : (f >>= 4); - p < 16 ? (p = 0) : p >= 4080 ? (p = 255) : (p >>= 4); - m < 16 ? (m = 0) : m >= 4080 ? (m = 255) : (m >>= 4); - y < 16 ? (y = 0) : y >= 4080 ? (y = 255) : (y >>= 4); - s[t + e] = Q; - s[t + e + 8] = E; - s[t + e + 16] = u; - s[t + e + 24] = d; - s[t + e + 32] = f; - s[t + e + 40] = p; - s[t + e + 48] = m; - s[t + e + 56] = y; + return offset - startOffset; +} +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 { - w = (ri * Q + 8192) >> 14; - w = w < -2040 ? 0 : w >= 2024 ? 255 : (w + 2056) >> 4; - s[t + e] = w; - s[t + e + 8] = w; - s[t + e + 16] = w; - s[t + e + 24] = w; - s[t + e + 32] = w; - s[t + e + 40] = w; - s[t + e + 48] = w; - s[t + e + 56] = w; + p0 >>= 4; } + if (p1 < 16) { + p1 = 0; + } else if (p1 >= 4080) { + p1 = 255; + } else { + p1 >>= 4; + } + if (p2 < 16) { + p2 = 0; + } else if (p2 >= 4080) { + p2 = 255; + } else { + p2 >>= 4; + } + if (p3 < 16) { + p3 = 0; + } else if (p3 >= 4080) { + p3 = 255; + } else { + p3 >>= 4; + } + if (p4 < 16) { + p4 = 0; + } else if (p4 >= 4080) { + p4 = 255; + } else { + p4 >>= 4; + } + if (p5 < 16) { + p5 = 0; + } else if (p5 >= 4080) { + p5 = 255; + } else { + p5 >>= 4; + } + if (p6 < 16) { + p6 = 0; + } else if (p6 >= 4080) { + p6 = 255; + } else { + p6 >>= 4; + } + if (p7 < 16) { + p7 = 0; + } else if (p7 >= 4080) { + p7 = 255; + } else { + p7 >>= 4; + } + 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; } } -function buildComponentData(e, t) { - const i = t.blocksPerLine, - a = t.blocksPerColumn, - s = new Int16Array(64); - for (let e = 0; e < a; e++) - for (let a = 0; a < i; a++) { - quantizeAndInverse(t, getBlockBufferOffset(t, e, a), s); +function buildComponentData(frame, component) { + const blocksPerLine = component.blocksPerLine; + const blocksPerColumn = component.blocksPerColumn; + const computationBuffer = new Int16Array(64); + for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { + const offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); } - return t.blockData; -} -function findNextFileMarker(e, t, i = t) { - const a = e.length - 1; - let s = i < t ? i : t; - if (t >= a) return null; - const r = readUint16(e, t); - if (r >= 65472 && r <= 65534) return { invalid: null, marker: r, offset: t }; - let n = readUint16(e, s); - for (; !(n >= 65472 && n <= 65534); ) { - if (++s >= a) return null; - n = readUint16(e, s); } - return { invalid: r.toString(16), marker: n, offset: s }; + return component.blockData; +} +function findNextFileMarker(data, currentPos, startPos = currentPos) { + const maxPos = data.length - 1; + let newPos = startPos < currentPos ? startPos : currentPos; + if (currentPos >= maxPos) { + return null; + } + const currentMarker = readUint16(data, currentPos); + if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { + return { + invalid: null, + marker: currentMarker, + offset: currentPos, + }; + } + let newMarker = readUint16(data, newPos); + while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { + if (++newPos >= maxPos) { + return null; + } + newMarker = readUint16(data, newPos); + } + return { + invalid: currentMarker.toString(16), + marker: newMarker, + offset: newPos, + }; +} +function prepareComponents(frame) { + const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (const component of frame.components) { + 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; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; +} +function readDataBlock(data, offset) { + const length = readUint16(data, offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + warn( + "readDataBlock - incorrect length, current marker is: " + + fileMarker.invalid, + ); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + offset += array.length; + return { + appData: array, + newOffset: offset, + }; +} +function skipData(data, offset) { + const length = readUint16(data, offset); + offset += 2; + const endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, endOffset, offset); + if (fileMarker?.invalid) { + return fileMarker.offset; + } + return endOffset; } class JpegImage { - constructor({ decodeTransform: e = null, colorTransform: t = -1 } = {}) { - this._decodeTransform = e; - this._colorTransform = t; + constructor({ decodeTransform = null, colorTransform = -1 } = {}) { + this._decodeTransform = decodeTransform; + this._colorTransform = colorTransform; } - parse(e, { dnlScanLines: t = null } = {}) { - function readDataBlock() { - const t = readUint16(e, s); - s += 2; - let i = s + t - 2; - const a = findNextFileMarker(e, i, s); - if (a?.invalid) { - warn( - "readDataBlock - incorrect length, current marker is: " + a.invalid, - ); - i = a.offset; - } - const r = e.subarray(s, i); - s += r.length; - return r; + static canUseImageDecoder(data, colorTransform = -1) { + let offset = 0; + let numComponents = null; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); } - function prepareComponents(e) { - const t = Math.ceil(e.samplesPerLine / 8 / e.maxH), - i = Math.ceil(e.scanLines / 8 / e.maxV); - for (const a of e.components) { - const s = Math.ceil((Math.ceil(e.samplesPerLine / 8) * a.h) / e.maxH), - r = Math.ceil((Math.ceil(e.scanLines / 8) * a.v) / e.maxV), - n = t * a.h, - g = 64 * (i * a.v) * (n + 1); - a.blockData = new Int16Array(g); - a.blocksPerLine = s; - a.blocksPerColumn = r; - } - e.mcusPerLine = t; - e.mcusPerColumn = i; - } - let i, - a, - s = 0, - r = null, - n = null, - g = 0; - const o = [], - c = [], - C = []; - let h = readUint16(e, s); - s += 2; - if (65496 !== h) throw new JpegError("SOI not found"); - h = readUint16(e, s); - s += 2; - A: for (; 65497 !== h; ) { - let l, Q, E; - switch (h) { - case 65504: - case 65505: - case 65506: - case 65507: - case 65508: - case 65509: - case 65510: - case 65511: - case 65512: - case 65513: - case 65514: - case 65515: - case 65516: - case 65517: - case 65518: - case 65519: - case 65534: - const u = readDataBlock(); - 65504 === h && - 74 === u[0] && - 70 === u[1] && - 73 === u[2] && - 70 === u[3] && - 0 === u[4] && - (r = { - version: { major: u[5], minor: u[6] }, - densityUnits: u[7], - xDensity: (u[8] << 8) | u[9], - yDensity: (u[10] << 8) | u[11], - thumbWidth: u[12], - thumbHeight: u[13], - thumbData: u.subarray(14, 14 + 3 * u[12] * u[13]), - }); - 65518 === h && - 65 === u[0] && - 100 === u[1] && - 111 === u[2] && - 98 === u[3] && - 101 === u[4] && - (n = { - version: (u[5] << 8) | u[6], - flags0: (u[7] << 8) | u[8], - flags1: (u[9] << 8) | u[10], - transformCode: u[11], - }); - break; - case 65499: - const d = readUint16(e, s); - s += 2; - const f = d + s - 2; - let p; - for (; s < f; ) { - const t = e[s++], - i = new Uint16Array(64); - if (t >> 4 == 0) - for (Q = 0; Q < 64; Q++) { - p = $t[Q]; - i[p] = e[s++]; - } - else { - if (t >> 4 != 1) throw new JpegError("DQT - invalid table spec"); - for (Q = 0; Q < 64; Q++) { - p = $t[Q]; - i[p] = readUint16(e, s); - s += 2; - } - } - o[15 & t] = i; + fileMarker = readUint16(data, offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + switch (fileMarker) { + case 0xffc0: + case 0xffc1: + case 0xffc2: + numComponents = data[offset + (2 + 1 + 2 + 2)]; + break markerLoop; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; } break; - case 65472: - case 65473: - case 65474: - if (i) throw new JpegError("Only single frame JPEGs supported"); - s += 2; - i = {}; - i.extended = 65473 === h; - i.progressive = 65474 === h; - i.precision = e[s++]; - const m = readUint16(e, s); - s += 2; - i.scanLines = t || m; - i.samplesPerLine = readUint16(e, s); - s += 2; - i.components = []; - i.componentIds = {}; - const y = e[s++]; - let w = 0, - D = 0; - for (l = 0; l < y; l++) { - const t = e[s], - a = e[s + 1] >> 4, - r = 15 & e[s + 1]; - w < a && (w = a); - D < r && (D = r); - const n = e[s + 2]; - E = i.components.push({ - h: a, - v: r, - quantizationId: n, + } + offset = skipData(data, offset); + fileMarker = readUint16(data, offset); + offset += 2; + } + if (numComponents === 4) { + return false; + } + if (numComponents === 3 && colorTransform === 0) { + return false; + } + return true; + } + parse(data, { dnlScanLines = null } = {}) { + let offset = 0; + let jfif = null; + let adobe = null; + let frame, resetInterval; + let numSOSMarkers = 0; + const quantizationTables = []; + const huffmanTablesAC = [], + huffmanTablesDC = []; + let fileMarker = readUint16(data, offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); + } + fileMarker = 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, newOffset } = readDataBlock(data, offset); + offset = newOffset; + 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 (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], + }; + } + } + break; + case 0xffdb: + const quantizationTablesLength = readUint16(data, offset); + offset += 2; + const quantizationTablesEnd = quantizationTablesLength + offset - 2; + let z; + while (offset < quantizationTablesEnd) { + const quantizationTableSpec = data[offset++]; + const tableData = new Uint16Array(64); + 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] = readUint16(data, offset); + offset += 2; + } + } else { + throw new JpegError("DQT - invalid table spec"); + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 0xffc0: + case 0xffc1: + case 0xffc2: + if (frame) { + throw new JpegError("Only single frame JPEGs supported"); + } + offset += 2; + frame = {}; + frame.extended = fileMarker === 0xffc1; + frame.progressive = fileMarker === 0xffc2; + frame.precision = data[offset++]; + const sofScanLines = readUint16(data, offset); + offset += 2; + frame.scanLines = dnlScanLines || sofScanLines; + frame.samplesPerLine = 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 (maxV < v) { + maxV = v; + } + const qId = data[offset + 2]; + l = frame.components.push({ + h, + v, + quantizationId: qId, quantizationTable: null, }); - i.componentIds[t] = E - 1; - s += 3; + frame.componentIds[componentId] = l - 1; + offset += 3; } - i.maxH = w; - i.maxV = D; - prepareComponents(i); + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); break; - case 65476: - const b = readUint16(e, s); - s += 2; - for (l = 2; l < b; ) { - const t = e[s++], - i = new Uint8Array(16); - let a = 0; - for (Q = 0; Q < 16; Q++, s++) a += i[Q] = e[s]; - const r = new Uint8Array(a); - for (Q = 0; Q < a; Q++, s++) r[Q] = e[s]; - l += 17 + a; - (t >> 4 == 0 ? C : c)[15 & t] = buildHuffmanTable(i, r); + case 0xffc4: + const huffmanLength = readUint16(data, offset); + offset += 2; + for (i = 2; i < huffmanLength; ) { + const huffmanTableSpec = data[offset++]; + const codeLengths = new Uint8Array(16); + let codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + const huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[ + huffmanTableSpec & 15 + ] = buildHuffmanTable(codeLengths, huffmanValues); } break; - case 65501: - s += 2; - a = readUint16(e, s); - s += 2; + case 0xffdd: + offset += 2; + resetInterval = readUint16(data, offset); + offset += 2; break; - case 65498: - const F = 1 == ++g && !t; - s += 2; - const S = e[s++], - k = []; - for (l = 0; l < S; l++) { - const t = e[s++], - a = i.componentIds[t], - r = i.components[a]; - r.index = t; - const n = e[s++]; - r.huffmanTableDC = C[n >> 4]; - r.huffmanTableAC = c[15 & n]; - k.push(r); + 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); } - const R = e[s++], - N = e[s++], - G = e[s++]; + const spectralStart = data[offset++], + spectralEnd = data[offset++], + successiveApproximation = data[offset++]; try { - const t = decodeScan(e, s, i, k, a, R, N, G >> 4, 15 & G, F); - s += t; - } catch (t) { - if (t instanceof DNLMarkerError) { - warn(`${t.message} -- attempting to re-parse the JPEG image.`); - return this.parse(e, { dnlScanLines: t.scanLines }); + const processed = decodeScan( + data, + offset, + frame, + components, + resetInterval, + spectralStart, + spectralEnd, + successiveApproximation >> 4, + successiveApproximation & 15, + parseDNLMarker, + ); + offset += processed; + } catch (ex) { + if (ex instanceof DNLMarkerError) { + warn(`${ex.message} -- attempting to re-parse the JPEG image.`); + return this.parse(data, { + dnlScanLines: ex.scanLines, + }); + } else if (ex instanceof EOIMarkerError) { + warn(`${ex.message} -- ignoring the rest of the image data.`); + break markerLoop; } - if (t instanceof EOIMarkerError) { - warn(`${t.message} -- ignoring the rest of the image data.`); - break A; - } - throw t; + throw ex; } break; - case 65500: - s += 4; + case 0xffdc: + offset += 4; break; - case 65535: - 255 !== e[s] && s--; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } break; default: - const x = findNextFileMarker(e, s - 2, s - 3); - if (x?.invalid) { + const nextFileMarker = findNextFileMarker( + data, + offset - 2, + offset - 3, + ); + if (nextFileMarker?.invalid) { warn( "JpegImage.parse - unexpected data, current marker is: " + - x.invalid, + nextFileMarker.invalid, ); - s = x.offset; + offset = nextFileMarker.offset; break; } - if (!x || s >= e.length - 1) { + if (!nextFileMarker || offset >= data.length - 1) { warn( - "JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).", + "JpegImage.parse - reached the end of the image data " + + "without finding an EOI marker (0xFFD9).", ); - break A; + break markerLoop; } throw new JpegError( - "JpegImage.parse - unknown marker: " + h.toString(16), + "JpegImage.parse - unknown marker: " + fileMarker.toString(16), ); } - h = readUint16(e, s); - s += 2; + fileMarker = readUint16(data, offset); + offset += 2; } - if (!i) throw new JpegError("JpegImage.parse - no frame data found."); - this.width = i.samplesPerLine; - this.height = i.scanLines; - this.jfif = r; - this.adobe = n; + if (!frame) { + throw new JpegError("JpegImage.parse - no frame data found."); + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; this.components = []; - for (const e of i.components) { - const t = o[e.quantizationId]; - t && (e.quantizationTable = t); + for (const component of frame.components) { + const quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } this.components.push({ - index: e.index, - output: buildComponentData(0, e), - scaleX: e.h / i.maxH, - scaleY: e.v / i.maxV, - blocksPerLine: e.blocksPerLine, - blocksPerColumn: e.blocksPerColumn, + index: component.index, + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn, }); } this.numComponents = this.components.length; + return undefined; } - _getLinearizedBlockData(e, t, i = !1) { - const a = this.width / e, - s = this.height / t; - let r, - n, - g, - o, - c, - C, - h, - l, - Q, - E, - u, - d = 0; - const f = this.components.length, - p = e * t * f, - m = new Uint8ClampedArray(p), - y = new Uint32Array(e), - w = 4294967288; - let D; - for (h = 0; h < f; h++) { - r = this.components[h]; - n = r.scaleX * a; - g = r.scaleY * s; - d = h; - u = r.output; - o = (r.blocksPerLine + 1) << 3; - if (n !== D) { - for (c = 0; c < e; c++) { - l = 0 | (c * n); - y[c] = ((l & w) << 3) | (7 & l); + _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; + 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 (componentScaleX !== lastComponentScaleX) { + for (x = 0; x < width; x++) { + j = 0 | (x * componentScaleX); + xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); } - D = n; + lastComponentScaleX = componentScaleX; } - for (C = 0; C < t; C++) { - l = 0 | (C * g); - E = (o * (l & w)) | ((7 & l) << 3); - for (c = 0; c < e; c++) { - m[d] = u[E + y[c]]; - d += f; + for (y = 0; y < height; y++) { + j = 0 | (y * componentScaleY); + index = (blocksPerScanline * (j & mask3LSB)) | ((j & 7) << 3); + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; } } } - let b = this._decodeTransform; - i || - 4 !== f || - b || - (b = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255])); - if (b) - for (h = 0; h < p; ) - for (l = 0, Q = 0; l < f; l++, h++, Q += 2) - m[h] = ((m[h] * b[Q]) >> 8) + b[Q + 1]; - return m; + let transform = this._decodeTransform; + if (!isSourcePDF && numComponents === 4 && !transform) { + transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); + } + 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 data; } get _isColorConversionNeeded() { - return this.adobe - ? !!this.adobe.transformCode - : 3 === this.numComponents - ? 0 !== this._colorTransform && - (82 !== this.components[0].index || - 71 !== this.components[1].index || - 66 !== this.components[2].index) - : 1 === this._colorTransform; - } - _convertYccToRgb(e) { - let t, i, a; - for (let s = 0, r = e.length; s < r; s += 3) { - t = e[s]; - i = e[s + 1]; - a = e[s + 2]; - e[s] = t - 179.456 + 1.402 * a; - e[s + 1] = t + 135.459 - 0.344 * i - 0.714 * a; - e[s + 2] = t - 226.816 + 1.772 * i; + if (this.adobe) { + return !!this.adobe.transformCode; } - return e; - } - _convertYccToRgba(e, t) { - for (let i = 0, a = 0, s = e.length; i < s; i += 3, a += 4) { - const s = e[i], - r = e[i + 1], - n = e[i + 2]; - t[a] = s - 179.456 + 1.402 * n; - t[a + 1] = s + 135.459 - 0.344 * r - 0.714 * n; - t[a + 2] = s - 226.816 + 1.772 * r; - t[a + 3] = 255; + 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; + } + return true; } - return t; + if (this._colorTransform === 1) { + return true; + } + return false; } - _convertYcckToRgb(e) { - let t, - i, - a, - s, - r = 0; - for (let n = 0, g = e.length; n < g; n += 4) { - t = e[n]; - i = e[n + 1]; - a = e[n + 2]; - s = e[n + 3]; - e[r++] = - i * - (-660635669420364e-19 * i + - 0.000437130475926232 * a - - 54080610064599e-18 * t + - 0.00048449797120281 * s - - 0.154362151871126) - - 122.67195406894 + - a * - (-0.000957964378445773 * a + - 0.000817076911346625 * t - - 0.00477271405408747 * s + + _convertYccToRgb(data) { + let Y, Cb, Cr; + 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; + } + return data; + } + _convertYccToRgba(data, out) { + for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + out[j] = Y - 179.456 + 1.402 * Cr; + out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; + out[j + 2] = Y - 226.816 + 1.772 * Cb; + out[j + 3] = 255; + } + return out; + } + _convertYcckToRgb(data) { + let Y, Cb, Cr, k; + let offset = 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) + - t * - (0.000961250184130688 * t - - 0.00266257332283933 * s + + Y * + (0.000961250184130688 * Y - + 0.00266257332283933 * k + 0.48357088451265) + - s * (-0.000336197177618394 * s + 0.484791561490776); - e[r++] = + k * (-0.000336197177618394 * k + 0.484791561490776); + data[offset++] = 107.268039397724 + - i * - (219927104525741e-19 * i - - 0.000640992018297945 * a + - 0.000659397001245577 * t + - 0.000426105652938837 * s - + Cb * + (2.19927104525741e-5 * Cb - + 0.000640992018297945 * Cr + + 0.000659397001245577 * Y + + 0.000426105652938837 * k - 0.176491792462875) + - a * - (-0.000778269941513683 * a + - 0.00130872261408275 * t + - 0.000770482631801132 * s - + Cr * + (-0.000778269941513683 * Cr + + 0.00130872261408275 * Y + + 0.000770482631801132 * k - 0.151051492775562) + - t * - (0.00126935368114843 * t - - 0.00265090189010898 * s + + Y * + (0.00126935368114843 * Y - + 0.00265090189010898 * k + 0.25802910206845) + - s * (-0.000318913117588328 * s - 0.213742400323665); - e[r++] = - i * - (-0.000570115196973677 * i - - 263409051004589e-19 * a + - 0.0020741088115012 * t - - 0.00288260236853442 * s + - 0.814272968359295) - - 20.810012546947 + - a * - (-153496057440975e-19 * a - - 0.000132689043961446 * t + - 0.000560833691242812 * s - + 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) + - t * - (0.00174418132927582 * t - - 0.00255243321439347 * s + + Y * + (0.00174418132927582 * Y - + 0.00255243321439347 * k + 0.116935020465145) + - s * (-0.000343531996510555 * s + 0.24165260232407); + k * (-0.000343531996510555 * k + 0.24165260232407); } - return e.subarray(0, r); + return data.subarray(0, offset); } - _convertYcckToRgba(e) { - for (let t = 0, i = e.length; t < i; t += 4) { - const i = e[t], - a = e[t + 1], - s = e[t + 2], - r = e[t + 3]; - e[t] = - a * - (-660635669420364e-19 * a + - 0.000437130475926232 * s - - 54080610064599e-18 * i + - 0.00048449797120281 * r - - 0.154362151871126) - - 122.67195406894 + - s * - (-0.000957964378445773 * s + - 0.000817076911346625 * i - - 0.00477271405408747 * r + + _convertYcckToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const Y = data[i]; + const Cb = data[i + 1]; + const Cr = data[i + 2]; + const k = data[i + 3]; + data[i] = + -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) + - i * - (0.000961250184130688 * i - - 0.00266257332283933 * r + + Y * + (0.000961250184130688 * Y - + 0.00266257332283933 * k + 0.48357088451265) + - r * (-0.000336197177618394 * r + 0.484791561490776); - e[t + 1] = + k * (-0.000336197177618394 * k + 0.484791561490776); + data[i + 1] = 107.268039397724 + - a * - (219927104525741e-19 * a - - 0.000640992018297945 * s + - 0.000659397001245577 * i + - 0.000426105652938837 * r - + Cb * + (2.19927104525741e-5 * Cb - + 0.000640992018297945 * Cr + + 0.000659397001245577 * Y + + 0.000426105652938837 * k - 0.176491792462875) + - s * - (-0.000778269941513683 * s + - 0.00130872261408275 * i + - 0.000770482631801132 * r - + Cr * + (-0.000778269941513683 * Cr + + 0.00130872261408275 * Y + + 0.000770482631801132 * k - 0.151051492775562) + - i * - (0.00126935368114843 * i - - 0.00265090189010898 * r + + Y * + (0.00126935368114843 * Y - + 0.00265090189010898 * k + 0.25802910206845) + - r * (-0.000318913117588328 * r - 0.213742400323665); - e[t + 2] = - a * - (-0.000570115196973677 * a - - 263409051004589e-19 * s + - 0.0020741088115012 * i - - 0.00288260236853442 * r + - 0.814272968359295) - - 20.810012546947 + - s * - (-153496057440975e-19 * s - - 0.000132689043961446 * i + - 0.000560833691242812 * r - + k * (-0.000318913117588328 * k - 0.213742400323665); + data[i + 2] = + -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) + - i * - (0.00174418132927582 * i - - 0.00255243321439347 * r + + Y * + (0.00174418132927582 * Y - + 0.00255243321439347 * k + 0.116935020465145) + - r * (-0.000343531996510555 * r + 0.24165260232407); - e[t + 3] = 255; + k * (-0.000343531996510555 * k + 0.24165260232407); + data[i + 3] = 255; } - return e; + return data; } - _convertYcckToCmyk(e) { - let t, i, a; - for (let s = 0, r = e.length; s < r; s += 4) { - t = e[s]; - i = e[s + 1]; - a = e[s + 2]; - e[s] = 434.456 - t - 1.402 * a; - e[s + 1] = 119.541 - t + 0.344 * i + 0.714 * a; - e[s + 2] = 481.816 - t - 1.772 * i; + _convertYcckToCmyk(data) { + let Y, Cb, Cr; + 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; } - return e; + return data; } - _convertCmykToRgb(e) { - let t, - i, - a, - s, - r = 0; - for (let n = 0, g = e.length; n < g; n += 4) { - t = e[n]; - i = e[n + 1]; - a = e[n + 2]; - s = e[n + 3]; - e[r++] = + _convertCmykToRgb(data) { + let c, m, y, k; + let offset = 0; + 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 + - t * - (-6747147073602441e-20 * t + - 0.0008379262121013727 * i + - 0.0002894718188643294 * a + - 0.003264231057537806 * s - + c * + (-0.00006747147073602441 * c + + 0.0008379262121013727 * m + + 0.0002894718188643294 * y + + 0.003264231057537806 * k - 1.1185611867203937) + - i * - (26374107616089405e-21 * i - - 8626949158638572e-20 * a - - 0.0002748769067499491 * s - + m * + (0.000026374107616089405 * m - + 0.00008626949158638572 * y - + 0.0002748769067499491 * k - 0.02155688794978967) + - a * - (-3878099212869363e-20 * a - - 0.0003267808279485286 * s + + y * + (-0.00003878099212869363 * y - + 0.0003267808279485286 * k + 0.0686742238595345) - - s * (0.0003361971776183937 * s + 0.7430659151342254); - e[r++] = + k * (0.0003361971776183937 * k + 0.7430659151342254); + data[offset++] = 255 + - t * - (0.00013596372813588848 * t + - 0.000924537132573585 * i + - 0.00010567359618683593 * a + - 0.0004791864687436512 * s - + c * + (0.00013596372813588848 * c + + 0.000924537132573585 * m + + 0.00010567359618683593 * y + + 0.0004791864687436512 * k - 0.3109689587515875) + - i * - (-0.00023545346108370344 * i + - 0.0002702845253534714 * a + - 0.0020200308977307156 * s - + m * + (-0.00023545346108370344 * m + + 0.0002702845253534714 * y + + 0.0020200308977307156 * k - 0.7488052167015494) + - a * - (6834815998235662e-20 * a + - 0.00015168452363460973 * s - + y * + (0.00006834815998235662 * y + + 0.00015168452363460973 * k - 0.09751927774728933) - - s * (0.0003189131175883281 * s + 0.7364883807733168); - e[r++] = + k * (0.0003189131175883281 * k + 0.7364883807733168); + data[offset++] = 255 + - t * - (13598650411385307e-21 * t + - 0.00012423956175490851 * i + - 0.0004751985097583589 * a - - 36729317476630422e-22 * s - + c * + (0.000013598650411385307 * c + + 0.00012423956175490851 * m + + 0.0004751985097583589 * y - + 0.0000036729317476630422 * k - 0.05562186980264034) + - i * - (0.00016141380598724676 * i + - 0.0009692239130725186 * a + - 0.0007782692450036253 * s - + m * + (0.00016141380598724676 * m + + 0.0009692239130725186 * y + + 0.0007782692450036253 * k - 0.44015232367526463) + - a * - (5.068882914068769e-7 * a + - 0.0017778369011375071 * s - + y * + (5.068882914068769e-7 * y + + 0.0017778369011375071 * k - 0.7591454649749609) - - s * (0.0003435319965105553 * s + 0.7063770186160144); + k * (0.0003435319965105553 * k + 0.7063770186160144); } - return e.subarray(0, r); + return data.subarray(0, offset); } - _convertCmykToRgba(e) { - for (let t = 0, i = e.length; t < i; t += 4) { - const i = e[t], - a = e[t + 1], - s = e[t + 2], - r = e[t + 3]; - e[t] = + _convertCmykToRgba(data) { + for (let i = 0, length = data.length; i < length; i += 4) { + const c = data[i]; + const m = data[i + 1]; + const y = data[i + 2]; + const k = data[i + 3]; + data[i] = 255 + - i * - (-6747147073602441e-20 * i + - 0.0008379262121013727 * a + - 0.0002894718188643294 * s + - 0.003264231057537806 * r - + c * + (-0.00006747147073602441 * c + + 0.0008379262121013727 * m + + 0.0002894718188643294 * y + + 0.003264231057537806 * k - 1.1185611867203937) + - a * - (26374107616089405e-21 * a - - 8626949158638572e-20 * s - - 0.0002748769067499491 * r - + m * + (0.000026374107616089405 * m - + 0.00008626949158638572 * y - + 0.0002748769067499491 * k - 0.02155688794978967) + - s * - (-3878099212869363e-20 * s - - 0.0003267808279485286 * r + + y * + (-0.00003878099212869363 * y - + 0.0003267808279485286 * k + 0.0686742238595345) - - r * (0.0003361971776183937 * r + 0.7430659151342254); - e[t + 1] = + k * (0.0003361971776183937 * k + 0.7430659151342254); + data[i + 1] = 255 + - i * - (0.00013596372813588848 * i + - 0.000924537132573585 * a + - 0.00010567359618683593 * s + - 0.0004791864687436512 * r - + c * + (0.00013596372813588848 * c + + 0.000924537132573585 * m + + 0.00010567359618683593 * y + + 0.0004791864687436512 * k - 0.3109689587515875) + - a * - (-0.00023545346108370344 * a + - 0.0002702845253534714 * s + - 0.0020200308977307156 * r - + m * + (-0.00023545346108370344 * m + + 0.0002702845253534714 * y + + 0.0020200308977307156 * k - 0.7488052167015494) + - s * - (6834815998235662e-20 * s + - 0.00015168452363460973 * r - + y * + (0.00006834815998235662 * y + + 0.00015168452363460973 * k - 0.09751927774728933) - - r * (0.0003189131175883281 * r + 0.7364883807733168); - e[t + 2] = + k * (0.0003189131175883281 * k + 0.7364883807733168); + data[i + 2] = 255 + - i * - (13598650411385307e-21 * i + - 0.00012423956175490851 * a + - 0.0004751985097583589 * s - - 36729317476630422e-22 * r - + c * + (0.000013598650411385307 * c + + 0.00012423956175490851 * m + + 0.0004751985097583589 * y - + 0.0000036729317476630422 * k - 0.05562186980264034) + - a * - (0.00016141380598724676 * a + - 0.0009692239130725186 * s + - 0.0007782692450036253 * r - + m * + (0.00016141380598724676 * m + + 0.0009692239130725186 * y + + 0.0007782692450036253 * k - 0.44015232367526463) + - s * - (5.068882914068769e-7 * s + - 0.0017778369011375071 * r - + y * + (5.068882914068769e-7 * y + + 0.0017778369011375071 * k - 0.7591454649749609) - - r * (0.0003435319965105553 * r + 0.7063770186160144); - e[t + 3] = 255; + k * (0.0003435319965105553 * k + 0.7063770186160144); + data[i + 3] = 255; } - return e; + return data; } getData({ - width: e, - height: t, - forceRGBA: i = !1, - forceRGB: a = !1, - isSourcePDF: s = !1, + width, + height, + forceRGBA = false, + forceRGB = false, + isSourcePDF = false, }) { - if (this.numComponents > 4) throw new JpegError("Unsupported color mode"); - const r = this._getLinearizedBlockData(e, t, s); - if (1 === this.numComponents && (i || a)) { - const e = r.length * (i ? 4 : 3), - t = new Uint8ClampedArray(e); - let a = 0; - if (i) - !(function grayToRGBA(e, t) { - if (FeatureTest.isLittleEndian) - for (let i = 0, a = e.length; i < a; i++) - t[i] = (65793 * e[i]) | 4278190080; - else - for (let i = 0, a = e.length; i < a; i++) - t[i] = (16843008 * e[i]) | 255; - })(r, new Uint32Array(t.buffer)); - else - for (const e of r) { - t[a++] = e; - t[a++] = e; - t[a++] = e; + if (this.numComponents > 4) { + throw new JpegError("Unsupported color mode"); + } + const data = this._getLinearizedBlockData(width, height, isSourcePDF); + if (this.numComponents === 1 && (forceRGBA || forceRGB)) { + const len = data.length * (forceRGBA ? 4 : 3); + const rgbaData = new Uint8ClampedArray(len); + let offset = 0; + if (forceRGBA) { + grayToRGBA(data, new Uint32Array(rgbaData.buffer)); + } else { + for (const grayColor of data) { + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; + rgbaData[offset++] = grayColor; } - return t; - } - if (3 === this.numComponents && this._isColorConversionNeeded) { - if (i) { - const e = new Uint8ClampedArray((r.length / 3) * 4); - return this._convertYccToRgba(r, e); } - return this._convertYccToRgb(r); + return rgbaData; + } else if (this.numComponents === 3 && this._isColorConversionNeeded) { + if (forceRGBA) { + const rgbaData = new Uint8ClampedArray((data.length / 3) * 4); + return this._convertYccToRgba(data, rgbaData); + } + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded) { + if (forceRGBA) { + return this._convertYcckToRgba(data); + } + if (forceRGB) { + return this._convertYcckToRgb(data); + } + return this._convertYcckToCmyk(data); + } else if (forceRGBA) { + return this._convertCmykToRgba(data); + } else if (forceRGB) { + return this._convertCmykToRgb(data); + } } - if (4 === this.numComponents) { - if (this._isColorConversionNeeded) - return i - ? this._convertYcckToRgba(r) - : a - ? this._convertYcckToRgb(r) - : this._convertYcckToCmyk(r); - if (i) return this._convertCmykToRgba(r); - if (a) return this._convertCmykToRgb(r); - } - return r; + return data; } -} +} // ./src/core/jpeg_stream.js + class JpegStream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.stream = e; - this.dict = e.dict; - this.maybeLength = t; - this.params = i; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + static get canUseImageDecoder() { + return shadow( + this, + "canUseImageDecoder", + typeof ImageDecoder === "undefined" + ? Promise.resolve(false) + : ImageDecoder.isTypeSupported("image/jpeg"), + ); } get bytes() { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } - ensureBuffer(e) {} + ensureBuffer(requested) {} readBlock() { this.decodeImage(); } - decodeImage(e) { - if (this.eof) return this.buffer; - e ||= this.bytes; - for (let t = 0, i = e.length - 1; t < i; t++) - if (255 === e[t] && 216 === e[t + 1]) { - t > 0 && (e = e.subarray(t)); - break; + get jpegOptions() { + const jpegOptions = { + decodeTransform: undefined, + colorTransform: undefined, + }; + const decodeArr = this.dict.getArray("D", "Decode"); + if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { + const bitsPerComponent = this.dict.get("BPC", "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; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } } - const t = { decodeTransform: void 0, colorTransform: void 0 }, - i = this.dict.getArray("D", "Decode"); - if ((this.forceRGBA || this.forceRGB) && Array.isArray(i)) { - const e = this.dict.get("BPC", "BitsPerComponent") || 8, - a = i.length, - s = new Int32Array(a); - let r = !1; - const n = (1 << e) - 1; - for (let e = 0; e < a; e += 2) { - s[e] = (256 * (i[e + 1] - i[e])) | 0; - s[e + 1] = (i[e] * n) | 0; - (256 === s[e] && 0 === s[e + 1]) || (r = !0); + if (transformNeeded) { + jpegOptions.decodeTransform = transform; } - r && (t.decodeTransform = s); } if (this.params instanceof Dict) { - const e = this.params.get("ColorTransform"); - Number.isInteger(e) && (t.colorTransform = e); + const colorTransform = this.params.get("ColorTransform"); + if (Number.isInteger(colorTransform)) { + jpegOptions.colorTransform = colorTransform; + } } - const a = new JpegImage(t); - a.parse(e); - const s = a.getData({ + return shadow(this, "jpegOptions", jpegOptions); + } + #skipUselessBytes(data) { + for (let i = 0, ii = data.length - 1; i < ii; i++) { + if (data[i] === 0xff && data[i + 1] === 0xd8) { + if (i > 0) { + data = data.subarray(i); + } + break; + } + } + return data; + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes = this.#skipUselessBytes(bytes || this.bytes); + const jpegImage = new JpegImage(this.jpegOptions); + jpegImage.parse(bytes); + const data = jpegImage.getData({ width: this.drawWidth, height: this.drawHeight, forceRGBA: this.forceRGBA, forceRGB: this.forceRGB, - isSourcePDF: !0, + isSourcePDF: true, }); - this.buffer = s; - this.bufferLength = s.length; - this.eof = !0; + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; return this.buffer; } get canAsyncDecodeImageFromBuffer() { return this.stream.isAsync; } -} -var gi, - oi = - ((gi = - "undefined" != typeof document ? document.currentScript?.src : void 0), - function (e = {}) { - var t, - i, - a = e; - new Promise((e, a) => { - t = e; - i = a; + async getTransferableImage() { + if (!(await JpegStream.canUseImageDecoder)) { + return null; + } + const jpegOptions = this.jpegOptions; + if (jpegOptions.decodeTransform) { + return null; + } + let decoder; + try { + const bytes = + (this.canAsyncDecodeImageFromBuffer && + (await this.stream.asyncGetBytes())) || + this.bytes; + if (!bytes) { + return null; + } + const data = this.#skipUselessBytes(bytes); + if (!JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform)) { + return null; + } + decoder = new ImageDecoder({ + data, + type: "image/jpeg", + preferAnimation: false, }); - a.decode = function ( - e, - { - numComponents: t = 4, - isIndexedColormap: i = !1, - smaskInData: s = !1, - }, - ) { - const r = e.length, - n = a._malloc(r); - a.HEAPU8.set(e, n); - const g = a._jp2_decode(n, r, t > 0 ? t : 0, !!i, !!s); - a._free(n); - if (g) { - const { errorMessages: e } = a; - if (e) { - delete a.errorMessages; - return e; - } - return "Unknown error"; - } - const { imageData: o } = a; - a.imageData = null; - return o; - }; - var s, - r = Object.assign({}, a), - n = "./this.program", - g = ""; - "undefined" != typeof document && - document.currentScript && - (g = document.currentScript.src); - gi && (g = gi); - g = g.startsWith("blob:") - ? "" - : g.substr(0, g.replace(/[?#].*/, "").lastIndexOf("/") + 1); - var o, - c, - C, - h, - l, - Q = a.print || console.log.bind(console), - E = a.printErr || console.error.bind(console); - Object.assign(a, r); - r = null; - a.arguments && a.arguments; - a.thisProgram && (n = a.thisProgram); - a.quit && a.quit; - a.wasmBinary && (o = a.wasmBinary); - function tryParseAsDataURI(e) { - if (isDataURI(e)) - return (function intArrayFromBase64(e) { - for ( - var t = atob(e), i = new Uint8Array(t.length), a = 0; - a < t.length; - ++a - ) - i[a] = t.charCodeAt(a); - return i; - })(e.slice(D.length)); - } - function updateMemoryViews() { - var e = c.buffer; - a.HEAP8 = C = new Int8Array(e); - a.HEAP16 = new Int16Array(e); - a.HEAPU8 = h = new Uint8Array(e); - a.HEAPU16 = new Uint16Array(e); - a.HEAP32 = new Int32Array(e); - a.HEAPU32 = l = new Uint32Array(e); - a.HEAPF32 = new Float32Array(e); - a.HEAPF64 = new Float64Array(e); - } - var u, - d = [], - f = [], - p = [], - m = 0, - y = null, - w = null, - D = "data:application/octet-stream;base64,", - isDataURI = (e) => e.startsWith(D); - function instantiateSync(e, t) { - var i, - a = (function getBinarySync(e) { - if (e == u && o) return new Uint8Array(o); - var t = tryParseAsDataURI(e); - if (t) return t; - if (s) return s(e); - throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; - })(e); - i = new WebAssembly.Module(a); - return [new WebAssembly.Instance(i, t), i]; - } - var callRuntimeCallbacks = (e) => { - for (; e.length > 0; ) e.shift()(a); - }; - a.noExitRuntime; - var b, - growMemory = (e) => { - var t = (e - c.buffer.byteLength + 65535) / 65536; - try { - c.grow(t); - updateMemoryViews(); - return 1; - } catch (e) {} - }, - F = {}, - getEnvStrings = () => { - if (!getEnvStrings.strings) { - var e = { - USER: "web_user", - LOGNAME: "web_user", - PATH: "/", - PWD: "/", - HOME: "/home/web_user", - LANG: - ( - ("object" == typeof navigator && - navigator.languages && - navigator.languages[0]) || - "C" - ).replace("-", "_") + ".UTF-8", - _: n || "./this.program", - }; - for (var t in F) void 0 === F[t] ? delete e[t] : (e[t] = F[t]); - var i = []; - for (var t in e) i.push(`${t}=${e[t]}`); - getEnvStrings.strings = i; - } - return getEnvStrings.strings; - }, - S = [null, [], []], - k = - "undefined" != typeof TextDecoder ? new TextDecoder("utf8") : void 0, - UTF8ArrayToString = (e, t, i) => { - for (var a = t + i, s = t; e[s] && !(s >= a); ) ++s; - if (s - t > 16 && e.buffer && k) return k.decode(e.subarray(t, s)); - for (var r = ""; t < s; ) { - var n = e[t++]; - if (128 & n) { - var g = 63 & e[t++]; - if (192 != (224 & n)) { - var o = 63 & e[t++]; - if ( - (n = - 224 == (240 & n) - ? ((15 & n) << 12) | (g << 6) | o - : ((7 & n) << 18) | - (g << 12) | - (o << 6) | - (63 & e[t++])) < 65536 - ) - r += String.fromCharCode(n); - else { - var c = n - 65536; - r += String.fromCharCode( - 55296 | (c >> 10), - 56320 | (1023 & c), - ); - } - } else r += String.fromCharCode(((31 & n) << 6) | g); - } else r += String.fromCharCode(n); - } - return r; - }, - printChar = (e, t) => { - var i = S[e]; - if (0 === t || 10 === t) { - (1 === e ? Q : E)(UTF8ArrayToString(i, 0)); - i.length = 0; - } else i.push(t); - }, - UTF8ToString = (e, t) => (e ? UTF8ArrayToString(h, e, t) : ""), - R = { - c: (e, t, i) => h.copyWithin(e, t, t + i), - g: function _copy_pixels_1(e, t) { - e >>= 2; - const i = (a.imageData = new Uint8ClampedArray(t)), - s = a.HEAP32.subarray(e, e + t); - i.set(s); - }, - f: function _copy_pixels_3(e, t, i, s) { - e >>= 2; - t >>= 2; - i >>= 2; - const r = (a.imageData = new Uint8ClampedArray(3 * s)), - n = a.HEAP32.subarray(e, e + s), - g = a.HEAP32.subarray(t, t + s), - o = a.HEAP32.subarray(i, i + s); - for (let e = 0; e < s; e++) { - r[3 * e] = n[e]; - r[3 * e + 1] = g[e]; - r[3 * e + 2] = o[e]; - } - }, - e: function _copy_pixels_4(e, t, i, s, r) { - e >>= 2; - t >>= 2; - i >>= 2; - s >>= 2; - const n = (a.imageData = new Uint8ClampedArray(4 * r)), - g = a.HEAP32.subarray(e, e + r), - o = a.HEAP32.subarray(t, t + r), - c = a.HEAP32.subarray(i, i + r), - C = a.HEAP32.subarray(s, s + r); - for (let e = 0; e < r; e++) { - n[4 * e] = g[e]; - n[4 * e + 1] = o[e]; - n[4 * e + 2] = c[e]; - n[4 * e + 3] = C[e]; - } - }, - k: (e) => { - var t = h.length, - i = 2147483648; - if ((e >>>= 0) > i) return !1; - for (var a, s, r = 1; r <= 4; r *= 2) { - var n = t * (1 + 0.2 / r); - n = Math.min(n, e + 100663296); - var g = Math.min( - i, - (a = Math.max(e, n)) + (((s = 65536) - (a % s)) % s), - ); - if (growMemory(g)) return !0; - } - return !1; - }, - l: (e, t) => { - var i = 0; - getEnvStrings().forEach((a, s) => { - var r = t + i; - l[(e + 4 * s) >> 2] = r; - ((e, t) => { - for (var i = 0; i < e.length; ++i) C[t++] = e.charCodeAt(i); - C[t] = 0; - })(a, r); - i += a.length + 1; - }); - return 0; - }, - m: (e, t) => { - var i = getEnvStrings(); - l[e >> 2] = i.length; - var a = 0; - i.forEach((e) => (a += e.length + 1)); - l[t >> 2] = a; - return 0; - }, - n: (e) => 52, - j: function _fd_seek(e, t, i, a, s) { - return 70; - }, - b: (e, t, i, a) => { - for (var s = 0, r = 0; r < i; r++) { - var n = l[t >> 2], - g = l[(t + 4) >> 2]; - t += 8; - for (var o = 0; o < g; o++) printChar(e, h[n + o]); - s += g; - } - l[a >> 2] = s; - return 0; - }, - o: function _gray_to_rgba(e, t) { - e >>= 2; - const i = (a.imageData = new Uint8ClampedArray(4 * t)), - s = a.HEAP32.subarray(e, e + t); - for (let e = 0; e < t; e++) { - i[4 * e] = i[4 * e + 1] = i[4 * e + 2] = s[e]; - i[4 * e + 3] = 255; - } - }, - i: function _graya_to_rgba(e, t, i) { - e >>= 2; - t >>= 2; - const s = (a.imageData = new Uint8ClampedArray(4 * i)), - r = a.HEAP32.subarray(e, e + i), - n = a.HEAP32.subarray(t, t + i); - for (let e = 0; e < i; e++) { - s[4 * e] = s[4 * e + 1] = s[4 * e + 2] = r[e]; - s[4 * e + 3] = n[e]; - } - }, - d: function _jsPrintWarning(e) { - const t = UTF8ToString(e); - (a.warn || console.warn)(`OpenJPEG: ${t}`); - }, - h: function _rgb_to_rgba(e, t, i, s) { - e >>= 2; - t >>= 2; - i >>= 2; - const r = (a.imageData = new Uint8ClampedArray(4 * s)), - n = a.HEAP32.subarray(e, e + s), - g = a.HEAP32.subarray(t, t + s), - o = a.HEAP32.subarray(i, i + s); - for (let e = 0; e < s; e++) { - r[4 * e] = n[e]; - r[4 * e + 1] = g[e]; - r[4 * e + 2] = o[e]; - r[4 * e + 3] = 255; - } - }, - a: function _storeErrorMessage(e) { - const t = UTF8ToString(e); - a.errorMessages - ? (a.errorMessages += "\n" + t) - : (a.errorMessages = t); - }, - }, - N = (function createWasm() { - var e = (function getWasmImports() { - return { a: R }; - })(); - function receiveInstance(e, t) { - N = e.exports; - c = N.p; - updateMemoryViews(); - !(function addOnInit(e) { - f.unshift(e); - })(N.q); - !(function removeRunDependency(e) { - m--; - a.monitorRunDependencies?.(m); - if (0 == m) { - if (null !== y) { - clearInterval(y); - y = null; - } - if (w) { - var t = w; - w = null; - t(); - } - } - })(); - return N; - } - !(function addRunDependency(e) { - m++; - a.monitorRunDependencies?.(m); - })(); - if (a.instantiateWasm) - try { - return a.instantiateWasm(e, receiveInstance); - } catch (e) { - E(`Module.instantiateWasm callback failed with error: ${e}`); - i(e); - } - u || - (u = - "data:application/octet-stream;base64,AGFzbQEAAAABzgEaYAN/f38Bf2AEf39/fwF/YAF/AGACf38AYAF/AX9gA39/fwBgAn9/AX9gBH9/f38AYAN/fn8BfmAFf39/f38Bf2ACfn8Bf2ACfn8BfmAFf39/f38AYAN/fn8Bf2AAAX9gB39/f39/f38Bf2AJf39/f39/f39/AX9gC39/f39/f39/f39/AX9gBn9/f39/fwF/YAZ/fH9/f38Bf2AIf39/f39/f38AYAh/f39/f39/fwF/YAAAYAZ/f39/f38AYAd/f39/f39/AGACfH8BfAJbDwFhAWEAAgFhAWIAAQFhAWMABQFhAWQAAgFhAWUADAFhAWYABwFhAWcAAwFhAWgABwFhAWkABQFhAWoACQFhAWsABAFhAWwABgFhAW0ABgFhAW4ABAFhAW8AAwPAAb4BBwIFAAYEAAUGBAUBBAwFFAYCAgICAAYQEQQCChICBQIEBwQCDgICDQYCFQMHAAAEAwEWCQkDAAkGAQQEBQUODwEBAwADBgIQBBcYAgcGAwcHAQECAAQZBAYHBA8MAAQCAgIABgAGAQEBAQEBAQEAAAAAAAYDAgICAwMDAwMAAxMIBA4EAAgDAwkECAoLCAAAAQEBAQEBAQENAQAEBAUJDwESEQEAAAYDAwEFBQUFBQUFBQELAQEBAQEBAQEBCgQFAXABbm4FBwEBggKAgAIGCAF/AUGQ2QULBxsGAXACAAFxAEEBcgCYAQFzABABdAEAAXUAlwEJvQEBAEEBC21RzAHCAXNzNqcBnAGZAYsBigGJAYgBhwGGAYUBhAFSgQGAAX9+fXx7enl4d3Z1ywHKAckByAHHAcYBQMUBxAFAQMMBwQHAAb8BvgG9AbwBuwG6AbkBswGoAaYBpQGkAaMBogGhAaABnwGeAZ0BmwGaAUlKTFJIgwFTOFCCAU9FRk4rJ6sBqgGsAbQBuAG1Aa8BqQGtAa4BtgG3AXCwAbEBsgFRlgGVAYwBjgGNAZIBkwGUAZABjwEKkZoOvgGCAgEDfyMAQZAEayIEJAACQCAARQ0AAkACQAJAAkAgAUEBaw4EAAEEAgQLIABBDGohAQwCCyAAQRBqIQEgAEEEaiEADAELIABBFGohASAAQQhqIQALIAEoAgAiBUUNACACRQ0AIAAoAgAhBiAEQQBBgAQQFSIBIAM2AowEIwBBoAFrIgAkACAAIAE2ApQBIABB/wM2ApgBIABBAEGQARAVIgBBfzYCTCAAQeYANgIkIABBfzYCUCAAIABBnwFqNgIsIAAgAEGUAWo2AlQgAUEAOgAAIAAgAiADQecAQegAEGsgAEGgAWokACABQQA6AP8DIAEgBiAFEQMACyAEQZAEaiQAC9ACAQV/IAAEQCAAQQRrIgMoAgAiBCEBIAMhAiAAQQhrKAIAIgAgAEF+cSIARwRAIAIgAGsiAigCBCIBIAIoAggiBTYCCCAFIAE2AgQgACAEaiEBCyADIARqIgAoAgAiAyAAIANqQQRrKAIARwRAIAAoAgQiBCAAKAIIIgA2AgggACAENgIEIAEgA2ohAQsgAiABNgIAIAIgAUF8cWpBBGsgAUEBcjYCACACAn8gAigCAEEIayIAQf8ATQRAIABBA3ZBAWsMAQsgAGchAyAAQR0gA2t2QQRzIANBAnRrQe4AaiAAQf8fTQ0AGkE/IABBHiADa3ZBAnMgA0EBdGtBxwBqIgAgAEE/TxsLIgFBBHQiAEGgxwFqNgIEIAIgAEGoxwFqIgAoAgA2AgggACACNgIAIAIoAgggAjYCBEGozwFBqM8BKQMAQgEgAa2GhDcDAAsLyQIBBH8gAUEANgIAAkAgAkUNACABIAJqIQMCQCACQRBJBEAgACEBDAELAkAgACACaiABTQ0AIAAgA08NACAAIQEMAQsgA0EQayEGIAAgAkFwcSIFaiEBIAMgBWshAwNAIAYgBGsgACAEav0AAAD9DAAAAAAAAAAAAAAAAAAAAAD9DQ8ODQwLCgkIBwYFBAMCAQD9CwAAIARBEGoiBCAFRw0ACyACIAVGDQELAkAgAkEDcSIGRQRAIAUhBAwBC0EAIQAgBSEEA0AgA0EBayIDIAEtAAA6AAAgBEEBaiEEIAFBAWohASAAQQFqIgAgBkcNAAsLIAUgAmtBfEsNAANAIANBAWsgAS0AADoAACADQQJrIAEtAAE6AAAgA0EDayABLQACOgAAIANBBGsiAyABLQADOgAAIAFBBGohASAEQQRqIgQgAkcNAAsLC4AEAQN/IAJBgARPBEAgACABIAIQAiAADwsgACACaiEDAkAgACABc0EDcUUEQAJAIABBA3FFBEAgACECDAELIAJFBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECUiAARAIABBACABEBUaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECUL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLIAALJwEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBAEEAEGsgA0EQaiQAC+gFAQl/IAFFBEBBAA8LAn8gAEUE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ACAEIE5BCmpBAiAFEBpBAkcEQCAFQQFBAiAAKAK4ARtBlhJBABAPIAAoArgBRSFnDAELIE5BCmogTkEMakECEBEgTigCDCIBQZD/A0YNACABQdn/A0YEQCAAQYACNgIIIABBADYCzAEMAQsgBCkDCCKGAVAEfkIABSCGASAEKQM4fQtQBEAgAEHAADYCCCAFQQJBrD9BABAPDAELQQAhZyAFQQFB7D5BABAPCyBOQRBqJAAgZwsLACAABEAgABAQCwu0AQEBfyAAKAIMRQRAIAIgACgCJCABEQMADwsCQEEIEBQiA0UNACADIAI2AgQgAyABNgIAQQgQFCIBRQRAIAMQEA8LIAEgAzYCACAAIAAoAgRB5ABsIgI2AigDQCAAKAIYIAJKDQALIAEgACgCFDYCBCAAIAE2AhQgACAAKAIYQQFqNgIYIAAoAhwiAUUNACABKAIAQQA2AgggACABKAIENgIcIAAgACgCIEEBazYCICABEBALC/oCAQR/AkAgAEUNACAAKAKsKCIBBEAgACgCqCgiAgRAQQAhAQNAIAAoAqwoIAFBA3RqKAIAIgMEQCADEBAgACgCqCghAgsgAUEBaiIBIAJJDQALIAAoAqwoIQELIABBADYCqCggARAQIABBADYCrCgLIAAoArQoIgEEQCABEBAgAEEANgK0KAsgACgC0CsiAQRAIAEQECAAQQA2AtArCyAAKALsKyIBBEAgARAQIABBADYC7CsLIAAoAugrIgEEQCABEBAgAEEANgLoKwsgACgC/CsiAQRAIAEQECAAQQA2AoQsIABCADcC/CsLIAAoAvArIgEEQCAAKAL0KyIDBH9BACECA0AgASgCDCIEBEAgBBAQIAFBADYCDCAAKAL0KyEDCyABQRRqIQEgAkEBaiICIANJDQALIAAoAvArBSABCxAQIABBADYC8CsLIAAoAuQrIgEEQCABEBAgAEEANgLkKwsgACgC3CsiAUUNACABEBAgAEIANwLcKwsLyAcCEX8BfiAAKAIQIghBIE8EQCAAKQMIpw8LAkAgACgCFCIDQQROBEAgACgCACICQQNrKAIAIQEgACADQQRrIgM2AhQgACACQQRrNgIADAELIANBAEwEQAwBCyADQQFxIQ0gACgCACECAkAgA0EBRgRAQRghBAwBCyADQf7///8HcSEJQRghBANAIAAgAkEB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IABBADYCiAEgACgCZBAQIABBADYCZCAALQC8AUECcUUEQCAAKAKoARAQCyAAQdAAakEAQfAAEBUaIAAoAsABEDIgAEEANgLAASAAKALEARAyIABBADYCwAEgACgCyAEiAQRAIAEoAhwiAgRAIAIQECABQQA2AhwLIAEoAigiAgRAIAEoAiQEQANAIAIgBUEobCIDaigCJCIEBEAgBBAQIAEoAigiAiADakEANgIkCyACIANqKAIQIgQEQCAEEBAgASgCKCICIANqQQA2AhALIAIgA2ooAhgiBARAIAQQECABKAIoIgIgA2pBADYCGAsgBUEBaiIFIAEoAiRJDQALCyACEBAgAUEANgIoCyABEBALIABBADYCyAEgACgCSBAhIABBADYCSCAAKAJMECEgAEEANgJMIAAoAtQBIgMEQAJAIAMoAghFDQAgAygCDARAIANBADYCKANAIAMoAhhBAEoNAAsLIANBATYCECADKAIAEBAgAygCHCICRQ0AA0AgAigCBCEBIAIQECADIAE2AhwgASICDQALCyADKAIkIgIEQCACKAIEIgVBAEoEQEEAIQEDQCACKAIAIAFBDGxqIgQoAggiBgRAIAQoAgQgBhECACACKAIEIQULIAFBAWoiASAFSA0ACwsgAigCABAQIAIQEAsgAxAQCyAAQQA2AtQBIAAQEAsL5gMCCH8EfiAAKAIUKAIAKAIUIAFBzABsaiIJKAIMIgggACgCGCgCGCABQTRsaiIKNQIEIhBCAX0iEiAANQI8fCAQgKciCyAIIAtJGyEMIAkoAggiCCAKNQIAIhFCAX0iEyAANQI4fCARgKciCiAIIApJGyEKIAkoAgQiCCASIAA1AjR8IBCApyILIAggC0sbIQsgCSgCACIIIBMgADUCMHwgEYCnIg0gCCANSxshDUEAIQggACgCICgC0CsgAUG4CGxqKAIUIQ4CQCAJKAIUQQAgAmtBfyACG2oiAkUEQCAKIQAgDSEIIAshAQwBCyADQQFxIAJBAWsiD3QiCSANSQRAIA0gCWutQn8gAq0iEIZCf4V8IBCIpyEIC0EAIQBBACEBIANBAXYgD3QiAyALSQRAIAsgA2utQn8gAq0iEIZCf4V8IBCIpyEBCyAJIApJBEAgCiAJa61CfyACrSIQhkJ/hXwgEIinIQALIAMgDE8EQEEAIQwMAQsgDCAD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IABBADYCPCAAQucHNwI0IABBADYCLCAAQucHNwIkIABBADYCHCAAQucHNwIUIABBADYCDCAAQucHNwIEIABBQGshACACQQRqIgIgA0cNAAsLIAFBA3EiAUUNAEEAIQIDQCAAQQA2AgwgAELnBzcCBCAAQRBqIQAgAkEBaiICIAFHDQALCwv7BQEQfyMAQYACayIIJAACf0EBQRQQEyIGRQRAIAJBAUH0MEEAEA9BAAwBCyAGIAE2AgQgBiAANgIAIAggATYCACAIIAA2AoABA0AgCCAFIg1BAWoiBUECdCIHaiABQQFqQQJtIgM2AgAgCEGAAWogB2ogAEEBakECbSIHNgIAIAQgACABbCIJaiEEIAMhASAHIQAgCUEBSw0ACyAGIAQ2AgggBEUEQCAGEBBBAAwBCyAGIARBEBATIgM2AgwgA0UEQCACQQFB2hpBABAPIAYQEEEADAELIAYgBigCCCILQQR0NgIQIAMhACANBEAgAyAGKAIEIAYoAgBsQQR0aiIEIQEDQAJAIAggDkECdCICaigCACIJQQBMDQAgCUEBayEMQQAhBwJAIAhBgAFqIAJqKAIAIgJBAEwEQEEAIQUgCUEBRwRAIAlB/v///wdxIQoDQCAFIAxGIQ8gBUECaiEFIAEgBCAPGyIEIQEgB0ECaiIHIApHDQALCyAJQQFxDQEgBCEBDAILA0AgBCEFIAIhBANAAkAgACABNgIAIARBAUYEQCAAQRBqIQAgAUEQaiEBDAELIAAgATYCECABQRBqIQEgAEEgaiEAIARBAkohECAEQQJrIQQgEA0BCwsgASAFIAJBBHRqIAcgByAMRnJBAXEiChshBCABIAUgChshASAHQQFqIgcgCUcNAAsMAQsgASAEIAJBBHRqIAUgBSAMRnJBAXEiBRshESABIAQgBRshASARIQQLIA5BAWoiDiANRw0ACwsgAEEANgIAAkAgC0UNACALQQRPBEAgC0F8cSEAQQAhAQNAIANBADYCPCADQucHNwI0IANBADYCLCADQucHNwIkIANBADYCHCADQucHNwIUIANBADYCDCADQucHNwIEIANBQGshAyABQQRqIgEgAEcNAAsLIAtBA3EiAEUNAEEAIQEDQCADQQA2AgwgA0LnBzcCBCADQRBqIQMgAUEBaiIBIABHDQALCyAGCyESIAhBgAJqJAAgEgtTAQF/An8gAC0ADEH/AUYEQCAAQoD+g4DwADcCDEEAIAAoAggiASAAKAIETw0BGiAAIAFBAWo2AgggACABLQAAQYD+A3I2AgwLIABBADYCEEEBCwt+AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARBlIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLSQEBfwJAQQFBLBATIgEEQCABQQA2AhACQCAAQQBMBEAgAUEBQQgQEyIANgIkIABFDQEMAwsgAUEANgIMCyABEBALQQAhAQsgAQuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGU0AEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTHAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsE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AyAAQRh2NgIUIAMgBDYCECADIABBCHZB/wFxNgIcIAMgAEEQdkH/AXE2AhggAkEBQc31ACADQRBqEA8MBwsgBSAITQRAIAYhBAwECyAFIQggBiAFEBciBA0DIAYQECACQQFB/w9BABAPQQAMBwsgBEECcUUEQCACQQFBwg9BABAPIAYQEEEADAcLIAAgBEH/////B3I2AmQgASAHIAVrrSINIAIgASgCKBEIACANUQ0DIAAtAGRBCHFFDQEgAkECQZIcQQAQDwsgBhAQQQEMBQsgAkEBQZIcQQAQDyAGEBBBAAwECyABIAQgBSACEBogBUcEQCACQQFBxBxBABAPIAQQEEEADAQLIAAgBCIGIAUgAiAKKAIEEQEADQALIAQQEEEADAILIAJBAUGiJUEAEA9BAAwBCyAGEBBBAAshDCADQfAAaiQAIAwL5gEBBn8gACgCCEE1IAIQJARAAkAgACgCCCIGKAIAIQMgBigCCCEFAkACQAJ/AkAgAwRAQQEhBCADQQFxIQcgA0EBRw0BQQAMAgsgBkEANgIADAILIANBfnEhAwNAAn9BACAERQ0AGkEAIAAgASACIAUoAgARAABFDQAaIAAgASACIAUoAgQRAABBAEcLIQQgBUEIaiEFIAhBAmoiCCADRw0ACyAERQshAyAHBEAgAw0CIAAgASACIAUoAgARAABBAEchBAsgBkEANgIAIARFDQILIAAoAgAaQQEPCyAGQQA2AgALC0EACwoAIAAoAgAaQQALFAAgACgCACIABEAgACABNgK4AQsLIQAgACgCACABEFMgAEEAOgB8IAAgASgCuEBBAXE2AoABCzIAIAJFBEBBAA8LIAAoAgAgASACIAMQSEUEQCADQQFBqS9BABAPQQAPCyAAIAIgAxBxC2kCAn8BfCMAQRBrIgMkACACBEADQCAAIANBCGoQRCABAn8gAysDCCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAs2AgAgAUEEaiEBIABBCGohACAEQQFqIgQgAkcNAAsLIANBEGokAAuEAQICfwF9IwBBEGsiAyQAIAIEQANAIAMgAC0AADoADyADIAAtAAE6AA4gAyAALQACOgANIAMgAC0AAzoADCABAn8gAyoCDCIFi0MAAABPXQRAIAWoDAELQYCAgIB4CzYCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0sBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQESABIAMoAgw2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMNgIAIAFBBGohASAAQQJqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSgECfyMAQRBrIgMkACACBEADQCAAIANBCGoQRCABIAMrAwi2OAIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALaAECfyMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgASADKgIMOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBBBARIAEgAygCDLM4AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtMAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMszgCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC6oIAg1/AXsjAEEQayIIJAACfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEJAkAgAkUEQCADQQFB8B9BABAPDAELIAAoAkghBkEBIQQgASAIQQhqQQEQESAIKAIIIgVBAk8EQCADQQJBxsgAQQAQDwwBCyACIAVBAWpHBEBBACEEIANBAkHwH0EAEA8MAQsCQCAGKAIQIgNFDQAgCSgC0CshBCADQQhPBEAgA0F4cSEGQQAhAgNAIARBADYCvEMgBEEANgKEOyAEQQA2AswyIARBADYClCogBEEANgLcISAEQQA2AqQZIARBADYC7BAgBEEANgK0CCAEQcDDAGohBCACQQhqIgIgBkcNAAsLIANBB3EiA0UNAEEAIQIDQCAEQQA2ArQIIARBuAhqIQQgAkEBaiICIANHDQALCyAJKALoKyICBH8gAhAQIAlBADYC6CsgCCgCCAUgBQtFBEBBASEEDAELA0AgAUEBaiIBIAhBDGpBARARAkAgCSgCgCxF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KT0ALgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFBMTSBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXIKAEV4cGVjdGVkIEVQSCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlcgoAVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyCgBVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDRCBtYXJrZXIKAENycm9yIHJlYWRpbmcgQ0JEIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNDIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXIKAHJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBmaWxlIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXIKAEVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlcgoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXAKAHRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb24KAE1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uCgBQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvbgoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uCgBJbnZhbGlkIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIG90aGVyIHRoYW4gYXJyYXkgZGVjb3JyZWxhdGlvbgoAVG9vIGxhcmdlIHZhbHVlIGZvciBOcHBtCgBOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbQoAYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW0KAAkgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JWxsaQoJIE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lbGxpCgBNYXJrZXIgc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBUaWxlIHBhcnQgbGVuZ3RoIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmcKAFdyb25nIGZsYWcKAEVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemUKAEVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplCgBJbnZhbGlkIHByZWNpbmN0IHNpemUKAEluY29uc2lzdGVudCBtYXJrZXIgc2l6ZQoASW52YWxpZCBtYXJrZXIgc2l6ZQoARXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZQoATm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUKAEZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aCBpbmRpeCBzaHVmZmxlCgBDYW5ub3QgYWxsb2NhdGUgVGllciAxIGhhbmRsZQoATm8gZGVjb2RlZCBhcmVhIHBhcmFtZXRlcnMsIHNldCB0aGUgZGVjb2RlZCBhcmVhIHRvIHRoZSB3aG9sZSBpbWFnZQoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgdHJhbnNmb3JtYXRpb24gZm91bmQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudC4gVW5zdXBwb3J0ZWQgTWl4ZWQgSFQgY29kZS1ibG9jayBzdHlsZSBmb3VuZAoAVGlsZSBZIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBUaWxlIFggY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAEltYWdlIGNvb3JkaW5hdGVzIGFib3ZlIElOVF9NQVggYXJlIG5vdCBzdXBwb3J0ZWQKAEpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWQKAG9wal9qMmtfbWVyZ2VfcHB0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGV0aXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAE9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAAABQAADAUAAAAUgAAAAAAAAQUAAAsFAAAAFIAAABAAAAIFAAAMBQAAABOAAAAAAAADBQAACwUAAAATgAAAEAAABAUAAAwFAAAAEwAAAAAAAAUFAAABBRAAABMAAAAQAAAGBQAAAgUQAAASQAAAAAAABwUAAAMFEAAAEkAAABAAAAgFAAAEBRAAABHAAAAAAAAJBQAABwUQAAARwAAAEAAACgUAAAgFEAAAEWAAAAAAAAkFIAAJBRAAABFgAAAQAAAKBSAACgUQAAAVYAAAAAAADQUAAAwFAAAAFWAAABAAAA4FAAALBQAAABVAAAAAAAAPBQAACwUAAAAVQAAAEAAAAAUQAAwFAAAAFRAAAAAAAAEFEAANBQAAABUQAAAQAAACBRAADgUAAAAUgAAAAAAAAwUQAA8FAAAAFIAAABAAAAQFEAAABRAAABOAAAAAAAAFBRAAAQUQAAATgAAAEAAABgUQAAIFEAAAE0AAAAAAAAcFEAADBRAAABNAAAAQAAAIBRAABAUQAAATAAAAAAAACQUQAAUFEAAAEwAAABAAAAoFEAAGBRAAABKAAAAAAAALBRAABQUQAAASgAAAEAAADAUQAAYFEAAAEkAAAAAAAA0FEAAHBRAAABJAAAAQAAAOBRAACAUQAAASIAAAAAAADwUQAAkFEAAAEiAAABAAAAAFIAAKBRAAABHAAAAAAAABBSAACwUQAAARwAAAEAAAAgUgAAwFEAAAEYAAAAAAAAMFIAANBRAAABGAAAAQAAAEBSAADgUQAAARYAAAAAAABQUgAA8FEAAAEWAAABAAAAYFIAAABSAAABFAAAAAAAAHBSAAAQUgAAARQAAAEAAACAUgAAIFIAAAESAAAAAAAAkFIAADBSAAABEgAAAQAAAKBSAABAUgAAAREAAAAAAACwUgAAUFIAAAERAAABAAAAwFIAAGBSAADBCgAAAAAAANBSAABwUgAAwQoAAAEAAADgUgAAgFIAAMEJAAAAAAAA8FIAAJBSAADBCQAAAQAAAABTAACgUgAAoQgAAAAAAAAQUwAAsFIAAKEIAAABAAAAIFMAAMBSAAAhBQAAAAAAADBTAADQUgAAIQUAAAEAAABAUwAA4FIAAEEEAAAAAAAAUFMAAPBSAABBBAAAAQAAAGBTAAAAUwAAoQIAAAAAAABwUwAAEFMAAKECAAABAAAAgFMAACBTAAAhAgAAAAAAAJBTAAAwUwAAIQIAAAEAAACgUwAAQFMAAEEBAAAAAAAAsFMAAFBTAABBAQAAAQAAAMBTAABgUwAAEQEAAAAAAADQUwAAcFMAABEBAAABAAAA4FMAAIBTAACFAAAAAAAAAPBTAACQUwAAhQAAAAEAAAAAVAAAoFMAAEkAAAAAAAAAEFQAALBTAABJAAAAAQAAACBUAADAUwAAJQAAAAAAAAAwVAAA0FMAACUAAAABAAAAQFQAAOBTAAAVAAAAAAAAAFBUAADwUwAAFQAAAAEAAABgVAAAAFQAAAkAAAAAAAAAcFQAABBUAAAJAAAAAQAAAIBUAAAgVAAABQAAAAAAAACQVAAAMFQAAAUAAAABAAAAoFQAAEBUAAABAAAAAAAAAJBUAABQVAAAAQAAAAEAAACgVAAAYFQAAAFWAAAAAAAAsFQAALBUAAABVgAAAQAAAMBUAADAVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHZuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZm8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB2bwBCwcBAAEAAQABAEHpvAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGIvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGAwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHAwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAPhiAEGAwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHRwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBi8IBCwEMAEGXwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABBxcIBCwEQAEHRwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABB/8IBCwESAEGLwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBwsMBCw4aAAAAGhoaAAAAAAAACQBB88MBCwEUAEH/wwELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBrcQBCwEWAEG5xAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB4MQBCwmQbAEAAAAAAAUAQfTEAQsBaQBBjMUBCwpqAAAAawAAAHhoAEGkxQELAQIAQbTFAQsI//////////8AQfjFAQsBBQBBhMYBCwFsAEGcxgELDmoAAABtAAAAiGgAAAAEAEG0xgELAQEAQcTGAQsF/////wo="); - return receiveInstance(instantiateSync(u, e)[0]); - })(); - N.q, (a._malloc = N.r), (a._free = N.s), (a._jp2_decode = N.u); - w = function runCaller() { - b || run(); - b || (w = runCaller); - }; - function run() { - if (!(m > 0)) { - !(function preRun() { - if (a.preRun) { - "function" == typeof a.preRun && (a.preRun = [a.preRun]); - for (; a.preRun.length; ) (e = a.preRun.shift()), d.unshift(e); - } - var e; - callRuntimeCallbacks(d); - })(); - if (!(m > 0)) - if (a.setStatus) { - a.setStatus("Running..."); - setTimeout(function () { - setTimeout(function () { - a.setStatus(""); - }, 1); - doRun(); - }, 1); - } else doRun(); - } - function doRun() { - if (!b) { - b = !0; - a.calledRun = !0; - !(function initRuntime() { - callRuntimeCallbacks(f); - })(); - t(a); - a.onRuntimeInitialized && a.onRuntimeInitialized(); - !(function postRun() { - if (a.postRun) { - "function" == typeof a.postRun && (a.postRun = [a.postRun]); - for (; a.postRun.length; ) - (e = a.postRun.shift()), p.unshift(e); - } - var e; - callRuntimeCallbacks(p); - })(); - } - } - } - if (a.preInit) { - "function" == typeof a.preInit && (a.preInit = [a.preInit]); - for (; a.preInit.length > 0; ) a.preInit.pop()(); - } - run(); - return a; + return (await decoder.decode()).image; + } catch (reason) { + warn(`getTransferableImage - failed: "${reason}".`); + return null; + } finally { + decoder?.close(); + } + } +} // ./external/openjpeg/openjpeg.js + +var OpenJPEG = (() => { + var _scriptName = + typeof document != "undefined" ? document.currentScript?.src : undefined; + return function (moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; }); -const Ii = oi; -class JpxError extends rt { - constructor(e) { - super(e, "JpxError"); + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + Module.decode = function ( + bytes, + { numComponents = 4, isIndexedColormap = false, smaskInData = false }, + ) { + const size = bytes.length; + const ptr = Module._malloc(size); + Module.HEAPU8.set(bytes, ptr); + const ret = Module._jp2_decode( + ptr, + size, + numComponents > 0 ? numComponents : 0, + !!isIndexedColormap, + !!smaskInData, + ); + Module._free(ptr); + if (ret) { + const { errorMessages: errorMessages } = Module; + if (errorMessages) { + delete Module.errorMessages; + return errorMessages; + } + return "Unknown error"; + } + const { imageData: imageData } = Module; + Module.imageData = null; + return imageData; + }; + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var scriptDirectory = ""; + var read_, readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.substr( + 0, + scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1, + ); + } + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = (url, onload, onerror) => { + fetch(url, { + credentials: "same-origin", + }) + .then((response) => { + if (response.ok) { + return response.arrayBuffer(); + } + return Promise.reject( + new Error(response.status + " : " + response.url), + ); + }) + .then(onload, onerror); + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + if (Module["quit"]) quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + function intArrayFromBase64(s) { + var decoded = atob(s); + var bytes = new Uint8Array(decoded.length); + for (var i = 0; i < decoded.length; ++i) { + bytes[i] = decoded.charCodeAt(i); + } + return bytes; + } + function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); + } + var wasmMemory; + var ABORT = false; + var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + } + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + } + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + var isDataURI = (filename) => filename.startsWith(dataURIPrefix); + function findWasmBinary() { + var f = + "data:application/octet-stream;base64,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A0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECUiAARAIABBACABEBUaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECUL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLIAALJwEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBAEEAEGsgA0EQaiQAC+gFAQl/IAFFBEBBAA8LAn8gAEUE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ACAEIE5BCmpBAiAFEBpBAkcEQCAFQQFBAiAAKAK4ARtBlhJBABAPIAAoArgBRSFnDAELIE5BCmogTkEMakECEBEgTigCDCIBQZD/A0YNACABQdn/A0YEQCAAQYACNgIIIABBADYCzAEMAQsgBCkDCCKGAVAEfkIABSCGASAEKQM4fQtQBEAgAEHAADYCCCAFQQJBrD9BABAPDAELQQAhZyAFQQFB7D5BABAPCyBOQRBqJAAgZwsLACAABEAgABAQCwu0AQEBfyAAKAIMRQRAIAIgACgCJCABEQMADwsCQEEIEBQiA0UNACADIAI2AgQgAyABNgIAQQgQFCIBRQRAIAMQEA8LIAEgAzYCACAAIAAoAgRB5ABsIgI2AigDQCAAKAIYIAJKDQALIAEgACgCFDYCBCAAIAE2AhQgACAAKAIYQQFqNgIYIAAoAhwiAUUNACABKAIAQQA2AgggACABKAIENgIcIAAgACgCIEEBazYCICABEBALC/oCAQR/AkAgAEUNACAAKAKsKCIBBEAgACgCqCgiAgRAQQAhAQNAIAAoAqwoIAFBA3RqKAIAIgMEQCADEBAgACgCqCghAgsgAUEBaiIBIAJJDQALIAAoAqwoIQELIABBADYCqCggARAQIABBADYCrCgLIAAoArQoIgEEQCABEBAgAEEANgK0KAsgACgC0CsiAQRAIAEQECAAQQA2AtArCyAAKALsKyIBBEAgARAQIABBADYC7CsLIAAoAugrIgEEQCABEBAgAEEANgLoKwsgACgC/CsiAQRAIAEQECAAQQA2AoQsIABCADcC/CsLIAAoAvArIgEEQCAAKAL0KyIDBH9BACECA0AgASgCDCIEBEAgBBAQIAFBADYCDCAAKAL0KyEDCyABQRRqIQEgAkEBaiICIANJDQALIAAoAvArBSABCxAQIABBADYC8CsLIAAoAuQrIgEEQCABEBAgAEEANgLkKwsgACgC3CsiAUUNACABEBAgAEIANwLcKwsLyAcCEX8BfiAAKAIQIghBIE8EQCAAKQMIpw8LAkAgACgCFCIDQQROBEAgACgCACICQQNrKAIAIQEgACADQQRrIgM2AhQgACACQQRrNgIADAELIANBAEwEQAwBCyADQQFxIQ0gACgCACECAkAgA0EBRgRAQRghBAwBCyADQf7///8HcSEJQRghBANAIAAgAkEB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IABBADYCiAEgACgCZBAQIABBADYCZCAALQC8AUECcUUEQCAAKAKoARAQCyAAQdAAakEAQfAAEBUaIAAoAsABEDIgAEEANgLAASAAKALEARAyIABBADYCwAEgACgCyAEiAQRAIAEoAhwiAgRAIAIQECABQQA2AhwLIAEoAigiAgRAIAEoAiQEQANAIAIgBUEobCIDaigCJCIEBEAgBBAQIAEoAigiAiADakEANgIkCyACIANqKAIQIgQEQCAEEBAgASgCKCICIANqQQA2AhALIAIgA2ooAhgiBARAIAQQECABKAIoIgIgA2pBADYCGAsgBUEBaiIFIAEoAiRJDQALCyACEBAgAUEANgIoCyABEBALIABBADYCyAEgACgCSBAhIABBADYCSCAAKAJMECEgAEEANgJMIAAoAtQBIgMEQAJAIAMoAghFDQAgAygCDARAIANBADYCKANAIAMoAhhBAEoNAAsLIANBATYCECADKAIAEBAgAygCHCICRQ0AA0AgAigCBCEBIAIQECADIAE2AhwgASICDQALCyADKAIkIgIEQCACKAIEIgVBAEoEQEEAIQEDQCACKAIAIAFBDGxqIgQoAggiBgRAIAQoAgQgBhECACACKAIEIQULIAFBAWoiASAFSA0ACwsgAigCABAQIAIQEAsgAxAQCyAAQQA2AtQBIAAQEAsL5gMCCH8EfiAAKAIUKAIAKAIUIAFBzABsaiIJKAIMIgggACgCGCgCGCABQTRsaiIKNQIEIhBCAX0iEiAANQI8fCAQgKciCyAIIAtJGyEMIAkoAggiCCAKNQIAIhFCAX0iEyAANQI4fCARgKciCiAIIApJGyEKIAkoAgQiCCASIAA1AjR8IBCApyILIAggC0sbIQsgCSgCACIIIBMgADUCMHwgEYCnIg0gCCANSxshDUEAIQggACgCICgC0CsgAUG4CGxqKAIUIQ4CQCAJKAIUQQAgAmtBfyACG2oiAkUEQCAKIQAgDSEIIAshAQwBCyADQQFxIAJBAWsiD3QiCSANSQRAIA0gCWutQn8gAq0iEIZCf4V8IBCIpyEIC0EAIQBBACEBIANBAXYgD3QiAyALSQRAIAsgA2utQn8gAq0iEIZCf4V8IBCIpyEBCyAJIApJBEAgCiAJa61CfyACrSIQhkJ/hXwgEIinIQALIAMgDE8EQEEAIQwMAQsgDCAD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IABBADYCPCAAQucHNwI0IABBADYCLCAAQucHNwIkIABBADYCHCAAQucHNwIUIABBADYCDCAAQucHNwIEIABBQGshACACQQRqIgIgA0cNAAsLIAFBA3EiAUUNAEEAIQIDQCAAQQA2AgwgAELnBzcCBCAAQRBqIQAgAkEBaiICIAFHDQALCwv7BQEQfyMAQYACayIIJAACf0EBQRQQEyIGRQRAIAJBAUH0MEEAEA9BAAwBCyAGIAE2AgQgBiAANgIAIAggATYCACAIIAA2AoABA0AgCCAFIg1BAWoiBUECdCIHaiABQQFqQQJtIgM2AgAgCEGAAWogB2ogAEEBakECbSIHNgIAIAQgACABbCIJaiEEIAMhASAHIQAgCUEBSw0ACyAGIAQ2AgggBEUEQCAGEBBBAAwBCyAGIARBEBATIgM2AgwgA0UEQCACQQFB2hpBABAPIAYQEEEADAELIAYgBigCCCILQQR0NgIQIAMhACANBEAgAyAGKAIEIAYoAgBsQQR0aiIEIQEDQAJAIAggDkECdCICaigCACIJQQBMDQAgCUEBayEMQQAhBwJAIAhBgAFqIAJqKAIAIgJBAEwEQEEAIQUgCUEBRwRAIAlB/v///wdxIQoDQCAFIAxGIQ8gBUECaiEFIAEgBCAPGyIEIQEgB0ECaiIHIApHDQALCyAJQQFxDQEgBCEBDAILA0AgBCEFIAIhBANAAkAgACABNgIAIARBAUYEQCAAQRBqIQAgAUEQaiEBDAELIAAgATYCECABQRBqIQEgAEEgaiEAIARBAkohECAEQQJrIQQgEA0BCwsgASAFIAJBBHRqIAcgByAMRnJBAXEiChshBCABIAUgChshASAHQQFqIgcgCUcNAAsMAQsgASAEIAJBBHRqIAUgBSAMRnJBAXEiBRshESABIAQgBRshASARIQQLIA5BAWoiDiANRw0ACwsgAEEANgIAAkAgC0UNACALQQRPBEAgC0F8cSEAQQAhAQNAIANBADYCPCADQucHNwI0IANBADYCLCADQucHNwIkIANBADYCHCADQucHNwIUIANBADYCDCADQucHNwIEIANBQGshAyABQQRqIgEgAEcNAAsLIAtBA3EiAEUNAEEAIQEDQCADQQA2AgwgA0LnBzcCBCADQRBqIQMgAUEBaiIBIABHDQALCyAGCyESIAhBgAJqJAAgEgtTAQF/An8gAC0ADEH/AUYEQCAAQoD+g4DwADcCDEEAIAAoAggiASAAKAIETw0BGiAAIAFBAWo2AgggACABLQAAQYD+A3I2AgwLIABBADYCEEEBCwt+AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARBlIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLSQEBfwJAQQFBLBATIgEEQCABQQA2AhACQCAAQQBMBEAgAUEBQQgQEyIANgIkIABFDQEMAwsgAUEANgIMCyABEBALQQAhAQsgAQuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGU0AEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTHAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsE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AyAAQRh2NgIUIAMgBDYCECADIABBCHZB/wFxNgIcIAMgAEEQdkH/AXE2AhggAkEBQc31ACADQRBqEA8MBwsgBSAITQRAIAYhBAwECyAFIQggBiAFEBciBA0DIAYQECACQQFB/w9BABAPQQAMBwsgBEECcUUEQCACQQFBwg9BABAPIAYQEEEADAcLIAAgBEH/////B3I2AmQgASAHIAVrrSINIAIgASgCKBEIACANUQ0DIAAtAGRBCHFFDQEgAkECQZIcQQAQDwsgBhAQQQEMBQsgAkEBQZIcQQAQDyAGEBBBAAwECyABIAQgBSACEBogBUcEQCACQQFBxBxBABAPIAQQEEEADAQLIAAgBCIGIAUgAiAKKAIEEQEADQALIAQQEEEADAILIAJBAUGiJUEAEA9BAAwBCyAGEBBBAAshDCADQfAAaiQAIAwL5gEBBn8gACgCCEE1IAIQJARAAkAgACgCCCIGKAIAIQMgBigCCCEFAkACQAJ/AkAgAwRAQQEhBCADQQFxIQcgA0EBRw0BQQAMAgsgBkEANgIADAILIANBfnEhAwNAAn9BACAERQ0AGkEAIAAgASACIAUoAgARAABFDQAaIAAgASACIAUoAgQRAABBAEcLIQQgBUEIaiEFIAhBAmoiCCADRw0ACyAERQshAyAHBEAgAw0CIAAgASACIAUoAgARAABBAEchBAsgBkEANgIAIARFDQILIAAoAgAaQQEPCyAGQQA2AgALC0EACwoAIAAoAgAaQQALFAAgACgCACIABEAgACABNgK4AQsLIQAgACgCACABEFMgAEEAOgB8IAAgASgCuEBBAXE2AoABCzIAIAJFBEBBAA8LIAAoAgAgASACIAMQSEUEQCADQQFBqS9BABAPQQAPCyAAIAIgAxBxC2kCAn8BfCMAQRBrIgMkACACBEADQCAAIANBCGoQRCABAn8gAysDCCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAs2AgAgAUEEaiEBIABBCGohACAEQQFqIgQgAkcNAAsLIANBEGokAAuEAQICfwF9IwBBEGsiAyQAIAIEQANAIAMgAC0AADoADyADIAAtAAE6AA4gAyAALQACOgANIAMgAC0AAzoADCABAn8gAyoCDCIFi0MAAABPXQRAIAWoDAELQYCAgIB4CzYCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0sBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQESABIAMoAgw2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMNgIAIAFBBGohASAAQQJqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSgECfyMAQRBrIgMkACACBEADQCAAIANBCGoQRCABIAMrAwi2OAIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALaAECfyMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgASADKgIMOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBBBARIAEgAygCDLM4AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtMAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMszgCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC6oIAg1/AXsjAEEQayIIJAACfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEJAkAgAkUEQCADQQFB8B9BABAPDAELIAAoAkghBkEBIQQgASAIQQhqQQEQESAIKAIIIgVBAk8EQCADQQJBxsgAQQAQDwwBCyACIAVBAWpHBEBBACEEIANBAkHwH0EAEA8MAQsCQCAGKAIQIgNFDQAgCSgC0CshBCADQQhPBEAgA0F4cSEGQQAhAgNAIARBADYCvEMgBEEANgKEOyAEQQA2AswyIARBADYClCogBEEANgLcISAEQQA2AqQZIARBADYC7BAgBEEANgK0CCAEQcDDAGohBCACQQhqIgIgBkcNAAsLIANBB3EiA0UNAEEAIQIDQCAEQQA2ArQIIARBuAhqIQQgAkEBaiICIANHDQALCyAJKALoKyICBH8gAhAQIAlBADYC6CsgCCgCCAUgBQtFBEBBASEEDAELA0AgAUEBaiIBIAhBDGpBARARAkAgCSgCgCxF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KT0ALgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFBMTSBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXIKAEV4cGVjdGVkIEVQSCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlcgoAVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyCgBVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDRCBtYXJrZXIKAENycm9yIHJlYWRpbmcgQ0JEIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNDIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXIKAHJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBmaWxlIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXIKAEVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlcgoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXAKAHRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb24KAE1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uCgBQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvbgoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uCgBJbnZhbGlkIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIG90aGVyIHRoYW4gYXJyYXkgZGVjb3JyZWxhdGlvbgoAVG9vIGxhcmdlIHZhbHVlIGZvciBOcHBtCgBOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbQoAYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW0KAAkgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JWxsaQoJIE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lbGxpCgBNYXJrZXIgc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBUaWxlIHBhcnQgbGVuZ3RoIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmcKAFdyb25nIGZsYWcKAEVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemUKAEVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplCgBJbnZhbGlkIHByZWNpbmN0IHNpemUKAEluY29uc2lzdGVudCBtYXJrZXIgc2l6ZQoASW52YWxpZCBtYXJrZXIgc2l6ZQoARXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZQoATm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUKAEZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aCBpbmRpeCBzaHVmZmxlCgBDYW5ub3QgYWxsb2NhdGUgVGllciAxIGhhbmRsZQoATm8gZGVjb2RlZCBhcmVhIHBhcmFtZXRlcnMsIHNldCB0aGUgZGVjb2RlZCBhcmVhIHRvIHRoZSB3aG9sZSBpbWFnZQoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgdHJhbnNmb3JtYXRpb24gZm91bmQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudC4gVW5zdXBwb3J0ZWQgTWl4ZWQgSFQgY29kZS1ibG9jayBzdHlsZSBmb3VuZAoAVGlsZSBZIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBUaWxlIFggY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAEltYWdlIGNvb3JkaW5hdGVzIGFib3ZlIElOVF9NQVggYXJlIG5vdCBzdXBwb3J0ZWQKAEpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWQKAG9wal9qMmtfbWVyZ2VfcHB0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGV0aXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAE9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAAABQAADAUAAAAUgAAAAAAAAQUAAAsFAAAAFIAAABAAAAIFAAAMBQAAABOAAAAAAAADBQAACwUAAAATgAAAEAAABAUAAAwFAAAAEwAAAAAAAAUFAAABBRAAABMAAAAQAAAGBQAAAgUQAAASQAAAAAAABwUAAAMFEAAAEkAAABAAAAgFAAAEBRAAABHAAAAAAAAJBQAABwUQAAARwAAAEAAACgUAAAgFEAAAEWAAAAAAAAkFIAAJBRAAABFgAAAQAAAKBSAACgUQAAAVYAAAAAAADQUAAAwFAAAAFWAAABAAAA4FAAALBQAAABVAAAAAAAAPBQAACwUAAAAVQAAAEAAAAAUQAAwFAAAAFRAAAAAAAAEFEAANBQAAABUQAAAQAAACBRAADgUAAAAUgAAAAAAAAwUQAA8FAAAAFIAAABAAAAQFEAAABRAAABOAAAAAAAAFBRAAAQUQAAATgAAAEAAABgUQAAIFEAAAE0AAAAAAAAcFEAADBRAAABNAAAAQAAAIBRAABAUQAAATAAAAAAAACQUQAAUFEAAAEwAAABAAAAoFEAAGBRAAABKAAAAAAAALBRAABQUQAAASgAAAEAAADAUQAAYFEAAAEkAAAAAAAA0FEAAHBRAAABJAAAAQAAAOBRAACAUQAAASIAAAAAAADwUQAAkFEAAAEiAAABAAAAAFIAAKBRAAABHAAAAAAAABBSAACwUQAAARwAAAEAAAAgUgAAwFEAAAEYAAAAAAAAMFIAANBRAAABGAAAAQAAAEBSAADgUQAAARYAAAAAAABQUgAA8FEAAAEWAAABAAAAYFIAAABSAAABFAAAAAAAAHBSAAAQUgAAARQAAAEAAACAUgAAIFIAAAESAAAAAAAAkFIAADBSAAABEgAAAQAAAKBSAABAUgAAAREAAAAAAACwUgAAUFIAAAERAAABAAAAwFIAAGBSAADBCgAAAAAAANBSAABwUgAAwQoAAAEAAADgUgAAgFIAAMEJAAAAAAAA8FIAAJBSAADBCQAAAQAAAABTAACgUgAAoQgAAAAAAAAQUwAAsFIAAKEIAAABAAAAIFMAAMBSAAAhBQAAAAAAADBTAADQUgAAIQUAAAEAAABAUwAA4FIAAEEEAAAAAAAAUFMAAPBSAABBBAAAAQAAAGBTAAAAUwAAoQIAAAAAAABwUwAAEFMAAKECAAABAAAAgFMAACBTAAAhAgAAAAAAAJBTAAAwUwAAIQIAAAEAAACgUwAAQFMAAEEBAAAAAAAAsFMAAFBTAABBAQAAAQAAAMBTAABgUwAAEQEAAAAAAADQUwAAcFMAABEBAAABAAAA4FMAAIBTAACFAAAAAAAAAPBTAACQUwAAhQAAAAEAAAAAVAAAoFMAAEkAAAAAAAAAEFQAALBTAABJAAAAAQAAACBUAADAUwAAJQAAAAAAAAAwVAAA0FMAACUAAAABAAAAQFQAAOBTAAAVAAAAAAAAAFBUAADwUwAAFQAAAAEAAABgVAAAAFQAAAkAAAAAAAAAcFQAABBUAAAJAAAAAQAAAIBUAAAgVAAABQAAAAAAAACQVAAAMFQAAAUAAAABAAAAoFQAAEBUAAABAAAAAAAAAJBUAABQVAAAAQAAAAEAAACgVAAAYFQAAAFWAAAAAAAAsFQAALBUAAABVgAAAQAAAMBUAADAVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHZuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZm8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB2bwBCwcBAAEAAQABAEHpvAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGIvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGAwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHAwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAPhiAEGAwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHRwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBi8IBCwEMAEGXwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABBxcIBCwEQAEHRwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABB/8IBCwESAEGLwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBwsMBCw4aAAAAGhoaAAAAAAAACQBB88MBCwEUAEH/wwELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBrcQBCwEWAEG5xAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB4MQBCwmQbAEAAAAAAAUAQfTEAQsBaQBBjMUBCwpqAAAAawAAAHhoAEGkxQELAQIAQbTFAQsI//////////8AQfjFAQsBBQBBhMYBCwFsAEGcxgELDmoAAABtAAAAiGgAAAAEAEG0xgELAQEAQcTGAQsF/////wo="; + return f; + } + var wasmBinaryFile; + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; + } + if (readBinary) { + return readBinary(file); + } + throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; + } + function instantiateSync(file, info) { + var module; + var binary = getBinarySync(file); + module = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return [instance, module]; + } + function getWasmImports() { + return { + a: wasmImports, + }; + } + function createWasm() { + var info = getWasmImports(); + function receiveInstance(instance, module) { + wasmExports = instance.exports; + wasmMemory = wasmExports["p"]; + updateMemoryViews(); + addOnInit(wasmExports["q"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + addRunDependency("wasm-instantiate"); + if (Module["instantiateWasm"]) { + try { + return Module["instantiateWasm"](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + readyPromiseReject(e); + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + var result = instantiateSync(wasmBinaryFile, info); + return receiveInstance(result[0]); + } + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var noExitRuntime = Module["noExitRuntime"] || true; + var __emscripten_memcpy_js = (dest, src, num) => + HEAPU8.copyWithin(dest, src, src + num); + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray(nb_pixels)); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + imageData.set(compG); + } + function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray( + nb_pixels * 3, + )); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[3 * i] = compR[i]; + imageData[3 * i + 1] = compG[i]; + imageData[3 * i + 2] = compB[i]; + } + } + function _copy_pixels_4( + compR_ptr, + compG_ptr, + compB_ptr, + compA_ptr, + nb_pixels, + ) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + compA_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray( + nb_pixels * 4, + )); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = compA[i]; + } + } + var getHeapMax = () => 2147483648; + var growMemory = (size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + var alignUp = (x, multiple) => + x + ((multiple - (x % multiple)) % multiple); + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296, + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536), + ); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + var ENV = {}; + var getExecutableName = () => thisProgram || "./this.program"; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = + ( + (typeof navigator == "object" && + navigator.languages && + navigator.languages[0]) || + "C" + ).replace("-", "_") + ".UTF-8"; + var env = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName(), + }; + for (var x in ENV) { + if (ENV[x] === undefined) delete env[x]; + else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }; + var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + HEAP8[buffer] = 0; + }; + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(__environ + i * 4) >> 2] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + }; + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach((string) => (bufSize += string.length + 1)); + HEAPU32[penviron_buf_size >> 2] = bufSize; + return 0; + }; + var _fd_close = (fd) => 52; + var convertI32PairToI53Checked = (lo, hi) => + (hi + 2097152) >>> 0 < 4194305 - !!lo + ? (lo >>> 0) + hi * 4294967296 + : NaN; + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + return 70; + } + var printCharBuffers = [null, [], []]; + var UTF8Decoder = + typeof TextDecoder != "undefined" ? new TextDecoder("utf8") : undefined; + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); + } + } + return str; + }; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var UTF8ToString = (ptr, maxBytesToRead) => + ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + var _fd_write = (fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[(iov + 4) >> 2]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAPU32[pnum >> 2] = num; + return 0; + }; + function _gray_to_rgba(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray( + nb_pixels * 4, + )); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = + imageData[4 * i + 1] = + imageData[4 * i + 2] = + compG[i]; + imageData[4 * i + 3] = 255; + } + } + function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { + compG_ptr >>= 2; + compA_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray( + nb_pixels * 4, + )); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = + imageData[4 * i + 1] = + imageData[4 * i + 2] = + compG[i]; + imageData[4 * i + 3] = compA[i]; + } + } + function _jsPrintWarning(message_ptr) { + const message = UTF8ToString(message_ptr); + (Module.warn || console.warn)(`OpenJPEG: ${message}`); + } + function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = (Module.imageData = new Uint8ClampedArray( + nb_pixels * 4, + )); + const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = 255; + } + } + function _storeErrorMessage(message_ptr) { + const message = UTF8ToString(message_ptr); + if (!Module.errorMessages) { + Module.errorMessages = message; + } else { + Module.errorMessages += "\n" + message; + } + } + var wasmImports = { + c: __emscripten_memcpy_js, + g: _copy_pixels_1, + f: _copy_pixels_3, + e: _copy_pixels_4, + k: _emscripten_resize_heap, + l: _environ_get, + m: _environ_sizes_get, + n: _fd_close, + j: _fd_seek, + b: _fd_write, + o: _gray_to_rgba, + i: _graya_to_rgba, + d: _jsPrintWarning, + h: _rgb_to_rgba, + a: _storeErrorMessage, + }; + var wasmExports = createWasm(); + var ___wasm_call_ctors = wasmExports["q"]; + var _malloc = (Module["_malloc"] = wasmExports["r"]); + var _free = (Module["_free"] = wasmExports["s"]); + var _jp2_decode = (Module["_jp2_decode"] = wasmExports["u"]); + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; + }; + function run() { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function () { + setTimeout(function () { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = Module; + return moduleRtn; + }; +})(); +/* harmony default export */ const openjpeg = OpenJPEG; // ./src/core/jpx.js +class JpxError extends BaseException { + constructor(msg) { + super(msg, "JpxError"); } } class JpxImage { - static #y = null; - static decode(e, t) { - t ||= {}; - this.#y ||= Ii({ warn }); - const i = this.#y.decode(e, t); - if ("string" == typeof i) throw new JpxError(i); - return i; + static #module = null; + static decode(data, decoderOptions) { + decoderOptions ||= {}; + this.#module ||= openjpeg({ + warn: warn, + }); + const imageData = this.#module.decode(data, decoderOptions); + if (typeof imageData === "string") { + throw new JpxError(imageData); + } + return imageData; } static cleanup() { - this.#y = null; + this.#module = null; } - static parseImageProperties(e) { - let t = e.getByte(); - for (; t >= 0; ) { - const i = t; - t = e.getByte(); - if (65361 === ((i << 8) | t)) { - e.skip(4); - const t = e.getInt32() >>> 0, - i = e.getInt32() >>> 0, - a = e.getInt32() >>> 0, - s = e.getInt32() >>> 0; - e.skip(16); + static parseImageProperties(stream) { + let newByte = stream.getByte(); + 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(); return { - width: t - a, - height: i - s, + width: Xsiz - XOsiz, + height: Ysiz - YOsiz, bitsPerComponent: 8, - componentsCount: e.getUint16(), + componentsCount: Csiz, }; } } throw new JpxError("No size marker found in JPX stream"); } -} +} // ./src/core/jpx_stream.js + class JpxStream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.stream = e; - this.dict = e.dict; - this.maybeLength = t; - this.params = i; + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; } get bytes() { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } - ensureBuffer(e) {} - readBlock(e) { - this.decodeImage(null, e); + ensureBuffer(requested) {} + readBlock(decoderOptions) { + this.decodeImage(null, decoderOptions); } - decodeImage(e, t) { - if (this.eof) return this.buffer; - e ||= this.bytes; - this.buffer = JpxImage.decode(e, t); + decodeImage(bytes, decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes ||= this.bytes; + this.buffer = JpxImage.decode(bytes, decoderOptions); this.bufferLength = this.buffer.length; - this.eof = !0; + this.eof = true; return this.buffer; } get canAsyncDecodeImageFromBuffer() { return this.stream.isAsync; } -} +} // ./src/core/lzw_stream.js + class LZWStream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.str = e; - this.dict = e.dict; + constructor(str, maybeLength, earlyChange) { + super(maybeLength); + this.str = str; + this.dict = str.dict; this.cachedData = 0; this.bitsCached = 0; - const a = 4096, - s = { - earlyChange: i, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(a), - dictionaryLengths: new Uint16Array(a), - dictionaryPrevCodes: new Uint16Array(a), - currentSequence: new Uint8Array(a), - currentSequenceLength: 0, - }; - for (let e = 0; e < 256; ++e) { - s.dictionaryValues[e] = e; - s.dictionaryLengths[e] = 1; + 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; } - this.lzwState = s; + this.lzwState = lzwState; } - readBits(e) { - let t = this.bitsCached, - i = this.cachedData; - for (; t < e; ) { - const e = this.str.getByte(); - if (-1 === e) { - this.eof = !0; + readBits(n) { + let bitsCached = this.bitsCached; + let cachedData = this.cachedData; + while (bitsCached < n) { + const c = this.str.getByte(); + if (c === -1) { + this.eof = true; return null; } - i = (i << 8) | e; - t += 8; + cachedData = (cachedData << 8) | c; + bitsCached += 8; } - this.bitsCached = t -= e; - this.cachedData = i; + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; this.lastCode = null; - return (i >>> t) & ((1 << e) - 1); + return (cachedData >>> bitsCached) & ((1 << n) - 1); } readBlock() { - let e, - t, - i, - a = 1024; - const s = this.lzwState; - if (!s) return; - const r = s.earlyChange; - let n = s.nextCode; - const g = s.dictionaryValues, - o = s.dictionaryLengths, - c = s.dictionaryPrevCodes; - let C = s.codeLength, - h = s.prevCode; - const l = s.currentSequence; - let Q = s.currentSequenceLength, - E = 0, - u = this.bufferLength, - d = this.ensureBuffer(this.bufferLength + a); - for (e = 0; e < 512; e++) { - const e = this.readBits(C), - s = Q > 0; - if (e < 256) { - l[0] = e; - Q = 1; - } else { - if (!(e >= 258)) { - if (256 === e) { - C = 9; - n = 258; - Q = 0; - continue; - } - this.eof = !0; - delete this.lzwState; - break; - } - if (e < n) { - Q = o[e]; - for (t = Q - 1, i = e; t >= 0; t--) { - l[t] = g[i]; - i = c[i]; - } - } else l[Q++] = l[0]; - } - if (s) { - c[n] = h; - o[n] = o[h] + 1; - g[n] = l[0]; - n++; - C = - (n + r) & (n + r - 1) - ? C - : 0 | Math.min(Math.log(n + r) / 0.6931471805599453 + 1, 12); - } - h = e; - E += Q; - if (a < E) { - do { - a += 512; - } while (a < E); - d = this.ensureBuffer(this.bufferLength + a); - } - for (t = 0; t < Q; t++) d[u++] = l[t]; + const blockSize = 512, + decodedSizeDelta = blockSize; + let estimatedDecodedSize = blockSize * 2; + let i, j, q; + const lzwState = this.lzwState; + if (!lzwState) { + return; } - s.nextCode = n; - s.codeLength = C; - s.prevCode = h; - s.currentSequenceLength = Q; - this.bufferLength = u; + 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); + for (i = 0; i < blockSize; i++) { + const code = this.readBits(codeLength); + const hasPrev = currentSequenceLength > 0; + 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 (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; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; } -} +} // ./src/core/predictor_stream.js + class PredictorStream extends DecodeStream { - constructor(e, t, i) { - super(t); - if (!(i instanceof Dict)) return e; - const a = (this.predictor = i.get("Predictor") || 1); - if (a <= 1) return e; - if (2 !== a && (a < 10 || a > 15)) - throw new FormatError(`Unsupported predictor: ${a}`); - this.readBlock = 2 === a ? this.readBlockTiff : this.readBlockPng; - this.str = e; - this.dict = e.dict; - const s = (this.colors = i.get("Colors") || 1), - r = (this.bits = i.get("BPC", "BitsPerComponent") || 8), - n = (this.columns = i.get("Columns") || 1); - this.pixBytes = (s * r + 7) >> 3; - this.rowBytes = (n * s * r + 7) >> 3; + constructor(str, maybeLength, params) { + super(maybeLength); + if (!(params instanceof Dict)) { + return str; + } + const predictor = (this.predictor = params.get("Predictor") || 1); + if (predictor <= 1) { + return str; + } + if (predictor !== 2 && (predictor < 10 || predictor > 15)) { + throw new FormatError(`Unsupported predictor: ${predictor}`); + } + this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; + this.str = str; + this.dict = str.dict; + const colors = (this.colors = params.get("Colors") || 1); + const bits = (this.bits = params.get("BPC", "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; } readBlockTiff() { - const e = this.rowBytes, - t = this.bufferLength, - i = this.ensureBuffer(t + e), - a = this.bits, - s = this.colors, - r = this.str.getBytes(e); - this.eof = !r.length; - if (this.eof) return; - let n, - g = 0, - o = 0, - c = 0, - C = 0, - h = t; - if (1 === a && 1 === s) - for (n = 0; n < e; ++n) { - let e = r[n] ^ g; - e ^= e >> 1; - e ^= e >> 2; - e ^= e >> 4; - g = (1 & e) << 7; - i[h++] = e; + 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 (this.eof) { + return; + } + let inbuf = 0, + outbuf = 0; + let inbits = 0, + outbits = 0; + let pos = bufferLength; + let i; + 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 (8 === a) { - for (n = 0; n < s; ++n) i[h++] = r[n]; - for (; n < e; ++n) { - i[h] = i[h - s] + r[n]; - h++; + } else if (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; } - } else if (16 === a) { - const t = 2 * s; - for (n = 0; n < t; ++n) i[h++] = r[n]; - for (; n < e; n += 2) { - const e = - ((255 & r[n]) << 8) + - (255 & r[n + 1]) + - ((255 & i[h - t]) << 8) + - (255 & i[h - t + 1]); - i[h++] = (e >> 8) & 255; - i[h++] = 255 & e; + for (; i < rowBytes; ++i) { + buffer[pos] = buffer[pos - colors] + rawBytes[i]; + pos++; + } + } else if (bits === 16) { + const bytesPerPixel = colors * 2; + for (i = 0; i < bytesPerPixel; ++i) { + buffer[pos++] = rawBytes[i]; + } + 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 e = new Uint8Array(s + 1), - h = (1 << a) - 1; - let l = 0, - Q = t; - const E = this.columns; - for (n = 0; n < E; ++n) - for (let t = 0; t < s; ++t) { - if (c < a) { - g = (g << 8) | (255 & r[l++]); - c += 8; + const compArray = new Uint8Array(colors + 1); + const bitMask = (1 << bits) - 1; + let j = 0, + k = bufferLength; + const columns = this.columns; + for (i = 0; i < columns; ++i) { + for (let kk = 0; kk < colors; ++kk) { + if (inbits < bits) { + inbuf = (inbuf << 8) | (rawBytes[j++] & 0xff); + inbits += 8; } - e[t] = (e[t] + (g >> (c - a))) & h; - c -= a; - o = (o << a) | e[t]; - C += a; - if (C >= 8) { - i[Q++] = (o >> (C - 8)) & 255; - C -= 8; + 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; } } - C > 0 && (i[Q++] = (o << (8 - C)) + (g & ((1 << (8 - C)) - 1))); + } + if (outbits > 0) { + buffer[k++] = + (outbuf << (8 - outbits)) + (inbuf & ((1 << (8 - outbits)) - 1)); + } } - this.bufferLength += e; + this.bufferLength += rowBytes; } readBlockPng() { - const e = this.rowBytes, - t = this.pixBytes, - i = this.str.getByte(), - a = this.str.getBytes(e); - this.eof = !a.length; - if (this.eof) return; - const s = this.bufferLength, - r = this.ensureBuffer(s + e); - let n = r.subarray(s - e, s); - 0 === n.length && (n = new Uint8Array(e)); - let g, - o, - c, - C = s; - switch (i) { + const rowBytes = this.rowBytes; + const pixBytes = this.pixBytes; + const predictor = this.str.getByte(); + const rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + const bufferLength = this.bufferLength; + const buffer = this.ensureBuffer(bufferLength + rowBytes); + let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); + if (prevRow.length === 0) { + prevRow = new Uint8Array(rowBytes); + } + let i, + j = bufferLength, + up, + c; + switch (predictor) { case 0: - for (g = 0; g < e; ++g) r[C++] = a[g]; + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } break; case 1: - for (g = 0; g < t; ++g) r[C++] = a[g]; - for (; g < e; ++g) { - r[C] = (r[C - t] + a[g]) & 255; - C++; + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xff; + j++; } break; case 2: - for (g = 0; g < e; ++g) r[C++] = (n[g] + a[g]) & 255; + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xff; + } break; case 3: - for (g = 0; g < t; ++g) r[C++] = (n[g] >> 1) + a[g]; - for (; g < e; ++g) { - r[C] = (((n[g] + r[C - t]) >> 1) + a[g]) & 255; - C++; + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = + (((prevRow[i] + buffer[j - pixBytes]) >> 1) + rawBytes[i]) & 0xff; + j++; } break; case 4: - for (g = 0; g < t; ++g) { - o = n[g]; - c = a[g]; - r[C++] = o + c; + for (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + c; } - for (; g < e; ++g) { - o = n[g]; - const e = n[g - t], - i = r[C - t], - s = i + o - e; - let h = s - i; - h < 0 && (h = -h); - let l = s - o; - l < 0 && (l = -l); - let Q = s - e; - Q < 0 && (Q = -Q); - c = a[g]; - r[C++] = h <= l && h <= Q ? i + c : l <= Q ? o + c : e + c; + 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; + if (pa < 0) { + pa = -pa; + } + let pb = p - up; + if (pb < 0) { + pb = -pb; + } + let pc = p - upLeft; + if (pc < 0) { + pc = -pc; + } + c = rawBytes[i]; + if (pa <= pb && pa <= pc) { + buffer[j++] = left + c; + } else if (pb <= pc) { + buffer[j++] = up + c; + } else { + buffer[j++] = upLeft + c; + } } break; default: - throw new FormatError(`Unsupported predictor: ${i}`); + throw new FormatError(`Unsupported predictor: ${predictor}`); } - this.bufferLength += e; + this.bufferLength += rowBytes; } -} +} // ./src/core/run_length_stream.js + class RunLengthStream extends DecodeStream { - constructor(e, t) { - super(t); - this.str = e; - this.dict = e.dict; + constructor(str, maybeLength) { + super(maybeLength); + this.str = str; + this.dict = str.dict; } readBlock() { - const e = this.str.getBytes(2); - if (!e || e.length < 2 || 128 === e[0]) { - this.eof = !0; + const repeatHeader = this.str.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; return; } - let t, - i = this.bufferLength, - a = e[0]; - if (a < 128) { - t = this.ensureBuffer(i + a + 1); - t[i++] = e[1]; - if (a > 0) { - const e = this.str.getBytes(a); - t.set(e, i); - i += a; + let buffer; + let bufferLength = this.bufferLength; + let n = repeatHeader[0]; + if (n < 128) { + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + const source = this.str.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; } } else { - a = 257 - a; - const s = e[1]; - t = this.ensureBuffer(i + a + 1); - for (let e = 0; e < a; e++) t[i++] = s; + n = 257 - n; + const b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (let i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } } - this.bufferLength = i; + this.bufferLength = bufferLength; } +} // ./src/core/parser.js + +const MAX_LENGTH_TO_CACHE = 1000; +function getInlineImageCacheKey(bytes) { + const strBuf = [], + ii = bytes.length; + let i = 0; + while (i < ii - 1) { + strBuf.push((bytes[i++] << 8) | bytes[i++]); + } + if (i < ii) { + strBuf.push(bytes[i]); + } + return ii + "_" + String.fromCharCode.apply(null, strBuf); } class Parser { - constructor({ - lexer: e, - xref: t, - allowStreams: i = !1, - recoveryMode: a = !1, - }) { - this.lexer = e; - this.xref = t; - this.allowStreams = i; - this.recoveryMode = a; + 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._imageId = 0; this.refill(); @@ -8918,7 +11530,7 @@ class Parser { this.buf2 = this.lexer.getObj(); } shift() { - if (this.buf2 instanceof Cmd && "ID" === this.buf2.cmd) { + if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { this.buf1 = this.buf2; this.buf2 = null; } else { @@ -8929,483 +11541,600 @@ class Parser { tryShift() { try { this.shift(); - return !0; + return true; } catch (e) { - if (e instanceof MissingDataException) throw e; - return !1; + if (e instanceof MissingDataException) { + throw e; + } + return false; } } - getObj(e = null) { - const t = this.buf1; + getObj(cipherTransform = null) { + const buf1 = this.buf1; this.shift(); - if (t instanceof Cmd) - switch (t.cmd) { + if (buf1 instanceof Cmd) { + switch (buf1.cmd) { case "BI": - return this.makeInlineImage(e); + return this.makeInlineImage(cipherTransform); case "[": - const i = []; - for (; !isCmd(this.buf1, "]") && this.buf1 !== pt; ) - i.push(this.getObj(e)); - if (this.buf1 === pt) { - if (this.recoveryMode) return i; + const array = []; + while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { + array.push(this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return array; + } throw new ParserEOFException("End of file inside array."); } this.shift(); - return i; + return array; case "<<": - const a = new Dict(this.xref); - for (; !isCmd(this.buf1, ">>") && this.buf1 !== pt; ) { + const dict = new Dict(this.xref); + while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { if (!(this.buf1 instanceof Name)) { info("Malformed dictionary: key must be a name object"); this.shift(); continue; } - const t = this.buf1.name; + const key = this.buf1.name; this.shift(); - if (this.buf1 === pt) break; - a.set(t, this.getObj(e)); - } - if (this.buf1 === pt) { - if (this.recoveryMode) return a; - throw new ParserEOFException("End of file inside dictionary."); - } - if (isCmd(this.buf2, "stream")) - return this.allowStreams ? this.makeStream(a, e) : a; - this.shift(); - return a; - default: - return t; - } - if (Number.isInteger(t)) { - if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { - const e = Ref.get(t, this.buf1); - this.shift(); - this.shift(); - return e; - } - return t; - } - return "string" == typeof t && e ? e.decryptString(t) : t; - } - findDefaultInlineStreamEnd(e) { - const { knownCommands: t } = this.lexer, - i = e.pos; - let a, - s, - r = 0; - for (; -1 !== (a = e.getByte()); ) - if (0 === r) r = 69 === a ? 1 : 0; - else if (1 === r) r = 73 === a ? 2 : 0; - else if (32 === a || 10 === a || 13 === a) { - s = e.pos; - const i = e.peekBytes(15), - n = i.length; - if (0 === n) break; - for (let e = 0; e < n; e++) { - a = i[e]; - if ( - (0 !== a || 0 === i[e + 1]) && - 10 !== a && - 13 !== a && - (a < 32 || a > 127) - ) { - r = 0; - break; - } - } - if (2 !== r) continue; - if (!t) { - warn( - "findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.", - ); - continue; - } - const g = new Lexer(new Stream(i.slice()), t); - g._hexStringWarn = () => {}; - let o = 0; - for (;;) { - const e = g.getObj(); - if (e === pt) { - r = 0; - break; - } - if (e instanceof Cmd) { - const i = t[e.cmd]; - if (!i) { - r = 0; + if (this.buf1 === EOF) { break; } - if (i.variableArgs ? o <= i.numArgs : o === i.numArgs) break; - o = 0; - } else o++; + dict.set(key, this.getObj(cipherTransform)); + } + if (this.buf1 === EOF) { + if (this.recoveryMode) { + return dict; + } + throw new ParserEOFException("End of file inside dictionary."); + } + if (isCmd(this.buf2, "stream")) { + return this.allowStreams + ? this.makeStream(dict, cipherTransform) + : dict; + } + this.shift(); + return dict; + default: + return buf1; + } + } + if (Number.isInteger(buf1)) { + if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { + const ref = Ref.get(buf1, this.buf1); + this.shift(); + this.shift(); + return ref; + } + return buf1; + } + if (typeof buf1 === "string") { + if (cipherTransform) { + return cipherTransform.decryptString(buf1); + } + return buf1; + } + return buf1; + } + findDefaultInlineStreamEnd(stream) { + const E = 0x45, + I = 0x49, + SPACE = 0x20, + LF = 0xa, + CR = 0xd, + NUL = 0x0; + const { knownCommands } = this.lexer, + startPos = stream.pos, + n = 15; + let state = 0, + ch, + maybeEIPos; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else { + if (ch === SPACE || ch === LF || ch === CR) { + maybeEIPos = stream.pos; + const followingBytes = stream.peekBytes(n); + const ii = followingBytes.length; + if (ii === 0) { + break; + } + for (let i = 0; i < ii; i++) { + ch = followingBytes[i]; + if (ch === NUL && followingBytes[i + 1] !== NUL) { + continue; + } + if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { + state = 0; + break; + } + } + if (state !== 2) { + continue; + } + if (!knownCommands) { + warn( + "findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.", + ); + continue; + } + const tmpLexer = new Lexer( + new Stream(followingBytes.slice()), + knownCommands, + ); + tmpLexer._hexStringWarn = () => {}; + let numArgs = 0; + while (true) { + const nextObj = tmpLexer.getObj(); + if (nextObj === EOF) { + state = 0; + break; + } + if (nextObj instanceof Cmd) { + const knownCommand = knownCommands[nextObj.cmd]; + if (!knownCommand) { + state = 0; + break; + } else if ( + knownCommand.variableArgs + ? numArgs <= knownCommand.numArgs + : numArgs === knownCommand.numArgs + ) { + break; + } + numArgs = 0; + continue; + } + numArgs++; + } + if (state === 2) { + break; + } + } else { + state = 0; } - if (2 === r) break; - } else r = 0; - if (-1 === a) { + } + } + if (ch === -1) { warn( - "findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker", + "findDefaultInlineStreamEnd: " + + "Reached the end of the stream without finding a valid EI marker", ); - if (s) { + if (maybeEIPos) { warn('... trying to recover by using the last "EI" occurrence.'); - e.skip(-(e.pos - s)); + stream.skip(-(stream.pos - maybeEIPos)); } } - let n = 4; - e.skip(-n); - a = e.peekByte(); - e.skip(n); - isWhiteSpace(a) || n--; - return e.pos - n - i; + let endOffset = 4; + stream.skip(-endOffset); + ch = stream.peekByte(); + stream.skip(endOffset); + if (!isWhiteSpace(ch)) { + endOffset--; + } + return stream.pos - endOffset - startPos; } - findDCTDecodeInlineStreamEnd(e) { - const t = e.pos; - let i, - a, - s = !1; - for (; -1 !== (i = e.getByte()); ) - if (255 === i) { - switch (e.getByte()) { - case 0: - break; - case 255: - e.skip(-1); - break; - case 217: - s = !0; - break; - case 192: - case 193: - case 194: - case 195: - case 197: - case 198: - case 199: - case 201: - case 202: - case 203: - case 205: - case 206: - case 207: - case 196: - case 204: - case 218: - case 219: - case 220: - case 221: - case 222: - case 223: - case 224: - case 225: - case 226: - case 227: - case 228: - case 229: - case 230: - case 231: - case 232: - case 233: - case 234: - case 235: - case 236: - case 237: - case 238: - case 239: - case 254: - a = e.getUint16(); - a > 2 ? e.skip(a - 2) : e.skip(-2); - } - if (s) break; + findDCTDecodeInlineStreamEnd(stream) { + const startPos = stream.pos; + let foundEOI = false, + b, + markerLength; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xff) { + continue; } - const r = e.pos - t; - if (-1 === i) { + switch (stream.getByte()) { + case 0x00: + break; + case 0xff: + stream.skip(-1); + break; + case 0xd9: + foundEOI = true; + break; + 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 (markerLength > 2) { + stream.skip(markerLength - 2); + } else { + stream.skip(-2); + } + break; + } + if (foundEOI) { + break; + } + } + const length = stream.pos - startPos; + if (b === -1) { warn( - "Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.", + "Inline DCTDecode image stream: " + + "EOI marker not found, searching for /EI/ instead.", ); - e.skip(-r); - return this.findDefaultInlineStreamEnd(e); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); } - this.inlineStreamSkipEI(e); - return r; + this.inlineStreamSkipEI(stream); + return length; } - findASCII85DecodeInlineStreamEnd(e) { - const t = e.pos; - let i; - for (; -1 !== (i = e.getByte()); ) - if (126 === i) { - const t = e.pos; - i = e.peekByte(); - for (; isWhiteSpace(i); ) { - e.skip(); - i = e.peekByte(); + 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(); + while (isWhiteSpace(ch)) { + stream.skip(); + ch = stream.peekByte(); } - if (62 === i) { - e.skip(); + if (ch === GT) { + stream.skip(); break; } - if (e.pos > t) { - const t = e.peekBytes(2); - if (69 === t[0] && 73 === t[1]) break; + if (stream.pos > tildePos) { + const maybeEI = stream.peekBytes(2); + if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { + break; + } } } - const a = e.pos - t; - if (-1 === i) { - warn( - "Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.", - ); - e.skip(-a); - return this.findDefaultInlineStreamEnd(e); } - this.inlineStreamSkipEI(e); - return a; - } - findASCIIHexDecodeInlineStreamEnd(e) { - const t = e.pos; - let i; - for (; -1 !== (i = e.getByte()) && 62 !== i; ); - const a = e.pos - t; - if (-1 === i) { + const length = stream.pos - startPos; + if (ch === -1) { warn( - "Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.", + "Inline ASCII85Decode image stream: " + + "EOD marker not found, searching for /EI/ instead.", ); - e.skip(-a); - return this.findDefaultInlineStreamEnd(e); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); } - this.inlineStreamSkipEI(e); - return a; + this.inlineStreamSkipEI(stream); + return length; } - inlineStreamSkipEI(e) { - let t, - i = 0; - for (; -1 !== (t = e.getByte()); ) - if (0 === i) i = 69 === t ? 1 : 0; - else if (1 === i) i = 73 === t ? 2 : 0; - else if (2 === i) break; + findASCIIHexDecodeInlineStreamEnd(stream) { + const GT = 0x3e; + const startPos = stream.pos; + let ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === GT) { + break; + } + } + const length = stream.pos - startPos; + if (ch === -1) { + warn( + "Inline ASCIIHexDecode image stream: " + + "EOD marker not found, searching for /EI/ instead.", + ); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; } - makeInlineImage(e) { - const t = this.lexer, - i = t.stream, - a = Object.create(null); - let s; - for (; !isCmd(this.buf1, "ID") && this.buf1 !== pt; ) { - if (!(this.buf1 instanceof Name)) + inlineStreamSkipEI(stream) { + const E = 0x45, + I = 0x49; + let state = 0, + ch; + 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; + } + } + } + makeInlineImage(cipherTransform) { + const lexer = this.lexer; + const stream = lexer.stream; + const dictMap = Object.create(null); + let dictLength; + while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { + if (!(this.buf1 instanceof Name)) { throw new FormatError("Dictionary key must be a name object"); - const t = this.buf1.name; + } + const key = this.buf1.name; this.shift(); - if (this.buf1 === pt) break; - a[t] = this.getObj(e); + if (this.buf1 === EOF) { + break; + } + dictMap[key] = this.getObj(cipherTransform); } - -1 !== t.beginInlineImagePos && (s = i.pos - t.beginInlineImagePos); - const r = this.xref.fetchIfRef(a.F || a.Filter); - let n; - if (r instanceof Name) n = r.name; - else if (Array.isArray(r)) { - const e = this.xref.fetchIfRef(r[0]); - e instanceof Name && (n = e.name); + if (lexer.beginInlineImagePos !== -1) { + dictLength = stream.pos - lexer.beginInlineImagePos; } - const g = i.pos; - let o, c; - switch (n) { + const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = this.xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } + } + const startPos = stream.pos; + let length; + switch (filterName) { case "DCT": case "DCTDecode": - o = this.findDCTDecodeInlineStreamEnd(i); + length = this.findDCTDecodeInlineStreamEnd(stream); break; case "A85": case "ASCII85Decode": - o = this.findASCII85DecodeInlineStreamEnd(i); + length = this.findASCII85DecodeInlineStreamEnd(stream); break; case "AHx": case "ASCIIHexDecode": - o = this.findASCIIHexDecodeInlineStreamEnd(i); + length = this.findASCIIHexDecodeInlineStreamEnd(stream); break; default: - o = this.findDefaultInlineStreamEnd(i); + length = this.findDefaultInlineStreamEnd(stream); } - if (o < 1e3 && s > 0) { - const e = i.pos; - i.pos = t.beginInlineImagePos; - c = (function getInlineImageCacheKey(e) { - const t = [], - i = e.length; - let a = 0; - for (; a < i - 1; ) t.push((e[a++] << 8) | e[a++]); - a < i && t.push(e[a]); - return i + "_" + String.fromCharCode.apply(null, t); - })(i.getBytes(s + o)); - i.pos = e; - const a = this.imageCache[c]; - if (void 0 !== a) { + let cacheKey; + if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { + const initialStreamPos = stream.pos; + stream.pos = lexer.beginInlineImagePos; + cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); + stream.pos = initialStreamPos; + const cacheEntry = this.imageCache[cacheKey]; + if (cacheEntry !== undefined) { this.buf2 = Cmd.get("EI"); this.shift(); - a.reset(); - return a; + cacheEntry.reset(); + return cacheEntry; } } - const C = new Dict(this.xref); - for (const e in a) C.set(e, a[e]); - let h = i.makeSubStream(g, o, C); - e && (h = e.createStream(h, o)); - h = this.filter(h, C, o); - h.dict = C; - if (void 0 !== c) { - h.cacheKey = "inline_img_" + ++this._imageId; - this.imageCache[c] = h; + const dict = new Dict(this.xref); + for (const key in dictMap) { + dict.set(key, dictMap[key]); + } + let imageStream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length); + imageStream.dict = dict; + if (cacheKey !== undefined) { + imageStream.cacheKey = `inline_img_${++this._imageId}`; + this.imageCache[cacheKey] = imageStream; } this.buf2 = Cmd.get("EI"); this.shift(); - return h; + return imageStream; } - #w(e) { - const { stream: t } = this.lexer; - t.pos = e; - const i = new Uint8Array([101, 110, 100]), - a = i.length, - s = [ - new Uint8Array([115, 116, 114, 101, 97, 109]), - new Uint8Array([115, 116, 101, 97, 109]), - new Uint8Array([115, 116, 114, 101, 97]), - ], - r = 9 - a; - for (; t.pos < t.end; ) { - const n = t.peekBytes(2048), - g = n.length - 9; - if (g <= 0) break; - let o = 0; - for (; o < g; ) { - let g = 0; - for (; g < a && n[o + g] === i[g]; ) g++; - if (g >= a) { - let a = !1; - for (const e of s) { - const t = e.length; - let s = 0; - for (; s < t && n[o + g + s] === e[s]; ) s++; - if (s >= r) { - a = !0; + #findStreamLength(startPos) { + const { stream } = this.lexer; + stream.pos = startPos; + const SCAN_BLOCK_LENGTH = 2048; + const signatureLength = "endstream".length; + const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); + const endLength = END_SIGNATURE.length; + const PARTIAL_SIGNATURE = [ + new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), + new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), + new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61]), + ]; + const normalLength = signatureLength - endLength; + while (stream.pos < stream.end) { + const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + break; + } + let pos = 0; + while (pos < scanLength) { + let j = 0; + while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { + j++; + } + if (j >= endLength) { + let found = false; + for (const part of PARTIAL_SIGNATURE) { + const partLen = part.length; + let k = 0; + while (k < partLen && scanBytes[pos + j + k] === part[k]) { + k++; + } + if (k >= normalLength) { + found = true; break; } - if (s >= t) { - if (isWhiteSpace(n[o + g + s])) { + if (k >= partLen) { + const lastByte = scanBytes[pos + j + k]; + if (isWhiteSpace(lastByte)) { info( - `Found "${bytesToString([...i, ...e])}" when searching for endstream command.`, + `Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + + "searching for endstream command.", ); - a = !0; + found = true; } break; } } - if (a) { - t.pos += o; - return t.pos - e; + if (found) { + stream.pos += pos; + return stream.pos - startPos; } } - o++; + pos++; } - t.pos += g; + stream.pos += scanLength; } return -1; } - makeStream(e, t) { - const i = this.lexer; - let a = i.stream; - i.skipToNextLine(); - const s = a.pos - 1; - let r = e.get("Length"); - if (!Number.isInteger(r)) { - info(`Bad length "${r && r.toString()}" in stream.`); - r = 0; + makeStream(dict, cipherTransform) { + const lexer = this.lexer; + let stream = lexer.stream; + lexer.skipToNextLine(); + const startPos = stream.pos - 1; + let length = dict.get("Length"); + if (!Number.isInteger(length)) { + info(`Bad length "${length && length.toString()}" in stream.`); + length = 0; } - a.pos = s + r; - i.nextChar(); - if (this.tryShift() && isCmd(this.buf2, "endstream")) this.shift(); - else { - r = this.#w(s); - if (r < 0) throw new FormatError("Missing endstream command."); - i.nextChar(); + stream.pos = startPos + length; + lexer.nextChar(); + if (this.tryShift() && isCmd(this.buf2, "endstream")) { + this.shift(); + } else { + length = this.#findStreamLength(startPos); + if (length < 0) { + throw new FormatError("Missing endstream command."); + } + lexer.nextChar(); this.shift(); this.shift(); } this.shift(); - a = a.makeSubStream(s, r, e); - t && (a = t.createStream(a, r)); - a = this.filter(a, e, r); - a.dict = e; - return a; - } - filter(e, t, i) { - let a = t.get("F", "Filter"), - s = t.get("DP", "DecodeParms"); - if (a instanceof Name) { - Array.isArray(s) && - warn("/DecodeParms should not be an Array, when /Filter is a Name."); - return this.makeFilter(e, a.name, i, s); + stream = stream.makeSubStream(startPos, length, dict); + if (cipherTransform) { + stream = cipherTransform.createStream(stream, length); } - let r = i; - if (Array.isArray(a)) { - const t = a, - i = s; - for (let n = 0, g = t.length; n < g; ++n) { - a = this.xref.fetchIfRef(t[n]); - if (!(a instanceof Name)) - throw new FormatError(`Bad filter name "${a}"`); - s = null; - Array.isArray(i) && n in i && (s = this.xref.fetchIfRef(i[n])); - e = this.makeFilter(e, a.name, r, s); - r = null; + stream = this.filter(stream, dict, length); + stream.dict = dict; + return stream; + } + filter(stream, dict, length) { + let filter = dict.get("F", "Filter"); + let params = dict.get("DP", "DecodeParms"); + if (filter instanceof Name) { + if (Array.isArray(params)) { + warn("/DecodeParms should not be an Array, when /Filter is a Name."); + } + return this.makeFilter(stream, filter.name, length, params); + } + let maybeLength = length; + if (Array.isArray(filter)) { + const filterArray = filter; + const paramsArray = params; + for (let i = 0, ii = filterArray.length; i < ii; ++i) { + filter = this.xref.fetchIfRef(filterArray[i]); + if (!(filter instanceof Name)) { + throw new FormatError(`Bad filter name "${filter}"`); + } + params = null; + if (Array.isArray(paramsArray) && i in paramsArray) { + params = this.xref.fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params); + maybeLength = null; } } - return e; + return stream; } - makeFilter(e, t, i, a) { - if (0 === i) { - warn(`Empty "${t}" stream.`); + makeFilter(stream, name, maybeLength, params) { + if (maybeLength === 0) { + warn(`Empty "${name}" stream.`); return new NullStream(); } try { - switch (t) { + switch (name) { case "Fl": case "FlateDecode": - return a - ? new PredictorStream(new FlateStream(e, i), i, a) - : new FlateStream(e, i); + if (params) { + return new PredictorStream( + new FlateStream(stream, maybeLength), + maybeLength, + params, + ); + } + return new FlateStream(stream, maybeLength); case "LZW": case "LZWDecode": - let t = 1; - if (a) { - a.has("EarlyChange") && (t = a.get("EarlyChange")); - return new PredictorStream(new LZWStream(e, i, t), i, a); + let earlyChange = 1; + if (params) { + if (params.has("EarlyChange")) { + earlyChange = params.get("EarlyChange"); + } + return new PredictorStream( + new LZWStream(stream, maybeLength, earlyChange), + maybeLength, + params, + ); } - return new LZWStream(e, i, t); + return new LZWStream(stream, maybeLength, earlyChange); case "DCT": case "DCTDecode": - return new JpegStream(e, i, a); + return new JpegStream(stream, maybeLength, params); case "JPX": case "JPXDecode": - return new JpxStream(e, i, a); + return new JpxStream(stream, maybeLength, params); case "A85": case "ASCII85Decode": - return new Ascii85Stream(e, i); + return new Ascii85Stream(stream, maybeLength); case "AHx": case "ASCIIHexDecode": - return new AsciiHexStream(e, i); + return new AsciiHexStream(stream, maybeLength); case "CCF": case "CCITTFaxDecode": - return new CCITTFaxStream(e, i, a); + return new CCITTFaxStream(stream, maybeLength, params); case "RL": case "RunLengthDecode": - return new RunLengthStream(e, i); + return new RunLengthStream(stream, maybeLength); case "JBIG2Decode": - return new Jbig2Stream(e, i, a); + return new Jbig2Stream(stream, maybeLength, params); } - warn(`Filter "${t}" is not supported.`); - return e; - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`Invalid stream: "${e}"`); + warn(`Filter "${name}" is not supported.`); + return stream; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Invalid stream: "${ex}"`); return new NullStream(); } } } -const ci = [ +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, @@ -9417,19 +12146,21 @@ const ci = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; -function toHexDigit(e) { - return e >= 48 && e <= 57 - ? 15 & e - : (e >= 65 && e <= 70) || (e >= 97 && e <= 102) - ? 9 + (15 & e) - : -1; +function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0f; + } + if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { + return (ch & 0x0f) + 9; + } + return -1; } class Lexer { - constructor(e, t = null) { - this.stream = e; + constructor(stream, knownCommands = null) { + this.stream = stream; this.nextChar(); this.strBuf = []; - this.knownCommands = t; + this.knownCommands = knownCommands; this._hexStringNumWarn = 0; this.beginInlineImagePos = -1; } @@ -9440,651 +12171,747 @@ class Lexer { return this.stream.peekByte(); } getNumber() { - let e = this.currentChar, - t = !1, - i = 0, - a = 1; - if (45 === e) { - a = -1; - e = this.nextChar(); - 45 === e && (e = this.nextChar()); - } else 43 === e && (e = this.nextChar()); - if (10 === e || 13 === e) - do { - e = this.nextChar(); - } while (10 === e || 13 === e); - if (46 === e) { - i = 10; - e = this.nextChar(); + let ch = this.currentChar; + let eNotation = false; + let divideBy = 0; + let sign = 1; + if (ch === 0x2d) { + sign = -1; + ch = this.nextChar(); + if (ch === 0x2d) { + ch = this.nextChar(); + } + } else if (ch === 0x2b) { + ch = this.nextChar(); } - if (e < 48 || e > 57) { - const t = `Invalid number: ${String.fromCharCode(e)} (charCode ${e})`; - if (isWhiteSpace(e) || -1 === e) { - info(`Lexer.getNumber - "${t}".`); + if (ch === 0x0a || ch === 0x0d) { + do { + ch = this.nextChar(); + } while (ch === 0x0a || ch === 0x0d); + } + if (ch === 0x2e) { + divideBy = 10; + ch = this.nextChar(); + } + if (ch < 0x30 || ch > 0x39) { + const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; + if (isWhiteSpace(ch) || ch === -1) { + info(`Lexer.getNumber - "${msg}".`); return 0; } - throw new FormatError(t); + throw new FormatError(msg); } - let s = e - 48, - r = 0, - n = 1; - for (; (e = this.nextChar()) >= 0; ) - if (e >= 48 && e <= 57) { - const a = e - 48; - if (t) r = 10 * r + a; - else { - 0 !== i && (i *= 10); - s = 10 * s + a; + let baseValue = ch - 0x30; + let powerValue = 0; + let powerValueSign = 1; + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39) { + const currentDigit = ch - 0x30; + if (eNotation) { + powerValue = powerValue * 10 + currentDigit; + } else { + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; } - } else if (46 === e) { - if (0 !== i) break; - i = 1; - } else if (45 === e) + } else if (ch === 0x2e) { + if (divideBy === 0) { + divideBy = 1; + } else { + break; + } + } else if (ch === 0x2d) { warn("Badly formatted number: minus sign in the middle"); - else { - if (69 !== e && 101 !== e) break; - e = this.peekChar(); - if (43 === e || 45 === e) { - n = 45 === e ? -1 : 1; + } else if (ch === 0x45 || ch === 0x65) { + ch = this.peekChar(); + if (ch === 0x2b || ch === 0x2d) { + powerValueSign = ch === 0x2d ? -1 : 1; this.nextChar(); - } else if (e < 48 || e > 57) break; - t = !0; + } else if (ch < 0x30 || ch > 0x39) { + break; + } + eNotation = true; + } else { + break; } - 0 !== i && (s /= i); - t && (s *= 10 ** (n * r)); - return a * s; + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + if (eNotation) { + baseValue *= 10 ** (powerValueSign * powerValue); + } + return sign * baseValue; } getString() { - let e = 1, - t = !1; - const i = this.strBuf; - i.length = 0; - let a = this.nextChar(); - for (;;) { - let s = !1; - switch (0 | a) { + let numParen = 1; + let done = false; + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.nextChar(); + while (true) { + let charBuffered = false; + switch (ch | 0) { case -1: warn("Unterminated string"); - t = !0; + done = true; break; - case 40: - ++e; - i.push("("); + case 0x28: + ++numParen; + strBuf.push("("); break; - case 41: - if (0 == --e) { + case 0x29: + if (--numParen === 0) { this.nextChar(); - t = !0; - } else i.push(")"); + done = true; + } else { + strBuf.push(")"); + } break; - case 92: - a = this.nextChar(); - switch (a) { + case 0x5c: + ch = this.nextChar(); + switch (ch) { case -1: warn("Unterminated string"); - t = !0; + done = true; break; - case 110: - i.push("\n"); + case 0x6e: + strBuf.push("\n"); break; - case 114: - i.push("\r"); + case 0x72: + strBuf.push("\r"); break; - case 116: - i.push("\t"); + case 0x74: + strBuf.push("\t"); break; - case 98: - i.push("\b"); + case 0x62: + strBuf.push("\b"); break; - case 102: - i.push("\f"); + case 0x66: + strBuf.push("\f"); break; - case 92: - case 40: - case 41: - i.push(String.fromCharCode(a)); + case 0x5c: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); break; - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - let e = 15 & a; - a = this.nextChar(); - s = !0; - if (a >= 48 && a <= 55) { - e = (e << 3) + (15 & a); - a = this.nextChar(); - if (a >= 48 && a <= 55) { - s = !1; - e = (e << 3) + (15 & a); + 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; + if (ch >= 0x30 && ch <= 0x37) { + x = (x << 3) + (ch & 0x0f); + ch = this.nextChar(); + if (ch >= 0x30 && ch <= 0x37) { + charBuffered = false; + x = (x << 3) + (ch & 0x0f); } } - i.push(String.fromCharCode(e)); + strBuf.push(String.fromCharCode(x)); break; - case 13: - 10 === this.peekChar() && this.nextChar(); + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } break; - case 10: + case 0x0a: break; default: - i.push(String.fromCharCode(a)); + strBuf.push(String.fromCharCode(ch)); + break; } break; default: - i.push(String.fromCharCode(a)); + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); } - if (t) break; - s || (a = this.nextChar()); } - return i.join(""); + return strBuf.join(""); } getName() { - let e, t; - const i = this.strBuf; - i.length = 0; - for (; (e = this.nextChar()) >= 0 && !ci[e]; ) - if (35 === e) { - e = this.nextChar(); - if (ci[e]) { + let ch, previousCh; + const strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { warn( - "Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.", + "Lexer_getName: " + + "NUMBER SIGN (#) should be followed by a hexadecimal number.", ); - i.push("#"); + strBuf.push("#"); break; } - const a = toHexDigit(e); - if (-1 !== a) { - t = e; - e = this.nextChar(); - const s = toHexDigit(e); - if (-1 === s) { + const x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + const x2 = toHexDigit(ch); + if (x2 === -1) { warn( - `Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`, + `Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + + "in hexadecimal number.", ); - i.push("#", String.fromCharCode(t)); - if (ci[e]) break; - i.push(String.fromCharCode(e)); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); continue; } - i.push(String.fromCharCode((a << 4) | s)); - } else i.push("#", String.fromCharCode(e)); - } else i.push(String.fromCharCode(e)); - i.length > 127 && - warn(`Name token is longer than allowed by the spec: ${i.length}`); - return Name.get(i.join("")); + strBuf.push(String.fromCharCode((x << 4) | x2)); + } else { + strBuf.push("#", String.fromCharCode(ch)); + } + } else { + strBuf.push(String.fromCharCode(ch)); + } + } + if (strBuf.length > 127) { + warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); + } + return Name.get(strBuf.join("")); } - _hexStringWarn(e) { - 5 != this._hexStringNumWarn++ - ? this._hexStringNumWarn > 5 || - warn(`getHexString - ignoring invalid character: ${e}`) - : warn("getHexString - ignoring additional invalid characters."); + _hexStringWarn(ch) { + const MAX_HEX_STRING_NUM_WARN = 5; + if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { + warn("getHexString - ignoring additional invalid characters."); + return; + } + if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { + return; + } + warn(`getHexString - ignoring invalid character: ${ch}`); } getHexString() { - const e = this.strBuf; - e.length = 0; - let t, - i, - a = this.currentChar, - s = !0; + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let firstDigit = -1, + digit = -1; this._hexStringNumWarn = 0; - for (;;) { - if (a < 0) { + while (true) { + if (ch < 0) { warn("Unterminated hex string"); break; - } - if (62 === a) { + } else if (ch === 0x3e) { this.nextChar(); break; - } - if (1 !== ci[a]) { - if (s) { - t = toHexDigit(a); - if (-1 === t) { - this._hexStringWarn(a); - a = this.nextChar(); - continue; - } + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + digit = toHexDigit(ch); + if (digit === -1) { + this._hexStringWarn(ch); + } else if (firstDigit === -1) { + firstDigit = digit; } else { - i = toHexDigit(a); - if (-1 === i) { - this._hexStringWarn(a); - a = this.nextChar(); - continue; - } - e.push(String.fromCharCode((t << 4) | i)); + strBuf.push(String.fromCharCode((firstDigit << 4) | digit)); + firstDigit = -1; } - s = !s; - a = this.nextChar(); - } else a = this.nextChar(); + ch = this.nextChar(); + } } - return e.join(""); + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } + return strBuf.join(""); } getObj() { - let e = !1, - t = this.currentChar; - for (;;) { - if (t < 0) return pt; - if (e) (10 !== t && 13 !== t) || (e = !1); - else if (37 === t) e = !0; - else if (1 !== ci[t]) break; - t = this.nextChar(); + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; + } + ch = this.nextChar(); } - switch (0 | t) { - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - case 43: - case 45: - case 46: + 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(); - case 40: + case 0x28: return this.getString(); - case 47: + case 0x2f: return this.getName(); - case 91: + case 0x5b: this.nextChar(); return Cmd.get("["); - case 93: + case 0x5d: this.nextChar(); return Cmd.get("]"); - case 60: - t = this.nextChar(); - if (60 === t) { + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { this.nextChar(); return Cmd.get("<<"); } return this.getHexString(); - case 62: - t = this.nextChar(); - if (62 === t) { + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { this.nextChar(); return Cmd.get(">>"); } return Cmd.get(">"); - case 123: + case 0x7b: this.nextChar(); return Cmd.get("{"); - case 125: + case 0x7d: this.nextChar(); return Cmd.get("}"); - case 41: + case 0x29: this.nextChar(); - throw new FormatError(`Illegal character: ${t}`); + throw new FormatError(`Illegal character: ${ch}`); } - let i = String.fromCharCode(t); - if (t < 32 || t > 127) { - const e = this.peekChar(); - if (e >= 32 && e <= 127) { + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { this.nextChar(); - return Cmd.get(i); + return Cmd.get(str); } } - const a = this.knownCommands; - let s = void 0 !== a?.[i]; - for (; (t = this.nextChar()) >= 0 && !ci[t]; ) { - const e = i + String.fromCharCode(t); - if (s && void 0 === a[e]) break; - if (128 === i.length) - throw new FormatError(`Command token too long: ${i.length}`); - i = e; - s = void 0 !== a?.[i]; + const knownCommands = this.knownCommands; + let knownCommandFound = knownCommands?.[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + const possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; + } + if (str.length === 128) { + throw new FormatError(`Command token too long: ${str.length}`); + } + str = possibleCommand; + knownCommandFound = knownCommands?.[str] !== undefined; } - if ("true" === i) return !0; - if ("false" === i) return !1; - if ("null" === i) return null; - "BI" === i && (this.beginInlineImagePos = this.stream.pos); - return Cmd.get(i); + if (str === "true") { + return true; + } + if (str === "false") { + return false; + } + if (str === "null") { + return null; + } + if (str === "BI") { + this.beginInlineImagePos = this.stream.pos; + } + return Cmd.get(str); } skipToNextLine() { - let e = this.currentChar; - for (; e >= 0; ) { - if (13 === e) { - e = this.nextChar(); - 10 === e && this.nextChar(); + let ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); + } break; - } - if (10 === e) { + } else if (ch === 0x0a) { this.nextChar(); break; } - e = this.nextChar(); + ch = this.nextChar(); } } } class Linearization { - static create(e) { - function getInt(e, t, i = !1) { - const a = e.get(t); - if (Number.isInteger(a) && (i ? a >= 0 : a > 0)) return a; + static create(stream) { + function getInt(linDict, name, allowZeroValue = false) { + const obj = linDict.get(name); + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } throw new Error( - `The "${t}" parameter in the linearization dictionary is invalid.`, + `The "${name}" parameter in the linearization ` + + "dictionary is invalid.", ); } - const t = new Parser({ lexer: new Lexer(e), xref: null }), - i = t.getObj(), - a = t.getObj(), - s = t.getObj(), - r = t.getObj(); - let n, g; + function getHints(linDict) { + const hints = linDict.get("H"); + let hintsLength; + if ( + Array.isArray(hints) && + ((hintsLength = hints.length) === 2 || hintsLength === 4) + ) { + for (let index = 0; index < hintsLength; index++) { + const hint = hints[index]; + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error( + `Hint (${index}) in the linearization dictionary is invalid.`, + ); + } + } + return hints; + } + throw new Error("Hint array in the linearization dictionary is invalid."); + } + 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; if ( !( - Number.isInteger(i) && - Number.isInteger(a) && - isCmd(s, "obj") && - r instanceof Dict && - "number" == typeof (n = r.get("Linearized")) && - n > 0 + Number.isInteger(obj1) && + Number.isInteger(obj2) && + isCmd(obj3, "obj") && + linDict instanceof Dict && + typeof (obj = linDict.get("Linearized")) === "number" && + obj > 0 ) - ) + ) { return null; - if ((g = getInt(r, "L")) !== e.length) + } else if ((length = getInt(linDict, "L")) !== stream.length) { throw new Error( - 'The "L" parameter in the linearization dictionary does not equal the stream length.', + 'The "L" parameter in the linearization dictionary ' + + "does not equal the stream length.", ); + } return { - length: g, - hints: (function getHints(e) { - const t = e.get("H"); - let i; - if (Array.isArray(t) && (2 === (i = t.length) || 4 === i)) { - for (let e = 0; e < i; e++) { - const i = t[e]; - if (!(Number.isInteger(i) && i > 0)) - throw new Error( - `Hint (${e}) in the linearization dictionary is invalid.`, - ); - } - return t; - } - throw new Error( - "Hint array in the linearization dictionary is invalid.", - ); - })(r), - objectNumberFirst: getInt(r, "O"), - endFirst: getInt(r, "E"), - numPages: getInt(r, "N"), - mainXRefEntriesOffset: getInt(r, "T"), - pageFirst: r.has("P") ? getInt(r, "P", !0) : 0, + 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, }; } -} -const Ci = [ - "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", - ], - hi = 2 ** 24 - 1; +} // ./src/core/cmap.js + +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(e = !1) { + constructor(builtInCMap = false) { this.codespaceRanges = [[], [], [], []]; this.numCodespaceRanges = 0; this._map = []; this.name = ""; - this.vertical = !1; + this.vertical = false; this.useCMap = null; - this.builtInCMap = e; + this.builtInCMap = builtInCMap; } - addCodespaceRange(e, t, i) { - this.codespaceRanges[e - 1].push(t, i); + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); this.numCodespaceRanges++; } - mapCidRange(e, t, i) { - if (t - e > hi) + mapCidRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); - for (; e <= t; ) this._map[e++] = i++; + } + while (low <= high) { + this._map[low++] = dstLow++; + } } - mapBfRange(e, t, i) { - if (t - e > hi) + mapBfRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); - const a = i.length - 1; - for (; e <= t; ) { - this._map[e++] = i; - const t = i.charCodeAt(a) + 1; - t > 255 - ? (i = - i.substring(0, a - 1) + - String.fromCharCode(i.charCodeAt(a - 1) + 1) + - "\0") - : (i = i.substring(0, a) + String.fromCharCode(t)); + } + const lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + const nextCharCode = dstLow.charCodeAt(lastByte) + 1; + if (nextCharCode > 0xff) { + dstLow = + dstLow.substring(0, lastByte - 1) + + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + + "\x00"; + continue; + } + dstLow = + dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); } } - mapBfRangeToArray(e, t, i) { - if (t - e > hi) + mapBfRangeToArray(low, high, array) { + if (high - low > MAX_MAP_RANGE) { throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); - const a = i.length; - let s = 0; - for (; e <= t && s < a; ) { - this._map[e] = i[s++]; - ++e; + } + const ii = array.length; + let i = 0; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; } } - mapOne(e, t) { - this._map[e] = t; + mapOne(src, dst) { + this._map[src] = dst; } - lookup(e) { - return this._map[e]; + lookup(code) { + return this._map[code]; } - contains(e) { - return void 0 !== this._map[e]; + contains(code) { + return this._map[code] !== undefined; } - forEach(e) { - const t = this._map, - i = t.length; - if (i <= 65536) for (let a = 0; a < i; a++) void 0 !== t[a] && e(a, t[a]); - else for (const i in t) e(i, t[i]); + forEach(callback) { + const map = this._map; + const length = map.length; + 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(e) { - const t = this._map; - if (t.length <= 65536) return t.indexOf(e); - for (const i in t) if (t[i] === e) return 0 | 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; } getMap() { return this._map; } - readCharCode(e, t, i) { - let a = 0; - const s = this.codespaceRanges; - for (let r = 0, n = s.length; r < n; r++) { - a = ((a << 8) | e.charCodeAt(t + r)) >>> 0; - const n = s[r]; - for (let e = 0, t = n.length; e < t; ) { - const t = n[e++], - s = n[e++]; - if (a >= t && a <= s) { - i.charcode = a; - i.length = r + 1; + readCharCode(str, offset, out) { + let c = 0; + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk; ) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; return; } } } - i.charcode = 0; - i.length = 1; + out.charcode = 0; + out.length = 1; } - getCharCodeLength(e) { - const t = this.codespaceRanges; - for (let i = 0, a = t.length; i < a; i++) { - const a = t[i]; - for (let t = 0, s = a.length; t < s; ) { - const s = a[t++], - r = a[t++]; - if (e >= s && e <= r) return i + 1; + getCharCodeLength(charCode) { + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk; ) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (charCode >= low && charCode <= high) { + return n + 1; + } } } return 1; @@ -10093,3620 +12920,4003 @@ class CMap { return this._map.length; } get isIdentityCMap() { - if ("Identity-H" !== this.name && "Identity-V" !== this.name) return !1; - if (65536 !== this._map.length) return !1; - for (let e = 0; e < 65536; e++) if (this._map[e] !== e) return !1; - return !0; + 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; + } + } + return true; } } class IdentityCMap extends CMap { - constructor(e, t) { + constructor(vertical, n) { super(); - this.vertical = e; - this.addCodespaceRange(t, 0, 65535); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); } - mapCidRange(e, t, i) { + mapCidRange(low, high, dstLow) { unreachable("should not call mapCidRange"); } - mapBfRange(e, t, i) { + mapBfRange(low, high, dstLow) { unreachable("should not call mapBfRange"); } - mapBfRangeToArray(e, t, i) { + mapBfRangeToArray(low, high, array) { unreachable("should not call mapBfRangeToArray"); } - mapOne(e, t) { + mapOne(src, dst) { unreachable("should not call mapCidOne"); } - lookup(e) { - return Number.isInteger(e) && e <= 65535 ? e : void 0; + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; } - contains(e) { - return Number.isInteger(e) && e <= 65535; + contains(code) { + return Number.isInteger(code) && code <= 0xffff; } - forEach(e) { - for (let t = 0; t <= 65535; t++) e(t, t); + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); + } } - charCodeOf(e) { - return Number.isInteger(e) && e <= 65535 ? e : -1; + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; } getMap() { - const e = new Array(65536); - for (let t = 0; t <= 65535; t++) e[t] = t; - return e; + const map = new Array(0x10000); + for (let i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; } get length() { - return 65536; + return 0x10000; } get isIdentityCMap() { unreachable("should not access .isIdentityCMap"); } } -function strToInt(e) { - let t = 0; - for (let i = 0; i < e.length; i++) t = (t << 8) | e.charCodeAt(i); - return t >>> 0; +function strToInt(str) { + let a = 0; + for (let i = 0; i < str.length; i++) { + a = (a << 8) | str.charCodeAt(i); + } + return a >>> 0; } -function expectString(e) { - if ("string" != typeof e) +function expectString(obj) { + if (typeof obj !== "string") { throw new FormatError("Malformed CMap: expected string."); -} -function expectInt(e) { - if (!Number.isInteger(e)) - throw new FormatError("Malformed CMap: expected int."); -} -function parseBfChar(e, t) { - for (;;) { - let i = t.getObj(); - if (i === pt) break; - if (isCmd(i, "endbfchar")) return; - expectString(i); - const a = strToInt(i); - i = t.getObj(); - expectString(i); - const s = i; - e.mapOne(a, s); } } -function parseBfRange(e, t) { - for (;;) { - let i = t.getObj(); - if (i === pt) break; - if (isCmd(i, "endbfrange")) return; - expectString(i); - const a = strToInt(i); - i = t.getObj(); - expectString(i); - const s = strToInt(i); - i = t.getObj(); - if (Number.isInteger(i) || "string" == typeof i) { - const t = Number.isInteger(i) ? String.fromCharCode(i) : i; - e.mapBfRange(a, s, t); - } else { - if (!isCmd(i, "[")) break; - { - i = t.getObj(); - const r = []; - for (; !isCmd(i, "]") && i !== pt; ) { - r.push(i); - i = t.getObj(); - } - e.mapBfRangeToArray(a, s, r); +function expectInt(obj) { + if (!Number.isInteger(obj)) { + throw new FormatError("Malformed CMap: expected int."); + } +} +function parseBfChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseBfRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endbfrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + if (Number.isInteger(obj) || typeof obj === "string") { + const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if (isCmd(obj, "[")) { + obj = lexer.getObj(); + const array = []; + while (!isCmd(obj, "]") && obj !== EOF) { + array.push(obj); + obj = lexer.getObj(); } + cMap.mapBfRangeToArray(low, high, array); + } else { + break; } } throw new FormatError("Invalid bf range."); } -function parseCidChar(e, t) { - for (;;) { - let i = t.getObj(); - if (i === pt) break; - if (isCmd(i, "endcidchar")) return; - expectString(i); - const a = strToInt(i); - i = t.getObj(); - expectInt(i); - const s = i; - e.mapOne(a, s); +function parseCidChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidchar")) { + return; + } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dst = obj; + cMap.mapOne(src, dst); } } -function parseCidRange(e, t) { - for (;;) { - let i = t.getObj(); - if (i === pt) break; - if (isCmd(i, "endcidrange")) return; - expectString(i); - const a = strToInt(i); - i = t.getObj(); - expectString(i); - const s = strToInt(i); - i = t.getObj(); - expectInt(i); - const r = i; - e.mapCidRange(a, s, r); +function parseCidRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcidrange")) { + return; + } + 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); } } -function parseCodespaceRange(e, t) { - for (;;) { - let i = t.getObj(); - if (i === pt) break; - if (isCmd(i, "endcodespacerange")) return; - if ("string" != typeof i) break; - const a = strToInt(i); - i = t.getObj(); - if ("string" != typeof i) break; - const s = strToInt(i); - e.addCodespaceRange(i.length, a, s); +function parseCodespaceRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; + } + if (isCmd(obj, "endcodespacerange")) { + return; + } + if (typeof obj !== "string") { + break; + } + const low = strToInt(obj); + obj = lexer.getObj(); + if (typeof obj !== "string") { + break; + } + const high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); } throw new FormatError("Invalid codespace range."); } -function parseWMode(e, t) { - const i = t.getObj(); - Number.isInteger(i) && (e.vertical = !!i); +function parseWMode(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; + } } -function parseCMapName(e, t) { - const i = t.getObj(); - i instanceof Name && (e.name = i.name); +function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof Name) { + cMap.name = obj.name; + } } -async function parseCMap(e, t, i, a) { - let s, r; - A: for (;;) +async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { try { - const i = t.getObj(); - if (i === pt) break; - if (i instanceof Name) { - "WMode" === i.name - ? parseWMode(e, t) - : "CMapName" === i.name && parseCMapName(e, t); - s = i; - } else if (i instanceof Cmd) - switch (i.cmd) { + const obj = lexer.getObj(); + if (obj === EOF) { + break; + } else if (obj instanceof Name) { + if (obj.name === "WMode") { + parseWMode(cMap, lexer); + } else if (obj.name === "CMapName") { + parseCMapName(cMap, lexer); + } + previous = obj; + } else if (obj instanceof Cmd) { + switch (obj.cmd) { case "endcmap": - break A; + break objLoop; case "usecmap": - s instanceof Name && (r = s.name); + if (previous instanceof Name) { + embeddedUseCMap = previous.name; + } break; case "begincodespacerange": - parseCodespaceRange(e, t); + parseCodespaceRange(cMap, lexer); break; case "beginbfchar": - parseBfChar(e, t); + parseBfChar(cMap, lexer); break; case "begincidchar": - parseCidChar(e, t); + parseCidChar(cMap, lexer); break; case "beginbfrange": - parseBfRange(e, t); + parseBfRange(cMap, lexer); break; case "begincidrange": - parseCidRange(e, t); + parseCidRange(cMap, lexer); + break; } - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn("Invalid cMap data: " + e); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Invalid cMap data: " + ex); continue; } - !a && r && (a = r); - return a ? extendCMap(e, i, a) : e; -} -async function extendCMap(e, t, i) { - e.useCMap = await createBuiltInCMap(i, t); - if (0 === e.numCodespaceRanges) { - const t = e.useCMap.codespaceRanges; - for (let i = 0; i < t.length; i++) e.codespaceRanges[i] = t[i].slice(); - e.numCodespaceRanges = e.useCMap.numCodespaceRanges; } - e.useCMap.forEach(function (t, i) { - e.contains(t) || e.mapOne(t, e.useCMap.lookup(t)); + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; + } + if (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + } + return cMap; +} +async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); + if (cMap.numCodespaceRanges === 0) { + const useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (let i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); + } + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; + } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, cMap.useCMap.lookup(key)); + } }); - return e; + return cMap; } -async function createBuiltInCMap(e, t) { - if ("Identity-H" === e) return new IdentityCMap(!1, 2); - if ("Identity-V" === e) return new IdentityCMap(!0, 2); - if (!Ci.includes(e)) throw new Error("Unknown CMap name: " + e); - if (!t) throw new Error("Built-in CMap parameters are not provided."); - const { cMapData: i, compressionType: a } = await t(e), - s = new CMap(!0); - if (a === mA.BINARY) - return new BinaryCMapReader().process(i, s, (e) => extendCMap(s, t, e)); - if (a === mA.NONE) { - const e = new Lexer(new Stream(i)); - return parseCMap(s, e, t, null); +async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); } - throw new Error(`Invalid CMap "compressionType" value: ${a}`); + if (!BUILT_IN_CMAPS.includes(name)) { + throw new Error("Unknown CMap name: " + name); + } + if (!fetchBuiltInCMap) { + throw new Error("Built-in CMap parameters are not provided."); + } + const { cMapData, isCompressed } = await fetchBuiltInCMap(name); + const cMap = new CMap(true); + if (isCompressed) { + return new BinaryCMapReader().process(cMapData, cMap, (useCMap) => + extendCMap(cMap, fetchBuiltInCMap, useCMap), + ); + } + const lexer = new Lexer(new Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); } class CMapFactory { - static async create({ encoding: e, fetchBuiltInCMap: t, useCMap: i }) { - if (e instanceof Name) return createBuiltInCMap(e.name, t); - if (e instanceof BaseStream) { - const a = await parseCMap(new CMap(), new Lexer(e), t, i); - return a.isIdentityCMap ? createBuiltInCMap(a.name, t) : a; + static async create({ encoding, fetchBuiltInCMap, useCMap }) { + if (encoding instanceof Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof BaseStream) { + const parsedCMap = await parseCMap( + new CMap(), + new Lexer(encoding), + fetchBuiltInCMap, + useCMap, + ); + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); + } + return parsedCMap; } throw new Error("Encoding required."); } -} -const Bi = [ - ".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", - "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", - "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", - "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", - ], - li = [ - ".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", - "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", - "sevensuperior", - "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", - ], - Qi = [ - ".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", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - ], - Ei = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "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", - "sevensuperior", - "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", - ], - ui = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "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", - "", - "", - "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", - "", - "", - "", - "", - ], - di = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "space", - "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", - ], - fi = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "", - "", - "", - "", - ], - pi = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "perthousand", - "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", - ], - mi = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "arrowdblup", - "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", - "", - ], - yi = [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "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", - "", - ]; -function getEncoding(e) { - switch (e) { +} // ./src/core/charsets.js + +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", + "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", + "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", + "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", +]; +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", + "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", + "sevensuperior", + "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", +]; +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", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", +]; // ./src/core/encodings.js + +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", + "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", + "", + "", + "", + "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", + "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", +]; +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", + "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", + "", + "", + "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", + "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", + "space", + "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", +]; +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", + "", + "", + "", + "", +]; +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", + "perthousand", + "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", +]; +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", + "arrowdblup", + "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", + "", +]; +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", + "", +]; +function getEncoding(encodingName) { + switch (encodingName) { case "WinAnsiEncoding": - return pi; + return WinAnsiEncoding; case "StandardEncoding": - return fi; + return StandardEncoding; case "MacRomanEncoding": - return di; + return MacRomanEncoding; case "SymbolSetEncoding": - return mi; + return SymbolSetEncoding; case "ZapfDingbatsEncoding": - return yi; + return ZapfDingbatsEncoding; case "ExpertEncoding": - return Ei; + return ExpertEncoding; case "MacExpertEncoding": - return ui; + return MacExpertEncoding; default: return null; } -} -const wi = [ - ".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", - "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", - "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", - "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", - "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", - "hyphensuperior", - "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", - "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", - "001.000", - "001.001", - "001.002", - "001.003", - "Black", - "Bold", - "Book", - "Light", - "Medium", - "Regular", - "Roman", - "Semibold", - ], - Di = 391, - bi = [ - null, - { id: "hstem", min: 2, stackClearing: !0, stem: !0 }, - null, - { id: "vstem", min: 2, stackClearing: !0, stem: !0 }, - { id: "vmoveto", min: 1, stackClearing: !0 }, - { id: "rlineto", min: 2, resetStack: !0 }, - { id: "hlineto", min: 1, resetStack: !0 }, - { id: "vlineto", min: 1, resetStack: !0 }, - { id: "rrcurveto", min: 6, resetStack: !0 }, - null, - { id: "callsubr", min: 1, undefStack: !0 }, - { id: "return", min: 0, undefStack: !0 }, - null, - null, - { id: "endchar", min: 0, stackClearing: !0 }, - null, - null, - null, - { id: "hstemhm", min: 2, stackClearing: !0, stem: !0 }, - { id: "hintmask", min: 0, stackClearing: !0 }, - { id: "cntrmask", min: 0, stackClearing: !0 }, - { id: "rmoveto", min: 2, stackClearing: !0 }, - { id: "hmoveto", min: 1, stackClearing: !0 }, - { id: "vstemhm", min: 2, stackClearing: !0, stem: !0 }, - { id: "rcurveline", min: 8, resetStack: !0 }, - { id: "rlinecurve", min: 8, resetStack: !0 }, - { id: "vvcurveto", min: 4, resetStack: !0 }, - { id: "hhcurveto", min: 4, resetStack: !0 }, - null, - { id: "callgsubr", min: 1, undefStack: !0 }, - { id: "vhcurveto", min: 4, resetStack: !0 }, - { id: "hvcurveto", min: 4, resetStack: !0 }, - ], - Fi = [ - 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(e, t) { - e[t - 2] = e[t - 2] + e[t - 1]; - }, +} // ./src/core/cff_parser.js + +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", + "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", + "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", + "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", + "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", + "hyphensuperior", + "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", + "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", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold", +]; +const NUM_STANDARD_CFF_STRINGS = 391; +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(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; }, - { - id: "sub", - min: 2, - stackDelta: -1, - stackFn(e, t) { - e[t - 2] = e[t - 2] - e[t - 1]; - }, + }, + { + id: "sub", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; }, - { - id: "div", - min: 2, - stackDelta: -1, - stackFn(e, t) { - e[t - 2] = e[t - 2] / e[t - 1]; - }, + }, + { + id: "div", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; }, - null, - { - id: "neg", - min: 1, - stackDelta: 0, - stackFn(e, t) { - e[t - 1] = -e[t - 1]; - }, + }, + null, + { + id: "neg", + min: 1, + stackDelta: 0, + stackFn(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(e, t) { - e[t - 2] = e[t - 2] * e[t - 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(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: !0 }, - { id: "flex", min: 13, resetStack: !0 }, - { id: "hflex1", min: 9, resetStack: !0 }, - { id: "flex1", min: 11, resetStack: !0 }, - ]; + }, + 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(e, t, i) { - this.bytes = e.getBytes(); - this.properties = t; - this.seacAnalysisEnabled = !!i; + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; } parse() { - const e = this.properties, - t = new CFF(); - this.cff = t; - const i = this.parseHeader(), - a = this.parseIndex(i.endPos), - s = this.parseIndex(a.endPos), - r = this.parseIndex(s.endPos), - n = this.parseIndex(r.endPos), - g = this.parseDict(s.obj.get(0)), - o = this.createDict(CFFTopDict, g, t.strings); - t.header = i.obj; - t.names = this.parseNameIndex(a.obj); - t.strings = this.parseStringIndex(r.obj); - t.topDict = o; - t.globalSubrIndex = n.obj; - this.parsePrivateDict(t.topDict); - t.isCIDFont = o.hasName("ROS"); - const c = o.getByName("CharStrings"), - C = this.parseIndex(c).obj, - h = o.getByName("FontMatrix"); - h && (e.fontMatrix = h); - const l = o.getByName("FontBBox"); - if (l) { - e.ascent = Math.max(l[3], l[1]); - e.descent = Math.min(l[1], l[3]); - e.ascentScaled = !0; + 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"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; } - let Q, E; - if (t.isCIDFont) { - const e = this.parseIndex(o.getByName("FDArray")).obj; - for (let i = 0, a = e.count; i < a; ++i) { - const a = e.get(i), - s = this.createDict(CFFTopDict, this.parseDict(a), t.strings); - this.parsePrivateDict(s); - t.fdArray.push(s); + const 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; + } + let charset, encoding; + if (cff.isCIDFont) { + const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; + 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); } - E = null; - Q = this.parseCharsets(o.getByName("charset"), C.count, t.strings, !0); - t.fdSelect = this.parseFDSelect(o.getByName("FDSelect"), C.count); + encoding = null; + charset = this.parseCharsets( + topDict.getByName("charset"), + charStringIndex.count, + cff.strings, + true, + ); + cff.fdSelect = this.parseFDSelect( + topDict.getByName("FDSelect"), + charStringIndex.count, + ); } else { - Q = this.parseCharsets(o.getByName("charset"), C.count, t.strings, !1); - E = this.parseEncoding(o.getByName("Encoding"), e, t.strings, Q.charset); + charset = this.parseCharsets( + topDict.getByName("charset"), + charStringIndex.count, + cff.strings, + false, + ); + encoding = this.parseEncoding( + topDict.getByName("Encoding"), + properties, + cff.strings, + charset.charset, + ); } - t.charset = Q; - t.encoding = E; - const u = this.parseCharStrings({ - charStrings: C, - localSubrIndex: o.privateDict.subrsIndex, - globalSubrIndex: n.obj, - fdSelect: t.fdSelect, - fdArray: t.fdArray, - privateDict: o.privateDict, + 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, }); - t.charStrings = u.charStrings; - t.seacs = u.seacs; - t.widths = u.widths; - return t; + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; } parseHeader() { - let e = this.bytes; - const t = e.length; - let i = 0; - for (; i < t && 1 !== e[i]; ) ++i; - if (i >= t) throw new FormatError("Invalid CFF header"); - if (0 !== i) { - info("cff data is shifted"); - e = e.subarray(i); - this.bytes = e; + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; } - const a = e[0], - s = e[1], - r = e[2], - n = e[3]; - return { obj: new CFFHeader(a, s, r, n), endPos: r }; + if (offset >= bytesLength) { + throw new FormatError("Invalid CFF header"); + } + if (offset !== 0) { + info("cff data is shifted"); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + 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, + }; } - parseDict(e) { - let t = 0; + parseDict(dict) { + let pos = 0; function parseOperand() { - let i = e[t++]; - if (30 === i) - return (function parseFloatOperand() { - let i = ""; - const a = 15, - s = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ".", - "E", - "E-", - null, - "-", - ], - r = e.length; - for (; t < r; ) { - const r = e[t++], - n = r >> 4, - g = 15 & r; - if (n === a) break; - i += s[n]; - if (g === a) break; - i += s[g]; - } - return parseFloat(i); - })(); - if (28 === i) { - i = e[t++]; - i = ((i << 24) | (e[t++] << 16)) >> 16; - return i; + let 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; } - if (29 === i) { - i = e[t++]; - i = (i << 8) | e[t++]; - i = (i << 8) | e[t++]; - i = (i << 8) | e[t++]; - return i; - } - if (i >= 32 && i <= 246) return i - 139; - if (i >= 247 && i <= 250) return 256 * (i - 247) + e[t++] + 108; - if (i >= 251 && i <= 254) return -256 * (i - 251) - e[t++] - 108; - warn('CFFParser_parseDict: "' + i + '" is a reserved command.'); + warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); return NaN; } - let i = []; - const a = []; - t = 0; - const s = e.length; - for (; t < s; ) { - let s = e[t]; - if (s <= 21) { - 12 === s && (s = (s << 8) | e[++t]); - a.push([s, i]); - i = []; - ++t; - } else i.push(parseOperand()); - } - return a; - } - parseIndex(e) { - const t = new CFFIndex(), - i = this.bytes, - a = (i[e++] << 8) | i[e++], - s = []; - let r, - n, - g = e; - if (0 !== a) { - const t = i[e++], - o = e + (a + 1) * t - 1; - for (r = 0, n = a + 1; r < n; ++r) { - let a = 0; - for (let s = 0; s < t; ++s) { - a <<= 8; - a += i[e++]; + 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; + while (pos < length) { + const b = dict[pos++]; + const b1 = b >> 4; + const b2 = b & 15; + if (b1 === eof) { + break; } - s.push(o + a); + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; } - g = s[a]; + return parseFloat(str); } - for (r = 0, n = s.length - 1; r < n; ++r) { - const e = s[r], - a = s[r + 1]; - t.add(i.subarray(e, a)); - } - return { obj: t, endPos: g }; - } - parseNameIndex(e) { - const t = []; - for (let i = 0, a = e.count; i < a; ++i) { - const a = e.get(i); - t.push(bytesToString(a)); - } - return t; - } - parseStringIndex(e) { - const t = new CFFStrings(); - for (let i = 0, a = e.count; i < a; ++i) { - const a = e.get(i); - t.add(bytesToString(a)); - } - return t; - } - createDict(e, t, i) { - const a = new e(i); - for (const [e, i] of t) a.setByKey(e, i); - return a; - } - parseCharString(e, t, i, a) { - if (!t || e.callDepth > 10) return !1; - let s = e.stackSize; - const r = e.stack; - let n = t.length; - for (let g = 0; g < n; ) { - const o = t[g++]; - let c = null; - if (12 === o) { - const e = t[g++]; - if (0 === e) { - t[g - 2] = 139; - t[g - 1] = 22; - s = 0; - } else c = Fi[e]; - } else if (28 === o) { - r[s] = ((t[g] << 24) | (t[g + 1] << 16)) >> 16; - g += 2; - s++; - } else if (14 === o) { - if (s >= 4) { - s -= 4; - if (this.seacAnalysisEnabled) { - e.seac = r.slice(s, s + 4); - return !1; - } + let operands = []; + const entries = []; + pos = 0; + const end = dict.length; + while (pos < end) { + let b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = (b << 8) | dict[++pos]; } - c = bi[o]; - } else if (o >= 32 && o <= 246) { - r[s] = o - 139; - s++; - } else if (o >= 247 && o <= 254) { - r[s] = - o < 251 - ? ((o - 247) << 8) + t[g] + 108 - : -((o - 251) << 8) - t[g] - 108; - g++; - s++; - } else if (255 === o) { - r[s] = - ((t[g] << 24) | (t[g + 1] << 16) | (t[g + 2] << 8) | t[g + 3]) / - 65536; - g += 4; - s++; - } else if (19 === o || 20 === o) { - e.hints += s >> 1; - if (0 === e.hints) { - t.copyWithin(g - 1, g, -1); - g -= 1; - n -= 1; - continue; - } - g += (e.hints + 7) >> 3; - s %= 2; - c = bi[o]; + entries.push([b, operands]); + operands = []; + ++pos; } else { - if (10 === o || 29 === o) { - const t = 10 === o ? i : a; - if (!t) { - c = bi[o]; - warn("Missing subrsIndex for " + c.id); - return !1; + operands.push(parseOperand()); + } + } + return entries; + } + 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; + if (count !== 0) { + const offsetSize = bytes[pos++]; + const startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let 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) { + const offsetStart = offsets[i]; + const offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end, + }; + } + parseNameIndex(index) { + const names = []; + for (let i = 0, ii = index.count; i < ii; ++i) { + const name = index.get(i); + names.push(bytesToString(name)); + } + return names; + } + parseStringIndex(index) { + const strings = new CFFStrings(); + for (let i = 0, ii = index.count; i < ii; ++i) { + const data = index.get(i); + strings.add(bytesToString(data)); + } + return strings; + } + createDict(Type, dict, strings) { + const cffDict = new Type(strings); + for (const [key, value] of dict) { + cffDict.setByKey(key, value); + } + return cffDict; + } + parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (!data || state.callDepth > MAX_SUBR_NESTING) { + return false; + } + let stackSize = state.stackSize; + const stack = state.stack; + let length = data.length; + for (let j = 0; j < length; ) { + const value = data[j++]; + let validationCommand = null; + if (value === 12) { + const 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; } - let n = 32768; - t.count < 1240 ? (n = 107) : t.count < 33900 && (n = 1131); - const g = r[--s] + n; - if (g < 0 || g >= t.count || isNaN(g)) { - c = bi[o]; - warn("Out of bounds subrIndex for " + c.id); - return !1; - } - e.stackSize = s; - e.callDepth++; - if (!this.parseCharString(e, t.get(g), i, a)) return !1; - e.callDepth--; - s = e.stackSize; + } + 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; + if (state.hints === 0) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; continue; } - if (11 === o) { - e.stackSize = s; - return !0; + j += (state.hints + 7) >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + warn("Missing subrsIndex for " + validationCommand.id); + return false; } - if (0 === o && g === t.length) { - t[g - 1] = 14; - c = bi[14]; - } else { - if (9 === o) { - t.copyWithin(g - 1, g, -1); - g -= 1; - n -= 1; - continue; - } - c = bi[o]; + let bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; } + const subrNumber = stack[--stackSize] + bias; + if ( + subrNumber < 0 || + subrNumber >= subrsIndex.count || + isNaN(subrNumber) + ) { + validationCommand = CharstringValidationData[value]; + warn("Out of bounds subrIndex for " + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + const 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 if (value === 0 && j === data.length) { + data[j - 1] = 14; + validationCommand = CharstringValidationData[14]; + } else if (value === 9) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } else { + validationCommand = CharstringValidationData[value]; } - if (c) { - if (c.stem) { - e.hints += s >> 1; - if (3 === o || 23 === o) e.hasVStems = !0; - else if (e.hasVStems && (1 === o || 18 === o)) { + 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)) { warn("CFF stem hints are in wrong order"); - t[g - 1] = 1 === o ? 3 : 23; + data[j - 1] = value === 1 ? 3 : 23; } } - if ("min" in c && !e.undefStack && s < c.min) { - warn( - "Not enough parameters for " + - c.id + - "; actual: " + - s + - ", expected: " + - c.min, - ); - if (0 === s) { - t[g - 1] = 14; - return !0; + if ("min" in validationCommand) { + if (!state.undefStack && stackSize < validationCommand.min) { + warn( + "Not enough parameters for " + + validationCommand.id + + "; actual: " + + stackSize + + ", expected: " + + validationCommand.min, + ); + if (stackSize === 0) { + data[j - 1] = 14; + return true; + } + return false; } - return !1; } - if (e.firstStackClearing && c.stackClearing) { - e.firstStackClearing = !1; - s -= c.min; - s >= 2 && c.stem - ? (s %= 2) - : s > 1 && - warn("Found too many parameters for stack-clearing command"); - s > 0 && (e.width = r[s - 1]); + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + warn("Found too many parameters for stack-clearing command"); + } + if (stackSize > 0) { + state.width = stack[stackSize - 1]; + } } - if ("stackDelta" in c) { - "stackFn" in c && c.stackFn(r, s); - s += c.stackDelta; - } else if (c.stackClearing) s = 0; - else if (c.resetStack) { - s = 0; - e.undefStack = !1; - } else if (c.undefStack) { - s = 0; - e.undefStack = !0; - e.firstStackClearing = !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; } } } - n < t.length && t.fill(14, n); - e.stackSize = s; - return !0; + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; } parseCharStrings({ - charStrings: e, - localSubrIndex: t, - globalSubrIndex: i, - fdSelect: a, - fdArray: s, - privateDict: r, + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict, }) { - const n = [], - g = [], - o = e.count; - for (let c = 0; c < o; c++) { - const o = e.get(c), - C = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: !0, - hints: 0, - firstStackClearing: !0, - seac: null, - width: null, - hasVStems: !1, - }; - let h = !0, - l = null, - Q = r; - if (a && s.length) { - const e = a.getFDIndex(c); - if (-1 === e) { + const seacs = []; + const widths = []; + const count = charStrings.count; + 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; + if (fdSelect && fdArray.length) { + const fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { warn("Glyph index is not in fd select."); - h = !1; + valid = false; } - if (e >= s.length) { + if (fdIndex >= fdArray.length) { warn("Invalid fd index for glyph index."); - h = !1; + valid = false; } - if (h) { - Q = s[e].privateDict; - l = Q.subrsIndex; + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; } - } else t && (l = t); - h && (h = this.parseCharString(C, o, l, i)); - if (null !== C.width) { - const e = Q.getByName("nominalWidthX"); - g[c] = e + C.width; - } else { - const e = Q.getByName("defaultWidthX"); - g[c] = e; + } 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])); } - null !== C.seac && (n[c] = C.seac); - h || e.set(c, new Uint8Array([14])); } - return { charStrings: e, seacs: n, widths: g }; + return { + charStrings, + seacs, + widths, + }; } - emptyPrivateDictionary(e) { - const t = this.createDict(CFFPrivateDict, [], e.strings); - e.setByKey(18, [0, 0]); - e.privateDict = t; + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; } - parsePrivateDict(e) { - if (!e.hasName("Private")) { - this.emptyPrivateDictionary(e); + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); return; } - const t = e.getByName("Private"); - if (!Array.isArray(t) || 2 !== t.length) { - e.removeByName("Private"); + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); return; } - const i = t[0], - a = t[1]; - if (0 === i || a >= this.bytes.length) { - this.emptyPrivateDictionary(e); + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); return; } - const s = a + i, - r = this.bytes.subarray(a, s), - n = this.parseDict(r), - g = this.createDict(CFFPrivateDict, n, e.strings); - e.privateDict = g; - 0 === g.getByName("ExpansionFactor") && - g.setByName("ExpansionFactor", 0.06); - if (!g.getByName("Subrs")) return; - const o = g.getByName("Subrs"), - c = a + o; - if (0 === o || c >= this.bytes.length) { - this.emptyPrivateDictionary(e); + 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; + if (privateDict.getByName("ExpansionFactor") === 0) { + privateDict.setByName("ExpansionFactor", 0.06); + } + if (!privateDict.getByName("Subrs")) { return; } - const C = this.parseIndex(c); - g.subrsIndex = C.obj; + const subrsOffset = privateDict.getByName("Subrs"); + const relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; } - parseCharsets(e, t, i, a) { - if (0 === e) return new CFFCharset(!0, Ri.ISO_ADOBE, Bi); - if (1 === e) return new CFFCharset(!0, Ri.EXPERT, li); - if (2 === e) return new CFFCharset(!0, Ri.EXPERT_SUBSET, Qi); - const s = this.bytes, - r = e, - n = s[e++], - g = [a ? 0 : ".notdef"]; - let o, c, C; - t -= 1; - switch (n) { + parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset( + true, + CFFCharsetPredefinedTypes.ISO_ADOBE, + ISOAdobeCharset, + ); + } else if (pos === 1) { + return new CFFCharset( + true, + CFFCharsetPredefinedTypes.EXPERT, + ExpertCharset, + ); + } else if (pos === 2) { + return new CFFCharset( + true, + CFFCharsetPredefinedTypes.EXPERT_SUBSET, + ExpertSubsetCharset, + ); + } + 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 (C = 0; C < t; C++) { - o = (s[e++] << 8) | s[e++]; - g.push(a ? o : i.get(o)); + for (i = 0; i < length; i++) { + id = (bytes[pos++] << 8) | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); } break; case 1: - for (; g.length <= t; ) { - o = (s[e++] << 8) | s[e++]; - c = s[e++]; - for (C = 0; C <= c; C++) g.push(a ? o++ : i.get(o++)); + 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: - for (; g.length <= t; ) { - o = (s[e++] << 8) | s[e++]; - c = (s[e++] << 8) | s[e++]; - for (C = 0; C <= c; C++) g.push(a ? o++ : i.get(o++)); + 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 FormatError("Unknown charset format"); } - const h = e, - l = s.subarray(r, h); - return new CFFCharset(!1, n, g, l); + const end = pos; + const raw = bytes.subarray(start, end); + return new CFFCharset(false, format, charset, raw); } - parseEncoding(e, t, i, a) { - const s = Object.create(null), - r = this.bytes; - let n, - g, - o, - c = !1, - C = null; - if (0 === e || 1 === e) { - c = !0; - n = e; - const t = e ? Ei : fi; - for (g = 0, o = a.length; g < o; g++) { - const e = t.indexOf(a[g]); - -1 !== e && (s[e] = g); + 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 ? ExpertEncoding : StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + const index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } } } else { - const t = e; - n = r[e++]; - switch (127 & n) { + const dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { case 0: - const t = r[e++]; - for (g = 1; g <= t; g++) s[r[e++]] = g; + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } break; case 1: - const i = r[e++]; - let a = 1; - for (g = 0; g < i; g++) { - const t = r[e++], - i = r[e++]; - for (let e = t; e <= t + i; e++) s[e] = a++; + const rangesCount = bytes[pos++]; + let gid = 1; + for (i = 0; i < rangesCount; i++) { + const start = bytes[pos++]; + const left = bytes[pos++]; + for (let j = start; j <= start + left; j++) { + encoding[j] = gid++; + } } break; default: - throw new FormatError(`Unknown encoding format: ${n} in CFF`); + throw new FormatError(`Unknown encoding format: ${format} in CFF`); } - const o = e; - if (128 & n) { - r[t] &= 127; - !(function readSupplement() { - const t = r[e++]; - for (g = 0; g < t; g++) { - const t = r[e++], - n = (r[e++] << 8) + (255 & r[e++]); - s[t] = a.indexOf(i.get(n)); - } - })(); + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); } - C = r.subarray(t, o); + raw = bytes.subarray(dataStart, dataEnd); } - n &= 127; - return new CFFEncoding(c, n, s, C); + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); } - parseFDSelect(e, t) { - const i = this.bytes, - a = i[e++], - s = []; - let r; - switch (a) { + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { case 0: - for (r = 0; r < t; ++r) { - const t = i[e++]; - s.push(t); + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); } break; case 3: - const n = (i[e++] << 8) | i[e++]; - for (r = 0; r < n; ++r) { - let t = (i[e++] << 8) | i[e++]; - if (0 === r && 0 !== t) { + const rangesCount = (bytes[pos++] << 8) | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + let first = (bytes[pos++] << 8) | bytes[pos++]; + if (i === 0 && first !== 0) { warn( - "parseFDSelect: The first range must have a first GID of 0 -- trying to recover.", + "parseFDSelect: The first range must have a first GID of 0" + + " -- trying to recover.", ); - t = 0; + first = 0; + } + const fdIndex = bytes[pos++]; + const next = (bytes[pos] << 8) | bytes[pos + 1]; + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); } - const a = i[e++], - n = (i[e] << 8) | i[e + 1]; - for (let e = t; e < n; ++e) s.push(a); } - e += 2; + pos += 2; break; default: - throw new FormatError(`parseFDSelect: Unknown format "${a}".`); + throw new FormatError(`parseFDSelect: Unknown format "${format}".`); } - if (s.length !== t) + if (fdSelect.length !== length) { throw new FormatError("parseFDSelect: Invalid font data."); - return new CFFFDSelect(a, s); + } + return new CFFFDSelect(format, fdSelect); } } class CFF { @@ -13721,49 +16931,61 @@ class CFF { this.charStrings = null; this.fdArray = []; this.fdSelect = null; - this.isCIDFont = !1; + this.isCIDFont = false; } duplicateFirstGlyph() { if (this.charStrings.count >= 65535) { warn("Not enough space in charstrings to duplicate first glyph."); return; } - const e = this.charStrings.get(0); - this.charStrings.add(e); - this.isCIDFont && this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } } - hasGlyphId(e) { - if (e < 0 || e >= this.charStrings.count) return !1; - return this.charStrings.get(e).length > 0; + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; } } class CFFHeader { - constructor(e, t, i, a) { - this.major = e; - this.minor = t; - this.hdrSize = i; - this.offSize = a; + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; } } class CFFStrings { constructor() { this.strings = []; } - get(e) { - return e >= 0 && e <= 390 - ? wi[e] - : e - Di <= this.strings.length - ? this.strings[e - Di] - : wi[0]; + 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(e) { - let t = wi.indexOf(e); - if (-1 !== t) return t; - t = this.strings.indexOf(e); - return -1 !== t ? t + Di : -1; + 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(e) { - this.strings.push(e); + add(value) { + this.strings.push(value); } get count() { return this.strings.length; @@ -13774,64 +16996,76 @@ class CFFIndex { this.objects = []; this.length = 0; } - add(e) { - this.length += e.length; - this.objects.push(e); + add(data) { + this.length += data.length; + this.objects.push(data); } - set(e, t) { - this.length += t.length - this.objects[e].length; - this.objects[e] = t; + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; } - get(e) { - return this.objects[e]; + get(index) { + return this.objects[index]; } get count() { return this.objects.length; } } class CFFDict { - constructor(e, t) { - this.keyToNameMap = e.keyToNameMap; - this.nameToKeyMap = e.nameToKeyMap; - this.defaults = e.defaults; - this.types = e.types; - this.opcodes = e.opcodes; - this.order = e.order; - this.strings = t; + 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(e, t) { - if (!(e in this.keyToNameMap)) return !1; - if (0 === t.length) return !0; - for (const i of t) - if (isNaN(i)) { - warn(`Invalid CFFDict value: "${t}" for key "${e}".`); - return !0; + setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + if (value.length === 0) { + return true; + } + for (const val of value) { + if (isNaN(val)) { + warn(`Invalid CFFDict value: "${value}" for key "${key}".`); + return true; } - const i = this.types[e]; - ("num" !== i && "sid" !== i && "offset" !== i) || (t = t[0]); - this.values[e] = t; - return !0; + } + const type = this.types[key]; + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values[key] = value; + return true; } - setByName(e, t) { - if (!(e in this.nameToKeyMap)) - throw new FormatError(`Invalid dictionary name "${e}"`); - this.values[this.nameToKeyMap[e]] = t; + setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name "${name}"`); + } + this.values[this.nameToKeyMap[name]] = value; } - hasName(e) { - return this.nameToKeyMap[e] in this.values; + hasName(name) { + return this.nameToKeyMap[name] in this.values; } - getByName(e) { - if (!(e in this.nameToKeyMap)) - throw new FormatError(`Invalid dictionary name ${e}"`); - const t = this.nameToKeyMap[e]; - return t in this.values ? this.values[t] : this.defaults[t]; + getByName(name) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; } - removeByName(e) { - delete this.values[this.nameToKeyMap[e]]; + removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; } - static createTables(e) { - const t = { + static createTables(layout) { + const tables = { keyToNameMap: {}, nameToKeyMap: {}, defaults: {}, @@ -13839,19 +17073,21 @@ class CFFDict { opcodes: {}, order: [], }; - for (const i of e) { - const e = Array.isArray(i[0]) ? (i[0][0] << 8) + i[0][1] : i[0]; - t.keyToNameMap[e] = i[1]; - t.nameToKeyMap[i[1]] = e; - t.types[e] = i[2]; - t.defaults[e] = i[3]; - t.opcodes[e] = Array.isArray(i[0]) ? i[0] : [i[0]]; - t.order.push(e); + for (const entry of layout) { + 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); } - return t; + return tables; } } -const Si = [ +const CFFTopDictLayout = [ [[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], @@ -13894,14 +17130,14 @@ const Si = [ ]; class CFFTopDict extends CFFDict { static get tables() { - return shadow(this, "tables", this.createTables(Si)); + return shadow(this, "tables", this.createTables(CFFTopDictLayout)); } - constructor(e) { - super(CFFTopDict.tables, e); + constructor(strings) { + super(CFFTopDict.tables, strings); this.privateDict = null; } } -const ki = [ +const CFFPrivateDictLayout = [ [6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], @@ -13923,153 +17159,189 @@ const ki = [ ]; class CFFPrivateDict extends CFFDict { static get tables() { - return shadow(this, "tables", this.createTables(ki)); + return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); } - constructor(e) { - super(CFFPrivateDict.tables, e); + constructor(strings) { + super(CFFPrivateDict.tables, strings); this.subrsIndex = null; } } -const Ri = { ISO_ADOBE: 0, EXPERT: 1, EXPERT_SUBSET: 2 }; +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2, +}; class CFFCharset { - constructor(e, t, i, a) { - this.predefined = e; - this.format = t; - this.charset = i; - this.raw = a; + constructor(predefined, format, charset, raw) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + this.raw = raw; } } class CFFEncoding { - constructor(e, t, i, a) { - this.predefined = e; - this.format = t; - this.encoding = i; - this.raw = a; + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; } } class CFFFDSelect { - constructor(e, t) { - this.format = e; - this.fdSelect = t; + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; } - getFDIndex(e) { - return e < 0 || e >= this.fdSelect.length ? -1 : this.fdSelect[e]; + getFDIndex(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; } } class CFFOffsetTracker { constructor() { this.offsets = Object.create(null); } - isTracking(e) { - return e in this.offsets; + isTracking(key) { + return key in this.offsets; } - track(e, t) { - if (e in this.offsets) - throw new FormatError(`Already tracking location of ${e}`); - this.offsets[e] = t; + track(key, location) { + if (key in this.offsets) { + throw new FormatError(`Already tracking location of ${key}`); + } + this.offsets[key] = location; } - offset(e) { - for (const t in this.offsets) this.offsets[t] += e; + offset(value) { + for (const key in this.offsets) { + this.offsets[key] += value; + } } - setEntryLocation(e, t, i) { - if (!(e in this.offsets)) - throw new FormatError(`Not tracking location of ${e}`); - const a = i.data, - s = this.offsets[e]; - for (let e = 0, i = t.length; e < i; ++e) { - const i = 5 * e + s, - r = i + 1, - n = i + 2, - g = i + 3, - o = i + 4; - if (29 !== a[i] || 0 !== a[r] || 0 !== a[n] || 0 !== a[g] || 0 !== a[o]) + setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + throw new FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.offsets[key]; + const size = 5; + 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 FormatError("writing to an offset that is not empty"); - const c = t[e]; - a[i] = 29; - a[r] = (c >> 24) & 255; - a[n] = (c >> 16) & 255; - a[g] = (c >> 8) & 255; - a[o] = 255 & c; + } + 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; } } } class CFFCompiler { - constructor(e) { - this.cff = e; + constructor(cff) { + this.cff = cff; } compile() { - const e = this.cff, - t = { - data: [], - length: 0, - add(e) { - try { - this.data.push(...e); - } catch { - this.data = this.data.concat(e); - } - this.length = this.data.length; - }, + const cff = this.cff; + const output = { + data: [], + length: 0, + add(data) { + try { + this.data.push(...data); + } catch { + this.data = this.data.concat(data); + } + this.length = this.data.length; }, - i = this.compileHeader(e.header); - t.add(i); - const a = this.compileNameIndex(e.names); - t.add(a); - if (e.isCIDFont && e.topDict.hasName("FontMatrix")) { - const t = e.topDict.getByName("FontMatrix"); - e.topDict.removeByName("FontMatrix"); - for (const i of e.fdArray) { - let e = t.slice(0); - i.hasName("FontMatrix") && - (e = Util.transform(e, i.getByName("FontMatrix"))); - i.setByName("FontMatrix", e); + }; + const header = this.compileHeader(cff.header); + output.add(header); + const nameIndex = this.compileNameIndex(cff.names); + output.add(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName("FontMatrix")) { + const base = cff.topDict.getByName("FontMatrix"); + cff.topDict.removeByName("FontMatrix"); + for (const subDict of cff.fdArray) { + let matrix = base.slice(0); + if (subDict.hasName("FontMatrix")) { + matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); + } + subDict.setByName("FontMatrix", matrix); + } } } - const s = e.topDict.getByName("XUID"); - s?.length > 16 && e.topDict.removeByName("XUID"); - e.topDict.setByName("charset", 0); - let r = this.compileTopDicts([e.topDict], t.length, e.isCIDFont); - t.add(r.output); - const n = r.trackers[0], - g = this.compileStringIndex(e.strings.strings); - t.add(g); - const o = this.compileIndex(e.globalSubrIndex); - t.add(o); - if (e.encoding && e.topDict.hasName("Encoding")) - if (e.encoding.predefined) - n.setEntryLocation("Encoding", [e.encoding.format], t); - else { - const i = this.compileEncoding(e.encoding); - n.setEntryLocation("Encoding", [t.length], t); - t.add(i); - } - const c = this.compileCharset( - e.charset, - e.charStrings.count, - e.strings, - e.isCIDFont, + const xuid = cff.topDict.getByName("XUID"); + if (xuid?.length > 16) { + cff.topDict.removeByName("XUID"); + } + cff.topDict.setByName("charset", 0); + let compiled = this.compileTopDicts( + [cff.topDict], + output.length, + cff.isCIDFont, ); - n.setEntryLocation("charset", [t.length], t); - t.add(c); - const C = this.compileCharStrings(e.charStrings); - n.setEntryLocation("CharStrings", [t.length], t); - t.add(C); - if (e.isCIDFont) { - n.setEntryLocation("FDSelect", [t.length], t); - const i = this.compileFDSelect(e.fdSelect); - t.add(i); - r = this.compileTopDicts(e.fdArray, t.length, !0); - n.setEntryLocation("FDArray", [t.length], t); - t.add(r.output); - const a = r.trackers; - this.compilePrivateDicts(e.fdArray, a, t); + 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); + 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); + } } - this.compilePrivateDicts([e.topDict], [n], t); - t.add([0]); - return t.data; + 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 (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); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.add([0]); + return output.data; } - encodeNumber(e) { - return Number.isInteger(e) ? this.encodeInteger(e) : this.encodeFloat(e); + encodeNumber(value) { + if (Number.isInteger(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); } static get EncodeFloatRegExp() { return shadow( @@ -14078,6216 +17350,6430 @@ class CFFCompiler { /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/, ); } - encodeFloat(e) { - let t = e.toString(); - const i = CFFCompiler.EncodeFloatRegExp.exec(t); - if (i) { - const a = parseFloat("1e" + ((i[2] ? +i[2] : 0) + i[1].length)); - t = (Math.round(e * a) / a).toString(); + encodeFloat(num) { + let value = num.toString(); + const m = CFFCompiler.EncodeFloatRegExp.exec(value); + if (m) { + const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); } - let a, - s, - r = ""; - for (a = 0, s = t.length; a < s; ++a) { - const e = t[a]; - r += - "e" === e - ? "-" === t[++a] - ? "c" - : "b" - : "." === e - ? "a" - : "-" === e - ? "e" - : e; - } - r += 1 & r.length ? "f" : "ff"; - const n = [30]; - for (a = 0, s = r.length; a < s; a += 2) - n.push(parseInt(r.substring(a, a + 2), 16)); - return n; - } - encodeInteger(e) { - let t; - t = - e >= -107 && e <= 107 - ? [e + 139] - : e >= 108 && e <= 1131 - ? [247 + ((e -= 108) >> 8), 255 & e] - : e >= -1131 && e <= -108 - ? [251 + ((e = -e - 108) >> 8), 255 & e] - : e >= -32768 && e <= 32767 - ? [28, (e >> 8) & 255, 255 & e] - : [29, (e >> 24) & 255, (e >> 16) & 255, (e >> 8) & 255, 255 & e]; - return t; - } - compileHeader(e) { - return [e.major, e.minor, 4, e.offSize]; - } - compileNameIndex(e) { - const t = new CFFIndex(); - for (const i of e) { - const e = Math.min(i.length, 127); - let a = new Array(e); - for (let t = 0; t < e; t++) { - let e = i[t]; - (e < "!" || - e > "~" || - "[" === e || - "]" === e || - "(" === e || - ")" === e || - "{" === e || - "}" === e || - "<" === e || - ">" === e || - "/" === e || - "%" === e) && - (e = "_"); - a[t] = e; - } - a = a.join(""); - "" === a && (a = "Bad_Font_Name"); - t.add(stringToBytes(a)); - } - return this.compileIndex(t); - } - compileTopDicts(e, t, i) { - const a = []; - let s = new CFFIndex(); - for (const r of e) { - if (i) { - r.removeByName("CIDFontVersion"); - r.removeByName("CIDFontRevision"); - r.removeByName("CIDFontType"); - r.removeByName("CIDCount"); - r.removeByName("UIDBase"); - } - const e = new CFFOffsetTracker(), - n = this.compileDict(r, e); - a.push(e); - s.add(n); - e.offset(t); - } - s = this.compileIndex(s, a); - return { trackers: a, output: s }; - } - compilePrivateDicts(e, t, i) { - for (let a = 0, s = e.length; a < s; ++a) { - const s = e[a], - r = s.privateDict; - if (!r || !s.hasName("Private")) - throw new FormatError("There must be a private dictionary."); - const n = new CFFOffsetTracker(), - g = this.compileDict(r, n); - let o = i.length; - n.offset(o); - g.length || (o = 0); - t[a].setEntryLocation("Private", [g.length, o], i); - i.add(g); - if (r.subrsIndex && r.hasName("Subrs")) { - const e = this.compileIndex(r.subrsIndex); - n.setEntryLocation("Subrs", [g.length], i); - i.add(e); + let nibbles = ""; + let i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + const 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"; + const out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substring(i, i + 2), 16)); + } + return out; } - compileDict(e, t) { - const i = []; - for (const a of e.order) { - if (!(a in e.values)) continue; - let s = e.values[a], - r = e.types[a]; - Array.isArray(r) || (r = [r]); - Array.isArray(s) || (s = [s]); - if (0 !== s.length) { - for (let n = 0, g = r.length; n < g; ++n) { - const g = r[n], - o = s[n]; - switch (g) { - case "num": - case "sid": - i.push(...this.encodeNumber(o)); - break; - case "offset": - const r = e.keyToNameMap[a]; - t.isTracking(r) || t.track(r, i.length); - i.push(29, 0, 0, 0, 0); - break; - case "array": - case "delta": - i.push(...this.encodeNumber(o)); - for (let e = 1, t = s.length; e < t; ++e) - i.push(...this.encodeNumber(s[e])); - break; - default: - throw new FormatError(`Unknown data type of ${g}`); - } + encodeInteger(value) { + let code; + 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, + ]; + } + return code; + } + compileHeader(header) { + return [header.major, header.minor, 4, header.offSize]; + } + compileNameIndex(names) { + const nameIndex = new CFFIndex(); + for (const name of names) { + const length = Math.min(name.length, 127); + let sanitizedName = new Array(length); + for (let j = 0; j < length; j++) { + let char = name[j]; + if ( + char < "!" || + char > "~" || + char === "[" || + char === "]" || + char === "(" || + char === ")" || + char === "{" || + char === "}" || + char === "<" || + char === ">" || + char === "/" || + char === "%" + ) { + char = "_"; } - i.push(...e.opcodes[a]); + sanitizedName[j] = char; + } + sanitizedName = sanitizedName.join(""); + if (sanitizedName === "") { + sanitizedName = "Bad_Font_Name"; + } + nameIndex.add(stringToBytes(sanitizedName)); + } + return this.compileIndex(nameIndex); + } + compileTopDicts(dicts, length, removeCidKeys) { + const fontDictTrackers = []; + let fdArrayIndex = new CFFIndex(); + for (const fontDict of dicts) { + if (removeCidKeys) { + fontDict.removeByName("CIDFontVersion"); + fontDict.removeByName("CIDFontRevision"); + fontDict.removeByName("CIDFontType"); + fontDict.removeByName("CIDCount"); + fontDict.removeByName("UIDBase"); + } + const fontDictTracker = new CFFOffsetTracker(); + const 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 (let i = 0, ii = dicts.length; i < ii; ++i) { + const fontDict = dicts[i]; + const privateDict = fontDict.privateDict; + if (!privateDict || !fontDict.hasName("Private")) { + throw new FormatError("There must be a private dictionary."); + } + const privateDictTracker = new CFFOffsetTracker(); + const privateDictData = this.compileDict(privateDict, privateDictTracker); + let 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")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation( + "Subrs", + [privateDictData.length], + output, + ); + output.add(subrs); } } - return i; } - compileStringIndex(e) { - const t = new CFFIndex(); - for (const i of e) t.add(stringToBytes(i)); - return this.compileIndex(t); - } - compileCharStrings(e) { - const t = new CFFIndex(); - for (let i = 0; i < e.count; i++) { - const a = e.get(i); - 0 !== a.length ? t.add(a) : t.add(new Uint8Array([139, 14])); + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!(key in dict.values)) { + continue; + } + let values = dict.values[key]; + let types = dict.types[key]; + if (!Array.isArray(types)) { + types = [types]; + } + if (!Array.isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (let j = 0, jj = types.length; j < jj; ++j) { + const type = types[j]; + const value = values[j]; + switch (type) { + case "num": + case "sid": + out.push(...this.encodeNumber(value)); + break; + case "offset": + const name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out.push(0x1d, 0, 0, 0, 0); + break; + case "array": + case "delta": + out.push(...this.encodeNumber(value)); + for (let k = 1, kk = values.length; k < kk; ++k) { + out.push(...this.encodeNumber(values[k])); + } + break; + default: + throw new FormatError(`Unknown data type of ${type}`); + } + } + out.push(...dict.opcodes[key]); } - return this.compileIndex(t); + return out; } - compileCharset(e, t, i, a) { - let s; - const r = t - 1; - if (a) s = new Uint8Array([2, 0, 0, (r >> 8) & 255, 255 & r]); - else { - s = new Uint8Array(1 + 2 * r); - s[0] = 0; - let t = 0; - const a = e.charset.length; - let n = !1; - for (let r = 1; r < s.length; r += 2) { - let g = 0; - if (t < a) { - const a = e.charset[t++]; - g = i.getSID(a); - if (-1 === g) { - g = 0; - if (!n) { - n = !0; - warn(`Couldn't find ${a} in CFF strings`); + compileStringIndex(strings) { + const stringIndex = new CFFIndex(); + for (const string of strings) { + stringIndex.add(stringToBytes(string)); + } + return this.compileIndex(stringIndex); + } + compileCharStrings(charStrings) { + const charStringsIndex = new CFFIndex(); + for (let i = 0; i < charStrings.count; i++) { + const 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; + warn(`Couldn't find ${name} in CFF strings`); } } } - s[r] = (g >> 8) & 255; - s[r + 1] = 255 & g; + out[i] = (sid >> 8) & 0xff; + out[i + 1] = sid & 0xff; } } - return this.compileTypedArray(s); + return this.compileTypedArray(out); } - compileEncoding(e) { - return this.compileTypedArray(e.raw); + compileEncoding(encoding) { + return this.compileTypedArray(encoding.raw); } - compileFDSelect(e) { - const t = e.format; - let i, a; - switch (t) { + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { case 0: - i = new Uint8Array(1 + e.fdSelect.length); - i[0] = t; - for (a = 0; a < e.fdSelect.length; a++) i[a + 1] = e.fdSelect[a]; + 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 s = 0; - let r = e.fdSelect[0]; - const n = [t, 0, 0, (s >> 8) & 255, 255 & s, r]; - for (a = 1; a < e.fdSelect.length; a++) { - const t = e.fdSelect[a]; - if (t !== r) { - n.push((a >> 8) & 255, 255 & a, t); - r = t; + 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 g = (n.length - 3) / 3; - n[1] = (g >> 8) & 255; - n[2] = 255 & g; - n.push((a >> 8) & 255, 255 & a); - i = new Uint8Array(n); + 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(i); + return this.compileTypedArray(out); } - compileTypedArray(e) { - return Array.from(e); + compileTypedArray(data) { + return Array.from(data); } - compileIndex(e, t = []) { - const i = e.objects, - a = i.length; - if (0 === a) return [0, 0]; - const s = [(a >> 8) & 255, 255 & a]; - let r, - n, - g = 1; - for (r = 0; r < a; ++r) g += i[r].length; - n = g < 256 ? 1 : g < 65536 ? 2 : g < 16777216 ? 3 : 4; - s.push(n); - let o = 1; - for (r = 0; r < a + 1; r++) { - 1 === n - ? s.push(255 & o) - : 2 === n - ? s.push((o >> 8) & 255, 255 & o) - : 3 === n - ? s.push((o >> 16) & 255, (o >> 8) & 255, 255 & o) - : s.push( - (o >>> 24) & 255, - (o >> 16) & 255, - (o >> 8) & 255, - 255 & o, - ); - i[r] && (o += i[r].length); + compileIndex(index, trackers = []) { + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return [0, 0]; } - for (r = 0; r < a; r++) { - t[r] && t[r].offset(s.length); - s.push(...i[r]); + const data = [(count >> 8) & 0xff, count & 0xff]; + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; } - return s; - } -} -const Ni = getLookupTableFactory(function (e) { - e.A = 65; - e.AE = 198; - e.AEacute = 508; - e.AEmacron = 482; - e.AEsmall = 63462; - e.Aacute = 193; - e.Aacutesmall = 63457; - e.Abreve = 258; - e.Abreveacute = 7854; - e.Abrevecyrillic = 1232; - e.Abrevedotbelow = 7862; - e.Abrevegrave = 7856; - e.Abrevehookabove = 7858; - e.Abrevetilde = 7860; - e.Acaron = 461; - e.Acircle = 9398; - e.Acircumflex = 194; - e.Acircumflexacute = 7844; - e.Acircumflexdotbelow = 7852; - e.Acircumflexgrave = 7846; - e.Acircumflexhookabove = 7848; - e.Acircumflexsmall = 63458; - e.Acircumflextilde = 7850; - e.Acute = 63177; - e.Acutesmall = 63412; - e.Acyrillic = 1040; - e.Adblgrave = 512; - e.Adieresis = 196; - e.Adieresiscyrillic = 1234; - e.Adieresismacron = 478; - e.Adieresissmall = 63460; - e.Adotbelow = 7840; - e.Adotmacron = 480; - e.Agrave = 192; - e.Agravesmall = 63456; - e.Ahookabove = 7842; - e.Aiecyrillic = 1236; - e.Ainvertedbreve = 514; - e.Alpha = 913; - e.Alphatonos = 902; - e.Amacron = 256; - e.Amonospace = 65313; - e.Aogonek = 260; - e.Aring = 197; - e.Aringacute = 506; - e.Aringbelow = 7680; - e.Aringsmall = 63461; - e.Asmall = 63329; - e.Atilde = 195; - e.Atildesmall = 63459; - e.Aybarmenian = 1329; - e.B = 66; - e.Bcircle = 9399; - e.Bdotaccent = 7682; - e.Bdotbelow = 7684; - e.Becyrillic = 1041; - e.Benarmenian = 1330; - e.Beta = 914; - e.Bhook = 385; - e.Blinebelow = 7686; - e.Bmonospace = 65314; - e.Brevesmall = 63220; - e.Bsmall = 63330; - e.Btopbar = 386; - e.C = 67; - e.Caarmenian = 1342; - e.Cacute = 262; - e.Caron = 63178; - e.Caronsmall = 63221; - e.Ccaron = 268; - e.Ccedilla = 199; - e.Ccedillaacute = 7688; - e.Ccedillasmall = 63463; - e.Ccircle = 9400; - e.Ccircumflex = 264; - e.Cdot = 266; - e.Cdotaccent = 266; - e.Cedillasmall = 63416; - e.Chaarmenian = 1353; - e.Cheabkhasiancyrillic = 1212; - e.Checyrillic = 1063; - e.Chedescenderabkhasiancyrillic = 1214; - e.Chedescendercyrillic = 1206; - e.Chedieresiscyrillic = 1268; - e.Cheharmenian = 1347; - e.Chekhakassiancyrillic = 1227; - e.Cheverticalstrokecyrillic = 1208; - e.Chi = 935; - e.Chook = 391; - e.Circumflexsmall = 63222; - e.Cmonospace = 65315; - e.Coarmenian = 1361; - e.Csmall = 63331; - e.D = 68; - e.DZ = 497; - e.DZcaron = 452; - e.Daarmenian = 1332; - e.Dafrican = 393; - e.Dcaron = 270; - e.Dcedilla = 7696; - e.Dcircle = 9401; - e.Dcircumflexbelow = 7698; - e.Dcroat = 272; - e.Ddotaccent = 7690; - e.Ddotbelow = 7692; - e.Decyrillic = 1044; - e.Deicoptic = 1006; - e.Delta = 8710; - e.Deltagreek = 916; - e.Dhook = 394; - e.Dieresis = 63179; - e.DieresisAcute = 63180; - e.DieresisGrave = 63181; - e.Dieresissmall = 63400; - e.Digammagreek = 988; - e.Djecyrillic = 1026; - e.Dlinebelow = 7694; - e.Dmonospace = 65316; - e.Dotaccentsmall = 63223; - e.Dslash = 272; - e.Dsmall = 63332; - e.Dtopbar = 395; - e.Dz = 498; - e.Dzcaron = 453; - e.Dzeabkhasiancyrillic = 1248; - e.Dzecyrillic = 1029; - e.Dzhecyrillic = 1039; - e.E = 69; - e.Eacute = 201; - e.Eacutesmall = 63465; - e.Ebreve = 276; - e.Ecaron = 282; - e.Ecedillabreve = 7708; - e.Echarmenian = 1333; - e.Ecircle = 9402; - e.Ecircumflex = 202; - e.Ecircumflexacute = 7870; - e.Ecircumflexbelow = 7704; - e.Ecircumflexdotbelow = 7878; - e.Ecircumflexgrave = 7872; - e.Ecircumflexhookabove = 7874; - e.Ecircumflexsmall = 63466; - e.Ecircumflextilde = 7876; - e.Ecyrillic = 1028; - e.Edblgrave = 516; - e.Edieresis = 203; - e.Edieresissmall = 63467; - e.Edot = 278; - e.Edotaccent = 278; - e.Edotbelow = 7864; - e.Efcyrillic = 1060; - e.Egrave = 200; - e.Egravesmall = 63464; - e.Eharmenian = 1335; - e.Ehookabove = 7866; - e.Eightroman = 8551; - e.Einvertedbreve = 518; - e.Eiotifiedcyrillic = 1124; - e.Elcyrillic = 1051; - e.Elevenroman = 8554; - e.Emacron = 274; - e.Emacronacute = 7702; - e.Emacrongrave = 7700; - e.Emcyrillic = 1052; - e.Emonospace = 65317; - e.Encyrillic = 1053; - e.Endescendercyrillic = 1186; - e.Eng = 330; - e.Enghecyrillic = 1188; - e.Enhookcyrillic = 1223; - e.Eogonek = 280; - e.Eopen = 400; - e.Epsilon = 917; - e.Epsilontonos = 904; - e.Ercyrillic = 1056; - e.Ereversed = 398; - e.Ereversedcyrillic = 1069; - e.Escyrillic = 1057; - e.Esdescendercyrillic = 1194; - e.Esh = 425; - e.Esmall = 63333; - e.Eta = 919; - e.Etarmenian = 1336; - e.Etatonos = 905; - e.Eth = 208; - e.Ethsmall = 63472; - e.Etilde = 7868; - e.Etildebelow = 7706; - e.Euro = 8364; - e.Ezh = 439; - e.Ezhcaron = 494; - e.Ezhreversed = 440; - e.F = 70; - e.Fcircle = 9403; - e.Fdotaccent = 7710; - e.Feharmenian = 1366; - e.Feicoptic = 996; - e.Fhook = 401; - e.Fitacyrillic = 1138; - e.Fiveroman = 8548; - e.Fmonospace = 65318; - e.Fourroman = 8547; - e.Fsmall = 63334; - e.G = 71; - e.GBsquare = 13191; - e.Gacute = 500; - e.Gamma = 915; - e.Gammaafrican = 404; - e.Gangiacoptic = 1002; - e.Gbreve = 286; - e.Gcaron = 486; - e.Gcedilla = 290; - e.Gcircle = 9404; - e.Gcircumflex = 284; - e.Gcommaaccent = 290; - e.Gdot = 288; - e.Gdotaccent = 288; - e.Gecyrillic = 1043; - e.Ghadarmenian = 1346; - e.Ghemiddlehookcyrillic = 1172; - e.Ghestrokecyrillic = 1170; - e.Gheupturncyrillic = 1168; - e.Ghook = 403; - e.Gimarmenian = 1331; - e.Gjecyrillic = 1027; - e.Gmacron = 7712; - e.Gmonospace = 65319; - e.Grave = 63182; - e.Gravesmall = 63328; - e.Gsmall = 63335; - e.Gsmallhook = 667; - e.Gstroke = 484; - e.H = 72; - e.H18533 = 9679; - e.H18543 = 9642; - e.H18551 = 9643; - e.H22073 = 9633; - e.HPsquare = 13259; - e.Haabkhasiancyrillic = 1192; - e.Hadescendercyrillic = 1202; - e.Hardsigncyrillic = 1066; - e.Hbar = 294; - e.Hbrevebelow = 7722; - e.Hcedilla = 7720; - e.Hcircle = 9405; - e.Hcircumflex = 292; - e.Hdieresis = 7718; - e.Hdotaccent = 7714; - e.Hdotbelow = 7716; - e.Hmonospace = 65320; - e.Hoarmenian = 1344; - e.Horicoptic = 1e3; - e.Hsmall = 63336; - e.Hungarumlaut = 63183; - e.Hungarumlautsmall = 63224; - e.Hzsquare = 13200; - e.I = 73; - e.IAcyrillic = 1071; - e.IJ = 306; - e.IUcyrillic = 1070; - e.Iacute = 205; - e.Iacutesmall = 63469; - e.Ibreve = 300; - e.Icaron = 463; - e.Icircle = 9406; - e.Icircumflex = 206; - e.Icircumflexsmall = 63470; - e.Icyrillic = 1030; - e.Idblgrave = 520; - e.Idieresis = 207; - e.Idieresisacute = 7726; - e.Idieresiscyrillic = 1252; - e.Idieresissmall = 63471; - e.Idot = 304; - e.Idotaccent = 304; - e.Idotbelow = 7882; - e.Iebrevecyrillic = 1238; - e.Iecyrillic = 1045; - e.Ifraktur = 8465; - e.Igrave = 204; - e.Igravesmall = 63468; - e.Ihookabove = 7880; - e.Iicyrillic = 1048; - e.Iinvertedbreve = 522; - e.Iishortcyrillic = 1049; - e.Imacron = 298; - e.Imacroncyrillic = 1250; - e.Imonospace = 65321; - e.Iniarmenian = 1339; - e.Iocyrillic = 1025; - e.Iogonek = 302; - e.Iota = 921; - e.Iotaafrican = 406; - e.Iotadieresis = 938; - e.Iotatonos = 906; - e.Ismall = 63337; - e.Istroke = 407; - e.Itilde = 296; - e.Itildebelow = 7724; - e.Izhitsacyrillic = 1140; - e.Izhitsadblgravecyrillic = 1142; - e.J = 74; - e.Jaarmenian = 1345; - e.Jcircle = 9407; - e.Jcircumflex = 308; - e.Jecyrillic = 1032; - e.Jheharmenian = 1355; - e.Jmonospace = 65322; - e.Jsmall = 63338; - e.K = 75; - e.KBsquare = 13189; - e.KKsquare = 13261; - e.Kabashkircyrillic = 1184; - e.Kacute = 7728; - e.Kacyrillic = 1050; - e.Kadescendercyrillic = 1178; - e.Kahookcyrillic = 1219; - e.Kappa = 922; - e.Kastrokecyrillic = 1182; - e.Kaverticalstrokecyrillic = 1180; - e.Kcaron = 488; - e.Kcedilla = 310; - e.Kcircle = 9408; - e.Kcommaaccent = 310; - e.Kdotbelow = 7730; - e.Keharmenian = 1364; - e.Kenarmenian = 1343; - e.Khacyrillic = 1061; - e.Kheicoptic = 998; - e.Khook = 408; - e.Kjecyrillic = 1036; - e.Klinebelow = 7732; - e.Kmonospace = 65323; - e.Koppacyrillic = 1152; - e.Koppagreek = 990; - e.Ksicyrillic = 1134; - e.Ksmall = 63339; - e.L = 76; - e.LJ = 455; - e.LL = 63167; - e.Lacute = 313; - e.Lambda = 923; - e.Lcaron = 317; - e.Lcedilla = 315; - e.Lcircle = 9409; - e.Lcircumflexbelow = 7740; - e.Lcommaaccent = 315; - e.Ldot = 319; - e.Ldotaccent = 319; - e.Ldotbelow = 7734; - e.Ldotbelowmacron = 7736; - e.Liwnarmenian = 1340; - e.Lj = 456; - e.Ljecyrillic = 1033; - e.Llinebelow = 7738; - e.Lmonospace = 65324; - e.Lslash = 321; - e.Lslashsmall = 63225; - e.Lsmall = 63340; - e.M = 77; - e.MBsquare = 13190; - e.Macron = 63184; - e.Macronsmall = 63407; - e.Macute = 7742; - e.Mcircle = 9410; - e.Mdotaccent = 7744; - e.Mdotbelow = 7746; - e.Menarmenian = 1348; - e.Mmonospace = 65325; - e.Msmall = 63341; - e.Mturned = 412; - e.Mu = 924; - e.N = 78; - e.NJ = 458; - e.Nacute = 323; - e.Ncaron = 327; - e.Ncedilla = 325; - e.Ncircle = 9411; - e.Ncircumflexbelow = 7754; - e.Ncommaaccent = 325; - e.Ndotaccent = 7748; - e.Ndotbelow = 7750; - e.Nhookleft = 413; - e.Nineroman = 8552; - e.Nj = 459; - e.Njecyrillic = 1034; - e.Nlinebelow = 7752; - e.Nmonospace = 65326; - e.Nowarmenian = 1350; - e.Nsmall = 63342; - e.Ntilde = 209; - e.Ntildesmall = 63473; - e.Nu = 925; - e.O = 79; - e.OE = 338; - e.OEsmall = 63226; - e.Oacute = 211; - e.Oacutesmall = 63475; - e.Obarredcyrillic = 1256; - e.Obarreddieresiscyrillic = 1258; - e.Obreve = 334; - e.Ocaron = 465; - e.Ocenteredtilde = 415; - e.Ocircle = 9412; - e.Ocircumflex = 212; - e.Ocircumflexacute = 7888; - e.Ocircumflexdotbelow = 7896; - e.Ocircumflexgrave = 7890; - e.Ocircumflexhookabove = 7892; - e.Ocircumflexsmall = 63476; - e.Ocircumflextilde = 7894; - e.Ocyrillic = 1054; - e.Odblacute = 336; - e.Odblgrave = 524; - e.Odieresis = 214; - e.Odieresiscyrillic = 1254; - e.Odieresissmall = 63478; - e.Odotbelow = 7884; - e.Ogoneksmall = 63227; - e.Ograve = 210; - e.Ogravesmall = 63474; - e.Oharmenian = 1365; - e.Ohm = 8486; - e.Ohookabove = 7886; - e.Ohorn = 416; - e.Ohornacute = 7898; - e.Ohorndotbelow = 7906; - e.Ohorngrave = 7900; - e.Ohornhookabove = 7902; - e.Ohorntilde = 7904; - e.Ohungarumlaut = 336; - e.Oi = 418; - e.Oinvertedbreve = 526; - e.Omacron = 332; - e.Omacronacute = 7762; - e.Omacrongrave = 7760; - e.Omega = 8486; - e.Omegacyrillic = 1120; - e.Omegagreek = 937; - e.Omegaroundcyrillic = 1146; - e.Omegatitlocyrillic = 1148; - e.Omegatonos = 911; - e.Omicron = 927; - e.Omicrontonos = 908; - e.Omonospace = 65327; - e.Oneroman = 8544; - e.Oogonek = 490; - e.Oogonekmacron = 492; - e.Oopen = 390; - e.Oslash = 216; - e.Oslashacute = 510; - e.Oslashsmall = 63480; - e.Osmall = 63343; - e.Ostrokeacute = 510; - e.Otcyrillic = 1150; - e.Otilde = 213; - e.Otildeacute = 7756; - e.Otildedieresis = 7758; - e.Otildesmall = 63477; - e.P = 80; - e.Pacute = 7764; - e.Pcircle = 9413; - e.Pdotaccent = 7766; - e.Pecyrillic = 1055; - e.Peharmenian = 1354; - e.Pemiddlehookcyrillic = 1190; - e.Phi = 934; - e.Phook = 420; - e.Pi = 928; - e.Piwrarmenian = 1363; - e.Pmonospace = 65328; - e.Psi = 936; - e.Psicyrillic = 1136; - e.Psmall = 63344; - e.Q = 81; - e.Qcircle = 9414; - e.Qmonospace = 65329; - e.Qsmall = 63345; - e.R = 82; - e.Raarmenian = 1356; - e.Racute = 340; - e.Rcaron = 344; - e.Rcedilla = 342; - e.Rcircle = 9415; - e.Rcommaaccent = 342; - e.Rdblgrave = 528; - e.Rdotaccent = 7768; - e.Rdotbelow = 7770; - e.Rdotbelowmacron = 7772; - e.Reharmenian = 1360; - e.Rfraktur = 8476; - e.Rho = 929; - e.Ringsmall = 63228; - e.Rinvertedbreve = 530; - e.Rlinebelow = 7774; - e.Rmonospace = 65330; - e.Rsmall = 63346; - e.Rsmallinverted = 641; - e.Rsmallinvertedsuperior = 694; - e.S = 83; - e.SF010000 = 9484; - e.SF020000 = 9492; - e.SF030000 = 9488; - e.SF040000 = 9496; - e.SF050000 = 9532; - e.SF060000 = 9516; - e.SF070000 = 9524; - e.SF080000 = 9500; - e.SF090000 = 9508; - e.SF100000 = 9472; - e.SF110000 = 9474; - e.SF190000 = 9569; - e.SF200000 = 9570; - e.SF210000 = 9558; - e.SF220000 = 9557; - e.SF230000 = 9571; - e.SF240000 = 9553; - e.SF250000 = 9559; - e.SF260000 = 9565; - e.SF270000 = 9564; - e.SF280000 = 9563; - e.SF360000 = 9566; - e.SF370000 = 9567; - e.SF380000 = 9562; - e.SF390000 = 9556; - e.SF400000 = 9577; - e.SF410000 = 9574; - e.SF420000 = 9568; - e.SF430000 = 9552; - e.SF440000 = 9580; - e.SF450000 = 9575; - e.SF460000 = 9576; - e.SF470000 = 9572; - e.SF480000 = 9573; - e.SF490000 = 9561; - e.SF500000 = 9560; - e.SF510000 = 9554; - e.SF520000 = 9555; - e.SF530000 = 9579; - e.SF540000 = 9578; - e.Sacute = 346; - e.Sacutedotaccent = 7780; - e.Sampigreek = 992; - e.Scaron = 352; - e.Scarondotaccent = 7782; - e.Scaronsmall = 63229; - e.Scedilla = 350; - e.Schwa = 399; - e.Schwacyrillic = 1240; - e.Schwadieresiscyrillic = 1242; - e.Scircle = 9416; - e.Scircumflex = 348; - e.Scommaaccent = 536; - e.Sdotaccent = 7776; - e.Sdotbelow = 7778; - e.Sdotbelowdotaccent = 7784; - e.Seharmenian = 1357; - e.Sevenroman = 8550; - e.Shaarmenian = 1351; - e.Shacyrillic = 1064; - e.Shchacyrillic = 1065; - e.Sheicoptic = 994; - e.Shhacyrillic = 1210; - e.Shimacoptic = 1004; - e.Sigma = 931; - e.Sixroman = 8549; - e.Smonospace = 65331; - e.Softsigncyrillic = 1068; - e.Ssmall = 63347; - e.Stigmagreek = 986; - e.T = 84; - e.Tau = 932; - e.Tbar = 358; - e.Tcaron = 356; - e.Tcedilla = 354; - e.Tcircle = 9417; - e.Tcircumflexbelow = 7792; - e.Tcommaaccent = 354; - e.Tdotaccent = 7786; - e.Tdotbelow = 7788; - e.Tecyrillic = 1058; - e.Tedescendercyrillic = 1196; - e.Tenroman = 8553; - e.Tetsecyrillic = 1204; - e.Theta = 920; - e.Thook = 428; - e.Thorn = 222; - e.Thornsmall = 63486; - e.Threeroman = 8546; - e.Tildesmall = 63230; - e.Tiwnarmenian = 1359; - e.Tlinebelow = 7790; - e.Tmonospace = 65332; - e.Toarmenian = 1337; - e.Tonefive = 444; - e.Tonesix = 388; - e.Tonetwo = 423; - e.Tretroflexhook = 430; - e.Tsecyrillic = 1062; - e.Tshecyrillic = 1035; - e.Tsmall = 63348; - e.Twelveroman = 8555; - e.Tworoman = 8545; - e.U = 85; - e.Uacute = 218; - e.Uacutesmall = 63482; - e.Ubreve = 364; - e.Ucaron = 467; - e.Ucircle = 9418; - e.Ucircumflex = 219; - e.Ucircumflexbelow = 7798; - e.Ucircumflexsmall = 63483; - e.Ucyrillic = 1059; - e.Udblacute = 368; - e.Udblgrave = 532; - e.Udieresis = 220; - e.Udieresisacute = 471; - e.Udieresisbelow = 7794; - e.Udieresiscaron = 473; - e.Udieresiscyrillic = 1264; - e.Udieresisgrave = 475; - e.Udieresismacron = 469; - e.Udieresissmall = 63484; - e.Udotbelow = 7908; - e.Ugrave = 217; - e.Ugravesmall = 63481; - e.Uhookabove = 7910; - e.Uhorn = 431; - e.Uhornacute = 7912; - e.Uhorndotbelow = 7920; - e.Uhorngrave = 7914; - e.Uhornhookabove = 7916; - e.Uhorntilde = 7918; - e.Uhungarumlaut = 368; - e.Uhungarumlautcyrillic = 1266; - e.Uinvertedbreve = 534; - e.Ukcyrillic = 1144; - e.Umacron = 362; - e.Umacroncyrillic = 1262; - e.Umacrondieresis = 7802; - e.Umonospace = 65333; - e.Uogonek = 370; - e.Upsilon = 933; - e.Upsilon1 = 978; - e.Upsilonacutehooksymbolgreek = 979; - e.Upsilonafrican = 433; - e.Upsilondieresis = 939; - e.Upsilondieresishooksymbolgreek = 980; - e.Upsilonhooksymbol = 978; - e.Upsilontonos = 910; - e.Uring = 366; - e.Ushortcyrillic = 1038; - e.Usmall = 63349; - e.Ustraightcyrillic = 1198; - e.Ustraightstrokecyrillic = 1200; - e.Utilde = 360; - e.Utildeacute = 7800; - e.Utildebelow = 7796; - e.V = 86; - e.Vcircle = 9419; - e.Vdotbelow = 7806; - e.Vecyrillic = 1042; - e.Vewarmenian = 1358; - e.Vhook = 434; - e.Vmonospace = 65334; - e.Voarmenian = 1352; - e.Vsmall = 63350; - e.Vtilde = 7804; - e.W = 87; - e.Wacute = 7810; - e.Wcircle = 9420; - e.Wcircumflex = 372; - e.Wdieresis = 7812; - e.Wdotaccent = 7814; - e.Wdotbelow = 7816; - e.Wgrave = 7808; - e.Wmonospace = 65335; - e.Wsmall = 63351; - e.X = 88; - e.Xcircle = 9421; - e.Xdieresis = 7820; - e.Xdotaccent = 7818; - e.Xeharmenian = 1341; - e.Xi = 926; - e.Xmonospace = 65336; - e.Xsmall = 63352; - e.Y = 89; - e.Yacute = 221; - e.Yacutesmall = 63485; - e.Yatcyrillic = 1122; - e.Ycircle = 9422; - e.Ycircumflex = 374; - e.Ydieresis = 376; - e.Ydieresissmall = 63487; - e.Ydotaccent = 7822; - e.Ydotbelow = 7924; - e.Yericyrillic = 1067; - e.Yerudieresiscyrillic = 1272; - e.Ygrave = 7922; - e.Yhook = 435; - e.Yhookabove = 7926; - e.Yiarmenian = 1349; - e.Yicyrillic = 1031; - e.Yiwnarmenian = 1362; - e.Ymonospace = 65337; - e.Ysmall = 63353; - e.Ytilde = 7928; - e.Yusbigcyrillic = 1130; - e.Yusbigiotifiedcyrillic = 1132; - e.Yuslittlecyrillic = 1126; - e.Yuslittleiotifiedcyrillic = 1128; - e.Z = 90; - e.Zaarmenian = 1334; - e.Zacute = 377; - e.Zcaron = 381; - e.Zcaronsmall = 63231; - e.Zcircle = 9423; - e.Zcircumflex = 7824; - e.Zdot = 379; - e.Zdotaccent = 379; - e.Zdotbelow = 7826; - e.Zecyrillic = 1047; - e.Zedescendercyrillic = 1176; - e.Zedieresiscyrillic = 1246; - e.Zeta = 918; - e.Zhearmenian = 1338; - e.Zhebrevecyrillic = 1217; - e.Zhecyrillic = 1046; - e.Zhedescendercyrillic = 1174; - e.Zhedieresiscyrillic = 1244; - e.Zlinebelow = 7828; - e.Zmonospace = 65338; - e.Zsmall = 63354; - e.Zstroke = 437; - e.a = 97; - e.aabengali = 2438; - e.aacute = 225; - e.aadeva = 2310; - e.aagujarati = 2694; - e.aagurmukhi = 2566; - e.aamatragurmukhi = 2622; - e.aarusquare = 13059; - e.aavowelsignbengali = 2494; - e.aavowelsigndeva = 2366; - e.aavowelsigngujarati = 2750; - e.abbreviationmarkarmenian = 1375; - e.abbreviationsigndeva = 2416; - e.abengali = 2437; - e.abopomofo = 12570; - e.abreve = 259; - e.abreveacute = 7855; - e.abrevecyrillic = 1233; - e.abrevedotbelow = 7863; - e.abrevegrave = 7857; - e.abrevehookabove = 7859; - e.abrevetilde = 7861; - e.acaron = 462; - e.acircle = 9424; - e.acircumflex = 226; - e.acircumflexacute = 7845; - e.acircumflexdotbelow = 7853; - e.acircumflexgrave = 7847; - e.acircumflexhookabove = 7849; - e.acircumflextilde = 7851; - e.acute = 180; - e.acutebelowcmb = 791; - e.acutecmb = 769; - e.acutecomb = 769; - e.acutedeva = 2388; - e.acutelowmod = 719; - e.acutetonecmb = 833; - e.acyrillic = 1072; - e.adblgrave = 513; - e.addakgurmukhi = 2673; - e.adeva = 2309; - e.adieresis = 228; - e.adieresiscyrillic = 1235; - e.adieresismacron = 479; - e.adotbelow = 7841; - e.adotmacron = 481; - e.ae = 230; - e.aeacute = 509; - e.aekorean = 12624; - e.aemacron = 483; - e.afii00208 = 8213; - e.afii08941 = 8356; - e.afii10017 = 1040; - e.afii10018 = 1041; - e.afii10019 = 1042; - e.afii10020 = 1043; - e.afii10021 = 1044; - e.afii10022 = 1045; - e.afii10023 = 1025; - e.afii10024 = 1046; - e.afii10025 = 1047; - e.afii10026 = 1048; - e.afii10027 = 1049; - e.afii10028 = 1050; - e.afii10029 = 1051; - e.afii10030 = 1052; - e.afii10031 = 1053; - e.afii10032 = 1054; - e.afii10033 = 1055; - e.afii10034 = 1056; - e.afii10035 = 1057; - e.afii10036 = 1058; - e.afii10037 = 1059; - e.afii10038 = 1060; - e.afii10039 = 1061; - e.afii10040 = 1062; - e.afii10041 = 1063; - e.afii10042 = 1064; - e.afii10043 = 1065; - e.afii10044 = 1066; - e.afii10045 = 1067; - e.afii10046 = 1068; - e.afii10047 = 1069; - e.afii10048 = 1070; - e.afii10049 = 1071; - e.afii10050 = 1168; - e.afii10051 = 1026; - e.afii10052 = 1027; - e.afii10053 = 1028; - e.afii10054 = 1029; - e.afii10055 = 1030; - e.afii10056 = 1031; - e.afii10057 = 1032; - e.afii10058 = 1033; - e.afii10059 = 1034; - e.afii10060 = 1035; - e.afii10061 = 1036; - e.afii10062 = 1038; - e.afii10063 = 63172; - e.afii10064 = 63173; - e.afii10065 = 1072; - e.afii10066 = 1073; - e.afii10067 = 1074; - e.afii10068 = 1075; - e.afii10069 = 1076; - e.afii10070 = 1077; - e.afii10071 = 1105; - e.afii10072 = 1078; - e.afii10073 = 1079; - e.afii10074 = 1080; - e.afii10075 = 1081; - e.afii10076 = 1082; - e.afii10077 = 1083; - e.afii10078 = 1084; - e.afii10079 = 1085; - e.afii10080 = 1086; - e.afii10081 = 1087; - e.afii10082 = 1088; - e.afii10083 = 1089; - e.afii10084 = 1090; - e.afii10085 = 1091; - e.afii10086 = 1092; - e.afii10087 = 1093; - e.afii10088 = 1094; - e.afii10089 = 1095; - e.afii10090 = 1096; - e.afii10091 = 1097; - e.afii10092 = 1098; - e.afii10093 = 1099; - e.afii10094 = 1100; - e.afii10095 = 1101; - e.afii10096 = 1102; - e.afii10097 = 1103; - e.afii10098 = 1169; - e.afii10099 = 1106; - e.afii10100 = 1107; - e.afii10101 = 1108; - e.afii10102 = 1109; - e.afii10103 = 1110; - e.afii10104 = 1111; - e.afii10105 = 1112; - e.afii10106 = 1113; - e.afii10107 = 1114; - e.afii10108 = 1115; - e.afii10109 = 1116; - e.afii10110 = 1118; - e.afii10145 = 1039; - e.afii10146 = 1122; - e.afii10147 = 1138; - e.afii10148 = 1140; - e.afii10192 = 63174; - e.afii10193 = 1119; - e.afii10194 = 1123; - e.afii10195 = 1139; - e.afii10196 = 1141; - e.afii10831 = 63175; - e.afii10832 = 63176; - e.afii10846 = 1241; - e.afii299 = 8206; - e.afii300 = 8207; - e.afii301 = 8205; - e.afii57381 = 1642; - e.afii57388 = 1548; - e.afii57392 = 1632; - e.afii57393 = 1633; - e.afii57394 = 1634; - e.afii57395 = 1635; - e.afii57396 = 1636; - e.afii57397 = 1637; - e.afii57398 = 1638; - e.afii57399 = 1639; - e.afii57400 = 1640; - e.afii57401 = 1641; - e.afii57403 = 1563; - e.afii57407 = 1567; - e.afii57409 = 1569; - e.afii57410 = 1570; - e.afii57411 = 1571; - e.afii57412 = 1572; - e.afii57413 = 1573; - e.afii57414 = 1574; - e.afii57415 = 1575; - e.afii57416 = 1576; - e.afii57417 = 1577; - e.afii57418 = 1578; - e.afii57419 = 1579; - e.afii57420 = 1580; - e.afii57421 = 1581; - e.afii57422 = 1582; - e.afii57423 = 1583; - e.afii57424 = 1584; - e.afii57425 = 1585; - e.afii57426 = 1586; - e.afii57427 = 1587; - e.afii57428 = 1588; - e.afii57429 = 1589; - e.afii57430 = 1590; - e.afii57431 = 1591; - e.afii57432 = 1592; - e.afii57433 = 1593; - e.afii57434 = 1594; - e.afii57440 = 1600; - e.afii57441 = 1601; - e.afii57442 = 1602; - e.afii57443 = 1603; - e.afii57444 = 1604; - e.afii57445 = 1605; - e.afii57446 = 1606; - e.afii57448 = 1608; - e.afii57449 = 1609; - e.afii57450 = 1610; - e.afii57451 = 1611; - e.afii57452 = 1612; - e.afii57453 = 1613; - e.afii57454 = 1614; - e.afii57455 = 1615; - e.afii57456 = 1616; - e.afii57457 = 1617; - e.afii57458 = 1618; - e.afii57470 = 1607; - e.afii57505 = 1700; - e.afii57506 = 1662; - e.afii57507 = 1670; - e.afii57508 = 1688; - e.afii57509 = 1711; - e.afii57511 = 1657; - e.afii57512 = 1672; - e.afii57513 = 1681; - e.afii57514 = 1722; - e.afii57519 = 1746; - e.afii57534 = 1749; - e.afii57636 = 8362; - e.afii57645 = 1470; - e.afii57658 = 1475; - e.afii57664 = 1488; - e.afii57665 = 1489; - e.afii57666 = 1490; - e.afii57667 = 1491; - e.afii57668 = 1492; - e.afii57669 = 1493; - e.afii57670 = 1494; - e.afii57671 = 1495; - e.afii57672 = 1496; - e.afii57673 = 1497; - e.afii57674 = 1498; - e.afii57675 = 1499; - e.afii57676 = 1500; - e.afii57677 = 1501; - e.afii57678 = 1502; - e.afii57679 = 1503; - e.afii57680 = 1504; - e.afii57681 = 1505; - e.afii57682 = 1506; - e.afii57683 = 1507; - e.afii57684 = 1508; - e.afii57685 = 1509; - e.afii57686 = 1510; - e.afii57687 = 1511; - e.afii57688 = 1512; - e.afii57689 = 1513; - e.afii57690 = 1514; - e.afii57694 = 64298; - e.afii57695 = 64299; - e.afii57700 = 64331; - e.afii57705 = 64287; - e.afii57716 = 1520; - e.afii57717 = 1521; - e.afii57718 = 1522; - e.afii57723 = 64309; - e.afii57793 = 1460; - e.afii57794 = 1461; - e.afii57795 = 1462; - e.afii57796 = 1467; - e.afii57797 = 1464; - e.afii57798 = 1463; - e.afii57799 = 1456; - e.afii57800 = 1458; - e.afii57801 = 1457; - e.afii57802 = 1459; - e.afii57803 = 1474; - e.afii57804 = 1473; - e.afii57806 = 1465; - e.afii57807 = 1468; - e.afii57839 = 1469; - e.afii57841 = 1471; - e.afii57842 = 1472; - e.afii57929 = 700; - e.afii61248 = 8453; - e.afii61289 = 8467; - e.afii61352 = 8470; - e.afii61573 = 8236; - e.afii61574 = 8237; - e.afii61575 = 8238; - e.afii61664 = 8204; - e.afii63167 = 1645; - e.afii64937 = 701; - e.agrave = 224; - e.agujarati = 2693; - e.agurmukhi = 2565; - e.ahiragana = 12354; - e.ahookabove = 7843; - e.aibengali = 2448; - e.aibopomofo = 12574; - e.aideva = 2320; - e.aiecyrillic = 1237; - e.aigujarati = 2704; - e.aigurmukhi = 2576; - e.aimatragurmukhi = 2632; - e.ainarabic = 1593; - e.ainfinalarabic = 65226; - e.aininitialarabic = 65227; - e.ainmedialarabic = 65228; - e.ainvertedbreve = 515; - e.aivowelsignbengali = 2504; - e.aivowelsigndeva = 2376; - e.aivowelsigngujarati = 2760; - e.akatakana = 12450; - e.akatakanahalfwidth = 65393; - e.akorean = 12623; - e.alef = 1488; - e.alefarabic = 1575; - e.alefdageshhebrew = 64304; - e.aleffinalarabic = 65166; - e.alefhamzaabovearabic = 1571; - e.alefhamzaabovefinalarabic = 65156; - e.alefhamzabelowarabic = 1573; - e.alefhamzabelowfinalarabic = 65160; - e.alefhebrew = 1488; - e.aleflamedhebrew = 64335; - e.alefmaddaabovearabic = 1570; - e.alefmaddaabovefinalarabic = 65154; - e.alefmaksuraarabic = 1609; - e.alefmaksurafinalarabic = 65264; - e.alefmaksurainitialarabic = 65267; - e.alefmaksuramedialarabic = 65268; - e.alefpatahhebrew = 64302; - e.alefqamatshebrew = 64303; - e.aleph = 8501; - e.allequal = 8780; - e.alpha = 945; - e.alphatonos = 940; - e.amacron = 257; - e.amonospace = 65345; - e.ampersand = 38; - e.ampersandmonospace = 65286; - e.ampersandsmall = 63270; - e.amsquare = 13250; - e.anbopomofo = 12578; - e.angbopomofo = 12580; - e.angbracketleft = 12296; - e.angbracketright = 12297; - e.angkhankhuthai = 3674; - e.angle = 8736; - e.anglebracketleft = 12296; - e.anglebracketleftvertical = 65087; - e.anglebracketright = 12297; - e.anglebracketrightvertical = 65088; - e.angleleft = 9001; - e.angleright = 9002; - e.angstrom = 8491; - e.anoteleia = 903; - e.anudattadeva = 2386; - e.anusvarabengali = 2434; - e.anusvaradeva = 2306; - e.anusvaragujarati = 2690; - e.aogonek = 261; - e.apaatosquare = 13056; - e.aparen = 9372; - e.apostrophearmenian = 1370; - e.apostrophemod = 700; - e.apple = 63743; - e.approaches = 8784; - e.approxequal = 8776; - e.approxequalorimage = 8786; - e.approximatelyequal = 8773; - e.araeaekorean = 12686; - e.araeakorean = 12685; - e.arc = 8978; - e.arighthalfring = 7834; - e.aring = 229; - e.aringacute = 507; - e.aringbelow = 7681; - e.arrowboth = 8596; - e.arrowdashdown = 8675; - e.arrowdashleft = 8672; - e.arrowdashright = 8674; - e.arrowdashup = 8673; - e.arrowdblboth = 8660; - e.arrowdbldown = 8659; - e.arrowdblleft = 8656; - e.arrowdblright = 8658; - e.arrowdblup = 8657; - e.arrowdown = 8595; - e.arrowdownleft = 8601; - e.arrowdownright = 8600; - e.arrowdownwhite = 8681; - e.arrowheaddownmod = 709; - e.arrowheadleftmod = 706; - e.arrowheadrightmod = 707; - e.arrowheadupmod = 708; - e.arrowhorizex = 63719; - e.arrowleft = 8592; - e.arrowleftdbl = 8656; - e.arrowleftdblstroke = 8653; - e.arrowleftoverright = 8646; - e.arrowleftwhite = 8678; - e.arrowright = 8594; - e.arrowrightdblstroke = 8655; - e.arrowrightheavy = 10142; - e.arrowrightoverleft = 8644; - e.arrowrightwhite = 8680; - e.arrowtableft = 8676; - e.arrowtabright = 8677; - e.arrowup = 8593; - e.arrowupdn = 8597; - e.arrowupdnbse = 8616; - e.arrowupdownbase = 8616; - e.arrowupleft = 8598; - e.arrowupleftofdown = 8645; - e.arrowupright = 8599; - e.arrowupwhite = 8679; - e.arrowvertex = 63718; - e.asciicircum = 94; - e.asciicircummonospace = 65342; - e.asciitilde = 126; - e.asciitildemonospace = 65374; - e.ascript = 593; - e.ascriptturned = 594; - e.asmallhiragana = 12353; - e.asmallkatakana = 12449; - e.asmallkatakanahalfwidth = 65383; - e.asterisk = 42; - e.asteriskaltonearabic = 1645; - e.asteriskarabic = 1645; - e.asteriskmath = 8727; - e.asteriskmonospace = 65290; - e.asterisksmall = 65121; - e.asterism = 8258; - e.asuperior = 63209; - e.asymptoticallyequal = 8771; - e.at = 64; - e.atilde = 227; - e.atmonospace = 65312; - e.atsmall = 65131; - e.aturned = 592; - e.aubengali = 2452; - e.aubopomofo = 12576; - e.audeva = 2324; - e.augujarati = 2708; - e.augurmukhi = 2580; - e.aulengthmarkbengali = 2519; - e.aumatragurmukhi = 2636; - e.auvowelsignbengali = 2508; - e.auvowelsigndeva = 2380; - e.auvowelsigngujarati = 2764; - e.avagrahadeva = 2365; - e.aybarmenian = 1377; - e.ayin = 1506; - e.ayinaltonehebrew = 64288; - e.ayinhebrew = 1506; - e.b = 98; - e.babengali = 2476; - e.backslash = 92; - e.backslashmonospace = 65340; - e.badeva = 2348; - e.bagujarati = 2732; - e.bagurmukhi = 2604; - e.bahiragana = 12400; - e.bahtthai = 3647; - e.bakatakana = 12496; - e.bar = 124; - e.barmonospace = 65372; - e.bbopomofo = 12549; - e.bcircle = 9425; - e.bdotaccent = 7683; - e.bdotbelow = 7685; - e.beamedsixteenthnotes = 9836; - e.because = 8757; - e.becyrillic = 1073; - e.beharabic = 1576; - e.behfinalarabic = 65168; - e.behinitialarabic = 65169; - e.behiragana = 12409; - e.behmedialarabic = 65170; - e.behmeeminitialarabic = 64671; - e.behmeemisolatedarabic = 64520; - e.behnoonfinalarabic = 64621; - e.bekatakana = 12505; - e.benarmenian = 1378; - e.bet = 1489; - e.beta = 946; - e.betasymbolgreek = 976; - e.betdagesh = 64305; - e.betdageshhebrew = 64305; - e.bethebrew = 1489; - e.betrafehebrew = 64332; - e.bhabengali = 2477; - e.bhadeva = 2349; - e.bhagujarati = 2733; - e.bhagurmukhi = 2605; - e.bhook = 595; - e.bihiragana = 12403; - e.bikatakana = 12499; - e.bilabialclick = 664; - e.bindigurmukhi = 2562; - e.birusquare = 13105; - e.blackcircle = 9679; - e.blackdiamond = 9670; - e.blackdownpointingtriangle = 9660; - e.blackleftpointingpointer = 9668; - e.blackleftpointingtriangle = 9664; - e.blacklenticularbracketleft = 12304; - e.blacklenticularbracketleftvertical = 65083; - e.blacklenticularbracketright = 12305; - e.blacklenticularbracketrightvertical = 65084; - e.blacklowerlefttriangle = 9699; - e.blacklowerrighttriangle = 9698; - e.blackrectangle = 9644; - e.blackrightpointingpointer = 9658; - e.blackrightpointingtriangle = 9654; - e.blacksmallsquare = 9642; - e.blacksmilingface = 9787; - e.blacksquare = 9632; - e.blackstar = 9733; - e.blackupperlefttriangle = 9700; - e.blackupperrighttriangle = 9701; - e.blackuppointingsmalltriangle = 9652; - e.blackuppointingtriangle = 9650; - e.blank = 9251; - e.blinebelow = 7687; - e.block = 9608; - e.bmonospace = 65346; - e.bobaimaithai = 3610; - e.bohiragana = 12412; - e.bokatakana = 12508; - e.bparen = 9373; - e.bqsquare = 13251; - e.braceex = 63732; - e.braceleft = 123; - e.braceleftbt = 63731; - e.braceleftmid = 63730; - e.braceleftmonospace = 65371; - e.braceleftsmall = 65115; - e.bracelefttp = 63729; - e.braceleftvertical = 65079; - e.braceright = 125; - e.bracerightbt = 63742; - e.bracerightmid = 63741; - e.bracerightmonospace = 65373; - e.bracerightsmall = 65116; - e.bracerighttp = 63740; - e.bracerightvertical = 65080; - e.bracketleft = 91; - e.bracketleftbt = 63728; - e.bracketleftex = 63727; - e.bracketleftmonospace = 65339; - e.bracketlefttp = 63726; - e.bracketright = 93; - e.bracketrightbt = 63739; - e.bracketrightex = 63738; - e.bracketrightmonospace = 65341; - e.bracketrighttp = 63737; - e.breve = 728; - e.brevebelowcmb = 814; - e.brevecmb = 774; - e.breveinvertedbelowcmb = 815; - e.breveinvertedcmb = 785; - e.breveinverteddoublecmb = 865; - e.bridgebelowcmb = 810; - e.bridgeinvertedbelowcmb = 826; - e.brokenbar = 166; - e.bstroke = 384; - e.bsuperior = 63210; - e.btopbar = 387; - e.buhiragana = 12406; - e.bukatakana = 12502; - e.bullet = 8226; - e.bulletinverse = 9688; - e.bulletoperator = 8729; - e.bullseye = 9678; - e.c = 99; - e.caarmenian = 1390; - e.cabengali = 2458; - e.cacute = 263; - e.cadeva = 2330; - e.cagujarati = 2714; - e.cagurmukhi = 2586; - e.calsquare = 13192; - e.candrabindubengali = 2433; - e.candrabinducmb = 784; - e.candrabindudeva = 2305; - e.candrabindugujarati = 2689; - e.capslock = 8682; - e.careof = 8453; - e.caron = 711; - e.caronbelowcmb = 812; - e.caroncmb = 780; - e.carriagereturn = 8629; - e.cbopomofo = 12568; - e.ccaron = 269; - e.ccedilla = 231; - e.ccedillaacute = 7689; - e.ccircle = 9426; - e.ccircumflex = 265; - e.ccurl = 597; - e.cdot = 267; - e.cdotaccent = 267; - e.cdsquare = 13253; - e.cedilla = 184; - e.cedillacmb = 807; - e.cent = 162; - e.centigrade = 8451; - e.centinferior = 63199; - e.centmonospace = 65504; - e.centoldstyle = 63394; - e.centsuperior = 63200; - e.chaarmenian = 1401; - e.chabengali = 2459; - e.chadeva = 2331; - e.chagujarati = 2715; - e.chagurmukhi = 2587; - e.chbopomofo = 12564; - e.cheabkhasiancyrillic = 1213; - e.checkmark = 10003; - e.checyrillic = 1095; - e.chedescenderabkhasiancyrillic = 1215; - e.chedescendercyrillic = 1207; - e.chedieresiscyrillic = 1269; - e.cheharmenian = 1395; - e.chekhakassiancyrillic = 1228; - e.cheverticalstrokecyrillic = 1209; - e.chi = 967; - e.chieuchacirclekorean = 12919; - e.chieuchaparenkorean = 12823; - e.chieuchcirclekorean = 12905; - e.chieuchkorean = 12618; - e.chieuchparenkorean = 12809; - e.chochangthai = 3594; - e.chochanthai = 3592; - e.chochingthai = 3593; - e.chochoethai = 3596; - e.chook = 392; - e.cieucacirclekorean = 12918; - e.cieucaparenkorean = 12822; - e.cieuccirclekorean = 12904; - e.cieuckorean = 12616; - e.cieucparenkorean = 12808; - e.cieucuparenkorean = 12828; - e.circle = 9675; - e.circlecopyrt = 169; - e.circlemultiply = 8855; - e.circleot = 8857; - e.circleplus = 8853; - e.circlepostalmark = 12342; - e.circlewithlefthalfblack = 9680; - e.circlewithrighthalfblack = 9681; - e.circumflex = 710; - e.circumflexbelowcmb = 813; - e.circumflexcmb = 770; - e.clear = 8999; - e.clickalveolar = 450; - e.clickdental = 448; - e.clicklateral = 449; - e.clickretroflex = 451; - e.club = 9827; - e.clubsuitblack = 9827; - e.clubsuitwhite = 9831; - e.cmcubedsquare = 13220; - e.cmonospace = 65347; - e.cmsquaredsquare = 13216; - e.coarmenian = 1409; - e.colon = 58; - e.colonmonetary = 8353; - e.colonmonospace = 65306; - e.colonsign = 8353; - e.colonsmall = 65109; - e.colontriangularhalfmod = 721; - e.colontriangularmod = 720; - e.comma = 44; - e.commaabovecmb = 787; - e.commaaboverightcmb = 789; - e.commaaccent = 63171; - e.commaarabic = 1548; - e.commaarmenian = 1373; - e.commainferior = 63201; - e.commamonospace = 65292; - e.commareversedabovecmb = 788; - e.commareversedmod = 701; - e.commasmall = 65104; - e.commasuperior = 63202; - e.commaturnedabovecmb = 786; - e.commaturnedmod = 699; - e.compass = 9788; - e.congruent = 8773; - e.contourintegral = 8750; - e.control = 8963; - e.controlACK = 6; - e.controlBEL = 7; - e.controlBS = 8; - e.controlCAN = 24; - e.controlCR = 13; - e.controlDC1 = 17; - e.controlDC2 = 18; - e.controlDC3 = 19; - e.controlDC4 = 20; - e.controlDEL = 127; - e.controlDLE = 16; - e.controlEM = 25; - e.controlENQ = 5; - e.controlEOT = 4; - e.controlESC = 27; - e.controlETB = 23; - e.controlETX = 3; - e.controlFF = 12; - e.controlFS = 28; - e.controlGS = 29; - e.controlHT = 9; - e.controlLF = 10; - e.controlNAK = 21; - e.controlNULL = 0; - e.controlRS = 30; - e.controlSI = 15; - e.controlSO = 14; - e.controlSOT = 2; - e.controlSTX = 1; - e.controlSUB = 26; - e.controlSYN = 22; - e.controlUS = 31; - e.controlVT = 11; - e.copyright = 169; - e.copyrightsans = 63721; - e.copyrightserif = 63193; - e.cornerbracketleft = 12300; - e.cornerbracketlefthalfwidth = 65378; - e.cornerbracketleftvertical = 65089; - e.cornerbracketright = 12301; - e.cornerbracketrighthalfwidth = 65379; - e.cornerbracketrightvertical = 65090; - e.corporationsquare = 13183; - e.cosquare = 13255; - e.coverkgsquare = 13254; - e.cparen = 9374; - e.cruzeiro = 8354; - e.cstretched = 663; - e.curlyand = 8911; - e.curlyor = 8910; - e.currency = 164; - e.cyrBreve = 63185; - e.cyrFlex = 63186; - e.cyrbreve = 63188; - e.cyrflex = 63189; - e.d = 100; - e.daarmenian = 1380; - e.dabengali = 2470; - e.dadarabic = 1590; - e.dadeva = 2342; - e.dadfinalarabic = 65214; - e.dadinitialarabic = 65215; - e.dadmedialarabic = 65216; - e.dagesh = 1468; - e.dageshhebrew = 1468; - e.dagger = 8224; - e.daggerdbl = 8225; - e.dagujarati = 2726; - e.dagurmukhi = 2598; - e.dahiragana = 12384; - e.dakatakana = 12480; - e.dalarabic = 1583; - e.dalet = 1491; - e.daletdagesh = 64307; - e.daletdageshhebrew = 64307; - e.dalethebrew = 1491; - e.dalfinalarabic = 65194; - e.dammaarabic = 1615; - e.dammalowarabic = 1615; - e.dammatanaltonearabic = 1612; - e.dammatanarabic = 1612; - e.danda = 2404; - e.dargahebrew = 1447; - e.dargalefthebrew = 1447; - e.dasiapneumatacyrilliccmb = 1157; - e.dblGrave = 63187; - e.dblanglebracketleft = 12298; - e.dblanglebracketleftvertical = 65085; - e.dblanglebracketright = 12299; - e.dblanglebracketrightvertical = 65086; - e.dblarchinvertedbelowcmb = 811; - e.dblarrowleft = 8660; - e.dblarrowright = 8658; - e.dbldanda = 2405; - e.dblgrave = 63190; - e.dblgravecmb = 783; - e.dblintegral = 8748; - e.dbllowline = 8215; - e.dbllowlinecmb = 819; - e.dbloverlinecmb = 831; - e.dblprimemod = 698; - e.dblverticalbar = 8214; - e.dblverticallineabovecmb = 782; - e.dbopomofo = 12553; - e.dbsquare = 13256; - e.dcaron = 271; - e.dcedilla = 7697; - e.dcircle = 9427; - e.dcircumflexbelow = 7699; - e.dcroat = 273; - e.ddabengali = 2465; - e.ddadeva = 2337; - e.ddagujarati = 2721; - e.ddagurmukhi = 2593; - e.ddalarabic = 1672; - e.ddalfinalarabic = 64393; - e.dddhadeva = 2396; - e.ddhabengali = 2466; - e.ddhadeva = 2338; - e.ddhagujarati = 2722; - e.ddhagurmukhi = 2594; - e.ddotaccent = 7691; - e.ddotbelow = 7693; - e.decimalseparatorarabic = 1643; - e.decimalseparatorpersian = 1643; - e.decyrillic = 1076; - e.degree = 176; - e.dehihebrew = 1453; - e.dehiragana = 12391; - e.deicoptic = 1007; - e.dekatakana = 12487; - e.deleteleft = 9003; - e.deleteright = 8998; - e.delta = 948; - e.deltaturned = 397; - e.denominatorminusonenumeratorbengali = 2552; - e.dezh = 676; - e.dhabengali = 2471; - e.dhadeva = 2343; - e.dhagujarati = 2727; - e.dhagurmukhi = 2599; - e.dhook = 599; - e.dialytikatonos = 901; - e.dialytikatonoscmb = 836; - e.diamond = 9830; - e.diamondsuitwhite = 9826; - e.dieresis = 168; - e.dieresisacute = 63191; - e.dieresisbelowcmb = 804; - e.dieresiscmb = 776; - e.dieresisgrave = 63192; - e.dieresistonos = 901; - e.dihiragana = 12386; - e.dikatakana = 12482; - e.dittomark = 12291; - e.divide = 247; - e.divides = 8739; - e.divisionslash = 8725; - e.djecyrillic = 1106; - e.dkshade = 9619; - e.dlinebelow = 7695; - e.dlsquare = 13207; - e.dmacron = 273; - e.dmonospace = 65348; - e.dnblock = 9604; - e.dochadathai = 3598; - e.dodekthai = 3604; - e.dohiragana = 12393; - e.dokatakana = 12489; - e.dollar = 36; - e.dollarinferior = 63203; - e.dollarmonospace = 65284; - e.dollaroldstyle = 63268; - e.dollarsmall = 65129; - e.dollarsuperior = 63204; - e.dong = 8363; - e.dorusquare = 13094; - e.dotaccent = 729; - e.dotaccentcmb = 775; - e.dotbelowcmb = 803; - e.dotbelowcomb = 803; - e.dotkatakana = 12539; - e.dotlessi = 305; - e.dotlessj = 63166; - e.dotlessjstrokehook = 644; - e.dotmath = 8901; - e.dottedcircle = 9676; - e.doubleyodpatah = 64287; - e.doubleyodpatahhebrew = 64287; - e.downtackbelowcmb = 798; - e.downtackmod = 725; - e.dparen = 9375; - e.dsuperior = 63211; - e.dtail = 598; - e.dtopbar = 396; - e.duhiragana = 12389; - e.dukatakana = 12485; - e.dz = 499; - e.dzaltone = 675; - e.dzcaron = 454; - e.dzcurl = 677; - e.dzeabkhasiancyrillic = 1249; - e.dzecyrillic = 1109; - e.dzhecyrillic = 1119; - e.e = 101; - e.eacute = 233; - e.earth = 9793; - e.ebengali = 2447; - e.ebopomofo = 12572; - e.ebreve = 277; - e.ecandradeva = 2317; - e.ecandragujarati = 2701; - e.ecandravowelsigndeva = 2373; - e.ecandravowelsigngujarati = 2757; - e.ecaron = 283; - e.ecedillabreve = 7709; - e.echarmenian = 1381; - e.echyiwnarmenian = 1415; - e.ecircle = 9428; - e.ecircumflex = 234; - e.ecircumflexacute = 7871; - e.ecircumflexbelow = 7705; - e.ecircumflexdotbelow = 7879; - e.ecircumflexgrave = 7873; - e.ecircumflexhookabove = 7875; - e.ecircumflextilde = 7877; - e.ecyrillic = 1108; - e.edblgrave = 517; - e.edeva = 2319; - e.edieresis = 235; - e.edot = 279; - e.edotaccent = 279; - e.edotbelow = 7865; - e.eegurmukhi = 2575; - e.eematragurmukhi = 2631; - e.efcyrillic = 1092; - e.egrave = 232; - e.egujarati = 2703; - e.eharmenian = 1383; - e.ehbopomofo = 12573; - e.ehiragana = 12360; - e.ehookabove = 7867; - e.eibopomofo = 12575; - e.eight = 56; - e.eightarabic = 1640; - e.eightbengali = 2542; - e.eightcircle = 9319; - e.eightcircleinversesansserif = 10129; - e.eightdeva = 2414; - e.eighteencircle = 9329; - e.eighteenparen = 9349; - e.eighteenperiod = 9369; - e.eightgujarati = 2798; - e.eightgurmukhi = 2670; - e.eighthackarabic = 1640; - e.eighthangzhou = 12328; - e.eighthnotebeamed = 9835; - e.eightideographicparen = 12839; - e.eightinferior = 8328; - e.eightmonospace = 65304; - e.eightoldstyle = 63288; - e.eightparen = 9339; - e.eightperiod = 9359; - e.eightpersian = 1784; - e.eightroman = 8567; - e.eightsuperior = 8312; - e.eightthai = 3672; - e.einvertedbreve = 519; - e.eiotifiedcyrillic = 1125; - e.ekatakana = 12456; - e.ekatakanahalfwidth = 65396; - e.ekonkargurmukhi = 2676; - e.ekorean = 12628; - e.elcyrillic = 1083; - e.element = 8712; - e.elevencircle = 9322; - e.elevenparen = 9342; - e.elevenperiod = 9362; - e.elevenroman = 8570; - e.ellipsis = 8230; - e.ellipsisvertical = 8942; - e.emacron = 275; - e.emacronacute = 7703; - e.emacrongrave = 7701; - e.emcyrillic = 1084; - e.emdash = 8212; - e.emdashvertical = 65073; - e.emonospace = 65349; - e.emphasismarkarmenian = 1371; - e.emptyset = 8709; - e.enbopomofo = 12579; - e.encyrillic = 1085; - e.endash = 8211; - e.endashvertical = 65074; - e.endescendercyrillic = 1187; - e.eng = 331; - e.engbopomofo = 12581; - e.enghecyrillic = 1189; - e.enhookcyrillic = 1224; - e.enspace = 8194; - e.eogonek = 281; - e.eokorean = 12627; - e.eopen = 603; - e.eopenclosed = 666; - e.eopenreversed = 604; - e.eopenreversedclosed = 606; - e.eopenreversedhook = 605; - e.eparen = 9376; - e.epsilon = 949; - e.epsilontonos = 941; - e.equal = 61; - e.equalmonospace = 65309; - e.equalsmall = 65126; - e.equalsuperior = 8316; - e.equivalence = 8801; - e.erbopomofo = 12582; - e.ercyrillic = 1088; - e.ereversed = 600; - e.ereversedcyrillic = 1101; - e.escyrillic = 1089; - e.esdescendercyrillic = 1195; - e.esh = 643; - e.eshcurl = 646; - e.eshortdeva = 2318; - e.eshortvowelsigndeva = 2374; - e.eshreversedloop = 426; - e.eshsquatreversed = 645; - e.esmallhiragana = 12359; - e.esmallkatakana = 12455; - e.esmallkatakanahalfwidth = 65386; - e.estimated = 8494; - e.esuperior = 63212; - e.eta = 951; - e.etarmenian = 1384; - e.etatonos = 942; - e.eth = 240; - e.etilde = 7869; - e.etildebelow = 7707; - e.etnahtafoukhhebrew = 1425; - e.etnahtafoukhlefthebrew = 1425; - e.etnahtahebrew = 1425; - e.etnahtalefthebrew = 1425; - e.eturned = 477; - e.eukorean = 12641; - e.euro = 8364; - e.evowelsignbengali = 2503; - e.evowelsigndeva = 2375; - e.evowelsigngujarati = 2759; - e.exclam = 33; - e.exclamarmenian = 1372; - e.exclamdbl = 8252; - e.exclamdown = 161; - e.exclamdownsmall = 63393; - e.exclammonospace = 65281; - e.exclamsmall = 63265; - e.existential = 8707; - e.ezh = 658; - e.ezhcaron = 495; - e.ezhcurl = 659; - e.ezhreversed = 441; - e.ezhtail = 442; - e.f = 102; - e.fadeva = 2398; - e.fagurmukhi = 2654; - e.fahrenheit = 8457; - e.fathaarabic = 1614; - e.fathalowarabic = 1614; - e.fathatanarabic = 1611; - e.fbopomofo = 12552; - e.fcircle = 9429; - e.fdotaccent = 7711; - e.feharabic = 1601; - e.feharmenian = 1414; - e.fehfinalarabic = 65234; - e.fehinitialarabic = 65235; - e.fehmedialarabic = 65236; - e.feicoptic = 997; - e.female = 9792; - e.ff = 64256; - e.f_f = 64256; - e.ffi = 64259; - e.f_f_i = 64259; - e.ffl = 64260; - e.f_f_l = 64260; - e.fi = 64257; - e.f_i = 64257; - e.fifteencircle = 9326; - e.fifteenparen = 9346; - e.fifteenperiod = 9366; - e.figuredash = 8210; - e.filledbox = 9632; - e.filledrect = 9644; - e.finalkaf = 1498; - e.finalkafdagesh = 64314; - e.finalkafdageshhebrew = 64314; - e.finalkafhebrew = 1498; - e.finalmem = 1501; - e.finalmemhebrew = 1501; - e.finalnun = 1503; - e.finalnunhebrew = 1503; - e.finalpe = 1507; - e.finalpehebrew = 1507; - e.finaltsadi = 1509; - e.finaltsadihebrew = 1509; - e.firsttonechinese = 713; - e.fisheye = 9673; - e.fitacyrillic = 1139; - e.five = 53; - e.fivearabic = 1637; - e.fivebengali = 2539; - e.fivecircle = 9316; - e.fivecircleinversesansserif = 10126; - e.fivedeva = 2411; - e.fiveeighths = 8541; - e.fivegujarati = 2795; - e.fivegurmukhi = 2667; - e.fivehackarabic = 1637; - e.fivehangzhou = 12325; - e.fiveideographicparen = 12836; - e.fiveinferior = 8325; - e.fivemonospace = 65301; - e.fiveoldstyle = 63285; - e.fiveparen = 9336; - e.fiveperiod = 9356; - e.fivepersian = 1781; - e.fiveroman = 8564; - e.fivesuperior = 8309; - e.fivethai = 3669; - e.fl = 64258; - e.f_l = 64258; - e.florin = 402; - e.fmonospace = 65350; - e.fmsquare = 13209; - e.fofanthai = 3615; - e.fofathai = 3613; - e.fongmanthai = 3663; - e.forall = 8704; - e.four = 52; - e.fourarabic = 1636; - e.fourbengali = 2538; - e.fourcircle = 9315; - e.fourcircleinversesansserif = 10125; - e.fourdeva = 2410; - e.fourgujarati = 2794; - e.fourgurmukhi = 2666; - e.fourhackarabic = 1636; - e.fourhangzhou = 12324; - e.fourideographicparen = 12835; - e.fourinferior = 8324; - e.fourmonospace = 65300; - e.fournumeratorbengali = 2551; - e.fouroldstyle = 63284; - e.fourparen = 9335; - e.fourperiod = 9355; - e.fourpersian = 1780; - e.fourroman = 8563; - e.foursuperior = 8308; - e.fourteencircle = 9325; - e.fourteenparen = 9345; - e.fourteenperiod = 9365; - e.fourthai = 3668; - e.fourthtonechinese = 715; - e.fparen = 9377; - e.fraction = 8260; - e.franc = 8355; - e.g = 103; - e.gabengali = 2455; - e.gacute = 501; - e.gadeva = 2327; - e.gafarabic = 1711; - e.gaffinalarabic = 64403; - e.gafinitialarabic = 64404; - e.gafmedialarabic = 64405; - e.gagujarati = 2711; - e.gagurmukhi = 2583; - e.gahiragana = 12364; - e.gakatakana = 12460; - e.gamma = 947; - e.gammalatinsmall = 611; - e.gammasuperior = 736; - e.gangiacoptic = 1003; - e.gbopomofo = 12557; - e.gbreve = 287; - e.gcaron = 487; - e.gcedilla = 291; - e.gcircle = 9430; - e.gcircumflex = 285; - e.gcommaaccent = 291; - e.gdot = 289; - e.gdotaccent = 289; - e.gecyrillic = 1075; - e.gehiragana = 12370; - e.gekatakana = 12466; - e.geometricallyequal = 8785; - e.gereshaccenthebrew = 1436; - e.gereshhebrew = 1523; - e.gereshmuqdamhebrew = 1437; - e.germandbls = 223; - e.gershayimaccenthebrew = 1438; - e.gershayimhebrew = 1524; - e.getamark = 12307; - e.ghabengali = 2456; - e.ghadarmenian = 1394; - e.ghadeva = 2328; - e.ghagujarati = 2712; - e.ghagurmukhi = 2584; - e.ghainarabic = 1594; - e.ghainfinalarabic = 65230; - e.ghaininitialarabic = 65231; - e.ghainmedialarabic = 65232; - e.ghemiddlehookcyrillic = 1173; - e.ghestrokecyrillic = 1171; - e.gheupturncyrillic = 1169; - e.ghhadeva = 2394; - e.ghhagurmukhi = 2650; - e.ghook = 608; - e.ghzsquare = 13203; - e.gihiragana = 12366; - e.gikatakana = 12462; - e.gimarmenian = 1379; - e.gimel = 1490; - e.gimeldagesh = 64306; - e.gimeldageshhebrew = 64306; - e.gimelhebrew = 1490; - e.gjecyrillic = 1107; - e.glottalinvertedstroke = 446; - e.glottalstop = 660; - e.glottalstopinverted = 662; - e.glottalstopmod = 704; - e.glottalstopreversed = 661; - e.glottalstopreversedmod = 705; - e.glottalstopreversedsuperior = 740; - e.glottalstopstroke = 673; - e.glottalstopstrokereversed = 674; - e.gmacron = 7713; - e.gmonospace = 65351; - e.gohiragana = 12372; - e.gokatakana = 12468; - e.gparen = 9378; - e.gpasquare = 13228; - e.gradient = 8711; - e.grave = 96; - e.gravebelowcmb = 790; - e.gravecmb = 768; - e.gravecomb = 768; - e.gravedeva = 2387; - e.gravelowmod = 718; - e.gravemonospace = 65344; - e.gravetonecmb = 832; - e.greater = 62; - e.greaterequal = 8805; - e.greaterequalorless = 8923; - e.greatermonospace = 65310; - e.greaterorequivalent = 8819; - e.greaterorless = 8823; - e.greateroverequal = 8807; - e.greatersmall = 65125; - e.gscript = 609; - e.gstroke = 485; - e.guhiragana = 12368; - e.guillemotleft = 171; - e.guillemotright = 187; - e.guilsinglleft = 8249; - e.guilsinglright = 8250; - e.gukatakana = 12464; - e.guramusquare = 13080; - e.gysquare = 13257; - e.h = 104; - e.haabkhasiancyrillic = 1193; - e.haaltonearabic = 1729; - e.habengali = 2489; - e.hadescendercyrillic = 1203; - e.hadeva = 2361; - e.hagujarati = 2745; - e.hagurmukhi = 2617; - e.haharabic = 1581; - e.hahfinalarabic = 65186; - e.hahinitialarabic = 65187; - e.hahiragana = 12399; - e.hahmedialarabic = 65188; - e.haitusquare = 13098; - e.hakatakana = 12495; - e.hakatakanahalfwidth = 65418; - e.halantgurmukhi = 2637; - e.hamzaarabic = 1569; - e.hamzalowarabic = 1569; - e.hangulfiller = 12644; - e.hardsigncyrillic = 1098; - e.harpoonleftbarbup = 8636; - e.harpoonrightbarbup = 8640; - e.hasquare = 13258; - e.hatafpatah = 1458; - e.hatafpatah16 = 1458; - e.hatafpatah23 = 1458; - e.hatafpatah2f = 1458; - e.hatafpatahhebrew = 1458; - e.hatafpatahnarrowhebrew = 1458; - e.hatafpatahquarterhebrew = 1458; - e.hatafpatahwidehebrew = 1458; - e.hatafqamats = 1459; - e.hatafqamats1b = 1459; - e.hatafqamats28 = 1459; - e.hatafqamats34 = 1459; - e.hatafqamatshebrew = 1459; - e.hatafqamatsnarrowhebrew = 1459; - e.hatafqamatsquarterhebrew = 1459; - e.hatafqamatswidehebrew = 1459; - e.hatafsegol = 1457; - e.hatafsegol17 = 1457; - e.hatafsegol24 = 1457; - e.hatafsegol30 = 1457; - e.hatafsegolhebrew = 1457; - e.hatafsegolnarrowhebrew = 1457; - e.hatafsegolquarterhebrew = 1457; - e.hatafsegolwidehebrew = 1457; - e.hbar = 295; - e.hbopomofo = 12559; - e.hbrevebelow = 7723; - e.hcedilla = 7721; - e.hcircle = 9431; - e.hcircumflex = 293; - e.hdieresis = 7719; - e.hdotaccent = 7715; - e.hdotbelow = 7717; - e.he = 1492; - e.heart = 9829; - e.heartsuitblack = 9829; - e.heartsuitwhite = 9825; - e.hedagesh = 64308; - e.hedageshhebrew = 64308; - e.hehaltonearabic = 1729; - e.heharabic = 1607; - e.hehebrew = 1492; - e.hehfinalaltonearabic = 64423; - e.hehfinalalttwoarabic = 65258; - e.hehfinalarabic = 65258; - e.hehhamzaabovefinalarabic = 64421; - e.hehhamzaaboveisolatedarabic = 64420; - e.hehinitialaltonearabic = 64424; - e.hehinitialarabic = 65259; - e.hehiragana = 12408; - e.hehmedialaltonearabic = 64425; - e.hehmedialarabic = 65260; - e.heiseierasquare = 13179; - e.hekatakana = 12504; - e.hekatakanahalfwidth = 65421; - e.hekutaarusquare = 13110; - e.henghook = 615; - e.herutusquare = 13113; - e.het = 1495; - e.hethebrew = 1495; - e.hhook = 614; - e.hhooksuperior = 689; - e.hieuhacirclekorean = 12923; - e.hieuhaparenkorean = 12827; - e.hieuhcirclekorean = 12909; - e.hieuhkorean = 12622; - e.hieuhparenkorean = 12813; - e.hihiragana = 12402; - e.hikatakana = 12498; - e.hikatakanahalfwidth = 65419; - e.hiriq = 1460; - e.hiriq14 = 1460; - e.hiriq21 = 1460; - e.hiriq2d = 1460; - e.hiriqhebrew = 1460; - e.hiriqnarrowhebrew = 1460; - e.hiriqquarterhebrew = 1460; - e.hiriqwidehebrew = 1460; - e.hlinebelow = 7830; - e.hmonospace = 65352; - e.hoarmenian = 1392; - e.hohipthai = 3627; - e.hohiragana = 12411; - e.hokatakana = 12507; - e.hokatakanahalfwidth = 65422; - e.holam = 1465; - e.holam19 = 1465; - e.holam26 = 1465; - e.holam32 = 1465; - e.holamhebrew = 1465; - e.holamnarrowhebrew = 1465; - e.holamquarterhebrew = 1465; - e.holamwidehebrew = 1465; - e.honokhukthai = 3630; - e.hookabovecomb = 777; - e.hookcmb = 777; - e.hookpalatalizedbelowcmb = 801; - e.hookretroflexbelowcmb = 802; - e.hoonsquare = 13122; - e.horicoptic = 1001; - e.horizontalbar = 8213; - e.horncmb = 795; - e.hotsprings = 9832; - e.house = 8962; - e.hparen = 9379; - e.hsuperior = 688; - e.hturned = 613; - e.huhiragana = 12405; - e.huiitosquare = 13107; - e.hukatakana = 12501; - e.hukatakanahalfwidth = 65420; - e.hungarumlaut = 733; - e.hungarumlautcmb = 779; - e.hv = 405; - e.hyphen = 45; - e.hypheninferior = 63205; - e.hyphenmonospace = 65293; - e.hyphensmall = 65123; - e.hyphensuperior = 63206; - e.hyphentwo = 8208; - e.i = 105; - e.iacute = 237; - e.iacyrillic = 1103; - e.ibengali = 2439; - e.ibopomofo = 12583; - e.ibreve = 301; - e.icaron = 464; - e.icircle = 9432; - e.icircumflex = 238; - e.icyrillic = 1110; - e.idblgrave = 521; - e.ideographearthcircle = 12943; - e.ideographfirecircle = 12939; - e.ideographicallianceparen = 12863; - e.ideographiccallparen = 12858; - e.ideographiccentrecircle = 12965; - e.ideographicclose = 12294; - e.ideographiccomma = 12289; - e.ideographiccommaleft = 65380; - e.ideographiccongratulationparen = 12855; - e.ideographiccorrectcircle = 12963; - e.ideographicearthparen = 12847; - e.ideographicenterpriseparen = 12861; - e.ideographicexcellentcircle = 12957; - e.ideographicfestivalparen = 12864; - e.ideographicfinancialcircle = 12950; - e.ideographicfinancialparen = 12854; - e.ideographicfireparen = 12843; - e.ideographichaveparen = 12850; - e.ideographichighcircle = 12964; - e.ideographiciterationmark = 12293; - e.ideographiclaborcircle = 12952; - e.ideographiclaborparen = 12856; - e.ideographicleftcircle = 12967; - e.ideographiclowcircle = 12966; - e.ideographicmedicinecircle = 12969; - e.ideographicmetalparen = 12846; - e.ideographicmoonparen = 12842; - e.ideographicnameparen = 12852; - e.ideographicperiod = 12290; - e.ideographicprintcircle = 12958; - e.ideographicreachparen = 12867; - e.ideographicrepresentparen = 12857; - e.ideographicresourceparen = 12862; - e.ideographicrightcircle = 12968; - e.ideographicsecretcircle = 12953; - e.ideographicselfparen = 12866; - e.ideographicsocietyparen = 12851; - e.ideographicspace = 12288; - e.ideographicspecialparen = 12853; - e.ideographicstockparen = 12849; - e.ideographicstudyparen = 12859; - e.ideographicsunparen = 12848; - e.ideographicsuperviseparen = 12860; - e.ideographicwaterparen = 12844; - e.ideographicwoodparen = 12845; - e.ideographiczero = 12295; - e.ideographmetalcircle = 12942; - e.ideographmooncircle = 12938; - e.ideographnamecircle = 12948; - e.ideographsuncircle = 12944; - e.ideographwatercircle = 12940; - e.ideographwoodcircle = 12941; - e.ideva = 2311; - e.idieresis = 239; - e.idieresisacute = 7727; - e.idieresiscyrillic = 1253; - e.idotbelow = 7883; - e.iebrevecyrillic = 1239; - e.iecyrillic = 1077; - e.ieungacirclekorean = 12917; - e.ieungaparenkorean = 12821; - e.ieungcirclekorean = 12903; - e.ieungkorean = 12615; - e.ieungparenkorean = 12807; - e.igrave = 236; - e.igujarati = 2695; - e.igurmukhi = 2567; - e.ihiragana = 12356; - e.ihookabove = 7881; - e.iibengali = 2440; - e.iicyrillic = 1080; - e.iideva = 2312; - e.iigujarati = 2696; - e.iigurmukhi = 2568; - e.iimatragurmukhi = 2624; - e.iinvertedbreve = 523; - e.iishortcyrillic = 1081; - e.iivowelsignbengali = 2496; - e.iivowelsigndeva = 2368; - e.iivowelsigngujarati = 2752; - e.ij = 307; - e.ikatakana = 12452; - e.ikatakanahalfwidth = 65394; - e.ikorean = 12643; - e.ilde = 732; - e.iluyhebrew = 1452; - e.imacron = 299; - e.imacroncyrillic = 1251; - e.imageorapproximatelyequal = 8787; - e.imatragurmukhi = 2623; - e.imonospace = 65353; - e.increment = 8710; - e.infinity = 8734; - e.iniarmenian = 1387; - e.integral = 8747; - e.integralbottom = 8993; - e.integralbt = 8993; - e.integralex = 63733; - e.integraltop = 8992; - e.integraltp = 8992; - e.intersection = 8745; - e.intisquare = 13061; - e.invbullet = 9688; - e.invcircle = 9689; - e.invsmileface = 9787; - e.iocyrillic = 1105; - e.iogonek = 303; - e.iota = 953; - e.iotadieresis = 970; - e.iotadieresistonos = 912; - e.iotalatin = 617; - e.iotatonos = 943; - e.iparen = 9380; - e.irigurmukhi = 2674; - e.ismallhiragana = 12355; - e.ismallkatakana = 12451; - e.ismallkatakanahalfwidth = 65384; - e.issharbengali = 2554; - e.istroke = 616; - e.isuperior = 63213; - e.iterationhiragana = 12445; - e.iterationkatakana = 12541; - e.itilde = 297; - e.itildebelow = 7725; - e.iubopomofo = 12585; - e.iucyrillic = 1102; - e.ivowelsignbengali = 2495; - e.ivowelsigndeva = 2367; - e.ivowelsigngujarati = 2751; - e.izhitsacyrillic = 1141; - e.izhitsadblgravecyrillic = 1143; - e.j = 106; - e.jaarmenian = 1393; - e.jabengali = 2460; - e.jadeva = 2332; - e.jagujarati = 2716; - e.jagurmukhi = 2588; - e.jbopomofo = 12560; - e.jcaron = 496; - e.jcircle = 9433; - e.jcircumflex = 309; - e.jcrossedtail = 669; - e.jdotlessstroke = 607; - e.jecyrillic = 1112; - e.jeemarabic = 1580; - e.jeemfinalarabic = 65182; - e.jeeminitialarabic = 65183; - e.jeemmedialarabic = 65184; - e.jeharabic = 1688; - e.jehfinalarabic = 64395; - e.jhabengali = 2461; - e.jhadeva = 2333; - e.jhagujarati = 2717; - e.jhagurmukhi = 2589; - e.jheharmenian = 1403; - e.jis = 12292; - e.jmonospace = 65354; - e.jparen = 9381; - e.jsuperior = 690; - e.k = 107; - e.kabashkircyrillic = 1185; - e.kabengali = 2453; - e.kacute = 7729; - e.kacyrillic = 1082; - e.kadescendercyrillic = 1179; - e.kadeva = 2325; - e.kaf = 1499; - e.kafarabic = 1603; - e.kafdagesh = 64315; - e.kafdageshhebrew = 64315; - e.kaffinalarabic = 65242; - e.kafhebrew = 1499; - e.kafinitialarabic = 65243; - e.kafmedialarabic = 65244; - e.kafrafehebrew = 64333; - e.kagujarati = 2709; - e.kagurmukhi = 2581; - e.kahiragana = 12363; - e.kahookcyrillic = 1220; - e.kakatakana = 12459; - e.kakatakanahalfwidth = 65398; - e.kappa = 954; - e.kappasymbolgreek = 1008; - e.kapyeounmieumkorean = 12657; - e.kapyeounphieuphkorean = 12676; - e.kapyeounpieupkorean = 12664; - e.kapyeounssangpieupkorean = 12665; - e.karoriisquare = 13069; - e.kashidaautoarabic = 1600; - e.kashidaautonosidebearingarabic = 1600; - e.kasmallkatakana = 12533; - e.kasquare = 13188; - e.kasraarabic = 1616; - e.kasratanarabic = 1613; - e.kastrokecyrillic = 1183; - e.katahiraprolongmarkhalfwidth = 65392; - e.kaverticalstrokecyrillic = 1181; - e.kbopomofo = 12558; - e.kcalsquare = 13193; - e.kcaron = 489; - e.kcedilla = 311; - e.kcircle = 9434; - e.kcommaaccent = 311; - e.kdotbelow = 7731; - e.keharmenian = 1412; - e.kehiragana = 12369; - e.kekatakana = 12465; - e.kekatakanahalfwidth = 65401; - e.kenarmenian = 1391; - e.kesmallkatakana = 12534; - e.kgreenlandic = 312; - e.khabengali = 2454; - e.khacyrillic = 1093; - e.khadeva = 2326; - e.khagujarati = 2710; - e.khagurmukhi = 2582; - e.khaharabic = 1582; - e.khahfinalarabic = 65190; - e.khahinitialarabic = 65191; - e.khahmedialarabic = 65192; - e.kheicoptic = 999; - e.khhadeva = 2393; - e.khhagurmukhi = 2649; - e.khieukhacirclekorean = 12920; - e.khieukhaparenkorean = 12824; - e.khieukhcirclekorean = 12906; - e.khieukhkorean = 12619; - e.khieukhparenkorean = 12810; - e.khokhaithai = 3586; - e.khokhonthai = 3589; - e.khokhuatthai = 3587; - e.khokhwaithai = 3588; - e.khomutthai = 3675; - e.khook = 409; - e.khorakhangthai = 3590; - e.khzsquare = 13201; - e.kihiragana = 12365; - e.kikatakana = 12461; - e.kikatakanahalfwidth = 65399; - e.kiroguramusquare = 13077; - e.kiromeetorusquare = 13078; - e.kirosquare = 13076; - e.kiyeokacirclekorean = 12910; - e.kiyeokaparenkorean = 12814; - e.kiyeokcirclekorean = 12896; - e.kiyeokkorean = 12593; - e.kiyeokparenkorean = 12800; - e.kiyeoksioskorean = 12595; - e.kjecyrillic = 1116; - e.klinebelow = 7733; - e.klsquare = 13208; - e.kmcubedsquare = 13222; - e.kmonospace = 65355; - e.kmsquaredsquare = 13218; - e.kohiragana = 12371; - e.kohmsquare = 13248; - e.kokaithai = 3585; - e.kokatakana = 12467; - e.kokatakanahalfwidth = 65402; - e.kooposquare = 13086; - e.koppacyrillic = 1153; - e.koreanstandardsymbol = 12927; - e.koroniscmb = 835; - e.kparen = 9382; - e.kpasquare = 13226; - e.ksicyrillic = 1135; - e.ktsquare = 13263; - e.kturned = 670; - e.kuhiragana = 12367; - e.kukatakana = 12463; - e.kukatakanahalfwidth = 65400; - e.kvsquare = 13240; - e.kwsquare = 13246; - e.l = 108; - e.labengali = 2482; - e.lacute = 314; - e.ladeva = 2354; - e.lagujarati = 2738; - e.lagurmukhi = 2610; - e.lakkhangyaothai = 3653; - e.lamaleffinalarabic = 65276; - e.lamalefhamzaabovefinalarabic = 65272; - e.lamalefhamzaaboveisolatedarabic = 65271; - e.lamalefhamzabelowfinalarabic = 65274; - e.lamalefhamzabelowisolatedarabic = 65273; - e.lamalefisolatedarabic = 65275; - e.lamalefmaddaabovefinalarabic = 65270; - e.lamalefmaddaaboveisolatedarabic = 65269; - e.lamarabic = 1604; - e.lambda = 955; - e.lambdastroke = 411; - e.lamed = 1500; - e.lameddagesh = 64316; - e.lameddageshhebrew = 64316; - e.lamedhebrew = 1500; - e.lamfinalarabic = 65246; - e.lamhahinitialarabic = 64714; - e.laminitialarabic = 65247; - e.lamjeeminitialarabic = 64713; - e.lamkhahinitialarabic = 64715; - e.lamlamhehisolatedarabic = 65010; - e.lammedialarabic = 65248; - e.lammeemhahinitialarabic = 64904; - e.lammeeminitialarabic = 64716; - e.largecircle = 9711; - e.lbar = 410; - e.lbelt = 620; - e.lbopomofo = 12556; - e.lcaron = 318; - e.lcedilla = 316; - e.lcircle = 9435; - e.lcircumflexbelow = 7741; - e.lcommaaccent = 316; - e.ldot = 320; - e.ldotaccent = 320; - e.ldotbelow = 7735; - e.ldotbelowmacron = 7737; - e.leftangleabovecmb = 794; - e.lefttackbelowcmb = 792; - e.less = 60; - e.lessequal = 8804; - e.lessequalorgreater = 8922; - e.lessmonospace = 65308; - e.lessorequivalent = 8818; - e.lessorgreater = 8822; - e.lessoverequal = 8806; - e.lesssmall = 65124; - e.lezh = 622; - e.lfblock = 9612; - e.lhookretroflex = 621; - e.lira = 8356; - e.liwnarmenian = 1388; - e.lj = 457; - e.ljecyrillic = 1113; - e.ll = 63168; - e.lladeva = 2355; - e.llagujarati = 2739; - e.llinebelow = 7739; - e.llladeva = 2356; - e.llvocalicbengali = 2529; - e.llvocalicdeva = 2401; - e.llvocalicvowelsignbengali = 2531; - e.llvocalicvowelsigndeva = 2403; - e.lmiddletilde = 619; - e.lmonospace = 65356; - e.lmsquare = 13264; - e.lochulathai = 3628; - e.logicaland = 8743; - e.logicalnot = 172; - e.logicalnotreversed = 8976; - e.logicalor = 8744; - e.lolingthai = 3621; - e.longs = 383; - e.lowlinecenterline = 65102; - e.lowlinecmb = 818; - e.lowlinedashed = 65101; - e.lozenge = 9674; - e.lparen = 9383; - e.lslash = 322; - e.lsquare = 8467; - e.lsuperior = 63214; - e.ltshade = 9617; - e.luthai = 3622; - e.lvocalicbengali = 2444; - e.lvocalicdeva = 2316; - e.lvocalicvowelsignbengali = 2530; - e.lvocalicvowelsigndeva = 2402; - e.lxsquare = 13267; - e.m = 109; - e.mabengali = 2478; - e.macron = 175; - e.macronbelowcmb = 817; - e.macroncmb = 772; - e.macronlowmod = 717; - e.macronmonospace = 65507; - e.macute = 7743; - e.madeva = 2350; - e.magujarati = 2734; - e.magurmukhi = 2606; - e.mahapakhhebrew = 1444; - e.mahapakhlefthebrew = 1444; - e.mahiragana = 12414; - e.maichattawalowleftthai = 63637; - e.maichattawalowrightthai = 63636; - e.maichattawathai = 3659; - e.maichattawaupperleftthai = 63635; - e.maieklowleftthai = 63628; - e.maieklowrightthai = 63627; - e.maiekthai = 3656; - e.maiekupperleftthai = 63626; - e.maihanakatleftthai = 63620; - e.maihanakatthai = 3633; - e.maitaikhuleftthai = 63625; - e.maitaikhuthai = 3655; - e.maitholowleftthai = 63631; - e.maitholowrightthai = 63630; - e.maithothai = 3657; - e.maithoupperleftthai = 63629; - e.maitrilowleftthai = 63634; - e.maitrilowrightthai = 63633; - e.maitrithai = 3658; - e.maitriupperleftthai = 63632; - e.maiyamokthai = 3654; - e.makatakana = 12510; - e.makatakanahalfwidth = 65423; - e.male = 9794; - e.mansyonsquare = 13127; - e.maqafhebrew = 1470; - e.mars = 9794; - e.masoracirclehebrew = 1455; - e.masquare = 13187; - e.mbopomofo = 12551; - e.mbsquare = 13268; - e.mcircle = 9436; - e.mcubedsquare = 13221; - e.mdotaccent = 7745; - e.mdotbelow = 7747; - e.meemarabic = 1605; - e.meemfinalarabic = 65250; - e.meeminitialarabic = 65251; - e.meemmedialarabic = 65252; - e.meemmeeminitialarabic = 64721; - e.meemmeemisolatedarabic = 64584; - e.meetorusquare = 13133; - e.mehiragana = 12417; - e.meizierasquare = 13182; - e.mekatakana = 12513; - e.mekatakanahalfwidth = 65426; - e.mem = 1502; - e.memdagesh = 64318; - e.memdageshhebrew = 64318; - e.memhebrew = 1502; - e.menarmenian = 1396; - e.merkhahebrew = 1445; - e.merkhakefulahebrew = 1446; - e.merkhakefulalefthebrew = 1446; - e.merkhalefthebrew = 1445; - e.mhook = 625; - e.mhzsquare = 13202; - e.middledotkatakanahalfwidth = 65381; - e.middot = 183; - e.mieumacirclekorean = 12914; - e.mieumaparenkorean = 12818; - e.mieumcirclekorean = 12900; - e.mieumkorean = 12609; - e.mieumpansioskorean = 12656; - e.mieumparenkorean = 12804; - e.mieumpieupkorean = 12654; - e.mieumsioskorean = 12655; - e.mihiragana = 12415; - e.mikatakana = 12511; - e.mikatakanahalfwidth = 65424; - e.minus = 8722; - e.minusbelowcmb = 800; - e.minuscircle = 8854; - e.minusmod = 727; - e.minusplus = 8723; - e.minute = 8242; - e.miribaarusquare = 13130; - e.mirisquare = 13129; - e.mlonglegturned = 624; - e.mlsquare = 13206; - e.mmcubedsquare = 13219; - e.mmonospace = 65357; - e.mmsquaredsquare = 13215; - e.mohiragana = 12418; - e.mohmsquare = 13249; - e.mokatakana = 12514; - e.mokatakanahalfwidth = 65427; - e.molsquare = 13270; - e.momathai = 3617; - e.moverssquare = 13223; - e.moverssquaredsquare = 13224; - e.mparen = 9384; - e.mpasquare = 13227; - e.mssquare = 13235; - e.msuperior = 63215; - e.mturned = 623; - e.mu = 181; - e.mu1 = 181; - e.muasquare = 13186; - e.muchgreater = 8811; - e.muchless = 8810; - e.mufsquare = 13196; - e.mugreek = 956; - e.mugsquare = 13197; - e.muhiragana = 12416; - e.mukatakana = 12512; - e.mukatakanahalfwidth = 65425; - e.mulsquare = 13205; - e.multiply = 215; - e.mumsquare = 13211; - e.munahhebrew = 1443; - e.munahlefthebrew = 1443; - e.musicalnote = 9834; - e.musicalnotedbl = 9835; - e.musicflatsign = 9837; - e.musicsharpsign = 9839; - e.mussquare = 13234; - e.muvsquare = 13238; - e.muwsquare = 13244; - e.mvmegasquare = 13241; - e.mvsquare = 13239; - e.mwmegasquare = 13247; - e.mwsquare = 13245; - e.n = 110; - e.nabengali = 2472; - e.nabla = 8711; - e.nacute = 324; - e.nadeva = 2344; - e.nagujarati = 2728; - e.nagurmukhi = 2600; - e.nahiragana = 12394; - e.nakatakana = 12490; - e.nakatakanahalfwidth = 65413; - e.napostrophe = 329; - e.nasquare = 13185; - e.nbopomofo = 12555; - e.nbspace = 160; - e.ncaron = 328; - e.ncedilla = 326; - e.ncircle = 9437; - e.ncircumflexbelow = 7755; - e.ncommaaccent = 326; - e.ndotaccent = 7749; - e.ndotbelow = 7751; - e.nehiragana = 12397; - e.nekatakana = 12493; - e.nekatakanahalfwidth = 65416; - e.newsheqelsign = 8362; - e.nfsquare = 13195; - e.ngabengali = 2457; - e.ngadeva = 2329; - e.ngagujarati = 2713; - e.ngagurmukhi = 2585; - e.ngonguthai = 3591; - e.nhiragana = 12435; - e.nhookleft = 626; - e.nhookretroflex = 627; - e.nieunacirclekorean = 12911; - e.nieunaparenkorean = 12815; - e.nieuncieuckorean = 12597; - e.nieuncirclekorean = 12897; - e.nieunhieuhkorean = 12598; - e.nieunkorean = 12596; - e.nieunpansioskorean = 12648; - e.nieunparenkorean = 12801; - e.nieunsioskorean = 12647; - e.nieuntikeutkorean = 12646; - e.nihiragana = 12395; - e.nikatakana = 12491; - e.nikatakanahalfwidth = 65414; - e.nikhahitleftthai = 63641; - e.nikhahitthai = 3661; - e.nine = 57; - e.ninearabic = 1641; - e.ninebengali = 2543; - e.ninecircle = 9320; - e.ninecircleinversesansserif = 10130; - e.ninedeva = 2415; - e.ninegujarati = 2799; - e.ninegurmukhi = 2671; - e.ninehackarabic = 1641; - e.ninehangzhou = 12329; - e.nineideographicparen = 12840; - e.nineinferior = 8329; - e.ninemonospace = 65305; - e.nineoldstyle = 63289; - e.nineparen = 9340; - e.nineperiod = 9360; - e.ninepersian = 1785; - e.nineroman = 8568; - e.ninesuperior = 8313; - e.nineteencircle = 9330; - e.nineteenparen = 9350; - e.nineteenperiod = 9370; - e.ninethai = 3673; - e.nj = 460; - e.njecyrillic = 1114; - e.nkatakana = 12531; - e.nkatakanahalfwidth = 65437; - e.nlegrightlong = 414; - e.nlinebelow = 7753; - e.nmonospace = 65358; - e.nmsquare = 13210; - e.nnabengali = 2467; - e.nnadeva = 2339; - e.nnagujarati = 2723; - e.nnagurmukhi = 2595; - e.nnnadeva = 2345; - e.nohiragana = 12398; - e.nokatakana = 12494; - e.nokatakanahalfwidth = 65417; - e.nonbreakingspace = 160; - e.nonenthai = 3603; - e.nonuthai = 3609; - e.noonarabic = 1606; - e.noonfinalarabic = 65254; - e.noonghunnaarabic = 1722; - e.noonghunnafinalarabic = 64415; - e.nooninitialarabic = 65255; - e.noonjeeminitialarabic = 64722; - e.noonjeemisolatedarabic = 64587; - e.noonmedialarabic = 65256; - e.noonmeeminitialarabic = 64725; - e.noonmeemisolatedarabic = 64590; - e.noonnoonfinalarabic = 64653; - e.notcontains = 8716; - e.notelement = 8713; - e.notelementof = 8713; - e.notequal = 8800; - e.notgreater = 8815; - e.notgreaternorequal = 8817; - e.notgreaternorless = 8825; - e.notidentical = 8802; - e.notless = 8814; - e.notlessnorequal = 8816; - e.notparallel = 8742; - e.notprecedes = 8832; - e.notsubset = 8836; - e.notsucceeds = 8833; - e.notsuperset = 8837; - e.nowarmenian = 1398; - e.nparen = 9385; - e.nssquare = 13233; - e.nsuperior = 8319; - e.ntilde = 241; - e.nu = 957; - e.nuhiragana = 12396; - e.nukatakana = 12492; - e.nukatakanahalfwidth = 65415; - e.nuktabengali = 2492; - e.nuktadeva = 2364; - e.nuktagujarati = 2748; - e.nuktagurmukhi = 2620; - e.numbersign = 35; - e.numbersignmonospace = 65283; - e.numbersignsmall = 65119; - e.numeralsigngreek = 884; - e.numeralsignlowergreek = 885; - e.numero = 8470; - e.nun = 1504; - e.nundagesh = 64320; - e.nundageshhebrew = 64320; - e.nunhebrew = 1504; - e.nvsquare = 13237; - e.nwsquare = 13243; - e.nyabengali = 2462; - e.nyadeva = 2334; - e.nyagujarati = 2718; - e.nyagurmukhi = 2590; - e.o = 111; - e.oacute = 243; - e.oangthai = 3629; - e.obarred = 629; - e.obarredcyrillic = 1257; - e.obarreddieresiscyrillic = 1259; - e.obengali = 2451; - e.obopomofo = 12571; - e.obreve = 335; - e.ocandradeva = 2321; - e.ocandragujarati = 2705; - e.ocandravowelsigndeva = 2377; - e.ocandravowelsigngujarati = 2761; - e.ocaron = 466; - e.ocircle = 9438; - e.ocircumflex = 244; - e.ocircumflexacute = 7889; - e.ocircumflexdotbelow = 7897; - e.ocircumflexgrave = 7891; - e.ocircumflexhookabove = 7893; - e.ocircumflextilde = 7895; - e.ocyrillic = 1086; - e.odblacute = 337; - e.odblgrave = 525; - e.odeva = 2323; - e.odieresis = 246; - e.odieresiscyrillic = 1255; - e.odotbelow = 7885; - e.oe = 339; - e.oekorean = 12634; - e.ogonek = 731; - e.ogonekcmb = 808; - e.ograve = 242; - e.ogujarati = 2707; - e.oharmenian = 1413; - e.ohiragana = 12362; - e.ohookabove = 7887; - e.ohorn = 417; - e.ohornacute = 7899; - e.ohorndotbelow = 7907; - e.ohorngrave = 7901; - e.ohornhookabove = 7903; - e.ohorntilde = 7905; - e.ohungarumlaut = 337; - e.oi = 419; - e.oinvertedbreve = 527; - e.okatakana = 12458; - e.okatakanahalfwidth = 65397; - e.okorean = 12631; - e.olehebrew = 1451; - e.omacron = 333; - e.omacronacute = 7763; - e.omacrongrave = 7761; - e.omdeva = 2384; - e.omega = 969; - e.omega1 = 982; - e.omegacyrillic = 1121; - e.omegalatinclosed = 631; - e.omegaroundcyrillic = 1147; - e.omegatitlocyrillic = 1149; - e.omegatonos = 974; - e.omgujarati = 2768; - e.omicron = 959; - e.omicrontonos = 972; - e.omonospace = 65359; - e.one = 49; - e.onearabic = 1633; - e.onebengali = 2535; - e.onecircle = 9312; - e.onecircleinversesansserif = 10122; - e.onedeva = 2407; - e.onedotenleader = 8228; - e.oneeighth = 8539; - e.onefitted = 63196; - e.onegujarati = 2791; - e.onegurmukhi = 2663; - e.onehackarabic = 1633; - e.onehalf = 189; - e.onehangzhou = 12321; - e.oneideographicparen = 12832; - e.oneinferior = 8321; - e.onemonospace = 65297; - e.onenumeratorbengali = 2548; - e.oneoldstyle = 63281; - e.oneparen = 9332; - e.oneperiod = 9352; - e.onepersian = 1777; - e.onequarter = 188; - e.oneroman = 8560; - e.onesuperior = 185; - e.onethai = 3665; - e.onethird = 8531; - e.oogonek = 491; - e.oogonekmacron = 493; - e.oogurmukhi = 2579; - e.oomatragurmukhi = 2635; - e.oopen = 596; - e.oparen = 9386; - e.openbullet = 9702; - e.option = 8997; - e.ordfeminine = 170; - e.ordmasculine = 186; - e.orthogonal = 8735; - e.oshortdeva = 2322; - e.oshortvowelsigndeva = 2378; - e.oslash = 248; - e.oslashacute = 511; - e.osmallhiragana = 12361; - e.osmallkatakana = 12457; - e.osmallkatakanahalfwidth = 65387; - e.ostrokeacute = 511; - e.osuperior = 63216; - e.otcyrillic = 1151; - e.otilde = 245; - e.otildeacute = 7757; - e.otildedieresis = 7759; - e.oubopomofo = 12577; - e.overline = 8254; - e.overlinecenterline = 65098; - e.overlinecmb = 773; - e.overlinedashed = 65097; - e.overlinedblwavy = 65100; - e.overlinewavy = 65099; - e.overscore = 175; - e.ovowelsignbengali = 2507; - e.ovowelsigndeva = 2379; - e.ovowelsigngujarati = 2763; - e.p = 112; - e.paampssquare = 13184; - e.paasentosquare = 13099; - e.pabengali = 2474; - e.pacute = 7765; - e.padeva = 2346; - e.pagedown = 8671; - e.pageup = 8670; - e.pagujarati = 2730; - e.pagurmukhi = 2602; - e.pahiragana = 12401; - e.paiyannoithai = 3631; - e.pakatakana = 12497; - e.palatalizationcyrilliccmb = 1156; - e.palochkacyrillic = 1216; - e.pansioskorean = 12671; - e.paragraph = 182; - e.parallel = 8741; - e.parenleft = 40; - e.parenleftaltonearabic = 64830; - e.parenleftbt = 63725; - e.parenleftex = 63724; - e.parenleftinferior = 8333; - e.parenleftmonospace = 65288; - e.parenleftsmall = 65113; - e.parenleftsuperior = 8317; - e.parenlefttp = 63723; - e.parenleftvertical = 65077; - e.parenright = 41; - e.parenrightaltonearabic = 64831; - e.parenrightbt = 63736; - e.parenrightex = 63735; - e.parenrightinferior = 8334; - e.parenrightmonospace = 65289; - e.parenrightsmall = 65114; - e.parenrightsuperior = 8318; - e.parenrighttp = 63734; - e.parenrightvertical = 65078; - e.partialdiff = 8706; - e.paseqhebrew = 1472; - e.pashtahebrew = 1433; - e.pasquare = 13225; - e.patah = 1463; - e.patah11 = 1463; - e.patah1d = 1463; - e.patah2a = 1463; - e.patahhebrew = 1463; - e.patahnarrowhebrew = 1463; - e.patahquarterhebrew = 1463; - e.patahwidehebrew = 1463; - e.pazerhebrew = 1441; - e.pbopomofo = 12550; - e.pcircle = 9439; - e.pdotaccent = 7767; - e.pe = 1508; - e.pecyrillic = 1087; - e.pedagesh = 64324; - e.pedageshhebrew = 64324; - e.peezisquare = 13115; - e.pefinaldageshhebrew = 64323; - e.peharabic = 1662; - e.peharmenian = 1402; - e.pehebrew = 1508; - e.pehfinalarabic = 64343; - e.pehinitialarabic = 64344; - e.pehiragana = 12410; - e.pehmedialarabic = 64345; - e.pekatakana = 12506; - e.pemiddlehookcyrillic = 1191; - e.perafehebrew = 64334; - e.percent = 37; - e.percentarabic = 1642; - e.percentmonospace = 65285; - e.percentsmall = 65130; - e.period = 46; - e.periodarmenian = 1417; - e.periodcentered = 183; - e.periodhalfwidth = 65377; - e.periodinferior = 63207; - e.periodmonospace = 65294; - e.periodsmall = 65106; - e.periodsuperior = 63208; - e.perispomenigreekcmb = 834; - e.perpendicular = 8869; - e.perthousand = 8240; - e.peseta = 8359; - e.pfsquare = 13194; - e.phabengali = 2475; - e.phadeva = 2347; - e.phagujarati = 2731; - e.phagurmukhi = 2603; - e.phi = 966; - e.phi1 = 981; - e.phieuphacirclekorean = 12922; - e.phieuphaparenkorean = 12826; - e.phieuphcirclekorean = 12908; - e.phieuphkorean = 12621; - e.phieuphparenkorean = 12812; - e.philatin = 632; - e.phinthuthai = 3642; - e.phisymbolgreek = 981; - e.phook = 421; - e.phophanthai = 3614; - e.phophungthai = 3612; - e.phosamphaothai = 3616; - e.pi = 960; - e.pieupacirclekorean = 12915; - e.pieupaparenkorean = 12819; - e.pieupcieuckorean = 12662; - e.pieupcirclekorean = 12901; - e.pieupkiyeokkorean = 12658; - e.pieupkorean = 12610; - e.pieupparenkorean = 12805; - e.pieupsioskiyeokkorean = 12660; - e.pieupsioskorean = 12612; - e.pieupsiostikeutkorean = 12661; - e.pieupthieuthkorean = 12663; - e.pieuptikeutkorean = 12659; - e.pihiragana = 12404; - e.pikatakana = 12500; - e.pisymbolgreek = 982; - e.piwrarmenian = 1411; - e.planckover2pi = 8463; - e.planckover2pi1 = 8463; - e.plus = 43; - e.plusbelowcmb = 799; - e.pluscircle = 8853; - e.plusminus = 177; - e.plusmod = 726; - e.plusmonospace = 65291; - e.plussmall = 65122; - e.plussuperior = 8314; - e.pmonospace = 65360; - e.pmsquare = 13272; - e.pohiragana = 12413; - e.pointingindexdownwhite = 9759; - e.pointingindexleftwhite = 9756; - e.pointingindexrightwhite = 9758; - e.pointingindexupwhite = 9757; - e.pokatakana = 12509; - e.poplathai = 3611; - e.postalmark = 12306; - e.postalmarkface = 12320; - e.pparen = 9387; - e.precedes = 8826; - e.prescription = 8478; - e.primemod = 697; - e.primereversed = 8245; - e.product = 8719; - e.projective = 8965; - e.prolongedkana = 12540; - e.propellor = 8984; - e.propersubset = 8834; - e.propersuperset = 8835; - e.proportion = 8759; - e.proportional = 8733; - e.psi = 968; - e.psicyrillic = 1137; - e.psilipneumatacyrilliccmb = 1158; - e.pssquare = 13232; - e.puhiragana = 12407; - e.pukatakana = 12503; - e.pvsquare = 13236; - e.pwsquare = 13242; - e.q = 113; - e.qadeva = 2392; - e.qadmahebrew = 1448; - e.qafarabic = 1602; - e.qaffinalarabic = 65238; - e.qafinitialarabic = 65239; - e.qafmedialarabic = 65240; - e.qamats = 1464; - e.qamats10 = 1464; - e.qamats1a = 1464; - e.qamats1c = 1464; - e.qamats27 = 1464; - e.qamats29 = 1464; - e.qamats33 = 1464; - e.qamatsde = 1464; - e.qamatshebrew = 1464; - e.qamatsnarrowhebrew = 1464; - e.qamatsqatanhebrew = 1464; - e.qamatsqatannarrowhebrew = 1464; - e.qamatsqatanquarterhebrew = 1464; - e.qamatsqatanwidehebrew = 1464; - e.qamatsquarterhebrew = 1464; - e.qamatswidehebrew = 1464; - e.qarneyparahebrew = 1439; - e.qbopomofo = 12561; - e.qcircle = 9440; - e.qhook = 672; - e.qmonospace = 65361; - e.qof = 1511; - e.qofdagesh = 64327; - e.qofdageshhebrew = 64327; - e.qofhebrew = 1511; - e.qparen = 9388; - e.quarternote = 9833; - e.qubuts = 1467; - e.qubuts18 = 1467; - e.qubuts25 = 1467; - e.qubuts31 = 1467; - e.qubutshebrew = 1467; - e.qubutsnarrowhebrew = 1467; - e.qubutsquarterhebrew = 1467; - e.qubutswidehebrew = 1467; - e.question = 63; - e.questionarabic = 1567; - e.questionarmenian = 1374; - e.questiondown = 191; - e.questiondownsmall = 63423; - e.questiongreek = 894; - e.questionmonospace = 65311; - e.questionsmall = 63295; - e.quotedbl = 34; - e.quotedblbase = 8222; - e.quotedblleft = 8220; - e.quotedblmonospace = 65282; - e.quotedblprime = 12318; - e.quotedblprimereversed = 12317; - e.quotedblright = 8221; - e.quoteleft = 8216; - e.quoteleftreversed = 8219; - e.quotereversed = 8219; - e.quoteright = 8217; - e.quoterightn = 329; - e.quotesinglbase = 8218; - e.quotesingle = 39; - e.quotesinglemonospace = 65287; - e.r = 114; - e.raarmenian = 1404; - e.rabengali = 2480; - e.racute = 341; - e.radeva = 2352; - e.radical = 8730; - e.radicalex = 63717; - e.radoverssquare = 13230; - e.radoverssquaredsquare = 13231; - e.radsquare = 13229; - e.rafe = 1471; - e.rafehebrew = 1471; - e.ragujarati = 2736; - e.ragurmukhi = 2608; - e.rahiragana = 12425; - e.rakatakana = 12521; - e.rakatakanahalfwidth = 65431; - e.ralowerdiagonalbengali = 2545; - e.ramiddlediagonalbengali = 2544; - e.ramshorn = 612; - e.ratio = 8758; - e.rbopomofo = 12566; - e.rcaron = 345; - e.rcedilla = 343; - e.rcircle = 9441; - e.rcommaaccent = 343; - e.rdblgrave = 529; - e.rdotaccent = 7769; - e.rdotbelow = 7771; - e.rdotbelowmacron = 7773; - e.referencemark = 8251; - e.reflexsubset = 8838; - e.reflexsuperset = 8839; - e.registered = 174; - e.registersans = 63720; - e.registerserif = 63194; - e.reharabic = 1585; - e.reharmenian = 1408; - e.rehfinalarabic = 65198; - e.rehiragana = 12428; - e.rekatakana = 12524; - e.rekatakanahalfwidth = 65434; - e.resh = 1512; - e.reshdageshhebrew = 64328; - e.reshhebrew = 1512; - e.reversedtilde = 8765; - e.reviahebrew = 1431; - e.reviamugrashhebrew = 1431; - e.revlogicalnot = 8976; - e.rfishhook = 638; - e.rfishhookreversed = 639; - e.rhabengali = 2525; - e.rhadeva = 2397; - e.rho = 961; - e.rhook = 637; - e.rhookturned = 635; - e.rhookturnedsuperior = 693; - e.rhosymbolgreek = 1009; - e.rhotichookmod = 734; - e.rieulacirclekorean = 12913; - e.rieulaparenkorean = 12817; - e.rieulcirclekorean = 12899; - e.rieulhieuhkorean = 12608; - e.rieulkiyeokkorean = 12602; - e.rieulkiyeoksioskorean = 12649; - e.rieulkorean = 12601; - e.rieulmieumkorean = 12603; - e.rieulpansioskorean = 12652; - e.rieulparenkorean = 12803; - e.rieulphieuphkorean = 12607; - e.rieulpieupkorean = 12604; - e.rieulpieupsioskorean = 12651; - e.rieulsioskorean = 12605; - e.rieulthieuthkorean = 12606; - e.rieultikeutkorean = 12650; - e.rieulyeorinhieuhkorean = 12653; - e.rightangle = 8735; - e.righttackbelowcmb = 793; - e.righttriangle = 8895; - e.rihiragana = 12426; - e.rikatakana = 12522; - e.rikatakanahalfwidth = 65432; - e.ring = 730; - e.ringbelowcmb = 805; - e.ringcmb = 778; - e.ringhalfleft = 703; - e.ringhalfleftarmenian = 1369; - e.ringhalfleftbelowcmb = 796; - e.ringhalfleftcentered = 723; - e.ringhalfright = 702; - e.ringhalfrightbelowcmb = 825; - e.ringhalfrightcentered = 722; - e.rinvertedbreve = 531; - e.rittorusquare = 13137; - e.rlinebelow = 7775; - e.rlongleg = 636; - e.rlonglegturned = 634; - e.rmonospace = 65362; - e.rohiragana = 12429; - e.rokatakana = 12525; - e.rokatakanahalfwidth = 65435; - e.roruathai = 3619; - e.rparen = 9389; - e.rrabengali = 2524; - e.rradeva = 2353; - e.rragurmukhi = 2652; - e.rreharabic = 1681; - e.rrehfinalarabic = 64397; - e.rrvocalicbengali = 2528; - e.rrvocalicdeva = 2400; - e.rrvocalicgujarati = 2784; - e.rrvocalicvowelsignbengali = 2500; - e.rrvocalicvowelsigndeva = 2372; - e.rrvocalicvowelsigngujarati = 2756; - e.rsuperior = 63217; - e.rtblock = 9616; - e.rturned = 633; - e.rturnedsuperior = 692; - e.ruhiragana = 12427; - e.rukatakana = 12523; - e.rukatakanahalfwidth = 65433; - e.rupeemarkbengali = 2546; - e.rupeesignbengali = 2547; - e.rupiah = 63197; - e.ruthai = 3620; - e.rvocalicbengali = 2443; - e.rvocalicdeva = 2315; - e.rvocalicgujarati = 2699; - e.rvocalicvowelsignbengali = 2499; - e.rvocalicvowelsigndeva = 2371; - e.rvocalicvowelsigngujarati = 2755; - e.s = 115; - e.sabengali = 2488; - e.sacute = 347; - e.sacutedotaccent = 7781; - e.sadarabic = 1589; - e.sadeva = 2360; - e.sadfinalarabic = 65210; - e.sadinitialarabic = 65211; - e.sadmedialarabic = 65212; - e.sagujarati = 2744; - e.sagurmukhi = 2616; - e.sahiragana = 12373; - e.sakatakana = 12469; - e.sakatakanahalfwidth = 65403; - e.sallallahoualayhewasallamarabic = 65018; - e.samekh = 1505; - e.samekhdagesh = 64321; - e.samekhdageshhebrew = 64321; - e.samekhhebrew = 1505; - e.saraaathai = 3634; - e.saraaethai = 3649; - e.saraaimaimalaithai = 3652; - e.saraaimaimuanthai = 3651; - e.saraamthai = 3635; - e.saraathai = 3632; - e.saraethai = 3648; - e.saraiileftthai = 63622; - e.saraiithai = 3637; - e.saraileftthai = 63621; - e.saraithai = 3636; - e.saraothai = 3650; - e.saraueeleftthai = 63624; - e.saraueethai = 3639; - e.saraueleftthai = 63623; - e.sarauethai = 3638; - e.sarauthai = 3640; - e.sarauuthai = 3641; - e.sbopomofo = 12569; - e.scaron = 353; - e.scarondotaccent = 7783; - e.scedilla = 351; - e.schwa = 601; - e.schwacyrillic = 1241; - e.schwadieresiscyrillic = 1243; - e.schwahook = 602; - e.scircle = 9442; - e.scircumflex = 349; - e.scommaaccent = 537; - e.sdotaccent = 7777; - e.sdotbelow = 7779; - e.sdotbelowdotaccent = 7785; - e.seagullbelowcmb = 828; - e.second = 8243; - e.secondtonechinese = 714; - e.section = 167; - e.seenarabic = 1587; - e.seenfinalarabic = 65202; - e.seeninitialarabic = 65203; - e.seenmedialarabic = 65204; - e.segol = 1462; - e.segol13 = 1462; - e.segol1f = 1462; - e.segol2c = 1462; - e.segolhebrew = 1462; - e.segolnarrowhebrew = 1462; - e.segolquarterhebrew = 1462; - e.segoltahebrew = 1426; - e.segolwidehebrew = 1462; - e.seharmenian = 1405; - e.sehiragana = 12379; - e.sekatakana = 12475; - e.sekatakanahalfwidth = 65406; - e.semicolon = 59; - e.semicolonarabic = 1563; - e.semicolonmonospace = 65307; - e.semicolonsmall = 65108; - e.semivoicedmarkkana = 12444; - e.semivoicedmarkkanahalfwidth = 65439; - e.sentisquare = 13090; - e.sentosquare = 13091; - e.seven = 55; - e.sevenarabic = 1639; - e.sevenbengali = 2541; - e.sevencircle = 9318; - e.sevencircleinversesansserif = 10128; - e.sevendeva = 2413; - e.seveneighths = 8542; - e.sevengujarati = 2797; - e.sevengurmukhi = 2669; - e.sevenhackarabic = 1639; - e.sevenhangzhou = 12327; - e.sevenideographicparen = 12838; - e.seveninferior = 8327; - e.sevenmonospace = 65303; - e.sevenoldstyle = 63287; - e.sevenparen = 9338; - e.sevenperiod = 9358; - e.sevenpersian = 1783; - e.sevenroman = 8566; - e.sevensuperior = 8311; - e.seventeencircle = 9328; - e.seventeenparen = 9348; - e.seventeenperiod = 9368; - e.seventhai = 3671; - e.sfthyphen = 173; - e.shaarmenian = 1399; - e.shabengali = 2486; - e.shacyrillic = 1096; - e.shaddaarabic = 1617; - e.shaddadammaarabic = 64609; - e.shaddadammatanarabic = 64606; - e.shaddafathaarabic = 64608; - e.shaddakasraarabic = 64610; - e.shaddakasratanarabic = 64607; - e.shade = 9618; - e.shadedark = 9619; - e.shadelight = 9617; - e.shademedium = 9618; - e.shadeva = 2358; - e.shagujarati = 2742; - e.shagurmukhi = 2614; - e.shalshelethebrew = 1427; - e.shbopomofo = 12565; - e.shchacyrillic = 1097; - e.sheenarabic = 1588; - e.sheenfinalarabic = 65206; - e.sheeninitialarabic = 65207; - e.sheenmedialarabic = 65208; - e.sheicoptic = 995; - e.sheqel = 8362; - e.sheqelhebrew = 8362; - e.sheva = 1456; - e.sheva115 = 1456; - e.sheva15 = 1456; - e.sheva22 = 1456; - e.sheva2e = 1456; - e.shevahebrew = 1456; - e.shevanarrowhebrew = 1456; - e.shevaquarterhebrew = 1456; - e.shevawidehebrew = 1456; - e.shhacyrillic = 1211; - e.shimacoptic = 1005; - e.shin = 1513; - e.shindagesh = 64329; - e.shindageshhebrew = 64329; - e.shindageshshindot = 64300; - e.shindageshshindothebrew = 64300; - e.shindageshsindot = 64301; - e.shindageshsindothebrew = 64301; - e.shindothebrew = 1473; - e.shinhebrew = 1513; - e.shinshindot = 64298; - e.shinshindothebrew = 64298; - e.shinsindot = 64299; - e.shinsindothebrew = 64299; - e.shook = 642; - e.sigma = 963; - e.sigma1 = 962; - e.sigmafinal = 962; - e.sigmalunatesymbolgreek = 1010; - e.sihiragana = 12375; - e.sikatakana = 12471; - e.sikatakanahalfwidth = 65404; - e.siluqhebrew = 1469; - e.siluqlefthebrew = 1469; - e.similar = 8764; - e.sindothebrew = 1474; - e.siosacirclekorean = 12916; - e.siosaparenkorean = 12820; - e.sioscieuckorean = 12670; - e.sioscirclekorean = 12902; - e.sioskiyeokkorean = 12666; - e.sioskorean = 12613; - e.siosnieunkorean = 12667; - e.siosparenkorean = 12806; - e.siospieupkorean = 12669; - e.siostikeutkorean = 12668; - e.six = 54; - e.sixarabic = 1638; - e.sixbengali = 2540; - e.sixcircle = 9317; - e.sixcircleinversesansserif = 10127; - e.sixdeva = 2412; - e.sixgujarati = 2796; - e.sixgurmukhi = 2668; - e.sixhackarabic = 1638; - e.sixhangzhou = 12326; - e.sixideographicparen = 12837; - e.sixinferior = 8326; - e.sixmonospace = 65302; - e.sixoldstyle = 63286; - e.sixparen = 9337; - e.sixperiod = 9357; - e.sixpersian = 1782; - e.sixroman = 8565; - e.sixsuperior = 8310; - e.sixteencircle = 9327; - e.sixteencurrencydenominatorbengali = 2553; - e.sixteenparen = 9347; - e.sixteenperiod = 9367; - e.sixthai = 3670; - e.slash = 47; - e.slashmonospace = 65295; - e.slong = 383; - e.slongdotaccent = 7835; - e.smileface = 9786; - e.smonospace = 65363; - e.sofpasuqhebrew = 1475; - e.softhyphen = 173; - e.softsigncyrillic = 1100; - e.sohiragana = 12381; - e.sokatakana = 12477; - e.sokatakanahalfwidth = 65407; - e.soliduslongoverlaycmb = 824; - e.solidusshortoverlaycmb = 823; - e.sorusithai = 3625; - e.sosalathai = 3624; - e.sosothai = 3595; - e.sosuathai = 3626; - e.space = 32; - e.spacehackarabic = 32; - e.spade = 9824; - e.spadesuitblack = 9824; - e.spadesuitwhite = 9828; - e.sparen = 9390; - e.squarebelowcmb = 827; - e.squarecc = 13252; - e.squarecm = 13213; - e.squarediagonalcrosshatchfill = 9641; - e.squarehorizontalfill = 9636; - e.squarekg = 13199; - e.squarekm = 13214; - e.squarekmcapital = 13262; - e.squareln = 13265; - e.squarelog = 13266; - e.squaremg = 13198; - e.squaremil = 13269; - e.squaremm = 13212; - e.squaremsquared = 13217; - e.squareorthogonalcrosshatchfill = 9638; - e.squareupperlefttolowerrightfill = 9639; - e.squareupperrighttolowerleftfill = 9640; - e.squareverticalfill = 9637; - e.squarewhitewithsmallblack = 9635; - e.srsquare = 13275; - e.ssabengali = 2487; - e.ssadeva = 2359; - e.ssagujarati = 2743; - e.ssangcieuckorean = 12617; - e.ssanghieuhkorean = 12677; - e.ssangieungkorean = 12672; - e.ssangkiyeokkorean = 12594; - e.ssangnieunkorean = 12645; - e.ssangpieupkorean = 12611; - e.ssangsioskorean = 12614; - e.ssangtikeutkorean = 12600; - e.ssuperior = 63218; - e.sterling = 163; - e.sterlingmonospace = 65505; - e.strokelongoverlaycmb = 822; - e.strokeshortoverlaycmb = 821; - e.subset = 8834; - e.subsetnotequal = 8842; - e.subsetorequal = 8838; - e.succeeds = 8827; - e.suchthat = 8715; - e.suhiragana = 12377; - e.sukatakana = 12473; - e.sukatakanahalfwidth = 65405; - e.sukunarabic = 1618; - e.summation = 8721; - e.sun = 9788; - e.superset = 8835; - e.supersetnotequal = 8843; - e.supersetorequal = 8839; - e.svsquare = 13276; - e.syouwaerasquare = 13180; - e.t = 116; - e.tabengali = 2468; - e.tackdown = 8868; - e.tackleft = 8867; - e.tadeva = 2340; - e.tagujarati = 2724; - e.tagurmukhi = 2596; - e.taharabic = 1591; - e.tahfinalarabic = 65218; - e.tahinitialarabic = 65219; - e.tahiragana = 12383; - e.tahmedialarabic = 65220; - e.taisyouerasquare = 13181; - e.takatakana = 12479; - e.takatakanahalfwidth = 65408; - e.tatweelarabic = 1600; - e.tau = 964; - e.tav = 1514; - e.tavdages = 64330; - e.tavdagesh = 64330; - e.tavdageshhebrew = 64330; - e.tavhebrew = 1514; - e.tbar = 359; - e.tbopomofo = 12554; - e.tcaron = 357; - e.tccurl = 680; - e.tcedilla = 355; - e.tcheharabic = 1670; - e.tchehfinalarabic = 64379; - e.tchehinitialarabic = 64380; - e.tchehmedialarabic = 64381; - e.tcircle = 9443; - e.tcircumflexbelow = 7793; - e.tcommaaccent = 355; - e.tdieresis = 7831; - e.tdotaccent = 7787; - e.tdotbelow = 7789; - e.tecyrillic = 1090; - e.tedescendercyrillic = 1197; - e.teharabic = 1578; - e.tehfinalarabic = 65174; - e.tehhahinitialarabic = 64674; - e.tehhahisolatedarabic = 64524; - e.tehinitialarabic = 65175; - e.tehiragana = 12390; - e.tehjeeminitialarabic = 64673; - e.tehjeemisolatedarabic = 64523; - e.tehmarbutaarabic = 1577; - e.tehmarbutafinalarabic = 65172; - e.tehmedialarabic = 65176; - e.tehmeeminitialarabic = 64676; - e.tehmeemisolatedarabic = 64526; - e.tehnoonfinalarabic = 64627; - e.tekatakana = 12486; - e.tekatakanahalfwidth = 65411; - e.telephone = 8481; - e.telephoneblack = 9742; - e.telishagedolahebrew = 1440; - e.telishaqetanahebrew = 1449; - e.tencircle = 9321; - e.tenideographicparen = 12841; - e.tenparen = 9341; - e.tenperiod = 9361; - e.tenroman = 8569; - e.tesh = 679; - e.tet = 1496; - e.tetdagesh = 64312; - e.tetdageshhebrew = 64312; - e.tethebrew = 1496; - e.tetsecyrillic = 1205; - e.tevirhebrew = 1435; - e.tevirlefthebrew = 1435; - e.thabengali = 2469; - e.thadeva = 2341; - e.thagujarati = 2725; - e.thagurmukhi = 2597; - e.thalarabic = 1584; - e.thalfinalarabic = 65196; - e.thanthakhatlowleftthai = 63640; - e.thanthakhatlowrightthai = 63639; - e.thanthakhatthai = 3660; - e.thanthakhatupperleftthai = 63638; - e.theharabic = 1579; - e.thehfinalarabic = 65178; - e.thehinitialarabic = 65179; - e.thehmedialarabic = 65180; - e.thereexists = 8707; - e.therefore = 8756; - e.theta = 952; - e.theta1 = 977; - e.thetasymbolgreek = 977; - e.thieuthacirclekorean = 12921; - e.thieuthaparenkorean = 12825; - e.thieuthcirclekorean = 12907; - e.thieuthkorean = 12620; - e.thieuthparenkorean = 12811; - e.thirteencircle = 9324; - e.thirteenparen = 9344; - e.thirteenperiod = 9364; - e.thonangmonthothai = 3601; - e.thook = 429; - e.thophuthaothai = 3602; - e.thorn = 254; - e.thothahanthai = 3607; - e.thothanthai = 3600; - e.thothongthai = 3608; - e.thothungthai = 3606; - e.thousandcyrillic = 1154; - e.thousandsseparatorarabic = 1644; - e.thousandsseparatorpersian = 1644; - e.three = 51; - e.threearabic = 1635; - e.threebengali = 2537; - e.threecircle = 9314; - e.threecircleinversesansserif = 10124; - e.threedeva = 2409; - e.threeeighths = 8540; - e.threegujarati = 2793; - e.threegurmukhi = 2665; - e.threehackarabic = 1635; - e.threehangzhou = 12323; - e.threeideographicparen = 12834; - e.threeinferior = 8323; - e.threemonospace = 65299; - e.threenumeratorbengali = 2550; - e.threeoldstyle = 63283; - e.threeparen = 9334; - e.threeperiod = 9354; - e.threepersian = 1779; - e.threequarters = 190; - e.threequartersemdash = 63198; - e.threeroman = 8562; - e.threesuperior = 179; - e.threethai = 3667; - e.thzsquare = 13204; - e.tihiragana = 12385; - e.tikatakana = 12481; - e.tikatakanahalfwidth = 65409; - e.tikeutacirclekorean = 12912; - e.tikeutaparenkorean = 12816; - e.tikeutcirclekorean = 12898; - e.tikeutkorean = 12599; - e.tikeutparenkorean = 12802; - e.tilde = 732; - e.tildebelowcmb = 816; - e.tildecmb = 771; - e.tildecomb = 771; - e.tildedoublecmb = 864; - e.tildeoperator = 8764; - e.tildeoverlaycmb = 820; - e.tildeverticalcmb = 830; - e.timescircle = 8855; - e.tipehahebrew = 1430; - e.tipehalefthebrew = 1430; - e.tippigurmukhi = 2672; - e.titlocyrilliccmb = 1155; - e.tiwnarmenian = 1407; - e.tlinebelow = 7791; - e.tmonospace = 65364; - e.toarmenian = 1385; - e.tohiragana = 12392; - e.tokatakana = 12488; - e.tokatakanahalfwidth = 65412; - e.tonebarextrahighmod = 741; - e.tonebarextralowmod = 745; - e.tonebarhighmod = 742; - e.tonebarlowmod = 744; - e.tonebarmidmod = 743; - e.tonefive = 445; - e.tonesix = 389; - e.tonetwo = 424; - e.tonos = 900; - e.tonsquare = 13095; - e.topatakthai = 3599; - e.tortoiseshellbracketleft = 12308; - e.tortoiseshellbracketleftsmall = 65117; - e.tortoiseshellbracketleftvertical = 65081; - e.tortoiseshellbracketright = 12309; - e.tortoiseshellbracketrightsmall = 65118; - e.tortoiseshellbracketrightvertical = 65082; - e.totaothai = 3605; - e.tpalatalhook = 427; - e.tparen = 9391; - e.trademark = 8482; - e.trademarksans = 63722; - e.trademarkserif = 63195; - e.tretroflexhook = 648; - e.triagdn = 9660; - e.triaglf = 9668; - e.triagrt = 9658; - e.triagup = 9650; - e.ts = 678; - e.tsadi = 1510; - e.tsadidagesh = 64326; - e.tsadidageshhebrew = 64326; - e.tsadihebrew = 1510; - e.tsecyrillic = 1094; - e.tsere = 1461; - e.tsere12 = 1461; - e.tsere1e = 1461; - e.tsere2b = 1461; - e.tserehebrew = 1461; - e.tserenarrowhebrew = 1461; - e.tserequarterhebrew = 1461; - e.tserewidehebrew = 1461; - e.tshecyrillic = 1115; - e.tsuperior = 63219; - e.ttabengali = 2463; - e.ttadeva = 2335; - e.ttagujarati = 2719; - e.ttagurmukhi = 2591; - e.tteharabic = 1657; - e.ttehfinalarabic = 64359; - e.ttehinitialarabic = 64360; - e.ttehmedialarabic = 64361; - e.tthabengali = 2464; - e.tthadeva = 2336; - e.tthagujarati = 2720; - e.tthagurmukhi = 2592; - e.tturned = 647; - e.tuhiragana = 12388; - e.tukatakana = 12484; - e.tukatakanahalfwidth = 65410; - e.tusmallhiragana = 12387; - e.tusmallkatakana = 12483; - e.tusmallkatakanahalfwidth = 65391; - e.twelvecircle = 9323; - e.twelveparen = 9343; - e.twelveperiod = 9363; - e.twelveroman = 8571; - e.twentycircle = 9331; - e.twentyhangzhou = 21316; - e.twentyparen = 9351; - e.twentyperiod = 9371; - e.two = 50; - e.twoarabic = 1634; - e.twobengali = 2536; - e.twocircle = 9313; - e.twocircleinversesansserif = 10123; - e.twodeva = 2408; - e.twodotenleader = 8229; - e.twodotleader = 8229; - e.twodotleadervertical = 65072; - e.twogujarati = 2792; - e.twogurmukhi = 2664; - e.twohackarabic = 1634; - e.twohangzhou = 12322; - e.twoideographicparen = 12833; - e.twoinferior = 8322; - e.twomonospace = 65298; - e.twonumeratorbengali = 2549; - e.twooldstyle = 63282; - e.twoparen = 9333; - e.twoperiod = 9353; - e.twopersian = 1778; - e.tworoman = 8561; - e.twostroke = 443; - e.twosuperior = 178; - e.twothai = 3666; - e.twothirds = 8532; - e.u = 117; - e.uacute = 250; - e.ubar = 649; - e.ubengali = 2441; - e.ubopomofo = 12584; - e.ubreve = 365; - e.ucaron = 468; - e.ucircle = 9444; - e.ucircumflex = 251; - e.ucircumflexbelow = 7799; - e.ucyrillic = 1091; - e.udattadeva = 2385; - e.udblacute = 369; - e.udblgrave = 533; - e.udeva = 2313; - e.udieresis = 252; - e.udieresisacute = 472; - e.udieresisbelow = 7795; - e.udieresiscaron = 474; - e.udieresiscyrillic = 1265; - e.udieresisgrave = 476; - e.udieresismacron = 470; - e.udotbelow = 7909; - e.ugrave = 249; - e.ugujarati = 2697; - e.ugurmukhi = 2569; - e.uhiragana = 12358; - e.uhookabove = 7911; - e.uhorn = 432; - e.uhornacute = 7913; - e.uhorndotbelow = 7921; - e.uhorngrave = 7915; - e.uhornhookabove = 7917; - e.uhorntilde = 7919; - e.uhungarumlaut = 369; - e.uhungarumlautcyrillic = 1267; - e.uinvertedbreve = 535; - e.ukatakana = 12454; - e.ukatakanahalfwidth = 65395; - e.ukcyrillic = 1145; - e.ukorean = 12636; - e.umacron = 363; - e.umacroncyrillic = 1263; - e.umacrondieresis = 7803; - e.umatragurmukhi = 2625; - e.umonospace = 65365; - e.underscore = 95; - e.underscoredbl = 8215; - e.underscoremonospace = 65343; - e.underscorevertical = 65075; - e.underscorewavy = 65103; - e.union = 8746; - e.universal = 8704; - e.uogonek = 371; - e.uparen = 9392; - e.upblock = 9600; - e.upperdothebrew = 1476; - e.upsilon = 965; - e.upsilondieresis = 971; - e.upsilondieresistonos = 944; - e.upsilonlatin = 650; - e.upsilontonos = 973; - e.uptackbelowcmb = 797; - e.uptackmod = 724; - e.uragurmukhi = 2675; - e.uring = 367; - e.ushortcyrillic = 1118; - e.usmallhiragana = 12357; - e.usmallkatakana = 12453; - e.usmallkatakanahalfwidth = 65385; - e.ustraightcyrillic = 1199; - e.ustraightstrokecyrillic = 1201; - e.utilde = 361; - e.utildeacute = 7801; - e.utildebelow = 7797; - e.uubengali = 2442; - e.uudeva = 2314; - e.uugujarati = 2698; - e.uugurmukhi = 2570; - e.uumatragurmukhi = 2626; - e.uuvowelsignbengali = 2498; - e.uuvowelsigndeva = 2370; - e.uuvowelsigngujarati = 2754; - e.uvowelsignbengali = 2497; - e.uvowelsigndeva = 2369; - e.uvowelsigngujarati = 2753; - e.v = 118; - e.vadeva = 2357; - e.vagujarati = 2741; - e.vagurmukhi = 2613; - e.vakatakana = 12535; - e.vav = 1493; - e.vavdagesh = 64309; - e.vavdagesh65 = 64309; - e.vavdageshhebrew = 64309; - e.vavhebrew = 1493; - e.vavholam = 64331; - e.vavholamhebrew = 64331; - e.vavvavhebrew = 1520; - e.vavyodhebrew = 1521; - e.vcircle = 9445; - e.vdotbelow = 7807; - e.vecyrillic = 1074; - e.veharabic = 1700; - e.vehfinalarabic = 64363; - e.vehinitialarabic = 64364; - e.vehmedialarabic = 64365; - e.vekatakana = 12537; - e.venus = 9792; - e.verticalbar = 124; - e.verticallineabovecmb = 781; - e.verticallinebelowcmb = 809; - e.verticallinelowmod = 716; - e.verticallinemod = 712; - e.vewarmenian = 1406; - e.vhook = 651; - e.vikatakana = 12536; - e.viramabengali = 2509; - e.viramadeva = 2381; - e.viramagujarati = 2765; - e.visargabengali = 2435; - e.visargadeva = 2307; - e.visargagujarati = 2691; - e.vmonospace = 65366; - e.voarmenian = 1400; - e.voicediterationhiragana = 12446; - e.voicediterationkatakana = 12542; - e.voicedmarkkana = 12443; - e.voicedmarkkanahalfwidth = 65438; - e.vokatakana = 12538; - e.vparen = 9393; - e.vtilde = 7805; - e.vturned = 652; - e.vuhiragana = 12436; - e.vukatakana = 12532; - e.w = 119; - e.wacute = 7811; - e.waekorean = 12633; - e.wahiragana = 12431; - e.wakatakana = 12527; - e.wakatakanahalfwidth = 65436; - e.wakorean = 12632; - e.wasmallhiragana = 12430; - e.wasmallkatakana = 12526; - e.wattosquare = 13143; - e.wavedash = 12316; - e.wavyunderscorevertical = 65076; - e.wawarabic = 1608; - e.wawfinalarabic = 65262; - e.wawhamzaabovearabic = 1572; - e.wawhamzaabovefinalarabic = 65158; - e.wbsquare = 13277; - e.wcircle = 9446; - e.wcircumflex = 373; - e.wdieresis = 7813; - e.wdotaccent = 7815; - e.wdotbelow = 7817; - e.wehiragana = 12433; - e.weierstrass = 8472; - e.wekatakana = 12529; - e.wekorean = 12638; - e.weokorean = 12637; - e.wgrave = 7809; - e.whitebullet = 9702; - e.whitecircle = 9675; - e.whitecircleinverse = 9689; - e.whitecornerbracketleft = 12302; - e.whitecornerbracketleftvertical = 65091; - e.whitecornerbracketright = 12303; - e.whitecornerbracketrightvertical = 65092; - e.whitediamond = 9671; - e.whitediamondcontainingblacksmalldiamond = 9672; - e.whitedownpointingsmalltriangle = 9663; - e.whitedownpointingtriangle = 9661; - e.whiteleftpointingsmalltriangle = 9667; - e.whiteleftpointingtriangle = 9665; - e.whitelenticularbracketleft = 12310; - e.whitelenticularbracketright = 12311; - e.whiterightpointingsmalltriangle = 9657; - e.whiterightpointingtriangle = 9655; - e.whitesmallsquare = 9643; - e.whitesmilingface = 9786; - e.whitesquare = 9633; - e.whitestar = 9734; - e.whitetelephone = 9743; - e.whitetortoiseshellbracketleft = 12312; - e.whitetortoiseshellbracketright = 12313; - e.whiteuppointingsmalltriangle = 9653; - e.whiteuppointingtriangle = 9651; - e.wihiragana = 12432; - e.wikatakana = 12528; - e.wikorean = 12639; - e.wmonospace = 65367; - e.wohiragana = 12434; - e.wokatakana = 12530; - e.wokatakanahalfwidth = 65382; - e.won = 8361; - e.wonmonospace = 65510; - e.wowaenthai = 3623; - e.wparen = 9394; - e.wring = 7832; - e.wsuperior = 695; - e.wturned = 653; - e.wynn = 447; - e.x = 120; - e.xabovecmb = 829; - e.xbopomofo = 12562; - e.xcircle = 9447; - e.xdieresis = 7821; - e.xdotaccent = 7819; - e.xeharmenian = 1389; - e.xi = 958; - e.xmonospace = 65368; - e.xparen = 9395; - e.xsuperior = 739; - e.y = 121; - e.yaadosquare = 13134; - e.yabengali = 2479; - e.yacute = 253; - e.yadeva = 2351; - e.yaekorean = 12626; - e.yagujarati = 2735; - e.yagurmukhi = 2607; - e.yahiragana = 12420; - e.yakatakana = 12516; - e.yakatakanahalfwidth = 65428; - e.yakorean = 12625; - e.yamakkanthai = 3662; - e.yasmallhiragana = 12419; - e.yasmallkatakana = 12515; - e.yasmallkatakanahalfwidth = 65388; - e.yatcyrillic = 1123; - e.ycircle = 9448; - e.ycircumflex = 375; - e.ydieresis = 255; - e.ydotaccent = 7823; - e.ydotbelow = 7925; - e.yeharabic = 1610; - e.yehbarreearabic = 1746; - e.yehbarreefinalarabic = 64431; - e.yehfinalarabic = 65266; - e.yehhamzaabovearabic = 1574; - e.yehhamzaabovefinalarabic = 65162; - e.yehhamzaaboveinitialarabic = 65163; - e.yehhamzaabovemedialarabic = 65164; - e.yehinitialarabic = 65267; - e.yehmedialarabic = 65268; - e.yehmeeminitialarabic = 64733; - e.yehmeemisolatedarabic = 64600; - e.yehnoonfinalarabic = 64660; - e.yehthreedotsbelowarabic = 1745; - e.yekorean = 12630; - e.yen = 165; - e.yenmonospace = 65509; - e.yeokorean = 12629; - e.yeorinhieuhkorean = 12678; - e.yerahbenyomohebrew = 1450; - e.yerahbenyomolefthebrew = 1450; - e.yericyrillic = 1099; - e.yerudieresiscyrillic = 1273; - e.yesieungkorean = 12673; - e.yesieungpansioskorean = 12675; - e.yesieungsioskorean = 12674; - e.yetivhebrew = 1434; - e.ygrave = 7923; - e.yhook = 436; - e.yhookabove = 7927; - e.yiarmenian = 1397; - e.yicyrillic = 1111; - e.yikorean = 12642; - e.yinyang = 9775; - e.yiwnarmenian = 1410; - e.ymonospace = 65369; - e.yod = 1497; - e.yoddagesh = 64313; - e.yoddageshhebrew = 64313; - e.yodhebrew = 1497; - e.yodyodhebrew = 1522; - e.yodyodpatahhebrew = 64287; - e.yohiragana = 12424; - e.yoikorean = 12681; - e.yokatakana = 12520; - e.yokatakanahalfwidth = 65430; - e.yokorean = 12635; - e.yosmallhiragana = 12423; - e.yosmallkatakana = 12519; - e.yosmallkatakanahalfwidth = 65390; - e.yotgreek = 1011; - e.yoyaekorean = 12680; - e.yoyakorean = 12679; - e.yoyakthai = 3618; - e.yoyingthai = 3597; - e.yparen = 9396; - e.ypogegrammeni = 890; - e.ypogegrammenigreekcmb = 837; - e.yr = 422; - e.yring = 7833; - e.ysuperior = 696; - e.ytilde = 7929; - e.yturned = 654; - e.yuhiragana = 12422; - e.yuikorean = 12684; - e.yukatakana = 12518; - e.yukatakanahalfwidth = 65429; - e.yukorean = 12640; - e.yusbigcyrillic = 1131; - e.yusbigiotifiedcyrillic = 1133; - e.yuslittlecyrillic = 1127; - e.yuslittleiotifiedcyrillic = 1129; - e.yusmallhiragana = 12421; - e.yusmallkatakana = 12517; - e.yusmallkatakanahalfwidth = 65389; - e.yuyekorean = 12683; - e.yuyeokorean = 12682; - e.yyabengali = 2527; - e.yyadeva = 2399; - e.z = 122; - e.zaarmenian = 1382; - e.zacute = 378; - e.zadeva = 2395; - e.zagurmukhi = 2651; - e.zaharabic = 1592; - e.zahfinalarabic = 65222; - e.zahinitialarabic = 65223; - e.zahiragana = 12374; - e.zahmedialarabic = 65224; - e.zainarabic = 1586; - e.zainfinalarabic = 65200; - e.zakatakana = 12470; - e.zaqefgadolhebrew = 1429; - e.zaqefqatanhebrew = 1428; - e.zarqahebrew = 1432; - e.zayin = 1494; - e.zayindagesh = 64310; - e.zayindageshhebrew = 64310; - e.zayinhebrew = 1494; - e.zbopomofo = 12567; - e.zcaron = 382; - e.zcircle = 9449; - e.zcircumflex = 7825; - e.zcurl = 657; - e.zdot = 380; - e.zdotaccent = 380; - e.zdotbelow = 7827; - e.zecyrillic = 1079; - e.zedescendercyrillic = 1177; - e.zedieresiscyrillic = 1247; - e.zehiragana = 12380; - e.zekatakana = 12476; - e.zero = 48; - e.zeroarabic = 1632; - e.zerobengali = 2534; - e.zerodeva = 2406; - e.zerogujarati = 2790; - e.zerogurmukhi = 2662; - e.zerohackarabic = 1632; - e.zeroinferior = 8320; - e.zeromonospace = 65296; - e.zerooldstyle = 63280; - e.zeropersian = 1776; - e.zerosuperior = 8304; - e.zerothai = 3664; - e.zerowidthjoiner = 65279; - e.zerowidthnonjoiner = 8204; - e.zerowidthspace = 8203; - e.zeta = 950; - e.zhbopomofo = 12563; - e.zhearmenian = 1386; - e.zhebrevecyrillic = 1218; - e.zhecyrillic = 1078; - e.zhedescendercyrillic = 1175; - e.zhedieresiscyrillic = 1245; - e.zihiragana = 12376; - e.zikatakana = 12472; - e.zinorhebrew = 1454; - e.zlinebelow = 7829; - e.zmonospace = 65370; - e.zohiragana = 12382; - e.zokatakana = 12478; - e.zparen = 9397; - e.zretroflexhook = 656; - e.zstroke = 438; - e.zuhiragana = 12378; - e.zukatakana = 12474; - e[".notdef"] = 0; - e.angbracketleftbig = 9001; - e.angbracketleftBig = 9001; - e.angbracketleftbigg = 9001; - e.angbracketleftBigg = 9001; - e.angbracketrightBig = 9002; - e.angbracketrightbig = 9002; - e.angbracketrightBigg = 9002; - e.angbracketrightbigg = 9002; - e.arrowhookleft = 8618; - e.arrowhookright = 8617; - e.arrowlefttophalf = 8636; - e.arrowleftbothalf = 8637; - e.arrownortheast = 8599; - e.arrownorthwest = 8598; - e.arrowrighttophalf = 8640; - e.arrowrightbothalf = 8641; - e.arrowsoutheast = 8600; - e.arrowsouthwest = 8601; - e.backslashbig = 8726; - e.backslashBig = 8726; - e.backslashBigg = 8726; - e.backslashbigg = 8726; - e.bardbl = 8214; - e.bracehtipdownleft = 65079; - e.bracehtipdownright = 65079; - e.bracehtipupleft = 65080; - e.bracehtipupright = 65080; - e.braceleftBig = 123; - e.braceleftbig = 123; - e.braceleftbigg = 123; - e.braceleftBigg = 123; - e.bracerightBig = 125; - e.bracerightbig = 125; - e.bracerightbigg = 125; - e.bracerightBigg = 125; - e.bracketleftbig = 91; - e.bracketleftBig = 91; - e.bracketleftbigg = 91; - e.bracketleftBigg = 91; - e.bracketrightBig = 93; - e.bracketrightbig = 93; - e.bracketrightbigg = 93; - e.bracketrightBigg = 93; - e.ceilingleftbig = 8968; - e.ceilingleftBig = 8968; - e.ceilingleftBigg = 8968; - e.ceilingleftbigg = 8968; - e.ceilingrightbig = 8969; - e.ceilingrightBig = 8969; - e.ceilingrightbigg = 8969; - e.ceilingrightBigg = 8969; - e.circledotdisplay = 8857; - e.circledottext = 8857; - e.circlemultiplydisplay = 8855; - e.circlemultiplytext = 8855; - e.circleplusdisplay = 8853; - e.circleplustext = 8853; - e.contintegraldisplay = 8750; - e.contintegraltext = 8750; - e.coproductdisplay = 8720; - e.coproducttext = 8720; - e.floorleftBig = 8970; - e.floorleftbig = 8970; - e.floorleftbigg = 8970; - e.floorleftBigg = 8970; - e.floorrightbig = 8971; - e.floorrightBig = 8971; - e.floorrightBigg = 8971; - e.floorrightbigg = 8971; - e.hatwide = 770; - e.hatwider = 770; - e.hatwidest = 770; - e.intercal = 7488; - e.integraldisplay = 8747; - e.integraltext = 8747; - e.intersectiondisplay = 8898; - e.intersectiontext = 8898; - e.logicalanddisplay = 8743; - e.logicalandtext = 8743; - e.logicalordisplay = 8744; - e.logicalortext = 8744; - e.parenleftBig = 40; - e.parenleftbig = 40; - e.parenleftBigg = 40; - e.parenleftbigg = 40; - e.parenrightBig = 41; - e.parenrightbig = 41; - e.parenrightBigg = 41; - e.parenrightbigg = 41; - e.prime = 8242; - e.productdisplay = 8719; - e.producttext = 8719; - e.radicalbig = 8730; - e.radicalBig = 8730; - e.radicalBigg = 8730; - e.radicalbigg = 8730; - e.radicalbt = 8730; - e.radicaltp = 8730; - e.radicalvertex = 8730; - e.slashbig = 47; - e.slashBig = 47; - e.slashBigg = 47; - e.slashbigg = 47; - e.summationdisplay = 8721; - e.summationtext = 8721; - e.tildewide = 732; - e.tildewider = 732; - e.tildewidest = 732; - e.uniondisplay = 8899; - e.unionmultidisplay = 8846; - e.unionmultitext = 8846; - e.unionsqdisplay = 8852; - e.unionsqtext = 8852; - e.uniontext = 8899; - e.vextenddouble = 8741; - e.vextendsingle = 8739; - }), - Gi = getLookupTableFactory(function (e) { - e.space = 32; - e.a1 = 9985; - e.a2 = 9986; - e.a202 = 9987; - e.a3 = 9988; - e.a4 = 9742; - e.a5 = 9990; - e.a119 = 9991; - e.a118 = 9992; - e.a117 = 9993; - e.a11 = 9755; - e.a12 = 9758; - e.a13 = 9996; - e.a14 = 9997; - e.a15 = 9998; - e.a16 = 9999; - e.a105 = 1e4; - e.a17 = 10001; - e.a18 = 10002; - e.a19 = 10003; - e.a20 = 10004; - e.a21 = 10005; - e.a22 = 10006; - e.a23 = 10007; - e.a24 = 10008; - e.a25 = 10009; - e.a26 = 10010; - e.a27 = 10011; - e.a28 = 10012; - e.a6 = 10013; - e.a7 = 10014; - e.a8 = 10015; - e.a9 = 10016; - e.a10 = 10017; - e.a29 = 10018; - e.a30 = 10019; - e.a31 = 10020; - e.a32 = 10021; - e.a33 = 10022; - e.a34 = 10023; - e.a35 = 9733; - e.a36 = 10025; - e.a37 = 10026; - e.a38 = 10027; - e.a39 = 10028; - e.a40 = 10029; - e.a41 = 10030; - e.a42 = 10031; - e.a43 = 10032; - e.a44 = 10033; - e.a45 = 10034; - e.a46 = 10035; - e.a47 = 10036; - e.a48 = 10037; - e.a49 = 10038; - e.a50 = 10039; - e.a51 = 10040; - e.a52 = 10041; - e.a53 = 10042; - e.a54 = 10043; - e.a55 = 10044; - e.a56 = 10045; - e.a57 = 10046; - e.a58 = 10047; - e.a59 = 10048; - e.a60 = 10049; - e.a61 = 10050; - e.a62 = 10051; - e.a63 = 10052; - e.a64 = 10053; - e.a65 = 10054; - e.a66 = 10055; - e.a67 = 10056; - e.a68 = 10057; - e.a69 = 10058; - e.a70 = 10059; - e.a71 = 9679; - e.a72 = 10061; - e.a73 = 9632; - e.a74 = 10063; - e.a203 = 10064; - e.a75 = 10065; - e.a204 = 10066; - e.a76 = 9650; - e.a77 = 9660; - e.a78 = 9670; - e.a79 = 10070; - e.a81 = 9687; - e.a82 = 10072; - e.a83 = 10073; - e.a84 = 10074; - e.a97 = 10075; - e.a98 = 10076; - e.a99 = 10077; - e.a100 = 10078; - e.a101 = 10081; - e.a102 = 10082; - e.a103 = 10083; - e.a104 = 10084; - e.a106 = 10085; - e.a107 = 10086; - e.a108 = 10087; - e.a112 = 9827; - e.a111 = 9830; - e.a110 = 9829; - e.a109 = 9824; - e.a120 = 9312; - e.a121 = 9313; - e.a122 = 9314; - e.a123 = 9315; - e.a124 = 9316; - e.a125 = 9317; - e.a126 = 9318; - e.a127 = 9319; - e.a128 = 9320; - e.a129 = 9321; - e.a130 = 10102; - e.a131 = 10103; - e.a132 = 10104; - e.a133 = 10105; - e.a134 = 10106; - e.a135 = 10107; - e.a136 = 10108; - e.a137 = 10109; - e.a138 = 10110; - e.a139 = 10111; - e.a140 = 10112; - e.a141 = 10113; - e.a142 = 10114; - e.a143 = 10115; - e.a144 = 10116; - e.a145 = 10117; - e.a146 = 10118; - e.a147 = 10119; - e.a148 = 10120; - e.a149 = 10121; - e.a150 = 10122; - e.a151 = 10123; - e.a152 = 10124; - e.a153 = 10125; - e.a154 = 10126; - e.a155 = 10127; - e.a156 = 10128; - e.a157 = 10129; - e.a158 = 10130; - e.a159 = 10131; - e.a160 = 10132; - e.a161 = 8594; - e.a163 = 8596; - e.a164 = 8597; - e.a196 = 10136; - e.a165 = 10137; - e.a192 = 10138; - e.a166 = 10139; - e.a167 = 10140; - e.a168 = 10141; - e.a169 = 10142; - e.a170 = 10143; - e.a171 = 10144; - e.a172 = 10145; - e.a173 = 10146; - e.a162 = 10147; - e.a174 = 10148; - e.a175 = 10149; - e.a176 = 10150; - e.a177 = 10151; - e.a178 = 10152; - e.a179 = 10153; - e.a193 = 10154; - e.a180 = 10155; - e.a199 = 10156; - e.a181 = 10157; - e.a200 = 10158; - e.a182 = 10159; - e.a201 = 10161; - e.a183 = 10162; - e.a184 = 10163; - e.a197 = 10164; - e.a185 = 10165; - e.a194 = 10166; - e.a198 = 10167; - e.a186 = 10168; - e.a195 = 10169; - e.a187 = 10170; - e.a188 = 10171; - e.a189 = 10172; - e.a190 = 10173; - e.a191 = 10174; - e.a89 = 10088; - e.a90 = 10089; - e.a93 = 10090; - e.a94 = 10091; - e.a91 = 10092; - e.a92 = 10093; - e.a205 = 10094; - e.a85 = 10095; - e.a206 = 10096; - e.a86 = 10097; - e.a87 = 10098; - e.a88 = 10099; - e.a95 = 10100; - e.a96 = 10101; - e[".notdef"] = 0; - }), - xi = getLookupTableFactory(function (e) { - e[63721] = 169; - e[63193] = 169; - e[63720] = 174; - e[63194] = 174; - e[63722] = 8482; - e[63195] = 8482; - e[63729] = 9127; - e[63730] = 9128; - e[63731] = 9129; - e[63740] = 9131; - e[63741] = 9132; - e[63742] = 9133; - e[63726] = 9121; - e[63727] = 9122; - e[63728] = 9123; - e[63737] = 9124; - e[63738] = 9125; - e[63739] = 9126; - e[63723] = 9115; - e[63724] = 9116; - e[63725] = 9117; - e[63734] = 9118; - e[63735] = 9119; - e[63736] = 9120; - }); -function getUnicodeForGlyph(e, t) { - let i = t[e]; - if (void 0 !== i) return i; - if (!e) return -1; - if ("u" === e[0]) { - const t = e.length; - let a; - if (7 === t && "n" === e[1] && "i" === e[2]) a = e.substring(3); - else { - if (!(t >= 5 && t <= 7)) return -1; - a = e.substring(1); + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; } - if (a === a.toUpperCase()) { - i = parseInt(a, 16); - if (i >= 0) return i; - } - } - return -1; -} -const Mi = [ - [0, 127], - [128, 255], - [256, 383], - [384, 591], - [592, 687, 7424, 7551, 7552, 7615], - [688, 767, 42752, 42783], - [768, 879, 7616, 7679], - [880, 1023], - [11392, 11519], - [1024, 1279, 1280, 1327, 11744, 11775, 42560, 42655], - [1328, 1423], - [1424, 1535], - [42240, 42559], - [1536, 1791, 1872, 1919], - [1984, 2047], - [2304, 2431], - [2432, 2559], - [2560, 2687], - [2688, 2815], - [2816, 2943], - [2944, 3071], - [3072, 3199], - [3200, 3327], - [3328, 3455], - [3584, 3711], - [3712, 3839], - [4256, 4351, 11520, 11567], - [6912, 7039], - [4352, 4607], - [7680, 7935, 11360, 11391, 42784, 43007], - [7936, 8191], - [8192, 8303, 11776, 11903], - [8304, 8351], - [8352, 8399], - [8400, 8447], - [8448, 8527], - [8528, 8591], - [8592, 8703, 10224, 10239, 10496, 10623, 11008, 11263], - [8704, 8959, 10752, 11007, 10176, 10223, 10624, 10751], - [8960, 9215], - [9216, 9279], - [9280, 9311], - [9312, 9471], - [9472, 9599], - [9600, 9631], - [9632, 9727], - [9728, 9983], - [9984, 10175], - [12288, 12351], - [12352, 12447], - [12448, 12543, 12784, 12799], - [12544, 12591, 12704, 12735], - [12592, 12687], - [43072, 43135], - [12800, 13055], - [13056, 13311], - [44032, 55215], - [55296, 57343], - [67840, 67871], - [ - 19968, 40959, 11904, 12031, 12032, 12255, 12272, 12287, 13312, 19903, - 131072, 173791, 12688, 12703, - ], - [57344, 63743], - [12736, 12783, 63744, 64255, 194560, 195103], - [64256, 64335], - [64336, 65023], - [65056, 65071], - [65040, 65055], - [65104, 65135], - [65136, 65279], - [65280, 65519], - [65520, 65535], - [3840, 4095], - [1792, 1871], - [1920, 1983], - [3456, 3583], - [4096, 4255], - [4608, 4991, 4992, 5023, 11648, 11743], - [5024, 5119], - [5120, 5759], - [5760, 5791], - [5792, 5887], - [6016, 6143], - [6144, 6319], - [10240, 10495], - [40960, 42127], - [5888, 5919, 5920, 5951, 5952, 5983, 5984, 6015], - [66304, 66351], - [66352, 66383], - [66560, 66639], - [118784, 119039, 119040, 119295, 119296, 119375], - [119808, 120831], - [1044480, 1048573], - [65024, 65039, 917760, 917999], - [917504, 917631], - [6400, 6479], - [6480, 6527], - [6528, 6623], - [6656, 6687], - [11264, 11359], - [11568, 11647], - [19904, 19967], - [43008, 43055], - [65536, 65663, 65664, 65791, 65792, 65855], - [65856, 65935], - [66432, 66463], - [66464, 66527], - [66640, 66687], - [66688, 66735], - [67584, 67647], - [68096, 68191], - [119552, 119647], - [73728, 74751, 74752, 74879], - [119648, 119679], - [7040, 7103], - [7168, 7247], - [7248, 7295], - [43136, 43231], - [43264, 43311], - [43312, 43359], - [43520, 43615], - [65936, 65999], - [66e3, 66047], - [66208, 66271, 66176, 66207, 67872, 67903], - [127024, 127135, 126976, 127023], -]; -function getUnicodeRangeFor(e, t = -1) { - if (-1 !== t) { - const i = Mi[t]; - for (let a = 0, s = i.length; a < s; a += 2) - if (e >= i[a] && e <= i[a + 1]) return t; - } - for (let t = 0, i = Mi.length; t < i; t++) { - const i = Mi[t]; - for (let a = 0, s = i.length; a < s; a += 2) - if (e >= i[a] && e <= i[a + 1]) return t; - } - return -1; -} -const Hi = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"), - Ji = new Map(); -const Yi = !0, - vi = 1, - Ki = 2, - Ti = 4, - qi = 32, - Oi = [ - ".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", - ]; -function recoverGlyphName(e, t) { - if (void 0 !== t[e]) return e; - const i = getUnicodeForGlyph(e, t); - if (-1 !== i) for (const e in t) if (t[e] === i) return e; - info("Unable to recover a standard glyph name for: " + e); - return e; -} -function type1FontGlyphMapping(e, t, i) { - const a = Object.create(null); - let s, r, n; - const g = !!(e.flags & Ti); - if (e.isInternalFont) { - n = t; - for (r = 0; r < n.length; r++) { - s = i.indexOf(n[r]); - a[r] = s >= 0 ? s : 0; - } - } else if (e.baseEncodingName) { - n = getEncoding(e.baseEncodingName); - for (r = 0; r < n.length; r++) { - s = i.indexOf(n[r]); - a[r] = s >= 0 ? s : 0; - } - } else if (g) for (r in t) a[r] = t[r]; - else { - n = fi; - for (r = 0; r < n.length; r++) { - s = i.indexOf(n[r]); - a[r] = s >= 0 ? s : 0; - } - } - const o = e.differences; - let c; - if (o) - for (r in o) { - const e = o[r]; - s = i.indexOf(e); - if (-1 === s) { - c || (c = Ni()); - const t = recoverGlyphName(e, c); - t !== e && (s = i.indexOf(t)); + data.push(offsetSize); + let 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; } - a[r] = s >= 0 ? s : 0; } - return a; + for (i = 0; i < count; i++) { + if (trackers[i]) { + trackers[i].offset(data.length); + } + data.push(...objects[i]); + } + return data; + } +} // ./src/core/glyphlist.js + +const 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.f_f_i = 0xfb03; + t.ffl = 0xfb04; + t.f_f_l = 0xfb04; + t.fi = 0xfb01; + t.f_i = 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.f_l = 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.planckover2pi = 0x210f; + t.planckover2pi1 = 0x210f; + 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; +}); +const 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; +}); // ./src/core/unicode.js + +const 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 normalizeFontName(e) { - return e.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); +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 { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; } -const Pi = getLookupTableFactory(function (e) { - e["Times-Roman"] = "Times-Roman"; - e.Helvetica = "Helvetica"; - e.Courier = "Courier"; - e.Symbol = "Symbol"; - e["Times-Bold"] = "Times-Bold"; - e["Helvetica-Bold"] = "Helvetica-Bold"; - e["Courier-Bold"] = "Courier-Bold"; - e.ZapfDingbats = "ZapfDingbats"; - e["Times-Italic"] = "Times-Italic"; - e["Helvetica-Oblique"] = "Helvetica-Oblique"; - e["Courier-Oblique"] = "Courier-Oblique"; - e["Times-BoldItalic"] = "Times-BoldItalic"; - e["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; - e["Courier-BoldOblique"] = "Courier-BoldOblique"; - e.ArialNarrow = "Helvetica"; - e["ArialNarrow-Bold"] = "Helvetica-Bold"; - e["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; - e["ArialNarrow-Italic"] = "Helvetica-Oblique"; - e.ArialBlack = "Helvetica"; - e["ArialBlack-Bold"] = "Helvetica-Bold"; - e["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; - e["ArialBlack-Italic"] = "Helvetica-Oblique"; - e["Arial-Black"] = "Helvetica"; - e["Arial-Black-Bold"] = "Helvetica-Bold"; - e["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; - e["Arial-Black-Italic"] = "Helvetica-Oblique"; - e.Arial = "Helvetica"; - e["Arial-Bold"] = "Helvetica-Bold"; - e["Arial-BoldItalic"] = "Helvetica-BoldOblique"; - e["Arial-Italic"] = "Helvetica-Oblique"; - e.ArialMT = "Helvetica"; - e["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; - e["Arial-BoldMT"] = "Helvetica-Bold"; - e["Arial-ItalicMT"] = "Helvetica-Oblique"; - e["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; - e["Arial-BoldMT-Bold"] = "Helvetica-Bold"; - e["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; - e.ArialUnicodeMS = "Helvetica"; - e["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; - e["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; - e["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; - e["Courier-BoldItalic"] = "Courier-BoldOblique"; - e["Courier-Italic"] = "Courier-Oblique"; - e.CourierNew = "Courier"; - e["CourierNew-Bold"] = "Courier-Bold"; - e["CourierNew-BoldItalic"] = "Courier-BoldOblique"; - e["CourierNew-Italic"] = "Courier-Oblique"; - e["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; - e["CourierNewPS-BoldMT"] = "Courier-Bold"; - e["CourierNewPS-ItalicMT"] = "Courier-Oblique"; - e.CourierNewPSMT = "Courier"; - e["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; - e["Helvetica-Italic"] = "Helvetica-Oblique"; - e["Symbol-Bold"] = "Symbol"; - e["Symbol-BoldItalic"] = "Symbol"; - e["Symbol-Italic"] = "Symbol"; - e.TimesNewRoman = "Times-Roman"; - e["TimesNewRoman-Bold"] = "Times-Bold"; - e["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; - e["TimesNewRoman-Italic"] = "Times-Italic"; - e.TimesNewRomanPS = "Times-Roman"; - e["TimesNewRomanPS-Bold"] = "Times-Bold"; - e["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; - e["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; - e["TimesNewRomanPS-BoldMT"] = "Times-Bold"; - e["TimesNewRomanPS-Italic"] = "Times-Italic"; - e["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; - e.TimesNewRomanPSMT = "Times-Roman"; - e["TimesNewRomanPSMT-Bold"] = "Times-Bold"; - e["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; - e["TimesNewRomanPSMT-Italic"] = "Times-Italic"; - }), - Wi = getLookupTableFactory(function (e) { - e.Courier = "FoxitFixed.pfb"; - e["Courier-Bold"] = "FoxitFixedBold.pfb"; - e["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; - e["Courier-Oblique"] = "FoxitFixedItalic.pfb"; - e.Helvetica = "LiberationSans-Regular.ttf"; - e["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; - e["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; - e["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; - e["Times-Roman"] = "FoxitSerif.pfb"; - e["Times-Bold"] = "FoxitSerifBold.pfb"; - e["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; - e["Times-Italic"] = "FoxitSerifItalic.pfb"; - e.Symbol = "FoxitSymbol.pfb"; - e.ZapfDingbats = "FoxitDingbats.pfb"; - e["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; - e["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; - e["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; - e["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; - }), - ji = getLookupTableFactory(function (e) { - e.Calibri = "Helvetica"; - e["Calibri-Bold"] = "Helvetica-Bold"; - e["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; - e["Calibri-Italic"] = "Helvetica-Oblique"; - e.CenturyGothic = "Helvetica"; - e["CenturyGothic-Bold"] = "Helvetica-Bold"; - e["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; - e["CenturyGothic-Italic"] = "Helvetica-Oblique"; - e.ComicSansMS = "Comic Sans MS"; - e["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; - e["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; - e["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; - e.Impact = "Helvetica"; - e["ItcSymbol-Bold"] = "Helvetica-Bold"; - e["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; - e["ItcSymbol-Book"] = "Helvetica"; - e["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; - e["ItcSymbol-Medium"] = "Helvetica"; - e["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; - e.LucidaConsole = "Courier"; - e["LucidaConsole-Bold"] = "Courier-Bold"; - e["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; - e["LucidaConsole-Italic"] = "Courier-Oblique"; - e["LucidaSans-Demi"] = "Helvetica-Bold"; - e["MS-Gothic"] = "MS Gothic"; - e["MS-Gothic-Bold"] = "MS Gothic-Bold"; - e["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; - e["MS-Gothic-Italic"] = "MS Gothic-Italic"; - e["MS-Mincho"] = "MS Mincho"; - e["MS-Mincho-Bold"] = "MS Mincho-Bold"; - e["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; - e["MS-Mincho-Italic"] = "MS Mincho-Italic"; - e["MS-PGothic"] = "MS PGothic"; - e["MS-PGothic-Bold"] = "MS PGothic-Bold"; - e["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; - e["MS-PGothic-Italic"] = "MS PGothic-Italic"; - e["MS-PMincho"] = "MS PMincho"; - e["MS-PMincho-Bold"] = "MS PMincho-Bold"; - e["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; - e["MS-PMincho-Italic"] = "MS PMincho-Italic"; - e.NuptialScript = "Times-Italic"; - e.SegoeUISymbol = "Helvetica"; - }), - Xi = getLookupTableFactory(function (e) { - e["Adobe Jenson"] = !0; - e["Adobe Text"] = !0; - e.Albertus = !0; - e.Aldus = !0; - e.Alexandria = !0; - e.Algerian = !0; - e["American Typewriter"] = !0; - e.Antiqua = !0; - e.Apex = !0; - e.Arno = !0; - e.Aster = !0; - e.Aurora = !0; - e.Baskerville = !0; - e.Bell = !0; - e.Bembo = !0; - e["Bembo Schoolbook"] = !0; - e.Benguiat = !0; - e["Berkeley Old Style"] = !0; - e["Bernhard Modern"] = !0; - e["Berthold City"] = !0; - e.Bodoni = !0; - e["Bauer Bodoni"] = !0; - e["Book Antiqua"] = !0; - e.Bookman = !0; - e["Bordeaux Roman"] = !0; - e["Californian FB"] = !0; - e.Calisto = !0; - e.Calvert = !0; - e.Capitals = !0; - e.Cambria = !0; - e.Cartier = !0; - e.Caslon = !0; - e.Catull = !0; - e.Centaur = !0; - e["Century Old Style"] = !0; - e["Century Schoolbook"] = !0; - e.Chaparral = !0; - e["Charis SIL"] = !0; - e.Cheltenham = !0; - e["Cholla Slab"] = !0; - e.Clarendon = !0; - e.Clearface = !0; - e.Cochin = !0; - e.Colonna = !0; - e["Computer Modern"] = !0; - e["Concrete Roman"] = !0; - e.Constantia = !0; - e["Cooper Black"] = !0; - e.Corona = !0; - e.Ecotype = !0; - e.Egyptienne = !0; - e.Elephant = !0; - e.Excelsior = !0; - e.Fairfield = !0; - e["FF Scala"] = !0; - e.Folkard = !0; - e.Footlight = !0; - e.FreeSerif = !0; - e["Friz Quadrata"] = !0; - e.Garamond = !0; - e.Gentium = !0; - e.Georgia = !0; - e.Gloucester = !0; - e["Goudy Old Style"] = !0; - e["Goudy Schoolbook"] = !0; - e["Goudy Pro Font"] = !0; - e.Granjon = !0; - e["Guardian Egyptian"] = !0; - e.Heather = !0; - e.Hercules = !0; - e["High Tower Text"] = !0; - e.Hiroshige = !0; - e["Hoefler Text"] = !0; - e["Humana Serif"] = !0; - e.Imprint = !0; - e["Ionic No. 5"] = !0; - e.Janson = !0; - e.Joanna = !0; - e.Korinna = !0; - e.Lexicon = !0; - e.LiberationSerif = !0; - e["Liberation Serif"] = !0; - e["Linux Libertine"] = !0; - e.Literaturnaya = !0; - e.Lucida = !0; - e["Lucida Bright"] = !0; - e.Melior = !0; - e.Memphis = !0; - e.Miller = !0; - e.Minion = !0; - e.Modern = !0; - e["Mona Lisa"] = !0; - e["Mrs Eaves"] = !0; - e["MS Serif"] = !0; - e["Museo Slab"] = !0; - e["New York"] = !0; - e["Nimbus Roman"] = !0; - e["NPS Rawlinson Roadway"] = !0; - e.NuptialScript = !0; - e.Palatino = !0; - e.Perpetua = !0; - e.Plantin = !0; - e["Plantin Schoolbook"] = !0; - e.Playbill = !0; - e["Poor Richard"] = !0; - e["Rawlinson Roadway"] = !0; - e.Renault = !0; - e.Requiem = !0; - e.Rockwell = !0; - e.Roman = !0; - e["Rotis Serif"] = !0; - e.Sabon = !0; - e.Scala = !0; - e.Seagull = !0; - e.Sistina = !0; - e.Souvenir = !0; - e.STIX = !0; - e["Stone Informal"] = !0; - e["Stone Serif"] = !0; - e.Sylfaen = !0; - e.Times = !0; - e.Trajan = !0; - e["Trinité"] = !0; - e["Trump Mediaeval"] = !0; - e.Utopia = !0; - e["Vale Type"] = !0; - e["Bitstream Vera"] = !0; - e["Vera Serif"] = !0; - e.Versailles = !0; - e.Wanted = !0; - e.Weiss = !0; - e["Wide Latin"] = !0; - e.Windsor = !0; - e.XITS = !0; - }), - Zi = getLookupTableFactory(function (e) { - e.Dingbats = !0; - e.Symbol = !0; - e.ZapfDingbats = !0; - e.Wingdings = !0; - e["Wingdings-Bold"] = !0; - e["Wingdings-Regular"] = !0; - }), - Vi = getLookupTableFactory(function (e) { - e[2] = 10; - e[3] = 32; - e[4] = 33; - e[5] = 34; - e[6] = 35; - e[7] = 36; - e[8] = 37; - e[9] = 38; - e[10] = 39; - e[11] = 40; - e[12] = 41; - e[13] = 42; - e[14] = 43; - e[15] = 44; - e[16] = 45; - e[17] = 46; - e[18] = 47; - e[19] = 48; - e[20] = 49; - e[21] = 50; - e[22] = 51; - e[23] = 52; - e[24] = 53; - e[25] = 54; - e[26] = 55; - e[27] = 56; - e[28] = 57; - e[29] = 58; - e[30] = 894; - e[31] = 60; - e[32] = 61; - e[33] = 62; - e[34] = 63; - e[35] = 64; - e[36] = 65; - e[37] = 66; - e[38] = 67; - e[39] = 68; - e[40] = 69; - e[41] = 70; - e[42] = 71; - e[43] = 72; - e[44] = 73; - e[45] = 74; - e[46] = 75; - e[47] = 76; - e[48] = 77; - e[49] = 78; - e[50] = 79; - e[51] = 80; - e[52] = 81; - e[53] = 82; - e[54] = 83; - e[55] = 84; - e[56] = 85; - e[57] = 86; - e[58] = 87; - e[59] = 88; - e[60] = 89; - e[61] = 90; - e[62] = 91; - e[63] = 92; - e[64] = 93; - e[65] = 94; - e[66] = 95; - e[67] = 96; - e[68] = 97; - e[69] = 98; - e[70] = 99; - e[71] = 100; - e[72] = 101; - e[73] = 102; - e[74] = 103; - e[75] = 104; - e[76] = 105; - e[77] = 106; - e[78] = 107; - e[79] = 108; - e[80] = 109; - e[81] = 110; - e[82] = 111; - e[83] = 112; - e[84] = 113; - e[85] = 114; - e[86] = 115; - e[87] = 116; - e[88] = 117; - e[89] = 118; - e[90] = 119; - e[91] = 120; - e[92] = 121; - e[93] = 122; - e[94] = 123; - e[95] = 124; - e[96] = 125; - e[97] = 126; - e[98] = 196; - e[99] = 197; - e[100] = 199; - e[101] = 201; - e[102] = 209; - e[103] = 214; - e[104] = 220; - e[105] = 225; - e[106] = 224; - e[107] = 226; - e[108] = 228; - e[109] = 227; - e[110] = 229; - e[111] = 231; - e[112] = 233; - e[113] = 232; - e[114] = 234; - e[115] = 235; - e[116] = 237; - e[117] = 236; - e[118] = 238; - e[119] = 239; - e[120] = 241; - e[121] = 243; - e[122] = 242; - e[123] = 244; - e[124] = 246; - e[125] = 245; - e[126] = 250; - e[127] = 249; - e[128] = 251; - e[129] = 252; - e[130] = 8224; - e[131] = 176; - e[132] = 162; - e[133] = 163; - e[134] = 167; - e[135] = 8226; - e[136] = 182; - e[137] = 223; - e[138] = 174; - e[139] = 169; - e[140] = 8482; - e[141] = 180; - e[142] = 168; - e[143] = 8800; - e[144] = 198; - e[145] = 216; - e[146] = 8734; - e[147] = 177; - e[148] = 8804; - e[149] = 8805; - e[150] = 165; - e[151] = 181; - e[152] = 8706; - e[153] = 8721; - e[154] = 8719; - e[156] = 8747; - e[157] = 170; - e[158] = 186; - e[159] = 8486; - e[160] = 230; - e[161] = 248; - e[162] = 191; - e[163] = 161; - e[164] = 172; - e[165] = 8730; - e[166] = 402; - e[167] = 8776; - e[168] = 8710; - e[169] = 171; - e[170] = 187; - e[171] = 8230; - e[179] = 8220; - e[180] = 8221; - e[181] = 8216; - e[182] = 8217; - e[200] = 193; - e[203] = 205; - e[207] = 211; - e[210] = 218; - e[223] = 711; - e[224] = 321; - e[225] = 322; - e[226] = 352; - e[227] = 353; - e[228] = 381; - e[229] = 382; - e[233] = 221; - e[234] = 253; - e[252] = 263; - e[253] = 268; - e[254] = 269; - e[258] = 258; - e[260] = 260; - e[261] = 261; - e[265] = 280; - e[266] = 281; - e[267] = 282; - e[268] = 283; - e[269] = 313; - e[275] = 323; - e[276] = 324; - e[278] = 328; - e[283] = 344; - e[284] = 345; - e[285] = 346; - e[286] = 347; - e[292] = 367; - e[295] = 377; - e[296] = 378; - e[298] = 380; - e[305] = 963; - e[306] = 964; - e[307] = 966; - e[308] = 8215; - e[309] = 8252; - e[310] = 8319; - e[311] = 8359; - e[312] = 8592; - e[313] = 8593; - e[337] = 9552; - e[493] = 1039; - e[494] = 1040; - e[672] = 1488; - e[673] = 1489; - e[674] = 1490; - e[675] = 1491; - e[676] = 1492; - e[677] = 1493; - e[678] = 1494; - e[679] = 1495; - e[680] = 1496; - e[681] = 1497; - e[682] = 1498; - e[683] = 1499; - e[684] = 1500; - e[685] = 1501; - e[686] = 1502; - e[687] = 1503; - e[688] = 1504; - e[689] = 1505; - e[690] = 1506; - e[691] = 1507; - e[692] = 1508; - e[693] = 1509; - e[694] = 1510; - e[695] = 1511; - e[696] = 1512; - e[697] = 1513; - e[698] = 1514; - e[705] = 1524; - e[706] = 8362; - e[710] = 64288; - e[711] = 64298; - e[759] = 1617; - e[761] = 1776; - e[763] = 1778; - e[775] = 1652; - e[777] = 1764; - e[778] = 1780; - e[779] = 1781; - e[780] = 1782; - e[782] = 771; - e[783] = 64726; - e[786] = 8363; - e[788] = 8532; - e[790] = 768; - e[791] = 769; - e[792] = 768; - e[795] = 803; - e[797] = 64336; - e[798] = 64337; - e[799] = 64342; - e[800] = 64343; - e[801] = 64344; - e[802] = 64345; - e[803] = 64362; - e[804] = 64363; - e[805] = 64364; - e[2424] = 7821; - e[2425] = 7822; - e[2426] = 7823; - e[2427] = 7824; - e[2428] = 7825; - e[2429] = 7826; - e[2430] = 7827; - e[2433] = 7682; - e[2678] = 8045; - e[2679] = 8046; - e[2830] = 1552; - e[2838] = 686; - e[2840] = 751; - e[2842] = 753; - e[2843] = 754; - e[2844] = 755; - e[2846] = 757; - e[2856] = 767; - e[2857] = 848; - e[2858] = 849; - e[2862] = 853; - e[2863] = 854; - e[2864] = 855; - e[2865] = 861; - e[2866] = 862; - e[2906] = 7460; - e[2908] = 7462; - e[2909] = 7463; - e[2910] = 7464; - e[2912] = 7466; - e[2913] = 7467; - e[2914] = 7468; - e[2916] = 7470; - e[2917] = 7471; - e[2918] = 7472; - e[2920] = 7474; - e[2921] = 7475; - e[2922] = 7476; - e[2924] = 7478; - e[2925] = 7479; - e[2926] = 7480; - e[2928] = 7482; - e[2929] = 7483; - e[2930] = 7484; - e[2932] = 7486; - e[2933] = 7487; - e[2934] = 7488; - e[2936] = 7490; - e[2937] = 7491; - e[2938] = 7492; - e[2940] = 7494; - e[2941] = 7495; - e[2942] = 7496; - e[2944] = 7498; - e[2946] = 7500; - e[2948] = 7502; - e[2950] = 7504; - e[2951] = 7505; - e[2952] = 7506; - e[2954] = 7508; - e[2955] = 7509; - e[2956] = 7510; - e[2958] = 7512; - e[2959] = 7513; - e[2960] = 7514; - e[2962] = 7516; - e[2963] = 7517; - e[2964] = 7518; - e[2966] = 7520; - e[2967] = 7521; - e[2968] = 7522; - e[2970] = 7524; - e[2971] = 7525; - e[2972] = 7526; - e[2974] = 7528; - e[2975] = 7529; - e[2976] = 7530; - e[2978] = 1537; - e[2979] = 1538; - e[2980] = 1539; - e[2982] = 1549; - e[2983] = 1551; - e[2984] = 1552; - e[2986] = 1554; - e[2987] = 1555; - e[2988] = 1556; - e[2990] = 1623; - e[2991] = 1624; - e[2995] = 1775; - e[2999] = 1791; - e[3002] = 64290; - e[3003] = 64291; - e[3004] = 64292; - e[3006] = 64294; - e[3007] = 64295; - e[3008] = 64296; - e[3011] = 1900; - e[3014] = 8223; - e[3015] = 8244; - e[3017] = 7532; - e[3018] = 7533; - e[3019] = 7534; - e[3075] = 7590; - e[3076] = 7591; - e[3079] = 7594; - e[3080] = 7595; - e[3083] = 7598; - e[3084] = 7599; - e[3087] = 7602; - e[3088] = 7603; - e[3091] = 7606; - e[3092] = 7607; - e[3095] = 7610; - e[3096] = 7611; - e[3099] = 7614; - e[3100] = 7615; - e[3103] = 7618; - e[3104] = 7619; - e[3107] = 8337; - e[3108] = 8338; - e[3116] = 1884; - e[3119] = 1885; - e[3120] = 1885; - e[3123] = 1886; - e[3124] = 1886; - e[3127] = 1887; - e[3128] = 1887; - e[3131] = 1888; - e[3132] = 1888; - e[3135] = 1889; - e[3136] = 1889; - e[3139] = 1890; - e[3140] = 1890; - e[3143] = 1891; - e[3144] = 1891; - e[3147] = 1892; - e[3148] = 1892; - e[3153] = 580; - e[3154] = 581; - e[3157] = 584; - e[3158] = 585; - e[3161] = 588; - e[3162] = 589; - e[3165] = 891; - e[3166] = 892; - e[3169] = 1274; - e[3170] = 1275; - e[3173] = 1278; - e[3174] = 1279; - e[3181] = 7622; - e[3182] = 7623; - e[3282] = 11799; - e[3316] = 578; - e[3379] = 42785; - e[3393] = 1159; - e[3416] = 8377; - }), - zi = getLookupTableFactory(function (e) { - e[227] = 322; - e[264] = 261; - e[291] = 346; - }), - _i = getLookupTableFactory(function (e) { - e[1] = 32; - e[4] = 65; - e[5] = 192; - e[6] = 193; - e[9] = 196; - e[17] = 66; - e[18] = 67; - e[21] = 268; - e[24] = 68; - e[28] = 69; - e[29] = 200; - e[30] = 201; - e[32] = 282; - e[38] = 70; - e[39] = 71; - e[44] = 72; - e[47] = 73; - e[48] = 204; - e[49] = 205; - e[58] = 74; - e[60] = 75; - e[62] = 76; - e[68] = 77; - e[69] = 78; - e[75] = 79; - e[76] = 210; - e[80] = 214; - e[87] = 80; - e[89] = 81; - e[90] = 82; - e[92] = 344; - e[94] = 83; - e[97] = 352; - e[100] = 84; - e[104] = 85; - e[109] = 220; - e[115] = 86; - e[116] = 87; - e[121] = 88; - e[122] = 89; - e[124] = 221; - e[127] = 90; - e[129] = 381; - e[258] = 97; - e[259] = 224; - e[260] = 225; - e[263] = 228; - e[268] = 261; - e[271] = 98; - e[272] = 99; - e[273] = 263; - e[275] = 269; - e[282] = 100; - e[286] = 101; - e[287] = 232; - e[288] = 233; - e[290] = 283; - e[295] = 281; - e[296] = 102; - e[336] = 103; - e[346] = 104; - e[349] = 105; - e[350] = 236; - e[351] = 237; - e[361] = 106; - e[364] = 107; - e[367] = 108; - e[371] = 322; - e[373] = 109; - e[374] = 110; - e[381] = 111; - e[382] = 242; - e[383] = 243; - e[386] = 246; - e[393] = 112; - e[395] = 113; - e[396] = 114; - e[398] = 345; - e[400] = 115; - e[401] = 347; - e[403] = 353; - e[410] = 116; - e[437] = 117; - e[442] = 252; - e[448] = 118; - e[449] = 119; - e[454] = 120; - e[455] = 121; - e[457] = 253; - e[460] = 122; - e[462] = 382; - e[463] = 380; - e[853] = 44; - e[855] = 58; - e[856] = 46; - e[876] = 47; - e[878] = 45; - e[882] = 45; - e[894] = 40; - e[895] = 41; - e[896] = 91; - e[897] = 93; - e[923] = 64; - e[1004] = 48; - e[1005] = 49; - e[1006] = 50; - e[1007] = 51; - e[1008] = 52; - e[1009] = 53; - e[1010] = 54; - e[1011] = 55; - e[1012] = 56; - e[1013] = 57; - e[1081] = 37; - e[1085] = 43; - e[1086] = 45; - }); -function getStandardFontName(e) { - const t = normalizeFontName(e); - return Pi()[t]; +const UnicodeRanges = [ + [0x0000, 0x007f], + [0x0080, 0x00ff], + [0x0100, 0x017f], + [0x0180, 0x024f], + [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], + [0x02b0, 0x02ff, 0xa700, 0xa71f], + [0x0300, 0x036f, 0x1dc0, 0x1dff], + [0x0370, 0x03ff], + [0x2c80, 0x2cff], + [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], + [0x0530, 0x058f], + [0x0590, 0x05ff], + [0xa500, 0xa63f], + [0x0600, 0x06ff, 0x0750, 0x077f], + [0x07c0, 0x07ff], + [0x0900, 0x097f], + [0x0980, 0x09ff], + [0x0a00, 0x0a7f], + [0x0a80, 0x0aff], + [0x0b00, 0x0b7f], + [0x0b80, 0x0bff], + [0x0c00, 0x0c7f], + [0x0c80, 0x0cff], + [0x0d00, 0x0d7f], + [0x0e00, 0x0e7f], + [0x0e80, 0x0eff], + [0x10a0, 0x10ff, 0x2d00, 0x2d2f], + [0x1b00, 0x1b7f], + [0x1100, 0x11ff], + [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], + [0x1f00, 0x1fff], + [0x2000, 0x206f, 0x2e00, 0x2e7f], + [0x2070, 0x209f], + [0x20a0, 0x20cf], + [0x20d0, 0x20ff], + [0x2100, 0x214f], + [0x2150, 0x218f], + [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], + [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], + [0x2300, 0x23ff], + [0x2400, 0x243f], + [0x2440, 0x245f], + [0x2460, 0x24ff], + [0x2500, 0x257f], + [0x2580, 0x259f], + [0x25a0, 0x25ff], + [0x2600, 0x26ff], + [0x2700, 0x27bf], + [0x3000, 0x303f], + [0x3040, 0x309f], + [0x30a0, 0x30ff, 0x31f0, 0x31ff], + [0x3100, 0x312f, 0x31a0, 0x31bf], + [0x3130, 0x318f], + [0xa840, 0xa87f], + [0x3200, 0x32ff], + [0x3300, 0x33ff], + [0xac00, 0xd7af], + [0xd800, 0xdfff], + [0x10900, 0x1091f], + [ + 0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, + 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f, + ], + [0xe000, 0xf8ff], + [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], + [0xfb00, 0xfb4f], + [0xfb50, 0xfdff], + [0xfe20, 0xfe2f], + [0xfe10, 0xfe1f], + [0xfe50, 0xfe6f], + [0xfe70, 0xfeff], + [0xff00, 0xffef], + [0xfff0, 0xffff], + [0x0f00, 0x0fff], + [0x0700, 0x074f], + [0x0780, 0x07bf], + [0x0d80, 0x0dff], + [0x1000, 0x109f], + [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], + [0x13a0, 0x13ff], + [0x1400, 0x167f], + [0x1680, 0x169f], + [0x16a0, 0x16ff], + [0x1780, 0x17ff], + [0x1800, 0x18af], + [0x2800, 0x28ff], + [0xa000, 0xa48f], + [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], + [0x10300, 0x1032f], + [0x10330, 0x1034f], + [0x10400, 0x1044f], + [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], + [0x1d400, 0x1d7ff], + [0xff000, 0xffffd], + [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], + [0xe0000, 0xe007f], + [0x1900, 0x194f], + [0x1950, 0x197f], + [0x1980, 0x19df], + [0x1a00, 0x1a1f], + [0x2c00, 0x2c5f], + [0x2d30, 0x2d7f], + [0x4dc0, 0x4dff], + [0xa800, 0xa82f], + [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], + [0x10140, 0x1018f], + [0x10380, 0x1039f], + [0x103a0, 0x103df], + [0x10450, 0x1047f], + [0x10480, 0x104af], + [0x10800, 0x1083f], + [0x10a00, 0x10a5f], + [0x1d300, 0x1d35f], + [0x12000, 0x123ff, 0x12400, 0x1247f], + [0x1d360, 0x1d37f], + [0x1b80, 0x1bbf], + [0x1c00, 0x1c4f], + [0x1c50, 0x1c7f], + [0xa880, 0xa8df], + [0xa900, 0xa92f], + [0xa930, 0xa95f], + [0xaa00, 0xaa5f], + [0x10190, 0x101cf], + [0x101d0, 0x101ff], + [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], + [0x1f030, 0x1f09f, 0x1f000, 0x1f02f], +]; +function getUnicodeRangeFor(value, lastPosition = -1) { + if (lastPosition !== -1) { + const range = UnicodeRanges[lastPosition]; + for (let i = 0, ii = range.length; i < ii; i += 2) { + if (value >= range[i] && value <= range[i + 1]) { + return lastPosition; + } + } + } + for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { + const range = UnicodeRanges[i]; + for (let j = 0, jj = range.length; j < jj; j += 2) { + if (value >= range[j] && value <= range[j + 1]) { + return i; + } + } + } + return -1; } -function isKnownFontName(e) { - const t = normalizeFontName(e); - return !!(Pi()[t] || ji()[t] || Xi()[t] || Zi()[t]); +const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); +const CategoryCache = new Map(); +function getCharUnicodeCategory(char) { + const cachedCategory = CategoryCache.get(char); + if (cachedCategory) { + return cachedCategory; + } + const groups = char.match(SpecialCharRegExp); + const category = { + isWhitespace: !!groups?.[1], + isZeroWidthDiacritic: !!groups?.[2], + isInvisibleFormatMark: !!groups?.[3], + }; + CategoryCache.set(char, category); + return category; } +function clearUnicodeCaches() { + CategoryCache.clear(); +} // ./src/core/fonts_utils.js + +const SEAC_ANALYSIS_ENABLED = true; +const FontFlags = { + FixedPitch: 1, + Serif: 2, + Symbolic: 4, + Script: 8, + Nonsymbolic: 32, + Italic: 64, + AllCap: 65536, + SmallCap: 131072, + ForceBold: 262144, +}; +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", +]; +function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (const key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + info("Unable to recover a standard glyph name for: " + name); + return name; +} +function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { + const charCodeToGlyphId = Object.create(null); + let glyphId, charCode, baseEncoding; + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.isInternalFont) { + baseEncoding = builtInEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (properties.baseEncodingName) { + baseEncoding = getEncoding(properties.baseEncodingName); + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } else if (isSymbolicFont) { + for (charCode in builtInEncoding) { + charCodeToGlyphId[charCode] = builtInEncoding[charCode]; + } + } else { + baseEncoding = StandardEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + const differences = properties.differences; + let glyphsUnicodeMap; + if (differences) { + for (charCode in differences) { + const glyphName = differences[charCode]; + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = getGlyphsUnicode(); + } + const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; + } + } + return charCodeToGlyphId; +} +function normalizeFontName(name) { + return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); +} +const getVerticalPresentationForm = getLookupTableFactory((t) => { + t[0x2013] = 0xfe32; + t[0x2014] = 0xfe31; + t[0x2025] = 0xfe30; + t[0x2026] = 0xfe19; + t[0x3001] = 0xfe11; + t[0x3002] = 0xfe12; + t[0x3008] = 0xfe3f; + t[0x3009] = 0xfe40; + t[0x300a] = 0xfe3d; + t[0x300b] = 0xfe3e; + t[0x300c] = 0xfe41; + t[0x300d] = 0xfe42; + t[0x300e] = 0xfe43; + t[0x300f] = 0xfe44; + t[0x3010] = 0xfe3b; + t[0x3011] = 0xfe3c; + t[0x3014] = 0xfe39; + t[0x3015] = 0xfe3a; + t[0x3016] = 0xfe17; + t[0x3017] = 0xfe18; + t[0xfe4f] = 0xfe34; + t[0xff01] = 0xfe15; + t[0xff08] = 0xfe35; + t[0xff09] = 0xfe36; + t[0xff0c] = 0xfe10; + t[0xff1a] = 0xfe13; + t[0xff1b] = 0xfe14; + t[0xff1f] = 0xfe16; + t[0xff3b] = 0xfe47; + t[0xff3d] = 0xfe48; + t[0xff3f] = 0xfe33; + t[0xff5b] = 0xfe37; + t[0xff5d] = 0xfe38; +}); // ./src/core/standard_fonts.js + +const getStdFontMap = 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.ArialMT = "Helvetica"; + t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT"] = "Helvetica-Bold"; + t["Arial-ItalicMT"] = "Helvetica-Oblique"; + t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; + t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; + t.ArialUnicodeMS = "Helvetica"; + t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; + t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; + t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; + 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"; +}); +const getFontNameToFileMap = getLookupTableFactory(function (t) { + t.Courier = "FoxitFixed.pfb"; + t["Courier-Bold"] = "FoxitFixedBold.pfb"; + t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; + t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; + t.Helvetica = "LiberationSans-Regular.ttf"; + t["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; + t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; + t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; + 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"; +}); +const getNonStdFontMap = 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.GillSansMT = "Helvetica"; + t["GillSansMT-Bold"] = "Helvetica-Bold"; + t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["GillSansMT-Italic"] = "Helvetica-Oblique"; + t.Impact = "Helvetica"; + t["ItcSymbol-Bold"] = "Helvetica-Bold"; + t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; + t["ItcSymbol-Book"] = "Helvetica"; + t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; + t["ItcSymbol-Medium"] = "Helvetica"; + t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; + 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"; +}); +const getSerifFonts = 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.LiberationSerif = 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; +}); +const getSymbolsFonts = getLookupTableFactory(function (t) { + t.Dingbats = true; + t.Symbol = true; + t.ZapfDingbats = true; + t.Wingdings = true; + t["Wingdings-Bold"] = true; + t["Wingdings-Regular"] = true; +}); +const getGlyphMapForStandardFonts = 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[179] = 8220; + t[180] = 8221; + t[181] = 8216; + t[182] = 8217; + t[200] = 193; + t[203] = 205; + t[207] = 211; + t[210] = 218; + t[223] = 711; + t[224] = 321; + t[225] = 322; + t[226] = 352; + t[227] = 353; + t[228] = 381; + t[229] = 382; + t[233] = 221; + 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[267] = 282; + t[268] = 283; + t[269] = 313; + t[275] = 323; + t[276] = 324; + t[278] = 328; + t[283] = 344; + 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[672] = 1488; + t[673] = 1489; + t[674] = 1490; + t[675] = 1491; + t[676] = 1492; + t[677] = 1493; + t[678] = 1494; + t[679] = 1495; + t[680] = 1496; + t[681] = 1497; + t[682] = 1498; + t[683] = 1499; + t[684] = 1500; + t[685] = 1501; + t[686] = 1502; + t[687] = 1503; + t[688] = 1504; + t[689] = 1505; + t[690] = 1506; + t[691] = 1507; + t[692] = 1508; + t[693] = 1509; + t[694] = 1510; + t[695] = 1511; + t[696] = 1512; + t[697] = 1513; + t[698] = 1514; + 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; +}); +const getSupplementalGlyphMapForArialBlack = getLookupTableFactory( + function (t) { + t[227] = 322; + t[264] = 261; + t[291] = 346; + }, +); +const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) { + t[1] = 32; + t[4] = 65; + t[5] = 192; + t[6] = 193; + t[9] = 196; + t[17] = 66; + t[18] = 67; + t[21] = 268; + t[24] = 68; + t[28] = 69; + t[29] = 200; + t[30] = 201; + t[32] = 282; + t[38] = 70; + t[39] = 71; + t[44] = 72; + t[47] = 73; + t[48] = 204; + t[49] = 205; + t[58] = 74; + t[60] = 75; + t[62] = 76; + t[68] = 77; + t[69] = 78; + t[75] = 79; + t[76] = 210; + t[80] = 214; + t[87] = 80; + t[89] = 81; + t[90] = 82; + t[92] = 344; + t[94] = 83; + t[97] = 352; + t[100] = 84; + t[104] = 85; + t[109] = 220; + t[115] = 86; + t[116] = 87; + t[121] = 88; + t[122] = 89; + t[124] = 221; + t[127] = 90; + t[129] = 381; + t[258] = 97; + t[259] = 224; + t[260] = 225; + t[263] = 228; + t[268] = 261; + t[271] = 98; + t[272] = 99; + t[273] = 263; + t[275] = 269; + t[282] = 100; + t[286] = 101; + t[287] = 232; + t[288] = 233; + t[290] = 283; + t[295] = 281; + t[296] = 102; + t[336] = 103; + t[346] = 104; + t[349] = 105; + t[350] = 236; + t[351] = 237; + t[361] = 106; + t[364] = 107; + t[367] = 108; + t[371] = 322; + t[373] = 109; + t[374] = 110; + t[381] = 111; + t[382] = 242; + t[383] = 243; + t[386] = 246; + t[393] = 112; + t[395] = 113; + t[396] = 114; + t[398] = 345; + t[400] = 115; + t[401] = 347; + t[403] = 353; + t[410] = 116; + t[437] = 117; + t[442] = 252; + t[448] = 118; + t[449] = 119; + t[454] = 120; + t[455] = 121; + t[457] = 253; + t[460] = 122; + t[462] = 382; + 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; +}); +function getStandardFontName(name) { + const fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(); + return stdFontMap[fontName]; +} +function isKnownFontName(name) { + const fontName = normalizeFontName(name); + return !!( + getStdFontMap()[fontName] || + getNonStdFontMap()[fontName] || + getSerifFonts()[fontName] || + getSymbolsFonts()[fontName] + ); +} // ./src/core/to_unicode_map.js + class ToUnicodeMap { - constructor(e = []) { - this._map = e; + constructor(cmap = []) { + this._map = cmap; } get length() { return this._map.length; } - forEach(e) { - for (const t in this._map) e(t, this._map[t].charCodeAt(0)); + forEach(callback) { + for (const charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } } - has(e) { - return void 0 !== this._map[e]; + has(i) { + return this._map[i] !== undefined; } - get(e) { - return this._map[e]; + get(i) { + return this._map[i]; } - charCodeOf(e) { - const t = this._map; - if (t.length <= 65536) return t.indexOf(e); - for (const i in t) if (t[i] === e) return 0 | 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(e) { - for (const t in e) this._map[t] = e[t]; + amend(map) { + for (const charCode in map) { + this._map[charCode] = map[charCode]; + } } } class IdentityToUnicodeMap { - constructor(e, t) { - this.firstChar = e; - this.lastChar = t; + constructor(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; } get length() { return this.lastChar + 1 - this.firstChar; } - forEach(e) { - for (let t = this.firstChar, i = this.lastChar; t <= i; t++) e(t, t); + forEach(callback) { + for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } } - has(e) { - return this.firstChar <= e && e <= this.lastChar; + has(i) { + return this.firstChar <= i && i <= this.lastChar; } - get(e) { - if (this.firstChar <= e && e <= this.lastChar) - return String.fromCharCode(e); + get(i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; } - charCodeOf(e) { - return Number.isInteger(e) && e >= this.firstChar && e <= this.lastChar - ? e + charCodeOf(v) { + return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar + ? v : -1; } - amend(e) { + amend(map) { unreachable("Should not call amend()"); } -} +} // ./src/core/cff_font.js + class CFFFont { - constructor(e, t) { - this.properties = t; - const i = new CFFParser(e, t, Yi); - this.cff = i.parse(); + constructor(file, properties) { + this.properties = properties; + const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); + this.cff = parser.parse(); this.cff.duplicateFirstGlyph(); - const a = new CFFCompiler(this.cff); + const compiler = new CFFCompiler(this.cff); this.seacs = this.cff.seacs; try { - this.data = a.compile(); + this.data = compiler.compile(); } catch { - warn("Failed to compile font " + t.loadedName); - this.data = e; + warn("Failed to compile font " + properties.loadedName); + this.data = file; } this._createBuiltInEncoding(); } @@ -20298,4625 +23784,4999 @@ class CFFFont { return this.cff.charset.charset; } getGlyphMapping() { - const e = this.cff, - t = this.properties, - { cidToGidMap: i, cMap: a } = t, - s = e.charset.charset; - let r, n; - if (t.composite) { - let t, g; - if (i?.length > 0) { - t = Object.create(null); - for (let e = 0, a = i.length; e < a; e++) { - const a = i[e]; - void 0 !== a && (t[a] = e); + const cff = this.cff; + const properties = this.properties; + const { cidToGidMap, cMap } = properties; + const charsets = cff.charset.charset; + let charCodeToGlyphId; + let glyphId; + if (properties.composite) { + let invCidToGidMap; + if (cidToGidMap?.length > 0) { + invCidToGidMap = Object.create(null); + for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { + const gid = cidToGidMap[i]; + if (gid !== undefined) { + invCidToGidMap[gid] = i; + } } } - r = Object.create(null); - if (e.isCIDFont) - for (n = 0; n < s.length; n++) { - const e = s[n]; - g = a.charCodeOf(e); - void 0 !== t?.[g] && (g = t[g]); - r[g] = n; + charCodeToGlyphId = Object.create(null); + let charCode; + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + const cid = charsets[glyphId]; + charCode = cMap.charCodeOf(cid); + if (invCidToGidMap?.[charCode] !== undefined) { + charCode = invCidToGidMap[charCode]; + } + charCodeToGlyphId[charCode] = glyphId; } - else - for (n = 0; n < e.charStrings.count; n++) { - g = a.charCodeOf(n); - r[g] = n; + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCode = cMap.charCodeOf(glyphId); + charCodeToGlyphId[charCode] = glyphId; } - return r; + } + return charCodeToGlyphId; } - let g = e.encoding ? e.encoding.encoding : null; - t.isInternalFont && (g = t.defaultEncoding); - r = type1FontGlyphMapping(t, g, s); - return r; + let encoding = cff.encoding ? cff.encoding.encoding : null; + if (properties.isInternalFont) { + encoding = properties.defaultEncoding; + } + charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); + return charCodeToGlyphId; } - hasGlyphId(e) { - return this.cff.hasGlyphId(e); + hasGlyphId(id) { + return this.cff.hasGlyphId(id); } _createBuiltInEncoding() { - const { charset: e, encoding: t } = this.cff; - if (!e || !t) return; - const i = e.charset, - a = t.encoding, - s = []; - for (const e in a) { - const t = a[e]; - if (t >= 0) { - const a = i[t]; - a && (s[e] = a); - } + const { charset, encoding } = this.cff; + if (!charset || !encoding) { + return; } - s.length > 0 && (this.properties.builtInEncoding = s); - } -} -function getUint32(e, t) { - return ((e[t] << 24) | (e[t + 1] << 16) | (e[t + 2] << 8) | e[t + 3]) >>> 0; -} -function getUint16(e, t) { - return (e[t] << 8) | e[t + 1]; -} -function getInt16(e, t) { - return ((e[t] << 24) | (e[t + 1] << 16)) >> 16; -} -function getInt8(e, t) { - return (e[t] << 24) >> 24; -} -function getFloat214(e, t) { - return getInt16(e, t) / 16384; -} -function getSubroutineBias(e) { - const t = e.length; - let i = 32768; - t < 1240 ? (i = 107) : t < 33900 && (i = 1131); - return i; -} -function parseCmap(e, t, i) { - const a = - 1 === getUint16(e, t + 2) ? getUint32(e, t + 8) : getUint32(e, t + 16), - s = getUint16(e, t + a); - let r, n, g; - if (4 === s) { - getUint16(e, t + a + 2); - const i = getUint16(e, t + a + 6) >> 1; - n = t + a + 14; - r = []; - for (g = 0; g < i; g++, n += 2) r[g] = { end: getUint16(e, n) }; - n += 2; - for (g = 0; g < i; g++, n += 2) r[g].start = getUint16(e, n); - for (g = 0; g < i; g++, n += 2) r[g].idDelta = getUint16(e, n); - for (g = 0; g < i; g++, n += 2) { - let t = getUint16(e, n); - if (0 !== t) { - r[g].ids = []; - for (let i = 0, a = r[g].end - r[g].start + 1; i < a; i++) { - r[g].ids[i] = getUint16(e, n + t); - t += 2; + 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; } } } - return r; - } - if (12 === s) { - const i = getUint32(e, t + a + 12); - n = t + a + 16; - r = []; - for (g = 0; g < i; g++) { - t = getUint32(e, n); - r.push({ - start: t, - end: getUint32(e, n + 4), - idDelta: getUint32(e, n + 8) - t, - }); - n += 12; + if (map.length > 0) { + this.properties.builtInEncoding = map; } - return r; } - throw new FormatError(`unsupported cmap: ${s}`); +} // ./src/core/font_renderer.js + +function getUint32(data, offset) { + return ( + ((data[offset] << 24) | + (data[offset + 1] << 16) | + (data[offset + 2] << 8) | + data[offset + 3]) >>> + 0 + ); } -function parseCff(e, t, i, a) { - const s = new CFFParser(new Stream(e, t, i - t), {}, a).parse(); +function getUint16(data, offset) { + return (data[offset] << 8) | data[offset + 1]; +} +function getInt16(data, offset) { + return ((data[offset] << 24) | (data[offset + 1] << 16)) >> 16; +} +function getInt8(data, offset) { + return (data[offset] << 24) >> 24; +} +function getFloat214(data, offset) { + return getInt16(data, offset) / 16384; +} +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 = + getUint16(data, start + 2) === 1 + ? getUint32(data, start + 8) + : getUint32(data, start + 16); + const format = getUint16(data, start + offset); + let ranges, p, i; + if (format === 4) { + getUint16(data, start + offset + 2); + const segCount = getUint16(data, start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { + end: getUint16(data, p), + }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = getUint16(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + let idOffset = getUint16(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] = getUint16(data, p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + const groups = getUint32(data, start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + start = getUint32(data, p); + ranges.push({ + start, + end: getUint32(data, p + 4), + idDelta: getUint32(data, p + 8) - start, + }); + p += 12; + } + return ranges; + } + throw new FormatError(`unsupported cmap: ${format}`); +} +function parseCff(data, start, end, seacAnalysisEnabled) { + const properties = {}; + const parser = new CFFParser( + new Stream(data, start, end - start), + properties, + seacAnalysisEnabled, + ); + const cff = parser.parse(); return { - glyphs: s.charStrings.objects, - subrs: s.topDict.privateDict?.subrsIndex?.objects, - gsubrs: s.globalSubrIndex?.objects, - isCFFCIDFont: s.isCIDFont, - fdSelect: s.fdSelect, - fdArray: s.fdArray, + glyphs: cff.charStrings.objects, + subrs: cff.topDict.privateDict?.subrsIndex?.objects, + gsubrs: cff.globalSubrIndex?.objects, + isCFFCIDFont: cff.isCIDFont, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, }; } -function lookupCmap(e, t) { - const i = t.codePointAt(0); - let a = 0, - s = 0, - r = e.length - 1; - for (; s < r; ) { - const t = (s + r + 1) >> 1; - i < e[t].start ? (r = t - 1) : (s = t); +function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + let itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = getUint32; + } else { + itemSize = 2; + itemDecode = (data, offset) => 2 * getUint16(data, offset); } - e[s].start <= i && - i <= e[s].end && - (a = (e[s].idDelta + (e[s].ids ? e[s].ids[i - e[s].start] : i)) & 65535); - return { charCode: i, glyphId: a }; + 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 compileGlyf(e, t, i) { - function moveTo(e, i) { - t.add(Ct, [e, i]); +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; + } } - function lineTo(e, i) { - t.add(ht, [e, i]); + 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; } - function quadraticCurveTo(e, i, a, s) { - t.add(Bt, [e, i, a, s]); + return { + charCode: code, + glyphId: gid, + }; +} +function compileGlyf(code, cmds, font) { + function moveTo(x, y) { + cmds.add(FontRenderOps.MOVE_TO, [x, y]); } - let a = 0; - const s = getInt16(e, a); - let r, - n = 0, - g = 0; - a += 10; - if (s < 0) + function lineTo(x, y) { + cmds.add(FontRenderOps.LINE_TO, [x, y]); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.add(FontRenderOps.QUADRATIC_CURVE_TO, [xa, ya, x, y]); + } + let i = 0; + const numberOfContours = getInt16(code, i); + let flags; + let x = 0, + y = 0; + i += 10; + if (numberOfContours < 0) { do { - r = getUint16(e, a); - const s = getUint16(e, a + 2); - a += 4; - let o, c; - if (1 & r) { - if (2 & r) { - o = getInt16(e, a); - c = getInt16(e, a + 2); + flags = getUint16(code, i); + const glyphIndex = getUint16(code, i + 2); + i += 4; + let arg1, arg2; + if (flags & 0x01) { + if (flags & 0x02) { + arg1 = getInt16(code, i); + arg2 = getInt16(code, i + 2); } else { - o = getUint16(e, a); - c = getUint16(e, a + 2); + arg1 = getUint16(code, i); + arg2 = getUint16(code, i + 2); } - a += 4; - } else if (2 & r) { - o = getInt8(e, a++); - c = getInt8(e, a++); + i += 4; + } else if (flags & 0x02) { + arg1 = getInt8(code, i++); + arg2 = getInt8(code, i++); } else { - o = e[a++]; - c = e[a++]; + arg1 = code[i++]; + arg2 = code[i++]; } - if (2 & r) { - n = o; - g = c; + if (flags & 0x02) { + x = arg1; + y = arg2; } else { - n = 0; - g = 0; + x = 0; + y = 0; } - let C = 1, - h = 1, - l = 0, - Q = 0; - if (8 & r) { - C = h = getFloat214(e, a); - a += 2; - } else if (64 & r) { - C = getFloat214(e, a); - h = getFloat214(e, a + 2); - a += 4; - } else if (128 & r) { - C = getFloat214(e, a); - l = getFloat214(e, a + 2); - Q = getFloat214(e, a + 4); - h = getFloat214(e, a + 6); - a += 8; + let scaleX = 1, + scaleY = 1, + scale01 = 0, + scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = getFloat214(code, i); + i += 2; + } else if (flags & 0x40) { + scaleX = getFloat214(code, i); + scaleY = getFloat214(code, i + 2); + i += 4; + } else if (flags & 0x80) { + scaleX = getFloat214(code, i); + scale01 = getFloat214(code, i + 2); + scale10 = getFloat214(code, i + 4); + scaleY = getFloat214(code, i + 6); + i += 8; } - const E = i.glyphs[s]; - if (E) { - t.add(Qt); - t.add(ut, [C, l, Q, h, n, g]); - compileGlyf(E, t, i); - t.add(lt); + const subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSFORM, [ + scaleX, + scale01, + scale10, + scaleY, + x, + y, + ]); + if (!(flags & 0x02)) { + } + compileGlyf(subglyph, cmds, font); + cmds.add(FontRenderOps.RESTORE); } - } while (32 & r); - else { - const t = []; - let i, o; - for (i = 0; i < s; i++) { - t.push(getUint16(e, a)); - a += 2; + } while (flags & 0x20); + } else { + const endPtsOfContours = []; + let j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(getUint16(code, i)); + i += 2; } - a += 2 + getUint16(e, a); - const c = t.at(-1) + 1, - C = []; - for (; C.length < c; ) { - r = e[a++]; - let t = 1; - 8 & r && (t += e[a++]); - for (; t-- > 0; ) C.push({ flags: r }); - } - for (i = 0; i < c; i++) { - switch (18 & C[i].flags) { - case 0: - n += getInt16(e, a); - a += 2; - break; - case 2: - n -= e[a++]; - break; - case 18: - n += e[a++]; + const instructionLength = getUint16(code, i); + i += 2 + instructionLength; + const numberOfPoints = endPtsOfContours.at(-1) + 1; + const points = []; + while (points.length < numberOfPoints) { + flags = code[i++]; + let repeat = 1; + if (flags & 0x08) { + repeat += code[i++]; } - C[i].x = n; - } - for (i = 0; i < c; i++) { - switch (36 & C[i].flags) { - case 0: - g += getInt16(e, a); - a += 2; - break; - case 4: - g -= e[a++]; - break; - case 36: - g += e[a++]; + while (repeat-- > 0) { + points.push({ + flags, + }); } - C[i].y = g; } - let h = 0; - for (a = 0; a < s; a++) { - const e = t[a], - s = C.slice(h, e + 1); - if (1 & s[0].flags) s.push(s[0]); - else if (1 & s.at(-1).flags) s.unshift(s.at(-1)); - else { - const e = { + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += getInt16(code, i); + 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 += getInt16(code, i); + 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.at(-1).flags & 1) { + contour.unshift(contour.at(-1)); + } else { + const p = { flags: 1, - x: (s[0].x + s.at(-1).x) / 2, - y: (s[0].y + s.at(-1).y) / 2, + x: (contour[0].x + contour.at(-1).x) / 2, + y: (contour[0].y + contour.at(-1).y) / 2, }; - s.unshift(e); - s.push(e); + contour.unshift(p); + contour.push(p); } - moveTo(s[0].x, s[0].y); - for (i = 1, o = s.length; i < o; i++) - if (1 & s[i].flags) lineTo(s[i].x, s[i].y); - else if (1 & s[i + 1].flags) { - quadraticCurveTo(s[i].x, s[i].y, s[i + 1].x, s[i + 1].y); - i++; - } else + 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( - s[i].x, - s[i].y, - (s[i].x + s[i + 1].x) / 2, - (s[i].y + s[i + 1].y) / 2, + contour[j].x, + contour[j].y, + contour[j + 1].x, + contour[j + 1].y, ); - h = e + 1; + 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; } } } -function compileCharString(e, t, i, a) { - function moveTo(e, i) { - t.add(Ct, [e, i]); +function compileCharString(charStringCode, cmds, font, glyphId) { + function moveTo(x, y) { + cmds.add(FontRenderOps.MOVE_TO, [x, y]); } - function lineTo(e, i) { - t.add(ht, [e, i]); + function lineTo(x, y) { + cmds.add(FontRenderOps.LINE_TO, [x, y]); } - function bezierCurveTo(e, i, a, s, r, n) { - t.add(ct, [e, i, a, s, r, n]); + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.add(FontRenderOps.BEZIER_CURVE_TO, [x1, y1, x2, y2, x, y]); } - const s = []; - let r = 0, - n = 0, - g = 0; - !(function parse(e) { - let o = 0; - for (; o < e.length; ) { - let c, - C, - h, - l, - Q, - E, - u, - d, - f, - p = !1, - m = e[o++]; - switch (m) { + const stack = []; + let x = 0, + y = 0; + let stems = 0; + function parse(code) { + let i = 0; + 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: - case 18: - case 23: - g += s.length >> 1; - p = !0; + stems += stack.length >> 1; + stackClean = true; break; case 4: - n += s.pop(); - moveTo(r, n); - p = !0; + y += stack.pop(); + moveTo(x, y); + stackClean = true; break; case 5: - for (; s.length > 0; ) { - r += s.shift(); - n += s.shift(); - lineTo(r, n); + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); } break; case 6: - for (; s.length > 0; ) { - r += s.shift(); - lineTo(r, n); - if (0 === s.length) break; - n += s.shift(); - lineTo(r, n); + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); } break; case 7: - for (; s.length > 0; ) { - n += s.shift(); - lineTo(r, n); - if (0 === s.length) break; - r += s.shift(); - lineTo(r, n); + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); } break; case 8: - for (; s.length > 0; ) { - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); + 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: - d = s.pop(); - f = null; - if (i.isCFFCIDFont) { - const e = i.fdSelect.getFDIndex(a); - if (e >= 0 && e < i.fdArray.length) { - const t = i.fdArray[e]; - let a; - t.privateDict?.subrsIndex && - (a = t.privateDict.subrsIndex.objects); - if (a) { - d += getSubroutineBias(a); - f = a[d]; + 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?.subrsIndex) { + subrs = fontDict.privateDict.subrsIndex.objects; } - } else warn("Invalid fd index for glyph index."); - } else f = i.subrs[d + i.subrsBias]; - f && parse(f); + if (subrs) { + n += getSubroutineBias(subrs); + subrCode = subrs[n]; + } + } else { + warn("Invalid fd index for glyph index."); + } + } else { + subrCode = font.subrs[n + font.subrsBias]; + } + if (subrCode) { + parse(subrCode); + } break; case 11: return; case 12: - m = e[o++]; - switch (m) { + v = code[i++]; + switch (v) { case 34: - c = r + s.shift(); - C = c + s.shift(); - Q = n + s.shift(); - r = C + s.shift(); - bezierCurveTo(c, n, C, Q, r, Q); - c = r + s.shift(); - C = c + s.shift(); - r = C + s.shift(); - bezierCurveTo(c, Q, C, n, r, n); + 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: - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); - s.pop(); + 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: - c = r + s.shift(); - Q = n + s.shift(); - C = c + s.shift(); - E = Q + s.shift(); - r = C + s.shift(); - bezierCurveTo(c, Q, C, E, r, E); - c = r + s.shift(); - C = c + s.shift(); - u = E + s.shift(); - r = C + s.shift(); - bezierCurveTo(c, E, C, u, r, n); + 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 e = r, - t = n; - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C; - n = l; - Math.abs(r - e) > Math.abs(n - t) - ? (r += s.shift()) - : (n += s.shift()); - bezierCurveTo(c, h, C, l, r, n); + 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 FormatError(`unknown operator: 12 ${m}`); + throw new FormatError(`unknown operator: 12 ${v}`); } break; case 14: - if (s.length >= 4) { - const e = s.pop(), - a = s.pop(); - n = s.pop(); - r = s.pop(); - t.add(Qt); - t.add(dt, [r, n]); - let g = lookupCmap( - i.cmap, - String.fromCharCode(i.glyphNameMap[fi[e]]), + if (stack.length >= 4) { + const achar = stack.pop(); + const bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSLATE, [x, y]); + let cmap = lookupCmap( + font.cmap, + String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]]), + ); + compileCharString( + font.glyphs[cmap.glyphId], + cmds, + font, + cmap.glyphId, + ); + cmds.add(FontRenderOps.RESTORE); + cmap = lookupCmap( + font.cmap, + String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]]), + ); + compileCharString( + font.glyphs[cmap.glyphId], + cmds, + font, + cmap.glyphId, ); - compileCharString(i.glyphs[g.glyphId], t, i, g.glyphId); - t.add(lt); - g = lookupCmap(i.cmap, String.fromCharCode(i.glyphNameMap[fi[a]])); - compileCharString(i.glyphs[g.glyphId], t, i, g.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: - g += s.length >> 1; - o += (g + 7) >> 3; - p = !0; + stems += stack.length >> 1; + i += (stems + 7) >> 3; + stackClean = true; break; case 21: - n += s.pop(); - r += s.pop(); - moveTo(r, n); - p = !0; + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; break; case 22: - r += s.pop(); - moveTo(r, n); - p = !0; + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; break; case 24: - for (; s.length > 2; ) { - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); + 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); } - r += s.shift(); - n += s.shift(); - lineTo(r, n); + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); break; case 25: - for (; s.length > 6; ) { - r += s.shift(); - n += s.shift(); - lineTo(r, n); + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); } - c = r + s.shift(); - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); + 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: - s.length % 2 && (r += s.shift()); - for (; s.length > 0; ) { - c = r; - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C; - n = l + s.shift(); - bezierCurveTo(c, h, C, l, r, n); + 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: - s.length % 2 && (n += s.shift()); - for (; s.length > 0; ) { - c = r + s.shift(); - h = n; - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l; - bezierCurveTo(c, h, C, l, r, n); + 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: - s.push(((e[o] << 24) | (e[o + 1] << 16)) >> 16); - o += 2; + stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); + i += 2; break; case 29: - d = s.pop() + i.gsubrsBias; - f = i.gsubrs[d]; - f && parse(f); + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } break; case 30: - for (; s.length > 0; ) { - c = r; - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + (1 === s.length ? s.shift() : 0); - bezierCurveTo(c, h, C, l, r, n); - if (0 === s.length) break; - c = r + s.shift(); - h = n; - C = c + s.shift(); - l = h + s.shift(); - n = l + s.shift(); - r = C + (1 === s.length ? s.shift() : 0); - bezierCurveTo(c, h, C, l, r, n); + 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: - for (; s.length > 0; ) { - c = r + s.shift(); - h = n; - C = c + s.shift(); - l = h + s.shift(); - n = l + s.shift(); - r = C + (1 === s.length ? s.shift() : 0); - bezierCurveTo(c, h, C, l, r, n); - if (0 === s.length) break; - c = r; - h = n + s.shift(); - C = c + s.shift(); - l = h + s.shift(); - r = C + s.shift(); - n = l + (1 === s.length ? s.shift() : 0); - bezierCurveTo(c, h, C, l, r, n); + 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 (m < 32) throw new FormatError(`unknown operator: ${m}`); - if (m < 247) s.push(m - 139); - else if (m < 251) s.push(256 * (m - 247) + e[o++] + 108); - else if (m < 255) s.push(256 * -(m - 251) - e[o++] - 108); - else { - s.push( - ((e[o] << 24) | (e[o + 1] << 16) | (e[o + 2] << 8) | e[o + 3]) / + if (v < 32) { + throw new 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, ); - o += 4; + i += 4; } + break; + } + if (stackClean) { + stack.length = 0; } - p && (s.length = 0); } - })(e); + } + parse(charStringCode); } -const $i = []; +const NOOP = []; class Commands { cmds = []; - add(e, t) { - if (t) - if (isNumberArray(t, null)) this.cmds.push(e, ...t); - else { - warn(`Commands.add - "${e}" has at least one non-number arg: "${t}".`); - const i = t.map((e) => ("number" == typeof e ? e : 0)); - this.cmds.push(e, ...i); + add(cmd, args) { + if (args) { + if (!isNumberArray(args, null)) { + warn( + `Commands.add - "${cmd}" has at least one non-number arg: "${args}".`, + ); + const newArgs = args.map((arg) => (typeof arg === "number" ? arg : 0)); + this.cmds.push(cmd, ...newArgs); + } else { + this.cmds.push(cmd, ...args); } - else this.cmds.push(e); + } else { + this.cmds.push(cmd); + } } } class CompiledFont { - constructor(e) { - this.constructor === CompiledFont && - unreachable("Cannot initialize CompiledFont."); - this.fontMatrix = e; + constructor(fontMatrix) { + this.fontMatrix = fontMatrix; this.compiledGlyphs = Object.create(null); this.compiledCharCodeToGlyphId = Object.create(null); } - getPathJs(e) { - const { charCode: t, glyphId: i } = lookupCmap(this.cmap, e); - let a, - s = this.compiledGlyphs[i]; - if (!s) { + getPathJs(unicode) { + const { charCode, glyphId } = lookupCmap(this.cmap, unicode); + let fn = this.compiledGlyphs[glyphId], + compileEx; + if (!fn) { try { - s = this.compileGlyph(this.glyphs[i], i); - } catch (e) { - s = $i; - a = e; + fn = this.compileGlyph(this.glyphs[glyphId], glyphId); + } catch (ex) { + fn = NOOP; + compileEx = ex; } - this.compiledGlyphs[i] = s; + this.compiledGlyphs[glyphId] = fn; } - this.compiledCharCodeToGlyphId[t] ??= i; - if (a) throw a; - return s; + this.compiledCharCodeToGlyphId[charCode] ??= glyphId; + if (compileEx) { + throw compileEx; + } + return fn; } - compileGlyph(e, t) { - if (!e || 0 === e.length || 14 === e[0]) return $i; - let i = this.fontMatrix; - if (this.isCFFCIDFont) { - const e = this.fdSelect.getFDIndex(t); - if (e >= 0 && e < this.fdArray.length) { - i = this.fdArray[e].getByName("FontMatrix") || a; - } else warn("Invalid fd index for glyph index."); + compileGlyph(code, glyphId) { + if (!code || code.length === 0 || code[0] === 14) { + return NOOP; } - const s = new Commands(); - s.add(Qt); - s.add(ut, i.slice()); - s.add(Et); - this.compileGlyphImpl(e, s, t); - s.add(lt); - return s.cmds; + let fontMatrix = this.fontMatrix; + if (this.isCFFCIDFont) { + const fdIndex = this.fdSelect.getFDIndex(glyphId); + if (fdIndex >= 0 && fdIndex < this.fdArray.length) { + const fontDict = this.fdArray[fdIndex]; + fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX; + } else { + warn("Invalid fd index for glyph index."); + } + } + const cmds = new Commands(); + cmds.add(FontRenderOps.SAVE); + cmds.add(FontRenderOps.TRANSFORM, fontMatrix.slice()); + cmds.add(FontRenderOps.SCALE); + this.compileGlyphImpl(code, cmds, glyphId); + cmds.add(FontRenderOps.RESTORE); + return cmds.cmds; } compileGlyphImpl() { unreachable("Children classes should implement this."); } - hasBuiltPath(e) { - const { charCode: t, glyphId: i } = lookupCmap(this.cmap, e); + hasBuiltPath(unicode) { + const { charCode, glyphId } = lookupCmap(this.cmap, unicode); return ( - void 0 !== this.compiledGlyphs[i] && - void 0 !== this.compiledCharCodeToGlyphId[t] + this.compiledGlyphs[glyphId] !== undefined && + this.compiledCharCodeToGlyphId[charCode] !== undefined ); } } class TrueTypeCompiled extends CompiledFont { - constructor(e, t, i) { - super(i || [488e-6, 0, 0, 488e-6, 0, 0]); - this.glyphs = e; - this.cmap = t; + constructor(glyphs, cmap, fontMatrix) { + super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); + this.glyphs = glyphs; + this.cmap = cmap; } - compileGlyphImpl(e, t) { - compileGlyf(e, t, this); + compileGlyphImpl(code, cmds) { + compileGlyf(code, cmds, this); } } class Type2Compiled extends CompiledFont { - constructor(e, t, i, a) { - super(i || [0.001, 0, 0, 0.001, 0, 0]); - this.glyphs = e.glyphs; - this.gsubrs = e.gsubrs || []; - this.subrs = e.subrs || []; - this.cmap = t; - this.glyphNameMap = a || Ni(); + 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 || getGlyphsUnicode(); this.gsubrsBias = getSubroutineBias(this.gsubrs); this.subrsBias = getSubroutineBias(this.subrs); - this.isCFFCIDFont = e.isCFFCIDFont; - this.fdSelect = e.fdSelect; - this.fdArray = e.fdArray; + this.isCFFCIDFont = cffInfo.isCFFCIDFont; + this.fdSelect = cffInfo.fdSelect; + this.fdArray = cffInfo.fdArray; } - compileGlyphImpl(e, t, i) { - compileCharString(e, t, this, i); + compileGlyphImpl(code, cmds, glyphId) { + compileCharString(code, cmds, this, glyphId); } } class FontRendererFactory { - static create(e, t) { - const i = new Uint8Array(e.data); - let a, s, r, n, g, o; - const c = getUint16(i, 4); - for (let e = 0, C = 12; e < c; e++, C += 16) { - const e = bytesToString(i.subarray(C, C + 4)), - c = getUint32(i, C + 8), - h = getUint32(i, C + 12); - switch (e) { + static create(font, seacAnalysisEnabled) { + const data = new Uint8Array(font.data); + let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + const numTables = getUint16(data, 4); + for (let i = 0, p = 12; i < numTables; i++, p += 16) { + const tag = bytesToString(data.subarray(p, p + 4)); + const offset = getUint32(data, p + 8); + const length = getUint32(data, p + 12); + switch (tag) { case "cmap": - a = parseCmap(i, c); + cmap = parseCmap(data, offset, offset + length); break; case "glyf": - s = i.subarray(c, c + h); + glyf = data.subarray(offset, offset + length); break; case "loca": - r = i.subarray(c, c + h); + loca = data.subarray(offset, offset + length); break; case "head": - o = getUint16(i, c + 18); - g = getUint16(i, c + 50); + unitsPerEm = getUint16(data, offset + 18); + indexToLocFormat = getUint16(data, offset + 50); break; case "CFF ": - n = parseCff(i, c, c + h, t); + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; } } - if (s) { - const t = o ? [1 / o, 0, 0, 1 / o, 0, 0] : e.fontMatrix; + if (glyf) { + const fontMatrix = !unitsPerEm + ? font.fontMatrix + : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; return new TrueTypeCompiled( - (function parseGlyfTable(e, t, i) { - let a, s; - if (i) { - a = 4; - s = getUint32; - } else { - a = 2; - s = (e, t) => 2 * getUint16(e, t); - } - const r = []; - let n = s(t, 0); - for (let i = a; i < t.length; i += a) { - const a = s(t, i); - r.push(e.subarray(n, a)); - n = a; - } - return r; - })(s, r, g), - a, - t, + parseGlyfTable(glyf, loca, indexToLocFormat), + cmap, + fontMatrix, ); } - return new Type2Compiled(n, a, e.fontMatrix, e.glyphNameMap); + return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); } -} -const Aa = getLookupTableFactory(function (e) { - e.Courier = 600; - e["Courier-Bold"] = 600; - e["Courier-BoldOblique"] = 600; - e["Courier-Oblique"] = 600; - e.Helvetica = getLookupTableFactory(function (e) { - e.space = 278; - e.exclam = 278; - e.quotedbl = 355; - e.numbersign = 556; - e.dollar = 556; - e.percent = 889; - e.ampersand = 667; - e.quoteright = 222; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 389; - e.plus = 584; - e.comma = 278; - e.hyphen = 333; - e.period = 278; - e.slash = 278; - e.zero = 556; - e.one = 556; - e.two = 556; - e.three = 556; - e.four = 556; - e.five = 556; - e.six = 556; - e.seven = 556; - e.eight = 556; - e.nine = 556; - e.colon = 278; - e.semicolon = 278; - e.less = 584; - e.equal = 584; - e.greater = 584; - e.question = 556; - e.at = 1015; - e.A = 667; - e.B = 667; - e.C = 722; - e.D = 722; - e.E = 667; - e.F = 611; - e.G = 778; - e.H = 722; - e.I = 278; - e.J = 500; - e.K = 667; - e.L = 556; - e.M = 833; - e.N = 722; - e.O = 778; - e.P = 667; - e.Q = 778; - e.R = 722; - e.S = 667; - e.T = 611; - e.U = 722; - e.V = 667; - e.W = 944; - e.X = 667; - e.Y = 667; - e.Z = 611; - e.bracketleft = 278; - e.backslash = 278; - e.bracketright = 278; - e.asciicircum = 469; - e.underscore = 556; - e.quoteleft = 222; - e.a = 556; - e.b = 556; - e.c = 500; - e.d = 556; - e.e = 556; - e.f = 278; - e.g = 556; - e.h = 556; - e.i = 222; - e.j = 222; - e.k = 500; - e.l = 222; - e.m = 833; - e.n = 556; - e.o = 556; - e.p = 556; - e.q = 556; - e.r = 333; - e.s = 500; - e.t = 278; - e.u = 556; - e.v = 500; - e.w = 722; - e.x = 500; - e.y = 500; - e.z = 500; - e.braceleft = 334; - e.bar = 260; - e.braceright = 334; - e.asciitilde = 584; - e.exclamdown = 333; - e.cent = 556; - e.sterling = 556; - e.fraction = 167; - e.yen = 556; - e.florin = 556; - e.section = 556; - e.currency = 556; - e.quotesingle = 191; - e.quotedblleft = 333; - e.guillemotleft = 556; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 500; - e.fl = 500; - e.endash = 556; - e.dagger = 556; - e.daggerdbl = 556; - e.periodcentered = 278; - e.paragraph = 537; - e.bullet = 350; - e.quotesinglbase = 222; - e.quotedblbase = 333; - e.quotedblright = 333; - e.guillemotright = 556; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 611; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 1e3; - e.ordfeminine = 370; - e.Lslash = 556; - e.Oslash = 778; - e.OE = 1e3; - e.ordmasculine = 365; - e.ae = 889; - e.dotlessi = 278; - e.lslash = 222; - e.oslash = 611; - e.oe = 944; - e.germandbls = 611; - e.Idieresis = 278; - e.eacute = 556; - e.abreve = 556; - e.uhungarumlaut = 556; - e.ecaron = 556; - e.Ydieresis = 667; - e.divide = 584; - e.Yacute = 667; - e.Acircumflex = 667; - e.aacute = 556; - e.Ucircumflex = 722; - e.yacute = 500; - e.scommaaccent = 500; - e.ecircumflex = 556; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 556; - e.Uacute = 722; - e.uogonek = 556; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 737; - e.Emacron = 667; - e.ccaron = 500; - e.aring = 556; - e.Ncommaaccent = 722; - e.lacute = 222; - e.agrave = 556; - e.Tcommaaccent = 611; - e.Cacute = 722; - e.atilde = 556; - e.Edotaccent = 667; - e.scaron = 500; - e.scedilla = 500; - e.iacute = 278; - e.lozenge = 471; - e.Rcaron = 722; - e.Gcommaaccent = 778; - e.ucircumflex = 556; - e.acircumflex = 556; - e.Amacron = 667; - e.rcaron = 333; - e.ccedilla = 500; - e.Zdotaccent = 611; - e.Thorn = 667; - e.Omacron = 778; - e.Racute = 722; - e.Sacute = 667; - e.dcaron = 643; - e.Umacron = 722; - e.uring = 556; - e.threesuperior = 333; - e.Ograve = 778; - e.Agrave = 667; - e.Abreve = 667; - e.multiply = 584; - e.uacute = 556; - e.Tcaron = 611; - e.partialdiff = 476; - e.ydieresis = 500; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 556; - e.edieresis = 556; - e.cacute = 500; - e.nacute = 556; - e.umacron = 556; - e.Ncaron = 722; - e.Iacute = 278; - e.plusminus = 584; - e.brokenbar = 260; - e.registered = 737; - e.Gbreve = 778; - e.Idotaccent = 278; - e.summation = 600; - e.Egrave = 667; - e.racute = 333; - e.omacron = 556; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 722; - e.lcommaaccent = 222; - e.tcaron = 317; - e.eogonek = 556; - e.Uogonek = 722; - e.Aacute = 667; - e.Adieresis = 667; - e.egrave = 556; - e.zacute = 500; - e.iogonek = 222; - e.Oacute = 778; - e.oacute = 556; - e.amacron = 556; - e.sacute = 500; - e.idieresis = 278; - e.Ocircumflex = 778; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 556; - e.twosuperior = 333; - e.Odieresis = 778; - e.mu = 556; - e.igrave = 278; - e.ohungarumlaut = 556; - e.Eogonek = 667; - e.dcroat = 556; - e.threequarters = 834; - e.Scedilla = 667; - e.lcaron = 299; - e.Kcommaaccent = 667; - e.Lacute = 556; - e.trademark = 1e3; - e.edotaccent = 556; - e.Igrave = 278; - e.Imacron = 278; - e.Lcaron = 556; - e.onehalf = 834; - e.lessequal = 549; - e.ocircumflex = 556; - e.ntilde = 556; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 556; - e.gbreve = 556; - e.onequarter = 834; - e.Scaron = 667; - e.Scommaaccent = 667; - e.Ohungarumlaut = 778; - e.degree = 400; - e.ograve = 556; - e.Ccaron = 722; - e.ugrave = 556; - e.radical = 453; - e.Dcaron = 722; - e.rcommaaccent = 333; - e.Ntilde = 722; - e.otilde = 556; - e.Rcommaaccent = 722; - e.Lcommaaccent = 556; - e.Atilde = 667; - e.Aogonek = 667; - e.Aring = 667; - e.Otilde = 778; - e.zdotaccent = 500; - e.Ecaron = 667; - e.Iogonek = 278; - e.kcommaaccent = 500; - e.minus = 584; - e.Icircumflex = 278; - e.ncaron = 556; - e.tcommaaccent = 278; - e.logicalnot = 584; - e.odieresis = 556; - e.udieresis = 556; - e.notequal = 549; - e.gcommaaccent = 556; - e.eth = 556; - e.zcaron = 500; - e.ncommaaccent = 556; - e.onesuperior = 333; - e.imacron = 278; - e.Euro = 556; - }); - e["Helvetica-Bold"] = getLookupTableFactory(function (e) { - e.space = 278; - e.exclam = 333; - e.quotedbl = 474; - e.numbersign = 556; - e.dollar = 556; - e.percent = 889; - e.ampersand = 722; - e.quoteright = 278; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 389; - e.plus = 584; - e.comma = 278; - e.hyphen = 333; - e.period = 278; - e.slash = 278; - e.zero = 556; - e.one = 556; - e.two = 556; - e.three = 556; - e.four = 556; - e.five = 556; - e.six = 556; - e.seven = 556; - e.eight = 556; - e.nine = 556; - e.colon = 333; - e.semicolon = 333; - e.less = 584; - e.equal = 584; - e.greater = 584; - e.question = 611; - e.at = 975; - e.A = 722; - e.B = 722; - e.C = 722; - e.D = 722; - e.E = 667; - e.F = 611; - e.G = 778; - e.H = 722; - e.I = 278; - e.J = 556; - e.K = 722; - e.L = 611; - e.M = 833; - e.N = 722; - e.O = 778; - e.P = 667; - e.Q = 778; - e.R = 722; - e.S = 667; - e.T = 611; - e.U = 722; - e.V = 667; - e.W = 944; - e.X = 667; - e.Y = 667; - e.Z = 611; - e.bracketleft = 333; - e.backslash = 278; - e.bracketright = 333; - e.asciicircum = 584; - e.underscore = 556; - e.quoteleft = 278; - e.a = 556; - e.b = 611; - e.c = 556; - e.d = 611; - e.e = 556; - e.f = 333; - e.g = 611; - e.h = 611; - e.i = 278; - e.j = 278; - e.k = 556; - e.l = 278; - e.m = 889; - e.n = 611; - e.o = 611; - e.p = 611; - e.q = 611; - e.r = 389; - e.s = 556; - e.t = 333; - e.u = 611; - e.v = 556; - e.w = 778; - e.x = 556; - e.y = 556; - e.z = 500; - e.braceleft = 389; - e.bar = 280; - e.braceright = 389; - e.asciitilde = 584; - e.exclamdown = 333; - e.cent = 556; - e.sterling = 556; - e.fraction = 167; - e.yen = 556; - e.florin = 556; - e.section = 556; - e.currency = 556; - e.quotesingle = 238; - e.quotedblleft = 500; - e.guillemotleft = 556; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 611; - e.fl = 611; - e.endash = 556; - e.dagger = 556; - e.daggerdbl = 556; - e.periodcentered = 278; - e.paragraph = 556; - e.bullet = 350; - e.quotesinglbase = 278; - e.quotedblbase = 500; - e.quotedblright = 500; - e.guillemotright = 556; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 611; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 1e3; - e.ordfeminine = 370; - e.Lslash = 611; - e.Oslash = 778; - e.OE = 1e3; - e.ordmasculine = 365; - e.ae = 889; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 611; - e.oe = 944; - e.germandbls = 611; - e.Idieresis = 278; - e.eacute = 556; - e.abreve = 556; - e.uhungarumlaut = 611; - e.ecaron = 556; - e.Ydieresis = 667; - e.divide = 584; - e.Yacute = 667; - e.Acircumflex = 722; - e.aacute = 556; - e.Ucircumflex = 722; - e.yacute = 556; - e.scommaaccent = 556; - e.ecircumflex = 556; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 556; - e.Uacute = 722; - e.uogonek = 611; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 737; - e.Emacron = 667; - e.ccaron = 556; - e.aring = 556; - e.Ncommaaccent = 722; - e.lacute = 278; - e.agrave = 556; - e.Tcommaaccent = 611; - e.Cacute = 722; - e.atilde = 556; - e.Edotaccent = 667; - e.scaron = 556; - e.scedilla = 556; - e.iacute = 278; - e.lozenge = 494; - e.Rcaron = 722; - e.Gcommaaccent = 778; - e.ucircumflex = 611; - e.acircumflex = 556; - e.Amacron = 722; - e.rcaron = 389; - e.ccedilla = 556; - e.Zdotaccent = 611; - e.Thorn = 667; - e.Omacron = 778; - e.Racute = 722; - e.Sacute = 667; - e.dcaron = 743; - e.Umacron = 722; - e.uring = 611; - e.threesuperior = 333; - e.Ograve = 778; - e.Agrave = 722; - e.Abreve = 722; - e.multiply = 584; - e.uacute = 611; - e.Tcaron = 611; - e.partialdiff = 494; - e.ydieresis = 556; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 556; - e.edieresis = 556; - e.cacute = 556; - e.nacute = 611; - e.umacron = 611; - e.Ncaron = 722; - e.Iacute = 278; - e.plusminus = 584; - e.brokenbar = 280; - e.registered = 737; - e.Gbreve = 778; - e.Idotaccent = 278; - e.summation = 600; - e.Egrave = 667; - e.racute = 389; - e.omacron = 611; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 722; - e.lcommaaccent = 278; - e.tcaron = 389; - e.eogonek = 556; - e.Uogonek = 722; - e.Aacute = 722; - e.Adieresis = 722; - e.egrave = 556; - e.zacute = 500; - e.iogonek = 278; - e.Oacute = 778; - e.oacute = 611; - e.amacron = 556; - e.sacute = 556; - e.idieresis = 278; - e.Ocircumflex = 778; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 611; - e.twosuperior = 333; - e.Odieresis = 778; - e.mu = 611; - e.igrave = 278; - e.ohungarumlaut = 611; - e.Eogonek = 667; - e.dcroat = 611; - e.threequarters = 834; - e.Scedilla = 667; - e.lcaron = 400; - e.Kcommaaccent = 722; - e.Lacute = 611; - e.trademark = 1e3; - e.edotaccent = 556; - e.Igrave = 278; - e.Imacron = 278; - e.Lcaron = 611; - e.onehalf = 834; - e.lessequal = 549; - e.ocircumflex = 611; - e.ntilde = 611; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 556; - e.gbreve = 611; - e.onequarter = 834; - e.Scaron = 667; - e.Scommaaccent = 667; - e.Ohungarumlaut = 778; - e.degree = 400; - e.ograve = 611; - e.Ccaron = 722; - e.ugrave = 611; - e.radical = 549; - e.Dcaron = 722; - e.rcommaaccent = 389; - e.Ntilde = 722; - e.otilde = 611; - e.Rcommaaccent = 722; - e.Lcommaaccent = 611; - e.Atilde = 722; - e.Aogonek = 722; - e.Aring = 722; - e.Otilde = 778; - e.zdotaccent = 500; - e.Ecaron = 667; - e.Iogonek = 278; - e.kcommaaccent = 556; - e.minus = 584; - e.Icircumflex = 278; - e.ncaron = 611; - e.tcommaaccent = 333; - e.logicalnot = 584; - e.odieresis = 611; - e.udieresis = 611; - e.notequal = 549; - e.gcommaaccent = 611; - e.eth = 611; - e.zcaron = 500; - e.ncommaaccent = 611; - e.onesuperior = 333; - e.imacron = 278; - e.Euro = 556; - }); - e["Helvetica-BoldOblique"] = getLookupTableFactory(function (e) { - e.space = 278; - e.exclam = 333; - e.quotedbl = 474; - e.numbersign = 556; - e.dollar = 556; - e.percent = 889; - e.ampersand = 722; - e.quoteright = 278; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 389; - e.plus = 584; - e.comma = 278; - e.hyphen = 333; - e.period = 278; - e.slash = 278; - e.zero = 556; - e.one = 556; - e.two = 556; - e.three = 556; - e.four = 556; - e.five = 556; - e.six = 556; - e.seven = 556; - e.eight = 556; - e.nine = 556; - e.colon = 333; - e.semicolon = 333; - e.less = 584; - e.equal = 584; - e.greater = 584; - e.question = 611; - e.at = 975; - e.A = 722; - e.B = 722; - e.C = 722; - e.D = 722; - e.E = 667; - e.F = 611; - e.G = 778; - e.H = 722; - e.I = 278; - e.J = 556; - e.K = 722; - e.L = 611; - e.M = 833; - e.N = 722; - e.O = 778; - e.P = 667; - e.Q = 778; - e.R = 722; - e.S = 667; - e.T = 611; - e.U = 722; - e.V = 667; - e.W = 944; - e.X = 667; - e.Y = 667; - e.Z = 611; - e.bracketleft = 333; - e.backslash = 278; - e.bracketright = 333; - e.asciicircum = 584; - e.underscore = 556; - e.quoteleft = 278; - e.a = 556; - e.b = 611; - e.c = 556; - e.d = 611; - e.e = 556; - e.f = 333; - e.g = 611; - e.h = 611; - e.i = 278; - e.j = 278; - e.k = 556; - e.l = 278; - e.m = 889; - e.n = 611; - e.o = 611; - e.p = 611; - e.q = 611; - e.r = 389; - e.s = 556; - e.t = 333; - e.u = 611; - e.v = 556; - e.w = 778; - e.x = 556; - e.y = 556; - e.z = 500; - e.braceleft = 389; - e.bar = 280; - e.braceright = 389; - e.asciitilde = 584; - e.exclamdown = 333; - e.cent = 556; - e.sterling = 556; - e.fraction = 167; - e.yen = 556; - e.florin = 556; - e.section = 556; - e.currency = 556; - e.quotesingle = 238; - e.quotedblleft = 500; - e.guillemotleft = 556; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 611; - e.fl = 611; - e.endash = 556; - e.dagger = 556; - e.daggerdbl = 556; - e.periodcentered = 278; - e.paragraph = 556; - e.bullet = 350; - e.quotesinglbase = 278; - e.quotedblbase = 500; - e.quotedblright = 500; - e.guillemotright = 556; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 611; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 1e3; - e.ordfeminine = 370; - e.Lslash = 611; - e.Oslash = 778; - e.OE = 1e3; - e.ordmasculine = 365; - e.ae = 889; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 611; - e.oe = 944; - e.germandbls = 611; - e.Idieresis = 278; - e.eacute = 556; - e.abreve = 556; - e.uhungarumlaut = 611; - e.ecaron = 556; - e.Ydieresis = 667; - e.divide = 584; - e.Yacute = 667; - e.Acircumflex = 722; - e.aacute = 556; - e.Ucircumflex = 722; - e.yacute = 556; - e.scommaaccent = 556; - e.ecircumflex = 556; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 556; - e.Uacute = 722; - e.uogonek = 611; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 737; - e.Emacron = 667; - e.ccaron = 556; - e.aring = 556; - e.Ncommaaccent = 722; - e.lacute = 278; - e.agrave = 556; - e.Tcommaaccent = 611; - e.Cacute = 722; - e.atilde = 556; - e.Edotaccent = 667; - e.scaron = 556; - e.scedilla = 556; - e.iacute = 278; - e.lozenge = 494; - e.Rcaron = 722; - e.Gcommaaccent = 778; - e.ucircumflex = 611; - e.acircumflex = 556; - e.Amacron = 722; - e.rcaron = 389; - e.ccedilla = 556; - e.Zdotaccent = 611; - e.Thorn = 667; - e.Omacron = 778; - e.Racute = 722; - e.Sacute = 667; - e.dcaron = 743; - e.Umacron = 722; - e.uring = 611; - e.threesuperior = 333; - e.Ograve = 778; - e.Agrave = 722; - e.Abreve = 722; - e.multiply = 584; - e.uacute = 611; - e.Tcaron = 611; - e.partialdiff = 494; - e.ydieresis = 556; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 556; - e.edieresis = 556; - e.cacute = 556; - e.nacute = 611; - e.umacron = 611; - e.Ncaron = 722; - e.Iacute = 278; - e.plusminus = 584; - e.brokenbar = 280; - e.registered = 737; - e.Gbreve = 778; - e.Idotaccent = 278; - e.summation = 600; - e.Egrave = 667; - e.racute = 389; - e.omacron = 611; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 722; - e.lcommaaccent = 278; - e.tcaron = 389; - e.eogonek = 556; - e.Uogonek = 722; - e.Aacute = 722; - e.Adieresis = 722; - e.egrave = 556; - e.zacute = 500; - e.iogonek = 278; - e.Oacute = 778; - e.oacute = 611; - e.amacron = 556; - e.sacute = 556; - e.idieresis = 278; - e.Ocircumflex = 778; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 611; - e.twosuperior = 333; - e.Odieresis = 778; - e.mu = 611; - e.igrave = 278; - e.ohungarumlaut = 611; - e.Eogonek = 667; - e.dcroat = 611; - e.threequarters = 834; - e.Scedilla = 667; - e.lcaron = 400; - e.Kcommaaccent = 722; - e.Lacute = 611; - e.trademark = 1e3; - e.edotaccent = 556; - e.Igrave = 278; - e.Imacron = 278; - e.Lcaron = 611; - e.onehalf = 834; - e.lessequal = 549; - e.ocircumflex = 611; - e.ntilde = 611; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 556; - e.gbreve = 611; - e.onequarter = 834; - e.Scaron = 667; - e.Scommaaccent = 667; - e.Ohungarumlaut = 778; - e.degree = 400; - e.ograve = 611; - e.Ccaron = 722; - e.ugrave = 611; - e.radical = 549; - e.Dcaron = 722; - e.rcommaaccent = 389; - e.Ntilde = 722; - e.otilde = 611; - e.Rcommaaccent = 722; - e.Lcommaaccent = 611; - e.Atilde = 722; - e.Aogonek = 722; - e.Aring = 722; - e.Otilde = 778; - e.zdotaccent = 500; - e.Ecaron = 667; - e.Iogonek = 278; - e.kcommaaccent = 556; - e.minus = 584; - e.Icircumflex = 278; - e.ncaron = 611; - e.tcommaaccent = 333; - e.logicalnot = 584; - e.odieresis = 611; - e.udieresis = 611; - e.notequal = 549; - e.gcommaaccent = 611; - e.eth = 611; - e.zcaron = 500; - e.ncommaaccent = 611; - e.onesuperior = 333; - e.imacron = 278; - e.Euro = 556; - }); - e["Helvetica-Oblique"] = getLookupTableFactory(function (e) { - e.space = 278; - e.exclam = 278; - e.quotedbl = 355; - e.numbersign = 556; - e.dollar = 556; - e.percent = 889; - e.ampersand = 667; - e.quoteright = 222; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 389; - e.plus = 584; - e.comma = 278; - e.hyphen = 333; - e.period = 278; - e.slash = 278; - e.zero = 556; - e.one = 556; - e.two = 556; - e.three = 556; - e.four = 556; - e.five = 556; - e.six = 556; - e.seven = 556; - e.eight = 556; - e.nine = 556; - e.colon = 278; - e.semicolon = 278; - e.less = 584; - e.equal = 584; - e.greater = 584; - e.question = 556; - e.at = 1015; - e.A = 667; - e.B = 667; - e.C = 722; - e.D = 722; - e.E = 667; - e.F = 611; - e.G = 778; - e.H = 722; - e.I = 278; - e.J = 500; - e.K = 667; - e.L = 556; - e.M = 833; - e.N = 722; - e.O = 778; - e.P = 667; - e.Q = 778; - e.R = 722; - e.S = 667; - e.T = 611; - e.U = 722; - e.V = 667; - e.W = 944; - e.X = 667; - e.Y = 667; - e.Z = 611; - e.bracketleft = 278; - e.backslash = 278; - e.bracketright = 278; - e.asciicircum = 469; - e.underscore = 556; - e.quoteleft = 222; - e.a = 556; - e.b = 556; - e.c = 500; - e.d = 556; - e.e = 556; - e.f = 278; - e.g = 556; - e.h = 556; - e.i = 222; - e.j = 222; - e.k = 500; - e.l = 222; - e.m = 833; - e.n = 556; - e.o = 556; - e.p = 556; - e.q = 556; - e.r = 333; - e.s = 500; - e.t = 278; - e.u = 556; - e.v = 500; - e.w = 722; - e.x = 500; - e.y = 500; - e.z = 500; - e.braceleft = 334; - e.bar = 260; - e.braceright = 334; - e.asciitilde = 584; - e.exclamdown = 333; - e.cent = 556; - e.sterling = 556; - e.fraction = 167; - e.yen = 556; - e.florin = 556; - e.section = 556; - e.currency = 556; - e.quotesingle = 191; - e.quotedblleft = 333; - e.guillemotleft = 556; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 500; - e.fl = 500; - e.endash = 556; - e.dagger = 556; - e.daggerdbl = 556; - e.periodcentered = 278; - e.paragraph = 537; - e.bullet = 350; - e.quotesinglbase = 222; - e.quotedblbase = 333; - e.quotedblright = 333; - e.guillemotright = 556; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 611; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 1e3; - e.ordfeminine = 370; - e.Lslash = 556; - e.Oslash = 778; - e.OE = 1e3; - e.ordmasculine = 365; - e.ae = 889; - e.dotlessi = 278; - e.lslash = 222; - e.oslash = 611; - e.oe = 944; - e.germandbls = 611; - e.Idieresis = 278; - e.eacute = 556; - e.abreve = 556; - e.uhungarumlaut = 556; - e.ecaron = 556; - e.Ydieresis = 667; - e.divide = 584; - e.Yacute = 667; - e.Acircumflex = 667; - e.aacute = 556; - e.Ucircumflex = 722; - e.yacute = 500; - e.scommaaccent = 500; - e.ecircumflex = 556; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 556; - e.Uacute = 722; - e.uogonek = 556; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 737; - e.Emacron = 667; - e.ccaron = 500; - e.aring = 556; - e.Ncommaaccent = 722; - e.lacute = 222; - e.agrave = 556; - e.Tcommaaccent = 611; - e.Cacute = 722; - e.atilde = 556; - e.Edotaccent = 667; - e.scaron = 500; - e.scedilla = 500; - e.iacute = 278; - e.lozenge = 471; - e.Rcaron = 722; - e.Gcommaaccent = 778; - e.ucircumflex = 556; - e.acircumflex = 556; - e.Amacron = 667; - e.rcaron = 333; - e.ccedilla = 500; - e.Zdotaccent = 611; - e.Thorn = 667; - e.Omacron = 778; - e.Racute = 722; - e.Sacute = 667; - e.dcaron = 643; - e.Umacron = 722; - e.uring = 556; - e.threesuperior = 333; - e.Ograve = 778; - e.Agrave = 667; - e.Abreve = 667; - e.multiply = 584; - e.uacute = 556; - e.Tcaron = 611; - e.partialdiff = 476; - e.ydieresis = 500; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 556; - e.edieresis = 556; - e.cacute = 500; - e.nacute = 556; - e.umacron = 556; - e.Ncaron = 722; - e.Iacute = 278; - e.plusminus = 584; - e.brokenbar = 260; - e.registered = 737; - e.Gbreve = 778; - e.Idotaccent = 278; - e.summation = 600; - e.Egrave = 667; - e.racute = 333; - e.omacron = 556; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 722; - e.lcommaaccent = 222; - e.tcaron = 317; - e.eogonek = 556; - e.Uogonek = 722; - e.Aacute = 667; - e.Adieresis = 667; - e.egrave = 556; - e.zacute = 500; - e.iogonek = 222; - e.Oacute = 778; - e.oacute = 556; - e.amacron = 556; - e.sacute = 500; - e.idieresis = 278; - e.Ocircumflex = 778; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 556; - e.twosuperior = 333; - e.Odieresis = 778; - e.mu = 556; - e.igrave = 278; - e.ohungarumlaut = 556; - e.Eogonek = 667; - e.dcroat = 556; - e.threequarters = 834; - e.Scedilla = 667; - e.lcaron = 299; - e.Kcommaaccent = 667; - e.Lacute = 556; - e.trademark = 1e3; - e.edotaccent = 556; - e.Igrave = 278; - e.Imacron = 278; - e.Lcaron = 556; - e.onehalf = 834; - e.lessequal = 549; - e.ocircumflex = 556; - e.ntilde = 556; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 556; - e.gbreve = 556; - e.onequarter = 834; - e.Scaron = 667; - e.Scommaaccent = 667; - e.Ohungarumlaut = 778; - e.degree = 400; - e.ograve = 556; - e.Ccaron = 722; - e.ugrave = 556; - e.radical = 453; - e.Dcaron = 722; - e.rcommaaccent = 333; - e.Ntilde = 722; - e.otilde = 556; - e.Rcommaaccent = 722; - e.Lcommaaccent = 556; - e.Atilde = 667; - e.Aogonek = 667; - e.Aring = 667; - e.Otilde = 778; - e.zdotaccent = 500; - e.Ecaron = 667; - e.Iogonek = 278; - e.kcommaaccent = 500; - e.minus = 584; - e.Icircumflex = 278; - e.ncaron = 556; - e.tcommaaccent = 278; - e.logicalnot = 584; - e.odieresis = 556; - e.udieresis = 556; - e.notequal = 549; - e.gcommaaccent = 556; - e.eth = 556; - e.zcaron = 500; - e.ncommaaccent = 556; - e.onesuperior = 333; - e.imacron = 278; - e.Euro = 556; - }); - e.Symbol = getLookupTableFactory(function (e) { - e.space = 250; - e.exclam = 333; - e.universal = 713; - e.numbersign = 500; - e.existential = 549; - e.percent = 833; - e.ampersand = 778; - e.suchthat = 439; - e.parenleft = 333; - e.parenright = 333; - e.asteriskmath = 500; - e.plus = 549; - e.comma = 250; - e.minus = 549; - e.period = 250; - e.slash = 278; - e.zero = 500; - e.one = 500; - e.two = 500; - e.three = 500; - e.four = 500; - e.five = 500; - e.six = 500; - e.seven = 500; - e.eight = 500; - e.nine = 500; - e.colon = 278; - e.semicolon = 278; - e.less = 549; - e.equal = 549; - e.greater = 549; - e.question = 444; - e.congruent = 549; - e.Alpha = 722; - e.Beta = 667; - e.Chi = 722; - e.Delta = 612; - e.Epsilon = 611; - e.Phi = 763; - e.Gamma = 603; - e.Eta = 722; - e.Iota = 333; - e.theta1 = 631; - e.Kappa = 722; - e.Lambda = 686; - e.Mu = 889; - e.Nu = 722; - e.Omicron = 722; - e.Pi = 768; - e.Theta = 741; - e.Rho = 556; - e.Sigma = 592; - e.Tau = 611; - e.Upsilon = 690; - e.sigma1 = 439; - e.Omega = 768; - e.Xi = 645; - e.Psi = 795; - e.Zeta = 611; - e.bracketleft = 333; - e.therefore = 863; - e.bracketright = 333; - e.perpendicular = 658; - e.underscore = 500; - e.radicalex = 500; - e.alpha = 631; - e.beta = 549; - e.chi = 549; - e.delta = 494; - e.epsilon = 439; - e.phi = 521; - e.gamma = 411; - e.eta = 603; - e.iota = 329; - e.phi1 = 603; - e.kappa = 549; - e.lambda = 549; - e.mu = 576; - e.nu = 521; - e.omicron = 549; - e.pi = 549; - e.theta = 521; - e.rho = 549; - e.sigma = 603; - e.tau = 439; - e.upsilon = 576; - e.omega1 = 713; - e.omega = 686; - e.xi = 493; - e.psi = 686; - e.zeta = 494; - e.braceleft = 480; - e.bar = 200; - e.braceright = 480; - e.similar = 549; - e.Euro = 750; - e.Upsilon1 = 620; - e.minute = 247; - e.lessequal = 549; - e.fraction = 167; - e.infinity = 713; - e.florin = 500; - e.club = 753; - e.diamond = 753; - e.heart = 753; - e.spade = 753; - e.arrowboth = 1042; - e.arrowleft = 987; - e.arrowup = 603; - e.arrowright = 987; - e.arrowdown = 603; - e.degree = 400; - e.plusminus = 549; - e.second = 411; - e.greaterequal = 549; - e.multiply = 549; - e.proportional = 713; - e.partialdiff = 494; - e.bullet = 460; - e.divide = 549; - e.notequal = 549; - e.equivalence = 549; - e.approxequal = 549; - e.ellipsis = 1e3; - e.arrowvertex = 603; - e.arrowhorizex = 1e3; - e.carriagereturn = 658; - e.aleph = 823; - e.Ifraktur = 686; - e.Rfraktur = 795; - e.weierstrass = 987; - e.circlemultiply = 768; - e.circleplus = 768; - e.emptyset = 823; - e.intersection = 768; - e.union = 768; - e.propersuperset = 713; - e.reflexsuperset = 713; - e.notsubset = 713; - e.propersubset = 713; - e.reflexsubset = 713; - e.element = 713; - e.notelement = 713; - e.angle = 768; - e.gradient = 713; - e.registerserif = 790; - e.copyrightserif = 790; - e.trademarkserif = 890; - e.product = 823; - e.radical = 549; - e.dotmath = 250; - e.logicalnot = 713; - e.logicaland = 603; - e.logicalor = 603; - e.arrowdblboth = 1042; - e.arrowdblleft = 987; - e.arrowdblup = 603; - e.arrowdblright = 987; - e.arrowdbldown = 603; - e.lozenge = 494; - e.angleleft = 329; - e.registersans = 790; - e.copyrightsans = 790; - e.trademarksans = 786; - e.summation = 713; - e.parenlefttp = 384; - e.parenleftex = 384; - e.parenleftbt = 384; - e.bracketlefttp = 384; - e.bracketleftex = 384; - e.bracketleftbt = 384; - e.bracelefttp = 494; - e.braceleftmid = 494; - e.braceleftbt = 494; - e.braceex = 494; - e.angleright = 329; - e.integral = 274; - e.integraltp = 686; - e.integralex = 686; - e.integralbt = 686; - e.parenrighttp = 384; - e.parenrightex = 384; - e.parenrightbt = 384; - e.bracketrighttp = 384; - e.bracketrightex = 384; - e.bracketrightbt = 384; - e.bracerighttp = 494; - e.bracerightmid = 494; - e.bracerightbt = 494; - e.apple = 790; - }); - e["Times-Roman"] = getLookupTableFactory(function (e) { - e.space = 250; - e.exclam = 333; - e.quotedbl = 408; - e.numbersign = 500; - e.dollar = 500; - e.percent = 833; - e.ampersand = 778; - e.quoteright = 333; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 500; - e.plus = 564; - e.comma = 250; - e.hyphen = 333; - e.period = 250; - e.slash = 278; - e.zero = 500; - e.one = 500; - e.two = 500; - e.three = 500; - e.four = 500; - e.five = 500; - e.six = 500; - e.seven = 500; - e.eight = 500; - e.nine = 500; - e.colon = 278; - e.semicolon = 278; - e.less = 564; - e.equal = 564; - e.greater = 564; - e.question = 444; - e.at = 921; - e.A = 722; - e.B = 667; - e.C = 667; - e.D = 722; - e.E = 611; - e.F = 556; - e.G = 722; - e.H = 722; - e.I = 333; - e.J = 389; - e.K = 722; - e.L = 611; - e.M = 889; - e.N = 722; - e.O = 722; - e.P = 556; - e.Q = 722; - e.R = 667; - e.S = 556; - e.T = 611; - e.U = 722; - e.V = 722; - e.W = 944; - e.X = 722; - e.Y = 722; - e.Z = 611; - e.bracketleft = 333; - e.backslash = 278; - e.bracketright = 333; - e.asciicircum = 469; - e.underscore = 500; - e.quoteleft = 333; - e.a = 444; - e.b = 500; - e.c = 444; - e.d = 500; - e.e = 444; - e.f = 333; - e.g = 500; - e.h = 500; - e.i = 278; - e.j = 278; - e.k = 500; - e.l = 278; - e.m = 778; - e.n = 500; - e.o = 500; - e.p = 500; - e.q = 500; - e.r = 333; - e.s = 389; - e.t = 278; - e.u = 500; - e.v = 500; - e.w = 722; - e.x = 500; - e.y = 500; - e.z = 444; - e.braceleft = 480; - e.bar = 200; - e.braceright = 480; - e.asciitilde = 541; - e.exclamdown = 333; - e.cent = 500; - e.sterling = 500; - e.fraction = 167; - e.yen = 500; - e.florin = 500; - e.section = 500; - e.currency = 500; - e.quotesingle = 180; - e.quotedblleft = 444; - e.guillemotleft = 500; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 556; - e.fl = 556; - e.endash = 500; - e.dagger = 500; - e.daggerdbl = 500; - e.periodcentered = 250; - e.paragraph = 453; - e.bullet = 350; - e.quotesinglbase = 333; - e.quotedblbase = 444; - e.quotedblright = 444; - e.guillemotright = 500; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 444; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 889; - e.ordfeminine = 276; - e.Lslash = 611; - e.Oslash = 722; - e.OE = 889; - e.ordmasculine = 310; - e.ae = 667; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 500; - e.oe = 722; - e.germandbls = 500; - e.Idieresis = 333; - e.eacute = 444; - e.abreve = 444; - e.uhungarumlaut = 500; - e.ecaron = 444; - e.Ydieresis = 722; - e.divide = 564; - e.Yacute = 722; - e.Acircumflex = 722; - e.aacute = 444; - e.Ucircumflex = 722; - e.yacute = 500; - e.scommaaccent = 389; - e.ecircumflex = 444; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 444; - e.Uacute = 722; - e.uogonek = 500; - e.Edieresis = 611; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 760; - e.Emacron = 611; - e.ccaron = 444; - e.aring = 444; - e.Ncommaaccent = 722; - e.lacute = 278; - e.agrave = 444; - e.Tcommaaccent = 611; - e.Cacute = 667; - e.atilde = 444; - e.Edotaccent = 611; - e.scaron = 389; - e.scedilla = 389; - e.iacute = 278; - e.lozenge = 471; - e.Rcaron = 667; - e.Gcommaaccent = 722; - e.ucircumflex = 500; - e.acircumflex = 444; - e.Amacron = 722; - e.rcaron = 333; - e.ccedilla = 444; - e.Zdotaccent = 611; - e.Thorn = 556; - e.Omacron = 722; - e.Racute = 667; - e.Sacute = 556; - e.dcaron = 588; - e.Umacron = 722; - e.uring = 500; - e.threesuperior = 300; - e.Ograve = 722; - e.Agrave = 722; - e.Abreve = 722; - e.multiply = 564; - e.uacute = 500; - e.Tcaron = 611; - e.partialdiff = 476; - e.ydieresis = 500; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 611; - e.adieresis = 444; - e.edieresis = 444; - e.cacute = 444; - e.nacute = 500; - e.umacron = 500; - e.Ncaron = 722; - e.Iacute = 333; - e.plusminus = 564; - e.brokenbar = 200; - e.registered = 760; - e.Gbreve = 722; - e.Idotaccent = 333; - e.summation = 600; - e.Egrave = 611; - e.racute = 333; - e.omacron = 500; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 667; - e.lcommaaccent = 278; - e.tcaron = 326; - e.eogonek = 444; - e.Uogonek = 722; - e.Aacute = 722; - e.Adieresis = 722; - e.egrave = 444; - e.zacute = 444; - e.iogonek = 278; - e.Oacute = 722; - e.oacute = 500; - e.amacron = 444; - e.sacute = 389; - e.idieresis = 278; - e.Ocircumflex = 722; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 500; - e.twosuperior = 300; - e.Odieresis = 722; - e.mu = 500; - e.igrave = 278; - e.ohungarumlaut = 500; - e.Eogonek = 611; - e.dcroat = 500; - e.threequarters = 750; - e.Scedilla = 556; - e.lcaron = 344; - e.Kcommaaccent = 722; - e.Lacute = 611; - e.trademark = 980; - e.edotaccent = 444; - e.Igrave = 333; - e.Imacron = 333; - e.Lcaron = 611; - e.onehalf = 750; - e.lessequal = 549; - e.ocircumflex = 500; - e.ntilde = 500; - e.Uhungarumlaut = 722; - e.Eacute = 611; - e.emacron = 444; - e.gbreve = 500; - e.onequarter = 750; - e.Scaron = 556; - e.Scommaaccent = 556; - e.Ohungarumlaut = 722; - e.degree = 400; - e.ograve = 500; - e.Ccaron = 667; - e.ugrave = 500; - e.radical = 453; - e.Dcaron = 722; - e.rcommaaccent = 333; - e.Ntilde = 722; - e.otilde = 500; - e.Rcommaaccent = 667; - e.Lcommaaccent = 611; - e.Atilde = 722; - e.Aogonek = 722; - e.Aring = 722; - e.Otilde = 722; - e.zdotaccent = 444; - e.Ecaron = 611; - e.Iogonek = 333; - e.kcommaaccent = 500; - e.minus = 564; - e.Icircumflex = 333; - e.ncaron = 500; - e.tcommaaccent = 278; - e.logicalnot = 564; - e.odieresis = 500; - e.udieresis = 500; - e.notequal = 549; - e.gcommaaccent = 500; - e.eth = 500; - e.zcaron = 444; - e.ncommaaccent = 500; - e.onesuperior = 300; - e.imacron = 278; - e.Euro = 500; - }); - e["Times-Bold"] = getLookupTableFactory(function (e) { - e.space = 250; - e.exclam = 333; - e.quotedbl = 555; - e.numbersign = 500; - e.dollar = 500; - e.percent = 1e3; - e.ampersand = 833; - e.quoteright = 333; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 500; - e.plus = 570; - e.comma = 250; - e.hyphen = 333; - e.period = 250; - e.slash = 278; - e.zero = 500; - e.one = 500; - e.two = 500; - e.three = 500; - e.four = 500; - e.five = 500; - e.six = 500; - e.seven = 500; - e.eight = 500; - e.nine = 500; - e.colon = 333; - e.semicolon = 333; - e.less = 570; - e.equal = 570; - e.greater = 570; - e.question = 500; - e.at = 930; - e.A = 722; - e.B = 667; - e.C = 722; - e.D = 722; - e.E = 667; - e.F = 611; - e.G = 778; - e.H = 778; - e.I = 389; - e.J = 500; - e.K = 778; - e.L = 667; - e.M = 944; - e.N = 722; - e.O = 778; - e.P = 611; - e.Q = 778; - e.R = 722; - e.S = 556; - e.T = 667; - e.U = 722; - e.V = 722; - e.W = 1e3; - e.X = 722; - e.Y = 722; - e.Z = 667; - e.bracketleft = 333; - e.backslash = 278; - e.bracketright = 333; - e.asciicircum = 581; - e.underscore = 500; - e.quoteleft = 333; - e.a = 500; - e.b = 556; - e.c = 444; - e.d = 556; - e.e = 444; - e.f = 333; - e.g = 500; - e.h = 556; - e.i = 278; - e.j = 333; - e.k = 556; - e.l = 278; - e.m = 833; - e.n = 556; - e.o = 500; - e.p = 556; - e.q = 556; - e.r = 444; - e.s = 389; - e.t = 333; - e.u = 556; - e.v = 500; - e.w = 722; - e.x = 500; - e.y = 500; - e.z = 444; - e.braceleft = 394; - e.bar = 220; - e.braceright = 394; - e.asciitilde = 520; - e.exclamdown = 333; - e.cent = 500; - e.sterling = 500; - e.fraction = 167; - e.yen = 500; - e.florin = 500; - e.section = 500; - e.currency = 500; - e.quotesingle = 278; - e.quotedblleft = 500; - e.guillemotleft = 500; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 556; - e.fl = 556; - e.endash = 500; - e.dagger = 500; - e.daggerdbl = 500; - e.periodcentered = 250; - e.paragraph = 540; - e.bullet = 350; - e.quotesinglbase = 333; - e.quotedblbase = 500; - e.quotedblright = 500; - e.guillemotright = 500; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 500; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 1e3; - e.ordfeminine = 300; - e.Lslash = 667; - e.Oslash = 778; - e.OE = 1e3; - e.ordmasculine = 330; - e.ae = 722; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 500; - e.oe = 722; - e.germandbls = 556; - e.Idieresis = 389; - e.eacute = 444; - e.abreve = 500; - e.uhungarumlaut = 556; - e.ecaron = 444; - e.Ydieresis = 722; - e.divide = 570; - e.Yacute = 722; - e.Acircumflex = 722; - e.aacute = 500; - e.Ucircumflex = 722; - e.yacute = 500; - e.scommaaccent = 389; - e.ecircumflex = 444; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 500; - e.Uacute = 722; - e.uogonek = 556; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 747; - e.Emacron = 667; - e.ccaron = 444; - e.aring = 500; - e.Ncommaaccent = 722; - e.lacute = 278; - e.agrave = 500; - e.Tcommaaccent = 667; - e.Cacute = 722; - e.atilde = 500; - e.Edotaccent = 667; - e.scaron = 389; - e.scedilla = 389; - e.iacute = 278; - e.lozenge = 494; - e.Rcaron = 722; - e.Gcommaaccent = 778; - e.ucircumflex = 556; - e.acircumflex = 500; - e.Amacron = 722; - e.rcaron = 444; - e.ccedilla = 444; - e.Zdotaccent = 667; - e.Thorn = 611; - e.Omacron = 778; - e.Racute = 722; - e.Sacute = 556; - e.dcaron = 672; - e.Umacron = 722; - e.uring = 556; - e.threesuperior = 300; - e.Ograve = 778; - e.Agrave = 722; - e.Abreve = 722; - e.multiply = 570; - e.uacute = 556; - e.Tcaron = 667; - e.partialdiff = 494; - e.ydieresis = 500; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 500; - e.edieresis = 444; - e.cacute = 444; - e.nacute = 556; - e.umacron = 556; - e.Ncaron = 722; - e.Iacute = 389; - e.plusminus = 570; - e.brokenbar = 220; - e.registered = 747; - e.Gbreve = 778; - e.Idotaccent = 389; - e.summation = 600; - e.Egrave = 667; - e.racute = 444; - e.omacron = 500; - e.Zacute = 667; - e.Zcaron = 667; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 722; - e.lcommaaccent = 278; - e.tcaron = 416; - e.eogonek = 444; - e.Uogonek = 722; - e.Aacute = 722; - e.Adieresis = 722; - e.egrave = 444; - e.zacute = 444; - e.iogonek = 278; - e.Oacute = 778; - e.oacute = 500; - e.amacron = 500; - e.sacute = 389; - e.idieresis = 278; - e.Ocircumflex = 778; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 556; - e.twosuperior = 300; - e.Odieresis = 778; - e.mu = 556; - e.igrave = 278; - e.ohungarumlaut = 500; - e.Eogonek = 667; - e.dcroat = 556; - e.threequarters = 750; - e.Scedilla = 556; - e.lcaron = 394; - e.Kcommaaccent = 778; - e.Lacute = 667; - e.trademark = 1e3; - e.edotaccent = 444; - e.Igrave = 389; - e.Imacron = 389; - e.Lcaron = 667; - e.onehalf = 750; - e.lessequal = 549; - e.ocircumflex = 500; - e.ntilde = 556; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 444; - e.gbreve = 500; - e.onequarter = 750; - e.Scaron = 556; - e.Scommaaccent = 556; - e.Ohungarumlaut = 778; - e.degree = 400; - e.ograve = 500; - e.Ccaron = 722; - e.ugrave = 556; - e.radical = 549; - e.Dcaron = 722; - e.rcommaaccent = 444; - e.Ntilde = 722; - e.otilde = 500; - e.Rcommaaccent = 722; - e.Lcommaaccent = 667; - e.Atilde = 722; - e.Aogonek = 722; - e.Aring = 722; - e.Otilde = 778; - e.zdotaccent = 444; - e.Ecaron = 667; - e.Iogonek = 389; - e.kcommaaccent = 556; - e.minus = 570; - e.Icircumflex = 389; - e.ncaron = 556; - e.tcommaaccent = 333; - e.logicalnot = 570; - e.odieresis = 500; - e.udieresis = 556; - e.notequal = 549; - e.gcommaaccent = 500; - e.eth = 500; - e.zcaron = 444; - e.ncommaaccent = 556; - e.onesuperior = 300; - e.imacron = 278; - e.Euro = 500; - }); - e["Times-BoldItalic"] = getLookupTableFactory(function (e) { - e.space = 250; - e.exclam = 389; - e.quotedbl = 555; - e.numbersign = 500; - e.dollar = 500; - e.percent = 833; - e.ampersand = 778; - e.quoteright = 333; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 500; - e.plus = 570; - e.comma = 250; - e.hyphen = 333; - e.period = 250; - e.slash = 278; - e.zero = 500; - e.one = 500; - e.two = 500; - e.three = 500; - e.four = 500; - e.five = 500; - e.six = 500; - e.seven = 500; - e.eight = 500; - e.nine = 500; - e.colon = 333; - e.semicolon = 333; - e.less = 570; - e.equal = 570; - e.greater = 570; - e.question = 500; - e.at = 832; - e.A = 667; - e.B = 667; - e.C = 667; - e.D = 722; - e.E = 667; - e.F = 667; - e.G = 722; - e.H = 778; - e.I = 389; - e.J = 500; - e.K = 667; - e.L = 611; - e.M = 889; - e.N = 722; - e.O = 722; - e.P = 611; - e.Q = 722; - e.R = 667; - e.S = 556; - e.T = 611; - e.U = 722; - e.V = 667; - e.W = 889; - e.X = 667; - e.Y = 611; - e.Z = 611; - e.bracketleft = 333; - e.backslash = 278; - e.bracketright = 333; - e.asciicircum = 570; - e.underscore = 500; - e.quoteleft = 333; - e.a = 500; - e.b = 500; - e.c = 444; - e.d = 500; - e.e = 444; - e.f = 333; - e.g = 500; - e.h = 556; - e.i = 278; - e.j = 278; - e.k = 500; - e.l = 278; - e.m = 778; - e.n = 556; - e.o = 500; - e.p = 500; - e.q = 500; - e.r = 389; - e.s = 389; - e.t = 278; - e.u = 556; - e.v = 444; - e.w = 667; - e.x = 500; - e.y = 444; - e.z = 389; - e.braceleft = 348; - e.bar = 220; - e.braceright = 348; - e.asciitilde = 570; - e.exclamdown = 389; - e.cent = 500; - e.sterling = 500; - e.fraction = 167; - e.yen = 500; - e.florin = 500; - e.section = 500; - e.currency = 500; - e.quotesingle = 278; - e.quotedblleft = 500; - e.guillemotleft = 500; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 556; - e.fl = 556; - e.endash = 500; - e.dagger = 500; - e.daggerdbl = 500; - e.periodcentered = 250; - e.paragraph = 500; - e.bullet = 350; - e.quotesinglbase = 333; - e.quotedblbase = 500; - e.quotedblright = 500; - e.guillemotright = 500; - e.ellipsis = 1e3; - e.perthousand = 1e3; - e.questiondown = 500; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 1e3; - e.AE = 944; - e.ordfeminine = 266; - e.Lslash = 611; - e.Oslash = 722; - e.OE = 944; - e.ordmasculine = 300; - e.ae = 722; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 500; - e.oe = 722; - e.germandbls = 500; - e.Idieresis = 389; - e.eacute = 444; - e.abreve = 500; - e.uhungarumlaut = 556; - e.ecaron = 444; - e.Ydieresis = 611; - e.divide = 570; - e.Yacute = 611; - e.Acircumflex = 667; - e.aacute = 500; - e.Ucircumflex = 722; - e.yacute = 444; - e.scommaaccent = 389; - e.ecircumflex = 444; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 500; - e.Uacute = 722; - e.uogonek = 556; - e.Edieresis = 667; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 747; - e.Emacron = 667; - e.ccaron = 444; - e.aring = 500; - e.Ncommaaccent = 722; - e.lacute = 278; - e.agrave = 500; - e.Tcommaaccent = 611; - e.Cacute = 667; - e.atilde = 500; - e.Edotaccent = 667; - e.scaron = 389; - e.scedilla = 389; - e.iacute = 278; - e.lozenge = 494; - e.Rcaron = 667; - e.Gcommaaccent = 722; - e.ucircumflex = 556; - e.acircumflex = 500; - e.Amacron = 667; - e.rcaron = 389; - e.ccedilla = 444; - e.Zdotaccent = 611; - e.Thorn = 611; - e.Omacron = 722; - e.Racute = 667; - e.Sacute = 556; - e.dcaron = 608; - e.Umacron = 722; - e.uring = 556; - e.threesuperior = 300; - e.Ograve = 722; - e.Agrave = 667; - e.Abreve = 667; - e.multiply = 570; - e.uacute = 556; - e.Tcaron = 611; - e.partialdiff = 494; - e.ydieresis = 444; - e.Nacute = 722; - e.icircumflex = 278; - e.Ecircumflex = 667; - e.adieresis = 500; - e.edieresis = 444; - e.cacute = 444; - e.nacute = 556; - e.umacron = 556; - e.Ncaron = 722; - e.Iacute = 389; - e.plusminus = 570; - e.brokenbar = 220; - e.registered = 747; - e.Gbreve = 722; - e.Idotaccent = 389; - e.summation = 600; - e.Egrave = 667; - e.racute = 389; - e.omacron = 500; - e.Zacute = 611; - e.Zcaron = 611; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 667; - e.lcommaaccent = 278; - e.tcaron = 366; - e.eogonek = 444; - e.Uogonek = 722; - e.Aacute = 667; - e.Adieresis = 667; - e.egrave = 444; - e.zacute = 389; - e.iogonek = 278; - e.Oacute = 722; - e.oacute = 500; - e.amacron = 500; - e.sacute = 389; - e.idieresis = 278; - e.Ocircumflex = 722; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 500; - e.twosuperior = 300; - e.Odieresis = 722; - e.mu = 576; - e.igrave = 278; - e.ohungarumlaut = 500; - e.Eogonek = 667; - e.dcroat = 500; - e.threequarters = 750; - e.Scedilla = 556; - e.lcaron = 382; - e.Kcommaaccent = 667; - e.Lacute = 611; - e.trademark = 1e3; - e.edotaccent = 444; - e.Igrave = 389; - e.Imacron = 389; - e.Lcaron = 611; - e.onehalf = 750; - e.lessequal = 549; - e.ocircumflex = 500; - e.ntilde = 556; - e.Uhungarumlaut = 722; - e.Eacute = 667; - e.emacron = 444; - e.gbreve = 500; - e.onequarter = 750; - e.Scaron = 556; - e.Scommaaccent = 556; - e.Ohungarumlaut = 722; - e.degree = 400; - e.ograve = 500; - e.Ccaron = 667; - e.ugrave = 556; - e.radical = 549; - e.Dcaron = 722; - e.rcommaaccent = 389; - e.Ntilde = 722; - e.otilde = 500; - e.Rcommaaccent = 667; - e.Lcommaaccent = 611; - e.Atilde = 667; - e.Aogonek = 667; - e.Aring = 667; - e.Otilde = 722; - e.zdotaccent = 389; - e.Ecaron = 667; - e.Iogonek = 389; - e.kcommaaccent = 500; - e.minus = 606; - e.Icircumflex = 389; - e.ncaron = 556; - e.tcommaaccent = 278; - e.logicalnot = 606; - e.odieresis = 500; - e.udieresis = 556; - e.notequal = 549; - e.gcommaaccent = 500; - e.eth = 500; - e.zcaron = 389; - e.ncommaaccent = 556; - e.onesuperior = 300; - e.imacron = 278; - e.Euro = 500; - }); - e["Times-Italic"] = getLookupTableFactory(function (e) { - e.space = 250; - e.exclam = 333; - e.quotedbl = 420; - e.numbersign = 500; - e.dollar = 500; - e.percent = 833; - e.ampersand = 778; - e.quoteright = 333; - e.parenleft = 333; - e.parenright = 333; - e.asterisk = 500; - e.plus = 675; - e.comma = 250; - e.hyphen = 333; - e.period = 250; - e.slash = 278; - e.zero = 500; - e.one = 500; - e.two = 500; - e.three = 500; - e.four = 500; - e.five = 500; - e.six = 500; - e.seven = 500; - e.eight = 500; - e.nine = 500; - e.colon = 333; - e.semicolon = 333; - e.less = 675; - e.equal = 675; - e.greater = 675; - e.question = 500; - e.at = 920; - e.A = 611; - e.B = 611; - e.C = 667; - e.D = 722; - e.E = 611; - e.F = 611; - e.G = 722; - e.H = 722; - e.I = 333; - e.J = 444; - e.K = 667; - e.L = 556; - e.M = 833; - e.N = 667; - e.O = 722; - e.P = 611; - e.Q = 722; - e.R = 611; - e.S = 500; - e.T = 556; - e.U = 722; - e.V = 611; - e.W = 833; - e.X = 611; - e.Y = 556; - e.Z = 556; - e.bracketleft = 389; - e.backslash = 278; - e.bracketright = 389; - e.asciicircum = 422; - e.underscore = 500; - e.quoteleft = 333; - e.a = 500; - e.b = 500; - e.c = 444; - e.d = 500; - e.e = 444; - e.f = 278; - e.g = 500; - e.h = 500; - e.i = 278; - e.j = 278; - e.k = 444; - e.l = 278; - e.m = 722; - e.n = 500; - e.o = 500; - e.p = 500; - e.q = 500; - e.r = 389; - e.s = 389; - e.t = 278; - e.u = 500; - e.v = 444; - e.w = 667; - e.x = 444; - e.y = 444; - e.z = 389; - e.braceleft = 400; - e.bar = 275; - e.braceright = 400; - e.asciitilde = 541; - e.exclamdown = 389; - e.cent = 500; - e.sterling = 500; - e.fraction = 167; - e.yen = 500; - e.florin = 500; - e.section = 500; - e.currency = 500; - e.quotesingle = 214; - e.quotedblleft = 556; - e.guillemotleft = 500; - e.guilsinglleft = 333; - e.guilsinglright = 333; - e.fi = 500; - e.fl = 500; - e.endash = 500; - e.dagger = 500; - e.daggerdbl = 500; - e.periodcentered = 250; - e.paragraph = 523; - e.bullet = 350; - e.quotesinglbase = 333; - e.quotedblbase = 556; - e.quotedblright = 556; - e.guillemotright = 500; - e.ellipsis = 889; - e.perthousand = 1e3; - e.questiondown = 500; - e.grave = 333; - e.acute = 333; - e.circumflex = 333; - e.tilde = 333; - e.macron = 333; - e.breve = 333; - e.dotaccent = 333; - e.dieresis = 333; - e.ring = 333; - e.cedilla = 333; - e.hungarumlaut = 333; - e.ogonek = 333; - e.caron = 333; - e.emdash = 889; - e.AE = 889; - e.ordfeminine = 276; - e.Lslash = 556; - e.Oslash = 722; - e.OE = 944; - e.ordmasculine = 310; - e.ae = 667; - e.dotlessi = 278; - e.lslash = 278; - e.oslash = 500; - e.oe = 667; - e.germandbls = 500; - e.Idieresis = 333; - e.eacute = 444; - e.abreve = 500; - e.uhungarumlaut = 500; - e.ecaron = 444; - e.Ydieresis = 556; - e.divide = 675; - e.Yacute = 556; - e.Acircumflex = 611; - e.aacute = 500; - e.Ucircumflex = 722; - e.yacute = 444; - e.scommaaccent = 389; - e.ecircumflex = 444; - e.Uring = 722; - e.Udieresis = 722; - e.aogonek = 500; - e.Uacute = 722; - e.uogonek = 500; - e.Edieresis = 611; - e.Dcroat = 722; - e.commaaccent = 250; - e.copyright = 760; - e.Emacron = 611; - e.ccaron = 444; - e.aring = 500; - e.Ncommaaccent = 667; - e.lacute = 278; - e.agrave = 500; - e.Tcommaaccent = 556; - e.Cacute = 667; - e.atilde = 500; - e.Edotaccent = 611; - e.scaron = 389; - e.scedilla = 389; - e.iacute = 278; - e.lozenge = 471; - e.Rcaron = 611; - e.Gcommaaccent = 722; - e.ucircumflex = 500; - e.acircumflex = 500; - e.Amacron = 611; - e.rcaron = 389; - e.ccedilla = 444; - e.Zdotaccent = 556; - e.Thorn = 611; - e.Omacron = 722; - e.Racute = 611; - e.Sacute = 500; - e.dcaron = 544; - e.Umacron = 722; - e.uring = 500; - e.threesuperior = 300; - e.Ograve = 722; - e.Agrave = 611; - e.Abreve = 611; - e.multiply = 675; - e.uacute = 500; - e.Tcaron = 556; - e.partialdiff = 476; - e.ydieresis = 444; - e.Nacute = 667; - e.icircumflex = 278; - e.Ecircumflex = 611; - e.adieresis = 500; - e.edieresis = 444; - e.cacute = 444; - e.nacute = 500; - e.umacron = 500; - e.Ncaron = 667; - e.Iacute = 333; - e.plusminus = 675; - e.brokenbar = 275; - e.registered = 760; - e.Gbreve = 722; - e.Idotaccent = 333; - e.summation = 600; - e.Egrave = 611; - e.racute = 389; - e.omacron = 500; - e.Zacute = 556; - e.Zcaron = 556; - e.greaterequal = 549; - e.Eth = 722; - e.Ccedilla = 667; - e.lcommaaccent = 278; - e.tcaron = 300; - e.eogonek = 444; - e.Uogonek = 722; - e.Aacute = 611; - e.Adieresis = 611; - e.egrave = 444; - e.zacute = 389; - e.iogonek = 278; - e.Oacute = 722; - e.oacute = 500; - e.amacron = 500; - e.sacute = 389; - e.idieresis = 278; - e.Ocircumflex = 722; - e.Ugrave = 722; - e.Delta = 612; - e.thorn = 500; - e.twosuperior = 300; - e.Odieresis = 722; - e.mu = 500; - e.igrave = 278; - e.ohungarumlaut = 500; - e.Eogonek = 611; - e.dcroat = 500; - e.threequarters = 750; - e.Scedilla = 500; - e.lcaron = 300; - e.Kcommaaccent = 667; - e.Lacute = 556; - e.trademark = 980; - e.edotaccent = 444; - e.Igrave = 333; - e.Imacron = 333; - e.Lcaron = 611; - e.onehalf = 750; - e.lessequal = 549; - e.ocircumflex = 500; - e.ntilde = 500; - e.Uhungarumlaut = 722; - e.Eacute = 611; - e.emacron = 444; - e.gbreve = 500; - e.onequarter = 750; - e.Scaron = 500; - e.Scommaaccent = 500; - e.Ohungarumlaut = 722; - e.degree = 400; - e.ograve = 500; - e.Ccaron = 667; - e.ugrave = 500; - e.radical = 453; - e.Dcaron = 722; - e.rcommaaccent = 389; - e.Ntilde = 667; - e.otilde = 500; - e.Rcommaaccent = 611; - e.Lcommaaccent = 556; - e.Atilde = 611; - e.Aogonek = 611; - e.Aring = 611; - e.Otilde = 722; - e.zdotaccent = 389; - e.Ecaron = 611; - e.Iogonek = 333; - e.kcommaaccent = 444; - e.minus = 675; - e.Icircumflex = 333; - e.ncaron = 500; - e.tcommaaccent = 278; - e.logicalnot = 675; - e.odieresis = 500; - e.udieresis = 500; - e.notequal = 549; - e.gcommaaccent = 500; - e.eth = 500; - e.zcaron = 389; - e.ncommaaccent = 500; - e.onesuperior = 300; - e.imacron = 278; - e.Euro = 500; - }); - e.ZapfDingbats = getLookupTableFactory(function (e) { - e.space = 278; - e.a1 = 974; - e.a2 = 961; - e.a202 = 974; - e.a3 = 980; - e.a4 = 719; - e.a5 = 789; - e.a119 = 790; - e.a118 = 791; - e.a117 = 690; - e.a11 = 960; - e.a12 = 939; - e.a13 = 549; - e.a14 = 855; - e.a15 = 911; - e.a16 = 933; - e.a105 = 911; - e.a17 = 945; - e.a18 = 974; - e.a19 = 755; - e.a20 = 846; - e.a21 = 762; - e.a22 = 761; - e.a23 = 571; - e.a24 = 677; - e.a25 = 763; - e.a26 = 760; - e.a27 = 759; - e.a28 = 754; - e.a6 = 494; - e.a7 = 552; - e.a8 = 537; - e.a9 = 577; - e.a10 = 692; - e.a29 = 786; - e.a30 = 788; - e.a31 = 788; - e.a32 = 790; - e.a33 = 793; - e.a34 = 794; - e.a35 = 816; - e.a36 = 823; - e.a37 = 789; - e.a38 = 841; - e.a39 = 823; - e.a40 = 833; - e.a41 = 816; - e.a42 = 831; - e.a43 = 923; - e.a44 = 744; - e.a45 = 723; - e.a46 = 749; - e.a47 = 790; - e.a48 = 792; - e.a49 = 695; - e.a50 = 776; - e.a51 = 768; - e.a52 = 792; - e.a53 = 759; - e.a54 = 707; - e.a55 = 708; - e.a56 = 682; - e.a57 = 701; - e.a58 = 826; - e.a59 = 815; - e.a60 = 789; - e.a61 = 789; - e.a62 = 707; - e.a63 = 687; - e.a64 = 696; - e.a65 = 689; - e.a66 = 786; - e.a67 = 787; - e.a68 = 713; - e.a69 = 791; - e.a70 = 785; - e.a71 = 791; - e.a72 = 873; - e.a73 = 761; - e.a74 = 762; - e.a203 = 762; - e.a75 = 759; - e.a204 = 759; - e.a76 = 892; - e.a77 = 892; - e.a78 = 788; - e.a79 = 784; - e.a81 = 438; - e.a82 = 138; - e.a83 = 277; - e.a84 = 415; - e.a97 = 392; - e.a98 = 392; - e.a99 = 668; - e.a100 = 668; - e.a89 = 390; - e.a90 = 390; - e.a93 = 317; - e.a94 = 317; - e.a91 = 276; - e.a92 = 276; - e.a205 = 509; - e.a85 = 509; - e.a206 = 410; - e.a86 = 410; - e.a87 = 234; - e.a88 = 234; - e.a95 = 334; - e.a96 = 334; - e.a101 = 732; - e.a102 = 544; - e.a103 = 544; - e.a104 = 910; - e.a106 = 667; - e.a107 = 760; - e.a108 = 760; - e.a112 = 776; - e.a111 = 595; - e.a110 = 694; - e.a109 = 626; - e.a120 = 788; - e.a121 = 788; - e.a122 = 788; - e.a123 = 788; - e.a124 = 788; - e.a125 = 788; - e.a126 = 788; - e.a127 = 788; - e.a128 = 788; - e.a129 = 788; - e.a130 = 788; - e.a131 = 788; - e.a132 = 788; - e.a133 = 788; - e.a134 = 788; - e.a135 = 788; - e.a136 = 788; - e.a137 = 788; - e.a138 = 788; - e.a139 = 788; - e.a140 = 788; - e.a141 = 788; - e.a142 = 788; - e.a143 = 788; - e.a144 = 788; - e.a145 = 788; - e.a146 = 788; - e.a147 = 788; - e.a148 = 788; - e.a149 = 788; - e.a150 = 788; - e.a151 = 788; - e.a152 = 788; - e.a153 = 788; - e.a154 = 788; - e.a155 = 788; - e.a156 = 788; - e.a157 = 788; - e.a158 = 788; - e.a159 = 788; - e.a160 = 894; - e.a161 = 838; - e.a163 = 1016; - e.a164 = 458; - e.a196 = 748; - e.a165 = 924; - e.a192 = 748; - e.a166 = 918; - e.a167 = 927; - e.a168 = 928; - e.a169 = 928; - e.a170 = 834; - e.a171 = 873; - e.a172 = 828; - e.a173 = 924; - e.a162 = 924; - e.a174 = 917; - e.a175 = 930; - e.a176 = 931; - e.a177 = 463; - e.a178 = 883; - e.a179 = 836; - e.a193 = 836; - e.a180 = 867; - e.a199 = 867; - e.a181 = 696; - e.a200 = 696; - e.a182 = 874; - e.a201 = 874; - e.a183 = 760; - e.a184 = 946; - e.a197 = 771; - e.a185 = 865; - e.a194 = 771; - e.a198 = 888; - e.a186 = 967; - e.a195 = 888; - e.a187 = 831; - e.a188 = 873; - e.a189 = 927; - e.a190 = 970; - e.a191 = 918; - }); - }), - ea = getLookupTableFactory(function (e) { - e.Courier = { ascent: 629, descent: -157, capHeight: 562, xHeight: -426 }; - e["Courier-Bold"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 439, - }; - e["Courier-Oblique"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 426, - }; - e["Courier-BoldOblique"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 426, - }; - e.Helvetica = { ascent: 718, descent: -207, capHeight: 718, xHeight: 523 }; - e["Helvetica-Bold"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 532, - }; - e["Helvetica-Oblique"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 523, - }; - e["Helvetica-BoldOblique"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 532, - }; - e["Times-Roman"] = { - ascent: 683, - descent: -217, - capHeight: 662, - xHeight: 450, - }; - e["Times-Bold"] = { - ascent: 683, - descent: -217, - capHeight: 676, - xHeight: 461, - }; - e["Times-Italic"] = { - ascent: 683, - descent: -217, - capHeight: 653, - xHeight: 441, - }; - e["Times-BoldItalic"] = { - ascent: 683, - descent: -217, - capHeight: 669, - xHeight: 462, - }; - e.Symbol = { - ascent: Math.NaN, - descent: Math.NaN, - capHeight: Math.NaN, - xHeight: Math.NaN, - }; - e.ZapfDingbats = { - ascent: Math.NaN, - descent: Math.NaN, - capHeight: Math.NaN, - xHeight: Math.NaN, - }; +} // ./src/core/metrics.js + +const getMetrics = getLookupTableFactory(function (t) { + t.Courier = 600; + t["Courier-Bold"] = 600; + t["Courier-BoldOblique"] = 600; + t["Courier-Oblique"] = 600; + t.Helvetica = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; }); + t["Helvetica-Bold"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 333; + t.quotedbl = 474; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 722; + t.quoteright = 278; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 333; + t.semicolon = 333; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 611; + t.at = 975; + t.A = 722; + t.B = 722; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 556; + t.K = 722; + t.L = 611; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 584; + t.underscore = 556; + t.quoteleft = 278; + t.a = 556; + t.b = 611; + t.c = 556; + t.d = 611; + t.e = 556; + t.f = 333; + t.g = 611; + t.h = 611; + t.i = 278; + t.j = 278; + t.k = 556; + t.l = 278; + t.m = 889; + t.n = 611; + t.o = 611; + t.p = 611; + t.q = 611; + t.r = 389; + t.s = 556; + t.t = 333; + t.u = 611; + t.v = 556; + t.w = 778; + t.x = 556; + t.y = 556; + t.z = 500; + t.braceleft = 389; + t.bar = 280; + t.braceright = 389; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 238; + t.quotedblleft = 500; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 611; + t.fl = 611; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 556; + t.bullet = 350; + t.quotesinglbase = 278; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 611; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 611; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 722; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 556; + t.scommaaccent = 556; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 611; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 556; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 556; + t.scedilla = 556; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 611; + t.acircumflex = 556; + t.Amacron = 722; + t.rcaron = 389; + t.ccedilla = 556; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 743; + t.Umacron = 722; + t.uring = 611; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 584; + t.uacute = 611; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 556; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 556; + t.nacute = 611; + t.umacron = 611; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 280; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 611; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 389; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 611; + t.amacron = 556; + t.sacute = 556; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 611; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 611; + t.igrave = 278; + t.ohungarumlaut = 611; + t.Eogonek = 667; + t.dcroat = 611; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 400; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 611; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 611; + t.ntilde = 611; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 611; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 611; + t.Ccaron = 722; + t.ugrave = 611; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 611; + t.Rcommaaccent = 722; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 556; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 611; + t.tcommaaccent = 333; + t.logicalnot = 584; + t.odieresis = 611; + t.udieresis = 611; + t.notequal = 549; + t.gcommaaccent = 611; + t.eth = 611; + t.zcaron = 500; + t.ncommaaccent = 611; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t["Helvetica-Oblique"] = getLookupTableFactory(function (t) { + t.space = 278; + t.exclam = 278; + t.quotedbl = 355; + t.numbersign = 556; + t.dollar = 556; + t.percent = 889; + t.ampersand = 667; + t.quoteright = 222; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 389; + t.plus = 584; + t.comma = 278; + t.hyphen = 333; + t.period = 278; + t.slash = 278; + t.zero = 556; + t.one = 556; + t.two = 556; + t.three = 556; + t.four = 556; + t.five = 556; + t.six = 556; + t.seven = 556; + t.eight = 556; + t.nine = 556; + t.colon = 278; + t.semicolon = 278; + t.less = 584; + t.equal = 584; + t.greater = 584; + t.question = 556; + t.at = 1015; + t.A = 667; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 722; + t.I = 278; + t.J = 500; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 722; + t.O = 778; + t.P = 667; + t.Q = 778; + t.R = 722; + t.S = 667; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 944; + t.X = 667; + t.Y = 667; + t.Z = 611; + t.bracketleft = 278; + t.backslash = 278; + t.bracketright = 278; + t.asciicircum = 469; + t.underscore = 556; + t.quoteleft = 222; + t.a = 556; + t.b = 556; + t.c = 500; + t.d = 556; + t.e = 556; + t.f = 278; + t.g = 556; + t.h = 556; + t.i = 222; + t.j = 222; + t.k = 500; + t.l = 222; + t.m = 833; + t.n = 556; + t.o = 556; + t.p = 556; + t.q = 556; + t.r = 333; + t.s = 500; + t.t = 278; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 500; + t.braceleft = 334; + t.bar = 260; + t.braceright = 334; + t.asciitilde = 584; + t.exclamdown = 333; + t.cent = 556; + t.sterling = 556; + t.fraction = 167; + t.yen = 556; + t.florin = 556; + t.section = 556; + t.currency = 556; + t.quotesingle = 191; + t.quotedblleft = 333; + t.guillemotleft = 556; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 556; + t.dagger = 556; + t.daggerdbl = 556; + t.periodcentered = 278; + t.paragraph = 537; + t.bullet = 350; + t.quotesinglbase = 222; + t.quotedblbase = 333; + t.quotedblright = 333; + t.guillemotright = 556; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 611; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 370; + t.Lslash = 556; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 365; + t.ae = 889; + t.dotlessi = 278; + t.lslash = 222; + t.oslash = 611; + t.oe = 944; + t.germandbls = 611; + t.Idieresis = 278; + t.eacute = 556; + t.abreve = 556; + t.uhungarumlaut = 556; + t.ecaron = 556; + t.Ydieresis = 667; + t.divide = 584; + t.Yacute = 667; + t.Acircumflex = 667; + t.aacute = 556; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 500; + t.ecircumflex = 556; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 556; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 737; + t.Emacron = 667; + t.ccaron = 500; + t.aring = 556; + t.Ncommaaccent = 722; + t.lacute = 222; + t.agrave = 556; + t.Tcommaaccent = 611; + t.Cacute = 722; + t.atilde = 556; + t.Edotaccent = 667; + t.scaron = 500; + t.scedilla = 500; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 556; + t.Amacron = 667; + t.rcaron = 333; + t.ccedilla = 500; + t.Zdotaccent = 611; + t.Thorn = 667; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 667; + t.dcaron = 643; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 333; + t.Ograve = 778; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 584; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 556; + t.edieresis = 556; + t.cacute = 500; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 278; + t.plusminus = 584; + t.brokenbar = 260; + t.registered = 737; + t.Gbreve = 778; + t.Idotaccent = 278; + t.summation = 600; + t.Egrave = 667; + t.racute = 333; + t.omacron = 556; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 222; + t.tcaron = 317; + t.eogonek = 556; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 556; + t.zacute = 500; + t.iogonek = 222; + t.Oacute = 778; + t.oacute = 556; + t.amacron = 556; + t.sacute = 500; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 333; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 556; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 834; + t.Scedilla = 667; + t.lcaron = 299; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 1000; + t.edotaccent = 556; + t.Igrave = 278; + t.Imacron = 278; + t.Lcaron = 556; + t.onehalf = 834; + t.lessequal = 549; + t.ocircumflex = 556; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 556; + t.gbreve = 556; + t.onequarter = 834; + t.Scaron = 667; + t.Scommaaccent = 667; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 556; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 556; + t.Rcommaaccent = 722; + t.Lcommaaccent = 556; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 778; + t.zdotaccent = 500; + t.Ecaron = 667; + t.Iogonek = 278; + t.kcommaaccent = 500; + t.minus = 584; + t.Icircumflex = 278; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 584; + t.odieresis = 556; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 556; + t.eth = 556; + t.zcaron = 500; + t.ncommaaccent = 556; + t.onesuperior = 333; + t.imacron = 278; + t.Euro = 556; + }); + t.Symbol = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.universal = 713; + t.numbersign = 500; + t.existential = 549; + t.percent = 833; + t.ampersand = 778; + t.suchthat = 439; + t.parenleft = 333; + t.parenright = 333; + t.asteriskmath = 500; + t.plus = 549; + t.comma = 250; + t.minus = 549; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 549; + t.equal = 549; + t.greater = 549; + t.question = 444; + t.congruent = 549; + t.Alpha = 722; + t.Beta = 667; + t.Chi = 722; + t.Delta = 612; + t.Epsilon = 611; + t.Phi = 763; + t.Gamma = 603; + t.Eta = 722; + t.Iota = 333; + t.theta1 = 631; + t.Kappa = 722; + t.Lambda = 686; + t.Mu = 889; + t.Nu = 722; + t.Omicron = 722; + t.Pi = 768; + t.Theta = 741; + t.Rho = 556; + t.Sigma = 592; + t.Tau = 611; + t.Upsilon = 690; + t.sigma1 = 439; + t.Omega = 768; + t.Xi = 645; + t.Psi = 795; + t.Zeta = 611; + t.bracketleft = 333; + t.therefore = 863; + t.bracketright = 333; + t.perpendicular = 658; + t.underscore = 500; + t.radicalex = 500; + t.alpha = 631; + t.beta = 549; + t.chi = 549; + t.delta = 494; + t.epsilon = 439; + t.phi = 521; + t.gamma = 411; + t.eta = 603; + t.iota = 329; + t.phi1 = 603; + t.kappa = 549; + t.lambda = 549; + t.mu = 576; + t.nu = 521; + t.omicron = 549; + t.pi = 549; + t.theta = 521; + t.rho = 549; + t.sigma = 603; + t.tau = 439; + t.upsilon = 576; + t.omega1 = 713; + t.omega = 686; + t.xi = 493; + t.psi = 686; + t.zeta = 494; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.similar = 549; + t.Euro = 750; + t.Upsilon1 = 620; + t.minute = 247; + t.lessequal = 549; + t.fraction = 167; + t.infinity = 713; + t.florin = 500; + t.club = 753; + t.diamond = 753; + t.heart = 753; + t.spade = 753; + t.arrowboth = 1042; + t.arrowleft = 987; + t.arrowup = 603; + t.arrowright = 987; + t.arrowdown = 603; + t.degree = 400; + t.plusminus = 549; + t.second = 411; + t.greaterequal = 549; + t.multiply = 549; + t.proportional = 713; + t.partialdiff = 494; + t.bullet = 460; + t.divide = 549; + t.notequal = 549; + t.equivalence = 549; + t.approxequal = 549; + t.ellipsis = 1000; + t.arrowvertex = 603; + t.arrowhorizex = 1000; + t.carriagereturn = 658; + t.aleph = 823; + t.Ifraktur = 686; + t.Rfraktur = 795; + t.weierstrass = 987; + t.circlemultiply = 768; + t.circleplus = 768; + t.emptyset = 823; + t.intersection = 768; + t.union = 768; + t.propersuperset = 713; + t.reflexsuperset = 713; + t.notsubset = 713; + t.propersubset = 713; + t.reflexsubset = 713; + t.element = 713; + t.notelement = 713; + t.angle = 768; + t.gradient = 713; + t.registerserif = 790; + t.copyrightserif = 790; + t.trademarkserif = 890; + t.product = 823; + t.radical = 549; + t.dotmath = 250; + t.logicalnot = 713; + t.logicaland = 603; + t.logicalor = 603; + t.arrowdblboth = 1042; + t.arrowdblleft = 987; + t.arrowdblup = 603; + t.arrowdblright = 987; + t.arrowdbldown = 603; + t.lozenge = 494; + t.angleleft = 329; + t.registersans = 790; + t.copyrightsans = 790; + t.trademarksans = 786; + t.summation = 713; + t.parenlefttp = 384; + t.parenleftex = 384; + t.parenleftbt = 384; + t.bracketlefttp = 384; + t.bracketleftex = 384; + t.bracketleftbt = 384; + t.bracelefttp = 494; + t.braceleftmid = 494; + t.braceleftbt = 494; + t.braceex = 494; + t.angleright = 329; + t.integral = 274; + t.integraltp = 686; + t.integralex = 686; + t.integralbt = 686; + t.parenrighttp = 384; + t.parenrightex = 384; + t.parenrightbt = 384; + t.bracketrighttp = 384; + t.bracketrightex = 384; + t.bracketrightbt = 384; + t.bracerighttp = 494; + t.bracerightmid = 494; + t.bracerightbt = 494; + t.apple = 790; + }); + t["Times-Roman"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 408; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 564; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 278; + t.semicolon = 278; + t.less = 564; + t.equal = 564; + t.greater = 564; + t.question = 444; + t.at = 921; + t.A = 722; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 556; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 389; + t.K = 722; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 556; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 722; + t.W = 944; + t.X = 722; + t.Y = 722; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 469; + t.underscore = 500; + t.quoteleft = 333; + t.a = 444; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 333; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 480; + t.bar = 200; + t.braceright = 480; + t.asciitilde = 541; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 180; + t.quotedblleft = 444; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 453; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 444; + t.quotedblright = 444; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 444; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 889; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 444; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 564; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 444; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 444; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 444; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 444; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 444; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 444; + t.Amacron = 722; + t.rcaron = 333; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 556; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 588; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 564; + t.uacute = 500; + t.Tcaron = 611; + t.partialdiff = 476; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 444; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 722; + t.Iacute = 333; + t.plusminus = 564; + t.brokenbar = 200; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 333; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 326; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 444; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 344; + t.Kcommaaccent = 722; + t.Lacute = 611; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 333; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 722; + t.zdotaccent = 444; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 500; + t.minus = 564; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 564; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Bold"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 1000; + t.ampersand = 833; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 930; + t.A = 722; + t.B = 667; + t.C = 722; + t.D = 722; + t.E = 667; + t.F = 611; + t.G = 778; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 778; + t.L = 667; + t.M = 944; + t.N = 722; + t.O = 778; + t.P = 611; + t.Q = 778; + t.R = 722; + t.S = 556; + t.T = 667; + t.U = 722; + t.V = 722; + t.W = 1000; + t.X = 722; + t.Y = 722; + t.Z = 667; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 581; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 556; + t.c = 444; + t.d = 556; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 333; + t.k = 556; + t.l = 278; + t.m = 833; + t.n = 556; + t.o = 500; + t.p = 556; + t.q = 556; + t.r = 444; + t.s = 389; + t.t = 333; + t.u = 556; + t.v = 500; + t.w = 722; + t.x = 500; + t.y = 500; + t.z = 444; + t.braceleft = 394; + t.bar = 220; + t.braceright = 394; + t.asciitilde = 520; + t.exclamdown = 333; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 540; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 1000; + t.ordfeminine = 300; + t.Lslash = 667; + t.Oslash = 778; + t.OE = 1000; + t.ordmasculine = 330; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 556; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 722; + t.divide = 570; + t.Yacute = 722; + t.Acircumflex = 722; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 500; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 667; + t.Cacute = 722; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 722; + t.Gcommaaccent = 778; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 722; + t.rcaron = 444; + t.ccedilla = 444; + t.Zdotaccent = 667; + t.Thorn = 611; + t.Omacron = 778; + t.Racute = 722; + t.Sacute = 556; + t.dcaron = 672; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 778; + t.Agrave = 722; + t.Abreve = 722; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 667; + t.partialdiff = 494; + t.ydieresis = 500; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 778; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 444; + t.omacron = 500; + t.Zacute = 667; + t.Zcaron = 667; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 722; + t.lcommaaccent = 278; + t.tcaron = 416; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 722; + t.Adieresis = 722; + t.egrave = 444; + t.zacute = 444; + t.iogonek = 278; + t.Oacute = 778; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 778; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 556; + t.twosuperior = 300; + t.Odieresis = 778; + t.mu = 556; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 556; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 394; + t.Kcommaaccent = 778; + t.Lacute = 667; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 667; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 778; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 722; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 444; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 722; + t.Lcommaaccent = 667; + t.Atilde = 722; + t.Aogonek = 722; + t.Aring = 722; + t.Otilde = 778; + t.zdotaccent = 444; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 556; + t.minus = 570; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 333; + t.logicalnot = 570; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 444; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-BoldItalic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 389; + t.quotedbl = 555; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 570; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 570; + t.equal = 570; + t.greater = 570; + t.question = 500; + t.at = 832; + t.A = 667; + t.B = 667; + t.C = 667; + t.D = 722; + t.E = 667; + t.F = 667; + t.G = 722; + t.H = 778; + t.I = 389; + t.J = 500; + t.K = 667; + t.L = 611; + t.M = 889; + t.N = 722; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 667; + t.S = 556; + t.T = 611; + t.U = 722; + t.V = 667; + t.W = 889; + t.X = 667; + t.Y = 611; + t.Z = 611; + t.bracketleft = 333; + t.backslash = 278; + t.bracketright = 333; + t.asciicircum = 570; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 333; + t.g = 500; + t.h = 556; + t.i = 278; + t.j = 278; + t.k = 500; + t.l = 278; + t.m = 778; + t.n = 556; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 556; + t.v = 444; + t.w = 667; + t.x = 500; + t.y = 444; + t.z = 389; + t.braceleft = 348; + t.bar = 220; + t.braceright = 348; + t.asciitilde = 570; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 278; + t.quotedblleft = 500; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 556; + t.fl = 556; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 500; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 500; + t.quotedblright = 500; + t.guillemotright = 500; + t.ellipsis = 1000; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 1000; + t.AE = 944; + t.ordfeminine = 266; + t.Lslash = 611; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 300; + t.ae = 722; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 722; + t.germandbls = 500; + t.Idieresis = 389; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 556; + t.ecaron = 444; + t.Ydieresis = 611; + t.divide = 570; + t.Yacute = 611; + t.Acircumflex = 667; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 556; + t.Edieresis = 667; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 747; + t.Emacron = 667; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 722; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 611; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 667; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 494; + t.Rcaron = 667; + t.Gcommaaccent = 722; + t.ucircumflex = 556; + t.acircumflex = 500; + t.Amacron = 667; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 611; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 667; + t.Sacute = 556; + t.dcaron = 608; + t.Umacron = 722; + t.uring = 556; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 667; + t.Abreve = 667; + t.multiply = 570; + t.uacute = 556; + t.Tcaron = 611; + t.partialdiff = 494; + t.ydieresis = 444; + t.Nacute = 722; + t.icircumflex = 278; + t.Ecircumflex = 667; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 556; + t.umacron = 556; + t.Ncaron = 722; + t.Iacute = 389; + t.plusminus = 570; + t.brokenbar = 220; + t.registered = 747; + t.Gbreve = 722; + t.Idotaccent = 389; + t.summation = 600; + t.Egrave = 667; + t.racute = 389; + t.omacron = 500; + t.Zacute = 611; + t.Zcaron = 611; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 366; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 667; + t.Adieresis = 667; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 576; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 667; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 556; + t.lcaron = 382; + t.Kcommaaccent = 667; + t.Lacute = 611; + t.trademark = 1000; + t.edotaccent = 444; + t.Igrave = 389; + t.Imacron = 389; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 556; + t.Uhungarumlaut = 722; + t.Eacute = 667; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 556; + t.Scommaaccent = 556; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 556; + t.radical = 549; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 722; + t.otilde = 500; + t.Rcommaaccent = 667; + t.Lcommaaccent = 611; + t.Atilde = 667; + t.Aogonek = 667; + t.Aring = 667; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 667; + t.Iogonek = 389; + t.kcommaaccent = 500; + t.minus = 606; + t.Icircumflex = 389; + t.ncaron = 556; + t.tcommaaccent = 278; + t.logicalnot = 606; + t.odieresis = 500; + t.udieresis = 556; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 556; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t["Times-Italic"] = getLookupTableFactory(function (t) { + t.space = 250; + t.exclam = 333; + t.quotedbl = 420; + t.numbersign = 500; + t.dollar = 500; + t.percent = 833; + t.ampersand = 778; + t.quoteright = 333; + t.parenleft = 333; + t.parenright = 333; + t.asterisk = 500; + t.plus = 675; + t.comma = 250; + t.hyphen = 333; + t.period = 250; + t.slash = 278; + t.zero = 500; + t.one = 500; + t.two = 500; + t.three = 500; + t.four = 500; + t.five = 500; + t.six = 500; + t.seven = 500; + t.eight = 500; + t.nine = 500; + t.colon = 333; + t.semicolon = 333; + t.less = 675; + t.equal = 675; + t.greater = 675; + t.question = 500; + t.at = 920; + t.A = 611; + t.B = 611; + t.C = 667; + t.D = 722; + t.E = 611; + t.F = 611; + t.G = 722; + t.H = 722; + t.I = 333; + t.J = 444; + t.K = 667; + t.L = 556; + t.M = 833; + t.N = 667; + t.O = 722; + t.P = 611; + t.Q = 722; + t.R = 611; + t.S = 500; + t.T = 556; + t.U = 722; + t.V = 611; + t.W = 833; + t.X = 611; + t.Y = 556; + t.Z = 556; + t.bracketleft = 389; + t.backslash = 278; + t.bracketright = 389; + t.asciicircum = 422; + t.underscore = 500; + t.quoteleft = 333; + t.a = 500; + t.b = 500; + t.c = 444; + t.d = 500; + t.e = 444; + t.f = 278; + t.g = 500; + t.h = 500; + t.i = 278; + t.j = 278; + t.k = 444; + t.l = 278; + t.m = 722; + t.n = 500; + t.o = 500; + t.p = 500; + t.q = 500; + t.r = 389; + t.s = 389; + t.t = 278; + t.u = 500; + t.v = 444; + t.w = 667; + t.x = 444; + t.y = 444; + t.z = 389; + t.braceleft = 400; + t.bar = 275; + t.braceright = 400; + t.asciitilde = 541; + t.exclamdown = 389; + t.cent = 500; + t.sterling = 500; + t.fraction = 167; + t.yen = 500; + t.florin = 500; + t.section = 500; + t.currency = 500; + t.quotesingle = 214; + t.quotedblleft = 556; + t.guillemotleft = 500; + t.guilsinglleft = 333; + t.guilsinglright = 333; + t.fi = 500; + t.fl = 500; + t.endash = 500; + t.dagger = 500; + t.daggerdbl = 500; + t.periodcentered = 250; + t.paragraph = 523; + t.bullet = 350; + t.quotesinglbase = 333; + t.quotedblbase = 556; + t.quotedblright = 556; + t.guillemotright = 500; + t.ellipsis = 889; + t.perthousand = 1000; + t.questiondown = 500; + t.grave = 333; + t.acute = 333; + t.circumflex = 333; + t.tilde = 333; + t.macron = 333; + t.breve = 333; + t.dotaccent = 333; + t.dieresis = 333; + t.ring = 333; + t.cedilla = 333; + t.hungarumlaut = 333; + t.ogonek = 333; + t.caron = 333; + t.emdash = 889; + t.AE = 889; + t.ordfeminine = 276; + t.Lslash = 556; + t.Oslash = 722; + t.OE = 944; + t.ordmasculine = 310; + t.ae = 667; + t.dotlessi = 278; + t.lslash = 278; + t.oslash = 500; + t.oe = 667; + t.germandbls = 500; + t.Idieresis = 333; + t.eacute = 444; + t.abreve = 500; + t.uhungarumlaut = 500; + t.ecaron = 444; + t.Ydieresis = 556; + t.divide = 675; + t.Yacute = 556; + t.Acircumflex = 611; + t.aacute = 500; + t.Ucircumflex = 722; + t.yacute = 444; + t.scommaaccent = 389; + t.ecircumflex = 444; + t.Uring = 722; + t.Udieresis = 722; + t.aogonek = 500; + t.Uacute = 722; + t.uogonek = 500; + t.Edieresis = 611; + t.Dcroat = 722; + t.commaaccent = 250; + t.copyright = 760; + t.Emacron = 611; + t.ccaron = 444; + t.aring = 500; + t.Ncommaaccent = 667; + t.lacute = 278; + t.agrave = 500; + t.Tcommaaccent = 556; + t.Cacute = 667; + t.atilde = 500; + t.Edotaccent = 611; + t.scaron = 389; + t.scedilla = 389; + t.iacute = 278; + t.lozenge = 471; + t.Rcaron = 611; + t.Gcommaaccent = 722; + t.ucircumflex = 500; + t.acircumflex = 500; + t.Amacron = 611; + t.rcaron = 389; + t.ccedilla = 444; + t.Zdotaccent = 556; + t.Thorn = 611; + t.Omacron = 722; + t.Racute = 611; + t.Sacute = 500; + t.dcaron = 544; + t.Umacron = 722; + t.uring = 500; + t.threesuperior = 300; + t.Ograve = 722; + t.Agrave = 611; + t.Abreve = 611; + t.multiply = 675; + t.uacute = 500; + t.Tcaron = 556; + t.partialdiff = 476; + t.ydieresis = 444; + t.Nacute = 667; + t.icircumflex = 278; + t.Ecircumflex = 611; + t.adieresis = 500; + t.edieresis = 444; + t.cacute = 444; + t.nacute = 500; + t.umacron = 500; + t.Ncaron = 667; + t.Iacute = 333; + t.plusminus = 675; + t.brokenbar = 275; + t.registered = 760; + t.Gbreve = 722; + t.Idotaccent = 333; + t.summation = 600; + t.Egrave = 611; + t.racute = 389; + t.omacron = 500; + t.Zacute = 556; + t.Zcaron = 556; + t.greaterequal = 549; + t.Eth = 722; + t.Ccedilla = 667; + t.lcommaaccent = 278; + t.tcaron = 300; + t.eogonek = 444; + t.Uogonek = 722; + t.Aacute = 611; + t.Adieresis = 611; + t.egrave = 444; + t.zacute = 389; + t.iogonek = 278; + t.Oacute = 722; + t.oacute = 500; + t.amacron = 500; + t.sacute = 389; + t.idieresis = 278; + t.Ocircumflex = 722; + t.Ugrave = 722; + t.Delta = 612; + t.thorn = 500; + t.twosuperior = 300; + t.Odieresis = 722; + t.mu = 500; + t.igrave = 278; + t.ohungarumlaut = 500; + t.Eogonek = 611; + t.dcroat = 500; + t.threequarters = 750; + t.Scedilla = 500; + t.lcaron = 300; + t.Kcommaaccent = 667; + t.Lacute = 556; + t.trademark = 980; + t.edotaccent = 444; + t.Igrave = 333; + t.Imacron = 333; + t.Lcaron = 611; + t.onehalf = 750; + t.lessequal = 549; + t.ocircumflex = 500; + t.ntilde = 500; + t.Uhungarumlaut = 722; + t.Eacute = 611; + t.emacron = 444; + t.gbreve = 500; + t.onequarter = 750; + t.Scaron = 500; + t.Scommaaccent = 500; + t.Ohungarumlaut = 722; + t.degree = 400; + t.ograve = 500; + t.Ccaron = 667; + t.ugrave = 500; + t.radical = 453; + t.Dcaron = 722; + t.rcommaaccent = 389; + t.Ntilde = 667; + t.otilde = 500; + t.Rcommaaccent = 611; + t.Lcommaaccent = 556; + t.Atilde = 611; + t.Aogonek = 611; + t.Aring = 611; + t.Otilde = 722; + t.zdotaccent = 389; + t.Ecaron = 611; + t.Iogonek = 333; + t.kcommaaccent = 444; + t.minus = 675; + t.Icircumflex = 333; + t.ncaron = 500; + t.tcommaaccent = 278; + t.logicalnot = 675; + t.odieresis = 500; + t.udieresis = 500; + t.notequal = 549; + t.gcommaaccent = 500; + t.eth = 500; + t.zcaron = 389; + t.ncommaaccent = 500; + t.onesuperior = 300; + t.imacron = 278; + t.Euro = 500; + }); + t.ZapfDingbats = 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; + }); +}); +const getFontBasicMetrics = getLookupTableFactory(function (t) { + t.Courier = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: -426, + }; + t["Courier-Bold"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 439, + }; + t["Courier-Oblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426, + }; + t["Courier-BoldOblique"] = { + ascent: 629, + descent: -157, + capHeight: 562, + xHeight: 426, + }; + t.Helvetica = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523, + }; + t["Helvetica-Bold"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532, + }; + t["Helvetica-Oblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 523, + }; + t["Helvetica-BoldOblique"] = { + ascent: 718, + descent: -207, + capHeight: 718, + xHeight: 532, + }; + t["Times-Roman"] = { + ascent: 683, + descent: -217, + capHeight: 662, + xHeight: 450, + }; + t["Times-Bold"] = { + ascent: 683, + descent: -217, + capHeight: 676, + xHeight: 461, + }; + t["Times-Italic"] = { + ascent: 683, + descent: -217, + capHeight: 653, + xHeight: 441, + }; + t["Times-BoldItalic"] = { + ascent: 683, + descent: -217, + capHeight: 669, + xHeight: 462, + }; + t.Symbol = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN, + }; + t.ZapfDingbats = { + ascent: Math.NaN, + descent: Math.NaN, + capHeight: Math.NaN, + xHeight: Math.NaN, + }; +}); // ./src/core/glyf.js + +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: e, - isGlyphLocationsLong: t, - locaTable: i, - numGlyphs: a, - }) { + constructor({ glyfTable, isGlyphLocationsLong, locaTable, numGlyphs }) { this.glyphs = []; - const s = new DataView(i.buffer, i.byteOffset, i.byteLength), - r = new DataView(e.buffer, e.byteOffset, e.byteLength), - n = t ? 4 : 2; - let g = t ? s.getUint32(0) : 2 * s.getUint16(0), - o = 0; - for (let e = 0; e < a; e++) { - o += n; - const e = t ? s.getUint32(o) : 2 * s.getUint16(o); - if (e === g) { + 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; } - const i = Glyph.parse(g, r); - this.glyphs.push(i); - g = e; + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; } } getSize() { - return this.glyphs.reduce((e, t) => e + ((t.getSize() + 3) & -4), 0); + return this.glyphs.reduce((a, g) => { + const size = g.getSize(); + return a + ((size + 3) & ~3); + }, 0); } write() { - const e = this.getSize(), - t = new DataView(new ArrayBuffer(e)), - i = e > 131070, - a = i ? 4 : 2, - s = new DataView(new ArrayBuffer((this.glyphs.length + 1) * a)); - i ? s.setUint32(0, 0) : s.setUint16(0, 0); - let r = 0, - n = 0; - for (const e of this.glyphs) { - r += e.write(r, t); - r = (r + 3) & -4; - n += a; - i ? s.setUint32(n, r) : s.setUint16(n, r >> 1); + 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 { - isLocationLong: i, - loca: new Uint8Array(s.buffer), - glyf: new Uint8Array(t.buffer), + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer), }; } - scale(e) { - for (let t = 0, i = this.glyphs.length; t < i; t++) - this.glyphs[t].scale(e[t]); + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } } } class Glyph { - constructor({ header: e = null, simple: t = null, composites: i = null }) { - this.header = e; - this.simple = t; - this.composites = i; + constructor({ header = null, simple = null, composites = null }) { + this.header = header; + this.simple = simple; + this.composites = composites; } - static parse(e, t) { - const [i, a] = GlyphHeader.parse(e, t); - e += i; - if (a.numberOfContours < 0) { - const i = []; - for (;;) { - const [a, s] = CompositeGlyph.parse(e, t); - e += a; - i.push(s); - if (!(32 & s.flags)) break; + 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: a, composites: i }); + return new Glyph({ + header, + composites, + }); } - const s = SimpleGlyph.parse(e, t, a.numberOfContours); - return new Glyph({ header: a, simple: s }); + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple, + }); } getSize() { - if (!this.header) return 0; - const e = this.simple + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() - : this.composites.reduce((e, t) => e + t.getSize(), 0); - return this.header.getSize() + e; + : this.composites.reduce((a, c) => a + c.getSize(), 0); + return this.header.getSize() + size; } - write(e, t) { - if (!this.header) return 0; - const i = e; - e += this.header.write(e, t); - if (this.simple) e += this.simple.write(e, t); - else for (const i of this.composites) e += i.write(e, t); - return e - i; + write(pos, buf) { + if (!this.header) { + return 0; + } + const spos = pos; + pos += this.header.write(pos, buf); + if (this.simple) { + pos += this.simple.write(pos, buf); + } else { + for (const composite of this.composites) { + pos += composite.write(pos, buf); + } + } + return pos - spos; } - scale(e) { - if (!this.header) return; - const t = (this.header.xMin + this.header.xMax) / 2; - this.header.scale(t, e); - if (this.simple) this.simple.scale(t, e); - else for (const i of this.composites) i.scale(t, e); + scale(factor) { + if (!this.header) { + return; + } + 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); + } + } } } class GlyphHeader { - constructor({ numberOfContours: e, xMin: t, yMin: i, xMax: a, yMax: s }) { - this.numberOfContours = e; - this.xMin = t; - this.yMin = i; - this.xMax = a; - this.yMax = s; + constructor({ numberOfContours, xMin, yMin, xMax, yMax }) { + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; } - static parse(e, t) { + static parse(pos, glyf) { return [ 10, new GlyphHeader({ - numberOfContours: t.getInt16(e), - xMin: t.getInt16(e + 2), - yMin: t.getInt16(e + 4), - xMax: t.getInt16(e + 6), - yMax: t.getInt16(e + 8), + 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(e, t) { - t.setInt16(e, this.numberOfContours); - t.setInt16(e + 2, this.xMin); - t.setInt16(e + 4, this.yMin); - t.setInt16(e + 6, this.xMax); - t.setInt16(e + 8, this.yMax); + 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(e, t) { - this.xMin = Math.round(e + (this.xMin - e) * t); - this.xMax = Math.round(e + (this.xMax - e) * t); + 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: e, xCoordinates: t, yCoordinates: i }) { - this.xCoordinates = t; - this.yCoordinates = i; - this.flags = e; + constructor({ flags, xCoordinates, yCoordinates }) { + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; } } class SimpleGlyph { - constructor({ contours: e, instructions: t }) { - this.contours = e; - this.instructions = t; + constructor({ contours, instructions }) { + this.contours = contours; + this.instructions = instructions; } - static parse(e, t, i) { - const a = []; - for (let s = 0; s < i; s++) { - const i = t.getUint16(e); - e += 2; - a.push(i); + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); } - const s = a[i - 1] + 1, - r = t.getUint16(e); - e += 2; - const n = new Uint8Array(t).slice(e, e + r); - e += r; - const g = []; - for (let i = 0; i < s; e++, i++) { - let a = t.getUint8(e); - g.push(a); - if (8 & a) { - const s = t.getUint8(++e); - a ^= 8; - for (let e = 0; e < s; e++) g.push(a); - i += s; + 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; } } - const o = []; - let c = [], - C = [], - h = []; - const l = []; - let Q = 0, - E = 0; - for (let i = 0; i < s; i++) { - const s = g[i]; - if (2 & s) { - const i = t.getUint8(e++); - E += 16 & s ? i : -i; - c.push(E); - } else if (16 & s) c.push(E); - else { - E += t.getInt16(e); - e += 2; - c.push(E); + 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 (a[Q] === i) { - Q++; - o.push(c); - c = []; + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; } } - E = 0; - Q = 0; - for (let i = 0; i < s; i++) { - const s = g[i]; - if (4 & s) { - const i = t.getUint8(e++); - E += 32 & s ? i : -i; - C.push(E); - } else if (32 & s) C.push(E); - else { - E += t.getInt16(e); - e += 2; - C.push(E); + lastCoordinate = 0; + endPtsOfContoursIndex = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[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); } - h.push((1 & s) | (64 & s)); - if (a[Q] === i) { - c = o[Q]; - Q++; - l.push(new Contour({ flags: h, xCoordinates: c, yCoordinates: C })); - C = []; - h = []; + 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: l, instructions: n }); + return new SimpleGlyph({ + contours, + instructions, + }); } getSize() { - let e = 2 * this.contours.length + 2 + this.instructions.length, - t = 0, - i = 0; - for (const a of this.contours) { - e += a.flags.length; - for (let s = 0, r = a.xCoordinates.length; s < r; s++) { - const r = a.xCoordinates[s], - n = a.yCoordinates[s]; - let g = Math.abs(r - t); - g > 255 ? (e += 2) : g > 0 && (e += 1); - t = r; - g = Math.abs(n - i); - g > 255 ? (e += 2) : g > 0 && (e += 1); - i = n; + 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; + } + lastY = y; } } - return e; + return size; } - write(e, t) { - const i = e, - a = [], - s = [], - r = []; - let n = 0, - g = 0; - for (const i of this.contours) { - for (let e = 0, t = i.xCoordinates.length; e < t; e++) { - let t = i.flags[e]; - const o = i.xCoordinates[e]; - let c = o - n; - if (0 === c) { - t |= 16; - a.push(0); + 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 { - const e = Math.abs(c); - if (e <= 255) { - t |= c >= 0 ? 18 : 2; - a.push(e); - } else a.push(c); + 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); + } } - n = o; - const C = i.yCoordinates[e]; - c = C - g; - if (0 === c) { - t |= 32; - s.push(0); + lastX = x; + const y = contour.yCoordinates[i]; + delta = y - lastY; + if (delta === 0) { + flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; + yCoordinates.push(0); } else { - const e = Math.abs(c); - if (e <= 255) { - t |= c >= 0 ? 36 : 4; - s.push(e); - } else s.push(c); + 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); + } } - g = C; - r.push(t); + lastY = y; + flags.push(flag); } - t.setUint16(e, a.length - 1); - e += 2; + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; } - t.setUint16(e, this.instructions.length); - e += 2; + buf.setUint16(pos, this.instructions.length); + pos += 2; if (this.instructions.length) { - new Uint8Array(t.buffer, 0, t.buffer.byteLength).set( + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set( this.instructions, - e, + pos, ); - e += this.instructions.length; + pos += this.instructions.length; } - for (const i of r) t.setUint8(e++, i); - for (let i = 0, s = a.length; i < s; i++) { - const s = a[i], - n = r[i]; - if (2 & n) t.setUint8(e++, s); - else if (!(16 & n)) { - t.setInt16(e, s); - e += 2; + 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, a = s.length; i < a; i++) { - const a = s[i], - n = r[i]; - if (4 & n) t.setUint8(e++, a); - else if (!(32 & n)) { - t.setInt16(e, a); - e += 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 e - i; + return pos - spos; } - scale(e, t) { - for (const i of this.contours) - if (0 !== i.xCoordinates.length) - for (let a = 0, s = i.xCoordinates.length; a < s; a++) - i.xCoordinates[a] = Math.round(e + (i.xCoordinates[a] - e) * t); + 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: e, - glyphIndex: t, - argument1: i, - argument2: a, - transf: s, - instructions: r, + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions, }) { - this.flags = e; - this.glyphIndex = t; - this.argument1 = i; - this.argument2 = a; - this.transf = s; - this.instructions = r; + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; } - static parse(e, t) { - const i = e, - a = []; - let s = t.getUint16(e); - const r = t.getUint16(e + 2); - e += 4; - let n, g; - if (1 & s) { - if (2 & s) { - n = t.getInt16(e); - g = t.getInt16(e + 2); + 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 { - n = t.getUint16(e); - g = t.getUint16(e + 2); + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); } - e += 4; - s ^= 1; + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; } else { - if (2 & s) { - n = t.getInt8(e); - g = t.getInt8(e + 1); + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); } else { - n = t.getUint8(e); - g = t.getUint8(e + 1); + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); } - e += 2; + pos += 2; } - if (8 & s) { - a.push(t.getUint16(e)); - e += 2; - } else if (64 & s) { - a.push(t.getUint16(e), t.getUint16(e + 2)); - e += 4; - } else if (128 & s) { - a.push( - t.getUint16(e), - t.getUint16(e + 2), - t.getUint16(e + 4), - t.getUint16(e + 6), + 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), ); - e += 8; + pos += 8; } - let o = null; - if (256 & s) { - const i = t.getUint16(e); - e += 2; - o = new Uint8Array(t).slice(e, e + i); - e += i; + let instructions = null; + if (flags & WE_HAVE_INSTRUCTIONS) { + const instructionLength = glyf.getUint16(pos); + pos += 2; + instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; } return [ - e - i, + pos - spos, new CompositeGlyph({ - flags: s, - glyphIndex: r, - argument1: n, - argument2: g, - transf: a, - instructions: o, + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions, }), ]; } getSize() { - let e = 4 + 2 * this.transf.length; - 256 & this.flags && (e += 2 + this.instructions.length); - e += 2; - 2 & this.flags - ? (this.argument1 >= -128 && + let size = 2 + 2 + this.transf.length * 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + size += 2 + this.instructions.length; + } + size += 2; + if (this.flags & 2) { + if ( + !( + this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && - this.argument2 <= 127) || - (e += 2) - : (this.argument1 >= 0 && - this.argument1 <= 255 && - this.argument2 >= 0 && - this.argument2 <= 255) || - (e += 2); - return e; + this.argument2 <= 127 + ) + ) { + size += 2; + } + } else if ( + !( + this.argument1 >= 0 && + this.argument1 <= 255 && + this.argument2 >= 0 && + this.argument2 <= 255 + ) + ) { + size += 2; + } + return size; } - write(e, t) { - const i = e; - 2 & this.flags - ? (this.argument1 >= -128 && + write(pos, buf) { + const spos = pos; + if (this.flags & ARGS_ARE_XY_VALUES) { + if ( + !( + this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && - this.argument2 <= 127) || - (this.flags |= 1) - : (this.argument1 >= 0 && - this.argument1 <= 255 && - this.argument2 >= 0 && - this.argument2 <= 255) || - (this.flags |= 1); - t.setUint16(e, this.flags); - t.setUint16(e + 2, this.glyphIndex); - e += 4; - if (1 & this.flags) { - if (2 & this.flags) { - t.setInt16(e, this.argument1); - t.setInt16(e + 2, this.argument2); + 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; + } + buf.setUint16(pos, this.flags); + buf.setUint16(pos + 2, this.glyphIndex); + pos += 4; + 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 { - t.setUint16(e, this.argument1); - t.setUint16(e + 2, this.argument2); + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); } - e += 4; + pos += 4; } else { - t.setUint8(e, this.argument1); - t.setUint8(e + 1, this.argument2); - e += 2; + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; } - if (256 & this.flags) { - t.setUint16(e, this.instructions.length); - e += 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; if (this.instructions.length) { - new Uint8Array(t.buffer, 0, t.buffer.byteLength).set( + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set( this.instructions, - e, + pos, ); - e += this.instructions.length; + pos += this.instructions.length; } } - return e - i; + return pos - spos; } - scale(e, t) {} + scale(x, factor) {} +} // ./src/core/opentype_file_builder.js + +function writeInt16(dest, offset, num) { + dest[offset] = (num >> 8) & 0xff; + dest[offset + 1] = num & 0xff; } -function writeInt16(e, t, i) { - e[t] = (i >> 8) & 255; - e[t + 1] = 255 & i; +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 writeInt32(e, t, i) { - e[t] = (i >> 24) & 255; - e[t + 1] = (i >> 16) & 255; - e[t + 2] = (i >> 8) & 255; - e[t + 3] = 255 & i; -} -function writeData(e, t, i) { - if (i instanceof Uint8Array) e.set(i, t); - else if ("string" == typeof i) - for (let a = 0, s = i.length; a < s; a++) e[t++] = 255 & i.charCodeAt(a); - else for (const a of i) e[t++] = 255 & a; +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 (const num of data) { + dest[offset++] = num & 0xff; + } + } } +const OTF_HEADER_SIZE = 12; +const OTF_TABLE_ENTRY_SIZE = 16; class OpenTypeFileBuilder { - constructor(e) { - this.sfnt = e; + constructor(sfnt) { + this.sfnt = sfnt; this.tables = Object.create(null); } - static getSearchParams(e, t) { - let i = 1, - a = 0; - for (; (i ^ e) > i; ) { - i <<= 1; - a++; + static getSearchParams(entriesCount, entrySize) { + let maxPower2 = 1, + log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; } - const s = i * t; - return { range: s, entry: a, rangeShift: t * e - s }; + const searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange, + }; } toArray() { - let e = this.sfnt; - const t = this.tables, - i = Object.keys(t); - i.sort(); - const a = i.length; - let s, - r, - n, - g, - o, - c = 12 + 16 * a; - const C = [c]; - for (s = 0; s < a; s++) { - g = t[i[s]]; - c += ((g.length + 3) & -4) >>> 0; - C.push(c); + 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]; + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + const paddedLength = ((table.length + 3) & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); } - const h = new Uint8Array(c); - for (s = 0; s < a; s++) { - g = t[i[s]]; - writeData(h, C[s], g); + const file = new Uint8Array(offset); + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + writeData(file, tableOffsets[i], table); } - "true" === e && (e = string32(65536)); - h[0] = 255 & e.charCodeAt(0); - h[1] = 255 & e.charCodeAt(1); - h[2] = 255 & e.charCodeAt(2); - h[3] = 255 & e.charCodeAt(3); - writeInt16(h, 4, a); - const l = OpenTypeFileBuilder.getSearchParams(a, 16); - writeInt16(h, 6, l.range); - writeInt16(h, 8, l.entry); - writeInt16(h, 10, l.rangeShift); - c = 12; - for (s = 0; s < a; s++) { - o = i[s]; - h[c] = 255 & o.charCodeAt(0); - h[c + 1] = 255 & o.charCodeAt(1); - h[c + 2] = 255 & o.charCodeAt(2); - h[c + 3] = 255 & o.charCodeAt(3); - let e = 0; - for (r = C[s], n = C[s + 1]; r < n; r += 4) { - e = (e + readUint32(h, r)) >>> 0; + if (sfnt === "true") { + sfnt = 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); + 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; + 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; + for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = readUint32(file, j); + checksum = (checksum + quad) >>> 0; } - writeInt32(h, c + 4, e); - writeInt32(h, c + 8, C[s]); - writeInt32(h, c + 12, t[o].length); - c += 16; + writeInt32(file, offset + 4, checksum); + writeInt32(file, offset + 8, tableOffsets[i]); + writeInt32(file, offset + 12, tables[tableName].length); + offset += OTF_TABLE_ENTRY_SIZE; } - return h; + return file; } - addTable(e, t) { - if (e in this.tables) throw new Error("Table " + e + " already exists"); - this.tables[e] = t; + addTable(tag, data) { + if (tag in this.tables) { + throw new Error("Table " + tag + " already exists"); + } + this.tables[tag] = data; } -} -const ta = [4], - ia = [5], - aa = [6], - sa = [7], - ra = [8], - na = [12, 35], - ga = [14], - oa = [21], - Ia = [22], - ca = [30], - Ca = [31]; +} // ./src/core/type1_parser.js + +const HINTING_ENABLED = false; +const COMMAND_MAP = { + hstem: [1], + vstem: [3], + vmoveto: [4], + rlineto: [5], + hlineto: [6], + vlineto: [7], + rrcurveto: [8], + callsubr: [10], + flex: [12, 35], + drop: [12, 18], + endchar: [14], + rmoveto: [21], + hmoveto: [22], + vhcurveto: [30], + hvcurveto: [31], +}; class Type1CharString { constructor() { this.width = 0; this.lsb = 0; - this.flexing = !1; + this.flexing = false; this.output = []; this.stack = []; } - convert(e, t, i) { - const a = e.length; - let s, - r, - n, - g = !1; - for (let o = 0; o < a; o++) { - let a = e[o]; - if (a < 32) { - 12 === a && (a = (a << 8) + e[++o]); - switch (a) { + convert(encoded, subrs, seacAnalysisEnabled) { + const count = encoded.length; + let error = false; + let wx, sbx, subrNumber; + for (let i = 0; i < count; i++) { + let value = encoded[i]; + if (value < 32) { + if (value === 12) { + value = (value << 8) + encoded[++i]; + } + switch (value) { case 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; case 3: - case 9: - case 3072: - case 3073: - case 3074: - case 3105: - this.stack = []; + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); break; case 4: if (this.flexing) { if (this.stack.length < 1) { - g = !0; + error = true; break; } - const e = this.stack.pop(); - this.stack.push(0, e); + const dy = this.stack.pop(); + this.stack.push(0, dy); break; } - g = this.executeCommand(1, ta); + error = this.executeCommand(1, COMMAND_MAP.vmoveto); break; case 5: - g = this.executeCommand(2, ia); + error = this.executeCommand(2, COMMAND_MAP.rlineto); break; case 6: - g = this.executeCommand(1, aa); + error = this.executeCommand(1, COMMAND_MAP.hlineto); break; case 7: - g = this.executeCommand(1, sa); + error = this.executeCommand(1, COMMAND_MAP.vlineto); break; case 8: - g = this.executeCommand(6, ra); + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; break; case 10: if (this.stack.length < 1) { - g = !0; + error = true; break; } - n = this.stack.pop(); - if (!t[n]) { - g = !0; + subrNumber = this.stack.pop(); + if (!subrs[subrNumber]) { + error = true; break; } - g = this.convert(t[n], t, i); + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); break; case 11: - return g; + return error; case 13: if (this.stack.length < 2) { - g = !0; + error = true; break; } - s = this.stack.pop(); - r = this.stack.pop(); - this.lsb = r; - this.width = s; - this.stack.push(s, r); - g = this.executeCommand(2, Ia); + wx = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx); + error = this.executeCommand(2, COMMAND_MAP.hmoveto); break; case 14: - this.output.push(ga[0]); + this.output.push(COMMAND_MAP.endchar[0]); break; case 21: - if (this.flexing) break; - g = this.executeCommand(2, oa); + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); break; case 22: if (this.flexing) { this.stack.push(0); break; } - g = this.executeCommand(1, Ia); + error = this.executeCommand(1, COMMAND_MAP.hmoveto); break; case 30: - g = this.executeCommand(4, ca); + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); break; case 31: - g = this.executeCommand(4, Ca); + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); break; - case 3078: - if (i) { - const e = this.stack.at(-5); + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case (12 << 8) + 6: + if (seacAnalysisEnabled) { + const asb = this.stack.at(-5); this.seac = this.stack.splice(-4, 4); - this.seac[0] += this.lsb - e; - g = this.executeCommand(0, ga); - } else g = this.executeCommand(4, ga); + this.seac[0] += this.lsb - asb; + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } break; - case 3079: + case (12 << 8) + 7: if (this.stack.length < 4) { - g = !0; + error = true; break; } this.stack.pop(); - s = this.stack.pop(); - const e = this.stack.pop(); - r = this.stack.pop(); - this.lsb = r; - this.width = s; - this.stack.push(s, r, e); - g = this.executeCommand(3, oa); + wx = this.stack.pop(); + const sby = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx, sby); + error = this.executeCommand(3, COMMAND_MAP.rmoveto); break; - case 3084: + case (12 << 8) + 12: if (this.stack.length < 2) { - g = !0; + error = true; break; } - const o = this.stack.pop(), - c = this.stack.pop(); - this.stack.push(c / o); + const num2 = this.stack.pop(); + const num1 = this.stack.pop(); + this.stack.push(num1 / num2); break; - case 3088: + case (12 << 8) + 16: if (this.stack.length < 2) { - g = !0; + error = true; break; } - n = this.stack.pop(); - const C = this.stack.pop(); - if (0 === n && 3 === C) { - const e = this.stack.splice(-17, 17); + subrNumber = this.stack.pop(); + const numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + const flexArgs = this.stack.splice(-17, 17); this.stack.push( - e[2] + e[0], - e[3] + e[1], - e[4], - e[5], - e[6], - e[7], - e[8], - e[9], - e[10], - e[11], - e[12], - e[13], - e[14], + 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], ); - g = this.executeCommand(13, na, !0); - this.flexing = !1; - this.stack.push(e[15], e[16]); - } else 1 === n && 0 === C && (this.flexing = !0); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } break; - case 3089: + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; break; default: - warn('Unknown type 1 charstring command of "' + a + '"'); + warn('Unknown type 1 charstring command of "' + value + '"'); + break; } - if (g) break; + if (error) { + break; + } + continue; + } else if (value <= 246) { + value -= 139; + } else if (value <= 250) { + value = (value - 247) * 256 + encoded[++i] + 108; + } else if (value <= 254) { + value = -((value - 251) * 256) - encoded[++i] - 108; } else { - a <= 246 - ? (a -= 139) - : (a = - a <= 250 - ? 256 * (a - 247) + e[++o] + 108 - : a <= 254 - ? -256 * (a - 251) - e[++o] - 108 - : ((255 & e[++o]) << 24) | - ((255 & e[++o]) << 16) | - ((255 & e[++o]) << 8) | - ((255 & e[++o]) << 0)); - this.stack.push(a); + value = + ((encoded[++i] & 0xff) << 24) | + ((encoded[++i] & 0xff) << 16) | + ((encoded[++i] & 0xff) << 8) | + ((encoded[++i] & 0xff) << 0); } + this.stack.push(value); } - return g; + return error; } - executeCommand(e, t, i) { - const a = this.stack.length; - if (e > a) return !0; - const s = a - e; - for (let e = s; e < a; e++) { - let t = this.stack[e]; - if (Number.isInteger(t)) this.output.push(28, (t >> 8) & 255, 255 & t); - else { - t = (65536 * t) | 0; + executeCommand(howManyArgs, command, keepStack) { + const stackLength = this.stack.length; + if (howManyArgs > stackLength) { + return true; + } + const start = stackLength - howManyArgs; + 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); + } else { + value = (65536 * value) | 0; this.output.push( 255, - (t >> 24) & 255, - (t >> 16) & 255, - (t >> 8) & 255, - 255 & t, + (value >> 24) & 0xff, + (value >> 16) & 0xff, + (value >> 8) & 0xff, + value & 0xff, ); } } - this.output.push(...t); - i ? this.stack.splice(s, e) : (this.stack.length = 0); - return !1; + this.output.push(...command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; } } -function isHexDigit(e) { - return (e >= 48 && e <= 57) || (e >= 65 && e <= 70) || (e >= 97 && e <= 102); -} -function decrypt(e, t, i) { - if (i >= e.length) return new Uint8Array(0); - let a, - s, - r = 0 | t; - for (a = 0; a < i; a++) r = (52845 * (e[a] + r) + 22719) & 65535; - const n = e.length - i, - g = new Uint8Array(n); - for (a = i, s = 0; s < n; a++, s++) { - const t = e[a]; - g[s] = t ^ (r >> 8); - r = (52845 * (t + r) + 22719) & 65535; - } - return g; -} -function isSpecial(e) { +const EEXEC_ENCRYPT_KEY = 55665; +const CHAR_STRS_ENCRYPT_KEY = 4330; +function isHexDigit(code) { return ( - 47 === e || - 91 === e || - 93 === e || - 123 === e || - 125 === e || - 40 === e || - 41 === e + (code >= 48 && code <= 57) || + (code >= 65 && code <= 70) || + (code >= 97 && code <= 102) + ); +} +function decrypt(data, key, discardNumber) { + if (discardNumber >= data.length) { + return new Uint8Array(0); + } + const c1 = 52845, + c2 = 22719; + let r = key | 0, + i, + j; + for (i = 0; i < discardNumber; i++) { + r = ((data[i] + r) * c1 + c2) & ((1 << 16) - 1); + } + const count = data.length - discardNumber; + const decrypted = new Uint8Array(count); + for (i = discardNumber, j = 0; j < count; i++, j++) { + const value = data[i]; + decrypted[j] = value ^ (r >> 8); + r = ((value + r) * c1 + c2) & ((1 << 16) - 1); + } + return decrypted; +} +function decryptAscii(data, key, discardNumber) { + 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++) { + const digit1 = data[i]; + if (!isHexDigit(digit1)) { + continue; + } + i++; + let digit2; + while (i < count && !isHexDigit((digit2 = data[i]))) { + i++; + } + if (i < count) { + const value = parseInt(String.fromCharCode(digit1, digit2), 16); + decrypted[j++] = value ^ (r >> 8); + r = ((value + r) * c1 + c2) & ((1 << 16) - 1); + } + } + return decrypted.slice(discardNumber, j); +} +function isSpecial(c) { + return ( + c === 0x2f || + c === 0x5b || + c === 0x5d || + c === 0x7b || + c === 0x7d || + c === 0x28 || + c === 0x29 ); } class Type1Parser { - constructor(e, t, i) { - if (t) { - const t = e.getBytes(), - i = !( - (isHexDigit(t[0]) || isWhiteSpace(t[0])) && - isHexDigit(t[1]) && - isHexDigit(t[2]) && - isHexDigit(t[3]) && - isHexDigit(t[4]) && - isHexDigit(t[5]) && - isHexDigit(t[6]) && - isHexDigit(t[7]) - ); - e = new Stream( - i - ? decrypt(t, 55665, 4) - : (function decryptAscii(e, t, i) { - let a = 0 | t; - const s = e.length, - r = new Uint8Array(s >>> 1); - let n, g; - for (n = 0, g = 0; n < s; n++) { - const t = e[n]; - if (!isHexDigit(t)) continue; - n++; - let i; - for (; n < s && !isHexDigit((i = e[n])); ) n++; - if (n < s) { - const e = parseInt(String.fromCharCode(t, i), 16); - r[g++] = e ^ (a >> 8); - a = (52845 * (e + a) + 22719) & 65535; - } - } - return r.slice(i, g); - })(t, 55665, 4), + constructor(stream, encrypted, seacAnalysisEnabled) { + if (encrypted) { + const data = stream.getBytes(); + const isBinary = !( + (isHexDigit(data[0]) || 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( + isBinary + ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) + : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4), ); } - this.seacAnalysisEnabled = !!i; - this.stream = e; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + this.stream = stream; this.nextChar(); } readNumberArray() { this.getToken(); - const e = []; - for (;;) { - const t = this.getToken(); - if (null === t || "]" === t || "}" === t) break; - e.push(parseFloat(t || 0)); + const array = []; + while (true) { + const token = this.getToken(); + if (token === null || token === "]" || token === "}") { + break; + } + array.push(parseFloat(token || 0)); } - return e; + return array; } readNumber() { - const e = this.getToken(); - return parseFloat(e || 0); + const token = this.getToken(); + return parseFloat(token || 0); } readInt() { - const e = this.getToken(); - return 0 | parseInt(e || 0, 10); + const token = this.getToken(); + return parseInt(token || 0, 10) | 0; } readBoolean() { - return "true" === this.getToken() ? 1 : 0; + const token = this.getToken(); + return token === "true" ? 1 : 0; } nextChar() { return (this.currentChar = this.stream.getByte()); @@ -24926,352 +28786,508 @@ class Type1Parser { return (this.currentChar = this.stream.getByte()); } getToken() { - let e = !1, - t = this.currentChar; - for (;;) { - if (-1 === t) return null; - if (e) (10 !== t && 13 !== t) || (e = !1); - else if (37 === t) e = !0; - else if (!isWhiteSpace(t)) break; - t = this.nextChar(); + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch === -1) { + return null; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); } - if (isSpecial(t)) { + if (isSpecial(ch)) { this.nextChar(); - return String.fromCharCode(t); + return String.fromCharCode(ch); } - let i = ""; + let token = ""; do { - i += String.fromCharCode(t); - t = this.nextChar(); - } while (t >= 0 && !isWhiteSpace(t) && !isSpecial(t)); - return i; + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); + return token; } - readCharStrings(e, t) { - return -1 === t ? e : decrypt(e, 4330, t); + readCharStrings(bytes, lenIV) { + if (lenIV === -1) { + return bytes; + } + return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); } - extractFontProgram(e) { - const t = this.stream, - i = [], - a = [], - s = Object.create(null); - s.lenIV = 4; - const r = { subrs: [], charstrings: [], properties: { privateData: s } }; - let n, g, o, c; - for (; null !== (n = this.getToken()); ) - if ("/" === n) { - n = this.getToken(); - switch (n) { - case "CharStrings": - this.getToken(); - this.getToken(); - this.getToken(); - this.getToken(); - for (;;) { - n = this.getToken(); - if (null === n || "end" === n) break; - if ("/" !== n) continue; - const e = this.getToken(); - g = this.readInt(); - this.getToken(); - o = g > 0 ? t.getBytes(g) : new Uint8Array(0); - c = r.properties.privateData.lenIV; - const i = this.readCharStrings(o, c); - this.nextChar(); - n = this.getToken(); - "noaccess" === n ? this.getToken() : "/" === n && this.prevChar(); - a.push({ glyph: e, encoded: i }); - } - break; - case "Subrs": - this.readInt(); - this.getToken(); - for (; "dup" === this.getToken(); ) { - const e = this.readInt(); - g = this.readInt(); - this.getToken(); - o = g > 0 ? t.getBytes(g) : new Uint8Array(0); - c = r.properties.privateData.lenIV; - const a = this.readCharStrings(o, c); - this.nextChar(); - n = this.getToken(); - "noaccess" === n && this.getToken(); - i[e] = a; - } - break; - case "BlueValues": - case "OtherBlues": - case "FamilyBlues": - case "FamilyOtherBlues": - const e = this.readNumberArray(); - e.length > 0 && e.length, 0; - break; - case "StemSnapH": - case "StemSnapV": - r.properties.privateData[n] = this.readNumberArray(); - break; - case "StdHW": - case "StdVW": - r.properties.privateData[n] = this.readNumberArray()[0]; - break; - case "BlueShift": - case "lenIV": - case "BlueFuzz": - case "BlueScale": - case "LanguageGroup": - r.properties.privateData[n] = this.readNumber(); - break; - case "ExpansionFactor": - r.properties.privateData[n] = this.readNumber() || 0.06; - break; - case "ForceBold": - r.properties.privateData[n] = this.readBoolean(); - } + extractFontProgram(properties) { + const stream = this.stream; + const subrs = [], + charstrings = []; + const privateData = Object.create(null); + privateData.lenIV = 4; + const program = { + subrs: [], + charstrings: [], + properties: { + privateData, + }, + }; + let token, length, data, lenIV; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; } - for (const { encoded: t, glyph: s } of a) { - const a = new Type1CharString(), - n = a.convert(t, i, this.seacAnalysisEnabled); - let g = a.output; - n && (g = [14]); - const o = { - glyphName: s, - charstring: g, - width: a.width, - lsb: a.lsb, - seac: a.seac, - }; - ".notdef" === s ? r.charstrings.unshift(o) : r.charstrings.push(o); - if (e.builtInEncoding) { - const t = e.builtInEncoding.indexOf(s); - t > -1 && - void 0 === e.widths[t] && - t >= e.firstChar && - t <= e.lastChar && - (e.widths[t] = a.width); + token = this.getToken(); + switch (token) { + case "CharStrings": + this.getToken(); + this.getToken(); + this.getToken(); + this.getToken(); + while (true) { + token = this.getToken(); + if (token === null || token === "end") { + break; + } + if (token !== "/") { + continue; + } + const glyph = this.getToken(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } else if (token === "/") { + this.prevChar(); + } + charstrings.push({ + glyph, + encoded, + }); + } + break; + case "Subrs": + this.readInt(); + this.getToken(); + while (this.getToken() === "dup") { + const index = this.readInt(); + length = this.readInt(); + this.getToken(); + data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); + lenIV = program.properties.privateData.lenIV; + const encoded = this.readCharStrings(data, lenIV); + this.nextChar(); + token = this.getToken(); + if (token === "noaccess") { + this.getToken(); + } + subrs[index] = encoded; + } + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + const blueArray = this.readNumberArray(); + if ( + blueArray.length > 0 && + blueArray.length % 2 === 0 && + HINTING_ENABLED + ) { + program.properties.privateData[token] = blueArray; + } + break; + case "StemSnapH": + case "StemSnapV": + program.properties.privateData[token] = this.readNumberArray(); + break; + case "StdHW": + case "StdVW": + program.properties.privateData[token] = this.readNumberArray()[0]; + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + program.properties.privateData[token] = this.readNumber(); + break; + case "ExpansionFactor": + program.properties.privateData[token] = this.readNumber() || 0.06; + break; + case "ForceBold": + program.properties.privateData[token] = this.readBoolean(); + break; } } - return r; - } - extractFontHeader(e) { - let t; - for (; null !== (t = this.getToken()); ) - if ("/" === t) { - t = this.getToken(); - switch (t) { - case "FontMatrix": - const i = this.readNumberArray(); - e.fontMatrix = i; - break; - case "Encoding": - const a = this.getToken(); - let s; - if (/^\d+$/.test(a)) { - s = []; - const e = 0 | parseInt(a, 10); - this.getToken(); - for (let i = 0; i < e; i++) { - t = this.getToken(); - for (; "dup" !== t && "def" !== t; ) { - t = this.getToken(); - if (null === t) return; - } - if ("def" === t) break; - const e = this.readInt(); - this.getToken(); - const i = this.getToken(); - s[e] = i; - this.getToken(); - } - } else s = getEncoding(a); - e.builtInEncoding = s; - break; - case "FontBBox": - const r = this.readNumberArray(); - e.ascent = Math.max(r[3], r[1]); - e.descent = Math.min(r[1], r[3]); - e.ascentScaled = !0; + for (const { encoded, glyph } of charstrings) { + const charString = new Type1CharString(); + const error = charString.convert( + encoded, + subrs, + this.seacAnalysisEnabled, + ); + let output = charString.output; + if (error) { + output = [14]; + } + const charStringObject = { + glyphName: glyph, + charstring: output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac, + }; + if (glyph === ".notdef") { + program.charstrings.unshift(charStringObject); + } else { + program.charstrings.push(charStringObject); + } + if (properties.builtInEncoding) { + const index = properties.builtInEncoding.indexOf(glyph); + if ( + index > -1 && + properties.widths[index] === undefined && + index >= properties.firstChar && + index <= properties.lastChar + ) { + properties.widths[index] = charString.width; } } + } + return program; } -} -function findBlock(e, t, i) { - const a = e.length, - s = t.length, - r = a - s; - let n = i, - g = !1; - for (; n < r; ) { - let i = 0; - for (; i < s && e[n + i] === t[i]; ) i++; - if (i >= s) { - n += i; - for (; n < a && isWhiteSpace(e[n]); ) n++; - g = !0; + extractFontHeader(properties) { + let token; + while ((token = this.getToken()) !== null) { + if (token !== "/") { + continue; + } + token = this.getToken(); + switch (token) { + case "FontMatrix": + const matrix = this.readNumberArray(); + properties.fontMatrix = matrix; + break; + case "Encoding": + const encodingArg = this.getToken(); + let encoding; + if (!/^\d+$/.test(encodingArg)) { + encoding = getEncoding(encodingArg); + } else { + encoding = []; + const size = parseInt(encodingArg, 10) | 0; + this.getToken(); + for (let j = 0; j < size; j++) { + token = this.getToken(); + while (token !== "dup" && token !== "def") { + token = this.getToken(); + if (token === null) { + return; + } + } + if (token === "def") { + break; + } + const index = this.readInt(); + this.getToken(); + const glyph = this.getToken(); + encoding[index] = glyph; + this.getToken(); + } + } + properties.builtInEncoding = encoding; + break; + case "FontBBox": + const fontBBox = this.readNumberArray(); + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + break; + } + } + } +} // ./src/core/type1_font.js + +function findBlock(streamBytes, signature, startIndex) { + const streamBytesLength = streamBytes.length; + const signatureLength = signature.length; + const scanLength = streamBytesLength - signatureLength; + let i = startIndex, + found = false; + while (i < scanLength) { + let j = 0; + while (j < signatureLength && streamBytes[i + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + i += j; + while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) { + i++; + } + found = true; break; } - n++; + i++; } - return { found: g, length: n }; + return { + found, + length: i, + }; +} +function getHeaderBlock(stream, suggestedLength) { + const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; + const streamStartPos = stream.pos; + let headerBytes, headerBytesLength, block; + try { + headerBytes = stream.getBytes(suggestedLength); + headerBytesLength = headerBytes.length; + } catch {} + if (headerBytesLength === suggestedLength) { + block = findBlock( + headerBytes, + EEXEC_SIGNATURE, + suggestedLength - 2 * EEXEC_SIGNATURE.length, + ); + if (block.found && block.length === suggestedLength) { + return { + stream: new Stream(headerBytes), + length: suggestedLength, + }; + } + } + warn('Invalid "Length1" property in Type1 font -- trying to recover.'); + stream.pos = streamStartPos; + const SCAN_BLOCK_LENGTH = 2048; + let actualLength; + while (true) { + const 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.getBytes(actualLength)), + length: actualLength, + }; + } + warn('Unable to recover "Length1" property in Type1 font -- using as is.'); + return { + stream: new Stream(stream.getBytes(suggestedLength)), + length: suggestedLength, + }; +} +function getEexecBlock(stream, suggestedLength) { + const eexecBytes = stream.getBytes(); + if (eexecBytes.length === 0) { + throw new FormatError("getEexecBlock - no font program found."); + } + return { + stream: new Stream(eexecBytes), + length: eexecBytes.length, + }; } class Type1Font { - constructor(e, t, i) { - let a = i.length1, - s = i.length2, - r = t.peekBytes(6); - const n = 128 === r[0] && 1 === r[1]; - if (n) { - t.skip(6); - a = (r[5] << 24) | (r[4] << 16) | (r[3] << 8) | r[2]; + 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; + if (pfbHeaderPresent) { + file.skip(PFB_HEADER_SIZE); + headerBlockLength = + (pfbHeader[5] << 24) | + (pfbHeader[4] << 16) | + (pfbHeader[3] << 8) | + pfbHeader[2]; } - const g = (function getHeaderBlock(e, t) { - const i = [101, 101, 120, 101, 99], - a = e.pos; - let s, r, n, g; - try { - s = e.getBytes(t); - r = s.length; - } catch {} - if (r === t) { - n = findBlock(s, i, t - 2 * i.length); - if (n.found && n.length === t) - return { stream: new Stream(s), length: t }; - } - warn('Invalid "Length1" property in Type1 font -- trying to recover.'); - e.pos = a; - for (;;) { - n = findBlock(e.peekBytes(2048), i, 0); - if (0 === n.length) break; - e.pos += n.length; - if (n.found) { - g = e.pos - a; - break; - } - } - e.pos = a; - if (g) return { stream: new Stream(e.getBytes(g)), length: g }; - warn( - 'Unable to recover "Length1" property in Type1 font -- using as is.', - ); - return { stream: new Stream(e.getBytes(t)), length: t }; - })(t, a); - new Type1Parser(g.stream, !1, Yi).extractFontHeader(i); - if (n) { - r = t.getBytes(6); - s = (r[5] << 24) | (r[4] << 16) | (r[3] << 8) | r[2]; + const headerBlock = getHeaderBlock(file, headerBlockLength); + const headerBlockParser = new 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]; } - const o = (function getEexecBlock(e, t) { - const i = e.getBytes(); - if (0 === i.length) - throw new FormatError("getEexecBlock - no font program found."); - return { stream: new Stream(i), length: i.length }; - })(t), - c = new Type1Parser(o.stream, !0, Yi).extractFontProgram(i); - for (const e in c.properties) i[e] = c.properties[e]; - const C = c.charstrings, - h = this.getType2Charstrings(C), - l = this.getType2Subrs(c.subrs); - this.charstrings = C; - this.data = this.wrap(e, h, this.charstrings, l, i); - this.seacs = this.getSeacs(c.charstrings); + const eexecBlock = getEexecBlock(file, eexecBlockLength); + const eexecBlockParser = new Type1Parser( + eexecBlock.stream, + true, + SEAC_ANALYSIS_ENABLED, + ); + const data = eexecBlockParser.extractFontProgram(properties); + for (const key in data.properties) { + properties[key] = data.properties[key]; + } + 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); } get numGlyphs() { return this.charstrings.length + 1; } getCharset() { - const e = [".notdef"]; - for (const { glyphName: t } of this.charstrings) e.push(t); - return e; - } - getGlyphMapping(e) { - const t = this.charstrings; - if (e.composite) { - const i = Object.create(null); - for (let a = 0, s = t.length; a < s; a++) { - i[e.cMap.charCodeOf(a)] = a + 1; - } - return i; + const charset = [".notdef"]; + for (const { glyphName } of this.charstrings) { + charset.push(glyphName); } - const i = [".notdef"]; - let a, s; - for (s = 0; s < t.length; s++) i.push(t[s].glyphName); - const r = e.builtInEncoding; - if (r) { - a = Object.create(null); - for (const e in r) { - s = i.indexOf(r[e]); - s >= 0 && (a[e] = s); + return charset; + } + getGlyphMapping(properties) { + const 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; + } + const glyphNames = [".notdef"]; + let builtInEncoding, glyphId; + for (glyphId = 0; glyphId < charstrings.length; glyphId++) { + glyphNames.push(charstrings[glyphId].glyphName); + } + const encoding = properties.builtInEncoding; + if (encoding) { + builtInEncoding = Object.create(null); + for (const charCode in encoding) { + glyphId = glyphNames.indexOf(encoding[charCode]); + if (glyphId >= 0) { + builtInEncoding[charCode] = glyphId; + } } } - return type1FontGlyphMapping(e, a, i); + return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); } - hasGlyphId(e) { - if (e < 0 || e >= this.numGlyphs) return !1; - if (0 === e) return !0; - return this.charstrings[e - 1].charstring.length > 0; - } - getSeacs(e) { - const t = []; - for (let i = 0, a = e.length; i < a; i++) { - const a = e[i]; - a.seac && (t[i + 1] = a.seac); + hasGlyphId(id) { + if (id < 0 || id >= this.numGlyphs) { + return false; } - return t; - } - getType2Charstrings(e) { - const t = []; - for (const i of e) t.push(i.charstring); - return t; - } - getType2Subrs(e) { - let t = 0; - const i = e.length; - t = i < 1133 ? 107 : i < 33769 ? 1131 : 32768; - const a = []; - let s; - for (s = 0; s < t; s++) a.push([11]); - for (s = 0; s < i; s++) a.push(e[s]); - return a; - } - wrap(e, t, i, a, s) { - const r = new CFF(); - r.header = new CFFHeader(1, 0, 4, 4); - r.names = [e]; - const n = new CFFTopDict(); - n.setByName("version", 391); - n.setByName("Notice", 392); - n.setByName("FullName", 393); - n.setByName("FamilyName", 394); - n.setByName("Weight", 395); - n.setByName("Encoding", null); - n.setByName("FontMatrix", s.fontMatrix); - n.setByName("FontBBox", s.bbox); - n.setByName("charset", null); - n.setByName("CharStrings", null); - n.setByName("Private", null); - r.topDict = n; - const g = new CFFStrings(); - g.add("Version 0.11"); - g.add("See original notice"); - g.add(e); - g.add(e); - g.add("Medium"); - r.strings = g; - r.globalSubrIndex = new CFFIndex(); - const o = t.length, - c = [".notdef"]; - let C, h; - for (C = 0; C < o; C++) { - const e = i[C].glyphName; - -1 === wi.indexOf(e) && g.add(e); - c.push(e); + if (id === 0) { + return true; } - r.charset = new CFFCharset(!1, 0, c); - const l = new CFFIndex(); - l.add([139, 14]); - for (C = 0; C < o; C++) l.add(t[C]); - r.charStrings = l; - const Q = new CFFPrivateDict(); - Q.setByName("Subrs", null); - const E = [ + const glyph = this.charstrings[id - 1]; + return glyph.charstring.length > 0; + } + 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; + } + } + return seacMap; + } + getType2Charstrings(type1Charstrings) { + const type2Charstrings = []; + for (const type1Charstring of type1Charstrings) { + type2Charstrings.push(type1Charstring.charstring); + } + return type2Charstrings; + } + getType2Subrs(type1Subrs) { + let bias = 0; + const count = type1Subrs.length; + if (count < 1133) { + bias = 107; + } else if (count < 33769) { + bias = 1131; + } else { + bias = 32768; + } + 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(); + cff.header = new CFFHeader(1, 0, 4, 4); + cff.names = [name]; + const topDict = new 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 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 CFFIndex(); + const count = glyphs.length; + const charsetArray = [".notdef"]; + let i, ii; + for (i = 0; i < count; i++) { + const glyphName = charstrings[i].glyphName; + const index = CFFStandardStrings.indexOf(glyphName); + if (index === -1) { + strings.add(glyphName); + } + charsetArray.push(glyphName); + } + cff.charset = new CFFCharset(false, 0, charsetArray); + const charStringsIndex = new CFFIndex(); + charStringsIndex.add([0x8b, 0x0e]); + for (i = 0; i < count; i++) { + charStringsIndex.add(glyphs[i]); + } + cff.charStrings = charStringsIndex; + const privateDict = new CFFPrivateDict(); + privateDict.setByName("Subrs", null); + const fields = [ "BlueValues", "OtherBlues", "FamilyBlues", @@ -25287,716 +29303,1024 @@ class Type1Font { "StdHW", "StdVW", ]; - for (C = 0, h = E.length; C < h; C++) { - const e = E[C]; - if (!(e in s.privateData)) continue; - const t = s.privateData[e]; - if (Array.isArray(t)) - for (let e = t.length - 1; e > 0; e--) t[e] -= t[e - 1]; - Q.setByName(e, t); + for (i = 0, ii = fields.length; i < ii; i++) { + const field = fields[i]; + if (!(field in properties.privateData)) { + continue; + } + const value = properties.privateData[field]; + if (Array.isArray(value)) { + for (let j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); } - r.topDict.privateDict = Q; - const u = new CFFIndex(); - for (C = 0, h = a.length; C < h; C++) u.add(a[C]); - Q.subrsIndex = u; - return new CFFCompiler(r).compile(); + cff.topDict.privateDict = privateDict; + const subrIndex = new CFFIndex(); + for (i = 0, ii = subrs.length; i < ii; i++) { + subrIndex.add(subrs[i]); + } + privateDict.subrsIndex = subrIndex; + const compiler = new CFFCompiler(cff); + return compiler.compile(); + } +} // ./src/core/fonts.js + +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", + "isInvalidPDFjsFont", + "isType3Font", + "italic", + "loadedName", + "mimetype", + "missingFile", + "name", + "remeasure", + "subtype", + "systemFontInfo", + "type", + "vertical", +]; +const EXPORT_DATA_EXTRA_PROPERTIES = [ + "cMap", + "defaultEncoding", + "differences", + "isMonospace", + "isSerifFont", + "isSymbolicFont", + "seacMap", + "toFontChar", + "toUnicode", + "vmetrics", + "widths", +]; +function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } + if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { + return; + } + const scale = 0.001 / properties.fontMatrix[0]; + const glyphsWidths = properties.widths; + for (const glyph in glyphsWidths) { + glyphsWidths[glyph] *= scale; + } + properties.defaultWidth *= scale; +} +function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (properties.hasEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + if (!isSymbolicFont) { + return; + } + if (nameRecords.length === 0) { + return; + } + if (properties.defaultEncoding === WinAnsiEncoding) { + return; + } + for (const r of nameRecords) { + if (!isWinNameRecord(r)) { + return; + } + } + const encoding = WinAnsiEncoding; + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in encoding) { + const glyphName = encoding[charCode]; + if (glyphName === "") { + continue; + } + const unicode = glyphsUnicodeMap[glyphName]; + if (unicode === undefined) { + continue; + } + toUnicode[charCode] = String.fromCharCode(unicode); + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); } } -const ha = [ - [57344, 63743], - [1048576, 1114109], - ], - Ba = 1e3, - la = [ - "ascent", - "bbox", - "black", - "bold", - "charProcOperatorList", - "composite", - "cssFontInfo", - "data", - "defaultVMetrics", - "defaultWidth", - "descent", - "fallbackName", - "fontMatrix", - "isInvalidPDFjsFont", - "isType3Font", - "italic", - "loadedName", - "mimetype", - "missingFile", - "name", - "remeasure", - "subtype", - "systemFontInfo", - "type", - "vertical", - ], - Qa = [ - "cMap", - "defaultEncoding", - "differences", - "isMonospace", - "isSerifFont", - "isSymbolicFont", - "seacMap", - "toFontChar", - "toUnicode", - "vmetrics", - "widths", - ]; -function adjustWidths(e) { - if (!e.fontMatrix) return; - if (e.fontMatrix[0] === a[0]) return; - const t = 0.001 / e.fontMatrix[0], - i = e.widths; - for (const e in i) i[e] *= t; - e.defaultWidth *= t; +function adjustType1ToUnicode(properties, builtInEncoding) { + if (properties.isInternalFont) { + return; + } + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (builtInEncoding === properties.defaultEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = [], + glyphsUnicodeMap = getGlyphsUnicode(); + for (const charCode in builtInEncoding) { + if (properties.hasEncoding) { + if ( + properties.baseEncodingName || + properties.differences[charCode] !== undefined + ) { + continue; + } + } + const glyphName = builtInEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode[charCode] = String.fromCharCode(unicode); + } + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } } -function amendFallbackToUnicode(e) { - if (!e.fallbackToUnicode) return; - if (e.toUnicode instanceof IdentityToUnicodeMap) return; - const t = []; - for (const i in e.fallbackToUnicode) - e.toUnicode.has(i) || (t[i] = e.fallbackToUnicode[i]); - t.length > 0 && e.toUnicode.amend(t); +function amendFallbackToUnicode(properties) { + if (!properties.fallbackToUnicode) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + const toUnicode = []; + for (const charCode in properties.fallbackToUnicode) { + if (properties.toUnicode.has(charCode)) { + continue; + } + toUnicode[charCode] = properties.fallbackToUnicode[charCode]; + } + if (toUnicode.length > 0) { + properties.toUnicode.amend(toUnicode); + } } class fonts_Glyph { - constructor(e, t, i, a, s, r, n, g, o) { - this.originalCharCode = e; - this.fontChar = t; - this.unicode = i; - this.accent = a; - this.width = s; - this.vmetric = r; - this.operatorListId = n; - this.isSpace = g; - this.isInFont = o; + 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; } get category() { - return shadow( - this, - "category", - (function getCharUnicodeCategory(e) { - const t = Ji.get(e); - if (t) return t; - const i = e.match(Hi), - a = { - isWhitespace: !!i?.[1], - isZeroWidthDiacritic: !!i?.[2], - isInvisibleFormatMark: !!i?.[3], - }; - Ji.set(e, a); - return a; - })(this.unicode), - !0, - ); + return shadow(this, "category", getCharUnicodeCategory(this.unicode), true); } } -function int16(e, t) { - return (e << 8) + t; +function int16(b0, b1) { + return (b0 << 8) + b1; } -function writeSignedInt16(e, t, i) { - e[t + 1] = i; - e[t] = i >>> 8; +function writeSignedInt16(bytes, index, value) { + bytes[index + 1] = value; + bytes[index] = value >>> 8; } -function signedInt16(e, t) { - const i = (e << 8) + t; - return 32768 & i ? i - 65536 : i; +function signedInt16(b0, b1) { + const value = (b0 << 8) + b1; + return value & (1 << 15) ? value - 0x10000 : value; } -function string16(e) { - return String.fromCharCode((e >> 8) & 255, 255 & e); +function writeUint32(bytes, index, value) { + bytes[index + 3] = value & 0xff; + bytes[index + 2] = value >>> 8; + bytes[index + 1] = value >>> 16; + bytes[index] = value >>> 24; } -function safeString16(e) { - e > 32767 ? (e = 32767) : e < -32768 && (e = -32768); - return String.fromCharCode((e >> 8) & 255, 255 & e); +function int32(b0, b1, b2, b3) { + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; } -function isTrueTypeCollectionFile(e) { - return "ttcf" === bytesToString(e.peekBytes(4)); +function string16(value) { + return String.fromCharCode((value >> 8) & 0xff, value & 0xff); } -function getFontFileType(e, { type: t, subtype: i, composite: a }) { - let s, r; - if ( - (function isTrueTypeFile(e) { - const t = e.peekBytes(4); - return 65536 === readUint32(t, 0) || "true" === bytesToString(t); - })(e) || - isTrueTypeCollectionFile(e) - ) - s = a ? "CIDFontType2" : "TrueType"; - else if ( - (function isOpenTypeFile(e) { - return "OTTO" === bytesToString(e.peekBytes(4)); - })(e) - ) - s = a ? "CIDFontType2" : "OpenType"; - else if ( - (function isType1File(e) { - const t = e.peekBytes(2); - return (37 === t[0] && 33 === t[1]) || (128 === t[0] && 1 === t[1]); - })(e) - ) - s = a ? "CIDFontType0" : "MMType1" === t ? "MMType1" : "Type1"; - else if ( - (function isCFFFile(e) { - const t = e.peekBytes(4); - return t[0] >= 1 && t[3] >= 1 && t[3] <= 4; - })(e) - ) - if (a) { - s = "CIDFontType0"; - r = "CIDFontType0C"; +function safeString16(value) { + if (value > 0x7fff) { + value = 0x7fff; + } else if (value < -0x8000) { + value = -0x8000; + } + return String.fromCharCode((value >> 8) & 0xff, value & 0xff); +} +function isTrueTypeFile(file) { + const header = file.peekBytes(4); + return ( + readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true" + ); +} +function isTrueTypeCollectionFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "ttcf"; +} +function isOpenTypeFile(file) { + const header = file.peekBytes(4); + return bytesToString(header) === "OTTO"; +} +function isType1File(file) { + const header = file.peekBytes(2); + if (header[0] === 0x25 && header[1] === 0x21) { + return true; + } + if (header[0] === 0x80 && header[1] === 0x01) { + return true; + } + return false; +} +function isCFFFile(file) { + const header = file.peekBytes(4); + if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { + return true; + } + return false; +} +function getFontFileType(file, { type, subtype, composite }) { + let fileType, fileSubtype; + if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { + fileType = composite ? "CIDFontType2" : "TrueType"; + } else if (isOpenTypeFile(file)) { + fileType = composite ? "CIDFontType2" : "OpenType"; + } else if (isType1File(file)) { + if (composite) { + fileType = "CIDFontType0"; } else { - s = "MMType1" === t ? "MMType1" : "Type1"; - r = "Type1C"; + fileType = type === "MMType1" ? "MMType1" : "Type1"; } - else { + } else if (isCFFFile(file)) { + if (composite) { + fileType = "CIDFontType0"; + fileSubtype = "CIDFontType0C"; + } else { + fileType = type === "MMType1" ? "MMType1" : "Type1"; + fileSubtype = "Type1C"; + } + } else { warn("getFontFileType: Unable to detect correct font file Type/Subtype."); - s = t; - r = i; + fileType = type; + fileSubtype = subtype; } - return [s, r]; + return [fileType, fileSubtype]; } -function applyStandardFontGlyphMap(e, t) { - for (const i in t) e[+i] = t[i]; -} -function buildToFontChar(e, t, i) { - const a = []; - let s; - for (let i = 0, r = e.length; i < r; i++) { - s = getUnicodeForGlyph(e[i], t); - -1 !== s && (a[i] = s); +function applyStandardFontGlyphMap(map, glyphMap) { + for (const charCode in glyphMap) { + map[+charCode] = glyphMap[charCode]; } - for (const e in i) { - s = getUnicodeForGlyph(i[e], t); - -1 !== s && (a[+e] = s); +} +function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + const toFontChar = []; + let unicode; + for (let i = 0, ii = encoding.length; i < ii; i++) { + unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[i] = unicode; + } } - return a; + for (const charCode in differences) { + unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[+charCode] = unicode; + } + } + return toFontChar; } -function isMacNameRecord(e) { - return 1 === e.platform && 0 === e.encoding && 0 === e.language; +function isMacNameRecord(r) { + return r.platform === 1 && r.encoding === 0 && r.language === 0; } -function isWinNameRecord(e) { - return 3 === e.platform && 1 === e.encoding && 1033 === e.language; +function isWinNameRecord(r) { + return r.platform === 3 && r.encoding === 1 && r.language === 0x409; } -function convertCidString(e, t, i = !1) { - switch (t.length) { +function convertCidString(charCode, cid, shouldThrow = false) { + switch (cid.length) { case 1: - return t.charCodeAt(0); + return cid.charCodeAt(0); case 2: - return (t.charCodeAt(0) << 8) | t.charCodeAt(1); + return (cid.charCodeAt(0) << 8) | cid.charCodeAt(1); } - const a = `Unsupported CID string (charCode ${e}): "${t}".`; - if (i) throw new FormatError(a); - warn(a); - return t; + const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; + if (shouldThrow) { + throw new FormatError(msg); + } + warn(msg); + return cid; } -function adjustMapping(e, t, i, a) { - const s = Object.create(null), - r = new Map(), - n = [], - g = new Set(); - let o = 0; - let c = ha[o][0], - C = ha[o][1]; - for (const l in e) { - let Q = e[l]; - if (!t(Q)) continue; - if (c > C) { - o++; - if (o >= ha.length) { +function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { + const newMap = Object.create(null); + const toUnicodeExtraMap = new Map(); + const toFontChar = []; + const usedGlyphIds = new Set(); + let privateUseAreaIndex = 0; + const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + let nextAvailableFontCharCode = privateUseOffetStart; + let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; + const isInPrivateArea = (code) => + (PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1]) || + (PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]); + for (const originalCharCode in charCodeToGlyphId) { + let glyphId = charCodeToGlyphId[originalCharCode]; + if (!hasGlyph(glyphId)) { + continue; + } + if (nextAvailableFontCharCode > privateUseOffetEnd) { + privateUseAreaIndex++; + if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { warn("Ran out of space in font private use area."); break; } - c = ha[o][0]; - C = ha[o][1]; + nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; + privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; } - const E = c++; - 0 === Q && (Q = i); - let u = a.get(l); - "string" == typeof u && (u = u.codePointAt(0)); - if ( - u && - !((h = u), - (ha[0][0] <= h && h <= ha[0][1]) || (ha[1][0] <= h && h <= ha[1][1])) && - !g.has(Q) - ) { - r.set(u, Q); - g.add(Q); + const fontCharCode = nextAvailableFontCharCode++; + if (glyphId === 0) { + glyphId = newGlyphZeroId; } - s[E] = Q; - n[l] = E; + let unicode = toUnicode.get(originalCharCode); + if (typeof unicode === "string") { + unicode = unicode.codePointAt(0); + } + if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { + toUnicodeExtraMap.set(unicode, glyphId); + usedGlyphIds.add(glyphId); + } + newMap[fontCharCode] = glyphId; + toFontChar[originalCharCode] = fontCharCode; } - var h; return { - toFontChar: n, - charCodeToGlyphId: s, - toUnicodeExtraMap: r, - nextAvailableFontCharCode: c, + toFontChar, + charCodeToGlyphId: newMap, + toUnicodeExtraMap, + nextAvailableFontCharCode, }; } -function createCmapTable(e, t, i) { - const a = (function getRanges(e, t, i) { - const a = []; - for (const t in e) - e[t] >= i || a.push({ fontCharCode: 0 | t, glyphId: e[t] }); - if (t) - for (const [e, s] of t) - s >= i || a.push({ fontCharCode: e, glyphId: s }); - 0 === a.length && a.push({ fontCharCode: 0, glyphId: 0 }); - a.sort(function fontGetRangesSort(e, t) { - return e.fontCharCode - t.fontCharCode; - }); - const s = [], - r = a.length; - for (let e = 0; e < r; ) { - const t = a[e].fontCharCode, - i = [a[e].glyphId]; - ++e; - let n = t; - for (; e < r && n + 1 === a[e].fontCharCode; ) { - i.push(a[e].glyphId); - ++n; - ++e; - if (65535 === n) break; - } - s.push([t, n, i]); +function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { + const codes = []; + for (const charCode in glyphs) { + if (glyphs[charCode] >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode | 0, + glyphId: glyphs[charCode], + }); + } + if (toUnicodeExtraMap) { + for (const [unicode, glyphId] of toUnicodeExtraMap) { + if (glyphId >= numGlyphs) { + continue; } - return s; - })(e, t, i), - s = a.at(-1)[1] > 65535 ? 2 : 1; - let r, - n, - g, - o, - c = "\0\0" + string16(s) + "\0\0" + string32(4 + 8 * s); - for (r = a.length - 1; r >= 0 && !(a[r][0] <= 65535); --r); - const C = r + 1; - a[r][0] < 65535 && 65535 === a[r][1] && (a[r][1] = 65534); - const h = a[r][1] < 65535 ? 1 : 0, - l = C + h, - Q = OpenTypeFileBuilder.getSearchParams(l, 2); - let E, - u, - d, - f, - p = "", - m = "", - y = "", - w = "", - D = "", - b = 0; - for (r = 0, n = C; r < n; r++) { - E = a[r]; - u = E[0]; - d = E[1]; - p += string16(u); - m += string16(d); - f = E[2]; - let e = !0; - for (g = 1, o = f.length; g < o; ++g) - if (f[g] !== f[g - 1] + 1) { - e = !1; + codes.push({ + fontCharCode: unicode, + glyphId, + }); + } + } + if (codes.length === 0) { + codes.push({ + fontCharCode: 0, + glyphId: 0, + }); + } + 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; + if (end === 0xffff) { break; } - if (e) { - y += string16((f[0] - u) & 65535); - w += string16(0); - } else { - const e = 2 * (l - r) + 2 * b; - b += d - u + 1; - y += string16(0); - w += string16(e); - for (g = 0, o = f.length; g < o; ++g) D += string16(f[g]); } + ranges.push([start, end, codeIndices]); } - if (h > 0) { - m += "ÿÿ"; - p += "ÿÿ"; - y += "\0"; - w += "\0\0"; - } - const F = - "\0\0" + - string16(2 * l) + - string16(Q.range) + - string16(Q.entry) + - string16(Q.rangeShift) + - m + - "\0\0" + - p + - y + - w + - D; - let S = "", - k = ""; - if (s > 1) { - c += "\0\0\n" + string32(4 + 8 * s + 4 + F.length); - S = ""; - for (r = 0, n = a.length; r < n; r++) { - E = a[r]; - u = E[0]; - f = E[2]; - let e = f[0]; - for (g = 1, o = f.length; g < o; ++g) - if (f[g] !== f[g - 1] + 1) { - d = E[0] + g - 1; - S += string32(u) + string32(d) + string32(e); - u = d + 1; - e = f[g]; - } - S += string32(u) + string32(E[1]) + string32(e); - } - k = - "\0\f\0\0" + - string32(S.length + 16) + - "\0\0\0\0" + - string32(S.length / 12); - } - return c + "\0" + string16(F.length + 4) + F + k + S; + return ranges; } -function createOS2Table(e, t, i) { - i ||= { unitsPerEm: 0, yMax: 0, yMin: 0, ascent: 0, descent: 0 }; - let a = 0, - s = 0, - r = 0, - n = 0, - g = null, - o = 0, - c = -1; - if (t) { - for (let e in t) { - e |= 0; - (g > e || !g) && (g = e); - o < e && (o = e); - c = getUnicodeRangeFor(e, c); - if (c < 32) a |= 1 << c; - else if (c < 64) s |= 1 << (c - 32); - else if (c < 96) r |= 1 << (c - 64); - else { - if (!(c < 123)) - throw new FormatError( - "Unicode ranges Bits > 123 are reserved for internal usage", - ); - n |= 1 << (c - 96); +function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { + const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); + const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; + let cmap = + "\x00\x00" + + string16(numTables) + + "\x00\x03" + + "\x00\x01" + + string32(4 + numTables * 8); + let i, ii, j, jj; + for (i = ranges.length - 1; i >= 0; --i) { + if (ranges[i][0] <= 0xffff) { + break; + } + } + const bmpLength = i + 1; + if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { + ranges[i][1] = 0xfffe; + } + const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; + const segCount = bmpLength + trailingRangesCount; + const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); + let startCount = ""; + let endCount = ""; + let idDeltas = ""; + let idRangeOffsets = ""; + let glyphsIds = ""; + let bias = 0; + let range, start, end, codes; + 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; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; } } - o > 65535 && (o = 65535); - } else { - g = 0; - o = 255; - } - const C = e.bbox || [0, 0, 0, 0], - h = - i.unitsPerEm || - (e.fontMatrix - ? 1 / Math.max(...e.fontMatrix.slice(0, 4).map(Math.abs)) - : 1e3), - l = e.ascentScaled ? 1 : h / Ba, - Q = i.ascent || Math.round(l * (e.ascent || C[3])); - let E = i.descent || Math.round(l * (e.descent || C[1])); - E > 0 && e.descent > 0 && C[1] < 0 && (E = -E); - const u = i.yMax || Q, - d = -i.yMin || -E; - return ( - "\0$ô\0\0\0Š»\0\0\0ŒŠ»\0\0ß\x001\0\0\0\0" + - String.fromCharCode(e.fixedPitch ? 9 : 0) + - "\0\0\0\0\0\0" + - string32(a) + - string32(s) + - string32(r) + - string32(n) + - "*21*" + - string16(e.italicAngle ? 1 : 0) + - string16(g || e.firstChar) + - string16(o || e.lastChar) + - string16(Q) + - string16(E) + - "\0d" + - string16(u) + - string16(d) + - "\0\0\0\0\0\0\0\0" + - string16(e.xHeight) + - string16(e.capHeight) + - string16(0) + - string16(g || e.firstChar) + - "\0" - ); -} -function createPostTable(e) { - return ( - "\0\0\0" + - string32(Math.floor(65536 * e.italicAngle)) + - "\0\0\0\0" + - string32(e.fixedPitch ? 1 : 0) + - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - ); -} -function createPostscriptName(e) { - return e.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); -} -function createNameTable(e, t) { - t || (t = [[], []]); - const i = [ - t[0][0] || "Original licence", - t[0][1] || e, - t[0][2] || "Unknown", - t[0][3] || "uniqueID", - t[0][4] || e, - t[0][5] || "Version 0.11", - t[0][6] || createPostscriptName(e), - t[0][7] || "Unknown", - t[0][8] || "Unknown", - t[0][9] || "Unknown", - ], - a = []; - let s, r, n, g, o; - for (s = 0, r = i.length; s < r; s++) { - o = t[1][s] || i[s]; - const e = []; - for (n = 0, g = o.length; n < g; n++) e.push(string16(o.charCodeAt(n))); - a.push(e.join("")); - } - const c = [i, a], - C = ["\0", "\0"], - h = ["\0\0", "\0"], - l = ["\0\0", "\t"], - Q = i.length * C.length; - let E = "\0\0" + string16(Q) + string16(12 * Q + 6), - u = 0; - for (s = 0, r = C.length; s < r; s++) { - const e = c[s]; - for (n = 0, g = e.length; n < g; n++) { - o = e[n]; - E += C[s] + h[s] + l[s] + string16(n) + string16(o.length) + string16(u); - u += o.length; + if (!contiguous) { + const 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 { + const startCode = codes[0]; + idDeltas += string16((startCode - start) & 0xffff); + idRangeOffsets += string16(0); } } - E += i.join("") + a.join(""); - return E; + if (trailingRangesCount > 0) { + endCount += "\xFF\xFF"; + startCount += "\xFF\xFF"; + idDeltas += "\x00\x01"; + idRangeOffsets += "\x00\x00"; + } + 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 = ""; + if (numTables > 1) { + cmap += + "\x00\x03" + + "\x00\x0A" + + string32(4 + numTables * 8 + 4 + format314.length); + format31012 = ""; + for (i = 0, ii = ranges.length; i < ii; i++) { + range = ranges[i]; + start = range[0]; + codes = range[2]; + let code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + end = range[0] + j - 1; + format31012 += string32(start) + string32(end) + string32(code); + start = end + 1; + code = codes[j]; + } + } + format31012 += string32(start) + string32(range[1]) + string32(code); + } + header31012 = + "\x00\x0C" + + "\x00\x00" + + string32(format31012.length + 16) + + "\x00\x00\x00\x00" + + string32(format31012.length / 12); + } + return ( + cmap + + "\x00\x04" + + string16(format314.length + 4) + + format314 + + header31012 + + format31012 + ); +} +function validateOS2Table(os2, file) { + file.pos = (file.start || 0) + os2.offset; + const version = file.getUint16(); + file.skip(60); + const selection = file.getUint16(); + if (version < 4 && selection & 0x0300) { + return false; + } + const firstChar = file.getUint16(); + const lastChar = file.getUint16(); + if (firstChar > lastChar) { + return false; + } + file.skip(6); + const usWinAscent = file.getUint16(); + if (usWinAscent === 0) { + return false; + } + os2.data[8] = os2.data[9] = 0; + return true; +} +function createOS2Table(properties, charstrings, 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; + let position = -1; + if (charstrings) { + for (let code in charstrings) { + code |= 0; + if (firstCharIndex > code || !firstCharIndex) { + firstCharIndex = code; + } + if (lastCharIndex < code) { + lastCharIndex = code; + } + position = getUnicodeRangeFor(code, position); + 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 FormatError( + "Unicode ranges Bits > 123 are reserved for internal usage", + ); + } + } + if (lastCharIndex > 0xffff) { + lastCharIndex = 0xffff; + } + } else { + firstCharIndex = 0; + lastCharIndex = 255; + } + const bbox = properties.bbox || [0, 0, 0, 0]; + const unitsPerEm = + override.unitsPerEm || + (properties.fontMatrix + ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) + : 1000); + 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])); + if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { + typoDescent = -typoDescent; + } + 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" + + string32(ulUnicodeRange1) + + string32(ulUnicodeRange2) + + string32(ulUnicodeRange3) + + 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" + ); +} +function createPostTable(properties) { + const angle = Math.floor(properties.italicAngle * 2 ** 16); + return ( + "\x00\x03\x00\x00" + + string32(angle) + + "\x00\x00" + + "\x00\x00" + + string32(properties.fixedPitch ? 1 : 0) + + "\x00\x00\x00\x00" + + "\x00\x00\x00\x00" + + "\x00\x00\x00\x00" + + "\x00\x00\x00\x00" + ); +} +function createPostscriptName(name) { + return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); +} +function createNameTable(name, proto) { + if (!proto) { + proto = [[], []]; + } + 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; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + const strBufUnicode = []; + for (j = 0, jj = str.length; j < jj; j++) { + strBufUnicode.push(string16(str.charCodeAt(j))); + } + stringsUnicode.push(strBufUnicode.join("")); + } + 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; + for (i = 0, ii = platforms.length; i < ii; i++) { + const strs = names[i]; + 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; + } + } + nameTable += strings.join("") + stringsUnicode.join(""); + return nameTable; } class Font { - constructor(e, t, i) { - this.name = e; + constructor(name, file, properties) { + this.name = name; this.psName = null; this.mimetype = null; - this.disableFontFace = !1; - this.loadedName = i.loadedName; - this.isType3Font = i.isType3Font; - this.missingFile = !1; - this.cssFontInfo = i.cssFontInfo; + 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); - let a = !!(i.flags & Ki); - if (!a && !i.isSimulatedFlags) { - const t = e.replaceAll(/[,_]/g, "-").split("-", 1)[0], - i = Xi(); - for (const e of t.split("+")) - if (i[e]) { - a = !0; + let isSerifFont = !!(properties.flags & FontFlags.Serif); + if (!isSerifFont && !properties.isSimulatedFlags) { + const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], + serifFonts = getSerifFonts(); + for (const namePart of baseName.split("+")) { + if (serifFonts[namePart]) { + isSerifFont = true; break; } + } + } + this.isSerifFont = isSerifFont; + this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); + let { type, subtype } = properties; + this.type = type; + this.subtype = subtype; + this.systemFontInfo = properties.systemFontInfo; + const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); + this.isInvalidPDFjsFont = !!matches; + if (this.isInvalidPDFjsFont) { + this.fallbackName = matches[1]; + } else if (this.isMonospace) { + this.fallbackName = "monospace"; + } else if (this.isSerifFont) { + this.fallbackName = "serif"; + } else { + this.fallbackName = "sans-serif"; } - this.isSerifFont = a; - this.isSymbolicFont = !!(i.flags & Ti); - this.isMonospace = !!(i.flags & vi); - let { type: s, subtype: r } = i; - this.type = s; - this.subtype = r; - this.systemFontInfo = i.systemFontInfo; - const n = e.match(/^InvalidPDFjsFont_(.*)_\d+$/); - this.isInvalidPDFjsFont = !!n; - this.isInvalidPDFjsFont - ? (this.fallbackName = n[1]) - : this.isMonospace - ? (this.fallbackName = "monospace") - : this.isSerifFont - ? (this.fallbackName = "serif") - : (this.fallbackName = "sans-serif"); if (this.systemFontInfo?.guessFallback) { - this.systemFontInfo.guessFallback = !1; + this.systemFontInfo.guessFallback = false; this.systemFontInfo.css += `,${this.fallbackName}`; } - this.differences = i.differences; - this.widths = i.widths; - this.defaultWidth = i.defaultWidth; - this.composite = i.composite; - this.cMap = i.cMap; - this.capHeight = i.capHeight / Ba; - this.ascent = i.ascent / Ba; - this.descent = i.descent / Ba; + 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 = i.fontMatrix; - this.bbox = i.bbox; - this.defaultEncoding = i.defaultEncoding; - this.toUnicode = i.toUnicode; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.defaultEncoding = properties.defaultEncoding; + this.toUnicode = properties.toUnicode; this.toFontChar = []; - if ("Type3" === i.type) { - for (let e = 0; e < 256; e++) - this.toFontChar[e] = this.differences[e] || i.defaultEncoding[e]; + if (properties.type === "Type3") { + for (let charCode = 0; charCode < 256; charCode++) { + this.toFontChar[charCode] = + this.differences[charCode] || properties.defaultEncoding[charCode]; + } return; } - this.cidEncoding = i.cidEncoding || ""; - this.vertical = !!i.vertical; + this.cidEncoding = properties.cidEncoding || ""; + this.vertical = !!properties.vertical; if (this.vertical) { - this.vmetrics = i.vmetrics; - this.defaultVMetrics = i.defaultVMetrics; + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; } - if (!t || t.isEmpty) { - t && warn('Font file is empty in "' + e + '" (' + this.loadedName + ")"); - this.fallbackToSystemFont(i); + if (!file || file.isEmpty) { + if (file) { + warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); + } + this.fallbackToSystemFont(properties); return; } - [s, r] = getFontFileType(t, i); - (s === this.type && r === this.subtype) || + [type, subtype] = getFontFileType(file, properties); + if (type !== this.type || subtype !== this.subtype) { info( - `Inconsistent font file Type/SubType, expected: ${this.type}/${this.subtype} but found: ${s}/${r}.`, + "Inconsistent font file Type/SubType, expected: " + + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`, ); - let g; + } + let data; try { - switch (s) { + switch (type) { case "MMType1": - info("MMType1 font (" + e + "), falling back to Type1."); + info("MMType1 font (" + name + "), falling back to Type1."); case "Type1": case "CIDFontType0": this.mimetype = "font/opentype"; - const a = - "Type1C" === r || "CIDFontType0C" === r - ? new CFFFont(t, i) - : new Type1Font(e, t, i); - adjustWidths(i); - g = this.convert(e, a, i); + const 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"; - g = this.checkAndRepair(e, t, i); + data = this.checkAndRepair(name, file, properties); if (this.isOpenType) { - adjustWidths(i); - s = "OpenType"; + adjustWidths(properties); + type = "OpenType"; } break; default: - throw new FormatError(`Font ${s} is not supported`); + throw new FormatError(`Font ${type} is not supported`); } } catch (e) { warn(e); - this.fallbackToSystemFont(i); + this.fallbackToSystemFont(properties); return; } - amendFallbackToUnicode(i); - this.data = g; - this.type = s; - this.subtype = r; - this.fontMatrix = i.fontMatrix; - this.widths = i.widths; - this.defaultWidth = i.defaultWidth; - this.toUnicode = i.toUnicode; - this.seacMap = i.seacMap; + amendFallbackToUnicode(properties); + this.data = data; + this.type = type; + this.subtype = subtype; + this.fontMatrix = properties.fontMatrix; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.toUnicode = properties.toUnicode; + this.seacMap = properties.seacMap; } get renderer() { - return shadow(this, "renderer", FontRendererFactory.create(this, Yi)); + const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); + return shadow(this, "renderer", renderer); } - exportData(e = !1) { - const t = e ? [...la, ...Qa] : la, - i = Object.create(null); - let a, s; - for (a of t) { - s = this[a]; - void 0 !== s && (i[a] = s); + 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; + } } - return i; + return data; } - fallbackToSystemFont(e) { - this.missingFile = !0; - const { name: t, type: i } = this; - let a = normalizeFontName(t); - const s = Pi(), - r = ji(), - n = !!s[a], - g = !(!r[a] || !s[r[a]]); - a = s[a] || r[a] || a; - const o = ea()[a]; - if (o) { - isNaN(this.ascent) && (this.ascent = o.ascent / Ba); - isNaN(this.descent) && (this.descent = o.descent / Ba); - isNaN(this.capHeight) && (this.capHeight = o.capHeight / Ba); + fallbackToSystemFont(properties) { + this.missingFile = true; + const { name, type } = this; + let fontName = normalizeFontName(name); + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(); + const isStandardFont = !!stdFontMap[fontName]; + const isMappedToStandardFont = !!( + nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]] + ); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + const fontBasicMetricsMap = getFontBasicMetrics(); + const metrics = fontBasicMetricsMap[fontName]; + if (metrics) { + if (isNaN(this.ascent)) { + this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.descent)) { + this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; + } + if (isNaN(this.capHeight)) { + this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; + } } - this.bold = /bold/gi.test(a); - this.italic = /oblique|italic/gi.test(a); - this.black = /Black/g.test(t); - const c = /Narrow/g.test(t); - this.remeasure = (!n || c) && Object.keys(this.widths).length > 0; + this.bold = /bold/gi.test(fontName); + this.italic = /oblique|italic/gi.test(fontName); + this.black = /Black/g.test(name); + const isNarrow = /Narrow/g.test(name); + this.remeasure = + (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; if ( - (n || g) && - "CIDFontType2" === i && + (isStandardFont || isMappedToStandardFont) && + type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-") ) { - const i = e.cidToGidMap, - a = []; - applyStandardFontGlyphMap(a, Vi()); - /Arial-?Black/i.test(t) - ? applyStandardFontGlyphMap(a, zi()) - : /Calibri/i.test(t) && applyStandardFontGlyphMap(a, _i()); - if (i) { - for (const e in a) { - const t = a[e]; - void 0 !== i[t] && (a[+e] = i[t]); - } - i.length !== this.toUnicode.length && - e.hasIncludedToUnicodeMap && - this.toUnicode instanceof IdentityToUnicodeMap && - this.toUnicode.forEach(function (e, t) { - const s = a[e]; - void 0 === i[s] && (a[+e] = t); - }); + const cidToGidMap = properties.cidToGidMap; + const map = []; + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + if (/Arial-?Black/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); + } else if (/Calibri/i.test(name)) { + applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); } - this.toUnicode instanceof IdentityToUnicodeMap || - this.toUnicode.forEach(function (e, t) { - a[+e] = t; - }); - this.toFontChar = a; - this.toUnicode = new ToUnicodeMap(a); - } else if (/Symbol/i.test(a)) - this.toFontChar = buildToFontChar(mi, Ni(), this.differences); - else if (/Dingbats/i.test(a)) - this.toFontChar = buildToFontChar(yi, Gi(), this.differences); - else if (n) { - const e = buildToFontChar(this.defaultEncoding, Ni(), this.differences); - "CIDFontType2" !== i || - this.cidEncoding.startsWith("Identity-") || - this.toUnicode instanceof IdentityToUnicodeMap || - this.toUnicode.forEach(function (t, i) { - e[+t] = i; - }); - this.toFontChar = e; - } else { - const e = Ni(), - i = []; - this.toUnicode.forEach((t, a) => { - if (!this.composite) { - const i = getUnicodeForGlyph( - this.differences[t] || this.defaultEncoding[t], - e, - ); - -1 !== i && (a = i); + if (cidToGidMap) { + for (const charCode in map) { + const cid = map[charCode]; + if (cidToGidMap[cid] !== undefined) { + map[+charCode] = cidToGidMap[cid]; + } } - i[+t] = a; + if ( + cidToGidMap.length !== this.toUnicode.length && + properties.hasIncludedToUnicodeMap && + this.toUnicode instanceof IdentityToUnicodeMap + ) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + const cid = map[charCode]; + if (cidToGidMap[cid] === undefined) { + map[+charCode] = unicodeCharCode; + } + }); + } + } + if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { + 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( + SymbolSetEncoding, + getGlyphsUnicode(), + this.differences, + ); + } else if (/Dingbats/i.test(fontName)) { + this.toFontChar = buildToFontChar( + ZapfDingbatsEncoding, + getDingbatsGlyphsUnicode(), + this.differences, + ); + } else if (isStandardFont || isMappedToStandardFont) { + const map = buildToFontChar( + this.defaultEncoding, + getGlyphsUnicode(), + this.differences, + ); + if ( + type === "CIDFontType2" && + !this.cidEncoding.startsWith("Identity-") && + !(this.toUnicode instanceof IdentityToUnicodeMap) + ) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + } else { + const glyphsUnicodeMap = getGlyphsUnicode(); + const map = []; + this.toUnicode.forEach((charCode, unicodeCharCode) => { + if (!this.composite) { + const glyphName = + this.differences[charCode] || this.defaultEncoding[charCode]; + const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + map[+charCode] = unicodeCharCode; }); - this.composite && - this.toUnicode instanceof IdentityToUnicodeMap && - /Tahoma|Verdana/i.test(t) && - applyStandardFontGlyphMap(i, Vi()); - this.toFontChar = i; + if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { + if (/Tahoma|Verdana/i.test(name)) { + applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); + } + } + this.toFontChar = map; } - amendFallbackToUnicode(e); - this.loadedName = a.split("-", 1)[0]; + amendFallbackToUnicode(properties); + this.loadedName = fontName.split("-", 1)[0]; } - checkAndRepair(e, t, i) { - const a = [ + checkAndRepair(name, font, properties) { + const VALID_TABLES = [ "OS/2", "cmap", "head", @@ -26012,160 +30336,846 @@ class Font { "cvt ", "CFF ", ]; - function readTables(e, t) { - const i = Object.create(null); - i["OS/2"] = null; - i.cmap = null; - i.head = null; - i.hhea = null; - i.hmtx = null; - i.maxp = null; - i.name = null; - i.post = null; - for (let s = 0; s < t; s++) { - const t = readTableEntry(e); - a.includes(t.tag) && 0 !== t.length && (i[t.tag] = t); + 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; } - return i; + return tables; } - function readTableEntry(e) { - const t = e.getString(4), - i = e.getInt32() >>> 0, - a = e.getInt32() >>> 0, - s = e.getInt32() >>> 0, - r = e.pos; - e.pos = e.start || 0; - e.skip(a); - const n = e.getBytes(s); - e.pos = r; - if ("head" === t) { - n[8] = n[9] = n[10] = n[11] = 0; - n[17] |= 32; + 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 || 0; + file.skip(offset); + const data = file.getBytes(length); + file.pos = previousPosition; + if (tag === "head") { + data[8] = data[9] = data[10] = data[11] = 0; + data[17] |= 0x20; } - return { tag: t, checksum: i, length: s, offset: a, data: n }; - } - function readOpenTypeHeader(e) { return { - version: e.getString(4), - numTables: e.getUint16(), - searchRange: e.getUint16(), - entrySelector: e.getUint16(), - rangeShift: e.getUint16(), + tag, + checksum, + length, + offset, + data, }; } - function sanitizeGlyph(e, t, i, a, s, r) { - const n = { length: 0, sizeOfInstructions: 0 }; - if (t < 0 || t >= e.length || i > e.length || i - t <= 12) return n; - const g = e.subarray(t, i), - o = signedInt16(g[2], g[3]), - c = signedInt16(g[4], g[5]), - C = signedInt16(g[6], g[7]), - h = signedInt16(g[8], g[9]); - if (o > C) { - writeSignedInt16(g, 2, C); - writeSignedInt16(g, 6, o); + function readOpenTypeHeader(ttf) { + return { + version: ttf.getString(4), + numTables: ttf.getUint16(), + searchRange: ttf.getUint16(), + entrySelector: ttf.getUint16(), + rangeShift: ttf.getUint16(), + }; + } + function readTrueTypeCollectionHeader(ttc) { + const ttcTag = ttc.getString(4); + assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); + const majorVersion = ttc.getUint16(); + const minorVersion = ttc.getUint16(); + const numFonts = ttc.getInt32() >>> 0; + const offsetTable = []; + for (let i = 0; i < numFonts; i++) { + offsetTable.push(ttc.getInt32() >>> 0); } - if (c > h) { - writeSignedInt16(g, 4, h); - writeSignedInt16(g, 8, c); + const header = { + ttcTag, + majorVersion, + minorVersion, + numFonts, + offsetTable, + }; + switch (majorVersion) { + case 1: + return header; + case 2: + header.dsigTag = ttc.getInt32() >>> 0; + header.dsigLength = ttc.getInt32() >>> 0; + header.dsigOffset = ttc.getInt32() >>> 0; + return header; } - const l = signedInt16(g[0], g[1]); - if (l < 0) { - if (l < -1) return n; - a.set(g, s); - n.length = g.length; - return n; - } - let Q, - E = 10, - u = 0; - for (Q = 0; Q < l; Q++) { - u = ((g[E] << 8) | g[E + 1]) + 1; - E += 2; - } - const d = E, - f = (g[E] << 8) | g[E + 1]; - n.sizeOfInstructions = f; - E += 2 + f; - const p = E; - let m = 0; - for (Q = 0; Q < u; Q++) { - const e = g[E++]; - 192 & e && (g[E - 1] = 63 & e); - let t = 2; - 2 & e ? (t = 1) : 16 & e && (t = 0); - let i = 2; - 4 & e ? (i = 1) : 32 & e && (i = 0); - const a = t + i; - m += a; - if (8 & e) { - const e = g[E++]; - 0 === e && (g[E - 1] ^= 8); - Q += e; - m += e * a; + throw new FormatError( + `Invalid TrueType Collection majorVersion: ${majorVersion}.`, + ); + } + function readTrueTypeCollectionData(ttc, fontName) { + const { numFonts, offsetTable } = readTrueTypeCollectionHeader(ttc); + const fontNameParts = fontName.split("+"); + let fallbackData; + 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 (!potentialTables.name) { + throw new FormatError( + 'TrueType Collection font must contain a "name" table.', + ); + } + const [nameTable] = readNameTable(potentialTables.name); + 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]?.replaceAll(/\s/g, ""); + if (!nameEntry) { + continue; + } + if (nameEntry === fontName) { + return { + header: potentialHeader, + tables: potentialTables, + }; + } + if (fontNameParts.length < 2) { + continue; + } + for (const part of fontNameParts) { + if (nameEntry === part) { + fallbackData = { + name: part, + header: potentialHeader, + tables: potentialTables, + }; + } + } + } } } - if (0 === m) return n; - let y = E + m; - if (y > g.length) return n; - if (!r && f > 0) { - a.set(g.subarray(0, d), s); - a.set([0, 0], s + d); - a.set(g.subarray(p, y), s + d + 2); - y -= f; - g.length - y > 3 && (y = (y + 3) & -4); - n.length = y; - return n; - } - if (g.length - y > 3) { - y = (y + 3) & -4; - a.set(g.subarray(0, y), s); - n.length = y; - return n; - } - a.set(g, s); - n.length = g.length; - return n; - } - function readNameTable(e) { - const i = (t.start || 0) + e.offset; - t.pos = i; - const a = [[], []], - s = [], - r = e.length, - n = i + r; - if (0 !== t.getUint16() || r < 6) return [a, s]; - const g = t.getUint16(), - o = t.getUint16(); - let c, C; - for (c = 0; c < g && t.pos + 12 <= n; c++) { - const e = { - platform: t.getUint16(), - encoding: t.getUint16(), - language: t.getUint16(), - name: t.getUint16(), - length: t.getUint16(), - offset: t.getUint16(), + if (fallbackData) { + warn( + `TrueType Collection does not contain "${fontName}" font, ` + + `falling back to "${fallbackData.name}" font instead.`, + ); + return { + header: fallbackData.header, + tables: fallbackData.tables, }; - (isMacNameRecord(e) || isWinNameRecord(e)) && s.push(e); } - for (c = 0, C = s.length; c < C; c++) { - const e = s[c]; - if (e.length <= 0) continue; - const r = i + o + e.offset; - if (r + e.length > n) continue; - t.pos = r; - const g = e.name; - if (e.encoding) { - let i = ""; - for (let a = 0, s = e.length; a < s; a += 2) - i += String.fromCharCode(t.getUint16()); - a[1][g] = i; - } else a[0][g] = t.getString(e.length); - } - return [a, s]; + throw new FormatError( + `TrueType Collection does not contain "${fontName}" font.`, + ); } - const s = [ + function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { + if (!cmap) { + warn("No cmap table available."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false, + }; + } + let segment; + let start = (file.start || 0) + cmap.offset; + file.pos = start; + file.skip(2); + const numTables = file.getUint16(); + let potentialTable; + let canBreak = false; + for (let i = 0; i < numTables; i++) { + const platformId = file.getUint16(); + const encodingId = file.getUint16(); + const offset = file.getInt32() >>> 0; + let useTable = false; + if ( + 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; + let correctlySorted = true; + if (i < numTables - 1) { + const nextBytes = file.peekBytes(2), + nextPlatformId = int16(nextBytes[0], nextBytes[1]); + if (nextPlatformId < platformId) { + correctlySorted = false; + } + } + if (correctlySorted) { + canBreak = true; + } + } + if (useTable) { + potentialTable = { + platformId, + encodingId, + offset, + }; + } + if (canBreak) { + break; + } + } + if (potentialTable) { + file.pos = start + potentialTable.offset; + } + if (!potentialTable || file.peekByte() === -1) { + warn("Could not find a preferred cmap table."); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false, + }; + } + const format = file.getUint16(); + let hasShortCmap = false; + const mappings = []; + let j, glyphId; + if (format === 0) { + file.skip(2 + 2); + for (j = 0; j < 256; j++) { + const index = file.getByte(); + if (!index) { + continue; + } + mappings.push({ + charCode: j, + glyphId: index, + }); + } + hasShortCmap = true; + } else if (format === 2) { + file.skip(2 + 2); + const subHeaderKeys = []; + let maxSubHeaderKey = 0; + for (let i = 0; i < 256; i++) { + const subHeaderKey = file.getUint16() >> 3; + subHeaderKeys.push(subHeaderKey); + maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); + } + const subHeaders = []; + for (let i = 0; i <= maxSubHeaderKey; i++) { + subHeaders.push({ + firstCode: file.getUint16(), + entryCount: file.getUint16(), + idDelta: signedInt16(file.getByte(), file.getByte()), + idRangePos: file.pos + file.getUint16(), + }); + } + for (let i = 0; i < 256; i++) { + if (subHeaderKeys[i] === 0) { + file.pos = subHeaders[0].idRangePos + 2 * i; + glyphId = file.getUint16(); + mappings.push({ + charCode: i, + glyphId, + }); + } else { + const s = subHeaders[subHeaderKeys[i]]; + for (j = 0; j < s.entryCount; j++) { + const charCode = (i << 8) + j + s.firstCode; + file.pos = s.idRangePos + 2 * j; + glyphId = file.getUint16(); + if (glyphId !== 0) { + glyphId = (glyphId + s.idDelta) % 65536; + } + mappings.push({ + charCode, + glyphId, + }); + } + } + } + } else if (format === 4) { + file.skip(2 + 2); + const segCount = file.getUint16() >> 1; + file.skip(6); + const segments = []; + let segIndex; + 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(); + } + let offsetsCount = 0, + offsetIndex; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + const rangeOffset = file.getUint16(); + if (!rangeOffset) { + segment.offsetIndex = -1; + continue; + } + offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); + segment.offsetIndex = offsetIndex; + offsetsCount = Math.max( + offsetsCount, + offsetIndex + segment.end - segment.start + 1, + ); + } + const offsets = []; + for (j = 0; j < offsetsCount; j++) { + offsets.push(file.getUint16()); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + start = segment.start; + const end = segment.end; + const delta = segment.delta; + offsetIndex = segment.offsetIndex; + for (j = start; j <= end; j++) { + if (j === 0xffff) { + continue; + } + glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; + glyphId = (glyphId + delta) & 0xffff; + mappings.push({ + charCode: j, + glyphId, + }); + } + } + } else if (format === 6) { + file.skip(2 + 2); + const firstCode = file.getUint16(); + const entryCount = file.getUint16(); + for (j = 0; j < entryCount; j++) { + glyphId = file.getUint16(); + const charCode = firstCode + j; + mappings.push({ + charCode, + glyphId, + }); + } + } else if (format === 12) { + file.skip(2 + 4 + 4); + const nGroups = file.getInt32() >>> 0; + for (j = 0; j < nGroups; j++) { + const startCharCode = file.getInt32() >>> 0; + const endCharCode = file.getInt32() >>> 0; + let glyphCode = file.getInt32() >>> 0; + for ( + let charCode = startCharCode; + charCode <= endCharCode; + charCode++ + ) { + mappings.push({ + charCode, + glyphId: glyphCode++, + }); + } + } + } else { + warn("cmap table has unsupported format: " + format); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false, + }; + } + mappings.sort(function (a, b) { + return a.charCode - b.charCode; + }); + for (let i = 1; i < mappings.length; i++) { + if (mappings[i - 1].charCode === mappings[i].charCode) { + mappings.splice(i, 1); + i--; + } + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings, + hasShortCmap, + }; + } + function sanitizeMetrics( + file, + header, + metrics, + headTable, + numGlyphs, + dupFirstEntry, + ) { + if (!header) { + if (metrics) { + metrics.data = null; + } + return; + } + file.pos = (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(); + if (caretOffset !== 0) { + const macStyle = int16(headTable.data[44], headTable.data[45]); + if (!(macStyle & 2)) { + header.data[22] = 0; + header.data[23] = 0; + } + } + if (numOfMetrics > numGlyphs) { + 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; + } + const numOfSidebearings = numGlyphs - numOfMetrics; + const numMissing = + numOfSidebearings - ((metrics.length - numOfMetrics * 4) >> 1); + if (numMissing > 0) { + const entries = new Uint8Array(metrics.length + numMissing * 2); + entries.set(metrics.data); + if (dupFirstEntry) { + entries[metrics.length] = metrics.data[2]; + entries[metrics.length + 1] = metrics.data[3]; + } + metrics.data = entries; + } + } + function sanitizeGlyph( + source, + sourceStart, + sourceEnd, + dest, + destStart, + hintsValid, + ) { + const glyphProfile = { + length: 0, + sizeOfInstructions: 0, + }; + if ( + sourceStart < 0 || + sourceStart >= source.length || + sourceEnd > source.length || + sourceEnd - sourceStart <= 12 + ) { + return glyphProfile; + } + const glyf = source.subarray(sourceStart, sourceEnd); + const xMin = signedInt16(glyf[2], glyf[3]); + const yMin = signedInt16(glyf[4], glyf[5]); + const xMax = signedInt16(glyf[6], glyf[7]); + const yMax = signedInt16(glyf[8], glyf[9]); + if (xMin > xMax) { + writeSignedInt16(glyf, 2, xMax); + writeSignedInt16(glyf, 6, xMin); + } + if (yMin > yMax) { + writeSignedInt16(glyf, 4, yMax); + writeSignedInt16(glyf, 8, yMin); + } + const contoursCount = signedInt16(glyf[0], glyf[1]); + if (contoursCount < 0) { + if (contoursCount < -1) { + return glyphProfile; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + let i, + j = 10, + flagsCount = 0; + for (i = 0; i < contoursCount; i++) { + const endPoint = (glyf[j] << 8) | glyf[j + 1]; + flagsCount = endPoint + 1; + j += 2; + } + const instructionsStart = j; + const instructionsLength = (glyf[j] << 8) | glyf[j + 1]; + glyphProfile.sizeOfInstructions = instructionsLength; + j += 2 + instructionsLength; + const instructionsEnd = j; + let coordinatesLength = 0; + for (i = 0; i < flagsCount; i++) { + const 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) { + const repeat = glyf[j++]; + if (repeat === 0) { + glyf[j - 1] ^= 8; + } + i += repeat; + coordinatesLength += repeat * xyLength; + } + } + if (coordinatesLength === 0) { + return glyphProfile; + } + let 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; + } + dest.set(glyf, destStart); + glyphProfile.length = glyf.length; + return glyphProfile; + } + function sanitizeHead(head, numGlyphs, locaLength) { + const data = head.data; + const version = int32(data[0], data[1], data[2], data[3]); + if (version >> 16 !== 1) { + info("Attempting to fix invalid version in head table: " + version); + data[0] = 0; + data[1] = 1; + data[2] = 0; + data[3] = 0; + } + const indexToLocFormat = int16(data[50], data[51]); + if (indexToLocFormat < 0 || indexToLocFormat > 1) { + 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 FormatError( + "Could not fix indexToLocFormat: " + indexToLocFormat, + ); + } + } + } + function sanitizeGlyphLocations( + loca, + glyf, + numGlyphs, + isGlyphLocationsLong, + hintsValid, + dupFirstEntry, + maxSizeOfInstructions, + ) { + let 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; + }; + } + 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 = []; + 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) => a.offset - b.offset); + for (i = 0; i < numGlyphs; i++) { + locaEntries[i].endOffset = locaEntries[i + 1].offset; + } + locaEntries.sort((a, b) => a.index - b.index); + for (i = 0; i < numGlyphs; i++) { + const { offset, endOffset } = locaEntries[i]; + if (offset !== 0 || endOffset !== 0) { + break; + } + const nextOffset = locaEntries[i + 1].offset; + if (nextOffset === 0) { + continue; + } + locaEntries[i].endOffset = nextOffset; + break; + } + const last = locaEntries.at(-2); + if (last.offset !== 0 && last.endOffset === 0) { + last.endOffset = oldGlyfDataLength; + } + const missingGlyphs = Object.create(null); + let writeOffset = 0; + itemEncode(locaData, 0, writeOffset); + 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 (newLength === 0) { + missingGlyphs[i] = true; + } + if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { + maxSizeOfInstructions = glyphProfile.sizeOfInstructions; + } + writeOffset += newLength; + itemEncode(locaData, j, writeOffset); + } + if (writeOffset === 0) { + const 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) { + const firstEntryLength = itemDecode(locaData, itemSize); + 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); + } + return { + missingGlyphs, + maxSizeOfInstructions, + }; + } + function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { + const 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 = MacStandardGlyphOrdering; + break; + case 0x00020000: + const numGlyphs = font.getUint16(); + if (numGlyphs !== maxpNumGlyphs) { + valid = false; + break; + } + const glyphNameIndexes = []; + for (i = 0; i < numGlyphs; ++i) { + const index = font.getUint16(); + if (index >= 32768) { + valid = false; + break; + } + glyphNameIndexes.push(index); + } + if (!valid) { + break; + } + const customNames = [], + strBuf = []; + while (font.pos < end) { + const 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) { + const j = glyphNameIndexes[i]; + if (j < 258) { + glyphNames.push(MacStandardGlyphOrdering[j]); + continue; + } + glyphNames.push(customNames[j - 258]); + } + break; + case 0x00030000: + break; + default: + warn("Unknown/unsupported post table version " + version); + valid = false; + if (propertiesObj.defaultEncoding) { + glyphNames = propertiesObj.defaultEncoding; + } + break; + } + propertiesObj.glyphNames = glyphNames; + return valid; + } + function readNameTable(nameTable) { + const start = (font.start || 0) + nameTable.offset; + font.pos = start; + const names = [[], []], + records = []; + const length = nameTable.length, + end = start + length; + const format = font.getUint16(); + const FORMAT_0_HEADER_LENGTH = 6; + if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { + return [names, records]; + } + const numRecords = font.getUint16(); + const stringsStart = font.getUint16(); + 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(), + }; + if (isMacNameRecord(r) || isWinNameRecord(r)) { + records.push(r); + } + } + for (i = 0, ii = records.length; i < ii; i++) { + const record = records[i]; + if (record.length <= 0) { + continue; + } + const pos = start + stringsStart + record.offset; + if (pos + record.length > end) { + continue; + } + font.pos = pos; + const nameIndex = record.name; + if (record.encoding) { + let str = ""; + for (let j = 0, jj = record.length; j < jj; j += 2) { + str += String.fromCharCode(font.getUint16()); + } + names[1][nameIndex] = str; + } else { + names[0][nameIndex] = font.getString(record.length); + } + } + return [names, records]; + } + 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, @@ -26175,1413 +31185,1263 @@ class Font { -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(e, t) { - let i, - a, - r, + function sanitizeTTProgram(table, ttContext) { + let data = table.data; + let i = 0, + j, n, - g, - o = e.data, - c = 0, - C = 0, - h = 0; - const l = [], - Q = [], - E = []; - let u = t.tooComplexToFollowFunctions, - d = !1, - f = 0, - p = 0; - for (let e = o.length; c < e; ) { - const e = o[c++]; - if (64 === e) { - a = o[c++]; - if (d || p) c += a; - else for (i = 0; i < a; i++) l.push(o[c++]); - } else if (65 === e) { - a = o[c++]; - if (d || p) c += 2 * a; - else - for (i = 0; i < a; i++) { - r = o[c++]; - l.push((r << 8) | o[c++]); + 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 (176 == (248 & e)) { - a = e - 176 + 1; - if (d || p) c += a; - else for (i = 0; i < a; i++) l.push(o[c++]); - } else if (184 == (248 & e)) { - a = e - 184 + 1; - if (d || p) c += 2 * a; - else - for (i = 0; i < a; i++) { - r = o[c++]; - l.push((r << 8) | o[c++]); + } + } 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 (43 !== e || u) - if (44 !== e || u) { - if (45 === e) - if (d) { - d = !1; - C = c; - } else { - g = Q.pop(); - if (!g) { - warn("TT: ENDF bad stack"); - t.hintsValid = !1; + } + } 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(signedInt16(b, data[i++])); + } + } + } else if (op === 0x2b && !tooComplexToFollowFunctions) { + if (!inFDEF && !inELSE) { + funcId = stack.at(-1); + if (isNaN(funcId)) { + 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) { + warn("TT: CALL invalid functions stack delta."); + ttContext.hintsValid = false; return; } - n = E.pop(); - o = g.data; - c = g.i; - t.functionsStackDeltas[n] = l.length - g.stackTop; + 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) { + warn("TT: CALL non-existent function"); + ttContext.hintsValid = false; + return; + } + data = pc.data; + i = pc.i; } - else if (137 === e) { - if (d || p) { - warn("TT: nested IDEFs not allowed"); - u = !0; - } - d = !0; - h = c; - } else if (88 === e) ++f; - else if (27 === e) p = f; - else if (89 === e) { - p === f && (p = 0); - --f; - } else if (28 === e && !d && !p) { - const e = l.at(-1); - e > 0 && (c += e - 1); } + } + } else if (op === 0x2c && !tooComplexToFollowFunctions) { + if (inFDEF || inELSE) { + 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 { - if (d || p) { - warn("TT: nested FDEFs not allowed"); - u = !0; + pc = callstack.pop(); + if (!pc) { + warn("TT: ENDF bad stack"); + ttContext.hintsValid = false; + return; } - d = !0; - h = c; - n = l.pop(); - t.functionsDefined[n] = { data: o, i: c }; + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; } - else if (!d && !p) { - n = l.at(-1); - if (isNaN(n)) info("TT: CALL empty stack (or invalid entry)."); - else { - t.functionsUsed[n] = !0; - if (n in t.functionsStackDeltas) { - const e = l.length + t.functionsStackDeltas[n]; - if (e < 0) { - warn("TT: CALL invalid functions stack delta."); - t.hintsValid = !1; - return; - } - l.length = e; - } else if (n in t.functionsDefined && !E.includes(n)) { - Q.push({ data: o, i: c, stackTop: l.length - 1 }); - E.push(n); - g = t.functionsDefined[n]; - if (!g) { - warn("TT: CALL non-existent function"); - t.hintsValid = !1; - return; - } - o = g.data; - c = g.i; + } else if (op === 0x89) { + if (inFDEF || inELSE) { + 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) { + const offset = stack.at(-1); + if (offset > 0) { + i += offset - 1; } } } - if (!d && !p) { - let t = 0; - e <= 142 - ? (t = s[e]) - : e >= 192 && e <= 223 - ? (t = -1) - : e >= 224 && (t = -2); - if (e >= 113 && e <= 117) { - a = l.pop(); - isNaN(a) || (t = 2 * -a); + 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; } - for (; t < 0 && l.length > 0; ) { - l.pop(); - t++; + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } } - for (; t > 0; ) { - l.push(NaN); - t--; + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; } } } - t.tooComplexToFollowFunctions = u; - const m = [o]; - c > o.length && m.push(new Uint8Array(c - o.length)); - if (h > C) { + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + const content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { warn("TT: complementing a missing function tail"); - m.push(new Uint8Array([34, 45])); + content.push(new Uint8Array([0x22, 0x2d])); } - !(function foldTTTable(e, t) { - if (t.length > 1) { - let i, - a, - s = 0; - for (i = 0, a = t.length; i < a; i++) s += t[i].length; - s = (s + 3) & -4; - const r = new Uint8Array(s); - let n = 0; - for (i = 0, a = t.length; i < a; i++) { - r.set(t[i], n); - n += t[i].length; - } - e.data = r; - e.length = s; + foldTTTable(table, content); + } + function checkInvalidFunctions(ttContext, maxFunctionDefs) { + if (ttContext.tooComplexToFollowFunctions) { + return; + } + if (ttContext.functionsDefined.length > maxFunctionDefs) { + warn("TT: more functions defined than expected"); + ttContext.hintsValid = false; + return; + } + for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { + if (j > maxFunctionDefs) { + warn("TT: invalid function id: " + j); + ttContext.hintsValid = false; + return; } - })(e, m); - } - let r, n, g, o; - if ( - isTrueTypeCollectionFile((t = new Stream(new Uint8Array(t.getBytes())))) - ) { - const e = (function readTrueTypeCollectionData(e, t) { - const { numFonts: i, offsetTable: a } = - (function readTrueTypeCollectionHeader(e) { - const t = e.getString(4); - assert("ttcf" === t, "Must be a TrueType Collection font."); - const i = e.getUint16(), - a = e.getUint16(), - s = e.getInt32() >>> 0, - r = []; - for (let t = 0; t < s; t++) r.push(e.getInt32() >>> 0); - const n = { - ttcTag: t, - majorVersion: i, - minorVersion: a, - numFonts: s, - offsetTable: r, - }; - switch (i) { - case 1: - return n; - case 2: - n.dsigTag = e.getInt32() >>> 0; - n.dsigLength = e.getInt32() >>> 0; - n.dsigOffset = e.getInt32() >>> 0; - return n; - } - throw new FormatError( - `Invalid TrueType Collection majorVersion: ${i}.`, - ); - })(e), - s = t.split("+"); - let r; - for (let n = 0; n < i; n++) { - e.pos = (e.start || 0) + a[n]; - const i = readOpenTypeHeader(e), - g = readTables(e, i.numTables); - if (!g.name) - throw new FormatError( - 'TrueType Collection font must contain a "name" table.', - ); - const [o] = readNameTable(g.name); - for (let e = 0, a = o.length; e < a; e++) - for (let a = 0, n = o[e].length; a < n; a++) { - const n = o[e][a]?.replaceAll(/\s/g, ""); - if (n) { - if (n === t) return { header: i, tables: g }; - if (!(s.length < 2)) - for (const e of s) - n === e && (r = { name: e, header: i, tables: g }); - } - } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + warn("TT: undefined function: " + j); + ttContext.hintsValid = false; + return; } - if (r) { - warn( - `TrueType Collection does not contain "${t}" font, falling back to "${r.name}" font instead.`, - ); - return { header: r.header, tables: r.tables }; + } + } + 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; } - throw new FormatError( - `TrueType Collection does not contain "${t}" font.`, - ); - })(t, this.name); - r = e.header; - n = e.tables; - } else { - r = readOpenTypeHeader(t); - n = readTables(t, r.numTables); - } - const c = !n["CFF "]; - if (c) { - if (!n.loca) throw new FormatError('Required "loca" table is not found'); - if (!n.glyf) { - warn('Required "glyf" table is not found -- trying to recover.'); - n.glyf = { tag: "glyf", data: new Uint8Array(0) }; - } - this.isOpenType = !1; - } else { - const t = - i.composite && - (i.cidToGidMap?.length > 0 || !(i.cMap instanceof IdentityCMap)); - if ( - ("OTTO" === r.version && !t) || - !n.head || - !n.hhea || - !n.maxp || - !n.post - ) { - o = new Stream(n["CFF "].data); - g = new CFFFont(o, i); - adjustWidths(i); - return this.convert(e, g, i); - } - delete n.glyf; - delete n.loca; - delete n.fpgm; - delete n.prep; - delete n["cvt "]; - this.isOpenType = !0; - } - if (!n.maxp) throw new FormatError('Required "maxp" table is not found'); - t.pos = (t.start || 0) + n.maxp.offset; - let C = t.getInt32(); - const h = t.getUint16(); - if (65536 !== C && 20480 !== C) { - if (6 === n.maxp.length) C = 20480; - else { - if (!(n.maxp.length >= 32)) - throw new FormatError('"maxp" table has a wrong version number'); - C = 65536; - } - !(function writeUint32(e, t, i) { - e[t + 3] = 255 & i; - e[t + 2] = i >>> 8; - e[t + 1] = i >>> 16; - e[t] = i >>> 24; - })(n.maxp.data, 0, C); - } - if (i.scaleFactors?.length === h && c) { - const { scaleFactors: e } = i, - t = int16(n.head.data[50], n.head.data[51]), - a = new GlyfTable({ - glyfTable: n.glyf.data, - isGlyphLocationsLong: t, - locaTable: n.loca.data, - numGlyphs: h, - }); - a.scale(e); - const { glyf: s, loca: r, isLocationLong: g } = a.write(); - n.glyf.data = s; - n.loca.data = r; - if (g !== !!t) { - n.head.data[50] = 0; - n.head.data[51] = g ? 1 : 0; - } - const o = n.hmtx.data; - for (let t = 0; t < h; t++) { - const i = 4 * t, - a = Math.round(e[t] * int16(o[i], o[i + 1])); - o[i] = (a >> 8) & 255; - o[i + 1] = 255 & a; - writeSignedInt16( - o, - i + 2, - Math.round(e[t] * signedInt16(o[i + 2], o[i + 3])), - ); + 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; } } - let l = h + 1, - Q = !0; - if (l > 65535) { - Q = !1; - l = h; - warn("Not enough space in glyfs to duplicate first glyph."); - } - let E = 0, - u = 0; - if (C >= 65536 && n.maxp.length >= 32) { - t.pos += 8; - if (t.getUint16() > 2) { - n.maxp.data[14] = 0; - n.maxp.data[15] = 2; - } - t.pos += 4; - E = t.getUint16(); - t.pos += 4; - u = t.getUint16(); - } - n.maxp.data[4] = l >> 8; - n.maxp.data[5] = 255 & l; - const d = (function sanitizeTTPrograms(e, t, i, a) { - const s = { + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + const ttContext = { functionsDefined: [], functionsUsed: [], functionsStackDeltas: [], - tooComplexToFollowFunctions: !1, - hintsValid: !0, + tooComplexToFollowFunctions: false, + hintsValid: true, }; - e && sanitizeTTProgram(e, s); - t && sanitizeTTProgram(t, s); - e && - (function checkInvalidFunctions(e, t) { - if (!e.tooComplexToFollowFunctions) - if (e.functionsDefined.length > t) { - warn("TT: more functions defined than expected"); - e.hintsValid = !1; - } else - for (let i = 0, a = e.functionsUsed.length; i < a; i++) { - if (i > t) { - warn("TT: invalid function id: " + i); - e.hintsValid = !1; - return; - } - if (e.functionsUsed[i] && !e.functionsDefined[i]) { - warn("TT: undefined function: " + i); - e.hintsValid = !1; - return; - } - } - })(s, a); - if (i && 1 & i.length) { - const e = new Uint8Array(i.length + 1); - e.set(i.data); - i.data = e; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); } - return s.hintsValid; - })(n.fpgm, n.prep, n["cvt "], E); - if (!d) { - delete n.fpgm; - delete n.prep; - delete n["cvt "]; + 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; } - !(function sanitizeMetrics(e, t, i, a, s, r) { - if (!t) { - i && (i.data = null); - return; + font = new 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; + const isTrueType = !tables["CFF "]; + if (!isTrueType) { + const isComposite = + properties.composite && + (properties.cidToGidMap?.length > 0 || + !(properties.cMap instanceof IdentityCMap)); + if ( + (header.version === "OTTO" && !isComposite) || + !tables.head || + !tables.hhea || + !tables.maxp || + !tables.post + ) { + cffFile = new Stream(tables["CFF "].data); + cff = new CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); } - e.pos = (e.start || 0) + t.offset; - e.pos += 4; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - e.pos += 2; - const n = e.getUint16(); - e.pos += 8; - e.pos += 2; - let g = e.getUint16(); - if (0 !== n) { - if (!(2 & int16(a.data[44], a.data[45]))) { - t.data[22] = 0; - t.data[23] = 0; - } + delete tables.glyf; + delete tables.loca; + delete tables.fpgm; + delete tables.prep; + delete tables["cvt "]; + this.isOpenType = true; + } else { + if (!tables.loca) { + throw new FormatError('Required "loca" table is not found'); } - if (g > s) { - info( - `The numOfMetrics (${g}) should not be greater than the numGlyphs (${s}).`, + if (!tables.glyf) { + 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 FormatError('Required "maxp" table is not found'); + } + font.pos = (font.start || 0) + tables.maxp.offset; + let version = font.getInt32(); + const numGlyphs = font.getUint16(); + if (version !== 0x00010000 && version !== 0x00005000) { + if (tables.maxp.length === 6) { + version = 0x0005000; + } else if (tables.maxp.length >= 32) { + version = 0x00010000; + } else { + throw new FormatError(`"maxp" table has a wrong version number`); + } + writeUint32(tables.maxp.data, 0, version); + } + if (properties.scaleFactors?.length === numGlyphs && isTrueType) { + const { scaleFactors } = properties; + const isGlyphLocationsLong = int16( + tables.head.data[50], + tables.head.data[51], + ); + const glyphs = new 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]), ); - g = s; - t.data[34] = (65280 & g) >> 8; - t.data[35] = 255 & g; - } - const o = s - g - ((i.length - 4 * g) >> 1); - if (o > 0) { - const e = new Uint8Array(i.length + 2 * o); - e.set(i.data); - if (r) { - e[i.length] = i.data[2]; - e[i.length + 1] = i.data[3]; - } - i.data = e; - } - })(t, n.hhea, n.hmtx, n.head, l, Q); - if (!n.head) throw new FormatError('Required "head" table is not found'); - !(function sanitizeHead(e, t, i) { - const a = e.data, - s = (function int32(e, t, i, a) { - return (e << 24) + (t << 16) + (i << 8) + a; - })(a[0], a[1], a[2], a[3]); - if (s >> 16 != 1) { - info("Attempting to fix invalid version in head table: " + s); - a[0] = 0; - a[1] = 1; - a[2] = 0; - a[3] = 0; - } - const r = int16(a[50], a[51]); - if (r < 0 || r > 1) { - info("Attempting to fix invalid indexToLocFormat in head table: " + r); - const e = t + 1; - if (i === e << 1) { - a[50] = 0; - a[51] = 0; - } else { - if (i !== e << 2) - throw new FormatError("Could not fix indexToLocFormat: " + r); - a[50] = 0; - a[51] = 1; - } - } - })(n.head, h, c ? n.loca.length : 0); - let f = Object.create(null); - if (c) { - const e = int16(n.head.data[50], n.head.data[51]), - t = (function sanitizeGlyphLocations(e, t, i, a, s, r, n) { - let g, o, c; - if (a) { - g = 4; - o = function fontItemDecodeLong(e, t) { - return ( - (e[t] << 24) | (e[t + 1] << 16) | (e[t + 2] << 8) | e[t + 3] - ); - }; - c = function fontItemEncodeLong(e, t, i) { - e[t] = (i >>> 24) & 255; - e[t + 1] = (i >> 16) & 255; - e[t + 2] = (i >> 8) & 255; - e[t + 3] = 255 & i; - }; - } else { - g = 2; - o = function fontItemDecode(e, t) { - return (e[t] << 9) | (e[t + 1] << 1); - }; - c = function fontItemEncode(e, t, i) { - e[t] = (i >> 9) & 255; - e[t + 1] = (i >> 1) & 255; - }; - } - const C = r ? i + 1 : i, - h = g * (1 + C), - l = new Uint8Array(h); - l.set(e.data.subarray(0, h)); - e.data = l; - const Q = t.data, - E = Q.length, - u = new Uint8Array(E); - let d, f; - const p = []; - for (d = 0, f = 0; d < i + 1; d++, f += g) { - let e = o(l, f); - e > E && (e = E); - p.push({ index: d, offset: e, endOffset: 0 }); - } - p.sort((e, t) => e.offset - t.offset); - for (d = 0; d < i; d++) p[d].endOffset = p[d + 1].offset; - p.sort((e, t) => e.index - t.index); - for (d = 0; d < i; d++) { - const { offset: e, endOffset: t } = p[d]; - if (0 !== e || 0 !== t) break; - const i = p[d + 1].offset; - if (0 !== i) { - p[d].endOffset = i; - break; - } - } - const m = p.at(-2); - 0 !== m.offset && 0 === m.endOffset && (m.endOffset = E); - const y = Object.create(null); - let w = 0; - c(l, 0, w); - for (d = 0, f = g; d < i; d++, f += g) { - const e = sanitizeGlyph(Q, p[d].offset, p[d].endOffset, u, w, s), - t = e.length; - 0 === t && (y[d] = !0); - e.sizeOfInstructions > n && (n = e.sizeOfInstructions); - w += t; - c(l, f, w); - } - if (0 === w) { - const e = new Uint8Array([ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, - ]); - for (d = 0, f = g; d < C; d++, f += g) c(l, f, e.length); - t.data = e; - } else if (r) { - const i = o(l, g); - if (u.length > i + w) t.data = u.subarray(0, i + w); - else { - t.data = new Uint8Array(i + w); - t.data.set(u.subarray(0, w)); - } - t.data.set(u.subarray(0, i), w); - c(e.data, l.length - g, w + i); - } else t.data = u.subarray(0, w); - return { missingGlyphs: y, maxSizeOfInstructions: n }; - })(n.loca, n.glyf, h, e, d, Q, u); - f = t.missingGlyphs; - if (C >= 65536 && n.maxp.length >= 32) { - n.maxp.data[26] = t.maxSizeOfInstructions >> 8; - n.maxp.data[27] = 255 & t.maxSizeOfInstructions; + 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); } } - if (!n.hhea) throw new FormatError('Required "hhea" table is not found'); - if (0 === n.hhea.data[10] && 0 === n.hhea.data[11]) { - n.hhea.data[10] = 255; - n.hhea.data[11] = 255; + let numGlyphsOut = numGlyphs + 1; + let dupFirstEntry = true; + if (numGlyphsOut > 0xffff) { + dupFirstEntry = false; + numGlyphsOut = numGlyphs; + warn("Not enough space in glyfs to duplicate first glyph."); } - const p = { - unitsPerEm: int16(n.head.data[18], n.head.data[19]), - yMax: signedInt16(n.head.data[42], n.head.data[43]), - yMin: signedInt16(n.head.data[38], n.head.data[39]), - ascent: signedInt16(n.hhea.data[4], n.hhea.data[5]), - descent: signedInt16(n.hhea.data[6], n.hhea.data[7]), - lineGap: signedInt16(n.hhea.data[8], n.hhea.data[9]), + let maxFunctionDefs = 0; + let maxSizeOfInstructions = 0; + if (version >= 0x00010000 && tables.maxp.length >= 32) { + font.pos += 8; + const 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; + 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 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 >= 32) { + tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; + tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; + } + } + if (!tables.hhea) { + throw new 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; + } + const metricsOverride = { + unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), + yMax: signedInt16(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 = p.ascent / p.unitsPerEm; - this.descent = p.descent / p.unitsPerEm; - this.lineGap = p.lineGap / p.unitsPerEm; + this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; + this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; + this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; if (this.cssFontInfo?.lineHeight) { this.lineHeight = this.cssFontInfo.metrics.lineHeight; this.lineGap = this.cssFontInfo.metrics.lineGap; - } else this.lineHeight = this.ascent - this.descent + this.lineGap; - n.post && - (function readPostScriptTable(e, i, a) { - const s = (t.start || 0) + e.offset; - t.pos = s; - const r = s + e.length, - n = t.getInt32(); - t.skip(28); - let g, - o, - c = !0; - switch (n) { - case 65536: - g = Oi; - break; - case 131072: - const e = t.getUint16(); - if (e !== a) { - c = !1; - break; - } - const s = []; - for (o = 0; o < e; ++o) { - const e = t.getUint16(); - if (e >= 32768) { - c = !1; - break; - } - s.push(e); - } - if (!c) break; - const C = [], - h = []; - for (; t.pos < r; ) { - const e = t.getByte(); - h.length = e; - for (o = 0; o < e; ++o) h[o] = String.fromCharCode(t.getByte()); - C.push(h.join("")); - } - g = []; - for (o = 0; o < e; ++o) { - const e = s[o]; - e < 258 ? g.push(Oi[e]) : g.push(C[e - 258]); - } - break; - case 196608: - break; - default: - warn("Unknown/unsupported post table version " + n); - c = !1; - i.defaultEncoding && (g = i.defaultEncoding); - } - i.glyphNames = g; - return c; - })(n.post, i, h); - n.post = { tag: "post", data: createPostTable(i) }; - const m = Object.create(null); - function hasGlyph(e) { - return !f[e]; + } else { + this.lineHeight = this.ascent - this.descent + this.lineGap; } - if (i.composite) { - const e = i.cidToGidMap || [], - t = 0 === e.length; - i.cMap.forEach(function (i, a) { - "string" == typeof a && (a = convertCidString(i, a, !0)); - if (a > 65535) throw new FormatError("Max size of CID is 65,535"); - let s = -1; - t ? (s = a) : void 0 !== e[a] && (s = e[a]); - s >= 0 && s < h && hasGlyph(s) && (m[i] = s); + if (tables.post) { + readPostScriptTable(tables.post, properties, numGlyphs); + } + tables.post = { + tag: "post", + data: createPostTable(properties), + }; + const charCodeToGlyphId = Object.create(null); + 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 (typeof cid === "string") { + cid = convertCidString(charCode, cid, true); + } + if (cid > 0xffff) { + throw new 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 e = (function readCmapTable(e, t, i, a) { - if (!e) { - warn("No cmap table available."); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: !1, - }; - } - let s, - r = (t.start || 0) + e.offset; - t.pos = r; - t.skip(2); - const n = t.getUint16(); - let g, - o = !1; - for (let e = 0; e < n; e++) { - const s = t.getUint16(), - r = t.getUint16(), - c = t.getInt32() >>> 0; - let C = !1; - if (g?.platformId !== s || g?.encodingId !== r) { - if (0 !== s || (0 !== r && 1 !== r && 3 !== r)) - if (1 === s && 0 === r) C = !0; - else if (3 !== s || 1 !== r || (!a && g)) { - if (i && 3 === s && 0 === r) { - C = !0; - let i = !0; - if (e < n - 1) { - const e = t.peekBytes(2); - int16(e[0], e[1]) < s && (i = !1); - } - i && (o = !0); - } - } else { - C = !0; - i || (o = !0); - } - else C = !0; - C && (g = { platformId: s, encodingId: r, offset: c }); - if (o) break; - } - } - g && (t.pos = r + g.offset); - if (!g || -1 === t.peekByte()) { - warn("Could not find a preferred cmap table."); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: !1, - }; - } - const c = t.getUint16(); - let C = !1; - const h = []; - let l, Q; - if (0 === c) { - t.skip(4); - for (l = 0; l < 256; l++) { - const e = t.getByte(); - e && h.push({ charCode: l, glyphId: e }); - } - C = !0; - } else if (2 === c) { - t.skip(4); - const e = []; - let i = 0; - for (let a = 0; a < 256; a++) { - const a = t.getUint16() >> 3; - e.push(a); - i = Math.max(a, i); - } - const a = []; - for (let e = 0; e <= i; e++) - a.push({ - firstCode: t.getUint16(), - entryCount: t.getUint16(), - idDelta: signedInt16(t.getByte(), t.getByte()), - idRangePos: t.pos + t.getUint16(), - }); - for (let i = 0; i < 256; i++) - if (0 === e[i]) { - t.pos = a[0].idRangePos + 2 * i; - Q = t.getUint16(); - h.push({ charCode: i, glyphId: Q }); - } else { - const s = a[e[i]]; - for (l = 0; l < s.entryCount; l++) { - const e = (i << 8) + l + s.firstCode; - t.pos = s.idRangePos + 2 * l; - Q = t.getUint16(); - 0 !== Q && (Q = (Q + s.idDelta) % 65536); - h.push({ charCode: e, glyphId: Q }); - } - } - } else if (4 === c) { - t.skip(4); - const e = t.getUint16() >> 1; - t.skip(6); - const i = []; - let a; - for (a = 0; a < e; a++) i.push({ end: t.getUint16() }); - t.skip(2); - for (a = 0; a < e; a++) i[a].start = t.getUint16(); - for (a = 0; a < e; a++) i[a].delta = t.getUint16(); - let n, - g = 0; - for (a = 0; a < e; a++) { - s = i[a]; - const r = t.getUint16(); - if (r) { - n = (r >> 1) - (e - a); - s.offsetIndex = n; - g = Math.max(g, n + s.end - s.start + 1); - } else s.offsetIndex = -1; - } - const o = []; - for (l = 0; l < g; l++) o.push(t.getUint16()); - for (a = 0; a < e; a++) { - s = i[a]; - r = s.start; - const e = s.end, - t = s.delta; - n = s.offsetIndex; - for (l = r; l <= e; l++) - if (65535 !== l) { - Q = n < 0 ? l : o[n + l - r]; - Q = (Q + t) & 65535; - h.push({ charCode: l, glyphId: Q }); - } - } - } else if (6 === c) { - t.skip(4); - const e = t.getUint16(), - i = t.getUint16(); - for (l = 0; l < i; l++) { - Q = t.getUint16(); - const i = e + l; - h.push({ charCode: i, glyphId: Q }); - } - } else { - if (12 !== c) { - warn("cmap table has unsupported format: " + c); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: !1, - }; - } - { - t.skip(10); - const e = t.getInt32() >>> 0; - for (l = 0; l < e; l++) { - const e = t.getInt32() >>> 0, - i = t.getInt32() >>> 0; - let a = t.getInt32() >>> 0; - for (let t = e; t <= i; t++) - h.push({ charCode: t, glyphId: a++ }); - } - } - } - h.sort(function (e, t) { - return e.charCode - t.charCode; - }); - for (let e = 1; e < h.length; e++) - if (h[e - 1].charCode === h[e].charCode) { - h.splice(e, 1); - e--; - } - return { - platformId: g.platformId, - encodingId: g.encodingId, - mappings: h, - hasShortCmap: C, - }; - })(n.cmap, t, this.isSymbolicFont, i.hasEncoding), - a = e.platformId, - s = e.encodingId, - r = e.mappings; - let g = [], - o = !1; - !i.hasEncoding || - ("MacRomanEncoding" !== i.baseEncodingName && - "WinAnsiEncoding" !== i.baseEncodingName) || - (g = getEncoding(i.baseEncodingName)); + const cmapTable = readCmapTable( + tables.cmap, + font, + this.isSymbolicFont, + properties.hasEncoding, + ); + const cmapPlatformId = cmapTable.platformId; + const cmapEncodingId = cmapTable.encodingId; + const cmapMappings = cmapTable.mappings; + let baseEncoding = [], + forcePostTable = false; if ( - i.hasEncoding && - !this.isSymbolicFont && - ((3 === a && 1 === s) || (1 === a && 0 === s)) + properties.hasEncoding && + (properties.baseEncodingName === "MacRomanEncoding" || + properties.baseEncodingName === "WinAnsiEncoding") ) { - const e = Ni(); - for (let t = 0; t < 256; t++) { - let n; - n = - void 0 !== this.differences[t] - ? this.differences[t] - : g.length && "" !== g[t] - ? g[t] - : fi[t]; - if (!n) continue; - const o = recoverGlyphName(n, e); - let c; - 3 === a && 1 === s - ? (c = e[o]) - : 1 === a && 0 === s && (c = di.indexOf(o)); - if (void 0 === c) { + baseEncoding = getEncoding(properties.baseEncodingName); + } + if ( + properties.hasEncoding && + !this.isSymbolicFont && + ((cmapPlatformId === 3 && cmapEncodingId === 1) || + (cmapPlatformId === 1 && cmapEncodingId === 0)) + ) { + const glyphsUnicodeMap = getGlyphsUnicode(); + for (let charCode = 0; charCode < 256; charCode++) { + let glyphName; + if (this.differences[charCode] !== undefined) { + glyphName = this.differences[charCode]; + } else if (baseEncoding.length && baseEncoding[charCode] !== "") { + glyphName = baseEncoding[charCode]; + } else { + glyphName = StandardEncoding[charCode]; + } + if (!glyphName) { + continue; + } + const standardGlyphName = recoverGlyphName( + glyphName, + glyphsUnicodeMap, + ); + let unicodeOrCharCode; + if (cmapPlatformId === 3 && cmapEncodingId === 1) { + unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; + } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { + unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); + } + if (unicodeOrCharCode === undefined) { if ( - !i.glyphNames && - i.hasIncludedToUnicodeMap && + !properties.glyphNames && + properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap) ) { - const e = this.toUnicode.get(t); - e && (c = e.codePointAt(0)); + const unicode = this.toUnicode.get(charCode); + if (unicode) { + unicodeOrCharCode = unicode.codePointAt(0); + } + } + if (unicodeOrCharCode === undefined) { + continue; } - if (void 0 === c) continue; } - for (const e of r) - if (e.charCode === c) { - m[t] = e.glyphId; - break; + for (const mapping of cmapMappings) { + if (mapping.charCode !== unicodeOrCharCode) { + continue; } + charCodeToGlyphId[charCode] = mapping.glyphId; + break; + } } - } else if (0 === a) { - for (const e of r) m[e.charCode] = e.glyphId; - o = !0; - } else if (3 === a && 0 === s) - for (const e of r) { - let t = e.charCode; - t >= 61440 && t <= 61695 && (t &= 255); - m[t] = e.glyphId; + } else if (cmapPlatformId === 0) { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; } - else for (const e of r) m[e.charCode] = e.glyphId; - if (i.glyphNames && (g.length || this.differences.length)) - for (let e = 0; e < 256; ++e) { - if (!o && void 0 !== m[e]) continue; - const t = this.differences[e] || g[e]; - if (!t) continue; - const a = i.glyphNames.indexOf(t); - a > 0 && hasGlyph(a) && (m[e] = a); + forcePostTable = true; + } else if (cmapPlatformId === 3 && cmapEncodingId === 0) { + for (const mapping of cmapMappings) { + let charCode = mapping.charCode; + if (charCode >= 0xf000 && charCode <= 0xf0ff) { + charCode &= 0xff; + } + charCodeToGlyphId[charCode] = mapping.glyphId; + } + } else { + for (const mapping of cmapMappings) { + charCodeToGlyphId[mapping.charCode] = mapping.glyphId; } - } - 0 === m.length && (m[0] = 0); - let y = l - 1; - Q || (y = 0); - if (!i.cssFontInfo) { - const e = adjustMapping(m, hasGlyph, y, this.toUnicode); - this.toFontChar = e.toFontChar; - n.cmap = { - tag: "cmap", - data: createCmapTable(e.charCodeToGlyphId, e.toUnicodeExtraMap, l), - }; - (n["OS/2"] && - (function validateOS2Table(e, t) { - t.pos = (t.start || 0) + e.offset; - const i = t.getUint16(); - t.skip(60); - const a = t.getUint16(); - if (i < 4 && 768 & a) return !1; - if (t.getUint16() > t.getUint16()) return !1; - t.skip(6); - if (0 === t.getUint16()) return !1; - e.data[8] = e.data[9] = 0; - return !0; - })(n["OS/2"], t)) || - (n["OS/2"] = { - tag: "OS/2", - data: createOS2Table(i, e.charCodeToGlyphId, p), - }); - } - if (!c) - try { - o = new Stream(n["CFF "].data); - g = new CFFParser(o, i, Yi).parse(); - g.duplicateFirstGlyph(); - const e = new CFFCompiler(g); - n["CFF "].data = e.compile(); - } catch { - warn("Failed to compile font " + i.loadedName); } - if (n.name) { - const [t, a] = readNameTable(n.name); - n.name.data = createNameTable(e, t); - this.psName = t[0][6] || null; - i.composite || - (function adjustTrueTypeToUnicode(e, t, i) { - if (e.isInternalFont) return; - if (e.hasIncludedToUnicodeMap) return; - if (e.hasEncoding) return; - if (e.toUnicode instanceof IdentityToUnicodeMap) return; - if (!t) return; - if (0 === i.length) return; - if (e.defaultEncoding === pi) return; - for (const e of i) if (!isWinNameRecord(e)) return; - const a = pi, - s = [], - r = Ni(); - for (const e in a) { - const t = a[e]; - if ("" === t) continue; - const i = r[t]; - void 0 !== i && (s[e] = String.fromCharCode(i)); - } - s.length > 0 && e.toUnicode.amend(s); - })(i, this.isSymbolicFont, a); - } else n.name = { tag: "name", data: createNameTable(this.name) }; - const w = new OpenTypeFileBuilder(r.version); - for (const e in n) w.addTable(e, n[e].data); - return w.toArray(); - } - convert(e, t, i) { - i.fixedPitch = !1; - i.builtInEncoding && - (function adjustType1ToUnicode(e, t) { - if (e.isInternalFont) return; - if (e.hasIncludedToUnicodeMap) return; - if (t === e.defaultEncoding) return; - if (e.toUnicode instanceof IdentityToUnicodeMap) return; - const i = [], - a = Ni(); - for (const s in t) { - if ( - e.hasEncoding && - (e.baseEncodingName || void 0 !== e.differences[s]) - ) + if ( + properties.glyphNames && + (baseEncoding.length || this.differences.length) + ) { + for (let i = 0; i < 256; ++i) { + if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { continue; - const r = getUnicodeForGlyph(t[s], a); - -1 !== r && (i[s] = String.fromCharCode(r)); - } - i.length > 0 && e.toUnicode.amend(i); - })(i, i.builtInEncoding); - let s = 1; - t instanceof CFFFont && (s = t.numGlyphs - 1); - const r = t.getGlyphMapping(i); - let n = null, - g = r, - o = null; - if (!i.cssFontInfo) { - n = adjustMapping(r, t.hasGlyphId.bind(t), s, this.toUnicode); - this.toFontChar = n.toFontChar; - g = n.charCodeToGlyphId; - o = n.toUnicodeExtraMap; - } - const c = t.numGlyphs; - function getCharCodes(e, t) { - let i = null; - for (const a in e) t === e[a] && (i ||= []).push(0 | a); - return i; - } - function createCharCode(e, t) { - for (const i in e) if (t === e[i]) return 0 | i; - n.charCodeToGlyphId[n.nextAvailableFontCharCode] = t; - return n.nextAvailableFontCharCode++; - } - const C = t.seacs; - if (n && C?.length) { - const e = i.fontMatrix || a, - s = t.getCharset(), - g = Object.create(null); - for (let t in C) { - t |= 0; - const i = C[t], - a = fi[i[2]], - o = fi[i[3]], - c = s.indexOf(a), - h = s.indexOf(o); - if (c < 0 || h < 0) continue; - const l = { - x: i[0] * e[0] + i[1] * e[2] + e[4], - y: i[0] * e[1] + i[1] * e[3] + e[5], - }, - Q = getCharCodes(r, t); - if (Q) - for (const e of Q) { - const t = n.charCodeToGlyphId, - i = createCharCode(t, c), - a = createCharCode(t, h); - g[e] = { - baseFontCharCode: i, - accentFontCharCode: a, - accentOffset: l, - }; } + const glyphName = this.differences[i] || baseEncoding[i]; + if (!glyphName) { + continue; + } + const glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId > 0 && hasGlyph(glyphId)) { + charCodeToGlyphId[i] = glyphId; + } + } } - i.seacMap = g; } - const h = i.fontMatrix - ? 1 / Math.max(...i.fontMatrix.slice(0, 4).map(Math.abs)) - : 1e3, - l = new OpenTypeFileBuilder("OTTO"); - l.addTable("CFF ", t.data); - l.addTable("OS/2", createOS2Table(i, g)); - l.addTable("cmap", createCmapTable(g, o, c)); - l.addTable( + if (charCodeToGlyphId.length === 0) { + charCodeToGlyphId[0] = 0; + } + let glyphZeroId = numGlyphsOut - 1; + if (!dupFirstEntry) { + glyphZeroId = 0; + } + if (!properties.cssFontInfo) { + const newMapping = adjustMapping( + charCodeToGlyphId, + hasGlyph, + glyphZeroId, + this.toUnicode, + ); + this.toFontChar = newMapping.toFontChar; + tables.cmap = { + tag: "cmap", + data: createCmapTable( + newMapping.charCodeToGlyphId, + newMapping.toUnicodeExtraMap, + 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(tables["CFF "].data); + const parser = new CFFParser( + cffFile, + properties, + SEAC_ANALYSIS_ENABLED, + ); + cff = parser.parse(); + cff.duplicateFirstGlyph(); + const compiler = new CFFCompiler(cff); + tables["CFF "].data = compiler.compile(); + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } + if (!tables.name) { + tables.name = { + tag: "name", + data: createNameTable(this.name), + }; + } else { + const [namePrototype, nameRecords] = readNameTable(tables.name); + tables.name.data = createNameTable(name, namePrototype); + this.psName = namePrototype[0][6] || null; + if (!properties.composite) { + adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords); + } + } + const builder = new OpenTypeFileBuilder(header.version); + for (const tableTag in tables) { + builder.addTable(tableTag, tables[tableTag].data); + } + return builder.toArray(); + } + convert(fontName, font, properties) { + properties.fixedPitch = false; + if (properties.builtInEncoding) { + adjustType1ToUnicode(properties, properties.builtInEncoding); + } + let glyphZeroId = 1; + if (font instanceof CFFFont) { + glyphZeroId = font.numGlyphs - 1; + } + const mapping = font.getGlyphMapping(properties); + let newMapping = null; + let newCharCodeToGlyphId = mapping; + let toUnicodeExtraMap = null; + if (!properties.cssFontInfo) { + newMapping = adjustMapping( + mapping, + font.hasGlyphId.bind(font), + glyphZeroId, + this.toUnicode, + ); + this.toFontChar = newMapping.toFontChar; + newCharCodeToGlyphId = newMapping.charCodeToGlyphId; + toUnicodeExtraMap = newMapping.toUnicodeExtraMap; + } + const numGlyphs = font.numGlyphs; + function getCharCodes(charCodeToGlyphId, glyphId) { + let charCodes = null; + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + (charCodes ||= []).push(charCode | 0); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (const charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + return charCode | 0; + } + } + newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = + glyphId; + return newMapping.nextAvailableFontCharCode++; + } + const seacs = font.seacs; + if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) { + const matrix = properties.fontMatrix || 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 = StandardEncoding[seac[2]]; + const accentGlyphName = 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 (!charCodes) { + continue; + } + for (const charCode of charCodes) { + const charCodeToGlyphId = newMapping.charCodeToGlyphId; + const baseFontCharCode = createCharCode( + charCodeToGlyphId, + baseGlyphId, + ); + const accentFontCharCode = createCharCode( + charCodeToGlyphId, + accentGlyphId, + ); + seacMap[charCode] = { + baseFontCharCode, + accentFontCharCode, + accentOffset, + }; + } + } + properties.seacMap = seacMap; + } + const unitsPerEm = properties.fontMatrix + ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) + : 1000; + const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); + builder.addTable("CFF ", font.data); + builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); + builder.addTable( + "cmap", + createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs), + ); + builder.addTable( "head", - "\0\0\0\0\0\0\0\0\0\0_<õ\0\0" + - safeString16(h) + - "\0\0\0\0ž\v~'\0\0\0\0ž\v~'\0\0" + - safeString16(i.descent) + - "ÿ" + - safeString16(i.ascent) + - string16(i.italicAngle ? 2 : 0) + - "\0\0\0\0\0\0\0", + "\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", ); - l.addTable( + builder.addTable( "hhea", - "\0\0\0" + - safeString16(i.ascent) + - safeString16(i.descent) + - "\0\0ÿÿ\0\0\0\0\0\0" + - safeString16(i.capHeight) + - safeString16(Math.tan(i.italicAngle) * i.xHeight) + - "\0\0\0\0\0\0\0\0\0\0\0\0" + - string16(c), + "\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), ); - l.addTable( + builder.addTable( "hmtx", (function fontFieldsHmtx() { - const e = t.charstrings, - i = t.cff ? t.cff.widths : null; - let a = "\0\0\0\0"; - for (let t = 1, s = c; t < s; t++) { - let s = 0; - if (e) { - const i = e[t - 1]; - s = "width" in i ? i.width : 0; - } else i && (s = Math.ceil(i[t] || 0)); - a += string16(s) + string16(0); + const charstrings = font.charstrings; + const cffWidths = font.cff ? font.cff.widths : null; + let hmtx = "\x00\x00\x00\x00"; + for (let i = 1, ii = numGlyphs; i < ii; i++) { + let width = 0; + 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); } - return a; + return hmtx; })(), ); - l.addTable("maxp", "\0\0P\0" + string16(c)); - l.addTable("name", createNameTable(e)); - l.addTable("post", createPostTable(i)); - return l.toArray(); + builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); + builder.addTable("name", createNameTable(fontName)); + builder.addTable("post", createPostTable(properties)); + return builder.toArray(); } - _charToGlyph(e, t = !1) { - let i, - a, - s, - r = this._glyphCache[e]; - if (r?.isSpace === t) return r; - let n = e; - if (this.cMap?.contains(e)) { - n = this.cMap.lookup(e); - "string" == typeof n && (n = convertCidString(e, n)); + get _spaceWidth() { + const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; + let width; + for (const glyphName of possibleSpaceReplacements) { + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + const glyphUnicode = glyphsUnicodeMap[glyphName]; + let charcode = 0; + if (this.composite && this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + if (typeof charcode === "string") { + charcode = convertCidString(glyphUnicode, charcode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } } - a = this.widths[n]; - "number" != typeof a && (a = this.defaultWidth); - const g = this.vmetrics?.[n]; - let o = this.toUnicode.get(e) || e; - "number" == typeof o && (o = String.fromCharCode(o)); - let c = void 0 !== this.toFontChar[e]; - i = this.toFontChar[e] || e; + return shadow(this, "_spaceWidth", width || this.defaultWidth); + } + _charToGlyph(charcode, isSpace = false) { + let glyph = this._glyphCache[charcode]; + if (glyph?.isSpace === isSpace) { + return glyph; + } + let fontCharCode, width, operatorListId; + let widthCode = charcode; + if (this.cMap?.contains(charcode)) { + widthCode = this.cMap.lookup(charcode); + if (typeof widthCode === "string") { + widthCode = convertCidString(charcode, widthCode); + } + } + width = this.widths[widthCode]; + if (typeof width !== "number") { + width = this.defaultWidth; + } + const vmetric = this.vmetrics?.[widthCode]; + let unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === "number") { + unicode = String.fromCharCode(unicode); + } + let isInFont = this.toFontChar[charcode] !== undefined; + fontCharCode = this.toFontChar[charcode] || charcode; if (this.missingFile) { - const t = this.differences[e] || this.defaultEncoding[e]; - (".notdef" !== t && "" !== t) || "Type1" !== this.type || (i = 32); - i = (function mapSpecialUnicodeValues(e) { - return e >= 65520 && e <= 65535 - ? 0 - : e >= 62976 && e <= 63743 - ? xi()[e] || e - : 173 === e - ? 45 - : e; - })(i); + const glyphName = + this.differences[charcode] || this.defaultEncoding[charcode]; + if ( + (glyphName === ".notdef" || glyphName === "") && + this.type === "Type1" + ) { + fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } + } + fontCharCode = mapSpecialUnicodeValues(fontCharCode); } - this.isType3Font && (s = i); - let C = null; - if (this.seacMap?.[e]) { - c = !0; - const t = this.seacMap[e]; - i = t.baseFontCharCode; - C = { - fontChar: String.fromCodePoint(t.accentFontCharCode), - offset: t.accentOffset, + if (this.isType3Font) { + operatorListId = fontCharCode; + } + let accent = null; + if (this.seacMap?.[charcode]) { + isInFont = true; + const seac = this.seacMap[charcode]; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCodePoint(seac.accentFontCharCode), + offset: seac.accentOffset, }; } - let h = ""; - "number" == typeof i && - (i <= 1114111 - ? (h = String.fromCodePoint(i)) - : warn(`charToGlyph - invalid fontCharCode: ${i}`)); - r = new fonts_Glyph(e, h, o, C, a, g, s, t, c); - return (this._glyphCache[e] = r); + let fontChar = ""; + if (typeof fontCharCode === "number") { + if (fontCharCode <= 0x10ffff) { + fontChar = String.fromCodePoint(fontCharCode); + } else { + warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); + } + } + if (this.missingFile && this.vertical && fontChar.length === 1) { + const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; + if (vertical) { + fontChar = unicode = String.fromCharCode(vertical); + } + } + glyph = new fonts_Glyph( + charcode, + fontChar, + unicode, + accent, + width, + vmetric, + operatorListId, + isSpace, + isInFont, + ); + return (this._glyphCache[charcode] = glyph); } - charsToGlyphs(e) { - let t = this._charsCache[e]; - if (t) return t; - t = []; + charsToGlyphs(chars) { + let glyphs = this._charsCache[chars]; + if (glyphs) { + return glyphs; + } + glyphs = []; if (this.cMap) { - const i = Object.create(null), - a = e.length; - let s = 0; - for (; s < a; ) { - this.cMap.readCharCode(e, s, i); - const { charcode: a, length: r } = i; - s += r; - const n = this._charToGlyph(a, 1 === r && 32 === e.charCodeAt(s - 1)); - t.push(n); + 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, a = e.length; i < a; ++i) { - const a = e.charCodeAt(i), - s = this._charToGlyph(a, 32 === a); - t.push(s); + } 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); } - return (this._charsCache[e] = t); + } + return (this._charsCache[chars] = glyphs); } - getCharPositions(e) { - const t = []; + getCharPositions(chars) { + const positions = []; if (this.cMap) { - const i = Object.create(null); - let a = 0; - for (; a < e.length; ) { - this.cMap.readCharCode(e, a, i); - const s = i.length; - t.push([a, a + s]); - a += s; + const c = Object.create(null); + let i = 0; + 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, a = e.length; i < a; ++i) t.push([i, i + 1]); - return t; + } else { + for (let i = 0, ii = chars.length; i < ii; ++i) { + positions.push([i, i + 1]); + } + } + return positions; } get glyphCacheValues() { return Object.values(this._glyphCache); } - encodeString(e) { - const t = [], - i = [], - hasCurrentBufErrors = () => t.length % 2 == 1, - a = - this.toUnicode instanceof IdentityToUnicodeMap - ? (e) => this.toUnicode.charCodeOf(e) - : (e) => this.toUnicode.charCodeOf(String.fromCodePoint(e)); - for (let s = 0, r = e.length; s < r; s++) { - const r = e.codePointAt(s); - r > 55295 && (r < 57344 || r > 65533) && s++; + encodeString(str) { + const buffers = []; + const currentBuf = []; + const hasCurrentBufErrors = () => buffers.length % 2 === 1; + const getCharCode = + this.toUnicode instanceof IdentityToUnicodeMap + ? (unicode) => this.toUnicode.charCodeOf(unicode) + : (unicode) => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); + for (let i = 0, ii = str.length; i < ii; i++) { + const unicode = str.codePointAt(i); + if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { + i++; + } if (this.toUnicode) { - const e = a(r); - if (-1 !== e) { + const charCode = getCharCode(unicode); + if (charCode !== -1) { if (hasCurrentBufErrors()) { - t.push(i.join("")); - i.length = 0; + buffers.push(currentBuf.join("")); + currentBuf.length = 0; + } + const charCodeLength = this.cMap + ? this.cMap.getCharCodeLength(charCode) + : 1; + for (let j = charCodeLength - 1; j >= 0; j--) { + currentBuf.push(String.fromCharCode((charCode >> (8 * j)) & 0xff)); } - for ( - let t = (this.cMap ? this.cMap.getCharCodeLength(e) : 1) - 1; - t >= 0; - t-- - ) - i.push(String.fromCharCode((e >> (8 * t)) & 255)); continue; } } if (!hasCurrentBufErrors()) { - t.push(i.join("")); - i.length = 0; + buffers.push(currentBuf.join("")); + currentBuf.length = 0; } - i.push(String.fromCodePoint(r)); + currentBuf.push(String.fromCodePoint(unicode)); } - t.push(i.join("")); - return t; + buffers.push(currentBuf.join("")); + return buffers; } } class ErrorFont { - constructor(e) { - this.error = e; + constructor(error) { + this.error = error; this.loadedName = "g_font_error"; - this.missingFile = !0; + this.missingFile = true; } charsToGlyphs() { return []; } - encodeString(e) { - return [e]; + encodeString(chars) { + return [chars]; } - exportData(e = !1) { - return { error: this.error }; + exportData(extraProperties = false) { + return { + error: this.error, + }; } -} -const Ea = 2, - ua = 3, - da = 4, - fa = 5, - pa = 6, - ma = 7; +} // ./src/core/pattern.js + +const ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7, +}; class Pattern { constructor() { unreachable("Cannot initialize Pattern."); } - static parseShading(e, t, i, a, s) { - const r = e instanceof BaseStream ? e.dict : e, - n = r.get("ShadingType"); + static parseShading( + shading, + xref, + res, + pdfFunctionFactory, + localColorSpaceCache, + ) { + const dict = shading instanceof BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); try { - switch (n) { - case Ea: - case ua: - return new RadialAxialShading(r, t, i, a, s); - case da: - case fa: - case pa: - case ma: - return new MeshShading(e, t, i, a, s); + switch (type) { + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading( + dict, + 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 MeshShading( + shading, + xref, + res, + pdfFunctionFactory, + localColorSpaceCache, + ); default: - throw new FormatError("Unsupported ShadingType: " + n); + throw new FormatError("Unsupported ShadingType: " + type); } - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(e); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(ex); return new DummyShading(); } } } class BaseShading { static SMALL_NUMBER = 1e-6; - constructor() { - this.constructor === BaseShading && - unreachable("Cannot initialize BaseShading."); - } getIR() { unreachable("Abstract method `getIR` called."); } } class RadialAxialShading extends BaseShading { - constructor(e, t, i, a, s) { + constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { super(); - this.shadingType = e.get("ShadingType"); - let r = 0; - this.shadingType === Ea ? (r = 4) : this.shadingType === ua && (r = 6); - this.coordsArr = e.getArray("Coords"); - if (!isNumberArray(this.coordsArr, r)) - throw new FormatError("RadialAxialShading: Invalid /Coords array."); - const n = ColorSpace.parse({ - cs: e.getRaw("CS") || e.getRaw("ColorSpace"), - xref: t, - resources: i, - pdfFunctionFactory: a, - localColorSpaceCache: s, - }); - this.bbox = lookupNormalRect(e.getArray("BBox"), null); - let g = 0, - o = 1; - const c = e.getArray("Domain"); - isNumberArray(c, 2) && ([g, o] = c); - let C = !1, - h = !1; - const l = e.getArray("Extend"); - (function isBooleanArray(e, t) { - return ( - Array.isArray(e) && - (null === t || e.length === t) && - e.every((e) => "boolean" == typeof e) - ); - })(l, 2) && ([C, h] = l); - if (!(this.shadingType !== ua || (C && h))) { - const [e, t, i, a, s, r] = this.coordsArr, - n = Math.hypot(e - a, t - s); - i <= r + n && r <= i + n && warn("Unsupported radial gradient."); + this.shadingType = dict.get("ShadingType"); + let coordsLen = 0; + if (this.shadingType === ShadingType.AXIAL) { + coordsLen = 4; + } else if (this.shadingType === ShadingType.RADIAL) { + coordsLen = 6; } - this.extendStart = C; - this.extendEnd = h; - const Q = e.getRaw("Function"), - E = a.createFromArray(Q), - u = (o - g) / 840, - d = (this.colorStops = []); - if (g >= o || u <= 0) { + this.coordsArr = dict.getArray("Coords"); + if (!isNumberArray(this.coordsArr, coordsLen)) { + throw new FormatError("RadialAxialShading: Invalid /Coords array."); + } + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache, + }); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + let t0 = 0.0, + t1 = 1.0; + const domainArr = dict.getArray("Domain"); + if (isNumberArray(domainArr, 2)) { + [t0, t1] = domainArr; + } + let extendStart = false, + extendEnd = false; + const extendArr = dict.getArray("Extend"); + if (isBooleanArray(extendArr, 2)) { + [extendStart, extendEnd] = extendArr; + } + if ( + this.shadingType === ShadingType.RADIAL && + (!extendStart || !extendEnd) + ) { + const [x1, y1, r1, x2, y2, r2] = this.coordsArr; + const distance = Math.hypot(x1 - x2, y1 - y2); + if (r1 <= r2 + distance && r2 <= r1 + distance) { + warn("Unsupported radial gradient."); + } + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + const fnObj = dict.getRaw("Function"); + const fn = pdfFunctionFactory.createFromArray(fnObj); + const NUMBER_OF_SAMPLES = 840; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; + const colorStops = (this.colorStops = []); + if (t0 >= t1 || step <= 0) { info("Bad shading domain."); return; } - const f = new Float32Array(n.numComps), - p = new Float32Array(1); - let m, - y = 0; - p[0] = g; - E(p, 0, f, 0); - let w = n.getRgb(f, 0); - const D = Util.makeHexColor(w[0], w[1], w[2]); - d.push([0, D]); - let b = 1; - p[0] = g + u; - E(p, 0, f, 0); - let F = n.getRgb(f, 0), - S = F[0] - w[0] + 1, - k = F[1] - w[1] + 1, - R = F[2] - w[2] + 1, - N = F[0] - w[0] - 1, - G = F[1] - w[1] - 1, - x = F[2] - w[2] - 1; - for (let e = 2; e < 840; e++) { - p[0] = g + e * u; - E(p, 0, f, 0); - m = n.getRgb(f, 0); - const t = e - y; - S = Math.min(S, (m[0] - w[0] + 1) / t); - k = Math.min(k, (m[1] - w[1] + 1) / t); - R = Math.min(R, (m[2] - w[2] + 1) / t); - N = Math.max(N, (m[0] - w[0] - 1) / t); - G = Math.max(G, (m[1] - w[1] - 1) / t); - x = Math.max(x, (m[2] - w[2] - 1) / t); - if (!(N <= S && G <= k && x <= R)) { - const e = Util.makeHexColor(F[0], F[1], F[2]); - d.push([b / 840, e]); - S = m[0] - F[0] + 1; - k = m[1] - F[1] + 1; - R = m[2] - F[2] + 1; - N = m[0] - F[0] - 1; - G = m[1] - F[1] - 1; - x = m[2] - F[2] - 1; - y = b; - w = F; + const color = new Float32Array(cs.numComps), + ratio = new Float32Array(1); + let rgbColor; + let iBase = 0; + ratio[0] = t0; + fn(ratio, 0, color, 0); + let rgbBase = cs.getRgb(color, 0); + const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]); + colorStops.push([0, cssColorBase]); + let iPrev = 1; + ratio[0] = t0 + step; + fn(ratio, 0, color, 0); + let rgbPrev = cs.getRgb(color, 0); + let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1; + let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1; + let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1; + let minSlopeR = rgbPrev[0] - rgbBase[0] - 1; + let minSlopeG = rgbPrev[1] - rgbBase[1] - 1; + let minSlopeB = rgbPrev[2] - rgbBase[2] - 1; + for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; + fn(ratio, 0, color, 0); + rgbColor = cs.getRgb(color, 0); + const run = i - iBase; + maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run); + maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run); + maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run); + minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run); + minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run); + minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run); + const slopesExist = + minSlopeR <= maxSlopeR && + minSlopeG <= maxSlopeG && + minSlopeB <= maxSlopeB; + if (!slopesExist) { + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); + maxSlopeR = rgbColor[0] - rgbPrev[0] + 1; + maxSlopeG = rgbColor[1] - rgbPrev[1] + 1; + maxSlopeB = rgbColor[2] - rgbPrev[2] + 1; + minSlopeR = rgbColor[0] - rgbPrev[0] - 1; + minSlopeG = rgbColor[1] - rgbPrev[1] - 1; + minSlopeB = rgbColor[2] - rgbPrev[2] - 1; + iBase = iPrev; + rgbBase = rgbPrev; } - b = e; - F = m; + iPrev = i; + rgbPrev = rgbColor; } - const U = Util.makeHexColor(F[0], F[1], F[2]); - d.push([1, U]); - let M = "transparent"; - if (e.has("Background")) { - m = n.getRgb(e.get("Background"), 0); - M = Util.makeHexColor(m[0], m[1], m[2]); + const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); + colorStops.push([1, cssColor]); + let background = "transparent"; + if (dict.has("Background")) { + rgbColor = cs.getRgb(dict.get("Background"), 0); + background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); } - if (!C) { - d.unshift([0, M]); - d[1][0] += BaseShading.SMALL_NUMBER; + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; } - if (!h) { - d.at(-1)[0] -= BaseShading.SMALL_NUMBER; - d.push([1, M]); + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); } - this.colorStops = d; + this.colorStops = colorStops; } getIR() { - const { coordsArr: e, shadingType: t } = this; - let i, a, s, r, n; - if (t === Ea) { - a = [e[0], e[1]]; - s = [e[2], e[3]]; - r = null; - n = null; - i = "axial"; - } else if (t === ua) { - a = [e[0], e[1]]; - s = [e[3], e[4]]; - r = e[2]; - n = e[5]; - i = "radial"; - } else unreachable(`getPattern type unknown: ${t}`); - return ["RadialAxial", i, this.bbox, this.colorStops, a, s, r, n]; + const { coordsArr, shadingType } = this; + 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 { + unreachable(`getPattern type unknown: ${shadingType}`); + } + return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; } } class MeshStreamReader { - constructor(e, t) { - this.stream = e; - this.context = t; + constructor(stream, context) { + this.stream = stream; + this.context = context; this.buffer = 0; this.bufferLength = 0; - const i = t.numComps; - this.tmpCompsBuf = new Float32Array(i); - const a = t.colorSpace.numComps; - this.tmpCsCompsBuf = t.colorFn ? new Float32Array(a) : this.tmpCompsBuf; + const numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + const csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn + ? new Float32Array(csNumComps) + : this.tmpCompsBuf; } get hasData() { - if (this.stream.end) return this.stream.pos < this.stream.end; - if (this.bufferLength > 0) return !0; - const e = this.stream.getByte(); - if (e < 0) return !1; - this.buffer = e; + 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 !0; + return true; } - readBits(e) { - let t = this.buffer, - i = this.bufferLength; - if (32 === e) { - if (0 === i) + 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) | @@ -27589,24 +32449,31 @@ class MeshStreamReader { this.stream.getByte()) >>> 0 ); - t = - (t << 24) | + } + buffer = + (buffer << 24) | (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | this.stream.getByte(); - const e = this.stream.getByte(); - this.buffer = e & ((1 << i) - 1); - return ((t << (8 - i)) | ((255 & e) >> i)) >>> 0; + const nextByte = this.stream.getByte(); + this.buffer = nextByte & ((1 << bufferLength) - 1); + return ( + ((buffer << (8 - bufferLength)) | + ((nextByte & 0xff) >> bufferLength)) >>> + 0 + ); } - if (8 === e && 0 === i) return this.stream.getByte(); - for (; i < e; ) { - t = (t << 8) | this.stream.getByte(); - i += 8; + if (n === 8 && bufferLength === 0) { + return this.stream.getByte(); } - i -= e; - this.bufferLength = i; - this.buffer = t & ((1 << i) - 1); - return t >> i; + 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; @@ -27616,585 +32483,651 @@ class MeshStreamReader { return this.readBits(this.context.bitsPerFlag); } readCoordinate() { - const e = this.context.bitsPerCoordinate, - t = this.readBits(e), - i = this.readBits(e), - a = this.context.decode, - s = e < 32 ? 1 / ((1 << e) - 1) : 2.3283064365386963e-10; - return [t * s * (a[1] - a[0]) + a[0], i * s * (a[3] - a[2]) + a[2]]; + 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 e = this.context.numComps, - t = this.context.bitsPerComponent, - i = t < 32 ? 1 / ((1 << t) - 1) : 2.3283064365386963e-10, - a = this.context.decode, - s = this.tmpCompsBuf; - for (let r = 0, n = 4; r < e; r++, n += 2) { - const e = this.readBits(t); - s[r] = e * i * (a[n + 1] - a[n]) + a[n]; + 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 r = this.tmpCsCompsBuf; - this.context.colorFn && this.context.colorFn(s, 0, r, 0); - return this.context.colorSpace.getRgb(r, 0); + const color = this.tmpCsCompsBuf; + if (this.context.colorFn) { + this.context.colorFn(components, 0, color, 0); + } + return this.context.colorSpace.getRgb(color, 0); } } -let ya = Object.create(null); -function getB(e) { - return (ya[e] ||= (function buildB(e) { - const t = []; - for (let i = 0; i <= e; i++) { - const a = i / e, - s = 1 - a; - t.push( - new Float32Array([s ** 3, 3 * a * s ** 2, 3 * a ** 2 * s, a ** 3]), - ); - } - return t; - })(e)); +let bCache = Object.create(null); +function buildB(count) { + const lut = []; + for (let i = 0; i <= count; i++) { + const t = i / count, + t_ = 1 - t; + lut.push( + new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3]), + ); + } + return lut; +} +function getB(count) { + return (bCache[count] ||= buildB(count)); +} +function clearPatternCaches() { + bCache = Object.create(null); } class MeshShading extends BaseShading { static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; static TRIANGLE_DENSITY = 20; - constructor(e, t, i, a, s) { + constructor( + stream, + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache, + ) { super(); - if (!(e instanceof BaseStream)) + if (!(stream instanceof BaseStream)) { throw new FormatError("Mesh data is not a stream"); - const r = e.dict; - this.shadingType = r.get("ShadingType"); - this.bbox = lookupNormalRect(r.getArray("BBox"), null); - const n = ColorSpace.parse({ - cs: r.getRaw("CS") || r.getRaw("ColorSpace"), - xref: t, - resources: i, - pdfFunctionFactory: a, - localColorSpaceCache: s, + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpace.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + localColorSpaceCache, }); - this.background = r.has("Background") - ? n.getRgb(r.get("Background"), 0) + this.background = dict.has("Background") + ? cs.getRgb(dict.get("Background"), 0) : null; - const g = r.getRaw("Function"), - o = g ? a.createFromArray(g) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; this.coords = []; this.colors = []; this.figures = []; - const c = { - bitsPerCoordinate: r.get("BitsPerCoordinate"), - bitsPerComponent: r.get("BitsPerComponent"), - bitsPerFlag: r.get("BitsPerFlag"), - decode: r.getArray("Decode"), - colorFn: o, - colorSpace: n, - numComps: o ? 1 : n.numComps, - }, - C = new MeshStreamReader(e, c); - let h = !1; + 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 da: - this._decodeType4Shading(C); + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); break; - case fa: - const e = 0 | r.get("VerticesPerRow"); - if (e < 2) throw new FormatError("Invalid VerticesPerRow"); - this._decodeType5Shading(C, e); + case ShadingType.LATTICE_FORM_MESH: + const verticesPerRow = dict.get("VerticesPerRow") | 0; + if (verticesPerRow < 2) { + throw new FormatError("Invalid VerticesPerRow"); + } + this._decodeType5Shading(reader, verticesPerRow); break; - case pa: - this._decodeType6Shading(C); - h = !0; + case ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; break; - case ma: - this._decodeType7Shading(C); - h = !0; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; break; default: unreachable("Unsupported mesh type."); + break; } - if (h) { + if (patchMesh) { this._updateBounds(); - for (let e = 0, t = this.figures.length; e < t; e++) - this._buildFigureFromPatch(e); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } } this._updateBounds(); this._packData(); } - _decodeType4Shading(e) { - const t = this.coords, - i = this.colors, - a = [], - s = []; - let r = 0; - for (; e.hasData; ) { - const n = e.readFlag(), - g = e.readCoordinate(), - o = e.readComponents(); - if (0 === r) { - if (!(0 <= n && n <= 2)) throw new FormatError("Unknown type4 flag"); - switch (n) { + _decodeType4Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const operators = []; + const ps = []; + let verticesLeft = 0; + while (reader.hasData) { + const f = reader.readFlag(); + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + if (verticesLeft === 0) { + if (!(0 <= f && f <= 2)) { + throw new FormatError("Unknown type4 flag"); + } + switch (f) { case 0: - r = 3; + verticesLeft = 3; break; case 1: - s.push(s.at(-2), s.at(-1)); - r = 1; + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; break; case 2: - s.push(s.at(-3), s.at(-1)); - r = 1; + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; } - a.push(n); + operators.push(f); } - s.push(t.length); - t.push(g); - i.push(o); - r--; - e.align(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); } this.figures.push({ type: "triangles", - coords: new Int32Array(s), - colors: new Int32Array(s), + coords: new Int32Array(ps), + colors: new Int32Array(ps), }); } - _decodeType5Shading(e, t) { - const i = this.coords, - a = this.colors, - s = []; - for (; e.hasData; ) { - const t = e.readCoordinate(), - r = e.readComponents(); - s.push(i.length); - i.push(t); - a.push(r); + _decodeType5Shading(reader, verticesPerRow) { + const coords = this.coords; + const colors = this.colors; + const ps = []; + while (reader.hasData) { + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); } this.figures.push({ type: "lattice", - coords: new Int32Array(s), - colors: new Int32Array(s), - verticesPerRow: t, + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow, }); } - _decodeType6Shading(e) { - const t = this.coords, - i = this.colors, - a = new Int32Array(16), - s = new Int32Array(4); - for (; e.hasData; ) { - const r = e.readFlag(); - if (!(0 <= r && r <= 3)) throw new FormatError("Unknown type6 flag"); - const n = t.length; - for (let i = 0, a = 0 !== r ? 8 : 12; i < a; i++) - t.push(e.readCoordinate()); - const g = i.length; - for (let t = 0, a = 0 !== r ? 2 : 4; t < a; t++) - i.push(e.readComponents()); - let o, c, C, h; - switch (r) { + _decodeType6Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type6 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { case 0: - a[12] = n + 3; - a[13] = n + 4; - a[14] = n + 5; - a[15] = n + 6; - a[8] = n + 2; - a[11] = n + 7; - a[4] = n + 1; - a[7] = n + 8; - a[0] = n; - a[1] = n + 11; - a[2] = n + 10; - a[3] = n + 9; - s[2] = g + 1; - s[3] = g + 2; - s[0] = g; - s[1] = g + 3; + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; break; case 1: - o = a[12]; - c = a[13]; - C = a[14]; - h = a[15]; - a[12] = h; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = C; - a[11] = n + 3; - a[4] = c; - a[7] = n + 4; - a[0] = o; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - o = s[2]; - c = s[3]; - s[2] = c; - s[3] = g; - s[0] = o; - s[1] = g + 1; + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; break; case 2: - o = a[15]; - c = a[11]; - a[12] = a[3]; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = a[7]; - a[11] = n + 3; - a[4] = c; - a[7] = n + 4; - a[0] = o; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - o = s[3]; - s[2] = s[1]; - s[3] = g; - s[0] = o; - s[1] = g + 1; + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; break; case 3: - a[12] = a[0]; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = a[1]; - a[11] = n + 3; - a[4] = a[2]; - a[7] = n + 4; - a[0] = a[3]; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - s[2] = s[0]; - s[3] = g; - s[0] = s[1]; - s[1] = g + 1; + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; } - a[5] = t.length; - t.push([ - (-4 * t[a[0]][0] - - t[a[15]][0] + - 6 * (t[a[4]][0] + t[a[1]][0]) - - 2 * (t[a[12]][0] + t[a[3]][0]) + - 3 * (t[a[13]][0] + t[a[7]][0])) / + ps[5] = coords.length; + coords.push([ + (-4 * coords[ps[0]][0] - + coords[ps[15]][0] + + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - + 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * t[a[0]][1] - - t[a[15]][1] + - 6 * (t[a[4]][1] + t[a[1]][1]) - - 2 * (t[a[12]][1] + t[a[3]][1]) + - 3 * (t[a[13]][1] + t[a[7]][1])) / + (-4 * coords[ps[0]][1] - + coords[ps[15]][1] + + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - + 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9, ]); - a[6] = t.length; - t.push([ - (-4 * t[a[3]][0] - - t[a[12]][0] + - 6 * (t[a[2]][0] + t[a[7]][0]) - - 2 * (t[a[0]][0] + t[a[15]][0]) + - 3 * (t[a[4]][0] + t[a[14]][0])) / + ps[6] = coords.length; + coords.push([ + (-4 * coords[ps[3]][0] - + coords[ps[12]][0] + + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - + 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * t[a[3]][1] - - t[a[12]][1] + - 6 * (t[a[2]][1] + t[a[7]][1]) - - 2 * (t[a[0]][1] + t[a[15]][1]) + - 3 * (t[a[4]][1] + t[a[14]][1])) / + (-4 * coords[ps[3]][1] - + coords[ps[12]][1] + + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - + 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9, ]); - a[9] = t.length; - t.push([ - (-4 * t[a[12]][0] - - t[a[3]][0] + - 6 * (t[a[8]][0] + t[a[13]][0]) - - 2 * (t[a[0]][0] + t[a[15]][0]) + - 3 * (t[a[11]][0] + t[a[1]][0])) / + ps[9] = coords.length; + 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 * t[a[12]][1] - - t[a[3]][1] + - 6 * (t[a[8]][1] + t[a[13]][1]) - - 2 * (t[a[0]][1] + t[a[15]][1]) + - 3 * (t[a[11]][1] + t[a[1]][1])) / + (-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, ]); - a[10] = t.length; - t.push([ - (-4 * t[a[15]][0] - - t[a[0]][0] + - 6 * (t[a[11]][0] + t[a[14]][0]) - - 2 * (t[a[12]][0] + t[a[3]][0]) + - 3 * (t[a[2]][0] + t[a[8]][0])) / + 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 * t[a[15]][1] - - t[a[0]][1] + - 6 * (t[a[11]][1] + t[a[14]][1]) - - 2 * (t[a[12]][1] + t[a[3]][1]) + - 3 * (t[a[2]][1] + t[a[8]][1])) / + (-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, ]); this.figures.push({ type: "patch", - coords: new Int32Array(a), - colors: new Int32Array(s), + coords: new Int32Array(ps), + colors: new Int32Array(cs), }); } } - _decodeType7Shading(e) { - const t = this.coords, - i = this.colors, - a = new Int32Array(16), - s = new Int32Array(4); - for (; e.hasData; ) { - const r = e.readFlag(); - if (!(0 <= r && r <= 3)) throw new FormatError("Unknown type7 flag"); - const n = t.length; - for (let i = 0, a = 0 !== r ? 12 : 16; i < a; i++) - t.push(e.readCoordinate()); - const g = i.length; - for (let t = 0, a = 0 !== r ? 2 : 4; t < a; t++) - i.push(e.readComponents()); - let o, c, C, h; - switch (r) { + _decodeType7Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type7 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { case 0: - a[12] = n + 3; - a[13] = n + 4; - a[14] = n + 5; - a[15] = n + 6; - a[8] = n + 2; - a[9] = n + 13; - a[10] = n + 14; - a[11] = n + 7; - a[4] = n + 1; - a[5] = n + 12; - a[6] = n + 15; - a[7] = n + 8; - a[0] = n; - a[1] = n + 11; - a[2] = n + 10; - a[3] = n + 9; - s[2] = g + 1; - s[3] = g + 2; - s[0] = g; - s[1] = g + 3; + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; break; case 1: - o = a[12]; - c = a[13]; - C = a[14]; - h = a[15]; - a[12] = h; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = C; - a[9] = n + 9; - a[10] = n + 10; - a[11] = n + 3; - a[4] = c; - a[5] = n + 8; - a[6] = n + 11; - a[7] = n + 4; - a[0] = o; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - o = s[2]; - c = s[3]; - s[2] = c; - s[3] = g; - s[0] = o; - s[1] = g + 1; + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; break; case 2: - o = a[15]; - c = a[11]; - a[12] = a[3]; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = a[7]; - a[9] = n + 9; - a[10] = n + 10; - a[11] = n + 3; - a[4] = c; - a[5] = n + 8; - a[6] = n + 11; - a[7] = n + 4; - a[0] = o; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - o = s[3]; - s[2] = s[1]; - s[3] = g; - s[0] = o; - s[1] = g + 1; + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; break; case 3: - a[12] = a[0]; - a[13] = n + 0; - a[14] = n + 1; - a[15] = n + 2; - a[8] = a[1]; - a[9] = n + 9; - a[10] = n + 10; - a[11] = n + 3; - a[4] = a[2]; - a[5] = n + 8; - a[6] = n + 11; - a[7] = n + 4; - a[0] = a[3]; - a[1] = n + 7; - a[2] = n + 6; - a[3] = n + 5; - s[2] = s[0]; - s[3] = g; - s[0] = s[1]; - s[1] = g + 1; + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; } this.figures.push({ type: "patch", - coords: new Int32Array(a), - colors: new Int32Array(s), + coords: new Int32Array(ps), + colors: new Int32Array(cs), }); } } - _buildFigureFromPatch(e) { - const t = this.figures[e]; - assert("patch" === t.type, "Unexpected patch mesh figure"); - const i = this.coords, - a = this.colors, - s = t.coords, - r = t.colors, - n = Math.min(i[s[0]][0], i[s[3]][0], i[s[12]][0], i[s[15]][0]), - g = Math.min(i[s[0]][1], i[s[3]][1], i[s[12]][1], i[s[15]][1]), - o = Math.max(i[s[0]][0], i[s[3]][0], i[s[12]][0], i[s[15]][0]), - c = Math.max(i[s[0]][1], i[s[3]][1], i[s[12]][1], i[s[15]][1]); - let C = Math.ceil( - ((o - n) * MeshShading.TRIANGLE_DENSITY) / + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + 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]), ); - C = Math.max( + splitXBy = Math.max( MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, C), + Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy), ); - let h = Math.ceil( - ((c - g) * MeshShading.TRIANGLE_DENSITY) / + let splitYBy = Math.ceil( + ((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY) / (this.bounds[3] - this.bounds[1]), ); - h = Math.max( + splitYBy = Math.max( MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, h), + Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy), ); - const l = C + 1, - Q = new Int32Array((h + 1) * l), - E = new Int32Array((h + 1) * l); - let u = 0; - const d = new Uint8Array(3), - f = new Uint8Array(3), - p = a[r[0]], - m = a[r[1]], - y = a[r[2]], - w = a[r[3]], - D = getB(h), - b = getB(C); - for (let e = 0; e <= h; e++) { - d[0] = ((p[0] * (h - e) + y[0] * e) / h) | 0; - d[1] = ((p[1] * (h - e) + y[1] * e) / h) | 0; - d[2] = ((p[2] * (h - e) + y[2] * e) / h) | 0; - f[0] = ((m[0] * (h - e) + w[0] * e) / h) | 0; - f[1] = ((m[1] * (h - e) + w[1] * e) / h) | 0; - f[2] = ((m[2] * (h - e) + w[2] * e) / h) | 0; - for (let t = 0; t <= C; t++, u++) { - if (!((0 !== e && e !== h) || (0 !== t && t !== C))) continue; - let r = 0, - n = 0, - g = 0; - for (let a = 0; a <= 3; a++) - for (let o = 0; o <= 3; o++, g++) { - const c = D[e][a] * b[t][o]; - r += i[s[g]][0] * c; - n += i[s[g]][1] * c; + 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; } - Q[u] = i.length; - i.push([r, n]); - E[u] = a.length; - const o = new Uint8Array(3); - o[0] = ((d[0] * (C - t) + f[0] * t) / C) | 0; - o[1] = ((d[1] * (C - t) + f[1] * t) / C) | 0; - o[2] = ((d[2] * (C - t) + f[2] * t) / C) | 0; - a.push(o); + } + 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); } } - Q[0] = s[0]; - E[0] = r[0]; - Q[C] = s[3]; - E[C] = r[1]; - Q[l * h] = s[12]; - E[l * h] = r[2]; - Q[l * h + C] = s[15]; - E[l * h + C] = r[3]; - this.figures[e] = { + 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: Q, - colors: E, - verticesPerRow: l, + coords: figureCoords, + colors: figureColors, + verticesPerRow, }; } _updateBounds() { - let e = this.coords[0][0], - t = this.coords[0][1], - i = e, - a = t; - for (let s = 1, r = this.coords.length; s < r; s++) { - const r = this.coords[s][0], - n = this.coords[s][1]; - e = e > r ? r : e; - t = t > n ? n : t; - i = i < r ? r : i; - a = a < n ? n : a; + let minX = this.coords[0][0], + minY = this.coords[0][1], + maxX = minX, + maxY = minY; + 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; } - this.bounds = [e, t, i, a]; + this.bounds = [minX, minY, maxX, maxY]; } _packData() { - let e, t, i, a; - const s = this.coords, - r = new Float32Array(2 * s.length); - for (e = 0, i = 0, t = s.length; e < t; e++) { - const t = s[e]; - r[i++] = t[0]; - r[i++] = t[1]; + 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++) { + const xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; } - this.coords = r; - const n = this.colors, - g = new Uint8Array(3 * n.length); - for (e = 0, i = 0, t = n.length; e < t; e++) { - const t = n[e]; - g[i++] = t[0]; - g[i++] = t[1]; - g[i++] = t[2]; + 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++) { + const c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; } - this.colors = g; - const o = this.figures; - for (e = 0, t = o.length; e < t; e++) { - const t = o[e], - s = t.coords, - r = t.colors; - for (i = 0, a = s.length; i < a; i++) { - s[i] *= 2; - r[i] *= 3; + this.colors = colorsPacked; + const figures = this.figures; + for (i = 0, ii = figures.length; i < ii; i++) { + const figure = figures[i], + ps = figure.coords, + cs = figure.colors; + for (j = 0, jj = ps.length; j < jj; j++) { + ps[j] *= 2; + cs[j] *= 3; } } } getIR() { - const { bounds: e } = this; - if (e[2] - e[0] == 0 || e[3] - e[1] == 0) - throw new FormatError(`Invalid MeshShading bounds: [${e}].`); + const { bounds } = this; + if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { + throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); + } return [ "Mesh", this.shadingType, this.coords, this.colors, this.figures, - e, + bounds, this.bbox, this.background, ]; @@ -28205,1747 +33138,1795 @@ class DummyShading extends BaseShading { return ["Dummy"]; } } -function getTilingPatternIR(e, t, a) { - const s = lookupMatrix(t.getArray("Matrix"), i), - r = lookupNormalRect(t.getArray("BBox"), null); - if (!r || r[2] - r[0] == 0 || r[3] - r[1] == 0) - throw new FormatError("Invalid getTilingPatternIR /BBox array."); - const n = t.get("XStep"); - if ("number" != typeof n) - throw new FormatError("Invalid getTilingPatternIR /XStep value."); - const g = t.get("YStep"); - if ("number" != typeof g) - throw new FormatError("Invalid getTilingPatternIR /YStep value."); - const o = t.get("PaintType"); - if (!Number.isInteger(o)) - throw new FormatError("Invalid getTilingPatternIR /PaintType value."); - const c = t.get("TilingType"); - if (!Number.isInteger(c)) - throw new FormatError("Invalid getTilingPatternIR /TilingType value."); - return ["TilingPattern", a, e, s, r, n, g, o, c]; +function getTilingPatternIR(operatorList, dict, color) { + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { + throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); + } + const xstep = dict.get("XStep"); + if (typeof xstep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); + } + const ystep = dict.get("YStep"); + if (typeof ystep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); + } + const paintType = dict.get("PaintType"); + if (!Number.isInteger(paintType)) { + throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); + } + const tilingType = dict.get("TilingType"); + if (!Number.isInteger(tilingType)) { + throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); + } + return [ + "TilingPattern", + color, + operatorList, + matrix, + bbox, + xstep, + ystep, + paintType, + tilingType, + ]; +} // ./src/core/calibri_factors.js + +const CalibriBoldFactors = [ + 1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, + 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, + 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, + 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, + 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, + 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, + 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, + 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, + 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, + 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, + 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, + 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, + 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, + 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, + 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, + 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, + 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, + 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, + 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, + 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, + 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, + 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, + 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, + 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, + 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, + 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, + 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, + 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, + 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, + 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, + 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, + 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, + 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, + 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, + 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, + 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, + 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, + 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, + 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, + 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, + 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, + 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, + 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, + 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, + 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, + 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, + 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, + 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 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.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, + 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, + 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, + 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, + 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, + 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, + 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, + 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, + 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, + 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, + 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const CalibriBoldMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207, +}; +const CalibriBoldItalicFactors = [ + 1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, + 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, + 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, + 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, + 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, + 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, + 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, + 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, + 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, + 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, + 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, + 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, + 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, + 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, + 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, + 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, + 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, + 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, + 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, + 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, + 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, + 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, + 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, + 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, + 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, + 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, + 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, + 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, + 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, + 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, + 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, + 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, + 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, + 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, + 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, + 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, + 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, + 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, + 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, + 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, + 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, + 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, + 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, + 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, + 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, + 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, + 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, + 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, + 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.88323, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, + 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, + 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, + 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, + 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, + 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, + 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, + 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, + 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, + 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, +]; +const CalibriBoldItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207, +}; +const CalibriItalicFactors = [ + 1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, + 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, + 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, + 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, + 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, + 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, + 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, + 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, + 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, + 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, + 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, + 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, + 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, + 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, + 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, + 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, + 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, + 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, + 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, + 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, + 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, + 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, + 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, + 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, + 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, + 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, + 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, + 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, + 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, + 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, + 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, + 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, + 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, + 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, + 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, + 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, + 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, + 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, + 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, + 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, + 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, + 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, + 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, + 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, + 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, + 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, + 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.85865, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, + 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, + 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, + 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, + 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, + 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, + 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, + 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, + 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, + 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, + 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const CalibriItalicMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207, +}; +const CalibriRegularFactors = [ + 1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, + 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, + 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, + 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, + 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, + 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, + 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, + 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, + 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, + 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, + 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, + 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, + 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, + 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, + 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, + 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, + 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, + 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, + 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, + 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, + 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, + 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, + 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, + 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, + 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, + 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, + 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, + 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, + 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, + 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, + 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, + 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, + 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, + 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, + 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, + 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, + 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, + 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, + 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, + 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, + 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, + 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, + 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, + 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, + 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, + 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, + 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, + 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.89464, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, + 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, + 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, + 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, + 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, + 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, + 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, + 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, + 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, + 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, + 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, + 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const CalibriRegularMetrics = { + lineHeight: 1.2207, + lineGap: 0.2207, +}; // ./src/core/helvetica_factors.js + +const HelveticaBoldFactors = [ + 0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, + 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, + 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, + 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, + 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, + 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, + 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, + 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, + 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, + 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, + 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, + 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, + 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, + 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, + 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, + 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, + 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, + 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, + 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, + 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, + 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, + 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, + 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, + 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, + 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, + 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, + 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, + 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, + 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, + 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, + 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, + 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, + 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, + 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, + 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, + 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, + 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, + 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, + 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, + 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, + 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, + 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, + 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, + 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, + 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, + 1.00001, 1.00021, 0.99926, 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, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 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, 0.99973, + 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, + 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, + 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, + 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, + 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, + 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, + 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, + 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, + 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, + 0.99999, 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.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.40579, 1.40579, 1.36625, + 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, + 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, + 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, + 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const HelveticaBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; +const HelveticaBoldItalicFactors = [ + 0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, + 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, + 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, + 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, + 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, + 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, + 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, + 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, + 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, + 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, + 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, + 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, + 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, + 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, + 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, + 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, + 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, + 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, + 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, + 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, + 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, + 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, + 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, + 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, + 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, + 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, + 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, + 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, + 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, + 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, + 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, + 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, + 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, + 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, + 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, + 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, + 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, + 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, + 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, + 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, + 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, + 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, + 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, + 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, + 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, + 0.99973, 1.00066, 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.99973, 0.99977, 0.99999, 1.00058, 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, 0.99973, + 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, + 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, + 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, + 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, + 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, + 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, + 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, + 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, + 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, + 0.99999, 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.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.40579, 1.40579, 1.36625, + 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, + 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, + 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, + 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const HelveticaBoldItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2, +}; +const HelveticaItalicFactors = [ + 0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, + 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, + 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, + 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, + 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, + 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, + 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, + 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, + 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, + 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, + 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, + 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, + 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, + 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, + 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, + 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, + 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, + 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, + 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, + 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, + 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, + 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, + 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, + 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, + 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, + 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, + 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, + 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, + 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, + 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, + 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, + 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, + 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, + 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, + 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, + 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, + 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, + 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, + 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, + 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, + 1.00019, 1.00001, 1.0001, 0.99986, 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.99973, 1.00089, + 1.00005, 0.99967, 1.00048, 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.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, + 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, + 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, + 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, + 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, + 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, + 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, + 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, + 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, + 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 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.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.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, + 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, + 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, + 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const HelveticaItalicMetrics = { + lineHeight: 1.35, + lineGap: 0.2, +}; +const HelveticaRegularFactors = [ + 0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, + 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, + 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, + 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, + 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, + 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, + 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, + 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, + 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, + 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, + 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, + 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, + 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, + 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, + 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, + 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, + 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, + 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, + 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, + 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, + 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, + 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, + 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, + 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, + 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, + 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, + 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, + 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, + 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, + 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, + 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, + 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, + 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, + 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, + 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, + 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, + 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, + 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, + 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, + 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, + 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, + 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, + 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, + 1.00001, 1.00092, 0.99964, 1.00001, 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, 0.99973, 1.00043, + 0.99953, 1.0007, 0.99915, 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.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, + 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, + 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, + 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, + 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, + 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, + 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, + 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, + 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, + 0.99999, 1.00003, 0.99999, 0.99999, 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.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.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, + 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, + 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const HelveticaRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; // ./src/core/liberationsans_widths.js + +const LiberationSansBoldWidths = [ + 365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, + 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, + 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, + 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, + 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, + 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, + 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, + 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, + 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, + 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, + 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, + 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, + 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, + 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, + 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, + 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, + 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, + 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, + 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, + 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, + 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, + 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, + 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, + 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, + 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, + 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, + 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 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, 556, 618, 615, 417, 635, 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, 556, 556, 611, 417, + 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, + 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, + 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, + 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, + 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, + 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, + 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, + 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, + 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, + 333, 333, 333, 333, 333, +]; +const LiberationSansBoldMapping = [ + -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, + 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, + 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, + 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, + 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, + 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, + 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, + 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, + 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, + 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, + 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, + 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, + 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, + 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +]; +const LiberationSansBoldItalicWidths = [ + 365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, + 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, + 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, + 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, + 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, + 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, + 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, + 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, + 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, + 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, + 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, + 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, + 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, + 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, + 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, + 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, + 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, + 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, + 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, + 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, + 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, + 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, + 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, + 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, + 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, + 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, + 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 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, 556, 619, 604, 534, 618, 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, 556, 556, 611, 469, + 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, + 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, + 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, + 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, + 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, + 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, + 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, + 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, + 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, + 333, 333, 333, 333, 333, +]; +const LiberationSansBoldItalicMapping = [ + -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, + 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, + 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, + 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, + 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, + 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, + 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, + 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, + 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, + 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, + 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, + 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, + 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, + 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +]; +const LiberationSansItalicWidths = [ + 365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, + 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, + 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, + 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, + 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, + 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, + 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, + 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, + 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, + 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, + 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, + 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, + 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, + 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, + 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, + 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, + 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, + 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, + 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, + 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, + 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, + 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, + 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, + 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, + 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, + 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, + 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, + 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 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, 556, 562, 522, 493, 553, 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, 556, 556, 556, 378, + 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, + 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, + 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, + 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, + 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, + 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, + 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, + 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, + 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, + 324, 316, 328, 398, 285, +]; +const LiberationSansItalicMapping = [ + -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, + 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, + 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, + 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, + 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, + 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, + 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, + 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, + 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, + 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, + 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, + 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, + 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, + 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +]; +const LiberationSansRegularWidths = [ + 365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, + 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, + 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, + 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, + 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, + 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, + 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, + 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, + 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, + 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, + 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, + 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, + 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, + 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, + 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, + 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, + 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, + 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, + 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, + 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, + 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, + 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, + 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, + 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, + 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, + 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, + 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, + 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 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, 556, 573, 531, 365, 583, 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, 556, 556, 556, 365, + 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, + 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, + 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, + 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, + 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, + 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, + 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, + 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, + 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, + 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, + 324, 316, 328, 398, 285, +]; +const LiberationSansRegularMapping = [ + -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, + 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, + 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, + 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, + 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, + 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, + 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, + 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, + 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, + 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, + 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, + 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, + 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, + 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, + 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +]; // ./src/core/myriadpro_factors.js + +const MyriadProBoldFactors = [ + 1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, + 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, + 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, + 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, + 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, + 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, + 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, + 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, + 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, + 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, + 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, + 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, + 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, + 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, + 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, + 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, + 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, + 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, + 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, + 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, + 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, + 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, + 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, + 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, + 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, + 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, + 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, + 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, + 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, + 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, + 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, + 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, + 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, + 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, + 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, + 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, + 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, + 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, + 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, + 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, + 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, + 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, + 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, + 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, + 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, + 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, + 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.94083, 0.97579, 0.94083, 0.97579, 0.94083, + 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, + 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, + 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, + 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, + 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, + 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const MyriadProBoldMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; +const MyriadProBoldItalicFactors = [ + 1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, + 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, + 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, + 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, + 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, + 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, + 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, + 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, + 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, + 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, + 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, + 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, + 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, + 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, + 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, + 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, + 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, + 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, + 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, + 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, + 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, + 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, + 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, + 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, + 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, + 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, + 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, + 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, + 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, + 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, + 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, + 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, + 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, + 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, + 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, + 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, + 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, + 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, + 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, + 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, + 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, + 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, + 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, + 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, + 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, + 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, + 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, + 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, + 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 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.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, + 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, + 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, + 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, + 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const MyriadProBoldItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; +const MyriadProItalicFactors = [ + 1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, + 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, + 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, + 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, + 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, + 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, + 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, + 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, + 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, + 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, + 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, + 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, + 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, + 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, + 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, + 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, + 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, + 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, + 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, + 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, + 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, + 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, + 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, + 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, + 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, + 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, + 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, + 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, + 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, + 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, + 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, + 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, + 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, + 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, + 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, + 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, + 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, + 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, + 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, + 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, + 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, + 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, + 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, + 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, + 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, + 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, + 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 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.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, + 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, + 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, + 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, + 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const MyriadProItalicMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; +const MyriadProRegularFactors = [ + 1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, + 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, + 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, + 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, + 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, + 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, + 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, + 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, + 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, + 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, + 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, + 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, + 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, + 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, + 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, + 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, + 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, + 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, + 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, + 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, + 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, + 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, + 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, + 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, + 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, + 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, + 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, + 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, + 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, + 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, + 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, + 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, + 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, + 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, + 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, + 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, + 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, + 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, + 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, + 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, + 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, + 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, + 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, + 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, + 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, + 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.89633, 1.01915, + 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, + 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, + 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, + 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, + 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, + 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, +]; +const MyriadProRegularMetrics = { + lineHeight: 1.2, + lineGap: 0.2, +}; // ./src/core/segoeui_factors.js + +const SegoeuiBoldFactors = [ + 1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, + 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, + 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, + 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, + 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, + 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, + 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, + 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, + 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, + 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, + 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, + 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, + 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, + 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, + 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, + 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, + 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, + 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, + 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, + 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, + 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, + 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, + 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, + 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, + 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, + 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, + 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, + 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, + 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, + 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, + 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, + 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, + 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, + 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, + 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, + 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, + 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, + 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, + 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, + 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, + 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, + 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, + 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, + 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, + 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, + 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, + 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.97278, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, + 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, + 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, + 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, + 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, + 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, + 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, + 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, + 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, + 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, + 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const SegoeuiBoldMetrics = { + lineHeight: 1.33008, + lineGap: 0, +}; +const SegoeuiBoldItalicFactors = [ + 1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, + 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, + 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, + 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, + 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, + 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, + 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, + 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, + 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, + 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, + 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, + 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, + 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, + 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, + 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, + 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, + 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, + 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, + 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, + 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, + 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, + 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, + 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, + 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, + 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, + 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, + 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, + 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, + 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, + 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, + 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, + 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, + 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, + 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, + 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, + 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, + 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, + 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, + 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, + 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, + 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, + 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, + 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, + 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, + 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, + 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, + 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, + 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.93503, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, + 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, + 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, + 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, + 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, + 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, + 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, + 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, + 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, + 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, + 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const SegoeuiBoldItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0, +}; +const SegoeuiItalicFactors = [ + 1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, + 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, + 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, + 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, + 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, + 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, + 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, + 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, + 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, + 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, + 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, + 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, + 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, + 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, + 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, + 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, + 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, + 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, + 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, + 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, + 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, + 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, + 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, + 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, + 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, + 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, + 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, + 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, + 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, + 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, + 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, + 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, + 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, + 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, + 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, + 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, + 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, + 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, + 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, + 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, + 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, + 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, + 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, + 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, + 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, + 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, + 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, + 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, + 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, + 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, + 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, + 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, + 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, + 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, + 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, + 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, + 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, + 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, + 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const SegoeuiItalicMetrics = { + lineHeight: 1.33008, + lineGap: 0, +}; +const SegoeuiRegularFactors = [ + 1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, + 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, + 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, + 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, + 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, + 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, + 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, + 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, + 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, + 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, + 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, + 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, + 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, + 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, + 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, + 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, + 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, + 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, + 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, + 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, + 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, + 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, + 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, + 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, + 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, + 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, + 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, + 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, + 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, + 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, + 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, + 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, + 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, + 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, + 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, + 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, + 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, + 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, + 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, + 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, + 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, + 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, + 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, + 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, + 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, + 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, + 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, + 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.9403, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, + 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, + 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, + 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, + 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, + 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, + 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, + 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, + 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, + 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, + 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, + 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +]; +const SegoeuiRegularMetrics = { + lineHeight: 1.33008, + lineGap: 0, +}; // ./src/core/xfa_fonts.js + +const getXFAFontMap = getLookupTableFactory(function (t) { + t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { + name: "LiberationSans-Regular", + factors: MyriadProRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: MyriadProRegularMetrics, + }; + t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { + name: "LiberationSans-Bold", + factors: MyriadProBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: MyriadProBoldMetrics, + }; + t["MyriadPro-It"] = + t["MyriadPro-Italic"] = + t["PdfJS-Fallback-Italic"] = + { + name: "LiberationSans-Italic", + factors: MyriadProItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: MyriadProItalicMetrics, + }; + t["MyriadPro-BoldIt"] = + t["MyriadPro-BoldItalic"] = + t["PdfJS-Fallback-BoldItalic"] = + { + name: "LiberationSans-BoldItalic", + factors: MyriadProBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: MyriadProBoldItalicMetrics, + }; + t.ArialMT = + t.Arial = + t["Arial-Regular"] = + { + name: "LiberationSans-Regular", + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + }; + t["Arial-BoldMT"] = t["Arial-Bold"] = { + name: "LiberationSans-Bold", + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + }; + t["Arial-ItalicMT"] = t["Arial-Italic"] = { + name: "LiberationSans-Italic", + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + }; + t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + }; + t["Calibri-Regular"] = { + name: "LiberationSans-Regular", + factors: CalibriRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: CalibriRegularMetrics, + }; + t["Calibri-Bold"] = { + name: "LiberationSans-Bold", + factors: CalibriBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: CalibriBoldMetrics, + }; + t["Calibri-Italic"] = { + name: "LiberationSans-Italic", + factors: CalibriItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: CalibriItalicMetrics, + }; + t["Calibri-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: CalibriBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: CalibriBoldItalicMetrics, + }; + t["Segoeui-Regular"] = { + name: "LiberationSans-Regular", + factors: SegoeuiRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: SegoeuiRegularMetrics, + }; + t["Segoeui-Bold"] = { + name: "LiberationSans-Bold", + factors: SegoeuiBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: SegoeuiBoldMetrics, + }; + t["Segoeui-Italic"] = { + name: "LiberationSans-Italic", + factors: SegoeuiItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: SegoeuiItalicMetrics, + }; + t["Segoeui-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: SegoeuiBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: SegoeuiBoldItalicMetrics, + }; + t["Helvetica-Regular"] = t.Helvetica = { + name: "LiberationSans-Regular", + factors: HelveticaRegularFactors, + baseWidths: LiberationSansRegularWidths, + baseMapping: LiberationSansRegularMapping, + metrics: HelveticaRegularMetrics, + }; + t["Helvetica-Bold"] = { + name: "LiberationSans-Bold", + factors: HelveticaBoldFactors, + baseWidths: LiberationSansBoldWidths, + baseMapping: LiberationSansBoldMapping, + metrics: HelveticaBoldMetrics, + }; + t["Helvetica-Italic"] = { + name: "LiberationSans-Italic", + factors: HelveticaItalicFactors, + baseWidths: LiberationSansItalicWidths, + baseMapping: LiberationSansItalicMapping, + metrics: HelveticaItalicMetrics, + }; + t["Helvetica-BoldItalic"] = { + name: "LiberationSans-BoldItalic", + factors: HelveticaBoldItalicFactors, + baseWidths: LiberationSansBoldItalicWidths, + baseMapping: LiberationSansBoldItalicMapping, + metrics: HelveticaBoldItalicMetrics, + }; +}); +function getXfaFontName(name) { + const fontName = normalizeFontName(name); + const fontMap = getXFAFontMap(); + return fontMap[fontName]; } -const wa = [ - 1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, - 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, - 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, - 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, - 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, - 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, - 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, - 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, - 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, - 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, - 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, - 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, - 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, - 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, - 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, - 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, - 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, - 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, - 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, - 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, - 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, - 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, - 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, - 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, - 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, - 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, - 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, - 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, - 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, - 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, - 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, - 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, - 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, - 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, - 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, - 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, - 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, - 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, - 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, - 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, - 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, - 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, - 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, - 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, - 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, - 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, - 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, - 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, - 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 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.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, - 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, - 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, - 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, - 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, - 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, - 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, - 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, - 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, - 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, - 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - Da = { lineHeight: 1.2207, lineGap: 0.2207 }, - ba = [ - 1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, - 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, - 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, - 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, - 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, - 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, - 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, - 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, - 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, - 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, - 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, - 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, - 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, - 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, - 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, - 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, - 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, - 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, - 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, - 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, - 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, - 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, - 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, - 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, - 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, - 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, - 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, - 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, - 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, - 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, - 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, - 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, - 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, - 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, - 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, - 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, - 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, - 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, - 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, - 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, - 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, - 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, - 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, - 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, - 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, - 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, - 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, - 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, - 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, - 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 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.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, - 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, - 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, - 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, - 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, - 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, - 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, - 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, - 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, - 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, - 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - Fa = { lineHeight: 1.2207, lineGap: 0.2207 }, - Sa = [ - 1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, - 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, - 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, - 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, - 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, - 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, - 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, - 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, - 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, - 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, - 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, - 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, - 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, - 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, - 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, - 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, - 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, - 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, - 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, - 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, - 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, - 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, - 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, - 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, - 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, - 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, - 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, - 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, - 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, - 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, - 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, - 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, - 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, - 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, - 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, - 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, - 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, - 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, - 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, - 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, - 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, - 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, - 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, - 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, - 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, - 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, - 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, - 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, - 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.85865, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, - 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, - 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, - 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, - 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, - 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, - 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, - 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, - 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, - 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, - 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - ka = { lineHeight: 1.2207, lineGap: 0.2207 }, - Ra = [ - 1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, - 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, - 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, - 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, - 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, - 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, - 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, - 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, - 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, - 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, - 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, - 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, - 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, - 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, - 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, - 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, - 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, - 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, - 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, - 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, - 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, - 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, - 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, - 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, - 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, - 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, - 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, - 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, - 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, - 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, - 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, - 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, - 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, - 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, - 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, - 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, - 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, - 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, - 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, - 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, - 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, - 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, - 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, - 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, - 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, - 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, - 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, - 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, - 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, - 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, - 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, - 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, - 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, - 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, - 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, - 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, - 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, - 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, - 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 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.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, - 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - Na = { lineHeight: 1.2207, lineGap: 0.2207 }, - Ga = [ - 0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, - 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, - 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, - 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, - 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, - 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, - 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, - 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, - 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, - 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, - 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, - 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, - 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, - 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, - 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, - 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, - 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, - 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, - 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, - 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, - 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, - 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, - 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, - 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, - 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, - 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, - 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, - 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, - 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, - 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, - 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, - 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, - 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, - 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, - 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, - 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, - 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, - 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, - 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, - 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, - 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, - 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, - 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, - 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, - 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, - 0.99926, 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, - 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 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, 0.99973, 0.99973, 1.00026, - 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, - 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, - 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, - 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, - 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, - 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, - 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, - 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, - 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, - 1.00003, 0.99999, 0.99999, 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.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.40579, - 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, - 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, - 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, - 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - xa = { lineHeight: 1.2, lineGap: 0.2 }, - Ua = [ - 0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, - 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, - 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, - 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, - 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, - 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, - 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, - 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, - 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, - 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, - 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, - 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, - 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, - 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, - 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, - 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, - 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, - 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, - 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, - 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, - 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, - 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, - 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, - 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, - 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, - 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, - 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, - 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, - 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, - 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, - 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, - 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, - 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, - 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, - 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, - 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, - 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, - 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, - 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, - 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, - 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, - 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, - 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, - 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, - 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, - 1.00066, 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.99973, - 0.99977, 0.99999, 1.00058, 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, 0.99973, 0.99973, - 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, - 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, - 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, - 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, - 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, - 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, - 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, - 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, - 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, - 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 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.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.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, - 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, - 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, - 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - ], - Ma = { lineHeight: 1.35, lineGap: 0.2 }, - La = [ - 0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, - 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, - 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, - 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, - 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, - 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, - 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, - 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, - 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, - 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, - 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, - 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, - 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, - 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, - 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, - 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, - 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, - 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, - 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, - 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, - 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, - 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, - 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, - 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, - 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, - 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, - 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, - 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, - 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, - 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, - 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, - 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, - 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, - 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, - 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, - 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, - 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, - 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, - 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, - 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, - 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, - 1.00019, 1.00001, 1.0001, 0.99986, 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.99973, - 1.00089, 1.00005, 0.99967, 1.00048, 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.99973, 0.99973, 0.99973, - 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, - 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, - 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, - 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, - 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, - 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, - 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, - 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, - 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, - 0.99999, 1.00003, 0.99999, 0.99999, 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.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.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, - 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, - 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, - 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, - ], - Ha = { lineHeight: 1.35, lineGap: 0.2 }, - Ja = [ - 0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, - 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, - 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, - 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, - 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, - 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, - 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, - 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, - 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, - 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, - 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, - 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, - 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, - 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, - 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, - 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, - 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, - 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, - 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, - 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, - 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, - 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, - 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, - 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, - 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, - 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, - 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, - 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, - 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, - 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, - 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, - 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, - 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, - 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, - 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, - 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, - 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, - 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, - 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, - 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, - 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, - 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, - 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, - 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, - 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, - 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, - 1.00001, 1.00092, 0.99964, 1.00001, 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, 0.99973, 1.00043, - 0.99953, 1.0007, 0.99915, 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.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, - 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, - 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, - 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, - 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, - 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, - 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, - 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, - 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, - 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, - 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.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.40579, 1.40579, 1.36625, 0.99999, 1, - 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, - 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, - 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, - ], - Ya = { lineHeight: 1.2, lineGap: 0.2 }, - va = [ - 365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, - 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, - 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, - 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, - 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, - 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, - 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, - 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, - 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1e3, - 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, - 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, - 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, - 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, - 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, - 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, - 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, - 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, - 778, 611, 778, 611, 1e3, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, - 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, - 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, - 611, 500, 611, 500, 278, 556, 722, 556, 1e3, 889, 778, 611, 667, 556, 611, - 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, - 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, - 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, - 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, - 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, - 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, - 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 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, 556, 618, 615, 417, - 635, 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, 556, 556, - 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, - 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1e3, - 1e3, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1e3, 1e3, 240, - 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1e3, - 768, 600, 834, 834, 834, 834, 1e3, 500, 1e3, 500, 1e3, 500, 500, 494, 612, - 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, - 604, 604, 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 708, 729, 604, 604, 354, 354, 1e3, 990, 990, 990, 990, 494, - 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, - 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, - 333, 333, 333, 333, 333, 333, 333, - ], - Ka = [ - -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, - 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, - 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, - 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, - 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, - 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, - 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, - 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, - 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, - 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, - 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, - 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, - 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, - 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, - 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, - 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, - 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, - 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, - ], - Ta = [ - 365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, - 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, - 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, - 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, - 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, - 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, - 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, - 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, - 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1e3, - 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, - 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, - 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, - 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, - 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, - 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, - 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, - 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, - 778, 611, 778, 611, 1e3, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, - 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, - 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, - 611, 500, 611, 500, 278, 556, 722, 556, 1e3, 889, 778, 611, 667, 556, 611, - 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, - 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, - 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, - 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, - 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, - 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, - 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, - 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, - 729, 708, 979, 989, 854, 1e3, 708, 719, 1042, 729, 556, 619, 604, 534, 618, - 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, 556, 556, 611, - 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, - 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1e3, 1e3, - 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1e3, 1e3, 240, 479, - 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1e3, 768, - 600, 834, 834, 834, 834, 999, 500, 1e3, 500, 1e3, 500, 500, 494, 612, 823, - 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, - 604, 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 729, 604, 604, 354, 354, 1e3, 990, 990, 990, 990, 494, 604, - 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, - 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, - 333, 333, 333, 333, 333, 333, - ], - qa = [ - -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, - 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, - 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, - 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, - 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, - 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, - 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, - 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, - 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, - 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, - 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, - 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, - 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, - 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, - 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, - 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, - 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, - 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, - ], - Oa = [ - 365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, - 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, - 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, - 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, - 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, - 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, - 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, - 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, - 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1e3, - 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, - 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, - 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, - 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, - 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, - 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, - 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, - 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, - 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, - 778, 556, 778, 556, 1e3, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, - 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, - 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, - 611, 500, 611, 500, 222, 556, 667, 556, 1e3, 889, 778, 611, 667, 500, 611, - 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, - 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, - 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, - 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, - 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, - 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, - 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 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, 556, 562, 522, 493, 553, - 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, 556, 556, 556, - 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, - 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1e3, 1e3, - 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1e3, 1e3, 188, 354, - 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1e3, 768, - 600, 834, 834, 834, 834, 1e3, 500, 998, 500, 1e3, 500, 500, 494, 612, 823, - 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, - 604, 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 729, 604, 604, 354, 354, 1e3, 990, 990, 990, 990, 494, 604, - 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, - 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, - 324, 324, 316, 328, 398, 285, - ], - Pa = [ - -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, - 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, - 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, - 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, - 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, - 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, - 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, - 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, - 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, - 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, - 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, - 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, - 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, - 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, - 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, - 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, - 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, - 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, - ], - Wa = [ - 365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, - 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, - 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, - 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, - 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, - 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, - 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, - 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, - 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1e3, - 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, - 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, - 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, - 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, - 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, - 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, - 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, - 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, - 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, - 778, 556, 778, 556, 1e3, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, - 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, - 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, - 611, 500, 611, 500, 222, 556, 667, 556, 1e3, 889, 778, 611, 667, 500, 611, - 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, - 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, - 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, - 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, - 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, - 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, - 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 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, 556, 573, 531, 365, 583, - 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, 556, 556, 556, - 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, - 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1e3, 1e3, - 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1e3, 1e3, 188, 354, - 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1e3, 768, - 600, 834, 834, 834, 834, 1e3, 500, 1e3, 500, 1e3, 500, 500, 494, 612, 823, - 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, - 604, 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, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 729, 604, 604, 354, 354, 1e3, 990, 990, 990, 990, 494, 604, - 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, - 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, - 324, 324, 316, 328, 398, 285, - ], - ja = [ - -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, - 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, - 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, - 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, - 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, - 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, - 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, - 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, - 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, - 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, - 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, - 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, - 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, - 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, - 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, - 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, - 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, - 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, - 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, - ], - Xa = [ - 1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, - 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, - 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, - 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, - 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, - 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, - 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, - 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, - 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, - 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, - 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, - 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, - 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, - 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, - 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, - 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, - 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, - 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, - 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, - 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, - 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, - 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, - 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, - 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, - 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, - 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, - 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, - 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, - 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, - 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, - 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, - 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, - 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, - 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, - 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, - 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, - 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, - 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, - 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, - 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, - 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, - 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, - 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, - 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, - 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, - 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, - 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, - 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.94083, - 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, - 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, - 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, - 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, - 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - Za = { lineHeight: 1.2, lineGap: 0.2 }, - Va = [ - 1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, - 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, - 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, - 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, - 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, - 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, - 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, - 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, - 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, - 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, - 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, - 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, - 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, - 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, - 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, - 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, - 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, - 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, - 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, - 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, - 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, - 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, - 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, - 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, - 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, - 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, - 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, - 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, - 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, - 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, - 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, - 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, - 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, - 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, - 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, - 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, - 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, - 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, - 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, - 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, - 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, - 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, - 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, - 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, - 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, - 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, - 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, - 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, - 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.9154, 0.94236, - 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, - 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, - 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, - 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, - 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - za = { lineHeight: 1.2, lineGap: 0.2 }, - _a = [ - 1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, - 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, - 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, - 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, - 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, - 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, - 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, - 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, - 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, - 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, - 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, - 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, - 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, - 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, - 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, - 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, - 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, - 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, - 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, - 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, - 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, - 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, - 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, - 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, - 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, - 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, - 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, - 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, - 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, - 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, - 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, - 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, - 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, - 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, - 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, - 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, - 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, - 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, - 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, - 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, - 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, - 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, - 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, - 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, - 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, - 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, - 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, - 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 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.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, - 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, - 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, - 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, - 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - $a = { lineHeight: 1.2, lineGap: 0.2 }, - As = [ - 1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, - 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, - 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, - 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, - 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, - 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, - 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, - 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, - 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, - 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, - 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, - 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, - 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, - 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, - 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, - 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, - 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, - 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, - 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, - 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, - 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, - 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, - 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, - 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, - 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, - 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, - 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, - 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, - 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, - 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, - 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, - 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, - 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, - 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, - 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, - 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, - 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, - 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, - 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, - 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, - 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, - 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, - 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, - 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, - 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, - 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, - 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, - 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 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.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, - 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, - 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, - 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, - 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - es = { lineHeight: 1.2, lineGap: 0.2 }, - ts = [ - 1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, - 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, - 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, - 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, - 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, - 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, - 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, - 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, - 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, - 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, - 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, - 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, - 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, - 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, - 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, - 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, - 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, - 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, - 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, - 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, - 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, - 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, - 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, - 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, - 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, - 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, - 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, - 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, - 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, - 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, - 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, - 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, - 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, - 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, - 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, - 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, - 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, - 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, - 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, - 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, - 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, - 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, - 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, - 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, - 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, - 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, - 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, - 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, - 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 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.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, - 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, - 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, - 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, - 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, - 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, - 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, - 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, - 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, - 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, - 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, - 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, - ], - is = { lineHeight: 1.33008, lineGap: 0 }, - as = [ - 1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, - 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, - 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, - 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, - 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, - 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, - 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, - 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, - 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, - 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, - 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, - 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, - 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, - 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, - 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, - 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, - 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, - 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, - 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, - 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, - 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, - 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, - 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, - 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, - 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, - 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, - 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, - 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, - 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, - 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, - 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, - 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, - 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, - 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, - 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, - 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, - 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, - 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, - 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, - 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, - 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, - 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, - 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, - 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, - 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, - 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, - 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, - 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, - 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 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.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, - 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, - 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, - 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, - 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, - 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, - 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, - 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, - 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, - 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, - 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, - 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, - ], - ss = { lineHeight: 1.33008, lineGap: 0 }, - rs = [ - 1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, - 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, - 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, - 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, - 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, - 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, - 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, - 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, - 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, - 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, - 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, - 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, - 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, - 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, - 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, - 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, - 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, - 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, - 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, - 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, - 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, - 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, - 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, - 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, - 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, - 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, - 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, - 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, - 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, - 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, - 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, - 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, - 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, - 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, - 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, - 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, - 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, - 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, - 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, - 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, - 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, - 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, - 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, - 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, - 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, - 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, - 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, - 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, - 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, - 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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.87533, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, - 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, - 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, - 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, - 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, - 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, - 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, - 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, - 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, - 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, - 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - ns = { lineHeight: 1.33008, lineGap: 0 }, - gs = [ - 1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, - 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, - 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, - 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, - 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, - 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, - 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, - 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, - 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, - 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, - 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, - 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, - 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, - 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, - 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, - 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, - 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, - 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, - 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, - 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, - 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, - 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, - 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, - 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, - 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, - 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, - 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, - 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, - 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, - 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, - 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, - 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, - 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, - 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, - 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, - 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, - 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, - 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, - 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, - 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, - 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, - 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, - 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, - 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, - 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, - 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, - 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, - 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, - 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 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.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, - 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, - 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, - 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, - 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, - 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, - 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, - 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, - 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, - 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, - 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, - 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ], - os = { lineHeight: 1.33008, lineGap: 0 }, - Is = getLookupTableFactory(function (e) { - e["MyriadPro-Regular"] = e["PdfJS-Fallback-Regular"] = { - name: "LiberationSans-Regular", - factors: As, - baseWidths: Wa, - baseMapping: ja, - metrics: es, - }; - e["MyriadPro-Bold"] = e["PdfJS-Fallback-Bold"] = { - name: "LiberationSans-Bold", - factors: Xa, - baseWidths: va, - baseMapping: Ka, - metrics: Za, - }; - e["MyriadPro-It"] = - e["MyriadPro-Italic"] = - e["PdfJS-Fallback-Italic"] = - { - name: "LiberationSans-Italic", - factors: _a, - baseWidths: Oa, - baseMapping: Pa, - metrics: $a, - }; - e["MyriadPro-BoldIt"] = - e["MyriadPro-BoldItalic"] = - e["PdfJS-Fallback-BoldItalic"] = - { - name: "LiberationSans-BoldItalic", - factors: Va, - baseWidths: Ta, - baseMapping: qa, - metrics: za, - }; - e.ArialMT = - e.Arial = - e["Arial-Regular"] = - { name: "LiberationSans-Regular", baseWidths: Wa, baseMapping: ja }; - e["Arial-BoldMT"] = e["Arial-Bold"] = { - name: "LiberationSans-Bold", - baseWidths: va, - baseMapping: Ka, - }; - e["Arial-ItalicMT"] = e["Arial-Italic"] = { - name: "LiberationSans-Italic", - baseWidths: Oa, - baseMapping: Pa, - }; - e["Arial-BoldItalicMT"] = e["Arial-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - baseWidths: Ta, - baseMapping: qa, - }; - e["Calibri-Regular"] = { - name: "LiberationSans-Regular", - factors: Ra, - baseWidths: Wa, - baseMapping: ja, - metrics: Na, - }; - e["Calibri-Bold"] = { - name: "LiberationSans-Bold", - factors: wa, - baseWidths: va, - baseMapping: Ka, - metrics: Da, - }; - e["Calibri-Italic"] = { - name: "LiberationSans-Italic", - factors: Sa, - baseWidths: Oa, - baseMapping: Pa, - metrics: ka, - }; - e["Calibri-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: ba, - baseWidths: Ta, - baseMapping: qa, - metrics: Fa, - }; - e["Segoeui-Regular"] = { - name: "LiberationSans-Regular", - factors: gs, - baseWidths: Wa, - baseMapping: ja, - metrics: os, - }; - e["Segoeui-Bold"] = { - name: "LiberationSans-Bold", - factors: ts, - baseWidths: va, - baseMapping: Ka, - metrics: is, - }; - e["Segoeui-Italic"] = { - name: "LiberationSans-Italic", - factors: rs, - baseWidths: Oa, - baseMapping: Pa, - metrics: ns, - }; - e["Segoeui-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: as, - baseWidths: Ta, - baseMapping: qa, - metrics: ss, - }; - e["Helvetica-Regular"] = e.Helvetica = { - name: "LiberationSans-Regular", - factors: Ja, - baseWidths: Wa, - baseMapping: ja, - metrics: Ya, - }; - e["Helvetica-Bold"] = { - name: "LiberationSans-Bold", - factors: Ga, - baseWidths: va, - baseMapping: Ka, - metrics: xa, - }; - e["Helvetica-Italic"] = { - name: "LiberationSans-Italic", - factors: La, - baseWidths: Oa, - baseMapping: Pa, - metrics: Ha, - }; - e["Helvetica-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: Ua, - baseWidths: Ta, - baseMapping: qa, - metrics: Ma, - }; - }); -function getXfaFontName(e) { - const t = normalizeFontName(e); - return Is()[t]; -} -function getXfaFontDict(e) { - const t = (function getXfaFontWidths(e) { - const t = getXfaFontName(e); - if (!t) return null; - const { baseWidths: i, baseMapping: a, factors: s } = t, - r = s ? i.map((e, t) => e * s[t]) : i; - let n, - g = -2; - const o = []; - for (const [e, t] of a.map((e, t) => [e, t]).sort(([e], [t]) => e - t)) - if (-1 !== e) - if (e === g + 1) { - n.push(r[t]); - g += 1; - } else { - g = e; - n = [r[t]]; - o.push(e, n); - } - return o; - })(e), - i = new Dict(null); - i.set("BaseFont", Name.get(e)); - i.set("Type", Name.get("Font")); - i.set("Subtype", Name.get("CIDFontType2")); - i.set("Encoding", Name.get("Identity-H")); - i.set("CIDToGIDMap", Name.get("Identity")); - i.set("W", t); - i.set("FirstChar", t[0]); - i.set("LastChar", t.at(-2) + t.at(-1).length - 1); - const a = new Dict(null); - i.set("FontDescriptor", a); - const s = new Dict(null); - s.set("Ordering", "Identity"); - s.set("Registry", "Adobe"); - s.set("Supplement", 0); - i.set("CIDSystemInfo", s); - return i; +function getXfaFontWidths(name) { + const info = getXfaFontName(name); + if (!info) { + return null; + } + const { baseWidths, baseMapping, factors } = info; + const rescaledBaseWidths = !factors + ? baseWidths + : baseWidths.map((w, i) => w * factors[i]); + let currentCode = -2; + let currentArray; + const newWidths = []; + for (const [unicode, glyphIndex] of baseMapping + .map((charUnicode, index) => [charUnicode, index]) + .sort(([unicode1], [unicode2]) => unicode1 - unicode2)) { + if (unicode === -1) { + continue; + } + if (unicode === currentCode + 1) { + currentArray.push(rescaledBaseWidths[glyphIndex]); + currentCode += 1; + } else { + currentCode = unicode; + currentArray = [rescaledBaseWidths[glyphIndex]]; + newWidths.push(unicode, currentArray); + } + } + return newWidths; } +function getXfaFontDict(name) { + const widths = getXfaFontWidths(name); + const dict = new Dict(null); + dict.set("BaseFont", Name.get(name)); + dict.set("Type", Name.get("Font")); + dict.set("Subtype", Name.get("CIDFontType2")); + dict.set("Encoding", Name.get("Identity-H")); + dict.set("CIDToGIDMap", Name.get("Identity")); + dict.set("W", widths); + dict.set("FirstChar", widths[0]); + dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); + const descriptor = new Dict(null); + dict.set("FontDescriptor", descriptor); + const systemInfo = new Dict(null); + systemInfo.set("Ordering", "Identity"); + systemInfo.set("Registry", "Adobe"); + systemInfo.set("Supplement", 0); + dict.set("CIDSystemInfo", systemInfo); + return dict; +} // ./src/core/ps_parser.js + class PostScriptParser { - constructor(e) { - this.lexer = e; + constructor(lexer) { + this.lexer = lexer; this.operators = []; this.token = null; this.prev = null; @@ -29954,89 +34935,119 @@ class PostScriptParser { this.prev = this.token; this.token = this.lexer.getToken(); } - accept(e) { - if (this.token.type === e) { + accept(type) { + if (this.token.type === type) { this.nextToken(); - return !0; + return true; } - return !1; + return false; } - expect(e) { - if (this.accept(e)) return !0; + expect(type) { + if (this.accept(type)) { + return true; + } throw new FormatError( - `Unexpected symbol: found ${this.token.type} expected ${e}.`, + `Unexpected symbol: found ${this.token.type} expected ${type}.`, ); } parse() { this.nextToken(); - this.expect(cs.LBRACE); + this.expect(PostScriptTokenTypes.LBRACE); this.parseBlock(); - this.expect(cs.RBRACE); + this.expect(PostScriptTokenTypes.RBRACE); return this.operators; } parseBlock() { - for (;;) - if (this.accept(cs.NUMBER)) this.operators.push(this.prev.value); - else if (this.accept(cs.OPERATOR)) this.operators.push(this.prev.value); - else { - if (!this.accept(cs.LBRACE)) return; + 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(); - } - } - parseCondition() { - const e = this.operators.length; - this.operators.push(null, null); - this.parseBlock(); - this.expect(cs.RBRACE); - if (this.accept(cs.IF)) { - this.operators[e] = this.operators.length; - this.operators[e + 1] = "jz"; - } else { - if (!this.accept(cs.LBRACE)) - throw new FormatError("PS Function: error parsing conditional."); - { - const t = this.operators.length; - this.operators.push(null, null); - const i = this.operators.length; - this.parseBlock(); - this.expect(cs.RBRACE); - this.expect(cs.IFELSE); - this.operators[t] = this.operators.length; - this.operators[t + 1] = "j"; - this.operators[e] = i; - this.operators[e + 1] = "jz"; + } 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 FormatError("PS Function: error parsing conditional."); + } + } } -const cs = { LBRACE: 0, RBRACE: 1, NUMBER: 2, OPERATOR: 3, IF: 4, IFELSE: 5 }; +const PostScriptTokenTypes = { + LBRACE: 0, + RBRACE: 1, + NUMBER: 2, + OPERATOR: 3, + IF: 4, + IFELSE: 5, +}; class PostScriptToken { static get opCache() { return shadow(this, "opCache", Object.create(null)); } - constructor(e, t) { - this.type = e; - this.value = t; + constructor(type, value) { + this.type = type; + this.value = value; } - static getOperator(e) { - return (PostScriptToken.opCache[e] ||= new PostScriptToken(cs.OPERATOR, e)); + static getOperator(op) { + return (PostScriptToken.opCache[op] ||= new PostScriptToken( + PostScriptTokenTypes.OPERATOR, + op, + )); } static get LBRACE() { - return shadow(this, "LBRACE", new PostScriptToken(cs.LBRACE, "{")); + return shadow( + this, + "LBRACE", + new PostScriptToken(PostScriptTokenTypes.LBRACE, "{"), + ); } static get RBRACE() { - return shadow(this, "RBRACE", new PostScriptToken(cs.RBRACE, "}")); + return shadow( + this, + "RBRACE", + new PostScriptToken(PostScriptTokenTypes.RBRACE, "}"), + ); } static get IF() { - return shadow(this, "IF", new PostScriptToken(cs.IF, "IF")); + return shadow( + this, + "IF", + new PostScriptToken(PostScriptTokenTypes.IF, "IF"), + ); } static get IFELSE() { - return shadow(this, "IFELSE", new PostScriptToken(cs.IFELSE, "IFELSE")); + return shadow( + this, + "IFELSE", + new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE"), + ); } } class PostScriptLexer { - constructor(e) { - this.stream = e; + constructor(stream) { + this.stream = stream; this.nextChar(); this.strBuf = []; } @@ -30044,1962 +35055,2443 @@ class PostScriptLexer { return (this.currentChar = this.stream.getByte()); } getToken() { - let e = !1, - t = this.currentChar; - for (;;) { - if (t < 0) return pt; - if (e) (10 !== t && 13 !== t) || (e = !1); - else if (37 === t) e = !0; - else if (!isWhiteSpace(t)) break; - t = this.nextChar(); + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isWhiteSpace(ch)) { + break; + } + ch = this.nextChar(); } - switch (0 | t) { - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - case 43: - case 45: - case 46: - return new PostScriptToken(cs.NUMBER, this.getNumber()); - case 123: + 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 125: + case 0x7d: this.nextChar(); return PostScriptToken.RBRACE; } - const i = this.strBuf; - i.length = 0; - i[0] = String.fromCharCode(t); - for ( - ; - (t = this.nextChar()) >= 0 && - ((t >= 65 && t <= 90) || (t >= 97 && t <= 122)); - - ) - i.push(String.fromCharCode(t)); - const a = i.join(""); - switch (a.toLowerCase()) { + 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(a); + return PostScriptToken.getOperator(str); } } getNumber() { - let e = this.currentChar; - const t = this.strBuf; - t.length = 0; - t[0] = String.fromCharCode(e); - for ( - ; - (e = this.nextChar()) >= 0 && - ((e >= 48 && e <= 57) || 45 === e || 46 === e); - - ) - t.push(String.fromCharCode(e)); - const i = parseFloat(t.join("")); - if (isNaN(i)) throw new FormatError(`Invalid floating point number: ${i}`); - return i; + 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 FormatError(`Invalid floating point number: ${value}`); + } + return value; } -} +} // ./src/core/image_utils.js + class BaseLocalCache { - constructor(e) { - this.constructor === BaseLocalCache && - unreachable("Cannot initialize BaseLocalCache."); - this._onlyRefs = !0 === e?.onlyRefs; + constructor(options) { + this._onlyRefs = options?.onlyRefs === true; if (!this._onlyRefs) { this._nameRefMap = new Map(); this._imageMap = new Map(); } this._imageCache = new RefSetCache(); } - getByName(e) { - this._onlyRefs && unreachable("Should not call `getByName` method."); - const t = this._nameRefMap.get(e); - return t ? this.getByRef(t) : this._imageMap.get(e) || null; + getByName(name) { + if (this._onlyRefs) { + unreachable("Should not call `getByName` method."); + } + const ref = this._nameRefMap.get(name); + if (ref) { + return this.getByRef(ref); + } + return this._imageMap.get(name) || null; } - getByRef(e) { - return this._imageCache.get(e) || null; + getByRef(ref) { + return this._imageCache.get(ref) || null; } - set(e, t, i) { + set(name, ref, data) { unreachable("Abstract method `set` called."); } } class LocalImageCache extends BaseLocalCache { - set(e, t = null, i) { - if ("string" != typeof e) + set(name, ref = null, data) { + if (typeof name !== "string") { throw new Error('LocalImageCache.set - expected "name" argument.'); - if (t) { - if (this._imageCache.has(t)) return; - this._nameRefMap.set(e, t); - this._imageCache.put(t, i); - } else this._imageMap.has(e) || this._imageMap.set(e, i); + } + 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); } } class LocalColorSpaceCache extends BaseLocalCache { - set(e = null, t = null, i) { - if ("string" != typeof e && !t) + set(name = null, ref = null, data) { + if (typeof name !== "string" && !ref) { throw new Error( 'LocalColorSpaceCache.set - expected "name" and/or "ref" argument.', ); - if (t) { - if (this._imageCache.has(t)) return; - null !== e && this._nameRefMap.set(e, t); - this._imageCache.put(t, i); - } else this._imageMap.has(e) || this._imageMap.set(e, i); + } + 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); } } class LocalFunctionCache extends BaseLocalCache { - constructor(e) { - super({ onlyRefs: !0 }); + constructor(options) { + super({ + onlyRefs: true, + }); } - set(e = null, t, i) { - if (!t) + set(name = null, ref, data) { + if (!ref) { throw new Error('LocalFunctionCache.set - expected "ref" argument.'); - this._imageCache.has(t) || this._imageCache.put(t, i); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); } } class LocalGStateCache extends BaseLocalCache { - set(e, t = null, i) { - if ("string" != typeof e) + set(name, ref = null, data) { + if (typeof name !== "string") { throw new Error('LocalGStateCache.set - expected "name" argument.'); - if (t) { - if (this._imageCache.has(t)) return; - this._nameRefMap.set(e, t); - this._imageCache.put(t, i); - } else this._imageMap.has(e) || this._imageMap.set(e, i); + } + 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); } } class LocalTilingPatternCache extends BaseLocalCache { - constructor(e) { - super({ onlyRefs: !0 }); + constructor(options) { + super({ + onlyRefs: true, + }); } - set(e = null, t, i) { - if (!t) + set(name = null, ref, data) { + if (!ref) { throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); - this._imageCache.has(t) || this._imageCache.put(t, i); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); } } class RegionalImageCache extends BaseLocalCache { - constructor(e) { - super({ onlyRefs: !0 }); + constructor(options) { + super({ + onlyRefs: true, + }); } - set(e = null, t, i) { - if (!t) + set(name = null, ref, data) { + if (!ref) { throw new Error('RegionalImageCache.set - expected "ref" argument.'); - this._imageCache.has(t) || this._imageCache.put(t, i); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); } } class GlobalImageCache { static NUM_PAGES_THRESHOLD = 2; static MIN_IMAGES_TO_CACHE = 10; - static MAX_BYTE_SIZE = 5e7; - #D = new RefSet(); + static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE; + #decodeFailedSet = new RefSet(); constructor() { this._refCache = new RefSetCache(); this._imageCache = new RefSetCache(); } - get #b() { - let e = 0; - for (const t of this._imageCache) e += t.byteSize; - return e; - } - get #F() { - return ( - !(this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) && - !(this.#b < GlobalImageCache.MAX_BYTE_SIZE) - ); - } - shouldCache(e, t) { - let i = this._refCache.get(e); - if (!i) { - i = new Set(); - this._refCache.put(e, i); + get #byteSize() { + let byteSize = 0; + for (const imageData of this._imageCache) { + byteSize += imageData.byteSize; } - i.add(t); - return ( - !(i.size < GlobalImageCache.NUM_PAGES_THRESHOLD) && - !(!this._imageCache.has(e) && this.#F) - ); + return byteSize; } - addDecodeFailed(e) { - this.#D.put(e); + get #cacheLimitReached() { + if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { + return false; + } + if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { + return false; + } + return true; } - hasDecodeFailed(e) { - return this.#D.has(e); + shouldCache(ref, pageIndex) { + let pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + pageIndexSet = new Set(); + this._refCache.put(ref, pageIndexSet); + } + pageIndexSet.add(pageIndex); + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return false; + } + if (!this._imageCache.has(ref) && this.#cacheLimitReached) { + return false; + } + return true; } - addByteSize(e, t) { - const i = this._imageCache.get(e); - i && (i.byteSize || (i.byteSize = t)); + addDecodeFailed(ref) { + this.#decodeFailedSet.put(ref); } - getData(e, t) { - const i = this._refCache.get(e); - if (!i) return null; - if (i.size < GlobalImageCache.NUM_PAGES_THRESHOLD) return null; - const a = this._imageCache.get(e); - if (!a) return null; - i.add(t); - return a; + hasDecodeFailed(ref) { + return this.#decodeFailedSet.has(ref); } - setData(e, t) { - if (!this._refCache.has(e)) + addByteSize(ref, byteSize) { + const imageData = this._imageCache.get(ref); + if (!imageData) { + return; + } + if (imageData.byteSize) { + return; + } + imageData.byteSize = byteSize; + } + getData(ref, pageIndex) { + const pageIndexSet = this._refCache.get(ref); + if (!pageIndexSet) { + return null; + } + if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { + return null; + } + const imageData = this._imageCache.get(ref); + if (!imageData) { + return null; + } + pageIndexSet.add(pageIndex); + return imageData; + } + setData(ref, data) { + if (!this._refCache.has(ref)) { throw new Error( 'GlobalImageCache.setData - expected "shouldCache" to have been called.', ); - this._imageCache.has(e) || - (this.#F - ? warn("GlobalImageCache.setData - cache limit reached.") - : this._imageCache.put(e, t)); + } + if (this._imageCache.has(ref)) { + return; + } + if (this.#cacheLimitReached) { + warn("GlobalImageCache.setData - cache limit reached."); + return; + } + this._imageCache.put(ref, data); } - clear(e = !1) { - if (!e) { - this.#D.clear(); + clear(onlyData = false) { + if (!onlyData) { + this.#decodeFailedSet.clear(); this._refCache.clear(); } this._imageCache.clear(); } -} +} // ./src/core/function.js + class PDFFunctionFactory { - constructor({ xref: e, isEvalSupported: t = !0 }) { - this.xref = e; - this.isEvalSupported = !1 !== t; + constructor({ xref, isEvalSupported = true }) { + this.xref = xref; + this.isEvalSupported = isEvalSupported !== false; } - create(e) { - const t = this.getCached(e); - if (t) return t; - const i = PDFFunction.parse({ + create(fn) { + const cachedFunction = this.getCached(fn); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parse({ xref: this.xref, isEvalSupported: this.isEvalSupported, - fn: e instanceof Ref ? this.xref.fetch(e) : e, + fn: fn instanceof Ref ? this.xref.fetch(fn) : fn, }); - this._cache(e, i); - return i; + this._cache(fn, parsedFunction); + return parsedFunction; } - createFromArray(e) { - const t = this.getCached(e); - if (t) return t; - const i = PDFFunction.parseArray({ + createFromArray(fnObj) { + const cachedFunction = this.getCached(fnObj); + if (cachedFunction) { + return cachedFunction; + } + const parsedFunction = PDFFunction.parseArray({ xref: this.xref, isEvalSupported: this.isEvalSupported, - fnObj: e instanceof Ref ? this.xref.fetch(e) : e, + fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj, }); - this._cache(e, i); - return i; + this._cache(fnObj, parsedFunction); + return parsedFunction; } - getCached(e) { - let t; - e instanceof Ref - ? (t = e) - : e instanceof Dict - ? (t = e.objId) - : e instanceof BaseStream && (t = e.dict?.objId); - if (t) { - const e = this._localFunctionCache.getByRef(t); - if (e) return e; + getCached(cacheKey) { + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + const localFunction = this._localFunctionCache.getByRef(fnRef); + if (localFunction) { + return localFunction; + } } return null; } - _cache(e, t) { - if (!t) + _cache(cacheKey, parsedFunction) { + if (!parsedFunction) { throw new Error( 'PDFFunctionFactory._cache - expected "parsedFunction" argument.', ); - let i; - e instanceof Ref - ? (i = e) - : e instanceof Dict - ? (i = e.objId) - : e instanceof BaseStream && (i = e.dict?.objId); - i && this._localFunctionCache.set(null, i, t); + } + let fnRef; + if (cacheKey instanceof Ref) { + fnRef = cacheKey; + } else if (cacheKey instanceof Dict) { + fnRef = cacheKey.objId; + } else if (cacheKey instanceof BaseStream) { + fnRef = cacheKey.dict?.objId; + } + if (fnRef) { + this._localFunctionCache.set(null, fnRef, parsedFunction); + } } get _localFunctionCache() { return shadow(this, "_localFunctionCache", new LocalFunctionCache()); } } -function toNumberArray(e) { - return Array.isArray(e) - ? isNumberArray(e, null) - ? e - : e.map((e) => +e) - : null; +function toNumberArray(arr) { + if (!Array.isArray(arr)) { + return null; + } + if (!isNumberArray(arr, null)) { + return arr.map((x) => +x); + } + return arr; } class PDFFunction { - static getSampleArray(e, t, i, a) { - let s, - r, - n = 1; - for (s = 0, r = e.length; s < r; s++) n *= e[s]; - n *= t; - const g = new Array(n); - let o = 0, - c = 0; - const C = 1 / (2 ** i - 1), - h = a.getBytes((n * i + 7) / 8); - let l = 0; - for (s = 0; s < n; s++) { - for (; o < i; ) { - c <<= 8; - c |= h[l++]; - o += 8; - } - o -= i; - g[s] = (c >> o) * C; - c &= (1 << o) - 1; + static getSampleArray(size, outputSize, bps, stream) { + let i, ii; + let length = 1; + for (i = 0, ii = size.length; i < ii; i++) { + length *= size[i]; } - return g; + 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; + for (i = 0; i < length; i++) { + while (codeSize < bps) { + codeBuf <<= 8; + codeBuf |= strBytes[strIdx++]; + codeSize += 8; + } + codeSize -= bps; + array[i] = (codeBuf >> codeSize) * sampleMul; + codeBuf &= (1 << codeSize) - 1; + } + return array; } - static parse({ xref: e, isEvalSupported: t, fn: i }) { - const a = i.dict || i; - switch (a.get("FunctionType")) { + static parse({ xref, isEvalSupported, fn }) { + const dict = fn.dict || fn; + const typeNum = dict.get("FunctionType"); + switch (typeNum) { case 0: return this.constructSampled({ - xref: e, - isEvalSupported: t, - fn: i, - dict: a, + xref, + isEvalSupported, + fn, + dict, }); case 1: break; case 2: return this.constructInterpolated({ - xref: e, - isEvalSupported: t, - dict: a, + xref, + isEvalSupported, + dict, }); case 3: - return this.constructStiched({ xref: e, isEvalSupported: t, dict: a }); + return this.constructStiched({ + xref, + isEvalSupported, + dict, + }); case 4: return this.constructPostScript({ - xref: e, - isEvalSupported: t, - fn: i, - dict: a, + xref, + isEvalSupported, + fn, + dict, }); } throw new FormatError("Unknown type of function"); } - static parseArray({ xref: e, isEvalSupported: t, fnObj: i }) { - if (!Array.isArray(i)) - return this.parse({ xref: e, isEvalSupported: t, fn: i }); - const a = []; - for (const s of i) - a.push(this.parse({ xref: e, isEvalSupported: t, fn: e.fetchIfRef(s) })); - return function (e, t, i, s) { - for (let r = 0, n = a.length; r < n; r++) a[r](e, t, i, s + r); + static parseArray({ xref, isEvalSupported, fnObj }) { + if (!Array.isArray(fnObj)) { + return this.parse({ + xref, + isEvalSupported, + fn: fnObj, + }); + } + const fnArray = []; + for (const fn of fnObj) { + fnArray.push( + this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn), + }), + ); + } + return function (src, srcOffset, dest, destOffset) { + for (let i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } }; } - static constructSampled({ xref: e, isEvalSupported: t, fn: i, dict: a }) { - function toMultiArray(e) { - const t = e.length, - i = []; - let a = 0; - for (let s = 0; s < t; s += 2) i[a++] = [e[s], e[s + 1]]; - return i; + static constructSampled({ xref, isEvalSupported, fn, dict }) { + function toMultiArray(arr) { + const inputLength = arr.length; + const out = []; + let index = 0; + for (let i = 0; i < inputLength; i += 2) { + out[index++] = [arr[i], arr[i + 1]]; + } + return out; } - function interpolate(e, t, i, a, s) { - return a + ((s - a) / (i - t)) * (e - t); + function interpolate(x, xmin, xmax, ymin, ymax) { + return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); } - let s = toNumberArray(a.getArray("Domain")), - r = toNumberArray(a.getArray("Range")); - if (!s || !r) throw new FormatError("No domain or range"); - const n = s.length / 2, - g = r.length / 2; - s = toMultiArray(s); - r = toMultiArray(r); - const o = toNumberArray(a.getArray("Size")), - c = a.get("BitsPerSample"), - C = a.get("Order") || 1; - 1 !== C && info("No support for cubic spline interpolation: " + C); - let h = toNumberArray(a.getArray("Encode")); - if (h) h = toMultiArray(h); - else { - h = []; - for (let e = 0; e < n; ++e) h.push([0, o[e] - 1]); + let domain = toNumberArray(dict.getArray("Domain")); + let range = toNumberArray(dict.getArray("Range")); + if (!domain || !range) { + throw new FormatError("No domain or range"); } - let l = toNumberArray(a.getArray("Decode")); - l = l ? toMultiArray(l) : r; - const Q = this.getSampleArray(o, g, c, i); - return function constructSampledFn(e, t, i, a) { - const c = 1 << n, - C = new Float64Array(c), - E = new Uint32Array(c); - let u, d; - for (d = 0; d < c; d++) C[d] = 1; - let f = g, - p = 1; - for (u = 0; u < n; ++u) { - const i = s[u][0], - a = s[u][1]; - let r = interpolate( - Math.min(Math.max(e[t + u], i), a), - i, - a, - h[u][0], - h[u][1], + 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 (order !== 1) { + info("No support for cubic spline interpolation: " + order); + } + let encode = toNumberArray(dict.getArray("Encode")); + if (!encode) { + encode = []; + for (let i = 0; i < inputSize; ++i) { + encode.push([0, size[i] - 1]); + } + } else { + encode = toMultiArray(encode); + } + let decode = toNumberArray(dict.getArray("Decode")); + decode = !decode ? range : toMultiArray(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; + for (j = 0; j < cubeVertices; j++) { + cubeN[j] = 1; + } + let k = outputSize, + pos = 1; + 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, ); - const n = o[u]; - r = Math.min(Math.max(r, 0), n - 1); - const g = r < n - 1 ? Math.floor(r) : r - 1, - l = g + 1 - r, - Q = r - g, - m = g * f, - y = m + f; - for (d = 0; d < c; d++) - if (d & p) { - C[d] *= Q; - E[d] += y; + 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++) { + if (j & pos) { + cubeN[j] *= n1; + cubeVertex[j] += offset1; } else { - C[d] *= l; - E[d] += m; + cubeN[j] *= n0; + cubeVertex[j] += offset0; } - f *= n; - p <<= 1; + } + k *= size_i; + pos <<= 1; } - for (d = 0; d < g; ++d) { - let e = 0; - for (u = 0; u < c; u++) e += Q[E[u] + d] * C[u]; - e = interpolate(e, 0, 1, l[d][0], l[d][1]); - i[a + d] = Math.min(Math.max(e, r[d][0]), r[d][1]); + for (j = 0; j < outputSize; ++j) { + let rj = 0; + for (i = 0; i < cubeVertices; i++) { + rj += samples[cubeVertex[i] + j] * cubeN[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]); } }; } - static constructInterpolated({ xref: e, isEvalSupported: t, dict: i }) { - const a = toNumberArray(i.getArray("C0")) || [0], - s = toNumberArray(i.getArray("C1")) || [1], - r = i.get("N"), - n = []; - for (let e = 0, t = a.length; e < t; ++e) n.push(s[e] - a[e]); - const g = n.length; - return function constructInterpolatedFn(e, t, i, s) { - const o = 1 === r ? e[t] : e[t] ** r; - for (let e = 0; e < g; ++e) i[s + e] = a[e] + o * n[e]; + 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 (let i = 0, ii = c0.length; i < ii; ++i) { + diff.push(c1[i] - c0[i]); + } + const length = diff.length; + return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { + const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; + for (let j = 0; j < length; ++j) { + dest[destOffset + j] = c0[j] + x * diff[j]; + } }; } - static constructStiched({ xref: e, isEvalSupported: t, dict: i }) { - const a = toNumberArray(i.getArray("Domain")); - if (!a) throw new FormatError("No domain"); - if (1 !== a.length / 2) + static constructStiched({ xref, isEvalSupported, dict }) { + const domain = toNumberArray(dict.getArray("Domain")); + if (!domain) { + throw new FormatError("No domain"); + } + const inputSize = domain.length / 2; + if (inputSize !== 1) { throw new FormatError("Bad domain for stiched function"); - const s = []; - for (const a of i.get("Functions")) - s.push(this.parse({ xref: e, isEvalSupported: t, fn: e.fetchIfRef(a) })); - const r = toNumberArray(i.getArray("Bounds")), - n = toNumberArray(i.getArray("Encode")), - g = new Float32Array(1); - return function constructStichedFn(e, t, i, o) { - const c = (function constructStichedFromIRClip(e, t, i) { - e > i ? (e = i) : e < t && (e = t); - return e; - })(e[t], a[0], a[1]), - C = r.length; - let h; - for (h = 0; h < C && !(c < r[h]); ++h); - let l = a[0]; - h > 0 && (l = r[h - 1]); - let Q = a[1]; - h < r.length && (Q = r[h]); - const E = n[2 * h], - u = n[2 * h + 1]; - g[0] = l === Q ? E : E + ((c - l) * (u - E)) / (Q - l); - s[h](g, 0, i, o); + } + const fns = []; + for (const fn of dict.get("Functions")) { + fns.push( + this.parse({ + xref, + isEvalSupported, + fn: xref.fetchIfRef(fn), + }), + ); + } + 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; + } + return v; + }; + const v = clip(src[srcOffset], domain[0], domain[1]); + const length = bounds.length; + let i; + for (i = 0; i < length; ++i) { + if (v < bounds[i]) { + break; + } + } + let dmin = domain[0]; + if (i > 0) { + dmin = bounds[i - 1]; + } + let dmax = domain[1]; + if (i < bounds.length) { + dmax = bounds[i]; + } + 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); }; } - static constructPostScript({ xref: e, isEvalSupported: t, fn: i, dict: a }) { - const s = toNumberArray(a.getArray("Domain")), - r = toNumberArray(a.getArray("Range")); - if (!s) throw new FormatError("No domain."); - if (!r) throw new FormatError("No range."); - const n = new PostScriptLexer(i), - g = new PostScriptParser(n).parse(); - if (t && FeatureTest.isEvalSupported) { - const e = new PostScriptCompiler().compile(g, s, r); - if (e) return new Function("src", "srcOffset", "dest", "destOffset", e); + static constructPostScript({ xref, isEvalSupported, fn, dict }) { + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); + if (!domain) { + throw new FormatError("No domain."); + } + if (!range) { + throw new FormatError("No range."); + } + const lexer = new PostScriptLexer(fn); + const parser = new PostScriptParser(lexer); + const code = parser.parse(); + if (isEvalSupported && FeatureTest.isEvalSupported) { + const compiled = new PostScriptCompiler().compile(code, domain, range); + if (compiled) { + return new Function("src", "srcOffset", "dest", "destOffset", compiled); + } } info("Unable to compile PS function"); - const o = r.length >> 1, - c = s.length >> 1, - C = new PostScriptEvaluator(g), - h = Object.create(null); - let l = 8192; - const Q = new Float32Array(c); - return function constructPostScriptFn(e, t, i, a) { - let s, - n, - g = ""; - const E = Q; - for (s = 0; s < c; s++) { - n = e[t + s]; - E[s] = n; - g += n + "_"; + 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 + "_"; } - const u = h[g]; - if (void 0 !== u) { - i.set(u, a); + const cachedValue = cache[key]; + if (cachedValue !== undefined) { + dest.set(cachedValue, destOffset); return; } - const d = new Float32Array(o), - f = C.execute(E), - p = f.length - o; - for (s = 0; s < o; s++) { - n = f[p + s]; - let e = r[2 * s]; - if (n < e) n = e; - else { - e = r[2 * s + 1]; - n > e && (n = e); + 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]; + let bound = range[i * 2]; + if (value < bound) { + value = bound; + } else { + bound = range[i * 2 + 1]; + if (value > bound) { + value = bound; + } } - d[s] = n; + output[i] = value; } - if (l > 0) { - l--; - h[g] = d; + if (cache_available > 0) { + cache_available--; + cache[key] = output; } - i.set(d, a); + dest.set(output, destOffset); }; } } -function isPDFFunction(e) { - let t; - if (e instanceof Dict) t = e; - else { - if (!(e instanceof BaseStream)) return !1; - t = e.dict; +function isPDFFunction(v) { + let fnDict; + if (v instanceof Dict) { + fnDict = v; + } else if (v instanceof BaseStream) { + fnDict = v.dict; + } else { + return false; } - return t.has("FunctionType"); + return fnDict.has("FunctionType"); } class PostScriptStack { static MAX_STACK_SIZE = 100; - constructor(e) { - this.stack = e ? Array.from(e) : []; + constructor(initialStack) { + this.stack = initialStack ? Array.from(initialStack) : []; } - push(e) { - if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) + push(value) { + if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { throw new Error("PostScript function stack overflow."); - this.stack.push(e); + } + this.stack.push(value); } pop() { - if (this.stack.length <= 0) + if (this.stack.length <= 0) { throw new Error("PostScript function stack underflow."); + } return this.stack.pop(); } - copy(e) { - if (this.stack.length + e >= PostScriptStack.MAX_STACK_SIZE) + copy(n) { + if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { throw new Error("PostScript function stack overflow."); - const t = this.stack; - for (let i = t.length - e, a = e - 1; a >= 0; a--, i++) t.push(t[i]); - } - index(e) { - this.push(this.stack[this.stack.length - e - 1]); - } - roll(e, t) { - const i = this.stack, - a = i.length - e, - s = i.length - 1, - r = a + (t - Math.floor(t / e) * e); - for (let e = a, t = s; e < t; e++, t--) { - const a = i[e]; - i[e] = i[t]; - i[t] = a; } - for (let e = a, t = r - 1; e < t; e++, t--) { - const a = i[e]; - i[e] = i[t]; - i[t] = a; + const stack = this.stack; + for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { + stack.push(stack[i]); } - for (let e = r, t = s; e < t; e++, t--) { - const a = i[e]; - i[e] = i[t]; - i[t] = a; + } + 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; + } + 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(e) { - this.operators = e; + constructor(operators) { + this.operators = operators; } - execute(e) { - const t = new PostScriptStack(e); - let i = 0; - const a = this.operators, - s = a.length; - let r, n, g; - for (; i < s; ) { - r = a[i++]; - if ("number" != typeof r) - switch (r) { - case "jz": - g = t.pop(); - n = t.pop(); - n || (i = g); - break; - case "j": - n = t.pop(); - i = n; - break; - case "abs": - n = t.pop(); - t.push(Math.abs(n)); - break; - case "add": - g = t.pop(); - n = t.pop(); - t.push(n + g); - break; - case "and": - g = t.pop(); - n = t.pop(); - "boolean" == typeof n && "boolean" == typeof g - ? t.push(n && g) - : t.push(n & g); - break; - case "atan": - g = t.pop(); - n = t.pop(); - n = (Math.atan2(n, g) / Math.PI) * 180; - n < 0 && (n += 360); - t.push(n); - break; - case "bitshift": - g = t.pop(); - n = t.pop(); - n > 0 ? t.push(n << g) : t.push(n >> g); - break; - case "ceiling": - n = t.pop(); - t.push(Math.ceil(n)); - break; - case "copy": - n = t.pop(); - t.copy(n); - break; - case "cos": - n = t.pop(); - t.push(Math.cos(((n % 360) / 180) * Math.PI)); - break; - case "cvi": - n = 0 | t.pop(); - t.push(n); - break; - case "cvr": - break; - case "div": - g = t.pop(); - n = t.pop(); - t.push(n / g); - break; - case "dup": - t.copy(1); - break; - case "eq": - g = t.pop(); - n = t.pop(); - t.push(n === g); - break; - case "exch": - t.roll(2, 1); - break; - case "exp": - g = t.pop(); - n = t.pop(); - t.push(n ** g); - break; - case "false": - t.push(!1); - break; - case "floor": - n = t.pop(); - t.push(Math.floor(n)); - break; - case "ge": - g = t.pop(); - n = t.pop(); - t.push(n >= g); - break; - case "gt": - g = t.pop(); - n = t.pop(); - t.push(n > g); - break; - case "idiv": - g = t.pop(); - n = t.pop(); - t.push((n / g) | 0); - break; - case "index": - n = t.pop(); - t.index(n); - break; - case "le": - g = t.pop(); - n = t.pop(); - t.push(n <= g); - break; - case "ln": - n = t.pop(); - t.push(Math.log(n)); - break; - case "log": - n = t.pop(); - t.push(Math.log10(n)); - break; - case "lt": - g = t.pop(); - n = t.pop(); - t.push(n < g); - break; - case "mod": - g = t.pop(); - n = t.pop(); - t.push(n % g); - break; - case "mul": - g = t.pop(); - n = t.pop(); - t.push(n * g); - break; - case "ne": - g = t.pop(); - n = t.pop(); - t.push(n !== g); - break; - case "neg": - n = t.pop(); - t.push(-n); - break; - case "not": - n = t.pop(); - "boolean" == typeof n ? t.push(!n) : t.push(~n); - break; - case "or": - g = t.pop(); - n = t.pop(); - "boolean" == typeof n && "boolean" == typeof g - ? t.push(n || g) - : t.push(n | g); - break; - case "pop": - t.pop(); - break; - case "roll": - g = t.pop(); - n = t.pop(); - t.roll(n, g); - break; - case "round": - n = t.pop(); - t.push(Math.round(n)); - break; - case "sin": - n = t.pop(); - t.push(Math.sin(((n % 360) / 180) * Math.PI)); - break; - case "sqrt": - n = t.pop(); - t.push(Math.sqrt(n)); - break; - case "sub": - g = t.pop(); - n = t.pop(); - t.push(n - g); - break; - case "true": - t.push(!0); - break; - case "truncate": - n = t.pop(); - n = n < 0 ? Math.ceil(n) : Math.floor(n); - t.push(n); - break; - case "xor": - g = t.pop(); - n = t.pop(); - "boolean" == typeof n && "boolean" == typeof g - ? t.push(n !== g) - : t.push(n ^ g); - break; - default: - throw new FormatError(`Unknown operator ${r}`); - } - else t.push(r); + 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++]; + if (typeof operator === "number") { + stack.push(operator); + continue; + } + switch (operator) { + case "jz": + b = stack.pop(); + a = stack.pop(); + if (!a) { + counter = b; + } + break; + case "j": + a = stack.pop(); + counter = 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 "and": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a && b); + } else { + stack.push(a & b); + } + break; + case "atan": + b = stack.pop(); + a = stack.pop(); + a = (Math.atan2(a, b) / Math.PI) * 180; + if (a < 0) { + a += 360; + } + stack.push(a); + break; + case "bitshift": + b = stack.pop(); + a = stack.pop(); + if (a > 0) { + stack.push(a << b); + } else { + stack.push(a >> b); + } + break; + case "ceiling": + a = stack.pop(); + stack.push(Math.ceil(a)); + break; + case "copy": + a = stack.pop(); + stack.copy(a); + break; + case "cos": + a = stack.pop(); + stack.push(Math.cos(((a % 360) / 180) * Math.PI)); + break; + case "cvi": + a = stack.pop() | 0; + stack.push(a); + break; + case "cvr": + break; + case "div": + b = stack.pop(); + a = stack.pop(); + stack.push(a / b); + break; + case "dup": + stack.copy(1); + break; + case "eq": + b = stack.pop(); + a = stack.pop(); + stack.push(a === b); + break; + case "exch": + stack.roll(2, 1); + break; + case "exp": + b = stack.pop(); + a = stack.pop(); + stack.push(a ** b); + break; + case "false": + stack.push(false); + 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 "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 "index": + a = stack.pop(); + stack.index(a); + 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 "log": + a = stack.pop(); + stack.push(Math.log10(a)); + 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 "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 "neg": + a = stack.pop(); + stack.push(-a); + break; + case "not": + a = stack.pop(); + if (typeof a === "boolean") { + stack.push(!a); + } else { + stack.push(~a); + } + break; + case "or": + b = stack.pop(); + a = stack.pop(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a || b); + } else { + stack.push(a | b); + } + break; + case "pop": + stack.pop(); + 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 "sin": + a = stack.pop(); + stack.push(Math.sin(((a % 360) / 180) * Math.PI)); + 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 "true": + stack.push(true); + 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(); + if (typeof a === "boolean" && typeof b === "boolean") { + stack.push(a !== b); + } else { + stack.push(a ^ b); + } + break; + default: + throw new FormatError(`Unknown operator ${operator}`); + } } - return t.stack; + return stack.stack; } } class AstNode { - constructor(e) { - this.type = e; + constructor(type) { + this.type = type; } - visit(e) { + visit(visitor) { unreachable("abstract method"); } } class AstArgument extends AstNode { - constructor(e, t, i) { + constructor(index, min, max) { super("args"); - this.index = e; - this.min = t; - this.max = i; + this.index = index; + this.min = min; + this.max = max; } - visit(e) { - e.visitArgument(this); + visit(visitor) { + visitor.visitArgument(this); } } class AstLiteral extends AstNode { - constructor(e) { + constructor(number) { super("literal"); - this.number = e; - this.min = e; - this.max = e; + this.number = number; + this.min = number; + this.max = number; } - visit(e) { - e.visitLiteral(this); + visit(visitor) { + visitor.visitLiteral(this); } } class AstBinaryOperation extends AstNode { - constructor(e, t, i, a, s) { + constructor(op, arg1, arg2, min, max) { super("binary"); - this.op = e; - this.arg1 = t; - this.arg2 = i; - this.min = a; - this.max = s; + this.op = op; + this.arg1 = arg1; + this.arg2 = arg2; + this.min = min; + this.max = max; } - visit(e) { - e.visitBinaryOperation(this); + visit(visitor) { + visitor.visitBinaryOperation(this); } } class AstMin extends AstNode { - constructor(e, t) { + constructor(arg, max) { super("max"); - this.arg = e; - this.min = e.min; - this.max = t; + this.arg = arg; + this.min = arg.min; + this.max = max; } - visit(e) { - e.visitMin(this); + visit(visitor) { + visitor.visitMin(this); } } class AstVariable extends AstNode { - constructor(e, t, i) { + constructor(index, min, max) { super("var"); - this.index = e; - this.min = t; - this.max = i; + this.index = index; + this.min = min; + this.max = max; } - visit(e) { - e.visitVariable(this); + visit(visitor) { + visitor.visitVariable(this); } } class AstVariableDefinition extends AstNode { - constructor(e, t) { + constructor(variable, arg) { super("definition"); - this.variable = e; - this.arg = t; + this.variable = variable; + this.arg = arg; } - visit(e) { - e.visitVariableDefinition(this); + visit(visitor) { + visitor.visitVariableDefinition(this); } } class ExpressionBuilderVisitor { constructor() { this.parts = []; } - visitArgument(e) { + visitArgument(arg) { this.parts.push( "Math.max(", - e.min, + arg.min, ", Math.min(", - e.max, + arg.max, ", src[srcOffset + ", - e.index, + arg.index, "]))", ); } - visitVariable(e) { - this.parts.push("v", e.index); + visitVariable(variable) { + this.parts.push("v", variable.index); } - visitLiteral(e) { - this.parts.push(e.number); + visitLiteral(literal) { + this.parts.push(literal.number); } - visitBinaryOperation(e) { + visitBinaryOperation(operation) { this.parts.push("("); - e.arg1.visit(this); - this.parts.push(" ", e.op, " "); - e.arg2.visit(this); + operation.arg1.visit(this); + this.parts.push(" ", operation.op, " "); + operation.arg2.visit(this); this.parts.push(")"); } - visitVariableDefinition(e) { + visitVariableDefinition(definition) { this.parts.push("var "); - e.variable.visit(this); + definition.variable.visit(this); this.parts.push(" = "); - e.arg.visit(this); + definition.arg.visit(this); this.parts.push(";"); } - visitMin(e) { + visitMin(max) { this.parts.push("Math.min("); - e.arg.visit(this); - this.parts.push(", ", e.max, ")"); + max.arg.visit(this); + this.parts.push(", ", max.max, ")"); } toString() { return this.parts.join(""); } } -function buildAddOperation(e, t) { - return "literal" === t.type && 0 === t.number - ? e - : "literal" === e.type && 0 === e.number - ? t - : "literal" === t.type && "literal" === e.type - ? new AstLiteral(e.number + t.number) - : new AstBinaryOperation("+", e, t, e.min + t.min, e.max + t.max); -} -function buildMulOperation(e, t) { - if ("literal" === t.type) { - if (0 === t.number) return new AstLiteral(0); - if (1 === t.number) return e; - if ("literal" === e.type) return new AstLiteral(e.number * t.number); +function buildAddOperation(num1, num2) { + if (num2.type === "literal" && num2.number === 0) { + return num1; } - if ("literal" === e.type) { - if (0 === e.number) return new AstLiteral(0); - if (1 === e.number) return t; + if (num1.type === "literal" && num1.number === 0) { + return num2; } - const i = Math.min( - e.min * t.min, - e.min * t.max, - e.max * t.min, - e.max * t.max, - ), - a = Math.max(e.min * t.min, e.min * t.max, e.max * t.min, e.max * t.max); - return new AstBinaryOperation("*", e, t, i, a); -} -function buildSubOperation(e, t) { - if ("literal" === t.type) { - if (0 === t.number) return e; - if ("literal" === e.type) return new AstLiteral(e.number - t.number); + if (num2.type === "literal" && num1.type === "literal") { + return new AstLiteral(num1.number + num2.number); } - return "binary" === t.type && - "-" === t.op && - "literal" === e.type && - 1 === e.number && - "literal" === t.arg1.type && - 1 === t.arg1.number - ? t.arg2 - : new AstBinaryOperation("-", e, t, e.min - t.max, e.max - t.min); + return new AstBinaryOperation( + "+", + num1, + num2, + num1.min + num2.min, + num1.max + num2.max, + ); } -function buildMinOperation(e, t) { - return e.min >= t ? new AstLiteral(t) : e.max <= t ? e : new AstMin(e, t); +function buildMulOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return new AstLiteral(0); + } else if (num2.number === 1) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number * num2.number); + } + } + if (num1.type === "literal") { + if (num1.number === 0) { + return new AstLiteral(0); + } else if (num1.number === 1) { + return num2; + } + } + 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); +} +function buildSubOperation(num1, num2) { + if (num2.type === "literal") { + if (num2.number === 0) { + return num1; + } else if (num1.type === "literal") { + return new AstLiteral(num1.number - num2.number); + } + } + if ( + num2.type === "binary" && + num2.op === "-" && + num1.type === "literal" && + num1.number === 1 && + num2.arg1.type === "literal" && + num2.arg1.number === 1 + ) { + return num2.arg2; + } + return new AstBinaryOperation( + "-", + num1, + num2, + num1.min - num2.max, + num1.max - num2.min, + ); +} +function buildMinOperation(num1, max) { + if (num1.min >= max) { + return new AstLiteral(max); + } else if (num1.max <= max) { + return num1; + } + return new AstMin(num1, max); } class PostScriptCompiler { - compile(e, t, i) { - const a = [], - s = [], - r = t.length >> 1, - n = i.length >> 1; - let g, - o, - c, - C, - h, - l, - Q, - E, - u = 0; - for (let e = 0; e < r; e++) - a.push(new AstArgument(e, t[2 * e], t[2 * e + 1])); - for (let t = 0, i = e.length; t < i; t++) { - E = e[t]; - if ("number" != typeof E) - switch (E) { - case "add": - if (a.length < 2) return null; - C = a.pop(); - c = a.pop(); - a.push(buildAddOperation(c, C)); - break; - case "cvr": - if (a.length < 1) return null; - break; - case "mul": - if (a.length < 2) return null; - C = a.pop(); - c = a.pop(); - a.push(buildMulOperation(c, C)); - break; - case "sub": - if (a.length < 2) return null; - C = a.pop(); - c = a.pop(); - a.push(buildSubOperation(c, C)); - break; - case "exch": - if (a.length < 2) return null; - h = a.pop(); - l = a.pop(); - a.push(h, l); - break; - case "pop": - if (a.length < 1) return null; - a.pop(); - break; - case "index": - if (a.length < 1) return null; - c = a.pop(); - if ("literal" !== c.type) return null; - g = c.number; - if (g < 0 || !Number.isInteger(g) || a.length < g) return null; - h = a[a.length - g - 1]; - if ("literal" === h.type || "var" === h.type) { - a.push(h); - break; - } - Q = new AstVariable(u++, h.min, h.max); - a[a.length - g - 1] = Q; - a.push(Q); - s.push(new AstVariableDefinition(Q, h)); - break; - case "dup": - if (a.length < 1) return null; - if ( - "number" == typeof e[t + 1] && - "gt" === e[t + 2] && - e[t + 3] === t + 7 && - "jz" === e[t + 4] && - "pop" === e[t + 5] && - e[t + 6] === e[t + 1] - ) { - c = a.pop(); - a.push(buildMinOperation(c, e[t + 1])); - t += 6; - break; - } - h = a.at(-1); - if ("literal" === h.type || "var" === h.type) { - a.push(h); - break; - } - Q = new AstVariable(u++, h.min, h.max); - a[a.length - 1] = Q; - a.push(Q); - s.push(new AstVariableDefinition(Q, h)); - break; - case "roll": - if (a.length < 2) return null; - C = a.pop(); - c = a.pop(); - if ("literal" !== C.type || "literal" !== c.type) return null; - o = C.number; - g = c.number; - if ( - g <= 0 || - !Number.isInteger(g) || - !Number.isInteger(o) || - a.length < g - ) - return null; - o = ((o % g) + g) % g; - if (0 === o) break; - a.push(...a.splice(a.length - g, g - o)); - break; - default: + 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])); + } + for (let i = 0, ii = code.length; i < ii; i++) { + item = code[i]; + if (typeof item === "number") { + stack.push(new AstLiteral(item)); + continue; + } + switch (item) { + case "add": + if (stack.length < 2) { return null; - } - else a.push(new AstLiteral(E)); - } - if (a.length !== n) return null; - const d = []; - for (const e of s) { - const t = new ExpressionBuilderVisitor(); - e.visit(t); - d.push(t.toString()); - } - for (let e = 0, t = a.length; e < t; e++) { - const t = a[e], - s = new ExpressionBuilderVisitor(); - t.visit(s); - const r = i[2 * e], - n = i[2 * e + 1], - g = [s.toString()]; - if (r > t.min) { - g.unshift("Math.max(", r, ", "); - g.push(")"); + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildAddOperation(num1, num2)); + break; + case "cvr": + if (stack.length < 1) { + return null; + } + break; + case "mul": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildMulOperation(num1, num2)); + break; + case "sub": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildSubOperation(num1, num2)); + break; + case "exch": + if (stack.length < 2) { + return null; + } + ast1 = stack.pop(); + ast2 = stack.pop(); + stack.push(ast1, ast2); + break; + case "pop": + if (stack.length < 1) { + return null; + } + stack.pop(); + break; + case "index": + if (stack.length < 1) { + return null; + } + num1 = stack.pop(); + if (num1.type !== "literal") { + return null; + } + n = num1.number; + if (n < 0 || !Number.isInteger(n) || stack.length < n) { + return null; + } + ast1 = stack[stack.length - n - 1]; + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - n - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "dup": + if (stack.length < 1) { + return null; + } + if ( + typeof code[i + 1] === "number" && + code[i + 2] === "gt" && + code[i + 3] === i + 7 && + code[i + 4] === "jz" && + code[i + 5] === "pop" && + code[i + 6] === code[i + 1] + ) { + num1 = stack.pop(); + stack.push(buildMinOperation(num1, code[i + 1])); + i += 6; + break; + } + ast1 = stack.at(-1); + if (ast1.type === "literal" || ast1.type === "var") { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case "roll": + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + if (num2.type !== "literal" || num1.type !== "literal") { + return null; + } + j = num2.number; + n = num1.number; + if ( + n <= 0 || + !Number.isInteger(n) || + !Number.isInteger(j) || + stack.length < n + ) { + return null; + } + j = ((j % n) + n) % n; + if (j === 0) { + break; + } + stack.push(...stack.splice(stack.length - n, n - j)); + break; + default: + return null; } - if (n < t.max) { - g.unshift("Math.min(", n, ", "); - g.push(")"); - } - g.unshift("dest[destOffset + ", e, "] = "); - g.push(";"); - d.push(g.join("")); } - return d.join("\n"); + if (stack.length !== outputSize) { + return null; + } + const result = []; + for (const instruction of instructions) { + const statementBuilder = new ExpressionBuilderVisitor(); + instruction.visit(statementBuilder); + result.push(statementBuilder.toString()); + } + for (let i = 0, ii = stack.length; i < ii; i++) { + const expr = stack[i], + statementBuilder = new ExpressionBuilderVisitor(); + expr.visit(statementBuilder); + const min = range[i * 2], + max = range[i * 2 + 1]; + const out = [statementBuilder.toString()]; + if (min > expr.min) { + out.unshift("Math.max(", min, ", "); + out.push(")"); + } + if (max < expr.max) { + out.unshift("Math.min(", max, ", "); + out.push(")"); + } + out.unshift("dest[destOffset + ", i, "] = "); + out.push(";"); + result.push(out.join("")); + } + return result.join("\n"); + } +} // ./src/core/bidi.js + +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", + "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", +]; +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; +} +function isEven(i) { + return (i & 1) === 0; +} +function findUnequal(arr, start, value) { + let j, jj; + for (j = start, jj = arr.length; j < jj; ++j) { + if (arr[j] !== value) { + return j; + } + } + return j; +} +function setValues(arr, start, end, value) { + for (let j = start; j < end; ++j) { + arr[j] = value; } } -const Cs = [ - "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", - ], - hs = [ - "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(e) { - return 0 != (1 & e); -} -function isEven(e) { - return 0 == (1 & e); -} -function findUnequal(e, t, i) { - let a, s; - for (a = t, s = e.length; a < s; ++a) if (e[a] !== i) return a; - return a; -} -function setValues(e, t, i, a) { - for (let s = t; s < i; ++s) e[s] = a; -} -function reverseValues(e, t, i) { - for (let a = t, s = i - 1; a < s; ++a, --s) { - const t = e[a]; - e[a] = e[s]; - e[s] = t; +function reverseValues(arr, start, end) { + for (let i = start, j = end - 1; i < j; ++i, --j) { + const temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; } } -function createBidiText(e, t, i = !1) { - let a = "ltr"; - i ? (a = "ttb") : t || (a = "rtl"); - return { str: e, dir: a }; +function createBidiText(str, isLTR, vertical = false) { + let dir = "ltr"; + if (vertical) { + dir = "ttb"; + } else if (!isLTR) { + dir = "rtl"; + } + return { + str, + dir, + }; } -const Bs = [], - ls = []; -function bidi(e, t = -1, i = !1) { - let a = !0; - const s = e.length; - if (0 === s || i) return createBidiText(e, a, i); - Bs.length = s; - ls.length = s; - let r, - n, - g = 0; - for (r = 0; r < s; ++r) { - Bs[r] = e.charAt(r); - const t = e.charCodeAt(r); - let i = "L"; - if (t <= 255) i = Cs[t]; - else if (1424 <= t && t <= 1524) i = "R"; - else if (1536 <= t && t <= 1791) { - i = hs[255 & t]; - i || warn("Bidi: invalid Unicode character " + t.toString(16)); - } else - ((1792 <= t && t <= 2220) || - (64336 <= t && t <= 65023) || - (65136 <= t && t <= 65279)) && - (i = "AL"); - ("R" !== i && "AL" !== i && "AN" !== i) || g++; - ls[r] = i; +const chars = []; +const types = []; +function bidi(str, startLevel = -1, vertical = false) { + let isLTR = true; + const strLength = str.length; + if (strLength === 0 || vertical) { + return createBidiText(str, isLTR, vertical); } - if (0 === g) { - a = !0; - return createBidiText(e, a); + chars.length = strLength; + types.length = strLength; + let numBidi = 0; + let i, ii; + for (i = 0; i < strLength; ++i) { + chars[i] = str.charAt(i); + const charCode = str.charCodeAt(i); + let charType = "L"; + if (charCode <= 0x00ff) { + charType = baseTypes[charCode]; + } else if (0x0590 <= charCode && charCode <= 0x05f4) { + charType = "R"; + } else if (0x0600 <= charCode && charCode <= 0x06ff) { + charType = arabicTypes[charCode & 0xff]; + if (!charType) { + warn("Bidi: invalid Unicode character " + charCode.toString(16)); + } + } else if ( + (0x0700 <= charCode && charCode <= 0x08ac) || + (0xfb50 <= charCode && charCode <= 0xfdff) || + (0xfe70 <= charCode && charCode <= 0xfeff) + ) { + charType = "AL"; + } + if (charType === "R" || charType === "AL" || charType === "AN") { + numBidi++; + } + types[i] = charType; } - if (-1 === t) - if (g / s < 0.3 && s > 4) { - a = !0; - t = 0; + if (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3 && strLength > 4) { + isLTR = true; + startLevel = 0; } else { - a = !1; - t = 1; + isLTR = false; + startLevel = 1; } - const o = []; - for (r = 0; r < s; ++r) o[r] = t; - const c = isOdd(t) ? "R" : "L", - C = c, - h = C; - let l, - Q = C; - for (r = 0; r < s; ++r) "NSM" === ls[r] ? (ls[r] = Q) : (Q = ls[r]); - Q = C; - for (r = 0; r < s; ++r) { - l = ls[r]; - "EN" === l - ? (ls[r] = "AL" === Q ? "AN" : "EN") - : ("R" !== l && "L" !== l && "AL" !== l) || (Q = l); } - for (r = 0; r < s; ++r) { - l = ls[r]; - "AL" === l && (ls[r] = "R"); + const levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; } - for (r = 1; r < s - 1; ++r) { - "ES" === ls[r] && - "EN" === ls[r - 1] && - "EN" === ls[r + 1] && - (ls[r] = "EN"); - "CS" !== ls[r] || - ("EN" !== ls[r - 1] && "AN" !== ls[r - 1]) || - ls[r + 1] !== ls[r - 1] || - (ls[r] = ls[r - 1]); - } - for (r = 0; r < s; ++r) - if ("EN" === ls[r]) { - for (let e = r - 1; e >= 0 && "ET" === ls[e]; --e) ls[e] = "EN"; - for (let e = r + 1; e < s && "ET" === ls[e]; ++e) ls[e] = "EN"; + 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") { + types[i] = lastType; + } else { + lastType = types[i]; } - for (r = 0; r < s; ++r) { - l = ls[r]; - ("WS" !== l && "ES" !== l && "ET" !== l && "CS" !== l) || (ls[r] = "ON"); } - Q = C; - for (r = 0; r < s; ++r) { - l = ls[r]; - "EN" === l - ? (ls[r] = "L" === Q ? "L" : "EN") - : ("R" !== l && "L" !== l) || (Q = l); - } - for (r = 0; r < s; ++r) - if ("ON" === ls[r]) { - const e = findUnequal(ls, r + 1, "ON"); - let t = C; - r > 0 && (t = ls[r - 1]); - let i = h; - e + 1 < s && (i = ls[e + 1]); - "L" !== t && (t = "R"); - "L" !== i && (i = "R"); - t === i && setValues(ls, r, e, t); - r = e - 1; + lastType = sor; + let t; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "AL" ? "AN" : "EN"; + } else if (t === "R" || t === "L" || t === "AL") { + lastType = t; } - for (r = 0; r < s; ++r) "ON" === ls[r] && (ls[r] = c); - for (r = 0; r < s; ++r) { - l = ls[r]; - isEven(o[r]) - ? "R" === l - ? (o[r] += 1) - : ("AN" !== l && "EN" !== l) || (o[r] += 2) - : ("L" !== l && "AN" !== l && "EN" !== l) || (o[r] += 1); } - let E, - u = -1, - d = 99; - for (r = 0, n = o.length; r < n; ++r) { - E = o[r]; - u < E && (u = E); - d > E && isOdd(E) && (d = E); + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "AL") { + types[i] = "R"; + } } - for (E = u; E >= d; --E) { - let e = -1; - for (r = 0, n = o.length; r < n; ++r) - if (o[r] < E) { - if (e >= 0) { - reverseValues(Bs, e, r); - e = -1; + for (i = 1; i < strLength - 1; ++i) { + if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { + types[i] = "EN"; + } + if ( + types[i] === "CS" && + (types[i - 1] === "EN" || types[i - 1] === "AN") && + types[i + 1] === types[i - 1] + ) { + types[i] = types[i - 1]; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "EN") { + for (let j = i - 1; j >= 0; --j) { + if (types[j] !== "ET") { + break; } - } else e < 0 && (e = r); - e >= 0 && reverseValues(Bs, e, o.length); + types[j] = "EN"; + } + for (let j = i + 1; j < strLength; ++j) { + if (types[j] !== "ET") { + break; + } + types[j] = "EN"; + } + } } - for (r = 0, n = Bs.length; r < n; ++r) { - const e = Bs[r]; - ("<" !== e && ">" !== e) || (Bs[r] = ""); + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { + types[i] = "ON"; + } } - return createBidiText(Bs.join(""), a); + lastType = sor; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === "EN") { + types[i] = lastType === "L" ? "L" : "EN"; + } else if (t === "R" || t === "L") { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + const end = findUnequal(types, i + 1, "ON"); + let before = sor; + if (i > 0) { + before = types[i - 1]; + } + let after = eor; + if (end + 1 < strLength) { + after = types[end + 1]; + } + if (before !== "L") { + before = "R"; + } + if (after !== "L") { + after = "R"; + } + if (before === after) { + setValues(types, i, end, before); + } + i = end - 1; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === "ON") { + types[i] = e; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (isEven(levels[i])) { + if (t === "R") { + levels[i] += 1; + } else if (t === "AN" || t === "EN") { + levels[i] += 2; + } + } else if (t === "L" || t === "AN" || t === "EN") { + levels[i] += 1; + } + } + let highestLevel = -1; + let lowestOddLevel = 99; + let level; + for (i = 0, ii = levels.length; i < ii; ++i) { + level = levels[i]; + if (highestLevel < level) { + highestLevel = level; + } + if (lowestOddLevel > level && isOdd(level)) { + lowestOddLevel = level; + } + } + for (level = highestLevel; level >= lowestOddLevel; --level) { + let start = -1; + for (i = 0, ii = levels.length; i < ii; ++i) { + if (levels[i] < level) { + if (start >= 0) { + reverseValues(chars, start, i); + start = -1; + } + } else if (start < 0) { + start = i; + } + } + if (start >= 0) { + reverseValues(chars, start, levels.length); + } + } + for (i = 0, ii = chars.length; i < ii; ++i) { + const ch = chars[i]; + if (ch === "<" || ch === ">") { + chars[i] = ""; + } + } + return createBidiText(chars.join(""), isLTR); +} // ./src/core/font_substitutions.js + +const NORMAL = { + style: "normal", + weight: "normal", +}; +const BOLD = { + style: "normal", + weight: "bold", +}; +const ITALIC = { + style: "italic", + weight: "normal", +}; +const BOLDITALIC = { + style: "italic", + weight: "bold", +}; +const substitutionMap = new Map([ + [ + "Times-Roman", + { + local: [ + "Times New Roman", + "Times-Roman", + "Times", + "Liberation Serif", + "Nimbus Roman", + "Nimbus Roman L", + "Tinos", + "Thorndale", + "TeX Gyre Termes", + "FreeSerif", + "Linux Libertine O", + "Libertinus Serif", + "DejaVu Serif", + "Bitstream Vera Serif", + "Ubuntu", + ], + style: NORMAL, + ultimate: "serif", + }, + ], + [ + "Times-Bold", + { + alias: "Times-Roman", + style: BOLD, + ultimate: "serif", + }, + ], + [ + "Times-Italic", + { + alias: "Times-Roman", + style: ITALIC, + ultimate: "serif", + }, + ], + [ + "Times-BoldItalic", + { + alias: "Times-Roman", + style: BOLDITALIC, + ultimate: "serif", + }, + ], + [ + "Helvetica", + { + local: [ + "Helvetica", + "Helvetica Neue", + "Arial", + "Arial Nova", + "Liberation Sans", + "Arimo", + "Nimbus Sans", + "Nimbus Sans L", + "A030", + "TeX Gyre Heros", + "FreeSans", + "DejaVu Sans", + "Albany", + "Bitstream Vera Sans", + "Arial Unicode MS", + "Microsoft Sans Serif", + "Apple Symbols", + "Cantarell", + ], + path: "LiberationSans-Regular.ttf", + style: NORMAL, + ultimate: "sans-serif", + }, + ], + [ + "Helvetica-Bold", + { + alias: "Helvetica", + path: "LiberationSans-Bold.ttf", + style: BOLD, + ultimate: "sans-serif", + }, + ], + [ + "Helvetica-Oblique", + { + alias: "Helvetica", + path: "LiberationSans-Italic.ttf", + style: ITALIC, + ultimate: "sans-serif", + }, + ], + [ + "Helvetica-BoldOblique", + { + alias: "Helvetica", + path: "LiberationSans-BoldItalic.ttf", + style: BOLDITALIC, + ultimate: "sans-serif", + }, + ], + [ + "Courier", + { + local: [ + "Courier", + "Courier New", + "Liberation Mono", + "Nimbus Mono", + "Nimbus Mono L", + "Cousine", + "Cumberland", + "TeX Gyre Cursor", + "FreeMono", + "Linux Libertine Mono O", + "Libertinus Mono", + ], + style: NORMAL, + ultimate: "monospace", + }, + ], + [ + "Courier-Bold", + { + alias: "Courier", + style: BOLD, + ultimate: "monospace", + }, + ], + [ + "Courier-Oblique", + { + alias: "Courier", + style: ITALIC, + ultimate: "monospace", + }, + ], + [ + "Courier-BoldOblique", + { + alias: "Courier", + style: BOLDITALIC, + ultimate: "monospace", + }, + ], + [ + "ArialBlack", + { + local: ["Arial Black"], + style: { + style: "normal", + weight: "900", + }, + fallback: "Helvetica-Bold", + }, + ], + [ + "ArialBlack-Bold", + { + alias: "ArialBlack", + }, + ], + [ + "ArialBlack-Italic", + { + alias: "ArialBlack", + style: { + style: "italic", + weight: "900", + }, + fallback: "Helvetica-BoldOblique", + }, + ], + [ + "ArialBlack-BoldItalic", + { + alias: "ArialBlack-Italic", + }, + ], + [ + "ArialNarrow", + { + local: [ + "Arial Narrow", + "Liberation Sans Narrow", + "Helvetica Condensed", + "Nimbus Sans Narrow", + "TeX Gyre Heros Cn", + ], + style: NORMAL, + fallback: "Helvetica", + }, + ], + [ + "ArialNarrow-Bold", + { + alias: "ArialNarrow", + style: BOLD, + fallback: "Helvetica-Bold", + }, + ], + [ + "ArialNarrow-Italic", + { + alias: "ArialNarrow", + style: ITALIC, + fallback: "Helvetica-Oblique", + }, + ], + [ + "ArialNarrow-BoldItalic", + { + alias: "ArialNarrow", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique", + }, + ], + [ + "Calibri", + { + local: ["Calibri", "Carlito"], + style: NORMAL, + fallback: "Helvetica", + }, + ], + [ + "Calibri-Bold", + { + alias: "Calibri", + style: BOLD, + fallback: "Helvetica-Bold", + }, + ], + [ + "Calibri-Italic", + { + alias: "Calibri", + style: ITALIC, + fallback: "Helvetica-Oblique", + }, + ], + [ + "Calibri-BoldItalic", + { + alias: "Calibri", + style: BOLDITALIC, + fallback: "Helvetica-BoldOblique", + }, + ], + [ + "Wingdings", + { + local: ["Wingdings", "URW Dingbats"], + style: NORMAL, + }, + ], + [ + "Wingdings-Regular", + { + alias: "Wingdings", + }, + ], + [ + "Wingdings-Bold", + { + alias: "Wingdings", + }, + ], +]); +const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); +function getStyleToAppend(style) { + switch (style) { + case BOLD: + return "Bold"; + case ITALIC: + return "Italic"; + case BOLDITALIC: + return "Bold Italic"; + default: + if (style?.weight === "bold") { + return "Bold"; + } + if (style?.style === "italic") { + return "Italic"; + } + } + return ""; } -const Qs = { style: "normal", weight: "normal" }, - Es = { style: "normal", weight: "bold" }, - us = { style: "italic", weight: "normal" }, - ds = { style: "italic", weight: "bold" }, - fs = new Map([ - [ - "Times-Roman", - { - local: [ - "Times New Roman", - "Times-Roman", - "Times", - "Liberation Serif", - "Nimbus Roman", - "Nimbus Roman L", - "Tinos", - "Thorndale", - "TeX Gyre Termes", - "FreeSerif", - "Linux Libertine O", - "Libertinus Serif", - "DejaVu Serif", - "Bitstream Vera Serif", - "Ubuntu", - ], - style: Qs, - ultimate: "serif", - }, - ], - ["Times-Bold", { alias: "Times-Roman", style: Es, ultimate: "serif" }], - ["Times-Italic", { alias: "Times-Roman", style: us, ultimate: "serif" }], - [ - "Times-BoldItalic", - { alias: "Times-Roman", style: ds, ultimate: "serif" }, - ], - [ - "Helvetica", - { - local: [ - "Helvetica", - "Helvetica Neue", - "Arial", - "Arial Nova", - "Liberation Sans", - "Arimo", - "Nimbus Sans", - "Nimbus Sans L", - "A030", - "TeX Gyre Heros", - "FreeSans", - "DejaVu Sans", - "Albany", - "Bitstream Vera Sans", - "Arial Unicode MS", - "Microsoft Sans Serif", - "Apple Symbols", - "Cantarell", - ], - path: "LiberationSans-Regular.ttf", - style: Qs, - ultimate: "sans-serif", - }, - ], - [ - "Helvetica-Bold", - { - alias: "Helvetica", - path: "LiberationSans-Bold.ttf", - style: Es, - ultimate: "sans-serif", - }, - ], - [ - "Helvetica-Oblique", - { - alias: "Helvetica", - path: "LiberationSans-Italic.ttf", - style: us, - ultimate: "sans-serif", - }, - ], - [ - "Helvetica-BoldOblique", - { - alias: "Helvetica", - path: "LiberationSans-BoldItalic.ttf", - style: ds, - ultimate: "sans-serif", - }, - ], - [ - "Courier", - { - local: [ - "Courier", - "Courier New", - "Liberation Mono", - "Nimbus Mono", - "Nimbus Mono L", - "Cousine", - "Cumberland", - "TeX Gyre Cursor", - "FreeMono", - "Linux Libertine Mono O", - "Libertinus Mono", - ], - style: Qs, - ultimate: "monospace", - }, - ], - ["Courier-Bold", { alias: "Courier", style: Es, ultimate: "monospace" }], - ["Courier-Oblique", { alias: "Courier", style: us, ultimate: "monospace" }], - [ - "Courier-BoldOblique", - { alias: "Courier", style: ds, ultimate: "monospace" }, - ], - [ - "ArialBlack", - { - local: ["Arial Black"], - style: { style: "normal", weight: "900" }, - fallback: "Helvetica-Bold", - }, - ], - ["ArialBlack-Bold", { alias: "ArialBlack" }], - [ - "ArialBlack-Italic", - { - alias: "ArialBlack", - style: { style: "italic", weight: "900" }, - fallback: "Helvetica-BoldOblique", - }, - ], - ["ArialBlack-BoldItalic", { alias: "ArialBlack-Italic" }], - [ - "ArialNarrow", - { - local: [ - "Arial Narrow", - "Liberation Sans Narrow", - "Helvetica Condensed", - "Nimbus Sans Narrow", - "TeX Gyre Heros Cn", - ], - style: Qs, - fallback: "Helvetica", - }, - ], - [ - "ArialNarrow-Bold", - { alias: "ArialNarrow", style: Es, fallback: "Helvetica-Bold" }, - ], - [ - "ArialNarrow-Italic", - { alias: "ArialNarrow", style: us, fallback: "Helvetica-Oblique" }, - ], - [ - "ArialNarrow-BoldItalic", - { alias: "ArialNarrow", style: ds, fallback: "Helvetica-BoldOblique" }, - ], - [ - "Calibri", - { local: ["Calibri", "Carlito"], style: Qs, fallback: "Helvetica" }, - ], - [ - "Calibri-Bold", - { alias: "Calibri", style: Es, fallback: "Helvetica-Bold" }, - ], - [ - "Calibri-Italic", - { alias: "Calibri", style: us, fallback: "Helvetica-Oblique" }, - ], - [ - "Calibri-BoldItalic", - { alias: "Calibri", style: ds, fallback: "Helvetica-BoldOblique" }, - ], - ["Wingdings", { local: ["Wingdings", "URW Dingbats"], style: Qs }], - ["Wingdings-Regular", { alias: "Wingdings" }], - ["Wingdings-Bold", { alias: "Wingdings" }], - ]), - ps = new Map([["Arial-Black", "ArialBlack"]]); -function getFamilyName(e) { - const t = new Set([ +function getFamilyName(str) { + const keywords = new Set([ "thin", "extralight", "ultralight", @@ -32033,789 +37525,1024 @@ function getFamilyName(e) { "ultraexpanded", "bolditalic", ]); - return e + return str .split(/[- ,+]+/g) - .filter((e) => !t.has(e.toLowerCase())) + .filter((tok) => !keywords.has(tok.toLowerCase())) .join(" "); } function generateFont( - { alias: e, local: t, path: i, fallback: a, style: s, ultimate: r }, - n, - g, - o = !0, - c = !0, - C = "", + { alias, local, path, fallback, style, ultimate }, + src, + localFontPath, + useFallback = true, + usePath = true, + append = "", ) { - const h = { style: null, ultimate: null }; - if (t) { - const e = C ? ` ${C}` : ""; - for (const i of t) n.push(`local(${i}${e})`); + const result = { + style: null, + ultimate: null, + }; + if (local) { + const extra = append ? ` ${append}` : ""; + for (const name of local) { + src.push(`local(${name}${extra})`); + } } - if (e) { - const t = fs.get(e), - r = - C || - (function getStyleToAppend(e) { - switch (e) { - case Es: - return "Bold"; - case us: - return "Italic"; - case ds: - return "Bold Italic"; - default: - if ("bold" === e?.weight) return "Bold"; - if ("italic" === e?.style) return "Italic"; - } - return ""; - })(s); - Object.assign(h, generateFont(t, n, g, o && !a, c && !i, r)); + if (alias) { + const substitution = substitutionMap.get(alias); + const aliasAppend = append || getStyleToAppend(style); + Object.assign( + result, + generateFont( + substitution, + src, + localFontPath, + useFallback && !fallback, + usePath && !path, + aliasAppend, + ), + ); } - s && (h.style = s); - r && (h.ultimate = r); - if (o && a) { - const e = fs.get(a), - { ultimate: t } = generateFont(e, n, g, o, c && !i, C); - h.ultimate ||= t; + if (style) { + result.style = style; } - c && i && g && n.push(`url(${g}${i})`); - return h; + if (ultimate) { + result.ultimate = ultimate; + } + if (useFallback && fallback) { + const fallbackInfo = substitutionMap.get(fallback); + const { ultimate: fallbackUltimate } = generateFont( + fallbackInfo, + src, + localFontPath, + useFallback, + usePath && !path, + append, + ); + result.ultimate ||= fallbackUltimate; + } + if (usePath && path && localFontPath) { + src.push(`url(${localFontPath}${path})`); + } + return result; } -function getFontSubstitution(e, t, i, a, s, r) { - if (a.startsWith("InvalidPDFjsFont_")) return null; - ("TrueType" !== r && "Type1" !== r) || - !/^[A-Z]{6}\+/.test(a) || - (a = a.slice(7)); - const n = (a = normalizeFontName(a)); - let g = e.get(n); - if (g) return g; - let o = fs.get(a); - if (!o) - for (const [e, t] of ps) - if (a.startsWith(e)) { - a = `${t}${a.substring(e.length)}`; - o = fs.get(a); +function getFontSubstitution( + systemFontCache, + idFactory, + localFontPath, + baseFontName, + standardFontName, + type, +) { + if (baseFontName.startsWith("InvalidPDFjsFont_")) { + return null; + } + if ( + (type === "TrueType" || type === "Type1") && + /^[A-Z]{6}\+/.test(baseFontName) + ) { + baseFontName = baseFontName.slice(7); + } + baseFontName = normalizeFontName(baseFontName); + const key = baseFontName; + let substitutionInfo = systemFontCache.get(key); + if (substitutionInfo) { + return substitutionInfo; + } + let substitution = substitutionMap.get(baseFontName); + if (!substitution) { + for (const [alias, subst] of fontAliases) { + if (baseFontName.startsWith(alias)) { + baseFontName = `${subst}${baseFontName.substring(alias.length)}`; + substitution = substitutionMap.get(baseFontName); break; } - let c = !1; - if (!o) { - o = fs.get(s); - c = !0; + } } - const C = `${t.getDocId()}_s${t.createFontId()}`; - if (!o) { - if (!validateFontName(a)) { - warn(`Cannot substitute the font because of its name: ${a}`); - e.set(n, null); + let mustAddBaseFont = false; + if (!substitution) { + substitution = substitutionMap.get(standardFontName); + mustAddBaseFont = true; + } + const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; + if (!substitution) { + if (!validateFontName(baseFontName)) { + warn(`Cannot substitute the font because of its name: ${baseFontName}`); + systemFontCache.set(key, null); return null; } - const t = /bold/gi.test(a), - i = /oblique|italic/gi.test(a), - s = (t && i && ds) || (t && Es) || (i && us) || Qs; - g = { - css: `"${getFamilyName(a)}",${C}`, - guessFallback: !0, - loadedName: C, - baseFontName: a, - src: `local(${a})`, - style: s, + const bold = /bold/gi.test(baseFontName); + const italic = /oblique|italic/gi.test(baseFontName); + const style = + (bold && italic && BOLDITALIC) || + (bold && BOLD) || + (italic && ITALIC) || + NORMAL; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}`, + guessFallback: true, + loadedName, + baseFontName, + src: `local(${baseFontName})`, + style, }; - e.set(n, g); - return g; + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; } - const h = []; - c && validateFontName(a) && h.push(`local(${a})`); - const { style: l, ultimate: Q } = generateFont(o, h, i), - E = null === Q, - u = E ? "" : `,${Q}`; - g = { - css: `"${getFamilyName(a)}",${C}${u}`, - guessFallback: E, - loadedName: C, - baseFontName: a, - src: h.join(","), - style: l, + const src = []; + if (mustAddBaseFont && validateFontName(baseFontName)) { + src.push(`local(${baseFontName})`); + } + const { style, ultimate } = generateFont(substitution, src, localFontPath); + const guessFallback = ultimate === null; + const fallback = guessFallback ? "" : `,${ultimate}`; + substitutionInfo = { + css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`, + guessFallback, + loadedName, + baseFontName, + src: src.join(","), + style, }; - e.set(n, g); - return g; -} + systemFontCache.set(key, substitutionInfo); + return substitutionInfo; +} // ./src/core/image_resizer.js + +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 65537; +const MAX_ERROR = 128; class ImageResizer { - constructor(e, t) { - this._imgData = e; - this._isMask = t; + static #goodSquareLength = MIN_IMAGE_DIM; + static #isChrome = false; + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; } - static needsToBeResized(e, t) { - if (e <= this._goodSquareLength && t <= this._goodSquareLength) return !1; - const { MAX_DIM: i } = this; - if (e > i || t > i) return !0; - const a = e * t; - if (this._hasMaxArea) return a > this.MAX_AREA; - if (a < this._goodSquareLength ** 2) return !1; - if (this._areGoodDims(e, t)) { - this._goodSquareLength = Math.max( - this._goodSquareLength, - Math.floor(Math.sqrt(e * t)), - ); - return !1; + static get canUseImageDecoder() { + return shadow( + this, + "canUseImageDecoder", + this.#isChrome || typeof ImageDecoder === "undefined" + ? Promise.resolve(false) + : ImageDecoder.isTypeSupported("image/bmp"), + ); + } + static needsToBeResized(width, height) { + if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { + return false; } - this._goodSquareLength = this._guessMax(this._goodSquareLength, i, 128, 0); - return a > (this.MAX_AREA = this._goodSquareLength ** 2); + const { MAX_DIM } = this; + if (width > MAX_DIM || height > MAX_DIM) { + return true; + } + const area = width * height; + if (this._hasMaxArea) { + return area > this.MAX_AREA; + } + if (area < this.#goodSquareLength ** 2) { + return false; + } + if (this._areGoodDims(width, height)) { + this.#goodSquareLength = Math.max( + this.#goodSquareLength, + Math.floor(Math.sqrt(width * height)), + ); + return false; + } + this.#goodSquareLength = this._guessMax( + this.#goodSquareLength, + MAX_DIM, + MAX_ERROR, + 0, + ); + const maxArea = (this.MAX_AREA = this.#goodSquareLength ** 2); + return area > maxArea; } static get MAX_DIM() { - return shadow(this, "MAX_DIM", this._guessMax(2048, 65537, 0, 1)); + return shadow( + this, + "MAX_DIM", + this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1), + ); } static get MAX_AREA() { - this._hasMaxArea = !0; + this._hasMaxArea = true; return shadow( this, "MAX_AREA", - this._guessMax(ImageResizer._goodSquareLength, this.MAX_DIM, 128, 0) ** 2, + this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2, ); } - static set MAX_AREA(e) { - if (e >= 0) { - this._hasMaxArea = !0; - shadow(this, "MAX_AREA", e); + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + shadow(this, "MAX_AREA", area); } } - static setMaxArea(e) { - this._hasMaxArea || (this.MAX_AREA = e >> 2); + static setMaxArea(area) { + if (!this._hasMaxArea) { + this.MAX_AREA = area >> 2; + } } - static _areGoodDims(e, t) { + static setOptions(opts) { + this.setMaxArea(opts.maxArea ?? -1); + this.#isChrome = opts.isChrome ?? false; + } + static _areGoodDims(width, height) { try { - const i = new OffscreenCanvas(e, t), - a = i.getContext("2d"); - a.fillRect(0, 0, 1, 1); - const s = a.getImageData(0, 0, 1, 1).data[3]; - i.width = i.height = 1; - return 0 !== s; + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.fillRect(0, 0, 1, 1); + const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; + canvas.width = canvas.height = 1; + return opacity !== 0; } catch { - return !1; + return false; } } - static _guessMax(e, t, i, a) { - for (; e + i + 1 < t; ) { - const i = Math.floor((e + t) / 2), - s = a || i; - this._areGoodDims(i, s) ? (e = i) : (t = i); + static _guessMax(start, end, tolerance, defaultHeight) { + while (start + tolerance + 1 < end) { + const middle = Math.floor((start + end) / 2); + const height = defaultHeight || middle; + if (this._areGoodDims(middle, height)) { + start = middle; + } else { + end = middle; + } } - return e; + return start; } - static async createImage(e, t = !1) { - return new ImageResizer(e, t)._createImage(); + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); } async _createImage() { - const e = this._encodeBMP(), - t = new Blob([e.buffer], { type: "image/bmp" }), - i = createImageBitmap(t), - { MAX_AREA: a, MAX_DIM: s } = ImageResizer, - { _imgData: r } = this, - { width: n, height: g } = r, - o = Math.max(n / s, g / s, Math.sqrt((n * g) / a)), - c = Math.max(o, 2), - C = Math.round(10 * (o + 1.25)) / 10 / c, - h = Math.floor(Math.log2(C)), - l = new Array(h + 2).fill(2); - l[0] = c; - l.splice(-1, 1, C / (1 << h)); - let Q = n, - E = g, - u = await i; - for (const e of l) { - const t = Q, - i = E; - Q = Math.floor(Q / e) - 1; - E = Math.floor(E / e) - 1; - const a = new OffscreenCanvas(Q, E); - a.getContext("2d").drawImage(u, 0, 0, t, i, 0, 0, Q, E); - u = a.transferToImageBitmap(); + const data = this._encodeBMP(); + let decoder, imagePromise; + if (await ImageResizer.canUseImageDecoder) { + decoder = new ImageDecoder({ + data, + type: "image/bmp", + preferAnimation: false, + transfer: [data.buffer], + }); + imagePromise = decoder + .decode() + .catch((reason) => { + warn(`BMP image decoding failed: ${reason}`); + return createImageBitmap( + new Blob([this._encodeBMP().buffer], { + type: "image/bmp", + }), + ); + }) + .finally(() => { + decoder.close(); + }); + } else { + imagePromise = createImageBitmap( + new Blob([data.buffer], { + type: "image/bmp", + }), + ); } - r.data = null; - r.bitmap = u; - r.width = Q; - r.height = E; - return r; + const { MAX_AREA, MAX_DIM } = ImageResizer; + const { _imgData: imgData } = this; + const { width, height } = imgData; + const minFactor = Math.max( + width / MAX_DIM, + height / MAX_DIM, + Math.sqrt((width * height) / MAX_AREA), + ); + const firstFactor = Math.max(minFactor, 2); + const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; + const N = Math.floor(Math.log2(factor)); + const steps = new Array(N + 2).fill(2); + steps[0] = firstFactor; + steps.splice(-1, 1, factor / (1 << N)); + let newWidth = width; + let newHeight = height; + const result = await imagePromise; + let bitmap = result.image || result; + for (const step of steps) { + const prevWidth = newWidth; + const prevHeight = newHeight; + newWidth = Math.floor(newWidth / step) - 1; + newHeight = Math.floor(newHeight / step) - 1; + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d"); + ctx.drawImage( + bitmap, + 0, + 0, + prevWidth, + prevHeight, + 0, + 0, + newWidth, + newHeight, + ); + bitmap.close(); + bitmap = canvas.transferToImageBitmap(); + } + imgData.data = null; + imgData.bitmap = bitmap; + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; } _encodeBMP() { - const { width: e, height: t, kind: i } = this._imgData; - let a, - s = this._imgData.data, - r = new Uint8Array(0), - n = r, - g = 0; - switch (i) { - case D: { - a = 1; - r = new Uint8Array( + const { width, height, kind } = this._imgData; + let data = this._imgData.data; + let bitPerPixel; + let colorTable = new Uint8Array(0); + let maskTable = colorTable; + let compression = 0; + switch (kind) { + case ImageKind.GRAYSCALE_1BPP: { + bitPerPixel = 1; + colorTable = new Uint8Array( this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255], ); - const i = (e + 7) >> 3, - n = (i + 3) & -4; - if (i !== n) { - const e = new Uint8Array(n * t); - let a = 0; - for (let r = 0, g = t * i; r < g; r += i, a += n) - e.set(s.subarray(r, r + i), a); - s = e; + const rowLen = (width + 7) >> 3; + const rowSize = (rowLen + 3) & -4; + if (rowLen !== rowSize) { + const newData = new Uint8Array(rowSize * height); + let k = 0; + for ( + let i = 0, ii = height * rowLen; + i < ii; + i += rowLen, k += rowSize + ) { + newData.set(data.subarray(i, i + rowLen), k); + } + data = newData; } break; } - case b: - a = 24; - if (3 & e) { - const i = 3 * e, - a = (i + 3) & -4, - r = a - i, - n = new Uint8Array(a * t); - let g = 0; - for (let e = 0, a = t * i; e < a; e += i) { - const t = s.subarray(e, e + i); - for (let e = 0; e < i; e += 3) { - n[g++] = t[e + 2]; - n[g++] = t[e + 1]; - n[g++] = t[e]; + case ImageKind.RGB_24BPP: { + bitPerPixel = 24; + if (width & 3) { + const rowLen = 3 * width; + const rowSize = (rowLen + 3) & -4; + const extraLen = rowSize - rowLen; + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { + const row = data.subarray(i, i + rowLen); + for (let j = 0; j < rowLen; j += 3) { + newData[k++] = row[j + 2]; + newData[k++] = row[j + 1]; + newData[k++] = row[j]; } - g += r; + k += extraLen; } - s = n; - } else - for (let e = 0, t = s.length; e < t; e += 3) { - const t = s[e]; - s[e] = s[e + 2]; - s[e + 2] = t; - } - break; - case F: - a = 32; - g = 3; - n = new Uint8Array(68); - const i = new DataView(n.buffer); - if (FeatureTest.isLittleEndian) { - i.setUint32(0, 255, !0); - i.setUint32(4, 65280, !0); - i.setUint32(8, 16711680, !0); - i.setUint32(12, 4278190080, !0); + data = newData; } else { - i.setUint32(0, 4278190080, !0); - i.setUint32(4, 16711680, !0); - i.setUint32(8, 65280, !0); - i.setUint32(12, 255, !0); + for (let i = 0, ii = data.length; i < ii; i += 3) { + const tmp = data[i]; + data[i] = data[i + 2]; + data[i + 2] = tmp; + } + } + break; + } + case ImageKind.RGBA_32BPP: + bitPerPixel = 32; + compression = 3; + maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); + const view = new DataView(maskTable.buffer); + if (FeatureTest.isLittleEndian) { + view.setUint32(0, 0x000000ff, true); + view.setUint32(4, 0x0000ff00, true); + view.setUint32(8, 0x00ff0000, true); + view.setUint32(12, 0xff000000, true); + } else { + view.setUint32(0, 0xff000000, true); + view.setUint32(4, 0x00ff0000, true); + view.setUint32(8, 0x0000ff00, true); + view.setUint32(12, 0x000000ff, true); } break; default: throw new Error("invalid format"); } - let o = 0; - const c = 40 + n.length, - C = 14 + c + r.length + s.length, - h = new Uint8Array(C), - l = new DataView(h.buffer); - l.setUint16(o, 19778, !0); - o += 2; - l.setUint32(o, C, !0); - o += 4; - l.setUint32(o, 0, !0); - o += 4; - l.setUint32(o, 14 + c + r.length, !0); - o += 4; - l.setUint32(o, c, !0); - o += 4; - l.setInt32(o, e, !0); - o += 4; - l.setInt32(o, -t, !0); - o += 4; - l.setUint16(o, 1, !0); - o += 2; - l.setUint16(o, a, !0); - o += 2; - l.setUint32(o, g, !0); - o += 4; - l.setUint32(o, 0, !0); - o += 4; - l.setInt32(o, 0, !0); - o += 4; - l.setInt32(o, 0, !0); - o += 4; - l.setUint32(o, r.length / 4, !0); - o += 4; - l.setUint32(o, 0, !0); - o += 4; - h.set(n, o); - o += n.length; - h.set(r, o); - o += r.length; - h.set(s, o); - return h; + let i = 0; + const headerLength = 40 + maskTable.length; + const fileLength = 14 + headerLength + colorTable.length + data.length; + const bmpData = new Uint8Array(fileLength); + const view = new DataView(bmpData.buffer); + view.setUint16(i, 0x4d42, true); + i += 2; + view.setUint32(i, fileLength, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setUint32(i, 14 + headerLength + colorTable.length, true); + i += 4; + view.setUint32(i, headerLength, true); + i += 4; + view.setInt32(i, width, true); + i += 4; + view.setInt32(i, -height, true); + i += 4; + view.setUint16(i, 1, true); + i += 2; + view.setUint16(i, bitPerPixel, true); + i += 2; + view.setUint32(i, compression, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setUint32(i, colorTable.length / 4, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + bmpData.set(maskTable, i); + i += maskTable.length; + bmpData.set(colorTable, i); + i += colorTable.length; + bmpData.set(data, i); + return bmpData; } -} -ImageResizer._goodSquareLength = 2048; -const ms = 3285377520, - ys = 4294901760, - ws = 65535; +} // ./src/shared/murmurhash3.js + +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; class MurmurHash3_64 { - constructor(e) { - this.h1 = e ? 4294967295 & e : ms; - this.h2 = e ? 4294967295 & e : ms; + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; } - update(e) { - let t, i; - if ("string" == typeof e) { - t = new Uint8Array(2 * e.length); - i = 0; - for (let a = 0, s = e.length; a < s; a++) { - const s = e.charCodeAt(a); - if (s <= 255) t[i++] = s; - else { - t[i++] = s >>> 8; - t[i++] = 255 & s; + update(input) { + let data, length; + if (typeof input === "string") { + 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 (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; } else { - if (!ArrayBuffer.isView(e)) - throw new Error("Invalid data format, must be a string or TypedArray."); - t = e.slice(); - i = t.byteLength; + throw new Error("Invalid data format, must be a string or TypedArray."); } - const a = i >> 2, - s = i - 4 * a, - r = new Uint32Array(t.buffer, 0, a); - let n = 0, - g = 0, - o = this.h1, - c = this.h2; - const C = 3432918353, - h = 461845907, - l = 11601, - Q = 13715; - for (let e = 0; e < a; e++) - if (1 & e) { - n = r[e]; - n = ((n * C) & ys) | ((n * l) & ws); - n = (n << 15) | (n >>> 17); - n = ((n * h) & ys) | ((n * Q) & ws); - o ^= n; - o = (o << 13) | (o >>> 19); - o = 5 * o + 3864292196; + 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 { - g = r[e]; - g = ((g * C) & ys) | ((g * l) & ws); - g = (g << 15) | (g >>> 17); - g = ((g * h) & ys) | ((g * Q) & ws); - c ^= g; - c = (c << 13) | (c >>> 19); - c = 5 * c + 3864292196; + 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; } - n = 0; - switch (s) { - case 3: - n ^= t[4 * a + 2] << 16; - case 2: - n ^= t[4 * a + 1] << 8; - case 1: - n ^= t[4 * a]; - n = ((n * C) & ys) | ((n * l) & ws); - n = (n << 15) | (n >>> 17); - n = ((n * h) & ys) | ((n * Q) & ws); - 1 & a ? (o ^= n) : (c ^= n); } - this.h1 = o; - this.h2 = c; + 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 e = this.h1, - t = this.h2; - e ^= t >>> 1; - e = ((3981806797 * e) & ys) | ((36045 * e) & ws); - t = - ((4283543511 * t) & ys) | - (((2950163797 * ((t << 16) | (e >>> 16))) & ys) >>> 16); - e ^= t >>> 1; - e = ((444984403 * e) & ys) | ((60499 * e) & ws); - t = - ((3301882366 * t) & ys) | - (((3120437893 * ((t << 16) | (e >>> 16))) & ys) >>> 16); - e ^= t >>> 1; + 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; return ( - (e >>> 0).toString(16).padStart(8, "0") + - (t >>> 0).toString(16).padStart(8, "0") + (h1 >>> 0).toString(16).padStart(8, "0") + + (h2 >>> 0).toString(16).padStart(8, "0") ); } -} -function addState(e, t, i, a, s) { - let r = e; - for (let e = 0, i = t.length - 1; e < i; e++) { - const i = t[e]; - r = r[i] ||= []; +} // ./src/core/operator_list.js + +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] ||= []; } - r[t.at(-1)] = { checkFn: i, iterateFn: a, processFn: s }; + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn, + }; } -const Ds = []; +const InitialState = []; addState( - Ds, - [GA, UA, ze, xA], + InitialState, + [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, - function iterateInlineImageGroup(e, t) { - const i = e.fnArray, - a = (t - (e.iCurr - 3)) % 4; - switch (a) { + function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { case 0: - return i[t] === GA; + return fnArray[i] === OPS.save; case 1: - return i[t] === UA; + return fnArray[i] === OPS.transform; case 2: - return i[t] === ze; + return fnArray[i] === OPS.paintInlineImageXObject; case 3: - return i[t] === xA; + return fnArray[i] === OPS.restore; } - throw new Error(`iterateInlineImageGroup - invalid pos: ${a}`); + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); }, - function foundInlineImageGroup(e, t) { - const i = e.fnArray, - a = e.argsArray, - s = e.iCurr, - r = s - 3, - n = s - 2, - g = s - 1, - o = Math.min(Math.floor((t - r) / 4), 200); - if (o < 10) return t - ((t - r) % 4); - let c = 0; - const C = []; - let h = 0, - l = 1, - Q = 1; - for (let e = 0; e < o; e++) { - const t = a[n + (e << 2)], - i = a[g + (e << 2)][0]; - if (l + i.width > 1e3) { - c = Math.max(c, l); - Q += h + 2; - l = 0; - h = 0; - } - C.push({ transform: t, x: l, y: Q, w: i.width, h: i.height }); - l += i.width + 2; - h = Math.max(h, i.height); + 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); } - const E = Math.max(c, l) + 1, - u = Q + h + 1, - d = new Uint8Array(E * u * 4), - f = E << 2; - for (let e = 0; e < o; e++) { - const t = a[g + (e << 2)][0].data, - i = C[e].w << 2; - let s = 0, - r = (C[e].x + C[e].y * E) << 2; - d.set(t.subarray(0, i), r - f); - for (let a = 0, n = C[e].h; a < n; a++) { - d.set(t.subarray(s, s + i), r); - s += i; - r += f; + 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; } - d.set(t.subarray(s - i, s), r); - for (; r >= 0; ) { - t[r - 4] = t[r]; - t[r - 3] = t[r + 1]; - t[r - 2] = t[r + 2]; - t[r - 1] = t[r + 3]; - t[r + i] = t[r + i - 4]; - t[r + i + 1] = t[r + i - 3]; - t[r + i + 2] = t[r + i - 2]; - t[r + i + 3] = t[r + i - 1]; - r -= f; + 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 Uint8Array(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; } } - const p = { width: E, height: u }; - if (e.isOffscreenCanvasSupported) { - const e = new OffscreenCanvas(E, u); - e.getContext("2d").putImageData( - new ImageData(new Uint8ClampedArray(d.buffer), E, u), + const img = { + width: imgWidth, + height: imgHeight, + }; + if (context.isOffscreenCanvasSupported) { + const canvas = new OffscreenCanvas(imgWidth, imgHeight); + const ctx = canvas.getContext("2d"); + ctx.putImageData( + new ImageData( + new Uint8ClampedArray(imgData.buffer), + imgWidth, + imgHeight, + ), 0, 0, ); - p.bitmap = e.transferToImageBitmap(); - p.data = null; + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; } else { - p.kind = F; - p.data = d; + img.kind = ImageKind.RGBA_32BPP; + img.data = imgData; } - i.splice(r, 4 * o, _e); - a.splice(r, 4 * o, [p, C]); - return r + 1; + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); + return iFirstSave + 1; }, ); addState( - Ds, - [GA, UA, Xe, xA], + InitialState, + [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, - function iterateImageMaskGroup(e, t) { - const i = e.fnArray, - a = (t - (e.iCurr - 3)) % 4; - switch (a) { + function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { case 0: - return i[t] === GA; + return fnArray[i] === OPS.save; case 1: - return i[t] === UA; + return fnArray[i] === OPS.transform; case 2: - return i[t] === Xe; + return fnArray[i] === OPS.paintImageMaskXObject; case 3: - return i[t] === xA; + return fnArray[i] === OPS.restore; } - throw new Error(`iterateImageMaskGroup - invalid pos: ${a}`); + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); }, - function foundImageMaskGroup(e, t) { - const i = e.fnArray, - a = e.argsArray, - s = e.iCurr, - r = s - 3, - n = s - 2, - g = s - 1; - let o = Math.floor((t - r) / 4); - if (o < 10) return t - ((t - r) % 4); - let c, - C, - h = !1; - const l = a[g][0], - Q = a[n][0], - E = a[n][1], - u = a[n][2], - d = a[n][3]; - if (E === u) { - h = !0; - c = n + 4; - let e = g + 4; - for (let t = 1; t < o; t++, c += 4, e += 4) { - C = a[c]; + 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); + 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 ( - a[e][0] !== l || - C[0] !== Q || - C[1] !== E || - C[2] !== u || - C[3] !== d + argsArray[iPIMXO][0] !== firstPIMXOArg0 || + transformArgs[0] !== firstTransformArg0 || + transformArgs[1] !== firstTransformArg1 || + transformArgs[2] !== firstTransformArg2 || + transformArgs[3] !== firstTransformArg3 ) { - t < 10 ? (h = !1) : (o = t); + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } break; } } } - if (h) { - o = Math.min(o, 1e3); - const e = new Float32Array(2 * o); - c = n; - for (let t = 0; t < o; t++, c += 4) { - C = a[c]; - e[t << 1] = C[4]; - e[1 + (t << 1)] = C[5]; + 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]; } - i.splice(r, 4 * o, At); - a.splice(r, 4 * o, [l, Q, E, u, d, e]); + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [ + firstPIMXOArg0, + firstTransformArg0, + firstTransformArg1, + firstTransformArg2, + firstTransformArg3, + positions, + ]); } else { - o = Math.min(o, 100); - const e = []; - for (let t = 0; t < o; t++) { - C = a[n + (t << 2)]; - const i = a[g + (t << 2)][0]; - e.push({ - data: i.data, - width: i.width, - height: i.height, - interpolate: i.interpolate, - count: i.count, - transform: C, + 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, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs, }); } - i.splice(r, 4 * o, Ze); - a.splice(r, 4 * o, [e]); + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); } - return r + 1; + return iFirstSave + 1; }, ); addState( - Ds, - [GA, UA, Ve, xA], - function (e) { - const t = e.argsArray, - i = e.iCurr - 2; - return 0 === t[i][1] && 0 === t[i][2]; + InitialState, + [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], + function (context) { + const argsArray = context.argsArray; + const iFirstTransform = context.iCurr - 2; + return ( + argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0 + ); }, - function iterateImageGroup(e, t) { - const i = e.fnArray, - a = e.argsArray, - s = (t - (e.iCurr - 3)) % 4; - switch (s) { + 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 i[t] === GA; + return fnArray[i] === OPS.save; case 1: - if (i[t] !== UA) return !1; - const s = e.iCurr - 2, - r = a[s][0], - n = a[s][3]; - return a[t][0] === r && 0 === a[t][1] && 0 === a[t][2] && a[t][3] === n; + if (fnArray[i] !== 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 (i[t] !== Ve) return !1; - const g = a[e.iCurr - 1][0]; - return a[t][0] === g; + if (fnArray[i] !== 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 i[t] === xA; + return fnArray[i] === OPS.restore; } - throw new Error(`iterateImageGroup - invalid pos: ${s}`); + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); }, - function (e, t) { - const i = e.fnArray, - a = e.argsArray, - s = e.iCurr, - r = s - 3, - n = s - 2, - g = a[s - 1][0], - o = a[n][0], - c = a[n][3], - C = Math.min(Math.floor((t - r) / 4), 1e3); - if (C < 3) return t - ((t - r) % 4); - const h = new Float32Array(2 * C); - let l = n; - for (let e = 0; e < C; e++, l += 4) { - const t = a[l]; - h[e << 1] = t[4]; - h[1 + (e << 1)] = t[5]; + 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 Q = [g, o, c, h]; - i.splice(r, 4 * C, $e); - a.splice(r, 4 * C, Q); - return r + 1; + 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, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; }, ); addState( - Ds, - [$A, se, Ie, Ce, Ae], + InitialState, + [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, - function iterateShowTextGroup(e, t) { - const i = e.fnArray, - a = e.argsArray, - s = (t - (e.iCurr - 4)) % 5; - switch (s) { + 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 i[t] === $A; + return fnArray[i] === OPS.beginText; case 1: - return i[t] === se; + return fnArray[i] === OPS.setFont; case 2: - return i[t] === Ie; + return fnArray[i] === OPS.setTextMatrix; case 3: - if (i[t] !== Ce) return !1; - const s = e.iCurr - 3, - r = a[s][0], - n = a[s][1]; - return a[t][0] === r && a[t][1] === n; + if (fnArray[i] !== 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 i[t] === Ae; + return fnArray[i] === OPS.endText; } - throw new Error(`iterateShowTextGroup - invalid pos: ${s}`); + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); }, - function (e, t) { - const i = e.fnArray, - a = e.argsArray, - s = e.iCurr, - r = s - 4, - n = s - 3, - g = s - 2, - o = s - 1, - c = s, - C = a[n][0], - h = a[n][1]; - let l = Math.min(Math.floor((t - r) / 5), 1e3); - if (l < 3) return t - ((t - r) % 5); - let Q = r; + 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 ( - r >= 4 && - i[r - 4] === i[n] && - i[r - 3] === i[g] && - i[r - 2] === i[o] && - i[r - 1] === i[c] && - a[r - 4][0] === C && - a[r - 4][1] === h + 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 ) { - l++; - Q -= 5; + count++; + iFirst -= 5; } - let E = Q + 4; - for (let e = 1; e < l; e++) { - i.splice(E, 3); - a.splice(E, 3); - E += 2; + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; } - return E + 1; + return iEndText + 1; }, ); class NullOptimizer { - constructor(e) { - this.queue = e; + constructor(queue) { + this.queue = queue; } _optimize() {} - push(e, t) { - this.queue.fnArray.push(e); - this.queue.argsArray.push(t); + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); this._optimize(); } flush() {} reset() {} } class QueueOptimizer extends NullOptimizer { - constructor(e) { - super(e); + constructor(queue) { + super(queue); this.state = null; this.context = { iCurr: 0, - fnArray: e.fnArray, - argsArray: e.argsArray, - isOffscreenCanvasSupported: !1, + fnArray: queue.fnArray, + argsArray: queue.argsArray, + isOffscreenCanvasSupported: false, }; this.match = null; this.lastProcessed = 0; } - set isOffscreenCanvasSupported(e) { - this.context.isOffscreenCanvasSupported = e; + set isOffscreenCanvasSupported(value) { + this.context.isOffscreenCanvasSupported = value; } _optimize() { - const e = this.queue.fnArray; - let t = this.lastProcessed, - i = e.length, - a = this.state, - s = this.match; - if (!a && !s && t + 1 === i && !Ds[e[t]]) { - this.lastProcessed = i; + 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 r = this.context; - for (; t < i; ) { - if (s) { - if ((0, s.iterateFn)(r, t)) { - t++; + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; continue; } - t = (0, s.processFn)(r, t + 1); - i = e.length; - s = null; - a = null; - if (t >= i) break; + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { + break; + } } - a = (a || Ds)[e[t]]; - if (a && !Array.isArray(a)) { - r.iCurr = t; - t++; - if (!a.checkFn || (0, a.checkFn)(r)) { - s = a; - a = null; - } else a = null; - } else t++; + 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 = a; - this.match = s; - this.lastProcessed = t; + this.state = state; + this.match = match; + this.lastProcessed = i; } flush() { - for (; this.match; ) { - const e = this.queue.fnArray.length; - this.lastProcessed = (0, this.match.processFn)(this.context, e); + 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(); @@ -32828,21 +38555,23 @@ class QueueOptimizer extends NullOptimizer { } } class OperatorList { - static CHUNK_SIZE = 1e3; + static CHUNK_SIZE = 1000; static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; - constructor(e = 0, t) { - this._streamSink = t; + constructor(intent = 0, streamSink) { + this._streamSink = streamSink; this.fnArray = []; this.argsArray = []; this.optimizer = - !t || e & Q ? new NullOptimizer(this) : new QueueOptimizer(this); + streamSink && !(intent & RenderingIntentFlag.OPLIST) + ? new QueueOptimizer(this) + : new NullOptimizer(this); this.dependencies = new Set(); this._totalLength = 0; this.weight = 0; - this._resolved = t ? null : Promise.resolve(); + this._resolved = streamSink ? null : Promise.resolve(); } - set isOffscreenCanvasSupported(e) { - this.optimizer.isOffscreenCanvasSupported = e; + set isOffscreenCanvasSupported(value) { + this.optimizer.isOffscreenCanvasSupported = value; } get length() { return this.argsArray.length; @@ -32853,35 +38582,52 @@ class OperatorList { get totalLength() { return this._totalLength + this.length; } - addOp(e, t) { - this.optimizer.push(e, t); + addOp(fn, args) { + this.optimizer.push(fn, args); this.weight++; - this._streamSink && - (this.weight >= OperatorList.CHUNK_SIZE || - (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && - (e === xA || e === Ae))) && - this.flush(); - } - addImageOps(e, t, i) { - void 0 !== i && this.addOp(Je, ["OC", i]); - this.addOp(e, t); - void 0 !== i && this.addOp(Ye, []); - } - addDependency(e) { - if (!this.dependencies.has(e)) { - this.dependencies.add(e); - this.addOp(yA, [e]); + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if ( + this.weight >= OperatorList.CHUNK_SIZE_ABOUT && + (fn === OPS.restore || fn === OPS.endText) + ) { + this.flush(); + } } } - addDependencies(e) { - for (const t of e) this.addDependency(t); + addImageOps(fn, args, optionalContent) { + if (optionalContent !== undefined) { + this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(OPS.endMarkedContent, []); + } } - addOpList(e) { - if (e instanceof OperatorList) { - for (const t of e.dependencies) this.dependencies.add(t); - for (let t = 0, i = e.length; t < i; t++) - this.addOp(e.fnArray[t], e.argsArray[t]); - } else warn('addOpList - ignoring invalid "opList" parameter.'); + addDependency(dependency) { + if (this.dependencies.has(dependency)) { + return; + } + this.dependencies.add(dependency); + this.addOp(OPS.dependency, [dependency]); + } + addDependencies(dependencies) { + for (const dependency of dependencies) { + this.addDependency(dependency); + } + } + addOpList(opList) { + if (!(opList instanceof OperatorList)) { + 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 { @@ -32891,31 +38637,33 @@ class OperatorList { }; } get _transfers() { - const e = [], - { fnArray: t, argsArray: i, length: a } = this; - for (let s = 0; s < a; s++) - switch (t[s]) { - case ze: - case _e: - case Xe: - const t = i[s][0]; - !t.cached && - t.data?.buffer instanceof ArrayBuffer && - e.push(t.data.buffer); + const transfers = []; + const { fnArray, argsArray, length } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + const arg = argsArray[i][0]; + if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) { + transfers.push(arg.data.buffer); + } + break; } - return e; + } + return transfers; } - flush(e = !1, t = null) { + flush(lastChunk = false, separateAnnots = null) { this.optimizer.flush(); - const i = this.length; - this._totalLength += i; + const length = this.length; + this._totalLength += length; this._streamSink.enqueue( { fnArray: this.fnArray, argsArray: this.argsArray, - lastChunk: e, - separateAnnots: t, - length: i, + lastChunk, + separateAnnots, + length, }, 1, this._transfers, @@ -32926,302 +38674,360 @@ class OperatorList { this.weight = 0; this.optimizer.reset(); } +} // ./src/core/image.js + +function decodeAndClamp(value, addend, coefficient, max) { + value = addend + value * coefficient; + if (value < 0) { + value = 0; + } else if (value > max) { + value = max; + } + return value; } -function decodeAndClamp(e, t, i, a) { - (e = t + e * i) < 0 ? (e = 0) : e > a && (e = a); - return e; -} -function resizeImageMask(e, t, i, a, s, r) { - const n = s * r; - let g; - g = - t <= 8 - ? new Uint8Array(n) - : t <= 16 - ? new Uint16Array(n) - : new Uint32Array(n); - const o = i / s, - c = a / r; - let C, - h, - l, - Q, - E = 0; - const u = new Uint16Array(s), - d = i; - for (C = 0; C < s; C++) u[C] = Math.floor(C * o); - for (C = 0; C < r; C++) { - l = Math.floor(C * c) * d; - for (h = 0; h < s; h++) { - Q = l + u[h]; - g[E++] = e[Q]; +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 g; + return dest; } class PDFImage { constructor({ - xref: e, - res: t, - image: i, - isInline: a = !1, - smask: s = null, - mask: r = null, - isMask: n = !1, - pdfFunctionFactory: g, - localColorSpaceCache: o, + xref, + res, + image, + isInline = false, + smask = null, + mask = null, + isMask = false, + pdfFunctionFactory, + localColorSpaceCache, }) { - this.image = i; - const c = i.dict, - C = c.get("F", "Filter"); - let h; - if (C instanceof Name) h = C.name; - else if (Array.isArray(C)) { - const t = e.fetchIfRef(C[0]); - t instanceof Name && (h = t.name); + this.image = image; + const dict = image.dict; + const filter = dict.get("F", "Filter"); + let filterName; + if (filter instanceof Name) { + filterName = filter.name; + } else if (Array.isArray(filter)) { + const filterZero = xref.fetchIfRef(filter[0]); + if (filterZero instanceof Name) { + filterName = filterZero.name; + } } - switch (h) { + switch (filterName) { case "JPXDecode": ({ - width: i.width, - height: i.height, - componentsCount: i.numComps, - bitsPerComponent: i.bitsPerComponent, - } = JpxImage.parseImageProperties(i.stream)); - i.stream.reset(); + width: image.width, + height: image.height, + componentsCount: image.numComps, + bitsPerComponent: image.bitsPerComponent, + } = JpxImage.parseImageProperties(image.stream)); + image.stream.reset(); this.jpxDecoderOptions = { numComponents: 0, - isIndexedColormap: !1, - smaskInData: c.has("SMaskInData"), + isIndexedColormap: false, + smaskInData: dict.has("SMaskInData"), }; break; case "JBIG2Decode": - i.bitsPerComponent = 1; - i.numComps = 1; + image.bitsPerComponent = 1; + image.numComps = 1; + break; } - let l = c.get("W", "Width"), - Q = c.get("H", "Height"); + let width = dict.get("W", "Width"); + let height = dict.get("H", "Height"); if ( - Number.isInteger(i.width) && - i.width > 0 && - Number.isInteger(i.height) && - i.height > 0 && - (i.width !== l || i.height !== Q) + Number.isInteger(image.width) && + image.width > 0 && + Number.isInteger(image.height) && + image.height > 0 && + (image.width !== width || image.height !== height) ) { warn( - "PDFImage - using the Width/Height of the image data, rather than the image dictionary.", + "PDFImage - using the Width/Height of the image data, " + + "rather than the image dictionary.", ); - l = i.width; - Q = i.height; + width = image.width; + height = image.height; } - if (l < 1 || Q < 1) - throw new FormatError(`Invalid image width: ${l} or height: ${Q}`); - this.width = l; - this.height = Q; - this.interpolate = c.get("I", "Interpolate"); - this.imageMask = c.get("IM", "ImageMask") || !1; - this.matte = c.get("Matte") || !1; - let E = i.bitsPerComponent; - if (!E) { - E = c.get("BPC", "BitsPerComponent"); - if (!E) { - if (!this.imageMask) + if (width < 1 || height < 1) { + throw new FormatError( + `Invalid image width: ${width} or height: ${height}`, + ); + } + this.width = width; + this.height = height; + this.interpolate = dict.get("I", "Interpolate"); + this.imageMask = dict.get("IM", "ImageMask") || false; + this.matte = dict.get("Matte") || false; + let bitsPerComponent = image.bitsPerComponent; + if (!bitsPerComponent) { + bitsPerComponent = dict.get("BPC", "BitsPerComponent"); + if (!bitsPerComponent) { + if (this.imageMask) { + bitsPerComponent = 1; + } else { throw new FormatError( `Bits per component missing in image: ${this.imageMask}`, ); - E = 1; + } } } - this.bpc = E; + this.bpc = bitsPerComponent; if (!this.imageMask) { - let s = c.getRaw("CS") || c.getRaw("ColorSpace"); - const r = !!s; - if (r) - this.jpxDecoderOptions?.smaskInData && (s = Name.get("DeviceRGBA")); - else if (this.jpxDecoderOptions) s = Name.get("DeviceRGBA"); - else - switch (i.numComps) { - case 1: - s = Name.get("DeviceGray"); - break; - case 3: - s = Name.get("DeviceRGB"); - break; - case 4: - s = Name.get("DeviceCMYK"); - break; - default: - throw new Error( - `Images with ${i.numComps} color components not supported.`, - ); + let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); + const hasColorSpace = !!colorSpace; + if (!hasColorSpace) { + if (this.jpxDecoderOptions) { + colorSpace = Name.get("DeviceRGBA"); + } else { + switch (image.numComps) { + case 1: + colorSpace = Name.get("DeviceGray"); + break; + case 3: + colorSpace = Name.get("DeviceRGB"); + break; + case 4: + colorSpace = Name.get("DeviceCMYK"); + break; + default: + throw new Error( + `Images with ${image.numComps} color components not supported.`, + ); + } } + } else if (this.jpxDecoderOptions?.smaskInData) { + colorSpace = Name.get("DeviceRGBA"); + } this.colorSpace = ColorSpace.parse({ - cs: s, - xref: e, - resources: a ? t : null, - pdfFunctionFactory: g, - localColorSpaceCache: o, + cs: colorSpace, + xref, + resources: isInline ? res : null, + pdfFunctionFactory, + localColorSpaceCache, }); this.numComps = this.colorSpace.numComps; if (this.jpxDecoderOptions) { - this.jpxDecoderOptions.numComponents = r ? this.numComp : 0; + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0; this.jpxDecoderOptions.isIndexedColormap = - "Indexed" === this.colorSpace.name; + this.colorSpace.name === "Indexed"; } } - this.decode = c.getArray("D", "Decode"); - this.needsDecode = !1; + this.decode = dict.getArray("D", "Decode"); + this.needsDecode = false; if ( this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, E)) || - (n && !ColorSpace.isDefaultDecode(this.decode, 1))) + ((this.colorSpace && + !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent)) || + (isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) ) { - this.needsDecode = !0; - const e = (1 << E) - 1; + this.needsDecode = true; + const max = (1 << bitsPerComponent) - 1; this.decodeCoefficients = []; this.decodeAddends = []; - const t = "Indexed" === this.colorSpace?.name; - for (let i = 0, a = 0; i < this.decode.length; i += 2, ++a) { - const s = this.decode[i], - r = this.decode[i + 1]; - this.decodeCoefficients[a] = t ? (r - s) / e : r - s; - this.decodeAddends[a] = t ? s : e * s; + const isIndexed = 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 (s) + if (smask) { this.smask = new PDFImage({ - xref: e, - res: t, - image: s, - isInline: a, - pdfFunctionFactory: g, - localColorSpaceCache: o, + xref, + res, + image: smask, + isInline, + pdfFunctionFactory, + localColorSpaceCache, }); - else if (r) - if (r instanceof BaseStream) { - r.dict.get("IM", "ImageMask") - ? (this.mask = new PDFImage({ - xref: e, - res: t, - image: r, - isInline: a, - isMask: !0, - pdfFunctionFactory: g, - localColorSpaceCache: o, - })) - : warn("Ignoring /Mask in image without /ImageMask."); - } else this.mask = r; + } else if (mask) { + if (mask instanceof BaseStream) { + const maskDict = mask.dict, + imageMask = maskDict.get("IM", "ImageMask"); + if (!imageMask) { + 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: e, - res: t, - image: i, - isInline: a = !1, - pdfFunctionFactory: s, - localColorSpaceCache: r, + xref, + res, + image, + isInline = false, + pdfFunctionFactory, + localColorSpaceCache, }) { - const n = i; - let g = null, - o = null; - const c = i.dict.get("SMask"), - C = i.dict.get("Mask"); - c - ? c instanceof BaseStream - ? (g = c) - : warn("Unsupported /SMask format.") - : C && - (C instanceof BaseStream || Array.isArray(C) - ? (o = C) - : warn("Unsupported /Mask format.")); + const imageData = image; + let smaskData = null; + let maskData = null; + const smask = image.dict.get("SMask"); + const mask = image.dict.get("Mask"); + if (smask) { + if (smask instanceof BaseStream) { + smaskData = smask; + } else { + warn("Unsupported /SMask format."); + } + } else if (mask) { + if (mask instanceof BaseStream || Array.isArray(mask)) { + maskData = mask; + } else { + warn("Unsupported /Mask format."); + } + } return new PDFImage({ - xref: e, - res: t, - image: n, - isInline: a, - smask: g, - mask: o, - pdfFunctionFactory: s, - localColorSpaceCache: r, + xref, + res, + image: imageData, + isInline, + smask: smaskData, + mask: maskData, + pdfFunctionFactory, + localColorSpaceCache, }); } static createRawMask({ - imgArray: e, - width: t, - height: i, - imageIsFromDecodeStream: a, - inverseDecode: s, - interpolate: r, + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate, }) { - const n = ((t + 7) >> 3) * i, - g = e.byteLength; - let o, c; - if (!a || (s && !(n === g))) - if (s) { - o = new Uint8Array(n); - o.set(e); - o.fill(255, g); - } else o = new Uint8Array(e); - else o = e; - if (s) for (c = 0; c < g; c++) o[c] ^= 255; - return { data: o, width: t, height: i, interpolate: r }; + 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 Uint8Array(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + data.fill(0xff, actualLength); + } + if (inverseDecode) { + for (i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, + width, + height, + interpolate, + }; } static async createMask({ - imgArray: e, - width: t, - height: i, - imageIsFromDecodeStream: a, - inverseDecode: s, - interpolate: r, - isOffscreenCanvasSupported: n = !1, + imgArray, + width, + height, + imageIsFromDecodeStream, + inverseDecode, + interpolate, + isOffscreenCanvasSupported = false, }) { - const g = 1 === t && 1 === i && s === (0 === e.length || !!(128 & e[0])); - if (g) return { isSingleOpaquePixel: g }; - if (n) { - if (ImageResizer.needsToBeResized(t, i)) { - const a = new Uint8ClampedArray(t * i * 4); + const isSingleOpaquePixel = + width === 1 && + height === 1 && + inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); + if (isSingleOpaquePixel) { + return { + isSingleOpaquePixel, + }; + } + if (isOffscreenCanvasSupported) { + if (ImageResizer.needsToBeResized(width, height)) { + const data = new Uint8ClampedArray(width * height * 4); convertBlackAndWhiteToRGBA({ - src: e, - dest: a, - width: t, - height: i, + src: imgArray, + dest: data, + width, + height, nonBlackColor: 0, - inverseDecode: s, + inverseDecode, }); return ImageResizer.createImage({ - kind: F, - data: a, - width: t, - height: i, - interpolate: r, + kind: ImageKind.RGBA_32BPP, + data, + width, + height, + interpolate, }); } - const a = new OffscreenCanvas(t, i), - n = a.getContext("2d"), - g = n.createImageData(t, i); + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + const imgData = ctx.createImageData(width, height); convertBlackAndWhiteToRGBA({ - src: e, - dest: g.data, - width: t, - height: i, + src: imgArray, + dest: imgData.data, + width, + height, nonBlackColor: 0, - inverseDecode: s, + inverseDecode, }); - n.putImageData(g, 0, 0); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); return { data: null, - width: t, - height: i, - interpolate: r, - bitmap: a.transferToImageBitmap(), + width, + height, + interpolate, + bitmap, }; } return this.createRawMask({ - imgArray: e, - width: t, - height: i, - inverseDecode: s, - imageIsFromDecodeStream: a, - interpolate: r, + imgArray, + width, + height, + inverseDecode, + imageIsFromDecodeStream, + interpolate, }); } get drawWidth() { @@ -33234,215 +39040,274 @@ class PDFImage { this.mask?.height || 0, ); } - decodeBuffer(e) { - const t = this.bpc, - i = this.numComps, - a = this.decodeAddends, - s = this.decodeCoefficients, - r = (1 << t) - 1; - let n, g; - if (1 === t) { - for (n = 0, g = e.length; n < g; n++) e[n] = +!e[n]; + 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 o = 0; - for (n = 0, g = this.width * this.height; n < g; n++) - for (let t = 0; t < i; t++) { - e[o] = decodeAndClamp(e[o], a[t], s[t], r); - o++; + 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(e) { - const t = this.bpc; - if (8 === t) return e; - const i = this.width, - a = this.height, - s = this.numComps, - r = i * a * s; - let n, - g = 0; - n = - t <= 8 - ? new Uint8Array(r) - : t <= 16 - ? new Uint16Array(r) - : new Uint32Array(r); - const o = i * s, - c = (1 << t) - 1; - let C, - h, - l = 0; - if (1 === t) { - let t, i, s; - for (let r = 0; r < a; r++) { - i = l + (-8 & o); - s = l + o; - for (; l < i; ) { - h = e[g++]; - n[l] = (h >> 7) & 1; - n[l + 1] = (h >> 6) & 1; - n[l + 2] = (h >> 5) & 1; - n[l + 3] = (h >> 4) & 1; - n[l + 4] = (h >> 3) & 1; - n[l + 5] = (h >> 2) & 1; - n[l + 6] = (h >> 1) & 1; - n[l + 7] = 1 & h; - l += 8; + 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 (l < s) { - h = e[g++]; - t = 128; - for (; l < s; ) { - n[l++] = +!!(h & t); - t >>= 1; + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; } } } } else { - let i = 0; - h = 0; - for (l = 0, C = r; l < C; ++l) { - if (l % o == 0) { - h = 0; - i = 0; + let bits = 0; + buf = 0; + for (i = 0, ii = length; i < ii; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; } - for (; i < t; ) { - h = (h << 8) | e[g++]; - i += 8; + while (bits < bpc) { + buf = (buf << 8) | buffer[bufferPos++]; + bits += 8; } - const a = i - t; - let s = h >> a; - s < 0 ? (s = 0) : s > c && (s = c); - n[l] = s; - h &= (1 << a) - 1; - i = a; + 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 n; + return output; } - async fillOpacity(e, t, i, a, s) { - const r = this.smask, - n = this.mask; - let g, o, c, C, h, l; - if (r) { - o = r.width; - c = r.height; - g = new Uint8ClampedArray(o * c); - await r.fillGrayBuffer(g); - (o === t && c === i) || (g = resizeImageMask(g, r.bpc, o, c, t, i)); - } else if (n) - if (n instanceof PDFImage) { - o = n.width; - c = n.height; - g = new Uint8ClampedArray(o * c); - n.numComps = 1; - await n.fillGrayBuffer(g); - for (C = 0, h = o * c; C < h; ++C) g[C] = 255 - g[C]; - (o === t && c === i) || (g = resizeImageMask(g, n.bpc, o, c, t, i)); - } else { - if (!Array.isArray(n)) throw new FormatError("Unknown mask format."); - { - g = new Uint8ClampedArray(t * i); - const e = this.numComps; - for (C = 0, h = t * i; C < h; ++C) { - let t = 0; - const i = C * e; - for (l = 0; l < e; ++l) { - const e = s[i + l], - a = 2 * l; - if (e < n[a] || e > n[a + 1]) { - t = 255; - break; - } - } - g[C] = t; - } - } + async 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); + await smask.fillGrayBuffer(alphaBuf); + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); } - if (g) for (C = 0, l = 3, h = t * a; C < h; ++C, l += 4) e[l] = g[C]; - else for (C = 0, l = 3, h = t * a; C < h; ++C, l += 4) e[l] = 255; + } else if (mask) { + if (mask instanceof PDFImage) { + sw = mask.width; + sh = mask.height; + alphaBuf = new Uint8ClampedArray(sw * sh); + mask.numComps = 1; + await 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 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(e, t, i) { - const a = this.smask?.matte; - if (!a) return; - const s = this.colorSpace.getRgb(a, 0), - r = s[0], - n = s[1], - g = s[2], - o = t * i * 4; - for (let t = 0; t < o; t += 4) { - const i = e[t + 3]; - if (0 === i) { - e[t] = 255; - e[t + 1] = 255; - e[t + 2] = 255; + undoPreblend(buffer, width, height) { + const matte = 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 a = 255 / i; - e[t] = (e[t] - r) * a + r; - e[t + 1] = (e[t + 1] - n) * a + n; - e[t + 2] = (e[t + 2] - g) * a + g; + 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; } } - async createImageData(e = !1, t = !1) { - const i = this.drawWidth, - a = this.drawHeight, - s = { - width: i, - height: a, - interpolate: this.interpolate, - kind: 0, - data: null, - }, - r = this.numComps, - n = this.width, - g = this.height, - o = this.bpc, - c = (n * r * o + 7) >> 3, - C = t && ImageResizer.needsToBeResized(i, a); - if ("DeviceRGBA" === this.colorSpace.name) { - s.kind = F; - const e = (s.data = await this.getImageBytes(g * n * 4, {})); - return t - ? C - ? ImageResizer.createImage(s, !1) - : this.createBitmap(F, i, a, e) - : s; + async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { + const drawWidth = this.drawWidth; + const drawHeight = this.drawHeight; + const imgData = { + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate, + 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; + const mustBeResized = + isOffscreenCanvasSupported && + ImageResizer.needsToBeResized(drawWidth, drawHeight); + if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { + imgData.kind = ImageKind.RGBA_32BPP; + const imgArray = (imgData.data = await this.getImageBytes( + originalHeight * originalWidth * 4, + {}, + )); + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap( + ImageKind.RGBA_32BPP, + drawWidth, + drawHeight, + imgArray, + ); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; } - if (!e) { - let e; - "DeviceGray" === this.colorSpace.name && 1 === o - ? (e = D) - : "DeviceRGB" !== this.colorSpace.name || - 8 !== o || - this.needsDecode || - (e = b); - if (e && !this.smask && !this.mask && i === n && a === g) { - const r = await this.getImageBytes(g * c, {}); - if (t) - return C - ? ImageResizer.createImage( - { - data: r, - kind: e, - width: i, - height: a, - interpolate: this.interpolate, - }, - this.needsDecode, - ) - : this.createBitmap(e, n, g, r); - s.kind = e; - s.data = r; + if (!forceRGBA) { + let kind; + if (this.colorSpace.name === "DeviceGray" && bpc === 1) { + kind = ImageKind.GRAYSCALE_1BPP; + } else if ( + this.colorSpace.name === "DeviceRGB" && + bpc === 8 && + !this.needsDecode + ) { + kind = ImageKind.RGB_24BPP; + } + if ( + kind && + !this.smask && + !this.mask && + drawWidth === originalWidth && + drawHeight === originalHeight + ) { + const image = await this.#getImage(originalWidth, originalHeight); + if (image) { + return image; + } + const data = await this.getImageBytes(originalHeight * rowBytes, {}); + if (isOffscreenCanvasSupported) { + if (mustBeResized) { + return ImageResizer.createImage( + { + data, + kind, + width: drawWidth, + height: drawHeight, + interpolate: this.interpolate, + }, + this.needsDecode, + ); + } + return this.createBitmap(kind, originalWidth, originalHeight, data); + } + imgData.kind = kind; + imgData.data = data; if (this.needsDecode) { assert( - e === D, + kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale.", ); - const t = s.data; - for (let e = 0, i = t.length; e < i; e++) t[e] ^= 255; + const buffer = imgData.data; + for (let i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } } - return s; + return imgData; } if ( this.image instanceof JpegStream && @@ -33450,187 +39315,272 @@ class PDFImage { !this.mask && !this.needsDecode ) { - let e = g * c; - if (t && !C) { - let t = !1; + let imageLength = originalHeight * rowBytes; + if (isOffscreenCanvasSupported && !mustBeResized) { + let isHandled = false; switch (this.colorSpace.name) { case "DeviceGray": - e *= 4; - t = !0; + imageLength *= 4; + isHandled = true; break; case "DeviceRGB": - e = (e / 3) * 4; - t = !0; + imageLength = (imageLength / 3) * 4; + isHandled = true; break; case "DeviceCMYK": - t = !0; + isHandled = true; + break; } - if (t) { - const t = await this.getImageBytes(e, { - drawWidth: i, - drawHeight: a, - forceRGBA: !0, + if (isHandled) { + const image = await this.#getImage(drawWidth, drawHeight); + if (image) { + return image; + } + const rgba = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGBA: true, }); - return this.createBitmap(F, i, a, t); + return this.createBitmap( + ImageKind.RGBA_32BPP, + drawWidth, + drawHeight, + rgba, + ); } - } else + } else { switch (this.colorSpace.name) { case "DeviceGray": - e *= 3; + imageLength *= 3; case "DeviceRGB": case "DeviceCMYK": - s.kind = b; - s.data = await this.getImageBytes(e, { - drawWidth: i, - drawHeight: a, - forceRGB: !0, + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = await this.getImageBytes(imageLength, { + drawWidth, + drawHeight, + forceRGB: true, }); - return C ? ImageResizer.createImage(s) : s; + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; } + } } } - const h = await this.getImageBytes(g * c, { internal: !0 }), - l = 0 | (((h.length / c) * a) / g), - Q = this.getComponents(h); - let E, u, d, f, p, m; - if (t && !C) { - d = new OffscreenCanvas(i, a); - f = d.getContext("2d"); - p = f.createImageData(i, a); - m = p.data; + const imgArray = await this.getImageBytes(originalHeight * rowBytes, { + internal: true, + }); + const actualHeight = + 0 | (((imgArray.length / rowBytes) * drawHeight) / originalHeight); + const comps = this.getComponents(imgArray); + let alpha01, maybeUndoPreblend; + let canvas, ctx, canvasImgData, data; + if (isOffscreenCanvasSupported && !mustBeResized) { + canvas = new OffscreenCanvas(drawWidth, drawHeight); + ctx = canvas.getContext("2d"); + canvasImgData = ctx.createImageData(drawWidth, drawHeight); + data = canvasImgData.data; } - s.kind = F; - if (e || this.smask || this.mask) { - (t && !C) || (m = new Uint8ClampedArray(i * a * 4)); - E = 1; - u = !0; - await this.fillOpacity(m, i, a, l, Q); - } else { - if (!t || C) { - s.kind = b; - m = new Uint8ClampedArray(i * a * 3); - E = 0; + imgData.kind = ImageKind.RGBA_32BPP; + if (!forceRGBA && !this.smask && !this.mask) { + if (!isOffscreenCanvasSupported || mustBeResized) { + imgData.kind = ImageKind.RGB_24BPP; + data = new Uint8ClampedArray(drawWidth * drawHeight * 3); + alpha01 = 0; } else { - new Uint32Array(m.buffer).fill( - FeatureTest.isLittleEndian ? 4278190080 : 255, - ); - E = 1; + const arr = new Uint32Array(data.buffer); + arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); + alpha01 = 1; } - u = !1; + maybeUndoPreblend = false; + } else { + if (!isOffscreenCanvasSupported || mustBeResized) { + data = new Uint8ClampedArray(drawWidth * drawHeight * 4); + } + alpha01 = 1; + maybeUndoPreblend = true; + await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); } - this.needsDecode && this.decodeBuffer(Q); - this.colorSpace.fillRgb(m, n, g, i, a, l, o, Q, E); - u && this.undoPreblend(m, i, l); - if (t && !C) { - f.putImageData(p, 0, 0); + if (this.needsDecode) { + this.decodeBuffer(comps); + } + this.colorSpace.fillRgb( + data, + originalWidth, + originalHeight, + drawWidth, + drawHeight, + actualHeight, + bpc, + comps, + alpha01, + ); + if (maybeUndoPreblend) { + this.undoPreblend(data, drawWidth, actualHeight); + } + if (isOffscreenCanvasSupported && !mustBeResized) { + ctx.putImageData(canvasImgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); return { data: null, - width: i, - height: a, - bitmap: d.transferToImageBitmap(), + width: drawWidth, + height: drawHeight, + bitmap, interpolate: this.interpolate, }; } - s.data = m; - return C ? ImageResizer.createImage(s) : s; + imgData.data = data; + if (mustBeResized) { + return ImageResizer.createImage(imgData); + } + return imgData; } - async fillGrayBuffer(e) { - const t = this.numComps; - if (1 !== t) - throw new FormatError(`Reading gray scale from a color image: ${t}`); - const i = this.width, - a = this.height, - s = this.bpc, - r = (i * t * s + 7) >> 3, - n = await this.getImageBytes(a * r, { internal: !0 }), - g = this.getComponents(n); - let o, c; - if (1 === s) { - c = i * a; - if (this.needsDecode) for (o = 0; o < c; ++o) e[o] = (g[o] - 1) & 255; - else for (o = 0; o < c; ++o) e[o] = 255 & -g[o]; + async fillGrayBuffer(buffer) { + const numComps = this.numComps; + if (numComps !== 1) { + throw new 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 = await this.getImageBytes(height * rowBytes, { + internal: true, + }); + 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; } - this.needsDecode && this.decodeBuffer(g); - c = i * a; - const C = 255 / ((1 << s) - 1); - for (o = 0; o < c; ++o) e[o] = C * g[o]; + 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]; + } } - createBitmap(e, t, i, a) { - const s = new OffscreenCanvas(t, i), - r = s.getContext("2d"); - let n; - if (e === F) n = new ImageData(a, t, i); - else { - n = r.createImageData(t, i); + createBitmap(kind, width, height, src) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + let imgData; + if (kind === ImageKind.RGBA_32BPP) { + imgData = new ImageData(src, width, height); + } else { + imgData = ctx.createImageData(width, height); convertToRGBA({ - kind: e, - src: a, - dest: new Uint32Array(n.data.buffer), - width: t, - height: i, + kind, + src, + dest: new Uint32Array(imgData.data.buffer), + width, + height, inverseDecode: this.needsDecode, }); } - r.putImageData(n, 0, 0); + ctx.putImageData(imgData, 0, 0); + const bitmap = canvas.transferToImageBitmap(); return { data: null, - width: t, - height: i, - bitmap: s.transferToImageBitmap(), + width, + height, + bitmap, + interpolate: this.interpolate, + }; + } + async #getImage(width, height) { + const bitmap = await this.image.getTransferableImage(); + if (!bitmap) { + return null; + } + return { + data: null, + width, + height, + bitmap, interpolate: this.interpolate, }; } async getImageBytes( - e, + length, { - drawWidth: t, - drawHeight: i, - forceRGBA: a = !1, - forceRGB: s = !1, - internal: r = !1, + drawWidth, + drawHeight, + forceRGBA = false, + forceRGB = false, + internal = false, }, ) { this.image.reset(); - this.image.drawWidth = t || this.width; - this.image.drawHeight = i || this.height; - this.image.forceRGBA = !!a; - this.image.forceRGB = !!s; - const n = await this.image.getImageData(e, this.jpxDecoderOptions); - if (r || this.image instanceof DecodeStream) return n; + this.image.drawWidth = drawWidth || this.width; + this.image.drawHeight = drawHeight || this.height; + this.image.forceRGBA = !!forceRGBA; + this.image.forceRGB = !!forceRGB; + const imageBytes = await this.image.getImageData( + length, + this.jpxDecoderOptions, + ); + if (internal || this.image instanceof DecodeStream) { + return imageBytes; + } assert( - n instanceof Uint8Array, + imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.', ); - return new Uint8Array(n); + return new Uint8Array(imageBytes); } -} -const bs = Object.freeze({ - maxImageSize: -1, - disableFontFace: !1, - ignoreErrors: !1, - isEvalSupported: !0, - isOffscreenCanvasSupported: !1, - canvasMaxAreaInBytes: -1, - fontExtraProperties: !1, - useSystemFonts: !0, - cMapUrl: null, - standardFontDataUrl: null, - }), - Fs = 1, - Ss = 2, - ks = Promise.resolve(); -function normalizeBlendMode(e, t = !1) { - if (Array.isArray(e)) { - for (const t of e) { - const e = normalizeBlendMode(t, !0); - if (e) return e; +} // ./src/core/evaluator.js + +const DefaultPartialEvaluatorOptions = Object.freeze({ + maxImageSize: -1, + disableFontFace: false, + ignoreErrors: false, + isEvalSupported: true, + isOffscreenCanvasSupported: false, + isChrome: false, + canvasMaxAreaInBytes: -1, + fontExtraProperties: false, + useSystemFonts: true, + cMapUrl: null, + standardFontDataUrl: null, +}); +const PatternType = { + TILING: 1, + SHADING: 2, +}; +const TEXT_CHUNK_BATCH_SIZE = 10; +const deferred = Promise.resolve(); +function normalizeBlendMode(value, parsingArray = false) { + if (Array.isArray(value)) { + for (const val of value) { + const maybeBM = normalizeBlendMode(val, true); + if (maybeBM) { + return maybeBM; + } } - warn(`Unsupported blend mode Array: ${e}`); + warn(`Unsupported blend mode Array: ${value}`); return "source-over"; } - if (!(e instanceof Name)) return t ? null : "source-over"; - switch (e.name) { + if (!(value instanceof Name)) { + if (parsingArray) { + return null; + } + return "source-over"; + } + switch (value.name) { case "Normal": case "Compatible": return "source-over"; @@ -33665,14 +39615,20 @@ function normalizeBlendMode(e, t = !1) { case "Luminosity": return "luminosity"; } - if (t) return null; - warn(`Unsupported blend mode: ${e.name}`); + if (parsingArray) { + return null; + } + warn(`Unsupported blend mode: ${value.name}`); return "source-over"; } -function addLocallyCachedImageOps(e, t) { - t.objId && e.addDependency(t.objId); - e.addImageOps(t.fn, t.args, t.optionalContent); - t.fn === Xe && t.args[0]?.count > 0 && t.args[0].count++; +function addLocallyCachedImageOps(opList, data) { + if (data.objId) { + opList.addDependency(data.objId); + } + opList.addImageOps(data.fn, data.args, data.optionalContent); + if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { + data.args[0].count++; + } } class TimeSlotManager { static TIME_SLOT_DURATION_MS = 20; @@ -33681,7 +39637,9 @@ class TimeSlotManager { this.reset(); } check() { - if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) return !1; + if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { + return false; + } this.checked = 0; return this.endTime <= Date.now(); } @@ -33692,526 +39650,783 @@ class TimeSlotManager { } class PartialEvaluator { constructor({ - xref: e, - handler: t, - pageIndex: i, - idFactory: a, - fontCache: s, - builtInCMapCache: r, - standardFontDataCache: n, - globalImageCache: g, - systemFontCache: o, - options: c = null, + xref, + handler, + pageIndex, + idFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + options = null, }) { - this.xref = e; - this.handler = t; - this.pageIndex = i; - this.idFactory = a; - this.fontCache = s; - this.builtInCMapCache = r; - this.standardFontDataCache = n; - this.globalImageCache = g; - this.systemFontCache = o; - this.options = c || bs; + 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.systemFontCache = systemFontCache; + this.options = options || DefaultPartialEvaluatorOptions; this.type3FontRefs = null; this._regionalImageCache = new RegionalImageCache(); this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); - ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes); + ImageResizer.setOptions({ + isChrome: this.options.isChrome, + maxArea: this.options.canvasMaxAreaInBytes, + }); } get _pdfFunctionFactory() { - return shadow( - this, - "_pdfFunctionFactory", - new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.options.isEvalSupported, - }), - ); + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.options.isEvalSupported, + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); } get parsingType3Font() { return !!this.type3FontRefs; } - clone(e = null) { - const t = Object.create(this); - t.options = Object.assign(Object.create(null), this.options, e); - return t; + clone(newOptions = null) { + const newEvaluator = Object.create(this); + newEvaluator.options = Object.assign( + Object.create(null), + this.options, + newOptions, + ); + return newEvaluator; } - hasBlendModes(e, t) { - if (!(e instanceof Dict)) return !1; - if (e.objId && t.has(e.objId)) return !1; - const i = new RefSet(t); - e.objId && i.put(e.objId); - const a = [e], - s = this.xref; - for (; a.length; ) { - const e = a.shift(), - t = e.get("ExtGState"); - if (t instanceof Dict) - for (let e of t.getRawValues()) { - if (e instanceof Ref) { - if (i.has(e)) continue; - try { - e = s.fetch(e); - } catch (t) { - i.put(e); - info(`hasBlendModes - ignoring ExtGState: "${t}".`); - continue; - } - } - if (!(e instanceof Dict)) continue; - e.objId && i.put(e.objId); - const t = e.get("BM"); - if (t instanceof Name) { - if ("Normal" !== t.name) return !0; - } else if (void 0 !== t && Array.isArray(t)) - for (const e of t) - if (e instanceof Name && "Normal" !== e.name) return !0; - } - const r = e.get("XObject"); - if (r instanceof Dict) - for (let e of r.getRawValues()) { - if (e instanceof Ref) { - if (i.has(e)) continue; - try { - e = s.fetch(e); - } catch (t) { - i.put(e); - info(`hasBlendModes - ignoring XObject: "${t}".`); - continue; - } - } - if (!(e instanceof BaseStream)) continue; - e.dict.objId && i.put(e.dict.objId); - const t = e.dict.get("Resources"); - if (t instanceof Dict && (!t.objId || !i.has(t.objId))) { - a.push(t); - t.objId && i.put(t.objId); - } - } + hasBlendModes(resources, nonBlendModesSet) { + if (!(resources instanceof Dict)) { + return false; } - for (const e of i) t.put(e); - return !1; + if (resources.objId && nonBlendModesSet.has(resources.objId)) { + return false; + } + const processed = new RefSet(nonBlendModesSet); + if (resources.objId) { + processed.put(resources.objId); + } + const nodes = [resources], + xref = this.xref; + while (nodes.length) { + const node = nodes.shift(); + const graphicStates = node.get("ExtGState"); + if (graphicStates instanceof Dict) { + for (let graphicState of graphicStates.getRawValues()) { + if (graphicState instanceof Ref) { + if (processed.has(graphicState)) { + continue; + } + try { + graphicState = xref.fetch(graphicState); + } catch (ex) { + processed.put(graphicState); + info(`hasBlendModes - ignoring ExtGState: "${ex}".`); + continue; + } + } + if (!(graphicState instanceof Dict)) { + continue; + } + if (graphicState.objId) { + processed.put(graphicState.objId); + } + const bm = graphicState.get("BM"); + if (bm instanceof Name) { + if (bm.name !== "Normal") { + return true; + } + continue; + } + if (bm !== undefined && Array.isArray(bm)) { + for (const element of bm) { + if (element instanceof Name && element.name !== "Normal") { + return true; + } + } + } + } + } + const xObjects = node.get("XObject"); + if (!(xObjects instanceof Dict)) { + continue; + } + for (let xObject of xObjects.getRawValues()) { + if (xObject instanceof Ref) { + if (processed.has(xObject)) { + continue; + } + try { + xObject = xref.fetch(xObject); + } catch (ex) { + processed.put(xObject); + info(`hasBlendModes - ignoring XObject: "${ex}".`); + continue; + } + } + if (!(xObject instanceof BaseStream)) { + continue; + } + if (xObject.dict.objId) { + processed.put(xObject.dict.objId); + } + const xResources = xObject.dict.get("Resources"); + if (!(xResources instanceof Dict)) { + continue; + } + if (xResources.objId && processed.has(xResources.objId)) { + continue; + } + nodes.push(xResources); + if (xResources.objId) { + processed.put(xResources.objId); + } + } + } + for (const ref of processed) { + nonBlendModesSet.put(ref); + } + return false; } - async fetchBuiltInCMap(e) { - const t = this.builtInCMapCache.get(e); - if (t) return t; - let i; - if (null !== this.options.cMapUrl) { - const t = `${this.options.cMapUrl}${e}.bcmap`, - a = await fetch(t); - if (!a.ok) + async fetchBuiltInCMap(name) { + const cachedData = this.builtInCMapCache.get(name); + if (cachedData) { + return cachedData; + } + let data; + if (this.options.cMapUrl !== null) { + const url = `${this.options.cMapUrl}${name}.bcmap`; + const response = await fetch(url); + if (!response.ok) { throw new Error( - `fetchBuiltInCMap: failed to fetch file "${t}" with "${a.statusText}".`, + `fetchBuiltInCMap: failed to fetch file "${url}" with "${response.statusText}".`, ); - i = { - cMapData: new Uint8Array(await a.arrayBuffer()), - compressionType: mA.BINARY, + } + data = { + cMapData: new Uint8Array(await response.arrayBuffer()), + isCompressed: true, }; - } else - i = await this.handler.sendWithPromise("FetchBuiltInCMap", { name: e }); - i.compressionType !== mA.NONE && this.builtInCMapCache.set(e, i); - return i; + } else { + data = await this.handler.sendWithPromise("FetchBuiltInCMap", { + name, + }); + } + this.builtInCMapCache.set(name, data); + return data; } - async fetchStandardFontData(e) { - const t = this.standardFontDataCache.get(e); - if (t) return new Stream(t); - if (this.options.useSystemFonts && "Symbol" !== e && "ZapfDingbats" !== e) + async fetchStandardFontData(name) { + const cachedData = this.standardFontDataCache.get(name); + if (cachedData) { + return new Stream(cachedData); + } + if ( + this.options.useSystemFonts && + name !== "Symbol" && + name !== "ZapfDingbats" + ) { return null; - const i = Wi()[e]; - let a; - if (null !== this.options.standardFontDataUrl) { - const e = `${this.options.standardFontDataUrl}${i}`, - t = await fetch(e); - t.ok - ? (a = new Uint8Array(await t.arrayBuffer())) - : warn( - `fetchStandardFontData: failed to fetch file "${e}" with "${t.statusText}".`, - ); - } else + } + const standardFontNameToFileName = getFontNameToFileMap(), + filename = standardFontNameToFileName[name]; + let data; + if (this.options.standardFontDataUrl !== null) { + const url = `${this.options.standardFontDataUrl}${filename}`; + const response = await fetch(url); + if (!response.ok) { + warn( + `fetchStandardFontData: failed to fetch file "${url}" with "${response.statusText}".`, + ); + } else { + data = new Uint8Array(await response.arrayBuffer()); + } + } else { try { - a = await this.handler.sendWithPromise("FetchStandardFontData", { - filename: i, + data = await this.handler.sendWithPromise("FetchStandardFontData", { + filename, }); } catch (e) { - warn(`fetchStandardFontData: failed to fetch file "${i}" with "${e}".`); + warn( + `fetchStandardFontData: failed to fetch file "${filename}" with "${e}".`, + ); } - if (!a) return null; - this.standardFontDataCache.set(e, a); - return new Stream(a); + } + if (!data) { + return null; + } + this.standardFontDataCache.set(name, data); + return new Stream(data); } - async buildFormXObject(e, t, i, a, s, r, n) { - const g = t.dict, - o = lookupMatrix(g.getArray("Matrix"), null), - c = lookupNormalRect(g.getArray("BBox"), null); - let C, h; - g.has("OC") && (C = await this.parseMarkedContentProps(g.get("OC"), e)); - void 0 !== C && a.addOp(Je, ["OC", C]); - const l = g.get("Group"); - if (l) { - h = { matrix: o, bbox: c, smask: i, isolated: !1, knockout: !1 }; - let t = null; - if (isName(l.get("S"), "Transparency")) { - h.isolated = l.get("I") || !1; - h.knockout = l.get("K") || !1; - if (l.has("CS")) { - const i = l.getRaw("CS"), - a = ColorSpace.getCached(i, this.xref, n); - t = - a || - (await this.parseColorSpace({ - cs: i, - resources: e, - localColorSpaceCache: n, - })); + async buildFormXObject( + resources, + xobj, + smask, + operatorList, + task, + initialState, + localColorSpaceCache, + ) { + const dict = xobj.dict; + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + let optionalContent, groupOptions; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps( + dict.get("OC"), + resources, + ); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + const group = dict.get("Group"); + if (group) { + groupOptions = { + matrix, + bbox, + smask, + isolated: false, + knockout: false, + }; + const groupSubtype = group.get("S"); + let colorSpace = null; + if (isName(groupSubtype, "Transparency")) { + groupOptions.isolated = group.get("I") || false; + groupOptions.knockout = group.get("K") || false; + if (group.has("CS")) { + const cs = group.getRaw("CS"); + const cachedColorSpace = ColorSpace.getCached( + cs, + this.xref, + localColorSpaceCache, + ); + if (cachedColorSpace) { + colorSpace = cachedColorSpace; + } else { + colorSpace = await this.parseColorSpace({ + cs, + resources, + localColorSpaceCache, + }); + } } } - if (i?.backdrop) { - t ||= ColorSpace.singletons.rgb; - i.backdrop = t.getRgb(i.backdrop, 0); + if (smask?.backdrop) { + colorSpace ||= ColorSpace.singletons.rgb; + smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); } - a.addOp(Oe, [h]); + operatorList.addOp(OPS.beginGroup, [groupOptions]); } - const Q = l ? [o, null] : [o, c]; - a.addOp(Te, Q); + const args = group ? [matrix, null] : [matrix, bbox]; + operatorList.addOp(OPS.paintFormXObjectBegin, args); await this.getOperatorList({ - stream: t, - task: s, - resources: g.get("Resources") || e, - operatorList: a, - initialState: r, + stream: xobj, + task, + resources: dict.get("Resources") || resources, + operatorList, + initialState, }); - a.addOp(qe, []); - l && a.addOp(Pe, [h]); - void 0 !== C && a.addOp(Ye, []); + operatorList.addOp(OPS.paintFormXObjectEnd, []); + if (group) { + operatorList.addOp(OPS.endGroup, [groupOptions]); + } + if (optionalContent !== undefined) { + operatorList.addOp(OPS.endMarkedContent, []); + } } - _sendImgData(e, t, i = !1) { - const a = t ? [t.bitmap || t.data.buffer] : null; - return this.parsingType3Font || i - ? this.handler.send("commonobj", [e, "Image", t], a) - : this.handler.send("obj", [e, this.pageIndex, "Image", t], a); + _sendImgData(objId, imgData, cacheGlobally = false) { + const transfers = imgData ? [imgData.bitmap || 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, + ); } async buildPaintImageXObject({ - resources: e, - image: t, - isInline: i = !1, - operatorList: a, - cacheKey: s, - localImageCache: r, - localColorSpaceCache: n, + resources, + image, + isInline = false, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache, }) { - const g = t.dict, - o = g.objId, - c = g.get("W", "Width"), - C = g.get("H", "Height"); - if (!c || "number" != typeof c || !C || "number" != typeof C) { + const dict = image.dict; + const imageRef = dict.objId; + const w = dict.get("W", "Width"); + const h = dict.get("H", "Height"); + if (!(w && typeof w === "number") || !(h && typeof h === "number")) { warn("Image dimensions are missing, or not numbers."); return; } - const h = this.options.maxImageSize; - if (-1 !== h && c * C > h) { - const e = "Image exceeded maximum allowed size and was removed."; + const maxImageSize = this.options.maxImageSize; + if (maxImageSize !== -1 && w * h > maxImageSize) { + const msg = "Image exceeded maximum allowed size and was removed."; if (this.options.ignoreErrors) { - warn(e); + warn(msg); return; } - throw new Error(e); + throw new Error(msg); } - let l; - g.has("OC") && (l = await this.parseMarkedContentProps(g.get("OC"), e)); - let Q, E; - if (g.get("IM", "ImageMask") || !1) { - const e = g.get("I", "Interpolate"), - i = (c + 7) >> 3, - n = t.getBytes(i * C), - h = g.getArray("D", "Decode"); + let optionalContent; + if (dict.has("OC")) { + optionalContent = await this.parseMarkedContentProps( + dict.get("OC"), + resources, + ); + } + const imageMask = dict.get("IM", "ImageMask") || false; + let imgData, args; + if (imageMask) { + const interpolate = dict.get("I", "Interpolate"); + const bitStrideLength = (w + 7) >> 3; + const imgArray = image.getBytes(bitStrideLength * h); + const decode = dict.getArray("D", "Decode"); if (this.parsingType3Font) { - Q = PDFImage.createRawMask({ - imgArray: n, - width: c, - height: C, - imageIsFromDecodeStream: t instanceof DecodeStream, - inverseDecode: h?.[0] > 0, - interpolate: e, + imgData = PDFImage.createRawMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate, }); - Q.cached = !!s; - E = [Q]; - a.addImageOps(Xe, E, l); - if (s) { - const e = { fn: Xe, args: E, optionalContent: l }; - r.set(s, o, e); - o && this._regionalImageCache.set(null, o, e); + imgData.cached = !!cacheKey; + args = [imgData]; + operatorList.addImageOps( + OPS.paintImageMaskXObject, + args, + optionalContent, + ); + if (cacheKey) { + const cacheData = { + fn: OPS.paintImageMaskXObject, + args, + optionalContent, + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } } return; } - Q = await PDFImage.createMask({ - imgArray: n, - width: c, - height: C, - imageIsFromDecodeStream: t instanceof DecodeStream, - inverseDecode: h?.[0] > 0, - interpolate: e, + imgData = await PDFImage.createMask({ + imgArray, + width: w, + height: h, + imageIsFromDecodeStream: image instanceof DecodeStream, + inverseDecode: decode?.[0] > 0, + interpolate, isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported, }); - if (Q.isSingleOpaquePixel) { - a.addImageOps(et, [], l); - if (s) { - const e = { fn: et, args: [], optionalContent: l }; - r.set(s, o, e); - o && this._regionalImageCache.set(null, o, e); + if (imgData.isSingleOpaquePixel) { + operatorList.addImageOps( + OPS.paintSolidColorImageMask, + [], + optionalContent, + ); + if (cacheKey) { + const cacheData = { + fn: OPS.paintSolidColorImageMask, + args: [], + optionalContent, + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } } return; } - const u = `mask_${this.idFactory.createObjId()}`; - a.addDependency(u); - Q.dataLen = Q.bitmap ? Q.width * Q.height * 4 : Q.data.length; - this._sendImgData(u, Q); - E = [ + const objId = `mask_${this.idFactory.createObjId()}`; + operatorList.addDependency(objId); + imgData.dataLen = imgData.bitmap + ? imgData.width * imgData.height * 4 + : imgData.data.length; + this._sendImgData(objId, imgData); + args = [ { - data: u, - width: Q.width, - height: Q.height, - interpolate: Q.interpolate, + data: objId, + width: imgData.width, + height: imgData.height, + interpolate: imgData.interpolate, count: 1, }, ]; - a.addImageOps(Xe, E, l); - if (s) { - const e = { objId: u, fn: Xe, args: E, optionalContent: l }; - r.set(s, o, e); - o && this._regionalImageCache.set(null, o, e); + operatorList.addImageOps( + OPS.paintImageMaskXObject, + args, + optionalContent, + ); + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageMaskXObject, + args, + optionalContent, + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + } } return; } - if (i && c + C < 200 && !g.has("SMask") && !g.has("Mask")) { + const SMALL_IMAGE_DIMENSIONS = 200; + if ( + isInline && + w + h < SMALL_IMAGE_DIMENSIONS && + !dict.has("SMask") && + !dict.has("Mask") + ) { try { - const s = new PDFImage({ + const imageObj = new PDFImage({ xref: this.xref, - res: e, - image: t, - isInline: i, + res: resources, + image, + isInline, pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache: n, + localColorSpaceCache, }); - Q = await s.createImageData(!0, !1); - a.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; - a.addImageOps(ze, [Q], l); - } catch (e) { - const t = `Unable to decode inline image: "${e}".`; - if (!this.options.ignoreErrors) throw new Error(t); - warn(t); + imgData = await imageObj.createImageData(true, false); + operatorList.isOffscreenCanvasSupported = + this.options.isOffscreenCanvasSupported; + operatorList.addImageOps( + OPS.paintInlineImageXObject, + [imgData], + optionalContent, + ); + } catch (reason) { + const msg = `Unable to decode inline image: "${reason}".`; + if (!this.options.ignoreErrors) { + throw new Error(msg); + } + warn(msg); } return; } - let u = `img_${this.idFactory.createObjId()}`, - d = !1; - if (this.parsingType3Font) u = `${this.idFactory.getDocId()}_type3_${u}`; - else if (s && o) { - d = this.globalImageCache.shouldCache(o, this.pageIndex); - if (d) { - assert(!i, "Cannot cache an inline image globally."); - u = `${this.idFactory.getDocId()}_${u}`; + let objId = `img_${this.idFactory.createObjId()}`, + cacheGlobally = false; + if (this.parsingType3Font) { + objId = `${this.idFactory.getDocId()}_type3_${objId}`; + } else if (cacheKey && imageRef) { + cacheGlobally = this.globalImageCache.shouldCache( + imageRef, + this.pageIndex, + ); + if (cacheGlobally) { + assert(!isInline, "Cannot cache an inline image globally."); + objId = `${this.idFactory.getDocId()}_${objId}`; } } - a.addDependency(u); - E = [u, c, C]; - a.addImageOps(Ve, E, l); - if (d) { - if (this.globalImageCache.hasDecodeFailed(o)) { - this.globalImageCache.setData(o, { - objId: u, - fn: Ve, - args: E, - optionalContent: l, + operatorList.addDependency(objId); + args = [objId, w, h]; + operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent); + if (cacheGlobally) { + if (this.globalImageCache.hasDecodeFailed(imageRef)) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, byteSize: 0, }); - this._sendImgData(u, null, d); + this._sendImgData(objId, null, cacheGlobally); return; } - if (c * C > 25e4 || g.has("SMask") || g.has("Mask")) { - const e = await this.handler.sendWithPromise("commonobj", [ - u, + if (w * h > 250000 || dict.has("SMask") || dict.has("Mask")) { + const localLength = await this.handler.sendWithPromise("commonobj", [ + objId, "CopyLocalImage", - { imageRef: o }, + { + imageRef, + }, ]); - if (e) { - this.globalImageCache.setData(o, { - objId: u, - fn: Ve, - args: E, - optionalContent: l, + if (localLength) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, byteSize: 0, }); - this.globalImageCache.addByteSize(o, e); + this.globalImageCache.addByteSize(imageRef, localLength); return; } } } PDFImage.buildImage({ xref: this.xref, - res: e, - image: t, - isInline: i, + res: resources, + image, + isInline, pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache: n, + localColorSpaceCache, }) - .then(async (e) => { - Q = await e.createImageData( - !1, + .then(async (imageObj) => { + imgData = await imageObj.createImageData( + false, this.options.isOffscreenCanvasSupported, ); - Q.dataLen = Q.bitmap ? Q.width * Q.height * 4 : Q.data.length; - Q.ref = o; - d && this.globalImageCache.addByteSize(o, Q.dataLen); - return this._sendImgData(u, Q, d); + imgData.dataLen = imgData.bitmap + ? imgData.width * imgData.height * 4 + : imgData.data.length; + imgData.ref = imageRef; + if (cacheGlobally) { + this.globalImageCache.addByteSize(imageRef, imgData.dataLen); + } + return this._sendImgData(objId, imgData, cacheGlobally); }) - .catch((e) => { - warn(`Unable to decode image "${u}": "${e}".`); - o && this.globalImageCache.addDecodeFailed(o); - return this._sendImgData(u, null, d); + .catch((reason) => { + warn(`Unable to decode image "${objId}": "${reason}".`); + if (imageRef) { + this.globalImageCache.addDecodeFailed(imageRef); + } + return this._sendImgData(objId, null, cacheGlobally); }); - if (s) { - const e = { objId: u, fn: Ve, args: E, optionalContent: l }; - r.set(s, o, e); - if (o) { - this._regionalImageCache.set(null, o, e); - d && - this.globalImageCache.setData(o, { - objId: u, - fn: Ve, - args: E, - optionalContent: l, + if (cacheKey) { + const cacheData = { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, + }; + localImageCache.set(cacheKey, imageRef, cacheData); + if (imageRef) { + this._regionalImageCache.set(null, imageRef, cacheData); + if (cacheGlobally) { + this.globalImageCache.setData(imageRef, { + objId, + fn: OPS.paintImageXObject, + args, + optionalContent, byteSize: 0, }); + } } } } - handleSMask(e, t, i, a, s, r) { - const n = e.get("G"), - g = { subtype: e.get("S").name, backdrop: e.get("BC") }, - o = e.get("TR"); - if (isPDFFunction(o)) { - const e = this._pdfFunctionFactory.create(o), - t = new Uint8Array(256), - i = new Float32Array(1); - for (let a = 0; a < 256; a++) { - i[0] = a / 255; - e(i, 0, i, 0); - t[a] = (255 * i[0]) | 0; + 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"); + if (isPDFFunction(transferObj)) { + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256); + const tmp = new Float32Array(1); + for (let i = 0; i < 256; i++) { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[i] = (tmp[0] * 255) | 0; } - g.transferMap = t; + smaskOptions.transferMap = transferMap; } - return this.buildFormXObject(t, n, g, i, a, s.state.clone(), r); + return this.buildFormXObject( + resources, + smaskContent, + smaskOptions, + operatorList, + task, + stateManager.state.clone(), + localColorSpaceCache, + ); } - handleTransferFunction(e) { - let t; - if (Array.isArray(e)) t = e; - else { - if (!isPDFFunction(e)) return null; - t = [e]; + handleTransferFunction(tr) { + let transferArray; + if (Array.isArray(tr)) { + transferArray = tr; + } else if (isPDFFunction(tr)) { + transferArray = [tr]; + } else { + return null; } - const i = []; - let a = 0, - s = 0; - for (const e of t) { - const t = this.xref.fetchIfRef(e); - a++; - if (isName(t, "Identity")) { - i.push(null); + const transferMaps = []; + let numFns = 0, + numEffectfulFns = 0; + for (const entry of transferArray) { + const transferObj = this.xref.fetchIfRef(entry); + numFns++; + if (isName(transferObj, "Identity")) { + transferMaps.push(null); continue; + } else if (!isPDFFunction(transferObj)) { + return null; } - if (!isPDFFunction(t)) return null; - const r = this._pdfFunctionFactory.create(t), - n = new Uint8Array(256), - g = new Float32Array(1); - for (let e = 0; e < 256; e++) { - g[0] = e / 255; - r(g, 0, g, 0); - n[e] = (255 * g[0]) | 0; + const transferFn = this._pdfFunctionFactory.create(transferObj); + const transferMap = new Uint8Array(256), + tmp = new Float32Array(1); + for (let j = 0; j < 256; j++) { + tmp[0] = j / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[j] = (tmp[0] * 255) | 0; } - i.push(n); - s++; + transferMaps.push(transferMap); + numEffectfulFns++; } - return (1 !== a && 4 !== a) || 0 === s ? null : i; + if (!(numFns === 1 || numFns === 4)) { + return null; + } + if (numEffectfulFns === 0) { + return null; + } + return transferMaps; } - handleTilingType(e, t, i, a, s, r, n, g) { - const o = new OperatorList(), - c = Dict.merge({ xref: this.xref, dictArray: [s.get("Resources"), i] }); + handleTilingType( + fn, + color, + resources, + pattern, + patternDict, + operatorList, + task, + localTilingPatternCache, + ) { + const tilingOpList = new OperatorList(); + const patternResources = Dict.merge({ + xref: this.xref, + dictArray: [patternDict.get("Resources"), resources], + }); return this.getOperatorList({ - stream: a, - task: n, - resources: c, - operatorList: o, + stream: pattern, + task, + resources: patternResources, + operatorList: tilingOpList, }) .then(function () { - const i = o.getIR(), - a = getTilingPatternIR(i, s, t); - r.addDependencies(o.dependencies); - r.addOp(e, a); - s.objId && g.set(null, s.objId, { operatorListIR: i, dict: s }); - }) - .catch((e) => { - if (!(e instanceof AbortException)) { - if (!this.options.ignoreErrors) throw e; - warn(`handleTilingType - ignoring pattern: "${e}".`); + const operatorListIR = tilingOpList.getIR(); + const tilingPatternIR = getTilingPatternIR( + operatorListIR, + patternDict, + color, + ); + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, tilingPatternIR); + if (patternDict.objId) { + localTilingPatternCache.set(null, patternDict.objId, { + operatorListIR, + dict: patternDict, + }); } + }) + .catch((reason) => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { + warn(`handleTilingType - ignoring pattern: "${reason}".`); + return; + } + throw reason; }); } - async handleSetFont(e, t, i, a, s, r, n = null, g = null) { - const o = t?.[0] instanceof Name ? t[0].name : null; - let c = await this.loadFont(o, i, e, n, g); - if (c.font.isType3Font) + async handleSetFont( + resources, + fontArgs, + fontRef, + operatorList, + task, + state, + fallbackFontDict = null, + cssFontInfo = null, + ) { + const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; + let translated = await this.loadFont( + fontName, + fontRef, + resources, + fallbackFontDict, + cssFontInfo, + ); + if (translated.font.isType3Font) { try { - await c.loadType3Data(this, e, s); - a.addDependencies(c.type3Dependencies); - } catch (e) { - c = new TranslatedFont({ + await translated.loadType3Data(this, resources, task); + operatorList.addDependencies(translated.type3Dependencies); + } catch (reason) { + translated = new TranslatedFont({ loadedName: "g_font_error", - font: new ErrorFont(`Type3 font load error: ${e}`), - dict: c.font, + font: new ErrorFont(`Type3 font load error: ${reason}`), + dict: translated.font, evaluatorOptions: this.options, }); } - r.font = c.font; - c.send(this.handler); - return c.loadedName; - } - handleText(e, t) { - const i = t.font, - a = i.charsToGlyphs(e); - if (i.data) { - (!!(t.textRenderingMode & w) || - "Pattern" === t.fillColorSpace.name || - i.disableFontFace || - this.options.disableFontFace) && - PartialEvaluator.buildFontPaths(i, a, this.handler, this.options); } - return a; + state.font = translated.font; + translated.send(this.handler); + return translated.loadedName; } - ensureStateFont(e) { - if (e.font) return; - const t = new FormatError( + handleText(chars, state) { + const font = state.font; + const glyphs = font.charsToGlyphs(chars); + if (font.data) { + const isAddToPathSet = !!( + state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG + ); + if ( + isAddToPathSet || + state.fillColorSpace.name === "Pattern" || + font.disableFontFace || + this.options.disableFontFace + ) { + PartialEvaluator.buildFontPaths( + font, + glyphs, + this.handler, + this.options, + ); + } + } + return glyphs; + } + ensureStateFont(state) { + if (state.font) { + return; + } + const reason = new FormatError( "Missing setFont (Tf) operator before text rendering operator.", ); - if (!this.options.ignoreErrors) throw t; - warn(`ensureStateFont: "${t}".`); + if (this.options.ignoreErrors) { + warn(`ensureStateFont: "${reason}".`); + return; + } + throw reason; } async setGState({ - resources: e, - gState: t, - operatorList: i, - cacheKey: a, - task: s, - stateManager: r, - localGStateCache: n, - localColorSpaceCache: g, + resources, + gState, + operatorList, + cacheKey, + task, + stateManager, + localGStateCache, + localColorSpaceCache, }) { - const o = t.objId; - let c = !0; - const C = []; - let h = Promise.resolve(); - for (const a of t.getKeys()) { - const n = t.get(a); - switch (a) { + const gStateRef = gState.objId; + let isSimpleGState = true; + const gStateObj = []; + let promise = Promise.resolve(); + for (const key of gState.getKeys()) { + const value = gState.get(key); + switch (key) { case "Type": break; case "LW": @@ -34223,34 +40438,52 @@ class PartialEvaluator { case "FL": case "CA": case "ca": - C.push([a, n]); + gStateObj.push([key, value]); break; case "Font": - c = !1; - h = h.then(() => - this.handleSetFont(e, null, n[0], i, s, r.state).then(function (e) { - i.addDependency(e); - C.push([a, [e, n[1]]]); + isSimpleGState = false; + promise = promise.then(() => + 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": - C.push([a, normalizeBlendMode(n)]); + gStateObj.push([key, normalizeBlendMode(value)]); break; case "SMask": - if (isName(n, "None")) { - C.push([a, !1]); + if (isName(value, "None")) { + gStateObj.push([key, false]); break; } - if (n instanceof Dict) { - c = !1; - h = h.then(() => this.handleSMask(n, e, i, s, r, g)); - C.push([a, !0]); - } else warn("Unsupported SMask type"); + if (value instanceof Dict) { + isSimpleGState = false; + promise = promise.then(() => + this.handleSMask( + value, + resources, + operatorList, + task, + stateManager, + localColorSpaceCache, + ), + ); + gStateObj.push([key, true]); + } else { + warn("Unsupported SMask type"); + } break; case "TR": - const t = this.handleTransferFunction(n); - C.push([a, t]); + const transferMaps = this.handleTransferFunction(value); + gStateObj.push([key, transferMaps]); break; case "OP": case "op": @@ -34265,2244 +40498,2978 @@ class PartialEvaluator { case "SA": case "AIS": case "TK": - info("graphic state operator " + a); + info("graphic state operator " + key); break; default: - info("Unknown graphic state operator " + a); + info("Unknown graphic state operator " + key); + break; } } - await h; - C.length > 0 && i.addOp(NA, [C]); - c && n.set(a, o, C); + await promise; + if (gStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [gStateObj]); + } + if (isSimpleGState) { + localGStateCache.set(cacheKey, gStateRef, gStateObj); + } } - loadFont(e, t, i, a = null, s = null) { - const errorFont = async () => - new TranslatedFont({ + loadFont( + fontName, + font, + resources, + fallbackFontDict = null, + cssFontInfo = null, + ) { + const errorFont = async () => { + return new TranslatedFont({ loadedName: "g_font_error", - font: new ErrorFont(`Font "${e}" is not available.`), - dict: t, + font: new ErrorFont(`Font "${fontName}" is not available.`), + dict: font, evaluatorOptions: this.options, }); - let r; - if (t) t instanceof Ref && (r = t); - else { - const t = i.get("Font"); - t && (r = t.getRaw(e)); - } - if (r) { - if (this.type3FontRefs?.has(r)) return errorFont(); - if (this.fontCache.has(r)) return this.fontCache.get(r); - try { - t = this.xref.fetchIfRef(r); - } catch (e) { - warn(`loadFont - lookup failed: "${e}".`); + }; + let fontRef; + if (font) { + if (font instanceof Ref) { + fontRef = font; + } + } else { + const fontRes = resources.get("Font"); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); } } - if (!(t instanceof Dict)) { + if (fontRef) { + if (this.type3FontRefs?.has(fontRef)) { + return errorFont(); + } + if (this.fontCache.has(fontRef)) { + return this.fontCache.get(fontRef); + } + try { + font = this.xref.fetchIfRef(fontRef); + } catch (ex) { + warn(`loadFont - lookup failed: "${ex}".`); + } + } + if (!(font instanceof Dict)) { if (!this.options.ignoreErrors && !this.parsingType3Font) { - warn(`Font "${e}" is not available.`); + warn(`Font "${fontName}" is not available.`); return errorFont(); } warn( - `Font "${e}" is not available -- attempting to fallback to a default font.`, + `Font "${fontName}" is not available -- attempting to fallback to a default font.`, ); - t = a || PartialEvaluator.fallbackFontDict; + font = fallbackFontDict || PartialEvaluator.fallbackFontDict; } - if (t.cacheKey && this.fontCache.has(t.cacheKey)) - return this.fontCache.get(t.cacheKey); - const { promise: n, resolve: g } = Promise.withResolvers(); - let o; + if (font.cacheKey && this.fontCache.has(font.cacheKey)) { + return this.fontCache.get(font.cacheKey); + } + const { promise, resolve } = Promise.withResolvers(); + let preEvaluatedFont; try { - o = this.preEvaluateFont(t); - o.cssFontInfo = s; - } catch (e) { - warn(`loadFont - preEvaluateFont failed: "${e}".`); + preEvaluatedFont = this.preEvaluateFont(font); + preEvaluatedFont.cssFontInfo = cssFontInfo; + } catch (reason) { + warn(`loadFont - preEvaluateFont failed: "${reason}".`); return errorFont(); } - const { descriptor: c, hash: C } = o, - h = r instanceof Ref; - let l; - if (C && c instanceof Dict) { - const e = (c.fontAliases ||= Object.create(null)); - if (e[C]) { - const t = e[C].aliasRef; - if (h && t && this.fontCache.has(t)) { - this.fontCache.putAlias(r, t); - return this.fontCache.get(r); + const { descriptor, hash } = preEvaluatedFont; + const fontRefIsRef = fontRef instanceof Ref; + let fontID; + if (hash && descriptor instanceof Dict) { + const fontAliases = (descriptor.fontAliases ||= Object.create(null)); + if (fontAliases[hash]) { + const aliasFontRef = fontAliases[hash].aliasRef; + if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { + this.fontCache.putAlias(fontRef, aliasFontRef); + return this.fontCache.get(fontRef); } - } else e[C] = { fontID: this.idFactory.createFontId() }; - h && (e[C].aliasRef = r); - l = e[C].fontID; - } else l = this.idFactory.createFontId(); - assert(l?.startsWith("f"), 'The "fontID" must be (correctly) defined.'); - if (h) this.fontCache.put(r, n); - else { - t.cacheKey = `cacheKey_${l}`; - this.fontCache.put(t.cacheKey, n); + } else { + fontAliases[hash] = { + fontID: this.idFactory.createFontId(), + }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } else { + fontID = this.idFactory.createFontId(); } - t.loadedName = `${this.idFactory.getDocId()}_${l}`; - this.translateFont(o) - .then((e) => { - g( + assert( + fontID?.startsWith("f"), + 'The "fontID" must be (correctly) defined.', + ); + if (fontRefIsRef) { + this.fontCache.put(fontRef, promise); + } else { + font.cacheKey = `cacheKey_${fontID}`; + this.fontCache.put(font.cacheKey, promise); + } + font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; + this.translateFont(preEvaluatedFont) + .then((translatedFont) => { + resolve( new TranslatedFont({ - loadedName: t.loadedName, - font: e, - dict: t, + loadedName: font.loadedName, + font: translatedFont, + dict: font, evaluatorOptions: this.options, }), ); }) - .catch((e) => { - warn(`loadFont - translateFont failed: "${e}".`); - g( + .catch((reason) => { + warn(`loadFont - translateFont failed: "${reason}".`); + resolve( new TranslatedFont({ - loadedName: t.loadedName, - font: new ErrorFont(e instanceof Error ? e.message : e), - dict: t, + loadedName: font.loadedName, + font: new ErrorFont( + reason instanceof Error ? reason.message : reason, + ), + dict: font, evaluatorOptions: this.options, }), ); }); - return n; + return promise; } - buildPath(e, t, i, a = !1) { - const s = e.length - 1; - i || (i = []); - if (s < 0 || e.fnArray[s] !== tt) { - if (a) { - warn(`Encountered path operator "${t}" inside of a text object.`); - e.addOp(GA, null); + buildPath(operatorList, fn, args, parsingText = false) { + const lastIndex = operatorList.length - 1; + if (!args) { + args = []; + } + if ( + lastIndex < 0 || + operatorList.fnArray[lastIndex] !== OPS.constructPath + ) { + if (parsingText) { + warn(`Encountered path operator "${fn}" inside of a text object.`); + operatorList.addOp(OPS.save, null); } - let s; - switch (t) { - case KA: - const e = i[0] + i[2], - t = i[1] + i[3]; - s = [ - Math.min(i[0], e), - Math.min(i[1], t), - Math.max(i[0], e), - Math.max(i[1], t), + let minMax; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax = [ + Math.min(args[0], x), + Math.min(args[1], y), + Math.max(args[0], x), + Math.max(args[1], y), ]; break; - case MA: - case LA: - s = [i[0], i[1], i[0], i[1]]; + case OPS.moveTo: + case OPS.lineTo: + minMax = [args[0], args[1], args[0], args[1]]; break; default: - s = [1 / 0, 1 / 0, -1 / 0, -1 / 0]; - } - e.addOp(tt, [[t], i, s]); - a && e.addOp(xA, null); - } else { - const a = e.argsArray[s]; - a[0].push(t); - a[1].push(...i); - const r = a[2]; - switch (t) { - case KA: - const e = i[0] + i[2], - t = i[1] + i[3]; - r[0] = Math.min(r[0], i[0], e); - r[1] = Math.min(r[1], i[1], t); - r[2] = Math.max(r[2], i[0], e); - r[3] = Math.max(r[3], i[1], t); + minMax = [Infinity, Infinity, -Infinity, -Infinity]; + break; + } + operatorList.addOp(OPS.constructPath, [[fn], args, minMax]); + if (parsingText) { + operatorList.addOp(OPS.restore, null); + } + } else { + const opArgs = operatorList.argsArray[lastIndex]; + opArgs[0].push(fn); + opArgs[1].push(...args); + const minMax = opArgs[2]; + switch (fn) { + case OPS.rectangle: + const x = args[0] + args[2]; + const y = args[1] + args[3]; + minMax[0] = Math.min(minMax[0], args[0], x); + minMax[1] = Math.min(minMax[1], args[1], y); + minMax[2] = Math.max(minMax[2], args[0], x); + minMax[3] = Math.max(minMax[3], args[1], y); + break; + case OPS.moveTo: + case OPS.lineTo: + minMax[0] = Math.min(minMax[0], args[0]); + minMax[1] = Math.min(minMax[1], args[1]); + minMax[2] = Math.max(minMax[2], args[0]); + minMax[3] = Math.max(minMax[3], args[1]); break; - case MA: - case LA: - r[0] = Math.min(r[0], i[0]); - r[1] = Math.min(r[1], i[1]); - r[2] = Math.max(r[2], i[0]); - r[3] = Math.max(r[3], i[1]); } } } - parseColorSpace({ cs: e, resources: t, localColorSpaceCache: i }) { + parseColorSpace({ cs, resources, localColorSpaceCache }) { return ColorSpace.parseAsync({ - cs: e, + cs, xref: this.xref, - resources: t, + resources, pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache: i, - }).catch((e) => { - if (e instanceof AbortException) return null; - if (this.options.ignoreErrors) { - warn(`parseColorSpace - ignoring ColorSpace: "${e}".`); + localColorSpaceCache, + }).catch((reason) => { + if (reason instanceof AbortException) { return null; } - throw e; + if (this.options.ignoreErrors) { + warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + return null; + } + throw reason; }); } parseShading({ - shading: e, - resources: t, - localColorSpaceCache: i, - localShadingPatternCache: a, + shading, + resources, + localColorSpaceCache, + localShadingPatternCache, }) { - let s, - r = a.get(e); - if (r) return r; + let id = localShadingPatternCache.get(shading); + if (id) { + return id; + } + let patternIR; try { - s = Pattern.parseShading( - e, + const shadingFill = Pattern.parseShading( + shading, this.xref, - t, + resources, this._pdfFunctionFactory, - i, - ).getIR(); - } catch (t) { - if (t instanceof AbortException) return null; - if (this.options.ignoreErrors) { - warn(`parseShading - ignoring shading: "${t}".`); - a.set(e, null); + localColorSpaceCache, + ); + patternIR = shadingFill.getIR(); + } catch (reason) { + if (reason instanceof AbortException) { return null; } - throw t; + if (this.options.ignoreErrors) { + warn(`parseShading - ignoring shading: "${reason}".`); + localShadingPatternCache.set(shading, null); + return null; + } + throw reason; } - r = `pattern_${this.idFactory.createObjId()}`; - this.parsingType3Font && (r = `${this.idFactory.getDocId()}_type3_${r}`); - a.set(e, r); - this.parsingType3Font - ? this.handler.send("commonobj", [r, "Pattern", s]) - : this.handler.send("obj", [r, this.pageIndex, "Pattern", s]); - return r; + id = `pattern_${this.idFactory.createObjId()}`; + if (this.parsingType3Font) { + id = `${this.idFactory.getDocId()}_type3_${id}`; + } + localShadingPatternCache.set(shading, id); + if (this.parsingType3Font) { + this.handler.send("commonobj", [id, "Pattern", patternIR]); + } else { + this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); + } + return id; } - handleColorN(e, t, i, a, s, r, n, g, o, c) { - const C = i.pop(); - if (C instanceof Name) { - const h = s.getRaw(C.name), - l = h instanceof Ref && o.getByRef(h); - if (l) + handleColorN( + operatorList, + fn, + args, + cs, + patterns, + resources, + task, + localColorSpaceCache, + localTilingPatternCache, + localShadingPatternCache, + ) { + const patternName = args.pop(); + if (patternName instanceof Name) { + const rawPattern = patterns.getRaw(patternName.name); + const localTilingPattern = + rawPattern instanceof Ref && + localTilingPatternCache.getByRef(rawPattern); + if (localTilingPattern) { try { - const s = a.base ? a.base.getRgb(i, 0) : null, - r = getTilingPatternIR(l.operatorListIR, l.dict, s); - e.addOp(t, r); - return; + const color = cs.base ? cs.base.getRgb(args, 0) : null; + const tilingPatternIR = getTilingPatternIR( + localTilingPattern.operatorListIR, + localTilingPattern.dict, + color, + ); + operatorList.addOp(fn, tilingPatternIR); + return undefined; } catch {} - const Q = this.xref.fetchIfRef(h); - if (Q) { - const s = Q instanceof BaseStream ? Q.dict : Q, - C = s.get("PatternType"); - if (C === Fs) { - const g = a.base ? a.base.getRgb(i, 0) : null; - return this.handleTilingType(t, g, r, Q, s, e, n, o); - } - if (C === Ss) { - const i = s.get("Shading"), - a = this.parseShading({ - shading: i, - resources: r, - localColorSpaceCache: g, - localShadingPatternCache: c, - }); - if (a) { - const i = lookupMatrix(s.getArray("Matrix"), null); - e.addOp(t, ["Shading", a, i]); + } + const pattern = this.xref.fetchIfRef(rawPattern); + if (pattern) { + const dict = pattern instanceof BaseStream ? 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, + localTilingPatternCache, + ); + } else if (typeNum === PatternType.SHADING) { + const shading = dict.get("Shading"); + const objId = this.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache, + }); + if (objId) { + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + operatorList.addOp(fn, ["Shading", objId, matrix]); } - return; + return undefined; } - throw new FormatError(`Unknown PatternType: ${C}`); + throw new FormatError(`Unknown PatternType: ${typeNum}`); } } - throw new FormatError(`Unknown PatternName: ${C}`); + throw new FormatError(`Unknown PatternName: ${patternName}`); } - _parseVisibilityExpression(e, t, i) { - if (++t > 10) { + _parseVisibilityExpression(array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { warn("Visibility expression is too deeply nested"); return; } - const a = e.length, - s = this.xref.fetchIfRef(e[0]); - if (!(a < 2) && s instanceof Name) { - switch (s.name) { - case "And": - case "Or": - case "Not": - i.push(s.name); - break; - default: - warn(`Invalid operator ${s.name} in visibility expression`); - return; - } - for (let s = 1; s < a; s++) { - const a = e[s], - r = this.xref.fetchIfRef(a); - if (Array.isArray(r)) { - const e = []; - i.push(e); - this._parseVisibilityExpression(r, t, e); - } else a instanceof Ref && i.push(a.toString()); - } - } else warn("Invalid visibility expression"); - } - async parseMarkedContentProps(e, t) { - let i; - if (e instanceof Name) { - i = t.get("Properties").get(e.name); - } else { - if (!(e instanceof Dict)) - throw new FormatError("Optional content properties malformed."); - i = e; + const length = array.length; + const operator = this.xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof Name)) { + warn("Invalid visibility expression"); + return; } - const a = i.get("Type")?.name; - if ("OCG" === a) return { type: a, id: i.objId }; - if ("OCMD" === a) { - const e = i.get("VE"); - if (Array.isArray(e)) { - const t = []; - this._parseVisibilityExpression(e, 0, t); - if (t.length > 0) return { type: "OCMD", expression: t }; + switch (operator.name) { + case "And": + case "Or": + case "Not": + currentResult.push(operator.name); + break; + default: + warn(`Invalid operator ${operator.name} in visibility expression`); + return; + } + for (let i = 1; i < length; i++) { + const raw = array[i]; + const object = this.xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + this._parseVisibilityExpression(object, nestingCounter, nestedResult); + } else if (raw instanceof Ref) { + currentResult.push(raw.toString()); } - const t = i.get("OCGs"); - if (Array.isArray(t) || t instanceof Dict) { - const e = []; - if (Array.isArray(t)) for (const i of t) e.push(i.toString()); - else e.push(t.objId); + } + } + async parseMarkedContentProps(contentProperties, resources) { + let optionalContent; + if (contentProperties instanceof Name) { + const properties = resources.get("Properties"); + optionalContent = properties.get(contentProperties.name); + } else if (contentProperties instanceof Dict) { + optionalContent = contentProperties; + } else { + throw new FormatError("Optional content properties malformed."); + } + const optionalContentType = optionalContent.get("Type")?.name; + if (optionalContentType === "OCG") { + return { + type: optionalContentType, + id: optionalContent.objId, + }; + } else if (optionalContentType === "OCMD") { + const expression = optionalContent.get("VE"); + if (Array.isArray(expression)) { + const result = []; + this._parseVisibilityExpression(expression, 0, result); + if (result.length > 0) { + return { + type: "OCMD", + expression: result, + }; + } + } + const optionalContentGroups = optionalContent.get("OCGs"); + if ( + Array.isArray(optionalContentGroups) || + optionalContentGroups instanceof Dict + ) { + const groupIds = []; + if (Array.isArray(optionalContentGroups)) { + for (const ocg of optionalContentGroups) { + groupIds.push(ocg.toString()); + } + } else { + groupIds.push(optionalContentGroups.objId); + } return { - type: a, - ids: e, - policy: i.get("P") instanceof Name ? i.get("P").name : null, + type: optionalContentType, + ids: groupIds, + policy: + optionalContent.get("P") instanceof Name + ? optionalContent.get("P").name + : null, expression: null, }; + } else if (optionalContentGroups instanceof Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString(), + }; } - if (t instanceof Ref) return { type: a, id: t.toString() }; } return null; } getOperatorList({ - stream: e, - task: t, - resources: i, - operatorList: a, - initialState: s = null, - fallbackFontDict: r = null, + stream, + task, + resources, + operatorList, + initialState = null, + fallbackFontDict = null, }) { - i ||= Dict.empty; - s ||= new EvalState(); - if (!a) + resources ||= Dict.empty; + initialState ||= new EvalState(); + if (!operatorList) { throw new Error('getOperatorList: missing "operatorList" parameter'); - const n = this, - g = this.xref; - let o = !1; - const c = new LocalImageCache(), - C = new LocalColorSpaceCache(), - h = new LocalGStateCache(), - l = new LocalTilingPatternCache(), - Q = new Map(), - E = i.get("XObject") || Dict.empty, - u = i.get("Pattern") || Dict.empty, - d = new StateManager(s), - f = new EvaluatorPreprocessor(e, g, d), - p = new TimeSlotManager(); - function closePendingRestoreOPS(e) { - for (let e = 0, t = f.savedStatesDepth; e < t; e++) a.addOp(xA, []); } - return new Promise(function promiseBody(e, s) { - const next = function (t) { - Promise.all([t, a.ready]).then(function () { + const self = this; + const xref = this.xref; + let parsingText = false; + const localImageCache = new LocalImageCache(); + const localColorSpaceCache = new LocalColorSpaceCache(); + const localGStateCache = new LocalGStateCache(); + const localTilingPatternCache = new LocalTilingPatternCache(); + const localShadingPatternCache = new Map(); + const xobjs = resources.get("XObject") || Dict.empty; + const patterns = resources.get("Pattern") || Dict.empty; + const stateManager = new StateManager(initialState); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + const timeSlotManager = new TimeSlotManager(); + function closePendingRestoreOPS(argument) { + for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(OPS.restore, []); + } + } + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + Promise.all([promise, operatorList.ready]).then(function () { try { - promiseBody(e, s); - } catch (e) { - s(e); + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); } - }, s); + }, reject); }; - t.ensureNotTerminated(); - p.reset(); - const m = {}; - let y, w, D, b, F, S; - for (; !(y = p.check()); ) { - m.args = null; - if (!f.read(m)) break; - let e = m.args, - s = m.fn; - switch (0 | s) { - case Ue: - S = e[0] instanceof Name; - F = e[0].name; - if (S) { - const t = c.getByName(F); - if (t) { - addLocallyCachedImageOps(a, t); - e = null; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, i, ii, cs, name, isValidName; + while (!(stop = timeSlotManager.check())) { + operation.args = null; + if (!preprocessor.read(operation)) { + break; + } + let args = operation.args; + let fn = operation.fn; + switch (fn | 0) { + case OPS.paintXObject: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localImage = localImageCache.getByName(name); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; continue; } } next( - new Promise(function (e, s) { - if (!S) + new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { throw new FormatError("XObject must be referred to by name."); - let r = E.getRaw(F); - if (r instanceof Ref) { - const t = c.getByRef(r) || n._regionalImageCache.getByRef(r); - if (t) { - addLocallyCachedImageOps(a, t); - e(); - return; - } - const i = n.globalImageCache.getData(r, n.pageIndex); - if (i) { - a.addDependency(i.objId); - a.addImageOps(i.fn, i.args, i.optionalContent); - e(); - return; - } - r = g.fetch(r); } - if (!(r instanceof BaseStream)) + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + const localImage = + localImageCache.getByRef(xobj) || + self._regionalImageCache.getByRef(xobj); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData( + xobj, + self.pageIndex, + ); + if (globalImage) { + operatorList.addDependency(globalImage.objId); + operatorList.addImageOps( + globalImage.fn, + globalImage.args, + globalImage.optionalContent, + ); + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { throw new FormatError("XObject should be a stream"); - const o = r.dict.get("Subtype"); - if (!(o instanceof Name)) + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { throw new FormatError("XObject should have a Name subtype"); - if ("Form" !== o.name) - if ("Image" !== o.name) { - if ("PS" !== o.name) - throw new FormatError( - `Unhandled XObject subtype ${o.name}`, - ); - info("Ignored XObject subtype PS"); - e(); - } else - n.buildPaintImageXObject({ - resources: i, - image: r, - operatorList: a, - cacheKey: F, - localImageCache: c, - localColorSpaceCache: C, - }).then(e, s); - else { - d.save(); - n.buildFormXObject(i, r, null, a, t, d.state.clone(), C).then( - function () { - d.restore(); - e(); - }, - s, + } + 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") { + info("Ignored XObject subtype PS"); + } else { + throw new FormatError( + `Unhandled XObject subtype ${type.name}`, ); } - }).catch(function (e) { - if (!(e instanceof AbortException)) { - if (!n.options.ignoreErrors) throw e; - warn(`getOperatorList - ignoring XObject: "${e}".`); + resolveXObject(); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring XObject: "${reason}".`); + return; + } + throw reason; }), ); return; - case se: - var k = e[1]; + case OPS.setFont: + var fontSize = args[1]; next( - n.handleSetFont(i, e, null, a, t, d.state, r).then(function (e) { - a.addDependency(e); - a.addOp(se, [e, k]); - }), + self + .handleSetFont( + resources, + args, + null, + operatorList, + task, + stateManager.state, + fallbackFontDict, + ) + .then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(OPS.setFont, [loadedName, fontSize]); + }), ); return; - case $A: - o = !0; + case OPS.beginText: + parsingText = true; break; - case Ae: - o = !1; + case OPS.endText: + parsingText = false; break; - case xe: - var R = e[0].cacheKey; - if (R) { - const t = c.getByName(R); - if (t) { - addLocallyCachedImageOps(a, t); - e = null; + case OPS.endInlineImage: + var cacheKey = args[0].cacheKey; + if (cacheKey) { + const localImage = localImageCache.getByName(cacheKey); + if (localImage) { + addLocallyCachedImageOps(operatorList, localImage); + args = null; continue; } } next( - n.buildPaintImageXObject({ - resources: i, - image: e[0], - isInline: !0, - operatorList: a, - cacheKey: R, - localImageCache: c, - localColorSpaceCache: C, + self.buildPaintImageXObject({ + resources, + image: args[0], + isInline: true, + operatorList, + cacheKey, + localImageCache, + localColorSpaceCache, }), ); return; - case Ce: - if (!d.state.font) { - n.ensureStateFont(d.state); + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - e[0] = n.handleText(e[0], d.state); + args[0] = self.handleText(args[0], stateManager.state); break; - case he: - if (!d.state.font) { - n.ensureStateFont(d.state); + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - var N = [], - G = d.state; - for (const t of e[0]) - "string" == typeof t - ? N.push(...n.handleText(t, G)) - : "number" == typeof t && N.push(t); - e[0] = N; - s = Ce; - break; - case Be: - if (!d.state.font) { - n.ensureStateFont(d.state); - continue; - } - a.addOp(ce); - e[0] = n.handleText(e[0], d.state); - s = Ce; - break; - case le: - if (!d.state.font) { - n.ensureStateFont(d.state); - continue; - } - a.addOp(ce); - a.addOp(te, [e.shift()]); - a.addOp(ee, [e.shift()]); - e[0] = n.handleText(e[0], d.state); - s = Ce; - break; - case re: - d.state.textRenderingMode = e[0]; - break; - case de: { - const t = ColorSpace.getCached(e[0], g, C); - if (t) { - d.state.fillColorSpace = t; - continue; - } - next( - n - .parseColorSpace({ - cs: e[0], - resources: i, - localColorSpaceCache: C, - }) - .then(function (e) { - e && (d.state.fillColorSpace = e); - }), - ); - return; - } - case ue: { - const t = ColorSpace.getCached(e[0], g, C); - if (t) { - d.state.strokeColorSpace = t; - continue; - } - next( - n - .parseColorSpace({ - cs: e[0], - resources: i, - localColorSpaceCache: C, - }) - .then(function (e) { - e && (d.state.strokeColorSpace = e); - }), - ); - return; - } - case me: - b = d.state.fillColorSpace; - e = b.getRgb(e, 0); - s = Fe; - break; - case fe: - b = d.state.strokeColorSpace; - e = b.getRgb(e, 0); - s = be; - break; - case De: - d.state.fillColorSpace = ColorSpace.singletons.gray; - e = ColorSpace.singletons.gray.getRgb(e, 0); - s = Fe; - break; - case we: - d.state.strokeColorSpace = ColorSpace.singletons.gray; - e = ColorSpace.singletons.gray.getRgb(e, 0); - s = be; - break; - case ke: - d.state.fillColorSpace = ColorSpace.singletons.cmyk; - e = ColorSpace.singletons.cmyk.getRgb(e, 0); - s = Fe; - break; - case Se: - d.state.strokeColorSpace = ColorSpace.singletons.cmyk; - e = ColorSpace.singletons.cmyk.getRgb(e, 0); - s = be; - break; - case Fe: - d.state.fillColorSpace = ColorSpace.singletons.rgb; - e = ColorSpace.singletons.rgb.getRgb(e, 0); - break; - case be: - d.state.strokeColorSpace = ColorSpace.singletons.rgb; - e = ColorSpace.singletons.rgb.getRgb(e, 0); - break; - case ye: - b = d.state.fillColorSpace; - if ("Pattern" === b.name) { - next(n.handleColorN(a, ye, e, b, u, i, t, C, l, Q)); - return; - } - e = b.getRgb(e, 0); - s = Fe; - break; - case pe: - b = d.state.strokeColorSpace; - if ("Pattern" === b.name) { - next(n.handleColorN(a, pe, e, b, u, i, t, C, l, Q)); - return; - } - e = b.getRgb(e, 0); - s = be; - break; - case Re: - var x = i.get("Shading"); - if (!x) throw new FormatError("No shading resource found"); - var U = x.get(e[0].name); - if (!U) throw new FormatError("No shading object found"); - const f = n.parseShading({ - shading: U, - resources: i, - localColorSpaceCache: C, - localShadingPatternCache: Q, - }); - if (!f) continue; - e = [f]; - s = Re; - break; - case NA: - S = e[0] instanceof Name; - F = e[0].name; - if (S) { - const t = h.getByName(F); - if (t) { - t.length > 0 && a.addOp(NA, [t]); - e = null; - continue; + var combinedGlyphs = []; + var state = stateManager.state; + for (const arrItem of args[0]) { + if (typeof arrItem === "string") { + combinedGlyphs.push(...self.handleText(arrItem, state)); + } else if (typeof arrItem === "number") { + combinedGlyphs.push(arrItem); } } - next( - new Promise(function (e, s) { - if (!S) - throw new FormatError("GState must be referred to by name."); - const r = i.get("ExtGState"); - if (!(r instanceof Dict)) - throw new FormatError("ExtGState should be a dictionary."); - const g = r.get(F); - if (!(g instanceof Dict)) - throw new FormatError("GState should be a dictionary."); - n.setGState({ - resources: i, - gState: g, - operatorList: a, - cacheKey: F, - task: t, - stateManager: d, - localGStateCache: h, - localColorSpaceCache: C, - }).then(e, s); - }).catch(function (e) { - if (!(e instanceof AbortException)) { - if (!n.options.ignoreErrors) throw e; - warn(`getOperatorList - ignoring ExtGState: "${e}".`); - } - }), - ); - return; - case MA: - case LA: - case HA: - case JA: - case YA: - case vA: - case KA: - n.buildPath(a, s, e, o); - continue; - case Me: - case Le: - case ve: - case Ke: - continue; - case Je: - if (!(e[0] instanceof Name)) { - warn(`Expected name for beginMarkedContentProps arg0=${e[0]}`); - a.addOp(Je, ["OC", null]); + args[0] = combinedGlyphs; + fn = OPS.showText; + break; + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - if ("OC" === e[0].name) { + operatorList.addOp(OPS.nextLine); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); + continue; + } + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.setTextRenderingMode: + stateManager.state.textRenderingMode = args[0]; + break; + case OPS.setFillColorSpace: { + const cachedColorSpace = ColorSpace.getCached( + args[0], + xref, + localColorSpaceCache, + ); + if (cachedColorSpace) { + stateManager.state.fillColorSpace = cachedColorSpace; + continue; + } + next( + self + .parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache, + }) + .then(function (colorSpace) { + stateManager.state.fillColorSpace = + colorSpace || ColorSpace.singletons.gray; + }), + ); + return; + } + case OPS.setStrokeColorSpace: { + const cachedColorSpace = ColorSpace.getCached( + args[0], + xref, + localColorSpaceCache, + ); + if (cachedColorSpace) { + stateManager.state.strokeColorSpace = cachedColorSpace; + continue; + } + next( + self + .parseColorSpace({ + cs: args[0], + resources, + localColorSpaceCache, + }) + .then(function (colorSpace) { + stateManager.state.strokeColorSpace = + colorSpace || ColorSpace.singletons.gray; + }), + ); + return; + } + case OPS.setFillColor: + cs = stateManager.state.fillColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColor: + cs = stateManager.state.strokeColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillGray: + stateManager.state.fillColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeGray: + stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillCMYKColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeCMYKColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillRGBColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setStrokeRGBColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setFillColorN: + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + } + args = []; + fn = OPS.setFillTransparent; + break; + } + if (cs.name === "Pattern") { next( - n - .parseMarkedContentProps(e[1], i) - .then((e) => { - a.addOp(Je, ["OC", e]); + self.handleColorN( + operatorList, + OPS.setFillColorN, + args, + cs, + patterns, + resources, + task, + localColorSpaceCache, + localTilingPatternCache, + localShadingPatternCache, + ), + ); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColorN: + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + } + args = []; + fn = OPS.setStrokeTransparent; + break; + } + if (cs.name === "Pattern") { + next( + self.handleColorN( + operatorList, + OPS.setStrokeColorN, + args, + cs, + patterns, + resources, + task, + localColorSpaceCache, + localTilingPatternCache, + localShadingPatternCache, + ), + ); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.shadingFill: + let shading; + try { + const shadingRes = resources.get("Shading"); + if (!shadingRes) { + throw new FormatError("No shading resource found"); + } + shading = shadingRes.get(args[0].name); + if (!shading) { + throw new FormatError("No shading object found"); + } + } catch (reason) { + if (reason instanceof AbortException) { + continue; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring Shading: "${reason}".`); + continue; + } + throw reason; + } + const patternId = self.parseShading({ + shading, + resources, + localColorSpaceCache, + localShadingPatternCache, + }); + if (!patternId) { + continue; + } + args = [patternId]; + fn = OPS.shadingFill; + break; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName) { + const localGStateObj = localGStateCache.getByName(name); + if (localGStateObj) { + if (localGStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [localGStateObj]); + } + args = null; + continue; + } + } + next( + new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { + throw new FormatError("GState must be referred to by name."); + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { + throw new FormatError("ExtGState should be a dictionary."); + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { + throw new FormatError("GState should be a dictionary."); + } + self + .setGState({ + resources, + gState, + operatorList, + cacheKey: name, + task, + stateManager, + localGStateCache, + localColorSpaceCache, }) - .catch((e) => { - if (!(e instanceof AbortException)) { - if (!n.options.ignoreErrors) throw e; - warn( - `getOperatorList - ignoring beginMarkedContentProps: "${e}".`, - ); - a.addOp(Je, ["OC", null]); + .then(resolveGState, rejectGState); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; + }), + ); + return; + case OPS.moveTo: + case OPS.lineTo: + case OPS.curveTo: + case OPS.curveTo2: + case OPS.curveTo3: + case OPS.closePath: + case OPS.rectangle: + self.buildPath(operatorList, fn, args, parsingText); + continue; + case OPS.markPoint: + case OPS.markPointProps: + case OPS.beginCompat: + case OPS.endCompat: + continue; + case OPS.beginMarkedContentProps: + if (!(args[0] instanceof Name)) { + warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`); + operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); + continue; + } + if (args[0].name === "OC") { + next( + self + .parseMarkedContentProps(args[1], resources) + .then((data) => { + operatorList.addOp(OPS.beginMarkedContentProps, [ + "OC", + data, + ]); + }) + .catch((reason) => { + if (reason instanceof AbortException) { + return; } + if (self.options.ignoreErrors) { + warn( + `getOperatorList - ignoring beginMarkedContentProps: "${reason}".`, + ); + operatorList.addOp(OPS.beginMarkedContentProps, [ + "OC", + null, + ]); + return; + } + throw reason; }), ); return; } - e = [e[0].name, e[1] instanceof Dict ? e[1].get("MCID") : null]; + args = [ + args[0].name, + args[1] instanceof Dict ? args[1].get("MCID") : null, + ]; break; + case OPS.beginMarkedContent: + case OPS.endMarkedContent: default: - if (null !== e) { - for (w = 0, D = e.length; w < D && !(e[w] instanceof Dict); w++); - if (w < D) { - warn("getOperatorList - ignoring operator: " + s); + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof Dict) { + break; + } + } + if (i < ii) { + warn("getOperatorList - ignoring operator: " + fn); continue; } } } - a.addOp(s, e); + operatorList.addOp(fn, args); } - if (y) next(ks); - else { - closePendingRestoreOPS(); - e(); + if (stop) { + next(deferred); + return; } - }).catch((e) => { - if (!(e instanceof AbortException)) { - if (!this.options.ignoreErrors) throw e; + closePendingRestoreOPS(); + resolve(); + }).catch((reason) => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { warn( - `getOperatorList - ignoring errors during "${t.name}" task: "${e}".`, + `getOperatorList - ignoring errors during "${task.name}" ` + + `task: "${reason}".`, ); closePendingRestoreOPS(); + return; } + throw reason; }); } getTextContent({ - stream: e, - task: t, - resources: s, - stateManager: r = null, - includeMarkedContent: n = !1, - sink: g, - seenStyles: o = new Set(), - viewBox: c, - lang: C = null, - markedContentData: h = null, - disableNormalization: l = !1, - keepWhiteSpace: Q = !1, + stream, + task, + resources, + stateManager = null, + includeMarkedContent = false, + sink, + seenStyles = new Set(), + viewBox, + lang = null, + markedContentData = null, + disableNormalization = false, + keepWhiteSpace = false, }) { - s ||= Dict.empty; - r ||= new StateManager(new TextState()); - n && (h ||= { level: 0 }); - const E = { items: [], styles: Object.create(null), lang: C }, - u = { - initialized: !1, - str: [], - totalWidth: 0, - totalHeight: 0, - width: 0, - height: 0, - vertical: !1, - prevTransform: null, - textAdvanceScale: 0, - spaceInFlowMin: 0, - spaceInFlowMax: 0, - trackingSpaceMin: 1 / 0, - negativeSpaceMax: -1 / 0, - notASpace: -1 / 0, - transform: null, - fontName: null, - hasEOL: !1, - }, - d = [" ", " "]; - let f = 0; - function saveLastChar(e) { - const t = (f + 1) % 2, - i = " " !== d[f] && " " === d[t]; - d[f] = e; - f = t; - return !Q && i; + resources ||= Dict.empty; + stateManager ||= new StateManager(new TextState()); + if (includeMarkedContent) { + markedContentData ||= { + level: 0, + }; + } + const textContent = { + items: [], + styles: Object.create(null), + lang, + }; + const textContentItem = { + initialized: false, + str: [], + totalWidth: 0, + totalHeight: 0, + width: 0, + height: 0, + vertical: false, + prevTransform: null, + textAdvanceScale: 0, + spaceInFlowMin: 0, + spaceInFlowMax: 0, + trackingSpaceMin: Infinity, + negativeSpaceMax: -Infinity, + notASpace: -Infinity, + transform: null, + fontName: null, + hasEOL: false, + }; + const twoLastChars = [" ", " "]; + let twoLastCharsPos = 0; + function saveLastChar(char) { + const nextPos = (twoLastCharsPos + 1) % 2; + const ret = + twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; + twoLastChars[twoLastCharsPos] = char; + twoLastCharsPos = nextPos; + return !keepWhiteSpace && ret; } function shouldAddWhitepsace() { - return !Q && " " !== d[f] && " " === d[(f + 1) % 2]; + return ( + !keepWhiteSpace && + twoLastChars[twoLastCharsPos] !== " " && + twoLastChars[(twoLastCharsPos + 1) % 2] === " " + ); } function resetLastChars() { - d[0] = d[1] = " "; - f = 0; + twoLastChars[0] = twoLastChars[1] = " "; + twoLastCharsPos = 0; } - const p = this, - m = this.xref, - y = []; - let w = null; - const D = new LocalImageCache(), - b = new LocalGStateCache(), - F = new EvaluatorPreprocessor(e, m, r); - let S; + const TRACKING_SPACE_FACTOR = 0.102; + const NOT_A_SPACE_FACTOR = 0.03; + const NEGATIVE_SPACE_FACTOR = -0.2; + const SPACE_IN_FLOW_MIN_FACTOR = 0.102; + const SPACE_IN_FLOW_MAX_FACTOR = 0.6; + const VERTICAL_SHIFT_RATIO = 0.25; + const self = this; + const xref = this.xref; + const showSpacedTextBuffer = []; + let xobjs = null; + const emptyXObjectCache = new LocalImageCache(); + const emptyGStateCache = new LocalGStateCache(); + const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + let textState; function pushWhitespace({ - width: e = 0, - height: t = 0, - transform: i = u.prevTransform, - fontName: a = u.fontName, + width = 0, + height = 0, + transform = textContentItem.prevTransform, + fontName = textContentItem.fontName, }) { - E.items.push({ + textContent.items.push({ str: " ", dir: "ltr", - width: e, - height: t, - transform: i, - fontName: a, - hasEOL: !1, + width, + height, + transform, + fontName, + hasEOL: false, }); } function getCurrentTextTransform() { - const e = S.font, - t = [S.fontSize * S.textHScale, 0, 0, S.fontSize, 0, S.textRise]; + const font = textState.font; + const tsm = [ + textState.fontSize * textState.textHScale, + 0, + 0, + textState.fontSize, + 0, + textState.textRise, + ]; if ( - e.isType3Font && - (S.fontSize <= 1 || e.isCharBBox) && - !isArrayEqual(S.fontMatrix, a) + font.isType3Font && + (textState.fontSize <= 1 || font.isCharBBox) && + !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX) ) { - const i = e.bbox[3] - e.bbox[1]; - i > 0 && (t[3] *= i * S.fontMatrix[3]); + const glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + tsm[3] *= glyphHeight * textState.fontMatrix[3]; + } } - return Util.transform(S.ctm, Util.transform(S.textMatrix, t)); + return Util.transform( + textState.ctm, + Util.transform(textState.textMatrix, tsm), + ); } function ensureTextContentItem() { - if (u.initialized) return u; - const { font: e, loadedName: t } = S; - if (!o.has(t)) { - o.add(t); - E.styles[t] = { - fontFamily: e.fallbackName, - ascent: e.ascent, - descent: e.descent, - vertical: e.vertical, + if (textContentItem.initialized) { + return textContentItem; + } + const { font, loadedName } = textState; + if (!seenStyles.has(loadedName)) { + seenStyles.add(loadedName); + textContent.styles[loadedName] = { + fontFamily: font.fallbackName, + ascent: font.ascent, + descent: font.descent, + vertical: font.vertical, }; - if (p.options.fontExtraProperties && e.systemFontInfo) { - const i = E.styles[t]; - i.fontSubstitution = e.systemFontInfo.css; - i.fontSubstitutionLoadedName = e.systemFontInfo.loadedName; + if (self.options.fontExtraProperties && font.systemFontInfo) { + const style = textContent.styles[loadedName]; + style.fontSubstitution = font.systemFontInfo.css; + style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; } } - u.fontName = t; - const i = (u.transform = getCurrentTextTransform()); - if (e.vertical) { - u.width = u.totalWidth = Math.hypot(i[0], i[1]); - u.height = u.totalHeight = 0; - u.vertical = !0; + textContentItem.fontName = loadedName; + const trm = (textContentItem.transform = getCurrentTextTransform()); + if (!font.vertical) { + textContentItem.width = textContentItem.totalWidth = 0; + textContentItem.height = textContentItem.totalHeight = Math.hypot( + trm[2], + trm[3], + ); + textContentItem.vertical = false; } else { - u.width = u.totalWidth = 0; - u.height = u.totalHeight = Math.hypot(i[2], i[3]); - u.vertical = !1; + textContentItem.width = textContentItem.totalWidth = Math.hypot( + trm[0], + trm[1], + ); + textContentItem.height = textContentItem.totalHeight = 0; + textContentItem.vertical = true; } - const a = Math.hypot(S.textLineMatrix[0], S.textLineMatrix[1]), - s = Math.hypot(S.ctm[0], S.ctm[1]); - u.textAdvanceScale = s * a; - const { fontSize: r } = S; - u.trackingSpaceMin = 0.102 * r; - u.notASpace = 0.03 * r; - u.negativeSpaceMax = -0.2 * r; - u.spaceInFlowMin = 0.102 * r; - u.spaceInFlowMax = 0.6 * r; - u.hasEOL = !1; - u.initialized = !0; - return u; + const scaleLineX = Math.hypot( + textState.textLineMatrix[0], + textState.textLineMatrix[1], + ); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; + const { fontSize } = textState; + textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; + textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; + textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; + textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; + textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; + textContentItem.hasEOL = false; + textContentItem.initialized = true; + return textContentItem; } function updateAdvanceScale() { - if (!u.initialized) return; - const e = Math.hypot(S.textLineMatrix[0], S.textLineMatrix[1]), - t = Math.hypot(S.ctm[0], S.ctm[1]) * e; - if (t !== u.textAdvanceScale) { - if (u.vertical) { - u.totalHeight += u.height * u.textAdvanceScale; - u.height = 0; - } else { - u.totalWidth += u.width * u.textAdvanceScale; - u.width = 0; - } - u.textAdvanceScale = t; + if (!textContentItem.initialized) { + return; } + const scaleLineX = Math.hypot( + textState.textLineMatrix[0], + textState.textLineMatrix[1], + ); + const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); + const scaleFactor = scaleCtmX * scaleLineX; + if (scaleFactor === textContentItem.textAdvanceScale) { + return; + } + 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; } - function runBidiTransform(e) { - let t = e.str.join(""); - l || - (t = (function normalizeUnicode(e) { - if (!ot) { - ot = - /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; - It = new Map([["ſt", "ſt"]]); - } - return e.replaceAll(ot, (e, t, i) => - t ? t.normalize("NFKC") : It.get(i), - ); - })(t)); - const i = bidi(t, -1, e.vertical); + function runBidiTransform(textChunk) { + let text = textChunk.str.join(""); + if (!disableNormalization) { + text = normalizeUnicode(text); + } + const bidiResult = bidi(text, -1, textChunk.vertical); return { - str: i.str, - dir: i.dir, - width: Math.abs(e.totalWidth), - height: Math.abs(e.totalHeight), - transform: e.transform, - fontName: e.fontName, - hasEOL: e.hasEOL, + str: bidiResult.str, + dir: bidiResult.dir, + width: Math.abs(textChunk.totalWidth), + height: Math.abs(textChunk.totalHeight), + transform: textChunk.transform, + fontName: textChunk.fontName, + hasEOL: textChunk.hasEOL, }; } - async function handleSetFont(e, i) { - const r = await p.loadFont(e, i, s); - if (r.font.isType3Font) + async function handleSetFont(fontName, fontRef) { + const translated = await self.loadFont(fontName, fontRef, resources); + if (translated.font.isType3Font) { try { - await r.loadType3Data(p, s, t); + await translated.loadType3Data(self, resources, task); } catch {} - S.loadedName = r.loadedName; - S.font = r.font; - S.fontMatrix = r.font.fontMatrix || a; + } + textState.loadedName = translated.loadedName; + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; } - function applyInverseRotation(e, t, i) { - const a = Math.hypot(i[0], i[1]); - return [(i[0] * e + i[1] * t) / a, (i[2] * e + i[3] * t) / a]; + function applyInverseRotation(x, y, matrix) { + const scale = Math.hypot(matrix[0], matrix[1]); + return [ + (matrix[0] * x + matrix[1] * y) / scale, + (matrix[2] * x + matrix[3] * y) / scale, + ]; } - function compareWithLastPosition(e) { - const t = getCurrentTextTransform(); - let i = t[4], - a = t[5]; - if (S.font?.vertical) { - if (i < c[0] || i > c[2] || a + e < c[1] || a > c[3]) return !1; - } else if (i + e < c[0] || i > c[2] || a < c[1] || a > c[3]) return !1; - if (!S.font || !u.prevTransform) return !0; - let s = u.prevTransform[4], - r = u.prevTransform[5]; - if (s === i && r === a) return !0; - let n = -1; - t[0] && 0 === t[1] && 0 === t[2] - ? (n = t[0] > 0 ? 0 : 180) - : t[1] && 0 === t[0] && 0 === t[3] && (n = t[1] > 0 ? 90 : 270); - switch (n) { + function compareWithLastPosition(glyphWidth) { + const currentTransform = getCurrentTextTransform(); + let posX = currentTransform[4]; + let posY = currentTransform[5]; + if (textState.font?.vertical) { + if ( + posX < viewBox[0] || + posX > viewBox[2] || + posY + glyphWidth < viewBox[1] || + posY > viewBox[3] + ) { + return false; + } + } else if ( + posX + glyphWidth < viewBox[0] || + posX > viewBox[2] || + posY < viewBox[1] || + posY > viewBox[3] + ) { + return false; + } + if (!textState.font || !textContentItem.prevTransform) { + return true; + } + let lastPosX = textContentItem.prevTransform[4]; + let lastPosY = textContentItem.prevTransform[5]; + if (lastPosX === posX && lastPosY === posY) { + return true; + } + let rotate = -1; + if ( + currentTransform[0] && + currentTransform[1] === 0 && + currentTransform[2] === 0 + ) { + rotate = currentTransform[0] > 0 ? 0 : 180; + } else if ( + currentTransform[1] && + currentTransform[0] === 0 && + currentTransform[3] === 0 + ) { + rotate = currentTransform[1] > 0 ? 90 : 270; + } + switch (rotate) { case 0: break; case 90: - [i, a] = [a, i]; - [s, r] = [r, s]; + [posX, posY] = [posY, posX]; + [lastPosX, lastPosY] = [lastPosY, lastPosX]; break; case 180: - [i, a, s, r] = [-i, -a, -s, -r]; + [posX, posY, lastPosX, lastPosY] = [ + -posX, + -posY, + -lastPosX, + -lastPosY, + ]; break; case 270: - [i, a] = [-a, -i]; - [s, r] = [-r, -s]; + [posX, posY] = [-posY, -posX]; + [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; break; default: - [i, a] = applyInverseRotation(i, a, t); - [s, r] = applyInverseRotation(s, r, u.prevTransform); + [posX, posY] = applyInverseRotation(posX, posY, currentTransform); + [lastPosX, lastPosY] = applyInverseRotation( + lastPosX, + lastPosY, + textContentItem.prevTransform, + ); } - if (S.font.vertical) { - const e = (r - a) / u.textAdvanceScale, - t = i - s, - n = Math.sign(u.height); - if (e < n * u.negativeSpaceMax) { - if (Math.abs(t) > 0.5 * u.width) { + if (textState.font.vertical) { + const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; + const advanceX = posX - lastPosX; + const textOrientation = Math.sign(textContentItem.height); + if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceX) > 0.5 * textContentItem.width) { appendEOL(); - return !0; + return true; } resetLastChars(); flushTextContentItem(); - return !0; + return true; } - if (Math.abs(t) > u.width) { + if (Math.abs(advanceX) > textContentItem.width) { appendEOL(); - return !0; + return true; } - e <= n * u.notASpace && resetLastChars(); - if (e <= n * u.trackingSpaceMin) + if (advanceY <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { if (shouldAddWhitepsace()) { resetLastChars(); flushTextContentItem(); - pushWhitespace({ height: Math.abs(e) }); - } else u.height += e; - else if (!addFakeSpaces(e, u.prevTransform, n)) - if (0 === u.str.length) { + pushWhitespace({ + height: Math.abs(advanceY), + }); + } else { + textContentItem.height += advanceY; + } + } else if ( + !addFakeSpaces( + advanceY, + textContentItem.prevTransform, + textOrientation, + ) + ) { + if (textContentItem.str.length === 0) { resetLastChars(); - pushWhitespace({ height: Math.abs(e) }); - } else u.height += e; - Math.abs(t) > 0.25 * u.width && flushTextContentItem(); - return !0; + pushWhitespace({ + height: Math.abs(advanceY), + }); + } else { + textContentItem.height += advanceY; + } + } + if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; } - const g = (i - s) / u.textAdvanceScale, - o = a - r, - C = Math.sign(u.width); - if (g < C * u.negativeSpaceMax) { - if (Math.abs(o) > 0.5 * u.height) { + const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; + const advanceY = posY - lastPosY; + const textOrientation = Math.sign(textContentItem.width); + if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { + if (Math.abs(advanceY) > 0.5 * textContentItem.height) { appendEOL(); - return !0; + return true; } resetLastChars(); flushTextContentItem(); - return !0; + return true; } - if (Math.abs(o) > u.height) { + if (Math.abs(advanceY) > textContentItem.height) { appendEOL(); - return !0; + return true; } - g <= C * u.notASpace && resetLastChars(); - if (g <= C * u.trackingSpaceMin) + if (advanceX <= textOrientation * textContentItem.notASpace) { + resetLastChars(); + } + if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { if (shouldAddWhitepsace()) { resetLastChars(); flushTextContentItem(); - pushWhitespace({ width: Math.abs(g) }); - } else u.width += g; - else if (!addFakeSpaces(g, u.prevTransform, C)) - if (0 === u.str.length) { + pushWhitespace({ + width: Math.abs(advanceX), + }); + } else { + textContentItem.width += advanceX; + } + } else if ( + !addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation) + ) { + if (textContentItem.str.length === 0) { resetLastChars(); - pushWhitespace({ width: Math.abs(g) }); - } else u.width += g; - Math.abs(o) > 0.25 * u.height && flushTextContentItem(); - return !0; + pushWhitespace({ + width: Math.abs(advanceX), + }); + } else { + textContentItem.width += advanceX; + } + } + if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { + flushTextContentItem(); + } + return true; } - function buildTextContentItem({ chars: e, extraSpacing: t }) { - const i = S.font; - if (!e) { - const e = S.charSpacing + t; - e && - (i.vertical - ? S.translateTextMatrix(0, -e) - : S.translateTextMatrix(e * S.textHScale, 0)); - Q && compareWithLastPosition(0); + function buildTextContentItem({ chars, extraSpacing }) { + const font = textState.font; + if (!chars) { + const charSpacing = textState.charSpacing + extraSpacing; + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix( + charSpacing * textState.textHScale, + 0, + ); + } else { + textState.translateTextMatrix(0, -charSpacing); + } + } + if (keepWhiteSpace) { + compareWithLastPosition(0); + } return; } - const a = i.charsToGlyphs(e), - s = S.fontMatrix[0] * S.fontSize; - for (let e = 0, r = a.length; e < r; e++) { - const n = a[e], - { category: g } = n; - if (g.isInvisibleFormatMark) continue; - let o = S.charSpacing + (e + 1 === r ? t : 0), - c = n.width; - i.vertical && (c = n.vmetric ? n.vmetric[0] : -c); - let C = c * s; - if (!Q && g.isWhitespace) { - if (i.vertical) { - o += -C + S.wordSpacing; - S.translateTextMatrix(0, -o); + const glyphs = font.charsToGlyphs(chars); + const scale = textState.fontMatrix[0] * textState.fontSize; + for (let i = 0, ii = glyphs.length; i < ii; i++) { + const glyph = glyphs[i]; + const { category } = glyph; + if (category.isInvisibleFormatMark) { + continue; + } + let charSpacing = + textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); + let glyphWidth = glyph.width; + if (font.vertical) { + glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; + } + let scaledDim = glyphWidth * scale; + if (!keepWhiteSpace && category.isWhitespace) { + if (!font.vertical) { + charSpacing += scaledDim + textState.wordSpacing; + textState.translateTextMatrix( + charSpacing * textState.textHScale, + 0, + ); } else { - o += C + S.wordSpacing; - S.translateTextMatrix(o * S.textHScale, 0); + charSpacing += -scaledDim + textState.wordSpacing; + textState.translateTextMatrix(0, -charSpacing); } saveLastChar(" "); continue; } - if (!g.isZeroWidthDiacritic && !compareWithLastPosition(C)) { - i.vertical - ? S.translateTextMatrix(0, C) - : S.translateTextMatrix(C * S.textHScale, 0); + if ( + !category.isZeroWidthDiacritic && + !compareWithLastPosition(scaledDim) + ) { + if (!font.vertical) { + textState.translateTextMatrix(scaledDim * textState.textHScale, 0); + } else { + textState.translateTextMatrix(0, scaledDim); + } continue; } - const h = ensureTextContentItem(); - g.isZeroWidthDiacritic && (C = 0); - if (i.vertical) { - S.translateTextMatrix(0, C); - C = Math.abs(C); - h.height += C; - } else { - C *= S.textHScale; - S.translateTextMatrix(C, 0); - h.width += C; + const textChunk = ensureTextContentItem(); + if (category.isZeroWidthDiacritic) { + scaledDim = 0; + } + if (!font.vertical) { + scaledDim *= textState.textHScale; + textState.translateTextMatrix(scaledDim, 0); + textChunk.width += scaledDim; + } else { + textState.translateTextMatrix(0, scaledDim); + scaledDim = Math.abs(scaledDim); + textChunk.height += scaledDim; + } + if (scaledDim) { + textChunk.prevTransform = getCurrentTextTransform(); + } + const glyphUnicode = glyph.unicode; + if (saveLastChar(glyphUnicode)) { + textChunk.str.push(" "); + } + textChunk.str.push(glyphUnicode); + if (charSpacing) { + if (!font.vertical) { + textState.translateTextMatrix( + charSpacing * textState.textHScale, + 0, + ); + } else { + textState.translateTextMatrix(0, -charSpacing); + } } - C && (h.prevTransform = getCurrentTextTransform()); - const l = n.unicode; - saveLastChar(l) && h.str.push(" "); - h.str.push(l); - o && - (i.vertical - ? S.translateTextMatrix(0, -o) - : S.translateTextMatrix(o * S.textHScale, 0)); } } function appendEOL() { resetLastChars(); - if (u.initialized) { - u.hasEOL = !0; + if (textContentItem.initialized) { + textContentItem.hasEOL = true; flushTextContentItem(); - } else - E.items.push({ + } else { + textContent.items.push({ str: "", dir: "ltr", width: 0, height: 0, transform: getCurrentTextTransform(), - fontName: S.loadedName, - hasEOL: !0, + fontName: textState.loadedName, + hasEOL: true, }); - } - function addFakeSpaces(e, t, i) { - if (i * u.spaceInFlowMin <= e && e <= i * u.spaceInFlowMax) { - if (u.initialized) { - resetLastChars(); - u.str.push(" "); - } - return !1; } - const a = u.fontName; - let s = 0; - if (u.vertical) { - s = e; - e = 0; + } + function addFakeSpaces(width, transf, textOrientation) { + if ( + textOrientation * textContentItem.spaceInFlowMin <= width && + width <= textOrientation * textContentItem.spaceInFlowMax + ) { + if (textContentItem.initialized) { + resetLastChars(); + textContentItem.str.push(" "); + } + return false; + } + const fontName = textContentItem.fontName; + let height = 0; + if (textContentItem.vertical) { + height = width; + width = 0; } flushTextContentItem(); resetLastChars(); pushWhitespace({ - width: Math.abs(e), - height: Math.abs(s), - transform: t || getCurrentTextTransform(), - fontName: a, + width: Math.abs(width), + height: Math.abs(height), + transform: transf || getCurrentTextTransform(), + fontName, }); - return !0; + return true; } function flushTextContentItem() { - if (u.initialized && u.str) { - u.vertical - ? (u.totalHeight += u.height * u.textAdvanceScale) - : (u.totalWidth += u.width * u.textAdvanceScale); - E.items.push(runBidiTransform(u)); - u.initialized = !1; - u.str.length = 0; + if (!textContentItem.initialized || !textContentItem.str) { + return; } - } - function enqueueChunk(e = !1) { - const t = E.items.length; - if (0 !== t && !(e && t < 10)) { - g.enqueue(E, t); - E.items = []; - E.styles = Object.create(null); + if (!textContentItem.vertical) { + textContentItem.totalWidth += + textContentItem.width * textContentItem.textAdvanceScale; + } else { + textContentItem.totalHeight += + textContentItem.height * textContentItem.textAdvanceScale; } + textContent.items.push(runBidiTransform(textContentItem)); + textContentItem.initialized = false; + textContentItem.str.length = 0; } - const k = new TimeSlotManager(); - return new Promise(function promiseBody(e, a) { - const next = function (t) { - enqueueChunk(!0); - Promise.all([t, g.ready]).then(function () { + function enqueueChunk(batch = false) { + const length = textContent.items.length; + if (length === 0) { + return; + } + if (batch && length < TEXT_CHUNK_BATCH_SIZE) { + return; + } + sink.enqueue(textContent, length); + textContent.items = []; + textContent.styles = Object.create(null); + } + const timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + const next = function (promise) { + enqueueChunk(true); + Promise.all([promise, sink.ready]).then(function () { try { - promiseBody(e, a); - } catch (e) { - a(e); + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); } - }, a); + }, reject); }; - t.ensureNotTerminated(); - k.reset(); - const u = {}; - let d, - f = []; - for (; !(d = k.check()); ) { - f.length = 0; - u.args = f; - if (!F.read(u)) break; - const e = S; - S = r.state; - const a = u.fn; - f = u.args; - switch (0 | a) { - case se: - var R = f[0].name, - N = f[1]; - if (S.font && R === S.fontName && N === S.fontSize) break; + task.ensureNotTerminated(); + timeSlotManager.reset(); + const operation = {}; + let stop, + args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + const previousState = textState; + textState = stateManager.state; + const fn = operation.fn; + args = operation.args; + switch (fn | 0) { + case OPS.setFont: + var fontNameArg = args[0].name, + fontSizeArg = args[1]; + if ( + textState.font && + fontNameArg === textState.fontName && + fontSizeArg === textState.fontSize + ) { + break; + } flushTextContentItem(); - S.fontName = R; - S.fontSize = N; - next(handleSetFont(R, null)); + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); return; - case ne: - S.textRise = f[0]; + case OPS.setTextRise: + textState.textRise = args[0]; break; - case ie: - S.textHScale = f[0] / 100; + case OPS.setHScale: + textState.textHScale = args[0] / 100; break; - case ae: - S.leading = f[0]; + case OPS.setLeading: + textState.leading = args[0]; break; - case ge: - S.translateTextLineMatrix(f[0], f[1]); - S.textMatrix = S.textLineMatrix.slice(); + case OPS.moveText: + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); break; - case oe: - S.leading = -f[1]; - S.translateTextLineMatrix(f[0], f[1]); - S.textMatrix = S.textLineMatrix.slice(); + case OPS.setLeadingMoveText: + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); break; - case ce: - S.carriageReturn(); + case OPS.nextLine: + textState.carriageReturn(); break; - case Ie: - S.setTextMatrix(f[0], f[1], f[2], f[3], f[4], f[5]); - S.setTextLineMatrix(f[0], f[1], f[2], f[3], f[4], f[5]); + case 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; - case ee: - S.charSpacing = f[0]; + case OPS.setCharSpacing: + textState.charSpacing = args[0]; break; - case te: - S.wordSpacing = f[0]; + case OPS.setWordSpacing: + textState.wordSpacing = args[0]; break; - case $A: - S.textMatrix = i.slice(); - S.textLineMatrix = i.slice(); + case OPS.beginText: + textState.textMatrix = IDENTITY_MATRIX.slice(); + textState.textLineMatrix = IDENTITY_MATRIX.slice(); break; - case he: - if (!r.state.font) { - p.ensureStateFont(r.state); + case OPS.showSpacedText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - const a = ((S.font.vertical ? 1 : -1) * S.fontSize) / 1e3, - u = f[0]; - for (let e = 0, t = u.length; e < t; e++) { - const t = u[e]; - if ("string" == typeof t) y.push(t); - else if ("number" == typeof t && 0 !== t) { - const e = y.join(""); - y.length = 0; - buildTextContentItem({ chars: e, extraSpacing: t * a }); + const spaceFactor = + ((textState.font.vertical ? 1 : -1) * textState.fontSize) / 1000; + const elements = args[0]; + for (let i = 0, ii = elements.length; i < ii; 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, + }); } } - if (y.length > 0) { - const e = y.join(""); - y.length = 0; - buildTextContentItem({ chars: e, extraSpacing: 0 }); + if (showSpacedTextBuffer.length > 0) { + const str = showSpacedTextBuffer.join(""); + showSpacedTextBuffer.length = 0; + buildTextContentItem({ + chars: str, + extraSpacing: 0, + }); } break; - case Ce: - if (!r.state.font) { - p.ensureStateFont(r.state); + case OPS.showText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - buildTextContentItem({ chars: f[0], extraSpacing: 0 }); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0, + }); break; - case Be: - if (!r.state.font) { - p.ensureStateFont(r.state); + case OPS.nextLineShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - S.carriageReturn(); - buildTextContentItem({ chars: f[0], extraSpacing: 0 }); + textState.carriageReturn(); + buildTextContentItem({ + chars: args[0], + extraSpacing: 0, + }); break; - case le: - if (!r.state.font) { - p.ensureStateFont(r.state); + case OPS.nextLineSetSpacingShowText: + if (!stateManager.state.font) { + self.ensureStateFont(stateManager.state); continue; } - S.wordSpacing = f[0]; - S.charSpacing = f[1]; - S.carriageReturn(); - buildTextContentItem({ chars: f[2], extraSpacing: 0 }); + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem({ + chars: args[2], + extraSpacing: 0, + }); break; - case Ue: + case OPS.paintXObject: flushTextContentItem(); - w || (w = s.get("XObject") || Dict.empty); - var G = f[0] instanceof Name, - x = f[0].name; - if (G && D.getByName(x)) break; + if (!xobjs) { + xobjs = resources.get("XObject") || Dict.empty; + } + var isValidName = args[0] instanceof Name; + var name = args[0].name; + if (isValidName && emptyXObjectCache.getByName(name)) { + break; + } next( - new Promise(function (e, i) { - if (!G) + new Promise(function (resolveXObject, rejectXObject) { + if (!isValidName) { throw new FormatError("XObject must be referred to by name."); - let a = w.getRaw(x); - if (a instanceof Ref) { - if (D.getByRef(a)) { - e(); - return; - } - if (p.globalImageCache.getData(a, p.pageIndex)) { - e(); - return; - } - a = m.fetch(a); } - if (!(a instanceof BaseStream)) + let xobj = xobjs.getRaw(name); + if (xobj instanceof Ref) { + if (emptyXObjectCache.getByRef(xobj)) { + resolveXObject(); + return; + } + const globalImage = self.globalImageCache.getData( + xobj, + self.pageIndex, + ); + if (globalImage) { + resolveXObject(); + return; + } + xobj = xref.fetch(xobj); + } + if (!(xobj instanceof BaseStream)) { throw new FormatError("XObject should be a stream"); - const E = a.dict.get("Subtype"); - if (!(E instanceof Name)) + } + const type = xobj.dict.get("Subtype"); + if (!(type instanceof Name)) { throw new FormatError("XObject should have a Name subtype"); - if ("Form" !== E.name) { - D.set(x, a.dict.objId, !0); - e(); + } + if (type.name !== "Form") { + emptyXObjectCache.set(name, xobj.dict.objId, true); + resolveXObject(); return; } - const u = r.state.clone(), - d = new StateManager(u), - f = lookupMatrix(a.dict.getArray("Matrix"), null); - f && d.transform(f); + const currentState = stateManager.state.clone(); + const xObjStateManager = new StateManager(currentState); + const matrix = lookupMatrix(xobj.dict.getArray("Matrix"), null); + if (matrix) { + xObjStateManager.transform(matrix); + } enqueueChunk(); - const y = { - enqueueInvoked: !1, - enqueue(e, t) { - this.enqueueInvoked = !0; - g.enqueue(e, t); + const sinkWrapper = { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink.enqueue(chunk, size); }, get desiredSize() { - return g.desiredSize; + return sink.desiredSize; }, get ready() { - return g.ready; + return sink.ready; }, }; - p.getTextContent({ - stream: a, - task: t, - resources: a.dict.get("Resources") || s, - stateManager: d, - includeMarkedContent: n, - sink: y, - seenStyles: o, - viewBox: c, - lang: C, - markedContentData: h, - disableNormalization: l, - keepWhiteSpace: Q, - }).then(function () { - y.enqueueInvoked || D.set(x, a.dict.objId, !0); - e(); - }, i); - }).catch(function (e) { - if (!(e instanceof AbortException)) { - if (!p.options.ignoreErrors) throw e; - warn(`getTextContent - ignoring XObject: "${e}".`); + self + .getTextContent({ + stream: xobj, + task, + resources: xobj.dict.get("Resources") || resources, + stateManager: xObjStateManager, + includeMarkedContent, + sink: sinkWrapper, + seenStyles, + viewBox, + lang, + markedContentData, + disableNormalization, + keepWhiteSpace, + }) + .then(function () { + if (!sinkWrapper.enqueueInvoked) { + emptyXObjectCache.set(name, xobj.dict.objId, true); + } + resolveXObject(); + }, rejectXObject); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring XObject: "${reason}".`); + return; + } + throw reason; }), ); return; - case NA: - G = f[0] instanceof Name; - x = f[0].name; - if (G && b.getByName(x)) break; + case OPS.setGState: + isValidName = args[0] instanceof Name; + name = args[0].name; + if (isValidName && emptyGStateCache.getByName(name)) { + break; + } next( - new Promise(function (e, t) { - if (!G) + new Promise(function (resolveGState, rejectGState) { + if (!isValidName) { throw new FormatError("GState must be referred to by name."); - const i = s.get("ExtGState"); - if (!(i instanceof Dict)) + } + const extGState = resources.get("ExtGState"); + if (!(extGState instanceof Dict)) { throw new FormatError("ExtGState should be a dictionary."); - const a = i.get(x); - if (!(a instanceof Dict)) + } + const gState = extGState.get(name); + if (!(gState instanceof Dict)) { throw new FormatError("GState should be a dictionary."); - const r = a.get("Font"); - if (r) { - flushTextContentItem(); - S.fontName = null; - S.fontSize = r[1]; - handleSetFont(null, r[0]).then(e, t); - } else { - b.set(x, a.objId, !0); - e(); } - }).catch(function (e) { - if (!(e instanceof AbortException)) { - if (!p.options.ignoreErrors) throw e; - warn(`getTextContent - ignoring ExtGState: "${e}".`); + const gStateFont = gState.get("Font"); + if (!gStateFont) { + emptyGStateCache.set(name, gState.objId, true); + resolveGState(); + return; } + flushTextContentItem(); + textState.fontName = null; + textState.fontSize = gStateFont[1]; + handleSetFont(null, gStateFont[0]).then( + resolveGState, + rejectGState, + ); + }).catch(function (reason) { + if (reason instanceof AbortException) { + return; + } + if (self.options.ignoreErrors) { + warn(`getTextContent - ignoring ExtGState: "${reason}".`); + return; + } + throw reason; }), ); return; - case He: + case OPS.beginMarkedContent: flushTextContentItem(); - if (n) { - h.level++; - E.items.push({ + if (includeMarkedContent) { + markedContentData.level++; + textContent.items.push({ type: "beginMarkedContent", - tag: f[0] instanceof Name ? f[0].name : null, + tag: args[0] instanceof Name ? args[0].name : null, }); } break; - case Je: + case OPS.beginMarkedContentProps: flushTextContentItem(); - if (n) { - h.level++; - let e = null; - f[1] instanceof Dict && (e = f[1].get("MCID")); - E.items.push({ + if (includeMarkedContent) { + markedContentData.level++; + let mcid = null; + if (args[1] instanceof Dict) { + mcid = args[1].get("MCID"); + } + textContent.items.push({ type: "beginMarkedContentProps", - id: Number.isInteger(e) - ? `${p.idFactory.getPageObjId()}_mc${e}` + id: Number.isInteger(mcid) + ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, - tag: f[0] instanceof Name ? f[0].name : null, + tag: args[0] instanceof Name ? args[0].name : null, }); } break; - case Ye: + case OPS.endMarkedContent: flushTextContentItem(); - if (n) { - if (0 === h.level) break; - h.level--; - E.items.push({ type: "endMarkedContent" }); + if (includeMarkedContent) { + if (markedContentData.level === 0) { + break; + } + markedContentData.level--; + textContent.items.push({ + type: "endMarkedContent", + }); } break; - case xA: - !e || - (e.font === S.font && - e.fontSize === S.fontSize && - e.fontName === S.fontName) || + case OPS.restore: + if ( + previousState && + (previousState.font !== textState.font || + previousState.fontSize !== textState.fontSize || + previousState.fontName !== textState.fontName) + ) { flushTextContentItem(); + } + break; } - if (E.items.length >= g.desiredSize) { - d = !0; + if (textContent.items.length >= sink.desiredSize) { + stop = true; break; } } - if (d) next(ks); - else { - flushTextContentItem(); - enqueueChunk(); - e(); + if (stop) { + next(deferred); + return; } - }).catch((e) => { - if (!(e instanceof AbortException)) { - if (!this.options.ignoreErrors) throw e; + flushTextContentItem(); + enqueueChunk(); + resolve(); + }).catch((reason) => { + if (reason instanceof AbortException) { + return; + } + if (this.options.ignoreErrors) { warn( - `getTextContent - ignoring errors during "${t.name}" task: "${e}".`, + `getTextContent - ignoring errors during "${task.name}" ` + + `task: "${reason}".`, ); flushTextContentItem(); enqueueChunk(); + return; } + throw reason; }); } - async extractDataStructures(e, t) { - const i = this.xref; - let a; - const s = this.readToUnicode(t.toUnicode); - if (t.composite) { - const i = e.get("CIDSystemInfo"); - i instanceof Dict && - (t.cidSystemInfo = { - registry: stringToPDFString(i.get("Registry")), - ordering: stringToPDFString(i.get("Ordering")), - supplement: i.get("Supplement"), - }); + async extractDataStructures(dict, properties) { + const xref = this.xref; + let cidToGidBytes; + const toUnicodePromise = this.readToUnicode(properties.toUnicode); + if (properties.composite) { + const cidSystemInfo = dict.get("CIDSystemInfo"); + if (cidSystemInfo instanceof Dict) { + properties.cidSystemInfo = { + registry: stringToPDFString(cidSystemInfo.get("Registry")), + ordering: stringToPDFString(cidSystemInfo.get("Ordering")), + supplement: cidSystemInfo.get("Supplement"), + }; + } try { - const t = e.get("CIDToGIDMap"); - t instanceof BaseStream && (a = t.getBytes()); - } catch (e) { - if (!this.options.ignoreErrors) throw e; - warn(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`); + const cidToGidMap = dict.get("CIDToGIDMap"); + if (cidToGidMap instanceof BaseStream) { + cidToGidBytes = cidToGidMap.getBytes(); + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); } } - const r = []; - let n, - g = null; - if (e.has("Encoding")) { - n = e.get("Encoding"); - if (n instanceof Dict) { - g = n.get("BaseEncoding"); - g = g instanceof Name ? g.name : null; - if (n.has("Differences")) { - const e = n.get("Differences"); - let t = 0; - for (const a of e) { - const e = i.fetchIfRef(a); - if ("number" == typeof e) t = e; - else { - if (!(e instanceof Name)) - throw new FormatError( - `Invalid entry in 'Differences' array: ${e}`, - ); - r[t++] = e.name; + const differences = []; + let baseEncodingName = null; + let encoding; + if (dict.has("Encoding")) { + encoding = dict.get("Encoding"); + if (encoding instanceof Dict) { + baseEncodingName = encoding.get("BaseEncoding"); + baseEncodingName = + baseEncodingName instanceof Name ? baseEncodingName.name : null; + if (encoding.has("Differences")) { + const diffEncoding = encoding.get("Differences"); + let index = 0; + for (const entry of diffEncoding) { + const data = xref.fetchIfRef(entry); + if (typeof data === "number") { + index = data; + } else if (data instanceof Name) { + differences[index++] = data.name; + } else { + throw new FormatError( + `Invalid entry in 'Differences' array: ${data}`, + ); } } } - } else if (n instanceof Name) g = n.name; - else { - const e = "Encoding is not a Name nor a Dict"; - if (!this.options.ignoreErrors) throw new FormatError(e); - warn(e); + } else if (encoding instanceof Name) { + baseEncodingName = encoding.name; + } else { + const msg = "Encoding is not a Name nor a Dict"; + if (!this.options.ignoreErrors) { + throw new FormatError(msg); + } + warn(msg); } - "MacRomanEncoding" !== g && - "MacExpertEncoding" !== g && - "WinAnsiEncoding" !== g && - (g = null); - } - const o = !t.file || t.isInternalFont, - c = Zi()[t.name]; - g && o && c && (g = null); - if (g) t.defaultEncoding = getEncoding(g); - else { - const e = !!(t.flags & Ti), - i = !!(t.flags & qi); - n = fi; - "TrueType" !== t.type || i || (n = pi); - if (e || c) { - n = di; - o && - (/Symbol/i.test(t.name) - ? (n = mi) - : /Dingbats/i.test(t.name) - ? (n = yi) - : /Wingdings/i.test(t.name) && (n = pi)); + if ( + baseEncodingName !== "MacRomanEncoding" && + baseEncodingName !== "MacExpertEncoding" && + baseEncodingName !== "WinAnsiEncoding" + ) { + baseEncodingName = null; } - t.defaultEncoding = n; } - t.differences = r; - t.baseEncodingName = g; - t.hasEncoding = !!g || r.length > 0; - t.dict = e; - t.toUnicode = await s; - const C = await this.buildToUnicode(t); - t.toUnicode = C; - a && (t.cidToGidMap = this.readCidToGidMap(a, C)); - return t; + const nonEmbeddedFont = !properties.file || properties.isInternalFont, + isSymbolsFontName = getSymbolsFonts()[properties.name]; + if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { + baseEncodingName = null; + } + if (baseEncodingName) { + properties.defaultEncoding = getEncoding(baseEncodingName); + } else { + const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + encoding = StandardEncoding; + if (properties.type === "TrueType" && !isNonsymbolicFont) { + encoding = WinAnsiEncoding; + } + if (isSymbolicFont || isSymbolsFontName) { + encoding = MacRomanEncoding; + if (nonEmbeddedFont) { + if (/Symbol/i.test(properties.name)) { + encoding = SymbolSetEncoding; + } else if (/Dingbats/i.test(properties.name)) { + encoding = ZapfDingbatsEncoding; + } else if (/Wingdings/i.test(properties.name)) { + encoding = WinAnsiEncoding; + } + } + } + properties.defaultEncoding = encoding; + } + properties.differences = differences; + properties.baseEncodingName = baseEncodingName; + properties.hasEncoding = !!baseEncodingName || differences.length > 0; + properties.dict = dict; + properties.toUnicode = await toUnicodePromise; + const builtToUnicode = await this.buildToUnicode(properties); + properties.toUnicode = builtToUnicode; + if (cidToGidBytes) { + properties.cidToGidMap = this.readCidToGidMap( + cidToGidBytes, + builtToUnicode, + ); + } + return properties; } - _simpleFontToUnicode(e, t = !1) { - assert(!e.composite, "Must be a simple font."); - const i = [], - a = e.defaultEncoding.slice(), - s = e.baseEncodingName, - r = e.differences; - for (const e in r) { - const t = r[e]; - ".notdef" !== t && (a[e] = t); - } - const n = Ni(); - for (const r in a) { - let g = a[r]; - if ("" === g) continue; - let o = n[g]; - if (void 0 !== o) { - i[r] = String.fromCharCode(o); + _simpleFontToUnicode(properties, forceGlyphs = false) { + assert(!properties.composite, "Must be a simple font."); + const toUnicode = []; + const encoding = properties.defaultEncoding.slice(); + const baseEncodingName = properties.baseEncodingName; + const differences = properties.differences; + for (const charcode in differences) { + const glyphName = differences[charcode]; + if (glyphName === ".notdef") { continue; } - let c = 0; - switch (g[0]) { + encoding[charcode] = glyphName; + } + const glyphsUnicodeMap = getGlyphsUnicode(); + for (const charcode in encoding) { + let glyphName = encoding[charcode]; + if (glyphName === "") { + continue; + } + let unicode = glyphsUnicodeMap[glyphName]; + if (unicode !== undefined) { + toUnicode[charcode] = String.fromCharCode(unicode); + continue; + } + let code = 0; + switch (glyphName[0]) { case "G": - 3 === g.length && (c = parseInt(g.substring(1), 16)); + if (glyphName.length === 3) { + code = parseInt(glyphName.substring(1), 16); + } break; case "g": - 5 === g.length && (c = parseInt(g.substring(1), 16)); + if (glyphName.length === 5) { + code = parseInt(glyphName.substring(1), 16); + } break; case "C": case "c": - if (g.length >= 3 && g.length <= 4) { - const i = g.substring(1); - if (t) { - c = parseInt(i, 16); + if (glyphName.length >= 3 && glyphName.length <= 4) { + const codeStr = glyphName.substring(1); + if (forceGlyphs) { + code = parseInt(codeStr, 16); break; } - c = +i; - if (Number.isNaN(c) && Number.isInteger(parseInt(i, 16))) - return this._simpleFontToUnicode(e, !0); + code = +codeStr; + if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { + return this._simpleFontToUnicode(properties, true); + } } break; case "u": - o = getUnicodeForGlyph(g, n); - -1 !== o && (c = o); + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } break; default: - switch (g) { + switch (glyphName) { case "f_h": case "f_t": case "T_h": - i[r] = g.replaceAll("_", ""); + toUnicode[charcode] = glyphName.replaceAll("_", ""); continue; } + break; } - if (c > 0 && c <= 1114111 && Number.isInteger(c)) { - if (s && c === +r) { - const e = getEncoding(s); - if (e && (g = e[r])) { - i[r] = String.fromCharCode(n[g]); + if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { + if (baseEncodingName && code === +charcode) { + const baseEncoding = getEncoding(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode[charcode] = String.fromCharCode( + glyphsUnicodeMap[glyphName], + ); continue; } } - i[r] = String.fromCodePoint(c); + toUnicode[charcode] = String.fromCodePoint(code); } } - return i; + return toUnicode; } - async buildToUnicode(e) { - e.hasIncludedToUnicodeMap = e.toUnicode?.length > 0; - if (e.hasIncludedToUnicodeMap) { - !e.composite && - e.hasEncoding && - (e.fallbackToUnicode = this._simpleFontToUnicode(e)); - return e.toUnicode; + async buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0; + if (properties.hasIncludedToUnicodeMap) { + if (!properties.composite && properties.hasEncoding) { + properties.fallbackToUnicode = this._simpleFontToUnicode(properties); + } + return properties.toUnicode; + } + if (!properties.composite) { + return new ToUnicodeMap(this._simpleFontToUnicode(properties)); } - if (!e.composite) return new ToUnicodeMap(this._simpleFontToUnicode(e)); if ( - e.composite && - ((e.cMap.builtInCMap && !(e.cMap instanceof IdentityCMap)) || - ("Adobe" === e.cidSystemInfo?.registry && - ("GB1" === e.cidSystemInfo.ordering || - "CNS1" === e.cidSystemInfo.ordering || - "Japan1" === e.cidSystemInfo.ordering || - "Korea1" === e.cidSystemInfo.ordering))) + properties.composite && + ((properties.cMap.builtInCMap && + !(properties.cMap instanceof IdentityCMap)) || + (properties.cidSystemInfo?.registry === "Adobe" && + (properties.cidSystemInfo.ordering === "GB1" || + properties.cidSystemInfo.ordering === "CNS1" || + properties.cidSystemInfo.ordering === "Japan1" || + properties.cidSystemInfo.ordering === "Korea1"))) ) { - const { registry: t, ordering: i } = e.cidSystemInfo, - a = Name.get(`${t}-${i}-UCS2`), - s = await CMapFactory.create({ - encoding: a, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }), - r = [], - n = []; - e.cMap.forEach(function (e, t) { - if (t > 65535) throw new FormatError("Max size of CID is 65,535"); - const i = s.lookup(t); - if (i) { - n.length = 0; - for (let e = 0, t = i.length; e < t; e += 2) - n.push((i.charCodeAt(e) << 8) + i.charCodeAt(e + 1)); - r[e] = String.fromCharCode(...n); - } - }); - return new ToUnicodeMap(r); - } - return new IdentityToUnicodeMap(e.firstChar, e.lastChar); - } - async readToUnicode(e) { - if (!e) return null; - if (e instanceof Name) { - const t = await CMapFactory.create({ - encoding: e, + const { registry, ordering } = properties.cidSystemInfo; + const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); + const ucs2CMap = await CMapFactory.create({ + encoding: ucs2CMapName, fetchBuiltInCMap: this._fetchBuiltInCMapBound, useCMap: null, }); - return t instanceof IdentityCMap - ? new IdentityToUnicodeMap(0, 65535) - : new ToUnicodeMap(t.getMap()); + const toUnicode = [], + buf = []; + properties.cMap.forEach(function (charcode, cid) { + if (cid > 0xffff) { + throw new FormatError("Max size of CID is 65,535"); + } + const ucs2 = ucs2CMap.lookup(cid); + if (ucs2) { + buf.length = 0; + for (let i = 0, ii = ucs2.length; i < ii; i += 2) { + buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); + } + toUnicode[charcode] = String.fromCharCode(...buf); + } + }); + return new ToUnicodeMap(toUnicode); } - if (e instanceof BaseStream) + return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); + } + async readToUnicode(cmapObj) { + if (!cmapObj) { + return null; + } + if (cmapObj instanceof Name) { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null, + }); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + return new ToUnicodeMap(cmap.getMap()); + } + if (cmapObj instanceof BaseStream) { try { - const t = await CMapFactory.create({ - encoding: e, + const cmap = await CMapFactory.create({ + encoding: cmapObj, fetchBuiltInCMap: this._fetchBuiltInCMapBound, useCMap: null, }); - if (t instanceof IdentityCMap) - return new IdentityToUnicodeMap(0, 65535); - const i = new Array(t.length); - t.forEach(function (e, t) { - if ("number" == typeof t) { - i[e] = String.fromCodePoint(t); + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + const map = new Array(cmap.length); + cmap.forEach(function (charCode, token) { + if (typeof token === "number") { + map[charCode] = String.fromCodePoint(token); return; } - const a = []; - for (let e = 0; e < t.length; e += 2) { - const i = (t.charCodeAt(e) << 8) | t.charCodeAt(e + 1); - if (55296 != (63488 & i)) { - a.push(i); + if (token.length % 2 !== 0) { + token = "\u0000" + token; + } + const str = []; + for (let k = 0; k < token.length; k += 2) { + const w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + str.push(w1); continue; } - e += 2; - const s = (t.charCodeAt(e) << 8) | t.charCodeAt(e + 1); - a.push(((1023 & i) << 10) + (1023 & s) + 65536); + k += 2; + const w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); } - i[e] = String.fromCodePoint(...a); + map[charCode] = String.fromCodePoint(...str); }); - return new ToUnicodeMap(i); - } catch (e) { - if (e instanceof AbortException) return null; - if (this.options.ignoreErrors) { - warn(`readToUnicode - ignoring ToUnicode data: "${e}".`); + return new ToUnicodeMap(map); + } catch (reason) { + if (reason instanceof AbortException) { return null; } - throw e; + if (this.options.ignoreErrors) { + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; } + } return null; } - readCidToGidMap(e, t) { - const i = []; - for (let a = 0, s = e.length; a < s; a++) { - const s = (e[a++] << 8) | e[a], - r = a >> 1; - (0 !== s || t.has(r)) && (i[r] = s); + readCidToGidMap(glyphsData, toUnicode) { + const result = []; + for (let j = 0, jj = glyphsData.length; j < jj; j++) { + const glyphID = (glyphsData[j++] << 8) | glyphsData[j]; + const code = j >> 1; + if (glyphID === 0 && !toUnicode.has(code)) { + continue; + } + result[code] = glyphID; } - return i; + return result; } - extractWidths(e, t, i) { - const a = this.xref; - let s = [], - r = 0; - const n = []; - let g; - if (i.composite) { - const t = e.get("DW"); - r = "number" == typeof t ? Math.ceil(t) : 1e3; - const o = e.get("W"); - if (Array.isArray(o)) - for (let e = 0, t = o.length; e < t; e++) { - let t = a.fetchIfRef(o[e++]); - if (!Number.isInteger(t)) break; - const i = a.fetchIfRef(o[e]); - if (Array.isArray(i)) - for (const e of i) { - const i = a.fetchIfRef(e); - "number" == typeof i && (s[t] = i); - t++; - } - else { - if (!Number.isInteger(i)) break; - { - const r = a.fetchIfRef(o[++e]); - if ("number" != typeof r) continue; - for (let e = t; e <= i; e++) s[e] = r; - } - } - } - if (i.vertical) { - const t = e.getArray("DW2"); - let i = isNumberArray(t, 2) ? t : [880, -1e3]; - g = [i[1], 0.5 * r, i[0]]; - i = e.get("W2"); - if (Array.isArray(i)) - for (let e = 0, t = i.length; e < t; e++) { - let t = a.fetchIfRef(i[e++]); - if (!Number.isInteger(t)) break; - const s = a.fetchIfRef(i[e]); - if (Array.isArray(s)) - for (let e = 0, i = s.length; e < i; e++) { - const i = [ - a.fetchIfRef(s[e++]), - a.fetchIfRef(s[e++]), - a.fetchIfRef(s[e]), - ]; - isNumberArray(i, null) && (n[t] = i); - t++; - } - else { - if (!Number.isInteger(s)) break; - { - const r = [ - a.fetchIfRef(i[++e]), - a.fetchIfRef(i[++e]), - a.fetchIfRef(i[++e]), - ]; - if (!isNumberArray(r, null)) continue; - for (let e = t; e <= s; e++) n[e] = r; - } - } - } - } - } else { - const n = e.get("Widths"); - if (Array.isArray(n)) { - let e = i.firstChar; - for (const t of n) { - const i = a.fetchIfRef(t); - "number" == typeof i && (s[e] = i); - e++; - } - const g = t.get("MissingWidth"); - r = "number" == typeof g ? g : 0; - } else { - const t = e.get("BaseFont"); - if (t instanceof Name) { - const e = this.getBaseFontMetrics(t.name); - s = this.buildCharCodeToWidth(e.widths, i); - r = e.defaultWidth; - } - } - } - let o = !0, - c = r; - for (const e in s) { - const t = s[e]; - if (t) - if (c) { - if (c !== t) { - o = !1; + extractWidths(dict, descriptor, properties) { + const xref = this.xref; + let glyphsWidths = []; + let defaultWidth = 0; + const glyphsVMetrics = []; + let defaultVMetrics; + if (properties.composite) { + const dw = dict.get("DW"); + defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; + const widths = dict.get("W"); + if (Array.isArray(widths)) { + for (let i = 0, ii = widths.length; i < ii; i++) { + let start = xref.fetchIfRef(widths[i++]); + if (!Number.isInteger(start)) { break; } - } else c = t; - } - o ? (i.flags |= vi) : (i.flags &= ~vi); - i.defaultWidth = r; - i.widths = s; - i.defaultVMetrics = g; - i.vmetrics = n; - } - isSerifFont(e) { - const t = e.split("-", 1)[0]; - return t in Xi() || /serif/gi.test(t); - } - getBaseFontMetrics(e) { - let t = 0, - i = Object.create(null), - a = !1; - let s = Pi()[e] || e; - const r = Aa(); - s in r || (s = this.isSerifFont(e) ? "Times-Roman" : "Helvetica"); - const n = r[s]; - if ("number" == typeof n) { - t = n; - a = !0; - } else i = n(); - return { defaultWidth: t, monospace: a, widths: i }; - } - buildCharCodeToWidth(e, t) { - const i = Object.create(null), - a = t.differences, - s = t.defaultEncoding; - for (let t = 0; t < 256; t++) - t in a && e[a[t]] - ? (i[t] = e[a[t]]) - : t in s && e[s[t]] && (i[t] = e[s[t]]); - return i; - } - preEvaluateFont(e) { - const t = e; - let i = e.get("Subtype"); - if (!(i instanceof Name)) throw new FormatError("invalid font Subtype"); - let a, - s = !1; - if ("Type0" === i.name) { - const t = e.get("DescendantFonts"); - if (!t) throw new FormatError("Descendant fonts are not specified"); - if ( - !( - (e = Array.isArray(t) ? this.xref.fetchIfRef(t[0]) : t) instanceof - Dict - ) - ) - throw new FormatError("Descendant font is not a dictionary."); - i = e.get("Subtype"); - if (!(i instanceof Name)) throw new FormatError("invalid font Subtype"); - s = !0; - } - let r = e.get("FirstChar"); - Number.isInteger(r) || (r = 0); - let n = e.get("LastChar"); - Number.isInteger(n) || (n = s ? 65535 : 255); - const g = e.get("FontDescriptor"), - o = e.get("ToUnicode") || t.get("ToUnicode"); - if (g) { - a = new MurmurHash3_64(); - const i = t.getRaw("Encoding"); - if (i instanceof Name) a.update(i.name); - else if (i instanceof Ref) a.update(i.toString()); - else if (i instanceof Dict) - for (const e of i.getRawValues()) - if (e instanceof Name) a.update(e.name); - else if (e instanceof Ref) a.update(e.toString()); - else if (Array.isArray(e)) { - const t = e.length, - i = new Array(t); - for (let a = 0; a < t; a++) { - const t = e[a]; - t instanceof Name - ? (i[a] = t.name) - : ("number" == typeof t || t instanceof Ref) && - (i[a] = t.toString()); + const code = xref.fetchIfRef(widths[i]); + if (Array.isArray(code)) { + for (const c of code) { + const width = xref.fetchIfRef(c); + if (typeof width === "number") { + glyphsWidths[start] = width; + } + start++; } - a.update(i.join()); + } else if (Number.isInteger(code)) { + const width = xref.fetchIfRef(widths[++i]); + if (typeof width !== "number") { + continue; + } + for (let j = start; j <= code; j++) { + glyphsWidths[j] = width; + } + } else { + break; } - a.update(`${r}-${n}`); - if (o instanceof BaseStream) { - const e = o.str || o, - t = e.buffer - ? new Uint8Array(e.buffer.buffer, 0, e.bufferLength) - : new Uint8Array(e.bytes.buffer, e.start, e.end - e.start); - a.update(t); - } else o instanceof Name && a.update(o.name); - const g = e.get("Widths") || t.get("Widths"); - if (Array.isArray(g)) { - const e = []; - for (const t of g) - ("number" == typeof t || t instanceof Ref) && e.push(t.toString()); - a.update(e.join()); - } - if (s) { - a.update("compositeFont"); - const i = e.get("W") || t.get("W"); - if (Array.isArray(i)) { - const e = []; - for (const t of i) - if ("number" == typeof t || t instanceof Ref) e.push(t.toString()); - else if (Array.isArray(t)) { - const i = []; - for (const e of t) - ("number" == typeof e || e instanceof Ref) && - i.push(e.toString()); - e.push(`[${i.join()}]`); - } - a.update(e.join()); } - const s = e.getRaw("CIDToGIDMap") || t.getRaw("CIDToGIDMap"); - s instanceof Name - ? a.update(s.name) - : s instanceof Ref - ? a.update(s.toString()) - : s instanceof BaseStream && a.update(s.peekBytes()); + } + if (properties.vertical) { + const dw2 = dict.getArray("DW2"); + let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; + defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; + vmetrics = dict.get("W2"); + if (Array.isArray(vmetrics)) { + for (let i = 0, ii = vmetrics.length; i < ii; i++) { + let start = xref.fetchIfRef(vmetrics[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(vmetrics[i]); + if (Array.isArray(code)) { + for (let j = 0, jj = code.length; j < jj; j++) { + const vmetric = [ + xref.fetchIfRef(code[j++]), + xref.fetchIfRef(code[j++]), + xref.fetchIfRef(code[j]), + ]; + if (isNumberArray(vmetric, null)) { + glyphsVMetrics[start] = vmetric; + } + start++; + } + } else if (Number.isInteger(code)) { + const vmetric = [ + xref.fetchIfRef(vmetrics[++i]), + xref.fetchIfRef(vmetrics[++i]), + xref.fetchIfRef(vmetrics[++i]), + ]; + if (!isNumberArray(vmetric, null)) { + continue; + } + for (let j = start; j <= code; j++) { + glyphsVMetrics[j] = vmetric; + } + } else { + break; + } + } + } + } + } else { + const widths = dict.get("Widths"); + if (Array.isArray(widths)) { + let j = properties.firstChar; + for (const w of widths) { + const width = xref.fetchIfRef(w); + if (typeof width === "number") { + glyphsWidths[j] = width; + } + j++; + } + const missingWidth = descriptor.get("MissingWidth"); + defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; + } else { + const baseFontName = dict.get("BaseFont"); + if (baseFontName instanceof Name) { + const metrics = this.getBaseFontMetrics(baseFontName.name); + glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); + defaultWidth = metrics.defaultWidth; + } + } + } + let isMonospace = true; + let firstWidth = defaultWidth; + for (const glyph in glyphsWidths) { + const glyphWidth = glyphsWidths[glyph]; + if (!glyphWidth) { + continue; + } + if (!firstWidth) { + firstWidth = glyphWidth; + continue; + } + if (firstWidth !== glyphWidth) { + isMonospace = false; + break; + } + } + if (isMonospace) { + properties.flags |= FontFlags.FixedPitch; + } else { + properties.flags &= ~FontFlags.FixedPitch; + } + properties.defaultWidth = defaultWidth; + properties.widths = glyphsWidths; + properties.defaultVMetrics = defaultVMetrics; + properties.vmetrics = glyphsVMetrics; + } + isSerifFont(baseFontName) { + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + return ( + fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle) + ); + } + getBaseFontMetrics(name) { + let defaultWidth = 0; + let widths = Object.create(null); + let monospace = false; + const stdFontMap = getStdFontMap(); + let lookupName = stdFontMap[name] || name; + const Metrics = getMetrics(); + if (!(lookupName in Metrics)) { + lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; + } + const glyphWidths = Metrics[lookupName]; + if (typeof glyphWidths === "number") { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth, + monospace, + widths, + }; + } + buildCharCodeToWidth(widthsByGlyphName, properties) { + const widths = Object.create(null); + const differences = properties.differences; + const encoding = properties.defaultEncoding; + for (let charCode = 0; charCode < 256; charCode++) { + if (charCode in differences && widthsByGlyphName[differences[charCode]]) { + widths[charCode] = widthsByGlyphName[differences[charCode]]; + continue; + } + if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { + widths[charCode] = widthsByGlyphName[encoding[charCode]]; + continue; + } + } + return widths; + } + preEvaluateFont(dict) { + const baseDict = dict; + let type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + let composite = false; + let hash; + if (type.name === "Type0") { + const df = dict.get("DescendantFonts"); + if (!df) { + throw new FormatError("Descendant fonts are not specified"); + } + dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; + if (!(dict instanceof Dict)) { + throw new FormatError("Descendant font is not a dictionary."); + } + type = dict.get("Subtype"); + if (!(type instanceof Name)) { + throw new FormatError("invalid font Subtype"); + } + composite = true; + } + let firstChar = dict.get("FirstChar"); + if (!Number.isInteger(firstChar)) { + firstChar = 0; + } + let lastChar = dict.get("LastChar"); + if (!Number.isInteger(lastChar)) { + lastChar = composite ? 0xffff : 0xff; + } + const descriptor = dict.get("FontDescriptor"); + const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); + if (descriptor) { + hash = new MurmurHash3_64(); + const encoding = baseDict.getRaw("Encoding"); + if (encoding instanceof Name) { + hash.update(encoding.name); + } else if (encoding instanceof Ref) { + hash.update(encoding.toString()); + } else if (encoding instanceof Dict) { + for (const entry of encoding.getRawValues()) { + if (entry instanceof Name) { + hash.update(entry.name); + } else if (entry instanceof Ref) { + hash.update(entry.toString()); + } else if (Array.isArray(entry)) { + const diffLength = entry.length, + diffBuf = new Array(diffLength); + for (let j = 0; j < diffLength; j++) { + const diffEntry = entry[j]; + if (diffEntry instanceof Name) { + diffBuf[j] = diffEntry.name; + } else if ( + typeof diffEntry === "number" || + diffEntry instanceof Ref + ) { + diffBuf[j] = diffEntry.toString(); + } + } + hash.update(diffBuf.join()); + } + } + } + hash.update(`${firstChar}-${lastChar}`); + if (toUnicode instanceof BaseStream) { + 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 (toUnicode instanceof Name) { + hash.update(toUnicode.name); + } + const widths = dict.get("Widths") || baseDict.get("Widths"); + if (Array.isArray(widths)) { + const widthsBuf = []; + for (const entry of widths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } + } + hash.update(widthsBuf.join()); + } + if (composite) { + hash.update("compositeFont"); + const compositeWidths = dict.get("W") || baseDict.get("W"); + if (Array.isArray(compositeWidths)) { + const widthsBuf = []; + for (const entry of compositeWidths) { + if (typeof entry === "number" || entry instanceof Ref) { + widthsBuf.push(entry.toString()); + } else if (Array.isArray(entry)) { + const subWidthsBuf = []; + for (const element of entry) { + if (typeof element === "number" || element instanceof Ref) { + subWidthsBuf.push(element.toString()); + } + } + widthsBuf.push(`[${subWidthsBuf.join()}]`); + } + } + hash.update(widthsBuf.join()); + } + const cidToGidMap = + dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); + if (cidToGidMap instanceof Name) { + hash.update(cidToGidMap.name); + } else if (cidToGidMap instanceof Ref) { + hash.update(cidToGidMap.toString()); + } else if (cidToGidMap instanceof BaseStream) { + hash.update(cidToGidMap.peekBytes()); + } } } return { - descriptor: g, - dict: e, - baseDict: t, - composite: s, - type: i.name, - firstChar: r, - lastChar: n, - toUnicode: o, - hash: a ? a.hexdigest() : "", + descriptor, + dict, + baseDict, + composite, + type: type.name, + firstChar, + lastChar, + toUnicode, + hash: hash ? hash.hexdigest() : "", }; } async translateFont({ - descriptor: e, - dict: t, - baseDict: i, - composite: s, - type: r, - firstChar: n, - lastChar: g, - toUnicode: o, - cssFontInfo: c, + descriptor, + dict, + baseDict, + composite, + type, + firstChar, + lastChar, + toUnicode, + cssFontInfo, }) { - const C = "Type3" === r; - if (!e) { - if (!C) { - let e = t.get("BaseFont"); - if (!(e instanceof Name)) + const isType3Font = type === "Type3"; + if (!descriptor) { + if (isType3Font) { + const bbox = lookupNormalRect(dict.getArray("FontBBox"), [0, 0, 0, 0]); + descriptor = new Dict(null); + descriptor.set("FontName", Name.get(type)); + descriptor.set("FontBBox", bbox); + } else { + let baseFontName = dict.get("BaseFont"); + if (!(baseFontName instanceof Name)) { throw new FormatError("Base font is not specified"); - e = e.name.replaceAll(/[,_]/g, "-"); - const a = this.getBaseFontMetrics(e), - s = e.split("-", 1)[0], - c = - (this.isSerifFont(s) ? Ki : 0) | - (a.monospace ? vi : 0) | - (Zi()[s] ? Ti : qi), - h = { - type: r, - name: e, - loadedName: i.loadedName, - systemFontInfo: null, - widths: a.widths, - defaultWidth: a.defaultWidth, - isSimulatedFlags: !0, - flags: c, - firstChar: n, - lastChar: g, - toUnicode: o, - xHeight: 0, - capHeight: 0, - italicAngle: 0, - isType3Font: C, - }, - l = t.get("Widths"), - Q = getStandardFontName(e); - let E = null; - if (Q) { - E = await this.fetchStandardFontData(Q); - h.isInternalFont = !!E; } - !h.isInternalFont && - this.options.useSystemFonts && - (h.systemFontInfo = getFontSubstitution( + baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); + const metrics = this.getBaseFontMetrics(baseFontName); + const fontNameWoStyle = baseFontName.split("-", 1)[0]; + const flags = + (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | + (metrics.monospace ? FontFlags.FixedPitch : 0) | + (getSymbolsFonts()[fontNameWoStyle] + ? FontFlags.Symbolic + : FontFlags.Nonsymbolic); + const properties = { + type, + name: baseFontName, + loadedName: baseDict.loadedName, + systemFontInfo: null, + widths: metrics.widths, + defaultWidth: metrics.defaultWidth, + isSimulatedFlags: true, + flags, + firstChar, + lastChar, + toUnicode, + xHeight: 0, + capHeight: 0, + italicAngle: 0, + isType3Font, + }; + const widths = dict.get("Widths"); + const standardFontName = getStandardFontName(baseFontName); + let file = null; + if (standardFontName) { + file = await this.fetchStandardFontData(standardFontName); + properties.isInternalFont = !!file; + } + if (!properties.isInternalFont && this.options.useSystemFonts) { + properties.systemFontInfo = getFontSubstitution( this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, - e, - Q, - r, - )); - const u = await this.extractDataStructures(t, h); - if (Array.isArray(l)) { - const e = []; - let t = n; - for (const i of l) { - const a = this.xref.fetchIfRef(i); - "number" == typeof a && (e[t] = a); - t++; + baseFontName, + standardFontName, + type, + ); + } + const newProperties = await this.extractDataStructures( + dict, + properties, + ); + if (Array.isArray(widths)) { + const glyphWidths = []; + let j = firstChar; + for (const w of widths) { + const width = this.xref.fetchIfRef(w); + if (typeof width === "number") { + glyphWidths[j] = width; + } + j++; } - u.widths = e; - } else u.widths = this.buildCharCodeToWidth(a.widths, u); - return new Font(e, E, u); - } - { - const i = lookupNormalRect(t.getArray("FontBBox"), [0, 0, 0, 0]); - (e = new Dict(null)).set("FontName", Name.get(r)); - e.set("FontBBox", i); + newProperties.widths = glyphWidths; + } else { + newProperties.widths = this.buildCharCodeToWidth( + metrics.widths, + newProperties, + ); + } + return new Font(baseFontName, file, newProperties); } } - let h = e.get("FontName"), - l = t.get("BaseFont"); - "string" == typeof h && (h = Name.get(h)); - "string" == typeof l && (l = Name.get(l)); - const Q = h?.name, - E = l?.name; - if (!C && Q !== E) { + let fontName = descriptor.get("FontName"); + let baseFont = dict.get("BaseFont"); + if (typeof fontName === "string") { + fontName = Name.get(fontName); + } + if (typeof baseFont === "string") { + baseFont = Name.get(baseFont); + } + const fontNameStr = fontName?.name; + const baseFontStr = baseFont?.name; + if (!isType3Font && fontNameStr !== baseFontStr) { info( - `The FontDescriptor's FontName is "${Q}" but should be the same as the Font's BaseFont "${E}".`, + `The FontDescriptor's FontName is "${fontNameStr}" but ` + + `should be the same as the Font's BaseFont "${baseFontStr}".`, ); - Q && - E && - (E.startsWith(Q) || (!isKnownFontName(Q) && isKnownFontName(E))) && - (h = null); + if ( + fontNameStr && + baseFontStr && + (baseFontStr.startsWith(fontNameStr) || + (!isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) + ) { + fontName = null; + } } - h ||= l; - if (!(h instanceof Name)) throw new FormatError("invalid font name"); - let u, d, f, p, m; + fontName ||= baseFont; + if (!(fontName instanceof Name)) { + throw new FormatError("invalid font name"); + } + let fontFile, subtype, length1, length2, length3; try { - u = e.get("FontFile", "FontFile2", "FontFile3"); - } catch (e) { - if (!this.options.ignoreErrors) throw e; - warn(`translateFont - fetching "${h.name}" font file: "${e}".`); - u = new NullStream(); + fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); + if (fontFile) { + if (!(fontFile instanceof BaseStream)) { + throw new FormatError("FontFile should be a stream"); + } else if (fontFile.isEmpty) { + throw new FormatError("FontFile is empty"); + } + } + } catch (ex) { + if (!this.options.ignoreErrors) { + throw ex; + } + warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); + fontFile = null; } - let y = !1, - w = null, - D = null; - if (u) { - if (u.dict) { - const e = u.dict.get("Subtype"); - e instanceof Name && (d = e.name); - f = u.dict.get("Length1"); - p = u.dict.get("Length2"); - m = u.dict.get("Length3"); + let isInternalFont = false; + let glyphScaleFactors = null; + let systemFontInfo = null; + if (fontFile) { + if (fontFile.dict) { + const subtypeEntry = fontFile.dict.get("Subtype"); + if (subtypeEntry instanceof Name) { + subtype = subtypeEntry.name; + } + length1 = fontFile.dict.get("Length1"); + length2 = fontFile.dict.get("Length2"); + length3 = fontFile.dict.get("Length3"); } - } else if (c) { - const e = getXfaFontName(h.name); - if (e) { - c.fontFamily = `${c.fontFamily}-PdfJS-XFA`; - c.metrics = e.metrics || null; - w = e.factors || null; - u = await this.fetchStandardFontData(e.name); - y = !!u; - i = t = getXfaFontDict(h.name); - s = !0; + } else if (cssFontInfo) { + const standardFontName = getXfaFontName(fontName.name); + if (standardFontName) { + cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; + cssFontInfo.metrics = standardFontName.metrics || null; + glyphScaleFactors = standardFontName.factors || null; + fontFile = await this.fetchStandardFontData(standardFontName.name); + isInternalFont = !!fontFile; + baseDict = dict = getXfaFontDict(fontName.name); + composite = true; } - } else if (!C) { - const e = getStandardFontName(h.name); - if (e) { - u = await this.fetchStandardFontData(e); - y = !!u; + } else if (!isType3Font) { + const standardFontName = getStandardFontName(fontName.name); + if (standardFontName) { + fontFile = await this.fetchStandardFontData(standardFontName); + isInternalFont = !!fontFile; } - !y && - this.options.useSystemFonts && - (D = getFontSubstitution( + if (!isInternalFont && this.options.useSystemFonts) { + systemFontInfo = getFontSubstitution( this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, - h.name, - e, - r, - )); + fontName.name, + standardFontName, + type, + ); + } } - const b = lookupMatrix(t.getArray("FontMatrix"), a), - F = lookupNormalRect( - e.getArray("FontBBox") || t.getArray("FontBBox"), - void 0, - ); - let S = e.get("Ascent"); - "number" != typeof S && (S = void 0); - let k = e.get("Descent"); - "number" != typeof k && (k = void 0); - let R = e.get("XHeight"); - "number" != typeof R && (R = 0); - let N = e.get("CapHeight"); - "number" != typeof N && (N = 0); - let G = e.get("Flags"); - Number.isInteger(G) || (G = 0); - let x = e.get("ItalicAngle"); - "number" != typeof x && (x = 0); - const U = { - type: r, - name: h.name, - subtype: d, - file: u, - length1: f, - length2: p, - length3: m, - isInternalFont: y, - loadedName: i.loadedName, - composite: s, - fixedPitch: !1, - fontMatrix: b, - firstChar: n, - lastChar: g, - toUnicode: o, - bbox: F, - ascent: S, - descent: k, - xHeight: R, - capHeight: N, - flags: G, - italicAngle: x, - isType3Font: C, - cssFontInfo: c, - scaleFactors: w, - systemFontInfo: D, + const fontMatrix = lookupMatrix( + dict.getArray("FontMatrix"), + FONT_IDENTITY_MATRIX, + ); + const bbox = lookupNormalRect( + descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), + undefined, + ); + let ascent = descriptor.get("Ascent"); + if (typeof ascent !== "number") { + ascent = undefined; + } + let descent = descriptor.get("Descent"); + if (typeof descent !== "number") { + descent = undefined; + } + let xHeight = descriptor.get("XHeight"); + if (typeof xHeight !== "number") { + xHeight = 0; + } + let capHeight = descriptor.get("CapHeight"); + if (typeof capHeight !== "number") { + capHeight = 0; + } + let flags = descriptor.get("Flags"); + if (!Number.isInteger(flags)) { + flags = 0; + } + let italicAngle = descriptor.get("ItalicAngle"); + if (typeof italicAngle !== "number") { + italicAngle = 0; + } + const properties = { + type, + name: fontName.name, + subtype, + file: fontFile, + length1, + length2, + length3, + isInternalFont, + loadedName: baseDict.loadedName, + composite, + fixedPitch: false, + fontMatrix, + firstChar, + lastChar, + toUnicode, + bbox, + ascent, + descent, + xHeight, + capHeight, + flags, + italicAngle, + isType3Font, + cssFontInfo, + scaleFactors: glyphScaleFactors, + systemFontInfo, }; - if (s) { - const e = i.get("Encoding"); - e instanceof Name && (U.cidEncoding = e.name); - const t = await CMapFactory.create({ - encoding: e, + if (composite) { + const cidEncoding = baseDict.get("Encoding"); + if (cidEncoding instanceof Name) { + properties.cidEncoding = cidEncoding.name; + } + const cMap = await CMapFactory.create({ + encoding: cidEncoding, fetchBuiltInCMap: this._fetchBuiltInCMapBound, useCMap: null, }); - U.cMap = t; - U.vertical = U.cMap.vertical; + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; } - const M = await this.extractDataStructures(t, U); - this.extractWidths(t, e, M); - return new Font(h.name, u, M); + const newProperties = await this.extractDataStructures(dict, properties); + this.extractWidths(dict, descriptor, newProperties); + return new Font(fontName.name, fontFile, newProperties); } - static buildFontPaths(e, t, i, a) { - function buildPath(t) { - const s = `${e.loadedName}_path_${t}`; + static buildFontPaths(font, glyphs, handler, evaluatorOptions) { + function buildPath(fontChar) { + const glyphName = `${font.loadedName}_path_${fontChar}`; try { - if (e.renderer.hasBuiltPath(t)) return; - i.send("commonobj", [s, "FontPath", e.renderer.getPathJs(t)]); - } catch (e) { - if (a.ignoreErrors) { - warn(`buildFontPaths - ignoring ${s} glyph: "${e}".`); + if (font.renderer.hasBuiltPath(fontChar)) { return; } - throw e; + handler.send("commonobj", [ + glyphName, + "FontPath", + font.renderer.getPathJs(fontChar), + ]); + } catch (reason) { + if (evaluatorOptions.ignoreErrors) { + warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); + return; + } + throw reason; } } - for (const e of t) { - buildPath(e.fontChar); - const t = e.accent; - t?.fontChar && buildPath(t.fontChar); + for (const glyph of glyphs) { + buildPath(glyph.fontChar); + const accent = glyph.accent; + if (accent?.fontChar) { + buildPath(accent.fontChar); + } } } static get fallbackFontDict() { - const e = new Dict(); - e.set("BaseFont", Name.get("Helvetica")); - e.set("Type", Name.get("FallbackType")); - e.set("Subtype", Name.get("FallbackType")); - e.set("Encoding", Name.get("WinAnsiEncoding")); - return shadow(this, "fallbackFontDict", e); + const dict = new Dict(); + dict.set("BaseFont", Name.get("Helvetica")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("WinAnsiEncoding")); + return shadow(this, "fallbackFontDict", dict); } } class TranslatedFont { - constructor({ loadedName: e, font: t, dict: i, evaluatorOptions: a }) { - this.loadedName = e; - this.font = t; - this.dict = i; - this._evaluatorOptions = a || bs; + constructor({ loadedName, font, dict, evaluatorOptions }) { + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; this.type3Loaded = null; - this.type3Dependencies = t.isType3Font ? new Set() : null; - this.sent = !1; + this.type3Dependencies = font.isType3Font ? new Set() : null; + this.sent = false; } - send(e) { - if (!this.sent) { - this.sent = !0; - e.send("commonobj", [ - this.loadedName, - "Font", - this.font.exportData(this._evaluatorOptions.fontExtraProperties), - ]); + send(handler) { + if (this.sent) { + return; } + this.sent = true; + handler.send("commonobj", [ + this.loadedName, + "Font", + this.font.exportData(this._evaluatorOptions.fontExtraProperties), + ]); } - fallback(e) { - if (this.font.data) { - this.font.disableFontFace = !0; - PartialEvaluator.buildFontPaths( - this.font, - this.font.glyphCacheValues, - e, - this._evaluatorOptions, - ); + fallback(handler) { + if (!this.font.data) { + return; } + this.font.disableFontFace = true; + PartialEvaluator.buildFontPaths( + this.font, + this.font.glyphCacheValues, + handler, + this._evaluatorOptions, + ); } - loadType3Data(e, t, i) { - if (this.type3Loaded) return this.type3Loaded; - if (!this.font.isType3Font) throw new Error("Must be a Type3 font."); - const a = e.clone({ ignoreErrors: !1 }), - s = new RefSet(e.type3FontRefs); - this.dict.objId && !s.has(this.dict.objId) && s.put(this.dict.objId); - a.type3FontRefs = s; - const r = this.font, - n = this.type3Dependencies; - let g = Promise.resolve(); - const o = this.dict.get("CharProcs"), - c = this.dict.get("Resources") || t, - C = Object.create(null), - h = Util.normalizeRect(r.bbox || [0, 0, 0, 0]), - l = h[2] - h[0], - Q = h[3] - h[1], - E = Math.hypot(l, Q); - for (const e of o.getKeys()) - g = g.then(() => { - const t = o.get(e), - s = new OperatorList(); - return a + loadType3Data(evaluator, resources, task) { + if (this.type3Loaded) { + return this.type3Loaded; + } + if (!this.font.isType3Font) { + throw new Error("Must be a Type3 font."); + } + const type3Evaluator = evaluator.clone({ + ignoreErrors: false, + }); + const type3FontRefs = new RefSet(evaluator.type3FontRefs); + if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { + type3FontRefs.put(this.dict.objId); + } + type3Evaluator.type3FontRefs = type3FontRefs; + 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 fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), + width = fontBBox[2] - fontBBox[0], + height = fontBBox[3] - fontBBox[1]; + const fontBBoxSize = Math.hypot(width, height); + for (const key of charProcs.getKeys()) { + loadCharProcsPromise = loadCharProcsPromise.then(() => { + const glyphStream = charProcs.get(key); + const operatorList = new OperatorList(); + return type3Evaluator .getOperatorList({ - stream: t, - task: i, - resources: c, - operatorList: s, + stream: glyphStream, + task, + resources: fontResources, + operatorList, }) .then(() => { - s.fnArray[0] === Ee && this._removeType3ColorOperators(s, E); - C[e] = s.getIR(); - for (const e of s.dependencies) n.add(e); + if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { + this._removeType3ColorOperators(operatorList, fontBBoxSize); + } + charProcOperatorList[key] = operatorList.getIR(); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } }) - .catch(function (t) { - warn(`Type3 font resource "${e}" is not available.`); - const i = new OperatorList(); - C[e] = i.getIR(); + .catch(function (reason) { + warn(`Type3 font resource "${key}" is not available.`); + const dummyOperatorList = new OperatorList(); + charProcOperatorList[key] = dummyOperatorList.getIR(); }); }); - this.type3Loaded = g.then(() => { - r.charProcOperatorList = C; + } + this.type3Loaded = loadCharProcsPromise.then(() => { + translatedFont.charProcOperatorList = charProcOperatorList; if (this._bbox) { - r.isCharBBox = !0; - r.bbox = this._bbox; + translatedFont.isCharBBox = true; + translatedFont.bbox = this._bbox; } }); return this.type3Loaded; } - _removeType3ColorOperators(e, t = NaN) { - const i = Util.normalizeRect(e.argsArray[0].slice(2)), - a = i[2] - i[0], - s = i[3] - i[1], - r = Math.hypot(a, s); - if (0 === a || 0 === s) { - e.fnArray.splice(0, 1); - e.argsArray.splice(0, 1); - } else if (0 === t || Math.round(r / t) >= 10) { - this._bbox || (this._bbox = [1 / 0, 1 / 0, -1 / 0, -1 / 0]); - this._bbox[0] = Math.min(this._bbox[0], i[0]); - this._bbox[1] = Math.min(this._bbox[1], i[1]); - this._bbox[2] = Math.max(this._bbox[2], i[2]); - this._bbox[3] = Math.max(this._bbox[3], i[3]); + _removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { + const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), + width = charBBox[2] - charBBox[0], + height = charBBox[3] - charBBox[1]; + const charBBoxSize = Math.hypot(width, height); + if (width === 0 || height === 0) { + operatorList.fnArray.splice(0, 1); + operatorList.argsArray.splice(0, 1); + } else if ( + fontBBoxSize === 0 || + Math.round(charBBoxSize / fontBBoxSize) >= 10 + ) { + if (!this._bbox) { + this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; + } + 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 n = 0, - g = e.length; - for (; n < g; ) { - switch (e.fnArray[n]) { - case Ee: + let i = 0, + ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.setCharWidthAndBounds: break; - case ue: - case de: - case fe: - case pe: - case me: - case ye: - case we: - case De: - case be: - case Fe: - case Se: - case ke: - case Re: - case kA: - e.fnArray.splice(n, 1); - e.argsArray.splice(n, 1); - g--; + case OPS.setStrokeColorSpace: + case OPS.setFillColorSpace: + case OPS.setStrokeColor: + case OPS.setStrokeColorN: + case OPS.setFillColor: + case OPS.setFillColorN: + case OPS.setStrokeGray: + case OPS.setFillGray: + case OPS.setStrokeRGBColor: + case OPS.setFillRGBColor: + case OPS.setStrokeCMYKColor: + case OPS.setFillCMYKColor: + case OPS.shadingFill: + case OPS.setRenderingIntent: + operatorList.fnArray.splice(i, 1); + operatorList.argsArray.splice(i, 1); + ii--; continue; - case NA: - const [t] = e.argsArray[n]; - let i = 0, - a = t.length; - for (; i < a; ) { - const [e] = t[i]; - switch (e) { + case 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": @@ -36510,98 +43477,115 @@ class TranslatedFont { case "BG2": case "UCR": case "UCR2": - t.splice(i, 1); - a--; + gStateObj.splice(j, 1); + jj--; continue; } - i++; + j++; } + break; } - n++; + i++; } } } class StateManager { - constructor(e = new EvalState()) { - this.state = e; + constructor(initialState = new EvalState()) { + this.state = initialState; this.stateStack = []; } save() { - const e = this.state; + const old = this.state; this.stateStack.push(this.state); - this.state = e.clone(); + this.state = old.clone(); } restore() { - const e = this.stateStack.pop(); - e && (this.state = e); + const prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } } - transform(e) { - this.state.ctm = Util.transform(this.state.ctm, e); + transform(args) { + this.state.ctm = Util.transform(this.state.ctm, args); } } class TextState { constructor() { - this.ctm = new Float32Array(i); + this.ctm = new Float32Array(IDENTITY_MATRIX); this.fontName = null; this.fontSize = 0; this.loadedName = null; this.font = null; - this.fontMatrix = a; - this.textMatrix = i.slice(); - this.textLineMatrix = i.slice(); + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.textMatrix = IDENTITY_MATRIX.slice(); + this.textLineMatrix = IDENTITY_MATRIX.slice(); this.charSpacing = 0; this.wordSpacing = 0; this.leading = 0; this.textHScale = 1; this.textRise = 0; } - setTextMatrix(e, t, i, a, s, r) { - const n = this.textMatrix; - n[0] = e; - n[1] = t; - n[2] = i; - n[3] = a; - n[4] = s; - n[5] = r; + 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; } - setTextLineMatrix(e, t, i, a, s, r) { - const n = this.textLineMatrix; - n[0] = e; - n[1] = t; - n[2] = i; - n[3] = a; - n[4] = s; - n[5] = r; + 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; } - translateTextMatrix(e, t) { - const i = this.textMatrix; - i[4] = i[0] * e + i[2] * t + i[4]; - i[5] = i[1] * e + i[3] * t + i[5]; + 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]; } - translateTextLineMatrix(e, t) { - const i = this.textLineMatrix; - i[4] = i[0] * e + i[2] * t + i[4]; - i[5] = i[1] * e + i[3] * t + i[5]; + 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]; } carriageReturn() { this.translateTextLineMatrix(0, -this.leading); this.textMatrix = this.textLineMatrix.slice(); } clone() { - const e = Object.create(this); - e.textMatrix = this.textMatrix.slice(); - e.textLineMatrix = this.textLineMatrix.slice(); - e.fontMatrix = this.fontMatrix.slice(); - return e; + const clone = Object.create(this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; } } class EvalState { constructor() { - this.ctm = new Float32Array(i); + this.ctm = new Float32Array(IDENTITY_MATRIX); this.font = null; - this.textRenderingMode = y; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; + this.textRenderingMode = TextRenderingMode.FILL; + this._fillColorSpace = ColorSpace.singletons.gray; + this._strokeColorSpace = ColorSpace.singletons.gray; + this.patternFillColorSpace = null; + this.patternStrokeColorSpace = null; + } + get fillColorSpace() { + return this._fillColorSpace; + } + set fillColorSpace(colorSpace) { + this._fillColorSpace = this.patternFillColorSpace = colorSpace; + } + get strokeColorSpace() { + return this._strokeColorSpace; + } + set strokeColorSpace(colorSpace) { + this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; } clone() { return Object.create(this); @@ -36613,79 +43597,371 @@ class EvaluatorPreprocessor { this, "opMap", Object.assign(Object.create(null), { - w: { id: wA, numArgs: 1, variableArgs: !1 }, - J: { id: DA, numArgs: 1, variableArgs: !1 }, - j: { id: bA, numArgs: 1, variableArgs: !1 }, - M: { id: FA, numArgs: 1, variableArgs: !1 }, - d: { id: SA, numArgs: 2, variableArgs: !1 }, - ri: { id: kA, numArgs: 1, variableArgs: !1 }, - i: { id: RA, numArgs: 1, variableArgs: !1 }, - gs: { id: NA, numArgs: 1, variableArgs: !1 }, - q: { id: GA, numArgs: 0, variableArgs: !1 }, - Q: { id: xA, numArgs: 0, variableArgs: !1 }, - cm: { id: UA, numArgs: 6, variableArgs: !1 }, - m: { id: MA, numArgs: 2, variableArgs: !1 }, - l: { id: LA, numArgs: 2, variableArgs: !1 }, - c: { id: HA, numArgs: 6, variableArgs: !1 }, - v: { id: JA, numArgs: 4, variableArgs: !1 }, - y: { id: YA, numArgs: 4, variableArgs: !1 }, - h: { id: vA, numArgs: 0, variableArgs: !1 }, - re: { id: KA, numArgs: 4, variableArgs: !1 }, - S: { id: TA, numArgs: 0, variableArgs: !1 }, - s: { id: qA, numArgs: 0, variableArgs: !1 }, - f: { id: OA, numArgs: 0, variableArgs: !1 }, - F: { id: OA, numArgs: 0, variableArgs: !1 }, - "f*": { id: PA, numArgs: 0, variableArgs: !1 }, - B: { id: WA, numArgs: 0, variableArgs: !1 }, - "B*": { id: jA, numArgs: 0, variableArgs: !1 }, - b: { id: XA, numArgs: 0, variableArgs: !1 }, - "b*": { id: ZA, numArgs: 0, variableArgs: !1 }, - n: { id: VA, numArgs: 0, variableArgs: !1 }, - W: { id: zA, numArgs: 0, variableArgs: !1 }, - "W*": { id: _A, numArgs: 0, variableArgs: !1 }, - BT: { id: $A, numArgs: 0, variableArgs: !1 }, - ET: { id: Ae, numArgs: 0, variableArgs: !1 }, - Tc: { id: ee, numArgs: 1, variableArgs: !1 }, - Tw: { id: te, numArgs: 1, variableArgs: !1 }, - Tz: { id: ie, numArgs: 1, variableArgs: !1 }, - TL: { id: ae, numArgs: 1, variableArgs: !1 }, - Tf: { id: se, numArgs: 2, variableArgs: !1 }, - Tr: { id: re, numArgs: 1, variableArgs: !1 }, - Ts: { id: ne, numArgs: 1, variableArgs: !1 }, - Td: { id: ge, numArgs: 2, variableArgs: !1 }, - TD: { id: oe, numArgs: 2, variableArgs: !1 }, - Tm: { id: Ie, numArgs: 6, variableArgs: !1 }, - "T*": { id: ce, numArgs: 0, variableArgs: !1 }, - Tj: { id: Ce, numArgs: 1, variableArgs: !1 }, - TJ: { id: he, numArgs: 1, variableArgs: !1 }, - "'": { id: Be, numArgs: 1, variableArgs: !1 }, - '"': { id: le, numArgs: 3, variableArgs: !1 }, - d0: { id: Qe, numArgs: 2, variableArgs: !1 }, - d1: { id: Ee, numArgs: 6, variableArgs: !1 }, - CS: { id: ue, numArgs: 1, variableArgs: !1 }, - cs: { id: de, numArgs: 1, variableArgs: !1 }, - SC: { id: fe, numArgs: 4, variableArgs: !0 }, - SCN: { id: pe, numArgs: 33, variableArgs: !0 }, - sc: { id: me, numArgs: 4, variableArgs: !0 }, - scn: { id: ye, numArgs: 33, variableArgs: !0 }, - G: { id: we, numArgs: 1, variableArgs: !1 }, - g: { id: De, numArgs: 1, variableArgs: !1 }, - RG: { id: be, numArgs: 3, variableArgs: !1 }, - rg: { id: Fe, numArgs: 3, variableArgs: !1 }, - K: { id: Se, numArgs: 4, variableArgs: !1 }, - k: { id: ke, numArgs: 4, variableArgs: !1 }, - sh: { id: Re, numArgs: 1, variableArgs: !1 }, - BI: { id: Ne, numArgs: 0, variableArgs: !1 }, - ID: { id: Ge, numArgs: 0, variableArgs: !1 }, - EI: { id: xe, numArgs: 1, variableArgs: !1 }, - Do: { id: Ue, numArgs: 1, variableArgs: !1 }, - MP: { id: Me, numArgs: 1, variableArgs: !1 }, - DP: { id: Le, numArgs: 2, variableArgs: !1 }, - BMC: { id: He, numArgs: 1, variableArgs: !1 }, - BDC: { id: Je, numArgs: 2, variableArgs: !1 }, - EMC: { id: Ye, numArgs: 0, variableArgs: !1 }, - BX: { id: ve, numArgs: 0, variableArgs: !1 }, - EX: { id: Ke, numArgs: 0, variableArgs: !1 }, + w: { + id: OPS.setLineWidth, + numArgs: 1, + variableArgs: false, + }, + J: { + id: OPS.setLineCap, + numArgs: 1, + variableArgs: false, + }, + j: { + id: OPS.setLineJoin, + numArgs: 1, + variableArgs: false, + }, + M: { + id: OPS.setMiterLimit, + numArgs: 1, + variableArgs: false, + }, + d: { + id: OPS.setDash, + numArgs: 2, + variableArgs: false, + }, + ri: { + id: OPS.setRenderingIntent, + numArgs: 1, + variableArgs: false, + }, + i: { + id: OPS.setFlatness, + numArgs: 1, + variableArgs: false, + }, + gs: { + id: OPS.setGState, + numArgs: 1, + variableArgs: false, + }, + q: { + id: OPS.save, + numArgs: 0, + variableArgs: false, + }, + Q: { + id: OPS.restore, + numArgs: 0, + variableArgs: false, + }, + cm: { + id: OPS.transform, + numArgs: 6, + variableArgs: false, + }, + m: { + id: OPS.moveTo, + numArgs: 2, + variableArgs: false, + }, + l: { + id: OPS.lineTo, + numArgs: 2, + variableArgs: false, + }, + c: { + id: OPS.curveTo, + numArgs: 6, + variableArgs: false, + }, + v: { + id: OPS.curveTo2, + numArgs: 4, + variableArgs: false, + }, + y: { + id: OPS.curveTo3, + numArgs: 4, + variableArgs: false, + }, + h: { + id: OPS.closePath, + numArgs: 0, + variableArgs: false, + }, + re: { + id: OPS.rectangle, + numArgs: 4, + variableArgs: false, + }, + S: { + id: OPS.stroke, + numArgs: 0, + variableArgs: false, + }, + s: { + id: OPS.closeStroke, + numArgs: 0, + variableArgs: false, + }, + f: { + id: OPS.fill, + numArgs: 0, + variableArgs: false, + }, + F: { + id: OPS.fill, + numArgs: 0, + variableArgs: false, + }, + "f*": { + id: OPS.eoFill, + numArgs: 0, + variableArgs: false, + }, + B: { + id: OPS.fillStroke, + numArgs: 0, + variableArgs: false, + }, + "B*": { + id: OPS.eoFillStroke, + numArgs: 0, + variableArgs: false, + }, + b: { + id: OPS.closeFillStroke, + numArgs: 0, + variableArgs: false, + }, + "b*": { + id: OPS.closeEOFillStroke, + numArgs: 0, + variableArgs: false, + }, + n: { + id: OPS.endPath, + numArgs: 0, + variableArgs: false, + }, + W: { + id: OPS.clip, + numArgs: 0, + variableArgs: false, + }, + "W*": { + id: OPS.eoClip, + numArgs: 0, + variableArgs: false, + }, + BT: { + id: OPS.beginText, + numArgs: 0, + variableArgs: false, + }, + ET: { + id: OPS.endText, + numArgs: 0, + variableArgs: false, + }, + Tc: { + id: OPS.setCharSpacing, + numArgs: 1, + variableArgs: false, + }, + Tw: { + id: OPS.setWordSpacing, + numArgs: 1, + variableArgs: false, + }, + Tz: { + id: OPS.setHScale, + numArgs: 1, + variableArgs: false, + }, + TL: { + id: OPS.setLeading, + numArgs: 1, + variableArgs: false, + }, + Tf: { + id: OPS.setFont, + numArgs: 2, + variableArgs: false, + }, + Tr: { + id: OPS.setTextRenderingMode, + numArgs: 1, + variableArgs: false, + }, + Ts: { + id: OPS.setTextRise, + numArgs: 1, + variableArgs: false, + }, + Td: { + id: OPS.moveText, + numArgs: 2, + variableArgs: false, + }, + TD: { + id: OPS.setLeadingMoveText, + numArgs: 2, + variableArgs: false, + }, + Tm: { + id: OPS.setTextMatrix, + numArgs: 6, + variableArgs: false, + }, + "T*": { + id: OPS.nextLine, + numArgs: 0, + variableArgs: false, + }, + Tj: { + id: OPS.showText, + numArgs: 1, + variableArgs: false, + }, + TJ: { + id: OPS.showSpacedText, + numArgs: 1, + variableArgs: false, + }, + "'": { + id: OPS.nextLineShowText, + numArgs: 1, + variableArgs: false, + }, + '"': { + id: OPS.nextLineSetSpacingShowText, + numArgs: 3, + variableArgs: false, + }, + d0: { + id: OPS.setCharWidth, + numArgs: 2, + variableArgs: false, + }, + d1: { + id: OPS.setCharWidthAndBounds, + numArgs: 6, + variableArgs: false, + }, + CS: { + id: OPS.setStrokeColorSpace, + numArgs: 1, + variableArgs: false, + }, + cs: { + id: OPS.setFillColorSpace, + numArgs: 1, + variableArgs: false, + }, + SC: { + id: OPS.setStrokeColor, + numArgs: 4, + variableArgs: true, + }, + SCN: { + id: OPS.setStrokeColorN, + numArgs: 33, + variableArgs: true, + }, + sc: { + id: OPS.setFillColor, + numArgs: 4, + variableArgs: true, + }, + scn: { + id: OPS.setFillColorN, + numArgs: 33, + variableArgs: true, + }, + G: { + id: OPS.setStrokeGray, + numArgs: 1, + variableArgs: false, + }, + g: { + id: OPS.setFillGray, + numArgs: 1, + variableArgs: false, + }, + RG: { + id: OPS.setStrokeRGBColor, + numArgs: 3, + variableArgs: false, + }, + rg: { + id: OPS.setFillRGBColor, + numArgs: 3, + variableArgs: false, + }, + K: { + id: OPS.setStrokeCMYKColor, + numArgs: 4, + variableArgs: false, + }, + k: { + id: OPS.setFillCMYKColor, + numArgs: 4, + variableArgs: false, + }, + sh: { + id: OPS.shadingFill, + numArgs: 1, + variableArgs: false, + }, + BI: { + id: OPS.beginInlineImage, + numArgs: 0, + variableArgs: false, + }, + ID: { + id: OPS.beginImageData, + numArgs: 0, + variableArgs: false, + }, + EI: { + id: OPS.endInlineImage, + numArgs: 1, + variableArgs: false, + }, + Do: { + id: OPS.paintXObject, + numArgs: 1, + variableArgs: false, + }, + MP: { + id: OPS.markPoint, + numArgs: 1, + variableArgs: false, + }, + DP: { + id: OPS.markPointProps, + numArgs: 2, + variableArgs: false, + }, + BMC: { + id: OPS.beginMarkedContent, + numArgs: 1, + variableArgs: false, + }, + BDC: { + id: OPS.beginMarkedContentProps, + numArgs: 2, + variableArgs: false, + }, + EMC: { + id: OPS.endMarkedContent, + numArgs: 0, + variableArgs: false, + }, + BX: { + id: OPS.beginCompat, + numArgs: 0, + variableArgs: false, + }, + EX: { + id: OPS.endCompat, + numArgs: 0, + variableArgs: false, + }, BM: null, BD: null, true: null, @@ -36700,612 +43976,739 @@ class EvaluatorPreprocessor { ); } static MAX_INVALID_PATH_OPS = 10; - constructor(e, t, i = new StateManager()) { + constructor(stream, xref, stateManager = new StateManager()) { this.parser = new Parser({ - lexer: new Lexer(e, EvaluatorPreprocessor.opMap), - xref: t, + lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), + xref, }); - this.stateManager = i; + this.stateManager = stateManager; this.nonProcessedArgs = []; - this._isPathOp = !1; + this._isPathOp = false; this._numInvalidPathOPS = 0; } get savedStatesDepth() { return this.stateManager.stateStack.length; } - read(e) { - let t = e.args; - for (;;) { - const i = this.parser.getObj(); - if (i instanceof Cmd) { - const a = i.cmd, - s = EvaluatorPreprocessor.opMap[a]; - if (!s) { - warn(`Unknown command "${a}".`); + read(operation) { + let args = operation.args; + while (true) { + const obj = this.parser.getObj(); + if (obj instanceof Cmd) { + const cmd = obj.cmd; + const opSpec = EvaluatorPreprocessor.opMap[cmd]; + if (!opSpec) { + warn(`Unknown command "${cmd}".`); continue; } - const r = s.id, - n = s.numArgs; - let g = null !== t ? t.length : 0; - this._isPathOp || (this._numInvalidPathOPS = 0); - this._isPathOp = r >= MA && r <= VA; - if (s.variableArgs) - g > n && - info( - `Command ${a}: expected [0, ${n}] args, but received ${g} args.`, - ); - else { - if (g !== n) { - const e = this.nonProcessedArgs; - for (; g > n; ) { - e.push(t.shift()); - g--; + const fn = opSpec.id; + const numArgs = opSpec.numArgs; + let argsLength = args !== null ? args.length : 0; + if (!this._isPathOp) { + this._numInvalidPathOPS = 0; + } + this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath; + if (!opSpec.variableArgs) { + if (argsLength !== numArgs) { + const nonProcessedArgs = this.nonProcessedArgs; + while (argsLength > numArgs) { + nonProcessedArgs.push(args.shift()); + argsLength--; } - for (; g < n && 0 !== e.length; ) { - null === t && (t = []); - t.unshift(e.pop()); - g++; + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; } } - if (g < n) { - const e = `command ${a}: expected ${n} args, but received ${g} args.`; + if (argsLength < numArgs) { + const partialMsg = + `command ${cmd}: expected ${numArgs} args, ` + + `but received ${argsLength} args.`; if ( this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS - ) - throw new FormatError(`Invalid ${e}`); - warn(`Skipping ${e}`); - null !== t && (t.length = 0); + ) { + throw new FormatError(`Invalid ${partialMsg}`); + } + warn(`Skipping ${partialMsg}`); + if (args !== null) { + args.length = 0; + } continue; } + } else if (argsLength > numArgs) { + info( + `Command ${cmd}: expected [0, ${numArgs}] args, ` + + `but received ${argsLength} args.`, + ); } - this.preprocessCommand(r, t); - e.fn = r; - e.args = t; - return !0; + this.preprocessCommand(fn, args); + operation.fn = fn; + operation.args = args; + return true; } - if (i === pt) return !1; - if (null !== i) { - null === t && (t = []); - t.push(i); - if (t.length > 33) throw new FormatError("Too many arguments"); + if (obj === EOF) { + return false; + } + if (obj !== null) { + if (args === null) { + args = []; + } + args.push(obj); + if (args.length > 33) { + throw new FormatError("Too many arguments"); + } } } } - preprocessCommand(e, t) { - switch (0 | e) { - case GA: + preprocessCommand(fn, args) { + switch (fn | 0) { + case OPS.save: this.stateManager.save(); break; - case xA: + case OPS.restore: this.stateManager.restore(); break; - case UA: - this.stateManager.transform(t); + case OPS.transform: + this.stateManager.transform(args); + break; } } -} +} // ./src/core/default_appearance.js + class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { - constructor(e) { - super(new StringStream(e)); + constructor(str) { + super(new StringStream(str)); } parse() { - const e = { fn: 0, args: [] }, - t = { fontSize: 0, fontName: "", fontColor: new Uint8ClampedArray(3) }; + const operation = { + fn: 0, + args: [], + }; + const result = { + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3), + }; try { - for (;;) { - e.args.length = 0; - if (!this.read(e)) break; - if (0 !== this.savedStatesDepth) continue; - const { fn: i, args: a } = e; - switch (0 | i) { - case se: - const [e, i] = a; - e instanceof Name && (t.fontName = e.name); - "number" == typeof i && i > 0 && (t.fontSize = i); + while (true) { + operation.args.length = 0; + if (!this.read(operation)) { + break; + } + if (this.savedStatesDepth !== 0) { + continue; + } + const { fn, args } = operation; + switch (fn | 0) { + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize; + } break; - case Fe: - ColorSpace.singletons.rgb.getRgbItem(a, 0, t.fontColor, 0); + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); break; - case De: - ColorSpace.singletons.gray.getRgbItem(a, 0, t.fontColor, 0); + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); break; - case ke: - ColorSpace.singletons.cmyk.getRgbItem(a, 0, t.fontColor, 0); } } - } catch (e) { - warn(`parseDefaultAppearance - ignoring errors: "${e}".`); + } catch (reason) { + warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); } - return t; + return result; } } -function parseDefaultAppearance(e) { - return new DefaultAppearanceEvaluator(e).parse(); +function parseDefaultAppearance(str) { + return new DefaultAppearanceEvaluator(str).parse(); } class AppearanceStreamEvaluator extends EvaluatorPreprocessor { - constructor(e, t, i) { - super(e); - this.stream = e; - this.evaluatorOptions = t; - this.xref = i; - this.resources = e.dict?.get("Resources"); + constructor(stream, evaluatorOptions, xref) { + super(stream); + this.stream = stream; + this.evaluatorOptions = evaluatorOptions; + this.xref = xref; + this.resources = stream.dict?.get("Resources"); } parse() { - const e = { fn: 0, args: [] }; - let t = { - scaleFactor: 1, - fontSize: 0, - fontName: "", - fontColor: new Uint8ClampedArray(3), - fillColorSpace: ColorSpace.singletons.gray, - }, - i = !1; - const a = []; + const operation = { + fn: 0, + args: [], + }; + let result = { + scaleFactor: 1, + fontSize: 0, + fontName: "", + fontColor: new Uint8ClampedArray(3), + fillColorSpace: ColorSpace.singletons.gray, + }; + let breakLoop = false; + const stack = []; try { - for (;;) { - e.args.length = 0; - if (i || !this.read(e)) break; - const { fn: s, args: r } = e; - switch (0 | s) { - case GA: - a.push({ - scaleFactor: t.scaleFactor, - fontSize: t.fontSize, - fontName: t.fontName, - fontColor: t.fontColor.slice(), - fillColorSpace: t.fillColorSpace, + while (true) { + operation.args.length = 0; + if (breakLoop || !this.read(operation)) { + break; + } + const { fn, args } = operation; + switch (fn | 0) { + case OPS.save: + stack.push({ + scaleFactor: result.scaleFactor, + fontSize: result.fontSize, + fontName: result.fontName, + fontColor: result.fontColor.slice(), + fillColorSpace: result.fillColorSpace, }); break; - case xA: - t = a.pop() || t; + case OPS.restore: + result = stack.pop() || result; break; - case Ie: - t.scaleFactor *= Math.hypot(r[0], r[1]); + case OPS.setTextMatrix: + result.scaleFactor *= Math.hypot(args[0], args[1]); break; - case se: - const [e, s] = r; - e instanceof Name && (t.fontName = e.name); - "number" == typeof s && s > 0 && (t.fontSize = s * t.scaleFactor); + case OPS.setFont: + const [fontName, fontSize] = args; + if (fontName instanceof Name) { + result.fontName = fontName.name; + } + if (typeof fontSize === "number" && fontSize > 0) { + result.fontSize = fontSize * result.scaleFactor; + } break; - case de: - t.fillColorSpace = ColorSpace.parse({ - cs: r[0], + case OPS.setFillColorSpace: + result.fillColorSpace = ColorSpace.parse({ + cs: args[0], xref: this.xref, resources: this.resources, pdfFunctionFactory: this._pdfFunctionFactory, localColorSpaceCache: this._localColorSpaceCache, }); break; - case me: - t.fillColorSpace.getRgbItem(r, 0, t.fontColor, 0); + case OPS.setFillColor: + const cs = result.fillColorSpace; + cs.getRgbItem(args, 0, result.fontColor, 0); break; - case Fe: - ColorSpace.singletons.rgb.getRgbItem(r, 0, t.fontColor, 0); + case OPS.setFillRGBColor: + ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); break; - case De: - ColorSpace.singletons.gray.getRgbItem(r, 0, t.fontColor, 0); + case OPS.setFillGray: + ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); break; - case ke: - ColorSpace.singletons.cmyk.getRgbItem(r, 0, t.fontColor, 0); + case OPS.setFillCMYKColor: + ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + break; + case OPS.showText: + case OPS.showSpacedText: + case OPS.nextLineShowText: + case OPS.nextLineSetSpacingShowText: + breakLoop = true; break; - case Ce: - case he: - case Be: - case le: - i = !0; } } - } catch (e) { - warn(`parseAppearanceStream - ignoring errors: "${e}".`); + } catch (reason) { + warn(`parseAppearanceStream - ignoring errors: "${reason}".`); } this.stream.reset(); - delete t.scaleFactor; - delete t.fillColorSpace; - return t; + delete result.scaleFactor; + delete result.fillColorSpace; + return result; } get _localColorSpaceCache() { return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); } get _pdfFunctionFactory() { - return shadow( - this, - "_pdfFunctionFactory", - new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.evaluatorOptions.isEvalSupported, - }), - ); + const pdfFunctionFactory = new PDFFunctionFactory({ + xref: this.xref, + isEvalSupported: this.evaluatorOptions.isEvalSupported, + }); + return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); } } -function getPdfColor(e, t) { - if (e[0] === e[1] && e[1] === e[2]) { - return `${numberToString(e[0] / 255)} ${t ? "g" : "G"}`; +function parseAppearanceStream(stream, evaluatorOptions, xref) { + return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse(); +} +function getPdfColor(color, isFill) { + if (color[0] === color[1] && color[1] === color[2]) { + const gray = color[0] / 255; + return `${numberToString(gray)} ${isFill ? "g" : "G"}`; } return ( - Array.from(e, (e) => numberToString(e / 255)).join(" ") + - " " + - (t ? "rg" : "RG") + Array.from(color, (c) => numberToString(c / 255)).join(" ") + + ` ${isFill ? "rg" : "RG"}` ); } +function createDefaultAppearance({ fontSize, fontName, fontColor }) { + return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; +} class FakeUnicodeFont { - constructor(e, t) { - this.xref = e; + constructor(xref, fontFamily) { + this.xref = xref; this.widths = null; - this.firstChar = 1 / 0; - this.lastChar = -1 / 0; - this.fontFamily = t; - const i = new OffscreenCanvas(1, 1); - this.ctxMeasure = i.getContext("2d", { willReadFrequently: !0 }); - FakeUnicodeFont._fontNameId || (FakeUnicodeFont._fontNameId = 1); + this.firstChar = Infinity; + this.lastChar = -Infinity; + this.fontFamily = fontFamily; + const canvas = new OffscreenCanvas(1, 1); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true, + }); + if (!FakeUnicodeFont._fontNameId) { + FakeUnicodeFont._fontNameId = 1; + } this.fontName = Name.get( - `InvalidPDFjsFont_${t}_${FakeUnicodeFont._fontNameId++}`, + `InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`, ); } get fontDescriptorRef() { if (!FakeUnicodeFont._fontDescriptorRef) { - const e = new Dict(this.xref); - e.set("Type", Name.get("FontDescriptor")); - e.set("FontName", this.fontName); - e.set("FontFamily", "MyriadPro Regular"); - e.set("FontBBox", [0, 0, 0, 0]); - e.set("FontStretch", Name.get("Normal")); - e.set("FontWeight", 400); - e.set("ItalicAngle", 0); - FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(e); + const fontDescriptor = new Dict(this.xref); + fontDescriptor.set("Type", Name.get("FontDescriptor")); + fontDescriptor.set("FontName", this.fontName); + fontDescriptor.set("FontFamily", "MyriadPro Regular"); + fontDescriptor.set("FontBBox", [0, 0, 0, 0]); + fontDescriptor.set("FontStretch", Name.get("Normal")); + fontDescriptor.set("FontWeight", 400); + fontDescriptor.set("ItalicAngle", 0); + FakeUnicodeFont._fontDescriptorRef = + this.xref.getNewPersistentRef(fontDescriptor); } return FakeUnicodeFont._fontDescriptorRef; } get descendantFontRef() { - const e = new Dict(this.xref); - e.set("BaseFont", this.fontName); - e.set("Type", Name.get("Font")); - e.set("Subtype", Name.get("CIDFontType0")); - e.set("CIDToGIDMap", Name.get("Identity")); - e.set("FirstChar", this.firstChar); - e.set("LastChar", this.lastChar); - e.set("FontDescriptor", this.fontDescriptorRef); - e.set("DW", 1e3); - const t = [], - i = [...this.widths.entries()].sort(); - let a = null, - s = null; - for (const [e, r] of i) - if (a) - if (e === a + s.length) s.push(r); - else { - t.push(a, s); - a = e; - s = [r]; - } - else { - a = e; - s = [r]; + const descendantFont = new Dict(this.xref); + descendantFont.set("BaseFont", this.fontName); + descendantFont.set("Type", Name.get("Font")); + descendantFont.set("Subtype", Name.get("CIDFontType0")); + descendantFont.set("CIDToGIDMap", Name.get("Identity")); + descendantFont.set("FirstChar", this.firstChar); + descendantFont.set("LastChar", this.lastChar); + descendantFont.set("FontDescriptor", this.fontDescriptorRef); + descendantFont.set("DW", 1000); + const widths = []; + const chars = [...this.widths.entries()].sort(); + let currentChar = null; + let currentWidths = null; + for (const [char, width] of chars) { + if (!currentChar) { + currentChar = char; + currentWidths = [width]; + continue; } - a && t.push(a, s); - e.set("W", t); - const r = new Dict(this.xref); - r.set("Ordering", "Identity"); - r.set("Registry", "Adobe"); - r.set("Supplement", 0); - e.set("CIDSystemInfo", r); - return this.xref.getNewPersistentRef(e); + if (char === currentChar + currentWidths.length) { + currentWidths.push(width); + } else { + widths.push(currentChar, currentWidths); + currentChar = char; + currentWidths = [width]; + } + } + if (currentChar) { + widths.push(currentChar, currentWidths); + } + descendantFont.set("W", widths); + const cidSystemInfo = new Dict(this.xref); + cidSystemInfo.set("Ordering", "Identity"); + cidSystemInfo.set("Registry", "Adobe"); + cidSystemInfo.set("Supplement", 0); + descendantFont.set("CIDSystemInfo", cidSystemInfo); + return this.xref.getNewPersistentRef(descendantFont); } get baseFontRef() { - const e = new Dict(this.xref); - e.set("BaseFont", this.fontName); - e.set("Type", Name.get("Font")); - e.set("Subtype", Name.get("Type0")); - e.set("Encoding", Name.get("Identity-H")); - e.set("DescendantFonts", [this.descendantFontRef]); - e.set("ToUnicode", Name.get("Identity-H")); - return this.xref.getNewPersistentRef(e); + const baseFont = new Dict(this.xref); + baseFont.set("BaseFont", this.fontName); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type0")); + baseFont.set("Encoding", Name.get("Identity-H")); + baseFont.set("DescendantFonts", [this.descendantFontRef]); + baseFont.set("ToUnicode", Name.get("Identity-H")); + return this.xref.getNewPersistentRef(baseFont); } get resources() { - const e = new Dict(this.xref), - t = new Dict(this.xref); - t.set(this.fontName.name, this.baseFontRef); - e.set("Font", t); - return e; + const resources = new Dict(this.xref); + const font = new Dict(this.xref); + font.set(this.fontName.name, this.baseFontRef); + resources.set("Font", font); + return resources; } _createContext() { this.widths = new Map(); this.ctxMeasure.font = `1000px ${this.fontFamily}`; return this.ctxMeasure; } - createFontResources(e) { - const t = this._createContext(); - for (const i of e.split(/\r\n?|\n/)) - for (const e of i.split("")) { - const i = e.charCodeAt(0); - if (this.widths.has(i)) continue; - const a = t.measureText(e), - s = Math.ceil(a.width); - this.widths.set(i, s); - this.firstChar = Math.min(i, this.firstChar); - this.lastChar = Math.max(i, this.lastChar); + createFontResources(text) { + const ctx = this._createContext(); + for (const line of text.split(/\r\n?|\n/)) { + for (const char of line.split("")) { + const code = char.charCodeAt(0); + if (this.widths.has(code)) { + continue; + } + const metrics = ctx.measureText(char); + const width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); } + } return this.resources; } - static getFirstPositionInfo(e, t, i) { - const [a, n, g, o] = e; - let c = g - a, - C = o - n; - t % 180 != 0 && ([c, C] = [C, c]); - const h = s * i; + static getFirstPositionInfo(rect, rotation, fontSize) { + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; + } + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; return { - coords: [0, C + r * i - h], - bbox: [0, 0, c, C], - matrix: 0 !== t ? getRotationMatrix(t, C, h) : void 0, + coords: [0, h + lineDescent - lineHeight], + bbox: [0, 0, w, h], + matrix: + rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined, }; } - createAppearance(e, t, i, a, n, g) { - const o = this._createContext(), - c = []; - let C = -1 / 0; - for (const t of e.split(/\r\n?|\n/)) { - c.push(t); - const e = o.measureText(t).width; - C = Math.max(C, e); - for (const e of codePointIter(t)) { - const t = String.fromCodePoint(e); - let i = this.widths.get(e); - if (void 0 === i) { - const a = o.measureText(t); - i = Math.ceil(a.width); - this.widths.set(e, i); - this.firstChar = Math.min(e, this.firstChar); - this.lastChar = Math.max(e, this.lastChar); + createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) { + const ctx = this._createContext(); + const lines = []; + let maxWidth = -Infinity; + for (const line of text.split(/\r\n?|\n/)) { + lines.push(line); + const lineWidth = ctx.measureText(line).width; + maxWidth = Math.max(maxWidth, lineWidth); + for (const code of codePointIter(line)) { + const char = String.fromCodePoint(code); + let width = this.widths.get(code); + if (width === undefined) { + const metrics = ctx.measureText(char); + width = Math.ceil(metrics.width); + this.widths.set(code, width); + this.firstChar = Math.min(code, this.firstChar); + this.lastChar = Math.max(code, this.lastChar); } } } - C *= a / 1e3; - const [h, l, Q, E] = t; - let u = Q - h, - d = E - l; - i % 180 != 0 && ([u, d] = [d, u]); - let f = 1; - C > u && (f = u / C); - let p = 1; - const m = s * a, - y = r * a, - w = m * c.length; - w > d && (p = d / w); - const D = a * Math.min(f, p), - b = [ - "q", - `0 0 ${numberToString(u)} ${numberToString(d)} re W n`, - "BT", - `1 0 0 1 0 ${numberToString(d + y)} Tm 0 Tc ${getPdfColor(n, !0)}`, - `/${this.fontName.name} ${numberToString(D)} Tf`, - ], - { resources: F } = this; - if (1 !== (g = "number" == typeof g && g >= 0 && g <= 1 ? g : 1)) { - b.push("/R0 gs"); - const e = new Dict(this.xref), - t = new Dict(this.xref); - t.set("ca", g); - t.set("CA", g); - t.set("Type", Name.get("ExtGState")); - e.set("R0", t); - F.set("ExtGState", e); + maxWidth *= fontSize / 1000; + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; } - const S = numberToString(m); - for (const e of c) b.push(`0 -${S} Td <${stringToUTF16HexString(e)}> Tj`); - b.push("ET", "Q"); - const k = b.join("\n"), - R = new Dict(this.xref); - R.set("Subtype", Name.get("Form")); - R.set("Type", Name.get("XObject")); - R.set("BBox", [0, 0, u, d]); - R.set("Length", k.length); - R.set("Resources", F); - if (i) { - const e = getRotationMatrix(i, u, d); - R.set("Matrix", e); + let hscale = 1; + if (maxWidth > w) { + hscale = w / maxWidth; } - const N = new StringStream(k); - N.dict = R; - return N; + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineDescent = LINE_DESCENT_FACTOR * fontSize; + const maxHeight = lineHeight * lines.length; + if (maxHeight > h) { + vscale = h / maxHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + const buffer = [ + "q", + `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, + `BT`, + `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, + `/${this.fontName.name} ${numberToString(newFontSize)} Tf`, + ]; + const { resources } = this; + strokeAlpha = + typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 + ? strokeAlpha + : 1; + if (strokeAlpha !== 1) { + buffer.push("/R0 gs"); + const extGState = new Dict(this.xref); + const r0 = new Dict(this.xref); + r0.set("ca", strokeAlpha); + r0.set("CA", strokeAlpha); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + } + const vShift = numberToString(lineHeight); + for (const line of lines) { + buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`); + } + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(this.xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, w, h]); + appearanceStreamDict.set("Length", appearance.length); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, w, h); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } -} +} // ./src/core/name_number_tree.js + class NameOrNumberTree { - constructor(e, t, i) { - this.constructor === NameOrNumberTree && - unreachable("Cannot initialize NameOrNumberTree."); - this.root = e; - this.xref = t; - this._type = i; + constructor(root, xref, type) { + this.root = root; + this.xref = xref; + this._type = type; } getAll() { - const e = new Map(); - if (!this.root) return e; - const t = this.xref, - i = new RefSet(); - i.put(this.root); - const a = [this.root]; - for (; a.length > 0; ) { - const s = t.fetchIfRef(a.shift()); - if (!(s instanceof Dict)) continue; - if (s.has("Kids")) { - const e = s.get("Kids"); - if (!Array.isArray(e)) continue; - for (const t of e) { - if (i.has(t)) + const map = new Map(); + if (!this.root) { + return map; + } + const xref = this.xref; + const processed = new RefSet(); + processed.put(this.root); + const queue = [this.root]; + while (queue.length > 0) { + const obj = xref.fetchIfRef(queue.shift()); + if (!(obj instanceof Dict)) { + continue; + } + if (obj.has("Kids")) { + const kids = obj.get("Kids"); + if (!Array.isArray(kids)) { + continue; + } + for (const kid of kids) { + if (processed.has(kid)) { throw new FormatError(`Duplicate entry in "${this._type}" tree.`); - a.push(t); - i.put(t); + } + queue.push(kid); + processed.put(kid); } continue; } - const r = s.get(this._type); - if (Array.isArray(r)) - for (let i = 0, a = r.length; i < a; i += 2) - e.set(t.fetchIfRef(r[i]), t.fetchIfRef(r[i + 1])); + 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 e; + return map; } - get(e) { - if (!this.root) return null; - const t = this.xref; - let i = t.fetchIfRef(this.root), - a = 0; - for (; i.has("Kids"); ) { - if (++a > 10) { + getRaw(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) { warn(`Search depth limit reached for "${this._type}" tree.`); return null; } - const s = i.get("Kids"); - if (!Array.isArray(s)) return null; - let r = 0, - n = s.length - 1; - for (; r <= n; ) { - const a = (r + n) >> 1, - g = t.fetchIfRef(s[a]), - o = g.get("Limits"); - if (e < t.fetchIfRef(o[0])) n = a - 1; - else { - if (!(e > t.fetchIfRef(o[1]))) { - i = g; - break; - } - r = a + 1; + 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 = kid; + break; } } - if (r > n) return null; + if (l > r) { + return null; + } } - const s = i.get(this._type); - if (Array.isArray(s)) { - let i = 0, - a = s.length - 2; - for (; i <= a; ) { - const r = (i + a) >> 1, - n = r + (1 & r), - g = t.fetchIfRef(s[n]); - if (e < g) a = n - 2; - else { - if (!(e > g)) return t.fetchIfRef(s[n + 1]); - i = n + 2; + 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 entries[m + 1]; } } } return null; } + get(key) { + return this.xref.fetchIfRef(this.getRaw(key)); + } } class NameTree extends NameOrNumberTree { - constructor(e, t) { - super(e, t, "Names"); + constructor(root, xref) { + super(root, xref, "Names"); } } class NumberTree extends NameOrNumberTree { - constructor(e, t) { - super(e, t, "Nums"); + constructor(root, xref) { + super(root, xref, "Nums"); } -} +} // ./src/core/cleanup_helper.js + function clearGlobalCaches() { - !(function clearPatternCaches() { - ya = Object.create(null); - })(); - !(function clearPrimitiveCaches() { - mt = Object.create(null); - yt = Object.create(null); - wt = Object.create(null); - })(); - !(function clearUnicodeCaches() { - Ji.clear(); - })(); + clearPatternCaches(); + clearPrimitiveCaches(); + clearUnicodeCaches(); JpxImage.cleanup(); +} // ./src/core/file_spec.js + +function pickPlatformItem(dict) { + if (!(dict instanceof Dict)) { + return null; + } + 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; } -function pickPlatformItem(e) { - return e instanceof Dict - ? e.has("UF") - ? e.get("UF") - : e.has("F") - ? e.get("F") - : e.has("Unix") - ? e.get("Unix") - : e.has("Mac") - ? e.get("Mac") - : e.has("DOS") - ? e.get("DOS") - : null - : null; +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); } class FileSpec { - #S = !1; - constructor(e, t, i = !1) { - if (e instanceof Dict) { - this.xref = t; - this.root = e; - e.has("FS") && (this.fs = e.get("FS")); - e.has("RF") && warn("Related file specifications are not supported"); - i || - (e.has("EF") - ? (this.#S = !0) - : warn("Non-embedded file specifications are not supported")); + #contentAvailable = false; + constructor(root, xref, skipContent = false) { + if (!(root instanceof Dict)) { + return; + } + this.xref = xref; + this.root = root; + if (root.has("FS")) { + this.fs = root.get("FS"); + } + if (root.has("RF")) { + warn("Related file specifications are not supported"); + } + if (!skipContent) { + if (root.has("EF")) { + this.#contentAvailable = true; + } else { + warn("Non-embedded file specifications are not supported"); + } } } get filename() { - let e = ""; - const t = pickPlatformItem(this.root); - t && - "string" == typeof t && - (e = stringToPDFString(t) + let filename = ""; + const item = pickPlatformItem(this.root); + if (item && typeof item === "string") { + filename = stringToPDFString(item) .replaceAll("\\\\", "\\") .replaceAll("\\/", "/") - .replaceAll("\\", "/")); - return shadow(this, "filename", e || "unnamed"); + .replaceAll("\\", "/"); + } + return shadow(this, "filename", filename || "unnamed"); } get content() { - if (!this.#S) return null; + if (!this.#contentAvailable) { + return null; + } this._contentRef ||= pickPlatformItem(this.root?.get("EF")); - let e = null; + let content = null; if (this._contentRef) { - const t = this.xref.fetchIfRef(this._contentRef); - t instanceof BaseStream - ? (e = t.getBytes()) - : warn( - "Embedded file specification points to non-existing/invalid content", - ); - } else warn("Embedded file specification does not have any content"); - return e; + const fileObj = this.xref.fetchIfRef(this._contentRef); + if (fileObj instanceof BaseStream) { + content = fileObj.getBytes(); + } else { + warn( + "Embedded file specification points to non-existing/invalid content", + ); + } + } else { + warn("Embedded file specification does not have any content"); + } + return content; } get description() { - let e = ""; - const t = this.root?.get("Desc"); - t && "string" == typeof t && (e = stringToPDFString(t)); - return shadow(this, "description", e); + let description = ""; + const desc = this.root?.get("Desc"); + if (desc && typeof desc === "string") { + description = stringToPDFString(desc); + } + return shadow(this, "description", description); } get serializable() { return { rawFilename: this.filename, - filename: ((e = this.filename), e.substring(e.lastIndexOf("/") + 1)), + filename: stripPath(this.filename), content: this.content, description: this.description, }; - var e; } +} // ./src/core/xml_parser.js + +const XMLParserErrorCode = { + NoError: 0, + EndOfDocument: -1, + UnterminatedCdat: -2, + UnterminatedXmlDeclaration: -3, + UnterminatedDoctypeDeclaration: -4, + UnterminatedComment: -5, + MalformedElement: -6, + OutOfMemory: -7, + UnterminatedAttributeValue: -8, + UnterminatedElement: -9, + ElementNeverBegun: -10, +}; +function isWhitespace(s, index) { + const ch = s[index]; + return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; } -const Rs = 0, - Ns = -2, - Gs = -3, - xs = -4, - Us = -5, - Ms = -6, - Ls = -9; -function isWhitespace(e, t) { - const i = e[t]; - return " " === i || "\n" === i || "\r" === i || "\t" === i; +function isWhitespaceString(s) { + for (let i = 0, ii = s.length; i < ii; i++) { + if (!isWhitespace(s, i)) { + return false; + } + } + return true; } class XMLParserBase { - _resolveEntities(e) { - return e.replaceAll(/&([^;]+);/g, (e, t) => { - if ("#x" === t.substring(0, 2)) - return String.fromCodePoint(parseInt(t.substring(2), 16)); - if ("#" === t.substring(0, 1)) - return String.fromCodePoint(parseInt(t.substring(1), 10)); - switch (t) { + _resolveEntities(s) { + return s.replaceAll(/&([^;]+);/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": @@ -37317,196 +44720,248 @@ class XMLParserBase { case "apos": return "'"; } - return this.onResolveEntity(t); + return this.onResolveEntity(entity); }); } - _parseContent(e, t) { - const i = []; - let a = t; + _parseContent(s, start) { + const attributes = []; + let pos = start; function skipWs() { - for (; a < e.length && isWhitespace(e, a); ) ++a; + while (pos < s.length && isWhitespace(s, pos)) { + ++pos; + } } - for ( - ; - a < e.length && !isWhitespace(e, a) && ">" !== e[a] && "/" !== e[a]; - - ) - ++a; - const s = e.substring(t, a); + while ( + pos < s.length && + !isWhitespace(s, pos) && + s[pos] !== ">" && + s[pos] !== "/" + ) { + ++pos; + } + const name = s.substring(start, pos); skipWs(); - for (; a < e.length && ">" !== e[a] && "/" !== e[a] && "?" !== e[a]; ) { + while ( + pos < s.length && + s[pos] !== ">" && + s[pos] !== "/" && + s[pos] !== "?" + ) { skipWs(); - let t = "", - s = ""; - for (; a < e.length && !isWhitespace(e, a) && "=" !== e[a]; ) { - t += e[a]; - ++a; + let attrName = "", + attrValue = ""; + while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { + attrName += s[pos]; + ++pos; } skipWs(); - if ("=" !== e[a]) return null; - ++a; + if (s[pos] !== "=") { + return null; + } + ++pos; skipWs(); - const r = e[a]; - if ('"' !== r && "'" !== r) return null; - const n = e.indexOf(r, ++a); - if (n < 0) return null; - s = e.substring(a, n); - i.push({ name: t, value: this._resolveEntities(s) }); - a = n + 1; + 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: s, attributes: i, parsed: a - t }; + return { + name, + attributes, + parsed: pos - start, + }; } - _parseProcessingInstruction(e, t) { - let i = t; - for ( - ; - i < e.length && - !isWhitespace(e, i) && - ">" !== e[i] && - "?" !== e[i] && - "/" !== e[i]; - - ) - ++i; - const a = e.substring(t, i); - !(function skipWs() { - for (; i < e.length && isWhitespace(e, i); ) ++i; - })(); - const s = i; - for (; i < e.length && ("?" !== e[i] || ">" !== e[i + 1]); ) ++i; - return { name: a, value: e.substring(s, i), parsed: i - t }; + _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(e) { - let t = 0; - for (; t < e.length; ) { - let i = t; - if ("<" === e[t]) { - ++i; - let t; - switch (e[i]) { + 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 "/": - ++i; - t = e.indexOf(">", i); - if (t < 0) { - this.onError(Ls); + ++j; + q = s.indexOf(">", j); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedElement); return; } - this.onEndElement(e.substring(i, t)); - i = t + 1; + this.onEndElement(s.substring(j, q)); + j = q + 1; break; case "?": - ++i; - const a = this._parseProcessingInstruction(e, i); - if ("?>" !== e.substring(i + a.parsed, i + a.parsed + 2)) { - this.onError(Gs); + ++j; + const pi = this._parseProcessingInstruction(s, j); + if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { + this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); return; } - this.onPi(a.name, a.value); - i += a.parsed + 2; + this.onPi(pi.name, pi.value); + j += pi.parsed + 2; break; case "!": - if ("--" === e.substring(i + 1, i + 3)) { - t = e.indexOf("--\x3e", i + 3); - if (t < 0) { - this.onError(Us); + if (s.substring(j + 1, j + 3) === "--") { + q = s.indexOf("-->", j + 3); + if (q < 0) { + this.onError(XMLParserErrorCode.UnterminatedComment); return; } - this.onComment(e.substring(i + 3, t)); - i = t + 3; - } else if ("[CDATA[" === e.substring(i + 1, i + 8)) { - t = e.indexOf("]]>", i + 8); - if (t < 0) { - this.onError(Ns); + 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(e.substring(i + 8, t)); - i = t + 3; - } else { - if ("DOCTYPE" !== e.substring(i + 1, i + 8)) { - this.onError(Ms); + 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; } - { - const a = e.indexOf("[", i + 8); - let s = !1; - t = e.indexOf(">", i + 8); - if (t < 0) { - this.onError(xs); + if (q2 > 0 && q > q2) { + q = s.indexOf("]>", j + 8); + if (q < 0) { + this.onError( + XMLParserErrorCode.UnterminatedDoctypeDeclaration, + ); return; } - if (a > 0 && t > a) { - t = e.indexOf("]>", i + 8); - if (t < 0) { - this.onError(xs); - return; - } - s = !0; - } - const r = e.substring(i + 8, t + (s ? 1 : 0)); - this.onDoctype(r); - i = t + (s ? 2 : 1); + 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 s = this._parseContent(e, i); - if (null === s) { - this.onError(Ms); + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); return; } - let r = !1; - if ("/>" === e.substring(i + s.parsed, i + s.parsed + 2)) r = !0; - else if (">" !== e.substring(i + s.parsed, i + s.parsed + 1)) { - this.onError(Ls); + 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(s.name, s.attributes, r); - i += s.parsed + (r ? 2 : 1); + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; } } else { - for (; i < e.length && "<" !== e[i]; ) i++; - const a = e.substring(t, i); - this.onText(this._resolveEntities(a)); + while (j < s.length && s[j] !== "<") { + j++; + } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); } - t = i; + i = j; } } - onResolveEntity(e) { - return `&${e};`; + onResolveEntity(name) { + return `&${name};`; } - onPi(e, t) {} - onComment(e) {} - onCdata(e) {} - onDoctype(e) {} - onText(e) {} - onBeginElement(e, t, i) {} - onEndElement(e) {} - onError(e) {} + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} } class SimpleDOMNode { - constructor(e, t) { - this.nodeName = e; - this.nodeValue = t; - Object.defineProperty(this, "parentNode", { value: null, writable: !0 }); + constructor(nodeName, nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + Object.defineProperty(this, "parentNode", { + value: null, + writable: true, + }); } get firstChild() { return this.childNodes?.[0]; } get nextSibling() { - const e = this.parentNode.childNodes; - if (!e) return; - const t = e.indexOf(this); - return -1 !== t ? e[t + 1] : void 0; + 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 - ? this.childNodes - .map(function (e) { - return e.textContent; - }) - .join("") - : this.nodeValue || ""; + .map(function (child) { + return child.textContent; + }) + .join(""); } get children() { return this.childNodes || []; @@ -37514,2523 +44969,3235 @@ class SimpleDOMNode { hasChildNodes() { return this.childNodes?.length > 0; } - searchNode(e, t) { - if (t >= e.length) return this; - const i = e[t]; - if (i.name.startsWith("#") && t < e.length - 1) - return this.searchNode(e, t + 1); - const a = []; - let s = this; - for (;;) { - if (i.name === s.nodeName) { - if (0 !== i.pos) { - if (0 === a.length) return null; - { - const [r] = a.pop(); - let n = 0; - for (const a of r.childNodes) - if (i.name === a.nodeName) { - if (n === i.pos) return a.searchNode(e, t + 1); - n++; - } - return s.searchNode(e, t + 1); + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; + } + const component = paths[pos]; + if (component.name.startsWith("#") && pos < paths.length - 1) { + return this.searchNode(paths, pos + 1); + } + 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; } - } - { - const i = s.searchNode(e, t + 1); - if (null !== i) return i; + } 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 (s.childNodes?.length > 0) { - a.push([s, 0]); - s = s.childNodes[0]; + if (node.childNodes?.length > 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; } else { - if (0 === a.length) return null; - for (; 0 !== a.length; ) { - const [e, t] = a.pop(), - i = t + 1; - if (i < e.childNodes.length) { - a.push([e, i]); - s = e.childNodes[i]; + 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 (0 === a.length) return null; + if (stack.length === 0) { + return null; + } } } } - dump(e) { - if ("#text" !== this.nodeName) { - e.push(`<${this.nodeName}`); - if (this.attributes) - for (const t of this.attributes) - e.push(` ${t.name}="${encodeToXmlString(t.value)}"`); - if (this.hasChildNodes()) { - e.push(">"); - for (const t of this.childNodes) t.dump(e); - e.push(``); - } else - this.nodeValue - ? e.push(`>${encodeToXmlString(this.nodeValue)}`) - : e.push("/>"); - } else e.push(encodeToXmlString(this.nodeValue)); + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push(encodeToXmlString(this.nodeValue)); + return; + } + buffer.push(`<${this.nodeName}`); + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push( + ` ${attribute.name}="${encodeToXmlString(attribute.value)}"`, + ); + } + } + if (this.hasChildNodes()) { + buffer.push(">"); + for (const child of this.childNodes) { + child.dump(buffer); + } + buffer.push(``); + } else if (this.nodeValue) { + buffer.push(`>${encodeToXmlString(this.nodeValue)}`); + } else { + buffer.push("/>"); + } } } class SimpleXMLParser extends XMLParserBase { - constructor({ hasAttributes: e = !1, lowerCaseName: t = !1 }) { + constructor({ hasAttributes = false, lowerCaseName = false }) { super(); this._currentFragment = null; this._stack = null; - this._errorCode = Rs; - this._hasAttributes = e; - this._lowerCaseName = t; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; } - parseFromString(e) { + parseFromString(data) { this._currentFragment = []; this._stack = []; - this._errorCode = Rs; - this.parseXml(e); - if (this._errorCode !== Rs) return; - const [t] = this._currentFragment; - return t ? { documentElement: t } : void 0; + 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(e) { - if ( - (function isWhitespaceString(e) { - for (let t = 0, i = e.length; t < i; t++) - if (!isWhitespace(e, t)) return !1; - return !0; - })(e) - ) + onText(text) { + if (isWhitespaceString(text)) { return; - const t = new SimpleDOMNode("#text", e); - this._currentFragment.push(t); + } + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); } - onCdata(e) { - const t = new SimpleDOMNode("#text", e); - this._currentFragment.push(t); + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); } - onBeginElement(e, t, i) { - this._lowerCaseName && (e = e.toLowerCase()); - const a = new SimpleDOMNode(e); - a.childNodes = []; - this._hasAttributes && (a.attributes = t); - this._currentFragment.push(a); - if (!i) { - this._stack.push(this._currentFragment); - this._currentFragment = a.childNodes; + 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.at(-1); + if (!lastElement) { + return null; + } + for (const childNode of lastElement.childNodes) { + childNode.parentNode = lastElement; + } + return lastElement; + } + onError(code) { + this._errorCode = code; + } +} // ./src/core/metadata_parser.js + +class MetadataParser { + constructor(data) { + data = this._repair(data); + const parser = new SimpleXMLParser({ + lowerCaseName: true, + }); + const xmlDocument = parser.parseFromString(data); + this._metadataMap = new Map(); + this._data = data; + if (xmlDocument) { + this._parse(xmlDocument); } } - onEndElement(e) { - this._currentFragment = this._stack.pop() || []; - const t = this._currentFragment.at(-1); - if (!t) return null; - for (const e of t.childNodes) e.parentNode = t; - return t; - } - onError(e) { - this._errorCode = e; - } -} -class MetadataParser { - constructor(e) { - e = this._repair(e); - const t = new SimpleXMLParser({ lowerCaseName: !0 }).parseFromString(e); - this._metadataMap = new Map(); - this._data = e; - t && this._parse(t); - } - _repair(e) { - return e + _repair(data) { + return data .replace(/^[^<]+/, "") - .replaceAll(/>\\376\\377([^<]+)/g, function (e, t) { - const i = t - .replaceAll(/\\([0-3])([0-7])([0-7])/g, function (e, t, i, a) { - return String.fromCharCode(64 * t + 8 * i + 1 * a); - }) - .replaceAll(/&(amp|apos|gt|lt|quot);/g, function (e, t) { - switch (t) { - case "amp": - return "&"; - case "apos": - return "'"; - case "gt": - return ">"; - case "lt": - return "<"; - case "quot": - return '"'; - } - throw new Error(`_repair: ${t} isn't defined.`); - }), - a = [">"]; - for (let e = 0, t = i.length; e < t; e += 2) { - const t = 256 * i.charCodeAt(e) + i.charCodeAt(e + 1); - t >= 32 && t < 127 && 60 !== t && 62 !== t && 38 !== t - ? a.push(String.fromCharCode(t)) - : a.push("&#x" + (65536 + t).toString(16).substring(1) + ";"); + .replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes + .replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }) + .replaceAll(/&(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 a.join(""); + return charBuf.join(""); }); } - _getSequence(e) { - const t = e.nodeName; - return "rdf:bag" !== t && "rdf:seq" !== t && "rdf:alt" !== t - ? null - : e.childNodes.filter((e) => "rdf:li" === e.nodeName); - } - _parseArray(e) { - if (!e.hasChildNodes()) return; - const [t] = e.childNodes, - i = this._getSequence(t) || []; - this._metadataMap.set( - e.nodeName, - i.map((e) => e.textContent.trim()), - ); - } - _parse(e) { - let t = e.documentElement; - if ("rdf:rdf" !== t.nodeName) { - t = t.firstChild; - for (; t && "rdf:rdf" !== t.nodeName; ) t = t.nextSibling; + _getSequence(entry) { + const name = entry.nodeName; + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; } - if (t && "rdf:rdf" === t.nodeName && t.hasChildNodes()) - for (const e of t.childNodes) - if ("rdf:description" === e.nodeName) - for (const t of e.childNodes) { - const e = t.nodeName; - switch (e) { - case "#text": - continue; - case "dc:creator": - case "dc:subject": - this._parseArray(t); - continue; - } - this._metadataMap.set(e, t.textContent.trim()); - } + return entry.childNodes.filter((node) => node.nodeName === "rdf:li"); } - get serializable() { - return { parsedData: this._metadataMap, rawData: this._data }; - } -} -class DecryptStream extends DecodeStream { - constructor(e, t, i) { - super(t); - this.str = e; - this.dict = e.dict; - this.decrypt = i; - this.nextChunk = null; - this.initialized = !1; - } - readBlock() { - let e; - if (this.initialized) e = this.nextChunk; - else { - e = this.str.getBytes(512); - this.initialized = !0; - } - if (!e || 0 === e.length) { - this.eof = !0; + _parseArray(entry) { + if (!entry.hasChildNodes()) { return; } - this.nextChunk = this.str.getBytes(512); - const t = this.nextChunk?.length > 0; - e = (0, this.decrypt)(e, !t); - const i = this.bufferLength, - a = i + e.length; - this.ensureBuffer(a).set(e, i); - this.bufferLength = a; + 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, + }; + } +} // ./src/core/decrypt_stream.js + +const chunkSize = 512; +class DecryptStream extends 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?.length > 0; + const decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + const bufferLength = this.bufferLength, + newLength = bufferLength + chunk.length, + buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } +} // ./src/core/crypto.js + class ARCFourCipher { - constructor(e) { + constructor(key) { this.a = 0; this.b = 0; - const t = new Uint8Array(256), - i = e.length; - for (let e = 0; e < 256; ++e) t[e] = e; - for (let a = 0, s = 0; a < 256; ++a) { - const r = t[a]; - s = (s + r + e[a % i]) & 255; - t[a] = t[s]; - t[s] = r; + const s = new Uint8Array(256); + const keyLength = key.length; + for (let i = 0; i < 256; ++i) { + s[i] = i; } - this.s = t; - } - encryptBlock(e) { - let t = this.a, - i = this.b; - const a = this.s, - s = e.length, - r = new Uint8Array(s); - for (let n = 0; n < s; ++n) { - t = (t + 1) & 255; - const s = a[t]; - i = (i + s) & 255; - const g = a[i]; - a[t] = g; - a[i] = s; - r[n] = e[n] ^ a[(s + g) & 255]; + 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.a = t; - this.b = i; - return r; + this.s = s; } - decryptBlock(e) { - return this.encryptBlock(e); + 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; } - encrypt(e) { - return this.encryptBlock(e); + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); } } -const Hs = (function calculateMD5Closure() { - const e = 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, - ]), - t = 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, - ]); - return function hash(i, a, s) { - let r = 1732584193, - n = -271733879, - g = -1732584194, - o = 271733878; - const c = (s + 72) & -64, - C = new Uint8Array(c); - let h, l; - for (h = 0; h < s; ++h) C[h] = i[a++]; - C[h++] = 128; - const Q = c - 8; - for (; h < Q; ) C[h++] = 0; - C[h++] = (s << 3) & 255; - C[h++] = (s >> 5) & 255; - C[h++] = (s >> 13) & 255; - C[h++] = (s >> 21) & 255; - C[h++] = (s >>> 29) & 255; - C[h++] = 0; - C[h++] = 0; - C[h++] = 0; - const E = new Int32Array(16); - for (h = 0; h < c; ) { - for (l = 0; l < 16; ++l, h += 4) - E[l] = C[h] | (C[h + 1] << 8) | (C[h + 2] << 16) | (C[h + 3] << 24); - let i, - a, - s = r, - c = n, - Q = g, - u = o; - for (l = 0; l < 64; ++l) { - if (l < 16) { - i = (c & Q) | (~c & u); - a = l; - } else if (l < 32) { - i = (u & c) | (~u & Q); - a = (5 * l + 1) & 15; - } else if (l < 48) { - i = c ^ Q ^ u; - a = (3 * l + 5) & 15; - } else { - i = Q ^ (c | ~u); - a = (7 * l) & 15; - } - const r = u, - n = (s + i + t[l] + E[a]) | 0, - g = e[l]; - u = Q; - Q = c; - c = (c + ((n << g) | (n >>> (32 - g)))) | 0; - s = r; +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); } - r = (r + s) | 0; - n = (n + c) | 0; - g = (g + Q) | 0; - o = (o + u) | 0; + 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([ - 255 & r, - (r >> 8) & 255, - (r >> 16) & 255, - (r >>> 24) & 255, - 255 & n, - (n >> 8) & 255, - (n >> 16) & 255, - (n >>> 24) & 255, - 255 & g, - (g >> 8) & 255, - (g >> 16) & 255, - (g >>> 24) & 255, - 255 & o, - (o >> 8) & 255, - (o >> 16) & 255, - (o >>> 24) & 255, + 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; })(); class Word64 { - constructor(e, t) { - this.high = 0 | e; - this.low = 0 | t; + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; } - and(e) { - this.high &= e.high; - this.low &= e.low; + and(word) { + this.high &= word.high; + this.low &= word.low; } - xor(e) { - this.high ^= e.high; - this.low ^= e.low; + xor(word) { + this.high ^= word.high; + this.low ^= word.low; } - or(e) { - this.high |= e.high; - this.low |= e.low; + or(word) { + this.high |= word.high; + this.low |= word.low; } - shiftRight(e) { - if (e >= 32) { - this.low = (this.high >>> (e - 32)) | 0; + shiftRight(places) { + if (places >= 32) { + this.low = (this.high >>> (places - 32)) | 0; this.high = 0; } else { - this.low = (this.low >>> e) | (this.high << (32 - e)); - this.high = (this.high >>> e) | 0; + this.low = (this.low >>> places) | (this.high << (32 - places)); + this.high = (this.high >>> places) | 0; } } - shiftLeft(e) { - if (e >= 32) { - this.high = this.low << (e - 32); + shiftLeft(places) { + if (places >= 32) { + this.high = this.low << (places - 32); this.low = 0; } else { - this.high = (this.high << e) | (this.low >>> (32 - e)); - this.low <<= e; + this.high = (this.high << places) | (this.low >>> (32 - places)); + this.low <<= places; } } - rotateRight(e) { - let t, i; - if (32 & e) { - i = this.low; - t = this.high; + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; } else { - t = this.low; - i = this.high; + low = this.low; + high = this.high; } - e &= 31; - this.low = (t >>> e) | (i << (32 - e)); - this.high = (i >>> e) | (t << (32 - e)); + 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(e) { - const t = (this.low >>> 0) + (e.low >>> 0); - let i = (this.high >>> 0) + (e.high >>> 0); - t > 4294967295 && (i += 1); - this.low = 0 | t; - this.high = 0 | i; + 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(e, t) { - e[t] = (this.high >>> 24) & 255; - e[t + 1] = (this.high >> 16) & 255; - e[t + 2] = (this.high >> 8) & 255; - e[t + 3] = 255 & this.high; - e[t + 4] = (this.low >>> 24) & 255; - e[t + 5] = (this.low >> 16) & 255; - e[t + 6] = (this.low >> 8) & 255; - e[t + 7] = 255 & this.low; + 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(e) { - this.high = e.high; - this.low = e.low; + assign(word) { + this.high = word.high; + this.low = word.low; } } -const Js = (function calculateSHA256Closure() { - function rotr(e, t) { - return (e >>> t) | (e << (32 - t)); - } - function ch(e, t, i) { - return (e & t) ^ (~e & i); - } - function maj(e, t, i) { - return (e & t) ^ (e & i) ^ (t & i); - } - function sigma(e) { - return rotr(e, 2) ^ rotr(e, 13) ^ rotr(e, 22); - } - function sigmaPrime(e) { - return rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25); - } - function littleSigma(e) { - return rotr(e, 7) ^ rotr(e, 18) ^ (e >>> 3); - } - const e = [ - 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, - 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, - 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, - 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, - 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, - 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, - 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, - 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, - 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, - 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, - 2428436474, 2756734187, 3204031479, 3329325298, - ]; - return function hash(t, i, a) { - let s = 1779033703, - r = 3144134277, - n = 1013904242, - g = 2773480762, - o = 1359893119, - c = 2600822924, - C = 528734635, - h = 1541459225; - const l = 64 * Math.ceil((a + 9) / 64), - Q = new Uint8Array(l); - let E, u; - for (E = 0; E < a; ++E) Q[E] = t[i++]; - Q[E++] = 128; - const d = l - 8; - for (; E < d; ) Q[E++] = 0; - Q[E++] = 0; - Q[E++] = 0; - Q[E++] = 0; - Q[E++] = (a >>> 29) & 255; - Q[E++] = (a >> 21) & 255; - Q[E++] = (a >> 13) & 255; - Q[E++] = (a >> 5) & 255; - Q[E++] = (a << 3) & 255; - const f = new Uint32Array(64); - for (E = 0; E < l; ) { - for (u = 0; u < 16; ++u) { - f[u] = (Q[E] << 24) | (Q[E + 1] << 16) | (Q[E + 2] << 8) | Q[E + 3]; - E += 4; - } - for (u = 16; u < 64; ++u) - f[u] = - ((rotr((p = f[u - 2]), 17) ^ rotr(p, 19) ^ (p >>> 10)) + - f[u - 7] + - littleSigma(f[u - 15]) + - f[u - 16]) | - 0; - let t, - i, - a = s, - l = r, - d = n, - m = g, - y = o, - w = c, - D = C, - b = h; - for (u = 0; u < 64; ++u) { - t = b + sigmaPrime(y) + ch(y, w, D) + e[u] + f[u]; - i = sigma(a) + maj(a, l, d); - b = D; - D = w; - w = y; - y = (m + t) | 0; - m = d; - d = l; - l = a; - a = (t + i) | 0; - } - s = (s + a) | 0; - r = (r + l) | 0; - n = (n + d) | 0; - g = (g + m) | 0; - o = (o + y) | 0; - c = (c + w) | 0; - C = (C + D) | 0; - h = (h + b) | 0; - } - var p; - return new Uint8Array([ - (s >> 24) & 255, - (s >> 16) & 255, - (s >> 8) & 255, - 255 & s, - (r >> 24) & 255, - (r >> 16) & 255, - (r >> 8) & 255, - 255 & r, - (n >> 24) & 255, - (n >> 16) & 255, - (n >> 8) & 255, - 255 & n, - (g >> 24) & 255, - (g >> 16) & 255, - (g >> 8) & 255, - 255 & g, - (o >> 24) & 255, - (o >> 16) & 255, - (o >> 8) & 255, - 255 & o, - (c >> 24) & 255, - (c >> 16) & 255, - (c >> 8) & 255, - 255 & c, - (C >> 24) & 255, - (C >> 16) & 255, - (C >> 8) & 255, - 255 & C, - (h >> 24) & 255, - (h >> 16) & 255, - (h >> 8) & 255, - 255 & h, - ]); - }; - })(), - Ys = (function calculateSHA512Closure() { - function ch(e, t, i, a, s) { - e.assign(t); - e.and(i); - s.assign(t); - s.not(); - s.and(a); - e.xor(s); - } - function maj(e, t, i, a, s) { - e.assign(t); - e.and(i); - s.assign(t); - s.and(a); - e.xor(s); - s.assign(i); - s.and(a); - e.xor(s); - } - function sigma(e, t, i) { - e.assign(t); - e.rotateRight(28); - i.assign(t); - i.rotateRight(34); - e.xor(i); - i.assign(t); - i.rotateRight(39); - e.xor(i); - } - function sigmaPrime(e, t, i) { - e.assign(t); - e.rotateRight(14); - i.assign(t); - i.rotateRight(18); - e.xor(i); - i.assign(t); - i.rotateRight(41); - e.xor(i); - } - function littleSigma(e, t, i) { - e.assign(t); - e.rotateRight(1); - i.assign(t); - i.rotateRight(8); - e.xor(i); - i.assign(t); - i.shiftRight(7); - e.xor(i); - } - function littleSigmaPrime(e, t, i) { - e.assign(t); - e.rotateRight(19); - i.assign(t); - i.rotateRight(61); - e.xor(i); - i.assign(t); - i.shiftRight(6); - e.xor(i); - } - const e = [ - new Word64(1116352408, 3609767458), - new Word64(1899447441, 602891725), - new Word64(3049323471, 3964484399), - new Word64(3921009573, 2173295548), - new Word64(961987163, 4081628472), - new Word64(1508970993, 3053834265), - new Word64(2453635748, 2937671579), - new Word64(2870763221, 3664609560), - new Word64(3624381080, 2734883394), - new Word64(310598401, 1164996542), - new Word64(607225278, 1323610764), - new Word64(1426881987, 3590304994), - new Word64(1925078388, 4068182383), - new Word64(2162078206, 991336113), - new Word64(2614888103, 633803317), - new Word64(3248222580, 3479774868), - new Word64(3835390401, 2666613458), - new Word64(4022224774, 944711139), - new Word64(264347078, 2341262773), - new Word64(604807628, 2007800933), - new Word64(770255983, 1495990901), - new Word64(1249150122, 1856431235), - new Word64(1555081692, 3175218132), - new Word64(1996064986, 2198950837), - new Word64(2554220882, 3999719339), - new Word64(2821834349, 766784016), - new Word64(2952996808, 2566594879), - new Word64(3210313671, 3203337956), - new Word64(3336571891, 1034457026), - new Word64(3584528711, 2466948901), - new Word64(113926993, 3758326383), - new Word64(338241895, 168717936), - new Word64(666307205, 1188179964), - new Word64(773529912, 1546045734), - new Word64(1294757372, 1522805485), - new Word64(1396182291, 2643833823), - new Word64(1695183700, 2343527390), - new Word64(1986661051, 1014477480), - new Word64(2177026350, 1206759142), - new Word64(2456956037, 344077627), - new Word64(2730485921, 1290863460), - new Word64(2820302411, 3158454273), - new Word64(3259730800, 3505952657), - new Word64(3345764771, 106217008), - new Word64(3516065817, 3606008344), - new Word64(3600352804, 1432725776), - new Word64(4094571909, 1467031594), - new Word64(275423344, 851169720), - new Word64(430227734, 3100823752), - new Word64(506948616, 1363258195), - new Word64(659060556, 3750685593), - new Word64(883997877, 3785050280), - new Word64(958139571, 3318307427), - new Word64(1322822218, 3812723403), - new Word64(1537002063, 2003034995), - new Word64(1747873779, 3602036899), - new Word64(1955562222, 1575990012), - new Word64(2024104815, 1125592928), - new Word64(2227730452, 2716904306), - new Word64(2361852424, 442776044), - new Word64(2428436474, 593698344), - new Word64(2756734187, 3733110249), - new Word64(3204031479, 2999351573), - new Word64(3329325298, 3815920427), - new Word64(3391569614, 3928383900), - new Word64(3515267271, 566280711), - new Word64(3940187606, 3454069534), - new Word64(4118630271, 4000239992), - new Word64(116418474, 1914138554), - new Word64(174292421, 2731055270), - new Word64(289380356, 3203993006), - new Word64(460393269, 320620315), - new Word64(685471733, 587496836), - new Word64(852142971, 1086792851), - new Word64(1017036298, 365543100), - new Word64(1126000580, 2618297676), - new Word64(1288033470, 3409855158), - new Word64(1501505948, 4234509866), - new Word64(1607167915, 987167468), - new Word64(1816402316, 1246189591), - ]; - return function hash(t, i, a, s = !1) { - let r, n, g, o, c, C, h, l; - if (s) { - r = new Word64(3418070365, 3238371032); - n = new Word64(1654270250, 914150663); - g = new Word64(2438529370, 812702999); - o = new Word64(355462360, 4144912697); - c = new Word64(1731405415, 4290775857); - C = new Word64(2394180231, 1750603025); - h = new Word64(3675008525, 1694076839); - l = new Word64(1203062813, 3204075428); - } else { - r = new Word64(1779033703, 4089235720); - n = new Word64(3144134277, 2227873595); - g = new Word64(1013904242, 4271175723); - o = new Word64(2773480762, 1595750129); - c = new Word64(1359893119, 2917565137); - C = new Word64(2600822924, 725511199); - h = new Word64(528734635, 4215389547); - l = new Word64(1541459225, 327033209); - } - const Q = 128 * Math.ceil((a + 17) / 128), - E = new Uint8Array(Q); - let u, d; - for (u = 0; u < a; ++u) E[u] = t[i++]; - E[u++] = 128; - const f = Q - 16; - for (; u < f; ) E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = 0; - E[u++] = (a >>> 29) & 255; - E[u++] = (a >> 21) & 255; - E[u++] = (a >> 13) & 255; - E[u++] = (a >> 5) & 255; - E[u++] = (a << 3) & 255; - const p = new Array(80); - for (u = 0; u < 80; u++) p[u] = new Word64(0, 0); - let m = new Word64(0, 0), - y = new Word64(0, 0), - w = new Word64(0, 0), - D = new Word64(0, 0), - b = new Word64(0, 0), - F = new Word64(0, 0), - S = new Word64(0, 0), - k = new Word64(0, 0); - const R = new Word64(0, 0), - N = new Word64(0, 0), - G = new Word64(0, 0), - x = new Word64(0, 0); - let U, M; - for (u = 0; u < Q; ) { - for (d = 0; d < 16; ++d) { - p[d].high = - (E[u] << 24) | (E[u + 1] << 16) | (E[u + 2] << 8) | E[u + 3]; - p[d].low = - (E[u + 4] << 24) | (E[u + 5] << 16) | (E[u + 6] << 8) | E[u + 7]; - u += 8; - } - for (d = 16; d < 80; ++d) { - U = p[d]; - littleSigmaPrime(U, p[d - 2], x); - U.add(p[d - 7]); - littleSigma(G, p[d - 15], x); - U.add(G); - U.add(p[d - 16]); - } - m.assign(r); - y.assign(n); - w.assign(g); - D.assign(o); - b.assign(c); - F.assign(C); - S.assign(h); - k.assign(l); - for (d = 0; d < 80; ++d) { - R.assign(k); - sigmaPrime(G, b, x); - R.add(G); - ch(G, b, F, S, x); - R.add(G); - R.add(e[d]); - R.add(p[d]); - sigma(N, m, x); - maj(G, m, y, w, x); - N.add(G); - U = k; - k = S; - S = F; - F = b; - D.add(R); - b = D; - D = w; - w = y; - y = m; - U.assign(R); - U.add(N); - m = U; - } - r.add(m); - n.add(y); - g.add(w); - o.add(D); - c.add(b); - C.add(F); - h.add(S); - l.add(k); - } - if (s) { - M = new Uint8Array(48); - r.copyTo(M, 0); - n.copyTo(M, 8); - g.copyTo(M, 16); - o.copyTo(M, 24); - c.copyTo(M, 32); - C.copyTo(M, 40); - } else { - M = new Uint8Array(64); - r.copyTo(M, 0); - n.copyTo(M, 8); - g.copyTo(M, 16); - o.copyTo(M, 24); - c.copyTo(M, 32); - C.copyTo(M, 40); - h.copyTo(M, 48); - l.copyTo(M, 56); - } - return M; - }; - })(); -class NullCipher { - decryptBlock(e) { - return e; +const calculateSHA256 = (function calculateSHA256Closure() { + function rotr(x, n) { + return (x >>> n) | (x << (32 - n)); } - encrypt(e) { - return e; + 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; +})(); +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(0xbf597fc7, 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), + ]; + 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; +})(); +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; } } class AESBaseCipher { constructor() { - this.constructor === AESBaseCipher && - unreachable("Cannot initialize AESBaseCipher."); this._s = new Uint8Array([ - 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, - 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, - 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, - 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, - 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, - 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, - 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, - 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, - 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, - 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, - 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, - 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, - 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, - 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, - 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, - 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, - 22, + 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, 0x32, 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([ - 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, - 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, - 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, - 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, - 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, - 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, - 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, - 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, - 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, - 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, - 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, - 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, - 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, - 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, - 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, - 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125, + 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, 0x47, 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([ - 0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, - 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, - 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, - 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, - 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, - 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, - 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, - 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, - 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, - 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, - 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, - 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, - 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, - 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, - 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, - 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, - 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, - 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, - 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, - 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, - 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, - 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, - 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, - 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, - 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, - 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, - 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, - 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, - 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, - 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, - 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, - 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, - 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, - 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, - 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, - 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, - 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, - 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, - 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, - 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, - 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, - 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, - 2438237621, 2203032232, 2370213795, + 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, 0x4de6bd46, 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, 0x88cc7691, 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, + 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, + 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3, ]); this._mixCol = new Uint8Array(256); - for (let e = 0; e < 256; e++) - this._mixCol[e] = e < 128 ? e << 1 : (e << 1) ^ 27; + for (let i = 0; i < 256; i++) { + this._mixCol[i] = i < 128 ? i << 1 : (i << 1) ^ 0x1b; + } this.buffer = new Uint8Array(16); this.bufferPosition = 0; } - _expandKey(e) { + _expandKey(cipherKey) { unreachable("Cannot call `_expandKey` on the base class"); } - _decrypt(e, t) { - let i, a, s; - const r = new Uint8Array(16); - r.set(e); - for (let e = 0, i = this._keySize; e < 16; ++e, ++i) r[e] ^= t[i]; - for (let e = this._cyclesOfRepetition - 1; e >= 1; --e) { - i = r[13]; - r[13] = r[9]; - r[9] = r[5]; - r[5] = r[1]; - r[1] = i; - i = r[14]; - a = r[10]; - r[14] = r[6]; - r[10] = r[2]; - r[6] = i; - r[2] = a; - i = r[15]; - a = r[11]; - s = r[7]; - r[15] = r[3]; - r[11] = i; - r[7] = a; - r[3] = s; - for (let e = 0; e < 16; ++e) r[e] = this._inv_s[r[e]]; - for (let i = 0, a = 16 * e; i < 16; ++i, ++a) r[i] ^= t[a]; - for (let e = 0; e < 16; e += 4) { - const t = this._mix[r[e]], - a = this._mix[r[e + 1]], - s = this._mix[r[e + 2]], - n = this._mix[r[e + 3]]; - i = - t ^ - (a >>> 8) ^ - (a << 24) ^ - (s >>> 16) ^ - (s << 16) ^ - (n >>> 24) ^ - (n << 8); - r[e] = (i >>> 24) & 255; - r[e + 1] = (i >> 16) & 255; - r[e + 2] = (i >> 8) & 255; - r[e + 3] = 255 & i; + _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; } } - i = r[13]; - r[13] = r[9]; - r[9] = r[5]; - r[5] = r[1]; - r[1] = i; - i = r[14]; - a = r[10]; - r[14] = r[6]; - r[10] = r[2]; - r[6] = i; - r[2] = a; - i = r[15]; - a = r[11]; - s = r[7]; - r[15] = r[3]; - r[11] = i; - r[7] = a; - r[3] = s; - for (let e = 0; e < 16; ++e) { - r[e] = this._inv_s[r[e]]; - r[e] ^= t[e]; + 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 r; + return state; } - _encrypt(e, t) { - const i = this._s; - let a, s, r; - const n = new Uint8Array(16); - n.set(e); - for (let e = 0; e < 16; ++e) n[e] ^= t[e]; - for (let e = 1; e < this._cyclesOfRepetition; e++) { - for (let e = 0; e < 16; ++e) n[e] = i[n[e]]; - r = n[1]; - n[1] = n[5]; - n[5] = n[9]; - n[9] = n[13]; - n[13] = r; - r = n[2]; - s = n[6]; - n[2] = n[10]; - n[6] = n[14]; - n[10] = r; - n[14] = s; - r = n[3]; - s = n[7]; - a = n[11]; - n[3] = n[15]; - n[7] = r; - n[11] = s; - n[15] = a; - for (let e = 0; e < 16; e += 4) { - const t = n[e + 0], - i = n[e + 1], - s = n[e + 2], - r = n[e + 3]; - a = t ^ i ^ s ^ r; - n[e + 0] ^= a ^ this._mixCol[t ^ i]; - n[e + 1] ^= a ^ this._mixCol[i ^ s]; - n[e + 2] ^= a ^ this._mixCol[s ^ r]; - n[e + 3] ^= a ^ this._mixCol[r ^ t]; + _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 i = 0, a = 16 * e; i < 16; ++i, ++a) n[i] ^= t[a]; } - for (let e = 0; e < 16; ++e) n[e] = i[n[e]]; - r = n[1]; - n[1] = n[5]; - n[5] = n[9]; - n[9] = n[13]; - n[13] = r; - r = n[2]; - s = n[6]; - n[2] = n[10]; - n[6] = n[14]; - n[10] = r; - n[14] = s; - r = n[3]; - s = n[7]; - a = n[11]; - n[3] = n[15]; - n[7] = r; - n[11] = s; - n[15] = a; - for (let e = 0, i = this._keySize; e < 16; ++e, ++i) n[e] ^= t[i]; - return n; + 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(e, t) { - const i = e.length; - let a = this.buffer, - s = this.bufferPosition; - const r = []; - let n = this.iv; - for (let t = 0; t < i; ++t) { - a[s] = e[t]; - ++s; - if (s < 16) continue; - const i = this._decrypt(a, this._key); - for (let e = 0; e < 16; ++e) i[e] ^= n[e]; - n = a; - r.push(i); - a = new Uint8Array(16); - s = 0; + _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 = a; - this.bufferLength = s; - this.iv = n; - if (0 === r.length) return new Uint8Array(0); - let g = 16 * r.length; - if (t) { - const e = r.at(-1); - let t = e[15]; - if (t <= 16) { - for (let i = 15, a = 16 - t; i >= a; --i) - if (e[i] !== t) { - t = 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.at(-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; } - g -= t; - r[r.length - 1] = e.subarray(0, 16 - t); + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); } } - const o = new Uint8Array(g); - for (let e = 0, t = 0, i = r.length; e < i; ++e, t += 16) o.set(r[e], t); - return o; + 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(e, t, i = null) { - const a = e.length, - s = this.buffer; - let r = this.bufferPosition; - if (i) this.iv = i; - else { - for (let t = 0; r < 16 && t < a; ++t, ++r) s[r] = e[t]; - if (r < 16) { - this.bufferLength = r; + 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 = s; - e = e.subarray(16); + this.iv = buffer; + data = data.subarray(16); } this.buffer = new Uint8Array(16); this.bufferLength = 0; this.decryptBlock = this._decryptBlock2; - return this.decryptBlock(e, t); + return this.decryptBlock(data, finalize); } - encrypt(e, t) { - const i = e.length; - let a = this.buffer, - s = this.bufferPosition; - const r = []; - t || (t = new Uint8Array(16)); - for (let n = 0; n < i; ++n) { - a[s] = e[n]; - ++s; - if (s < 16) continue; - for (let e = 0; e < 16; ++e) a[e] ^= t[e]; - const i = this._encrypt(a, this._key); - t = i; - r.push(i); - a = new Uint8Array(16); - s = 0; + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + if (!iv) { + iv = new Uint8Array(16); } - this.buffer = a; - this.bufferLength = s; - this.iv = t; - if (0 === r.length) return new Uint8Array(0); - const n = 16 * r.length, - g = new Uint8Array(n); - for (let e = 0, t = 0, i = r.length; e < i; ++e, t += 16) g.set(r[e], t); - return g; + 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(e) { + constructor(key) { super(); this._cyclesOfRepetition = 10; this._keySize = 160; this._rcon = new Uint8Array([ - 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, - 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145, 57, 114, - 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, 204, 131, 29, 58, 116, - 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, - 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, - 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, 204, 131, - 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, - 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, - 197, 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, 204, - 131, 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, - 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, - 239, 197, 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, - 204, 131, 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, - 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, - 250, 239, 197, 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, - 102, 204, 131, 29, 58, 116, 232, 203, 141, + 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(e); + this._key = this._expandKey(key); } - _expandKey(e) { - const t = this._s, - i = this._rcon, - a = new Uint8Array(176); - a.set(e); - for (let e = 16, s = 1; e < 176; ++s) { - let r = a[e - 3], - n = a[e - 2], - g = a[e - 1], - o = a[e - 4]; - r = t[r]; - n = t[n]; - g = t[g]; - o = t[o]; - r ^= i[s]; - for (let t = 0; t < 4; ++t) { - a[e] = r ^= a[e - 16]; - e++; - a[e] = n ^= a[e - 16]; - e++; - a[e] = g ^= a[e - 16]; - e++; - a[e] = o ^= a[e - 16]; - e++; + _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 a; + return result; } } class AES256Cipher extends AESBaseCipher { - constructor(e) { + constructor(key) { super(); this._cyclesOfRepetition = 14; this._keySize = 224; - this._key = this._expandKey(e); + this._key = this._expandKey(key); } - _expandKey(e) { - const t = this._s, - i = new Uint8Array(240); - i.set(e); - let a, - s, - r, - n, - g = 1; - for (let e = 32, o = 1; e < 240; ++o) { - if (e % 32 == 16) { - a = t[a]; - s = t[s]; - r = t[r]; - n = t[n]; - } else if (e % 32 == 0) { - a = i[e - 3]; - s = i[e - 2]; - r = i[e - 1]; - n = i[e - 4]; - a = t[a]; - s = t[s]; - r = t[r]; - n = t[n]; - a ^= g; - (g <<= 1) >= 256 && (g = 255 & (27 ^ g)); + _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 t = 0; t < 4; ++t) { - i[e] = a ^= i[e - 32]; - e++; - i[e] = s ^= i[e - 32]; - e++; - i[e] = r ^= i[e - 32]; - e++; - i[e] = n ^= i[e - 32]; - e++; + 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 i; + return result; } } class PDF17 { - checkOwnerPassword(e, t, i, a) { - const s = new Uint8Array(e.length + 56); - s.set(e, 0); - s.set(t, e.length); - s.set(i, e.length + t.length); - return isArrayEqual(Js(s, 0, s.length), a); + 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 isArrayEqual(result, ownerPassword); } - checkUserPassword(e, t, i) { - const a = new Uint8Array(e.length + 8); - a.set(e, 0); - a.set(t, e.length); - return isArrayEqual(Js(a, 0, a.length), i); + 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 isArrayEqual(result, userPassword); } - getOwnerKey(e, t, i, a) { - const s = new Uint8Array(e.length + 56); - s.set(e, 0); - s.set(t, e.length); - s.set(i, e.length + t.length); - const r = Js(s, 0, s.length); - return new AES256Cipher(r).decryptBlock(a, !1, new Uint8Array(16)); + 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(e, t, i) { - const a = new Uint8Array(e.length + 8); - a.set(e, 0); - a.set(t, e.length); - const s = Js(a, 0, a.length); - return new AES256Cipher(s).decryptBlock(i, !1, 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)); } } class PDF20 { - _hash(e, t, i) { - let a = Js(t, 0, t.length).subarray(0, 32), - s = [0], - r = 0; - for (; r < 64 || s.at(-1) > r - 32; ) { - const t = e.length + a.length + i.length, - c = new Uint8Array(t); - let C = 0; - c.set(e, C); - C += e.length; - c.set(a, C); - C += a.length; - c.set(i, C); - const h = new Uint8Array(64 * t); - for (let e = 0, i = 0; e < 64; e++, i += t) h.set(c, i); - s = new AES128Cipher(a.subarray(0, 16)).encrypt(h, a.subarray(16, 32)); - const l = s.slice(0, 16).reduce((e, t) => e + t, 0) % 3; - 0 === l - ? (a = Js(s, 0, s.length)) - : 1 === l - ? (a = ((n = s), (g = 0), (o = s.length), Ys(n, g, o, !0))) - : 2 === l && (a = Ys(s, 0, s.length)); - r++; + _hash(password, input, userBytes) { + let k = calculateSHA256(input, 0, input.length).subarray(0, 32); + let e = [0]; + let i = 0; + while (i < 64 || e.at(-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)); + const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 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++; } - var n, g, o; - return a.subarray(0, 32); + return k.subarray(0, 32); } - checkOwnerPassword(e, t, i, a) { - const s = new Uint8Array(e.length + 56); - s.set(e, 0); - s.set(t, e.length); - s.set(i, e.length + t.length); - return isArrayEqual(this._hash(e, s, i), a); + 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 = this._hash(password, hashData, userBytes); + return isArrayEqual(result, ownerPassword); } - checkUserPassword(e, t, i) { - const a = new Uint8Array(e.length + 8); - a.set(e, 0); - a.set(t, e.length); - return isArrayEqual(this._hash(e, a, []), i); + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = this._hash(password, hashData, []); + return isArrayEqual(result, userPassword); } - getOwnerKey(e, t, i, a) { - const s = new Uint8Array(e.length + 56); - s.set(e, 0); - s.set(t, e.length); - s.set(i, e.length + t.length); - const r = this._hash(e, s, i); - return new AES256Cipher(r).decryptBlock(a, !1, new Uint8Array(16)); + 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 = this._hash(password, hashData, userBytes); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); } - getUserKey(e, t, i) { - const a = new Uint8Array(e.length + 8); - a.set(e, 0); - a.set(t, e.length); - const s = this._hash(e, a, []); - return new AES256Cipher(s).decryptBlock(i, !1, 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 = this._hash(password, hashData, []); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); } } class CipherTransform { - constructor(e, t) { - this.StringCipherConstructor = e; - this.StreamCipherConstructor = t; + constructor(stringCipherConstructor, streamCipherConstructor) { + this.StringCipherConstructor = stringCipherConstructor; + this.StreamCipherConstructor = streamCipherConstructor; } - createStream(e, t) { - const i = new this.StreamCipherConstructor(); - return new DecryptStream(e, t, function cipherTransformDecryptStream(e, t) { - return i.decryptBlock(e, t); - }); + createStream(stream, length) { + const cipher = new this.StreamCipherConstructor(); + return new DecryptStream( + stream, + length, + function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }, + ); } - decryptString(e) { - const t = new this.StringCipherConstructor(); - let i = stringToBytes(e); - i = t.decryptBlock(i, !0); - return bytesToString(i); + decryptString(s) { + const cipher = new this.StringCipherConstructor(); + let data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); } - encryptString(e) { - const t = new this.StringCipherConstructor(); - if (t instanceof AESBaseCipher) { - const i = 16 - (e.length % 16); - e += String.fromCharCode(i).repeat(i); - const a = new Uint8Array(16); - if ("undefined" != typeof crypto) crypto.getRandomValues(a); - else for (let e = 0; e < 16; e++) a[e] = Math.floor(256 * Math.random()); - let s = stringToBytes(e); - s = t.encrypt(s, a); - const r = new Uint8Array(16 + s.length); - r.set(a); - r.set(s, 16); - return bytesToString(r); + encryptString(s) { + const cipher = new this.StringCipherConstructor(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - (strLen % 16); + s += String.fromCharCode(pad).repeat(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 = stringToBytes(s); + data = cipher.encrypt(data, iv); + const buf = new Uint8Array(16 + data.length); + buf.set(iv); + buf.set(data, 16); + return bytesToString(buf); } - let i = stringToBytes(e); - i = t.encrypt(i); - return bytesToString(i); + let data = stringToBytes(s); + data = cipher.encrypt(data); + return bytesToString(data); } } class CipherTransformFactory { - static #k = new Uint8Array([ - 40, 191, 78, 94, 78, 117, 138, 65, 100, 0, 78, 86, 255, 250, 1, 8, 46, 46, - 0, 182, 208, 104, 62, 128, 47, 12, 169, 254, 100, 83, 105, 122, + static #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, ]); - #R(e, t, i, a, s, r, n, g, o, c, C, h) { - if (t) { - const e = Math.min(127, t.length); - t = t.subarray(0, e); - } else t = []; - const l = 6 === e ? new PDF20() : new PDF17(); - return l.checkUserPassword(t, g, n) - ? l.getUserKey(t, o, C) - : t.length && l.checkOwnerPassword(t, a, r, i) - ? l.getOwnerKey(t, s, r, c) - : null; - } - #N(e, t, i, a, s, r, n, g) { - const o = 40 + i.length + e.length, - c = new Uint8Array(o); - let C, - h, - l = 0; - if (t) { - h = Math.min(32, t.length); - for (; l < h; ++l) c[l] = t[l]; - } - C = 0; - for (; l < 32; ) c[l++] = CipherTransformFactory.#k[C++]; - for (C = 0, h = i.length; C < h; ++C) c[l++] = i[C]; - c[l++] = 255 & s; - c[l++] = (s >> 8) & 255; - c[l++] = (s >> 16) & 255; - c[l++] = (s >>> 24) & 255; - for (C = 0, h = e.length; C < h; ++C) c[l++] = e[C]; - if (r >= 4 && !g) { - c[l++] = 255; - c[l++] = 255; - c[l++] = 255; - c[l++] = 255; - } - let Q = Hs(c, 0, l); - const E = n >> 3; - if (r >= 3) for (C = 0; C < 50; ++C) Q = Hs(Q, 0, E); - const u = Q.subarray(0, E); - let d, f; - if (r >= 3) { - for (l = 0; l < 32; ++l) c[l] = CipherTransformFactory.#k[l]; - for (C = 0, h = e.length; C < h; ++C) c[l++] = e[C]; - d = new ARCFourCipher(u); - f = d.encryptBlock(Hs(c, 0, l)); - h = u.length; - const t = new Uint8Array(h); - for (C = 1; C <= 19; ++C) { - for (let e = 0; e < h; ++e) t[e] = u[e] ^ C; - d = new ARCFourCipher(t); - f = d.encryptBlock(f); - } - for (C = 0, h = f.length; C < h; ++C) if (a[C] !== f[C]) return null; + #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 { - d = new ARCFourCipher(u); - f = d.encryptBlock(CipherTransformFactory.#k); - for (C = 0, h = f.length; C < h; ++C) if (a[C] !== f[C]) return null; + password = []; } - return u; + const pdfAlgorithm = revision === 6 ? new PDF20() : 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; } - #G(e, t, i, a) { - const s = new Uint8Array(32); - let r = 0; - const n = Math.min(32, e.length); - for (; r < n; ++r) s[r] = e[r]; - let g = 0; - for (; r < 32; ) s[r++] = CipherTransformFactory.#k[g++]; - let o = Hs(s, 0, r); - const c = a >> 3; - if (i >= 3) for (g = 0; g < 50; ++g) o = Hs(o, 0, o.length); - let C, h; - if (i >= 3) { - h = t; - const e = new Uint8Array(c); - for (g = 19; g >= 0; g--) { - for (let t = 0; t < c; ++t) e[t] = o[t] ^ g; - C = new ARCFourCipher(e); - h = C.encryptBlock(h); + #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++] = CipherTransformFactory.#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] = CipherTransformFactory.#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 { - C = new ARCFourCipher(o.subarray(0, c)); - h = C.encryptBlock(t); + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock( + CipherTransformFactory.#defaultPasswordBytes, + ); + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } } - return h; + return encryptionKey; } - #x(e, t, i, a = !1) { - const s = new Uint8Array(i.length + 9), - r = i.length; - let n; - for (n = 0; n < r; ++n) s[n] = i[n]; - s[n++] = 255 & e; - s[n++] = (e >> 8) & 255; - s[n++] = (e >> 16) & 255; - s[n++] = 255 & t; - s[n++] = (t >> 8) & 255; - if (a) { - s[n++] = 115; - s[n++] = 65; - s[n++] = 108; - s[n++] = 84; + #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]; } - return Hs(s, 0, n).subarray(0, Math.min(i.length + 5, 16)); + let j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory.#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; } - #U(e, t, i, a, s) { - if (!(t instanceof Name)) + #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)); + } + #buildCipherConstructor(cf, name, num, gen, key) { + if (!(name instanceof Name)) { throw new FormatError("Invalid crypt filter name."); - const r = this, - n = e.get(t.name), - g = n?.get("CFM"); - if (!g || "None" === g.name) + } + const self = this; + const cryptFilter = cf.get(name.name); + const cfm = cryptFilter?.get("CFM"); + if (!cfm || cfm.name === "None") { return function () { return new NullCipher(); }; - if ("V2" === g.name) + } + if (cfm.name === "V2") { return function () { - return new ARCFourCipher(r.#x(i, a, s, !1)); + return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); }; - if ("AESV2" === g.name) + } + if (cfm.name === "AESV2") { return function () { - return new AES128Cipher(r.#x(i, a, s, !0)); + return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); }; - if ("AESV3" === g.name) + } + if (cfm.name === "AESV3") { return function () { - return new AES256Cipher(s); + return new AES256Cipher(key); }; + } throw new FormatError("Unknown crypto method"); } - constructor(e, t, i) { - const a = e.get("Filter"); - if (!isName(a, "Standard")) + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!isName(filter, "Standard")) { throw new FormatError("unknown encryption method"); - this.filterName = a.name; - this.dict = e; - const s = e.get("V"); - if (!Number.isInteger(s) || (1 !== s && 2 !== s && 4 !== s && 5 !== s)) + } + this.filterName = filter.name; + this.dict = dict; + const algorithm = dict.get("V"); + if ( + !Number.isInteger(algorithm) || + (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) + ) { throw new FormatError("unsupported encryption algorithm"); - this.algorithm = s; - let r = e.get("Length"); - if (!r) - if (s <= 3) r = 40; - else { - const t = e.get("CF"), - i = e.get("StmF"); - if (t instanceof Dict && i instanceof Name) { - t.suppressEncryption = !0; - const e = t.get(i.name); - r = e?.get("Length") || 128; - r < 40 && (r <<= 3); + } + 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 (cfDict instanceof Dict && streamCryptoName instanceof Name) { + cfDict.suppressEncryption = true; + const handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict?.get("Length") || 128; + if (keyLength < 40) { + keyLength <<= 3; + } } } - if (!Number.isInteger(r) || r < 40 || r % 8 != 0) + } + if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { throw new FormatError("invalid key length"); - const n = stringToBytes(e.get("O")), - g = stringToBytes(e.get("U")), - o = n.subarray(0, 32), - c = g.subarray(0, 32), - C = e.get("P"), - h = e.get("R"), - l = (4 === s || 5 === s) && !1 !== e.get("EncryptMetadata"); - this.encryptMetadata = l; - const Q = stringToBytes(t); - let E, u; - if (i) { - if (6 === h) + } + const ownerBytes = stringToBytes(dict.get("O")), + userBytes = stringToBytes(dict.get("U")); + const ownerPassword = ownerBytes.subarray(0, 32); + const userPassword = userBytes.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 = stringToBytes(fileId); + let passwordBytes; + if (password) { + if (revision === 6) { try { - i = utf8StringToString(i); + password = utf8StringToString(password); } catch { warn( "CipherTransformFactory: Unable to convert UTF8 encoded password.", ); } - E = stringToBytes(i); + } + passwordBytes = stringToBytes(password); } - if (5 !== s) u = this.#N(Q, E, o, c, C, h, r, l); - else { - const t = n.subarray(32, 40), - i = n.subarray(40, 48), - a = g.subarray(0, 48), - s = g.subarray(32, 40), - r = g.subarray(40, 48), - C = stringToBytes(e.get("OE")), - l = stringToBytes(e.get("UE")), - Q = stringToBytes(e.get("Perms")); - u = this.#R(h, E, o, t, i, a, c, s, r, C, l, Q); + let encryptionKey; + if (algorithm !== 5) { + encryptionKey = this.#prepareKeyData( + fileIdBytes, + passwordBytes, + ownerPassword, + userPassword, + flags, + revision, + keyLength, + encryptMetadata, + ); + } else { + const ownerValidationSalt = ownerBytes.subarray(32, 40); + const ownerKeySalt = ownerBytes.subarray(40, 48); + const uBytes = userBytes.subarray(0, 48); + const userValidationSalt = userBytes.subarray(32, 40); + const userKeySalt = userBytes.subarray(40, 48); + const ownerEncryption = stringToBytes(dict.get("OE")); + const userEncryption = stringToBytes(dict.get("UE")); + const perms = stringToBytes(dict.get("Perms")); + encryptionKey = this.#createEncryptionKey20( + revision, + passwordBytes, + ownerPassword, + ownerValidationSalt, + ownerKeySalt, + uBytes, + userPassword, + userValidationSalt, + userKeySalt, + ownerEncryption, + userEncryption, + perms, + ); } - if (!u && !i) throw new PasswordException("No password given", it); - if (!u && i) { - const e = this.#G(E, o, h, r); - u = this.#N(Q, e, o, c, C, h, r, l); + if (!encryptionKey && !password) { + throw new PasswordException( + "No password given", + PasswordResponses.NEED_PASSWORD, + ); + } else if (!encryptionKey && password) { + const decodedPassword = this.#decodeUserPassword( + passwordBytes, + ownerPassword, + revision, + keyLength, + ); + encryptionKey = this.#prepareKeyData( + fileIdBytes, + decodedPassword, + ownerPassword, + userPassword, + flags, + revision, + keyLength, + encryptMetadata, + ); } - if (!u) throw new PasswordException("Incorrect Password", at); - this.encryptionKey = u; - if (s >= 4) { - const t = e.get("CF"); - t instanceof Dict && (t.suppressEncryption = !0); - this.cf = t; - this.stmf = e.get("StmF") || Name.get("Identity"); - this.strf = e.get("StrF") || Name.get("Identity"); - this.eff = e.get("EFF") || this.stmf; + if (!encryptionKey) { + throw new PasswordException( + "Incorrect Password", + PasswordResponses.INCORRECT_PASSWORD, + ); + } + this.encryptionKey = encryptionKey; + if (algorithm >= 4) { + const cf = dict.get("CF"); + if (cf instanceof Dict) { + cf.suppressEncryption = true; + } + this.cf = cf; + this.stmf = dict.get("StmF") || Name.get("Identity"); + this.strf = dict.get("StrF") || Name.get("Identity"); + this.eff = dict.get("EFF") || this.stmf; } } - createCipherTransform(e, t) { - if (4 === this.algorithm || 5 === this.algorithm) + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { return new CipherTransform( - this.#U(this.cf, this.strf, e, t, this.encryptionKey), - this.#U(this.cf, this.stmf, e, t, this.encryptionKey), + this.#buildCipherConstructor( + this.cf, + this.strf, + num, + gen, + this.encryptionKey, + ), + this.#buildCipherConstructor( + this.cf, + this.stmf, + num, + gen, + this.encryptionKey, + ), ); - const i = this.#x(e, t, this.encryptionKey, !1), - cipherConstructor = function () { - return new ARCFourCipher(i); - }; + } + const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); + const cipherConstructor = function () { + return new ARCFourCipher(key); + }; return new CipherTransform(cipherConstructor, cipherConstructor); } -} -async function writeObject(e, t, i, { encrypt: a = null }) { - const s = a?.createCipherTransform(e.num, e.gen); - i.push(`${e.num} ${e.gen} obj\n`); - t instanceof Dict - ? await writeDict(t, i, s) - : t instanceof BaseStream - ? await writeStream(t, i, s) - : (Array.isArray(t) || ArrayBuffer.isView(t)) && - (await writeArray(t, i, s)); - i.push("\nendobj\n"); -} -async function writeDict(e, t, i) { - t.push("<<"); - for (const a of e.getKeys()) { - t.push(` /${escapePDFName(a)} `); - await writeValue(e.getRaw(a), t, i); +} // ./src/core/writer.js + +async function writeObject(ref, obj, buffer, { encrypt = null }) { + const transform = encrypt?.createCipherTransform(ref.num, ref.gen); + buffer.push(`${ref.num} ${ref.gen} obj\n`); + if (obj instanceof Dict) { + await writeDict(obj, buffer, transform); + } else if (obj instanceof BaseStream) { + await writeStream(obj, buffer, transform); + } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { + await writeArray(obj, buffer, transform); } - t.push(">>"); + buffer.push("\nendobj\n"); } -async function writeStream(e, t, i) { - let a = e.getBytes(); - const { dict: s } = e, - [r, n] = await Promise.all([ - s.getAsync("Filter"), - s.getAsync("DecodeParms"), - ]), - g = isName( - Array.isArray(r) ? await s.xref.fetchIfRefAsync(r[0]) : r, - "FlateDecode", - ); - if (a.length >= 256 || g) +async function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const key of dict.getKeys()) { + buffer.push(` /${escapePDFName(key)} `); + await writeValue(dict.getRaw(key), buffer, transform); + } + buffer.push(">>"); +} +async function writeStream(stream, buffer, transform) { + let bytes = stream.getBytes(); + const { dict } = stream; + const [filter, params] = await Promise.all([ + dict.getAsync("Filter"), + dict.getAsync("DecodeParms"), + ]); + const filterZero = Array.isArray(filter) + ? await dict.xref.fetchIfRefAsync(filter[0]) + : filter; + const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); + const MIN_LENGTH_FOR_COMPRESSING = 256; + if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { try { - const e = new CompressionStream("deflate"), - t = e.writable.getWriter(); - t.write(a); - t.close(); - const i = await new Response(e.readable).arrayBuffer(); - a = new Uint8Array(i); - let o, c; - if (r) { - if (!g) { - o = Array.isArray(r) - ? [Name.get("FlateDecode"), ...r] - : [Name.get("FlateDecode"), r]; - n && (c = Array.isArray(n) ? [null, ...n] : [null, n]); + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer + .write(bytes) + .then(async () => { + await writer.ready; + await writer.close(); + }) + .catch(() => {}); + const buf = await new Response(cs.readable).arrayBuffer(); + bytes = new Uint8Array(buf); + let newFilter, newParams; + if (!filter) { + newFilter = Name.get("FlateDecode"); + } else if (!isFilterZeroFlateDecode) { + newFilter = Array.isArray(filter) + ? [Name.get("FlateDecode"), ...filter] + : [Name.get("FlateDecode"), filter]; + if (params) { + newParams = Array.isArray(params) + ? [null, ...params] + : [null, params]; } - } else o = Name.get("FlateDecode"); - o && s.set("Filter", o); - c && s.set("DecodeParms", c); - } catch (e) { - info(`writeStream - cannot compress data: "${e}".`); + } + if (newFilter) { + dict.set("Filter", newFilter); + } + if (newParams) { + dict.set("DecodeParms", newParams); + } + } catch (ex) { + info(`writeStream - cannot compress data: "${ex}".`); } - let o = bytesToString(a); - i && (o = i.encryptString(o)); - s.set("Length", o.length); - await writeDict(s, t, i); - t.push(" stream\n", o, "\nendstream"); -} -async function writeArray(e, t, i) { - t.push("["); - let a = !0; - for (const s of e) { - a ? (a = !1) : t.push(" "); - await writeValue(s, t, i); } - t.push("]"); -} -async function writeValue(e, t, i) { - if (e instanceof Name) t.push(`/${escapePDFName(e.name)}`); - else if (e instanceof Ref) t.push(`${e.num} ${e.gen} R`); - else if (Array.isArray(e) || ArrayBuffer.isView(e)) await writeArray(e, t, i); - else if ("string" == typeof e) { - i && (e = i.encryptString(e)); - t.push(`(${escapeString(e)})`); - } else - "number" == typeof e - ? t.push(numberToString(e)) - : "boolean" == typeof e - ? t.push(e.toString()) - : e instanceof Dict - ? await writeDict(e, t, i) - : e instanceof BaseStream - ? await writeStream(e, t, i) - : null === e - ? t.push("null") - : warn( - `Unhandled value in writer: ${typeof e}, please file a bug.`, - ); -} -function writeInt(e, t, i, a) { - for (let s = t + i - 1; s > i - 1; s--) { - a[s] = 255 & e; - e >>= 8; + let string = bytesToString(bytes); + if (transform) { + string = transform.encryptString(string); } - return i + t; + dict.set("Length", string.length); + await writeDict(dict, buffer, transform); + buffer.push(" stream\n", string, "\nendstream"); } -function writeString(e, t, i) { - for (let a = 0, s = e.length; a < s; a++) i[t + a] = 255 & e.charCodeAt(a); +async function writeArray(array, buffer, transform) { + buffer.push("["); + let first = true; + for (const val of array) { + if (!first) { + buffer.push(" "); + } else { + first = false; + } + await writeValue(val, buffer, transform); + } + buffer.push("]"); } -function updateXFA({ xfaData: e, xfaDatasetsRef: t, newRefs: i, xref: a }) { - if (null === e) { - e = (function writeXFADataForAcroform(e, t) { - const i = new SimpleXMLParser({ hasAttributes: !0 }).parseFromString(e); - for (const { xfa: e } of t) { - if (!e) continue; - const { path: t, value: a } = e; - if (!t) continue; - const s = parseXFAPath(t); - let r = i.documentElement.searchNode(s, 0); - !r && s.length > 1 && (r = i.documentElement.searchNode([s.at(-1)], 0)); - r - ? (r.childNodes = Array.isArray(a) - ? a.map((e) => new SimpleDOMNode("value", e)) - : [new SimpleDOMNode("#text", a)]) - : warn(`Node not found for path: ${t}`); - } - const a = []; - i.documentElement.dump(a); - return a.join(""); - })(a.fetchIfRef(t).getString(), i); +async function writeValue(value, buffer, transform) { + if (value instanceof Name) { + buffer.push(`/${escapePDFName(value.name)}`); + } else if (value instanceof Ref) { + buffer.push(`${value.num} ${value.gen} R`); + } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { + await writeArray(value, buffer, transform); + } else if (typeof value === "string") { + if (transform) { + value = transform.encryptString(value); + } + buffer.push(`(${escapeString(value)})`); + } else if (typeof value === "number") { + buffer.push(numberToString(value)); + } else if (typeof value === "boolean") { + buffer.push(value.toString()); + } else if (value instanceof Dict) { + await writeDict(value, buffer, transform); + } else if (value instanceof BaseStream) { + await writeStream(value, buffer, transform); + } else if (value === null) { + buffer.push("null"); + } else { + warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); } - const s = a.encrypt; - if (s) { - e = s.createCipherTransform(t.num, t.gen).encryptString(e); +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; } - const r = - `${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n` + - e + + 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 bytesToString(calculateMD5(array)); +} +function writeXFADataForAcroform(str, newRefs) { + const xml = new SimpleXMLParser({ + hasAttributes: true, + }).parseFromString(str); + for (const { xfa } of newRefs) { + if (!xfa) { + continue; + } + const { path, value } = xfa; + if (!path) { + continue; + } + const nodePath = parseXFAPath(path); + let node = xml.documentElement.searchNode(nodePath, 0); + if (!node && nodePath.length > 1) { + node = xml.documentElement.searchNode([nodePath.at(-1)], 0); + } + if (node) { + node.childNodes = Array.isArray(value) + ? value.map((val) => new SimpleDOMNode("value", val)) + : [new SimpleDOMNode("#text", value)]; + } else { + warn(`Node not found for path: ${path}`); + } + } + const buffer = []; + xml.documentElement.dump(buffer); + return buffer.join(""); +} +async function updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + newRefs, +}) { + if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { + warn("XFA - Cannot save it"); + } + if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { + return; + } + const dict = acroForm.clone(); + if (hasXfa && !hasXfaDatasetsEntry) { + const newXfa = acroForm.get("XFA").slice(); + newXfa.splice(2, 0, "datasets"); + newXfa.splice(3, 0, xfaDatasetsRef); + dict.set("XFA", newXfa); + } + if (needAppearances) { + dict.set("NeedAppearances", true); + } + const buffer = []; + await writeObject(acroFormRef, dict, buffer, xref); + newRefs.push({ + ref: acroFormRef, + data: buffer.join(""), + }); +} +function updateXFA({ xfaData, xfaDatasetsRef, newRefs, xref }) { + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), newRefs); + } + const encrypt = xref.encrypt; + if (encrypt) { + const transform = encrypt.createCipherTransform( + xfaDatasetsRef.num, + xfaDatasetsRef.gen, + ); + xfaData = transform.encryptString(xfaData); + } + const data = + `${xfaDatasetsRef.num} ${xfaDatasetsRef.gen} obj\n` + + `<< /Type /EmbeddedFile /Length ${xfaData.length}>>\nstream\n` + + xfaData + "\nendstream\nendobj\n"; - i.push({ ref: t, data: r }); + newRefs.push({ + ref: xfaDatasetsRef, + data, + }); } -function getIndexes(e) { - const t = []; - for (const { ref: i } of e) - i.num === t.at(-2) + t.at(-1) ? (t[t.length - 1] += 1) : t.push(i.num, 1); - return t; -} -function computeIDs(e, t, i) { - if (Array.isArray(t.fileIds) && t.fileIds.length > 0) { - const a = (function computeMD5(e, t) { - const i = Math.floor(Date.now() / 1e3), - a = t.filename || "", - s = [i.toString(), a, e.toString()]; - let r = s.reduce((e, t) => e + t.length, 0); - for (const e of Object.values(t.info)) { - s.push(e); - r += e.length; - } - const n = new Uint8Array(r); - let g = 0; - for (const e of s) { - writeString(e, g, n); - g += e.length; - } - return bytesToString(Hs(n)); - })(e, t); - i.set("ID", [t.fileIds[0], a]); +async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + buffer.push("xref\n"); + const indexes = getIndexes(newRefs); + let indexesPosition = 0; + for (const { ref, data } of newRefs) { + if (ref.num === indexes[indexesPosition]) { + buffer.push( + `${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`, + ); + indexesPosition += 2; + } + if (data !== null) { + buffer.push( + `${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`, + ); + baseOffset += data.length; + } else { + buffer.push( + `0000000000 ${Math.min(ref.gen + 1, 0xffff) + .toString() + .padStart(5, "0")} f\r\n`, + ); + } } + computeIDs(baseOffset, xrefInfo, newXref); + buffer.push("trailer\n"); + await writeDict(newXref, buffer); + buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function getIndexes(newRefs) { + const indexes = []; + for (const { ref } of newRefs) { + if (ref.num === indexes.at(-2) + indexes.at(-1)) { + indexes[indexes.length - 1] += 1; + } else { + indexes.push(ref.num, 1); + } + } + return indexes; +} +async function getXRefStreamTable( + xrefInfo, + baseOffset, + newRefs, + newXref, + buffer, +) { + const xrefTableData = []; + let maxOffset = 0; + let maxGen = 0; + for (const { ref, data } of newRefs) { + let gen; + maxOffset = Math.max(maxOffset, baseOffset); + if (data !== null) { + gen = Math.min(ref.gen, 0xffff); + xrefTableData.push([1, baseOffset, gen]); + baseOffset += data.length; + } else { + gen = Math.min(ref.gen + 1, 0xffff); + xrefTableData.push([0, 0, gen]); + } + maxGen = Math.max(maxGen, gen); + } + newXref.set("Index", getIndexes(newRefs)); + const offsetSize = getSizeInBytes(maxOffset); + const maxGenSize = getSizeInBytes(maxGen); + const sizes = [1, offsetSize, maxGenSize]; + newXref.set("W", sizes); + computeIDs(baseOffset, xrefInfo, newXref); + const structSize = sizes.reduce((a, x) => a + x, 0); + const data = new Uint8Array(structSize * xrefTableData.length); + const stream = new Stream(data); + stream.dict = newXref; + let offset = 0; + for (const [type, objOffset, gen] of xrefTableData) { + offset = writeInt(type, sizes[0], offset, data); + offset = writeInt(objOffset, sizes[1], offset, data); + offset = writeInt(gen, sizes[2], offset, data); + } + await writeObject(xrefInfo.newRef, stream, buffer, {}); + buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function computeIDs(baseOffset, xrefInfo, newXref) { + if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { + const md5 = computeMD5(baseOffset, xrefInfo); + newXref.set("ID", [xrefInfo.fileIds[0], md5]); + } +} +function getTrailerDict(xrefInfo, newRefs, useXrefStream) { + const newXref = new Dict(null); + newXref.set("Prev", xrefInfo.startXRef); + const refForXrefTable = xrefInfo.newRef; + if (useXrefStream) { + newRefs.push({ + ref: refForXrefTable, + data: "", + }); + newXref.set("Size", refForXrefTable.num + 1); + newXref.set("Type", Name.get("XRef")); + } else { + newXref.set("Size", refForXrefTable.num); + } + 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); + } + return newXref; } async function incrementalUpdate({ - originalData: e, - xrefInfo: t, - newRefs: i, - xref: a = null, - hasXfa: s = !1, - xfaDatasetsRef: r = null, - hasXfaDatasetsEntry: n = !1, - needAppearances: g, - acroFormRef: o = null, - acroForm: c = null, - xfaData: C = null, - useXrefStream: h = !1, + originalData, + xrefInfo, + newRefs, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null, + useXrefStream = false, }) { - await (async function updateAcroform({ - xref: e, - acroForm: t, - acroFormRef: i, - hasXfa: a, - hasXfaDatasetsEntry: s, - xfaDatasetsRef: r, - needAppearances: n, - newRefs: g, - }) { - !a || s || r || warn("XFA - Cannot save it"); - if (!n && (!a || !r || s)) return; - const o = t.clone(); - if (a && !s) { - const e = t.get("XFA").slice(); - e.splice(2, 0, "datasets"); - e.splice(3, 0, r); - o.set("XFA", e); - } - n && o.set("NeedAppearances", !0); - const c = []; - await writeObject(i, o, c, e); - g.push({ ref: i, data: c.join("") }); - })({ - xref: a, - acroForm: c, - acroFormRef: o, - hasXfa: s, - hasXfaDatasetsEntry: n, - xfaDatasetsRef: r, - needAppearances: g, - newRefs: i, + await updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + newRefs, }); - s && updateXFA({ xfaData: C, xfaDatasetsRef: r, newRefs: i, xref: a }); - const l = []; - let Q = e.length; - const E = e.at(-1); - if (10 !== E && 13 !== E) { - l.push("\n"); - Q += 1; + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + newRefs, + xref, + }); } - const u = (function getTrailerDict(e, t, i) { - const a = new Dict(null); - a.set("Prev", e.startXRef); - const s = e.newRef; - if (i) { - t.push({ ref: s, data: "" }); - a.set("Size", s.num + 1); - a.set("Type", Name.get("XRef")); - } else a.set("Size", s.num); - null !== e.rootRef && a.set("Root", e.rootRef); - null !== e.infoRef && a.set("Info", e.infoRef); - null !== e.encryptRef && a.set("Encrypt", e.encryptRef); - return a; - })(t, i, h); - i = i.sort((e, t) => e.ref.num - t.ref.num); - for (const { data: e } of i) null !== e && l.push(e); - await (h - ? (async function getXRefStreamTable(e, t, i, a, s) { - const r = []; - let n = 0, - g = 0; - for (const { ref: e, data: a } of i) { - let i; - n = Math.max(n, t); - if (null !== a) { - i = Math.min(e.gen, 65535); - r.push([1, t, i]); - t += a.length; - } else { - i = Math.min(e.gen + 1, 65535); - r.push([0, 0, i]); - } - g = Math.max(g, i); - } - a.set("Index", getIndexes(i)); - const o = [1, getSizeInBytes(n), getSizeInBytes(g)]; - a.set("W", o); - computeIDs(t, e, a); - const c = o.reduce((e, t) => e + t, 0), - C = new Uint8Array(c * r.length), - h = new Stream(C); - h.dict = a; - let l = 0; - for (const [e, t, i] of r) { - l = writeInt(e, o[0], l, C); - l = writeInt(t, o[1], l, C); - l = writeInt(i, o[2], l, C); - } - await writeObject(e.newRef, h, s, {}); - s.push("startxref\n", t.toString(), "\n%%EOF\n"); - })(t, Q, i, u, l) - : (async function getXRefTable(e, t, i, a, s) { - s.push("xref\n"); - const r = getIndexes(i); - let n = 0; - for (const { ref: e, data: a } of i) { - if (e.num === r[n]) { - s.push(`${r[n]} ${r[n + 1]}\n`); - n += 2; - } - if (null !== a) { - s.push( - `${t.toString().padStart(10, "0")} ${Math.min(e.gen, 65535).toString().padStart(5, "0")} n\r\n`, - ); - t += a.length; - } else - s.push( - `0000000000 ${Math.min(e.gen + 1, 65535) - .toString() - .padStart(5, "0")} f\r\n`, - ); - } - computeIDs(t, e, a); - s.push("trailer\n"); - await writeDict(a, s); - s.push("\nstartxref\n", t.toString(), "\n%%EOF\n"); - })(t, Q, i, u, l)); - const d = l.reduce((e, t) => e + t.length, e.length), - f = new Uint8Array(d); - f.set(e); - let p = e.length; - for (const e of l) { - writeString(e, p, f); - p += e.length; + const buffer = []; + let baseOffset = originalData.length; + const lastByte = originalData.at(-1); + if (lastByte !== 0x0a && lastByte !== 0x0d) { + buffer.push("\n"); + baseOffset += 1; } - return f; -} -const vs = 1, - Ks = 2, - Ts = 3, - qs = 4, - Os = 5; + const newXref = getTrailerDict(xrefInfo, newRefs, useXrefStream); + newRefs = newRefs.sort((a, b) => a.ref.num - b.ref.num); + for (const { data } of newRefs) { + if (data !== null) { + buffer.push(data); + } + } + await (useXrefStream + ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) + : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); + const totalLength = buffer.reduce( + (a, str) => a + str.length, + originalData.length, + ); + const array = new Uint8Array(totalLength); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + writeString(str, offset, array); + offset += str.length; + } + return array; +} // ./src/core/struct_tree.js + +const MAX_DEPTH = 40; +const StructElementType = { + PAGE_CONTENT: 1, + STREAM_CONTENT: 2, + OBJECT: 3, + ANNOTATION: 4, + ELEMENT: 5, +}; class StructTreeRoot { - constructor(e, t) { - this.dict = e; - this.ref = t instanceof Ref ? t : null; + constructor(rootDict, rootRef) { + this.dict = rootDict; + this.ref = rootRef instanceof Ref ? rootRef : null; this.roleMap = new Map(); this.structParentIds = null; } init() { this.readRoleMap(); } - #M(e, t, i) { - if (!(e instanceof Ref) || t < 0) return; - this.structParentIds ||= new RefSetCache(); - let a = this.structParentIds.get(e); - if (!a) { - a = []; - this.structParentIds.put(e, a); - } - a.push([t, i]); - } - addAnnotationIdToPage(e, t) { - this.#M(e, t, qs); - } - readRoleMap() { - const e = this.dict.get("RoleMap"); - e instanceof Dict && - e.forEach((e, t) => { - t instanceof Name && this.roleMap.set(e, t.name); - }); - } - static async canCreateStructureTree({ - catalogRef: e, - pdfManager: t, - newAnnotationsByPage: i, - }) { - if (!(e instanceof Ref)) { - warn("Cannot save the struct tree: no catalog reference."); - return !1; - } - let a = 0, - s = !0; - for (const [e, r] of i) { - const { ref: i } = await t.getPage(e); - if (!(i instanceof Ref)) { - warn(`Cannot save the struct tree: page ${e} has no ref.`); - s = !0; - break; - } - for (const e of r) - if (e.accessibilityData?.type) { - e.parentTreeId = a++; - s = !1; - } - } - if (s) { - for (const e of i.values()) for (const t of e) delete t.parentTreeId; - return !1; - } - return !0; - } - static async createStructureTree({ - newAnnotationsByPage: e, - xref: t, - catalogRef: i, - pdfManager: a, - newRefs: s, - }) { - const r = a.catalog.cloneDict(), - n = new RefSetCache(); - n.put(i, r); - const g = t.getNewTemporaryRef(); - r.set("StructTreeRoot", g); - const o = new Dict(t); - o.set("Type", Name.get("StructTreeRoot")); - const c = t.getNewTemporaryRef(); - o.set("ParentTree", c); - const C = []; - o.set("K", C); - n.put(g, o); - const h = new Dict(t), - l = []; - h.set("Nums", l); - const Q = await this.#L({ - newAnnotationsByPage: e, - structTreeRootRef: g, - kids: C, - nums: l, - xref: t, - pdfManager: a, - cache: n, - }); - o.set("ParentTreeNextKey", Q); - n.put(c, h); - const E = []; - for (const [e, i] of n.items()) { - E.length = 0; - await writeObject(e, i, E, t); - s.push({ ref: e, data: E.join("") }); - } - } - async canUpdateStructTree({ - pdfManager: e, - xref: t, - newAnnotationsByPage: i, - }) { - if (!this.ref) { - warn("Cannot update the struct tree: no root reference."); - return !1; - } - let a = this.dict.get("ParentTreeNextKey"); - if (!Number.isInteger(a) || a < 0) { - warn("Cannot update the struct tree: invalid next key."); - return !1; - } - const s = this.dict.get("ParentTree"); - if (!(s instanceof Dict)) { - warn("Cannot update the struct tree: ParentTree isn't a dict."); - return !1; - } - const r = s.get("Nums"); - if (!Array.isArray(r)) { - warn("Cannot update the struct tree: nums isn't an array."); - return !1; - } - const n = new NumberTree(s, t); - for (const t of i.keys()) { - const { pageDict: i } = await e.getPage(t); - if (!i.has("StructParents")) continue; - const a = i.get("StructParents"); - if (!Number.isInteger(a) || !Array.isArray(n.get(a))) { - warn(`Cannot save the struct tree: page ${t} has a wrong id.`); - return !1; - } - } - let g = !0; - for (const [t, s] of i) { - const { pageDict: i } = await e.getPage(t); - StructTreeRoot.#H({ - elements: s, - xref: this.dict.xref, - pageDict: i, - numberTree: n, - }); - for (const e of s) - if (e.accessibilityData?.type) { - e.parentTreeId = a++; - g = !1; - } - } - if (g) { - for (const e of i.values()) - for (const t of e) { - delete t.parentTreeId; - delete t.structTreeParent; - } - return !1; - } - return !0; - } - async updateStructureTree({ - newAnnotationsByPage: e, - pdfManager: t, - newRefs: i, - }) { - const a = this.dict.xref, - s = this.dict.clone(), - r = this.ref, - n = new RefSetCache(); - n.put(r, s); - let g, - o = s.getRaw("ParentTree"); - if (o instanceof Ref) g = a.fetch(o); - else { - g = o; - o = a.getNewTemporaryRef(); - s.set("ParentTree", o); - } - g = g.clone(); - n.put(o, g); - let c = g.getRaw("Nums"), - C = null; - if (c instanceof Ref) { - C = c; - c = a.fetch(C); - } - c = c.slice(); - C || g.set("Nums", c); - const h = await StructTreeRoot.#L({ - newAnnotationsByPage: e, - structTreeRootRef: r, - kids: null, - nums: c, - xref: a, - pdfManager: t, - cache: n, - }); - s.set("ParentTreeNextKey", h); - C && n.put(C, c); - const l = []; - for (const [e, t] of n.items()) { - l.length = 0; - await writeObject(e, t, l, a); - i.push({ ref: e, data: l.join("") }); - } - } - static async #L({ - newAnnotationsByPage: e, - structTreeRootRef: t, - kids: i, - nums: a, - xref: s, - pdfManager: r, - cache: n, - }) { - const g = Name.get("OBJR"); - let o = -1 / 0; - for (const [c, C] of e) { - const { ref: e } = await r.getPage(c), - h = e instanceof Ref; - for (const { - accessibilityData: r, - ref: c, - parentTreeId: l, - structTreeParent: Q, - } of C) { - if (!r?.type) continue; - const { - type: C, - title: E, - lang: u, - alt: d, - expanded: f, - actualText: p, - } = r; - o = Math.max(o, l); - const m = s.getNewTemporaryRef(), - y = new Dict(s); - y.set("S", Name.get(C)); - E && y.set("T", E); - u && y.set("Lang", u); - d && y.set("Alt", d); - f && y.set("E", f); - p && y.set("ActualText", p); - await this.#J({ - structTreeParent: Q, - tagDict: y, - newTagRef: m, - structTreeRootRef: t, - fallbackKids: i, - xref: s, - cache: n, - }); - const w = new Dict(s); - y.set("K", w); - w.set("Type", g); - h && w.set("Pg", e); - w.set("Obj", c); - n.put(m, y); - a.push(l, m); - } - } - return o + 1; - } - static #H({ elements: e, xref: t, pageDict: i, numberTree: a }) { - const s = new Map(); - for (const t of e) - if (t.structTreeParentId) { - const e = parseInt(t.structTreeParentId.split("_mc")[1], 10); - let i = s.get(e); - if (!i) { - i = []; - s.set(e, i); - } - i.push(t); - } - const r = i.get("StructParents"); - if (!Number.isInteger(r)) return; - const n = a.get(r), - updateElement = (e, i, a) => { - const r = s.get(e); - if (r) { - const e = i.getRaw("P"), - s = t.fetchIfRef(e); - if (e instanceof Ref && s instanceof Dict) { - const e = { ref: a, dict: i }; - for (const t of r) t.structTreeParent = e; - } - return !0; - } - return !1; - }; - for (const e of n) { - if (!(e instanceof Ref)) continue; - const i = t.fetch(e), - a = i.get("K"); - if (Number.isInteger(a)) updateElement(a, i, e); - else if (Array.isArray(a)) - for (let s of a) { - s = t.fetchIfRef(s); - if (Number.isInteger(s) && updateElement(s, i, e)) break; - if (!(s instanceof Dict)) continue; - if (!isName(s.get("Type"), "MCR")) break; - const a = s.get("MCID"); - if (Number.isInteger(a) && updateElement(a, i, e)) break; - } - } - } - static async #J({ - structTreeParent: e, - tagDict: t, - newTagRef: i, - structTreeRootRef: a, - fallbackKids: s, - xref: r, - cache: n, - }) { - let g, - o = null; - if (e) { - ({ ref: o } = e); - g = e.dict.getRaw("P") || a; - } else g = a; - t.set("P", g); - const c = r.fetchIfRef(g); - if (!c) { - s.push(i); + #addIdToPage(pageRef, id, type) { + if (!(pageRef instanceof Ref) || id < 0) { return; } - let C = n.get(g); - if (!C) { - C = c.clone(); - n.put(g, C); + this.structParentIds ||= new RefSetCache(); + let ids = this.structParentIds.get(pageRef); + if (!ids) { + ids = []; + this.structParentIds.put(pageRef, ids); } - const h = C.getRaw("K"); - let l = h instanceof Ref ? n.get(h) : null; - if (!l) { - l = r.fetchIfRef(h); - l = Array.isArray(l) ? l.slice() : [h]; - const e = r.getNewTemporaryRef(); - C.set("K", e); - n.put(e, l); + ids.push([id, type]); + } + addAnnotationIdToPage(pageRef, id) { + this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); + } + readRoleMap() { + const roleMapDict = this.dict.get("RoleMap"); + if (!(roleMapDict instanceof Dict)) { + return; } - const Q = l.indexOf(o); - l.splice(Q >= 0 ? Q + 1 : l.length, 0, i); + roleMapDict.forEach((key, value) => { + if (!(value instanceof Name)) { + return; + } + this.roleMap.set(key, value.name); + }); + } + static async canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage, + }) { + if (!(catalogRef instanceof Ref)) { + warn("Cannot save the struct tree: no catalog reference."); + return false; + } + let nextKey = 0; + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { ref: pageRef } = await pdfManager.getPage(pageIndex); + if (!(pageRef instanceof Ref)) { + warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`); + hasNothingToUpdate = true; + break; + } + for (const element of elements) { + if (element.accessibilityData?.type) { + element.parentTreeId = nextKey++; + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + } + } + return false; + } + return true; + } + static async createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + newRefs, + }) { + const root = pdfManager.catalog.cloneDict(); + const cache = new RefSetCache(); + cache.put(catalogRef, root); + const structTreeRootRef = xref.getNewTemporaryRef(); + root.set("StructTreeRoot", structTreeRootRef); + const structTreeRoot = new Dict(xref); + structTreeRoot.set("Type", Name.get("StructTreeRoot")); + const parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + const kids = []; + structTreeRoot.set("K", kids); + cache.put(structTreeRootRef, structTreeRoot); + const parentTree = new Dict(xref); + const nums = []; + parentTree.set("Nums", nums); + const nextKey = await this.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: null, + kids, + nums, + xref, + pdfManager, + newRefs, + cache, + }); + structTreeRoot.set("ParentTreeNextKey", nextKey); + cache.put(parentTreeRef, parentTree); + const buffer = []; + for (const [ref, obj] of cache.items()) { + buffer.length = 0; + await writeObject(ref, obj, buffer, xref); + newRefs.push({ + ref, + data: buffer.join(""), + }); + } + } + async canUpdateStructTree({ pdfManager, xref, newAnnotationsByPage }) { + if (!this.ref) { + warn("Cannot update the struct tree: no root reference."); + return false; + } + let nextKey = this.dict.get("ParentTreeNextKey"); + if (!Number.isInteger(nextKey) || nextKey < 0) { + warn("Cannot update the struct tree: invalid next key."); + return false; + } + const parentTree = this.dict.get("ParentTree"); + if (!(parentTree instanceof Dict)) { + warn("Cannot update the struct tree: ParentTree isn't a dict."); + return false; + } + const nums = parentTree.get("Nums"); + if (!Array.isArray(nums)) { + warn("Cannot update the struct tree: nums isn't an array."); + return false; + } + const numberTree = new NumberTree(parentTree, xref); + for (const pageIndex of newAnnotationsByPage.keys()) { + const { pageDict } = await pdfManager.getPage(pageIndex); + if (!pageDict.has("StructParents")) { + continue; + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) { + warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`); + return false; + } + } + let hasNothingToUpdate = true; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const { pageDict } = await pdfManager.getPage(pageIndex); + StructTreeRoot.#collectParents({ + elements, + xref: this.dict.xref, + pageDict, + numberTree, + }); + for (const element of elements) { + if (element.accessibilityData?.type) { + if (!(element.accessibilityData.structParent >= 0)) { + element.parentTreeId = nextKey++; + } + hasNothingToUpdate = false; + } + } + } + if (hasNothingToUpdate) { + for (const elements of newAnnotationsByPage.values()) { + for (const element of elements) { + delete element.parentTreeId; + delete element.structTreeParent; + } + } + return false; + } + return true; + } + async updateStructureTree({ newAnnotationsByPage, pdfManager, newRefs }) { + const xref = this.dict.xref; + const structTreeRoot = this.dict.clone(); + const structTreeRootRef = this.ref; + const cache = new RefSetCache(); + cache.put(structTreeRootRef, structTreeRoot); + let parentTreeRef = structTreeRoot.getRaw("ParentTree"); + let parentTree; + if (parentTreeRef instanceof Ref) { + parentTree = xref.fetch(parentTreeRef); + } else { + parentTree = parentTreeRef; + parentTreeRef = xref.getNewTemporaryRef(); + structTreeRoot.set("ParentTree", parentTreeRef); + } + parentTree = parentTree.clone(); + cache.put(parentTreeRef, parentTree); + let nums = parentTree.getRaw("Nums"); + let numsRef = null; + if (nums instanceof Ref) { + numsRef = nums; + nums = xref.fetch(numsRef); + } + nums = nums.slice(); + if (!numsRef) { + parentTree.set("Nums", nums); + } + const newNextKey = await StructTreeRoot.#writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot: this, + kids: null, + nums, + xref, + pdfManager, + newRefs, + cache, + }); + if (newNextKey === -1) { + return; + } + structTreeRoot.set("ParentTreeNextKey", newNextKey); + if (numsRef) { + cache.put(numsRef, nums); + } + const buffer = []; + for (const [ref, obj] of cache.items()) { + buffer.length = 0; + await writeObject(ref, obj, buffer, xref); + newRefs.push({ + ref, + data: buffer.join(""), + }); + } + } + static async #writeKids({ + newAnnotationsByPage, + structTreeRootRef, + structTreeRoot, + kids, + nums, + xref, + pdfManager, + newRefs, + cache, + }) { + const objr = Name.get("OBJR"); + let nextKey = -1; + let structTreePageObjs; + const buffer = []; + for (const [pageIndex, elements] of newAnnotationsByPage) { + const page = await pdfManager.getPage(pageIndex); + const { ref: pageRef } = page; + const isPageRef = pageRef instanceof Ref; + for (const { + accessibilityData, + ref, + parentTreeId, + structTreeParent, + } of elements) { + if (!accessibilityData?.type) { + continue; + } + const { structParent } = accessibilityData; + if ( + structTreeRoot && + Number.isInteger(structParent) && + structParent >= 0 + ) { + let objs = (structTreePageObjs ||= new Map()).get(pageIndex); + if (objs === undefined) { + const structTreePage = new StructTreePage( + structTreeRoot, + page.pageDict, + ); + objs = structTreePage.collectObjects(pageRef); + structTreePageObjs.set(pageIndex, objs); + } + const objRef = objs?.get(structParent); + if (objRef) { + const tagDict = xref.fetch(objRef).clone(); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + buffer.length = 0; + await writeObject(objRef, tagDict, buffer, xref); + newRefs.push({ + ref: objRef, + data: buffer.join(""), + }); + continue; + } + } + nextKey = Math.max(nextKey, parentTreeId); + const tagRef = xref.getNewTemporaryRef(); + const tagDict = new Dict(xref); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + await this.#updateParentTag({ + structTreeParent, + tagDict, + newTagRef: tagRef, + structTreeRootRef, + fallbackKids: kids, + xref, + cache, + }); + const objDict = new Dict(xref); + tagDict.set("K", objDict); + objDict.set("Type", objr); + if (isPageRef) { + objDict.set("Pg", pageRef); + } + objDict.set("Obj", ref); + cache.put(tagRef, tagDict); + nums.push(parentTreeId, tagRef); + } + } + return nextKey + 1; + } + static #writeProperties( + tagDict, + { type, title, lang, alt, expanded, actualText }, + ) { + tagDict.set("S", Name.get(type)); + if (title) { + tagDict.set("T", stringToAsciiOrUTF16BE(title)); + } + if (lang) { + tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); + } + if (alt) { + tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); + } + if (expanded) { + tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); + } + if (actualText) { + tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); + } + } + static #collectParents({ elements, xref, pageDict, numberTree }) { + const idToElements = new Map(); + for (const element of elements) { + if (element.structTreeParentId) { + const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); + let elems = idToElements.get(id); + if (!elems) { + elems = []; + idToElements.set(id, elems); + } + elems.push(element); + } + } + const id = pageDict.get("StructParents"); + if (!Number.isInteger(id)) { + return; + } + const parentArray = numberTree.get(id); + const updateElement = (kid, pageKid, kidRef) => { + const elems = idToElements.get(kid); + if (elems) { + const parentRef = pageKid.getRaw("P"); + const parentDict = xref.fetchIfRef(parentRef); + if (parentRef instanceof Ref && parentDict instanceof Dict) { + const params = { + ref: kidRef, + dict: pageKid, + }; + for (const element of elems) { + element.structTreeParent = params; + } + } + return true; + } + return false; + }; + for (const kidRef of parentArray) { + if (!(kidRef instanceof Ref)) { + continue; + } + const pageKid = xref.fetch(kidRef); + const k = pageKid.get("K"); + if (Number.isInteger(k)) { + updateElement(k, pageKid, kidRef); + continue; + } + if (!Array.isArray(k)) { + continue; + } + for (let kid of k) { + kid = xref.fetchIfRef(kid); + if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { + break; + } + if (!(kid instanceof Dict)) { + continue; + } + if (!isName(kid.get("Type"), "MCR")) { + break; + } + const mcid = kid.get("MCID"); + if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { + break; + } + } + } + } + static async #updateParentTag({ + structTreeParent, + tagDict, + newTagRef, + structTreeRootRef, + fallbackKids, + xref, + cache, + }) { + let ref = null; + let parentRef; + if (structTreeParent) { + ({ ref } = structTreeParent); + parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; + } else { + parentRef = structTreeRootRef; + } + tagDict.set("P", parentRef); + const parentDict = xref.fetchIfRef(parentRef); + if (!parentDict) { + fallbackKids.push(newTagRef); + return; + } + let cachedParentDict = cache.get(parentRef); + if (!cachedParentDict) { + cachedParentDict = parentDict.clone(); + cache.put(parentRef, cachedParentDict); + } + const parentKidsRaw = cachedParentDict.getRaw("K"); + let cachedParentKids = + parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; + if (!cachedParentKids) { + cachedParentKids = xref.fetchIfRef(parentKidsRaw); + cachedParentKids = Array.isArray(cachedParentKids) + ? cachedParentKids.slice() + : [parentKidsRaw]; + const parentKidsRef = xref.getNewTemporaryRef(); + cachedParentDict.set("K", parentKidsRef); + cache.put(parentKidsRef, cachedParentKids); + } + const index = cachedParentKids.indexOf(ref); + cachedParentKids.splice( + index >= 0 ? index + 1 : cachedParentKids.length, + 0, + newTagRef, + ); } } class StructElementNode { - constructor(e, t) { - this.tree = e; - this.dict = t; + constructor(tree, dict) { + this.tree = tree; + this.dict = dict; this.kids = []; this.parseKids(); } get role() { - const e = this.dict.get("S"), - t = e instanceof Name ? e.name : "", - { root: i } = this.tree; - return i.roleMap.has(t) ? i.roleMap.get(t) : t; + const nameObj = this.dict.get("S"); + const name = nameObj instanceof Name ? nameObj.name : ""; + const { root } = this.tree; + if (root.roleMap.has(name)) { + return root.roleMap.get(name); + } + return name; } parseKids() { - let e = null; - const t = this.dict.getRaw("Pg"); - t instanceof Ref && (e = t.toString()); - const i = this.dict.get("K"); - if (Array.isArray(i)) - for (const t of i) { - const i = this.parseKid(e, t); - i && this.kids.push(i); + let pageObjId = null; + const objRef = this.dict.getRaw("Pg"); + if (objRef instanceof Ref) { + 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); } - else { - const t = this.parseKid(e, i); - t && this.kids.push(t); } } - parseKid(e, t) { - if (Number.isInteger(t)) - return this.tree.pageDict.objId !== e - ? null - : new StructElement({ type: vs, mcid: t, pageObjId: e }); - let i = null; - t instanceof Ref - ? (i = this.dict.xref.fetch(t)) - : t instanceof Dict && (i = t); - if (!i) return null; - const a = i.getRaw("Pg"); - a instanceof Ref && (e = a.toString()); - const s = i.get("Type") instanceof Name ? i.get("Type").name : null; - if ("MCR" === s) { - if (this.tree.pageDict.objId !== e) return null; - const t = i.getRaw("Stm"); + parseKid(pageObjId, kid) { + if (Number.isInteger(kid)) { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } return new StructElement({ - type: Ks, - refObjId: t instanceof Ref ? t.toString() : null, - pageObjId: e, - mcid: i.get("MCID"), + type: StructElementType.PAGE_CONTENT, + mcid: kid, + pageObjId, }); } - if ("OBJR" === s) { - if (this.tree.pageDict.objId !== e) return null; - const t = i.getRaw("Obj"); + let kidDict = null; + if (kid instanceof Ref) { + kidDict = this.dict.xref.fetch(kid); + } else if (kid instanceof Dict) { + kidDict = kid; + } + if (!kidDict) { + return null; + } + const pageRef = kidDict.getRaw("Pg"); + if (pageRef instanceof Ref) { + pageObjId = pageRef.toString(); + } + const type = + kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null; + if (type === "MCR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Stm"); return new StructElement({ - type: Ts, - refObjId: t instanceof Ref ? t.toString() : null, - pageObjId: e, + type: StructElementType.STREAM_CONTENT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId, + mcid: kidDict.get("MCID"), }); } - return new StructElement({ type: Os, dict: i }); + if (type === "OBJR") { + if (this.tree.pageDict.objId !== pageObjId) { + return null; + } + const kidRef = kidDict.getRaw("Obj"); + return new StructElement({ + type: StructElementType.OBJECT, + refObjId: kidRef instanceof Ref ? kidRef.toString() : null, + pageObjId, + }); + } + return new StructElement({ + type: StructElementType.ELEMENT, + dict: kidDict, + }); } } class StructElement { constructor({ - type: e, - dict: t = null, - mcid: i = null, - pageObjId: a = null, - refObjId: s = null, + type, + dict = null, + mcid = null, + pageObjId = null, + refObjId = null, }) { - this.type = e; - this.dict = t; - this.mcid = i; - this.pageObjId = a; - this.refObjId = s; + this.type = type; + this.dict = dict; + this.mcid = mcid; + this.pageObjId = pageObjId; + this.refObjId = refObjId; this.parentNode = null; } } class StructTreePage { - constructor(e, t) { - this.root = e; - this.rootDict = e ? e.dict : null; - this.pageDict = t; + constructor(structTreeRoot, pageDict) { + this.root = structTreeRoot; + this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.pageDict = pageDict; this.nodes = []; } - parse(e) { - if (!this.root || !this.rootDict) return; - const t = this.rootDict.get("ParentTree"); - if (!t) return; - const i = this.pageDict.get("StructParents"), - a = e instanceof Ref && this.root.structParentIds?.get(e); - if (!Number.isInteger(i) && !a) return; - const s = new Map(), - r = new NumberTree(t, this.rootDict.xref); - if (Number.isInteger(i)) { - const e = r.get(i); - if (Array.isArray(e)) - for (const t of e) - t instanceof Ref && this.addNode(this.rootDict.xref.fetch(t), s); + collectObjects(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return null; } - if (a) - for (const [e, t] of a) { - const i = r.get(e); - if (i) { - const e = this.addNode(this.rootDict.xref.fetchIfRef(i), s); - 1 === e?.kids?.length && - e.kids[0].type === Ts && - (e.kids[0].type = t); + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return null; + } + const ids = this.root.structParentIds?.get(pageRef); + if (!ids) { + return null; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + for (const [elemId] of ids) { + const obj = numberTree.getRaw(elemId); + if (obj instanceof Ref) { + map.set(elemId, obj); + } + } + return map; + } + parse(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return; + } + const id = this.pageDict.get("StructParents"); + const ids = this.root.structParentIds?.get(pageRef); + if (!Number.isInteger(id) && !ids) { + return; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.rootDict.xref); + if (Number.isInteger(id)) { + const parentArray = numberTree.get(id); + if (Array.isArray(parentArray)) { + for (const ref of parentArray) { + if (ref instanceof Ref) { + this.addNode(this.rootDict.xref.fetch(ref), map); + } } } + } + if (!ids) { + return; + } + for (const [elemId, type] of ids) { + const obj = numberTree.get(elemId); + if (obj) { + const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); + if ( + elem?.kids?.length === 1 && + elem.kids[0].type === StructElementType.OBJECT + ) { + elem.kids[0].type = type; + } + } + } } - addNode(e, t, i = 0) { - if (i > 40) { + addNode(dict, map, level = 0) { + if (level > MAX_DEPTH) { warn("StructTree MAX_DEPTH reached."); return null; } - if (t.has(e)) return t.get(e); - const a = new StructElementNode(this, e); - t.set(e, a); - const s = e.get("P"); - if (!s || isName(s.get("Type"), "StructTreeRoot")) { - this.addTopLevelNode(e, a) || t.delete(e); - return a; + if (!(dict instanceof Dict)) { + return null; } - const r = this.addNode(s, t, i + 1); - if (!r) return a; - let n = !1; - for (const t of r.kids) - if (t.type === Os && t.dict === e) { - t.parentNode = a; - n = !0; + 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 || isName(parent.get("Type"), "StructTreeRoot")) { + if (!this.addTopLevelNode(dict, element)) { + map.delete(dict); } - n || t.delete(e); - return a; + 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(e, t) { - const i = this.rootDict.get("K"); - if (!i) return !1; - if (i instanceof Dict) { - if (i.objId !== e.objId) return !1; - this.nodes[0] = t; - return !0; + addTopLevelNode(dict, element) { + const obj = this.rootDict.get("K"); + if (!obj) { + return false; } - if (!Array.isArray(i)) return !0; - let a = !1; - for (let s = 0; s < i.length; s++) { - const r = i[s]; - if (r?.toString() === e.objId) { - this.nodes[s] = t; - a = !0; + if (obj instanceof Dict) { + 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?.toString() === dict.objId) { + this.nodes[i] = element; + save = true; } } - return a; + return save; } get serializable() { - function nodeToSerializable(e, t, i = 0) { - if (i > 40) { + function nodeToSerializable(node, parent, level = 0) { + if (level > MAX_DEPTH) { warn("StructTree too deep to be fully serialized."); return; } - const a = Object.create(null); - a.role = e.role; - a.children = []; - t.children.push(a); - const s = e.dict.get("Alt"); - "string" == typeof s && (a.alt = stringToPDFString(s)); - const r = e.dict.get("Lang"); - "string" == typeof r && (a.lang = stringToPDFString(r)); - for (const t of e.kids) { - const e = t.type === Os ? t.parentNode : null; - e - ? nodeToSerializable(e, a, i + 1) - : t.type === vs || t.type === Ks - ? a.children.push({ - type: "content", - id: `p${t.pageObjId}_mc${t.mcid}`, - }) - : t.type === Ts - ? a.children.push({ type: "object", id: t.refObjId }) - : t.type === qs && - a.children.push({ - type: "annotation", - id: `pdfjs_internal_id_${t.refObjId}`, - }); + const obj = Object.create(null); + obj.role = node.role; + obj.children = []; + parent.children.push(obj); + let alt = node.dict.get("Alt"); + if (typeof alt !== "string") { + alt = node.dict.get("ActualText"); + } + if (typeof alt === "string") { + obj.alt = stringToPDFString(alt); + } + const a = node.dict.get("A"); + if (a instanceof Dict) { + const bbox = lookupNormalRect(a.getArray("BBox"), null); + if (bbox) { + obj.bbox = bbox; + } else { + const width = a.get("Width"); + const height = a.get("Height"); + if ( + typeof width === "number" && + width > 0 && + typeof height === "number" && + height > 0 + ) { + obj.bbox = [0, 0, width, height]; + } + } + } + const lang = node.dict.get("Lang"); + if (typeof lang === "string") { + obj.lang = stringToPDFString(lang); + } + 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: `p${kid.pageObjId}_mc${kid.mcid}`, + }); + } else if (kid.type === StructElementType.OBJECT) { + obj.children.push({ + type: "object", + id: kid.refObjId, + }); + } else if (kid.type === StructElementType.ANNOTATION) { + obj.children.push({ + type: "annotation", + id: `${AnnotationPrefix}${kid.refObjId}`, + }); + } } } - const e = Object.create(null); - e.children = []; - e.role = "Root"; - for (const t of this.nodes) t && nodeToSerializable(t, e); - return e; + const root = Object.create(null); + root.children = []; + root.role = "Root"; + for (const child of this.nodes) { + if (!child) { + continue; + } + nodeToSerializable(child, root); + } + return root; } -} -function isValidExplicitDest(e) { - if (!Array.isArray(e) || e.length < 2) return !1; - const [t, i, ...a] = e; - if (!(t instanceof Ref || Number.isInteger(t))) return !1; - if (!(i instanceof Name)) return !1; - let s = !0; - switch (i.name) { +} // ./src/core/catalog.js + +function isValidExplicitDest(dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!(page instanceof Ref) && !Number.isInteger(page)) { + return false; + } + if (!(zoom instanceof Name)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { case "XYZ": - if (3 !== a.length) return !1; + if (argsLen < 2 || argsLen > 3) { + return false; + } break; case "Fit": case "FitB": - return 0 === a.length; + return argsLen === 0; case "FitH": case "FitBH": case "FitV": case "FitBV": - if (1 !== a.length) return !1; + if (argsLen > 1) { + return false; + } break; case "FitR": - if (4 !== a.length) return !1; - s = !1; + if (argsLen !== 4) { + return false; + } + allowNull = false; break; default: - return !1; + return false; } - for (const e of a) - if (!("number" == typeof e || (s && null === e))) return !1; - return !0; + for (const arg of args) { + if (!(typeof arg === "number" || (allowNull && arg === null))) { + return false; + } + } + return true; } -function fetchDest(e) { - e instanceof Dict && (e = e.get("D")); - return isValidExplicitDest(e) ? e : null; +function fetchDest(dest) { + if (dest instanceof Dict) { + dest = dest.get("D"); + } + return isValidExplicitDest(dest) ? dest : null; } -function fetchRemoteDest(e) { - let t = e.get("D"); - if (t) { - t instanceof Name && (t = t.name); - if ("string" == typeof t) return stringToPDFString(t); - if (isValidExplicitDest(t)) return JSON.stringify(t); +function fetchRemoteDest(action) { + let dest = action.get("D"); + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + return stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + return JSON.stringify(dest); + } } return null; } class Catalog { - constructor(e, t) { - this.pdfManager = e; - this.xref = t; - this._catDict = t.getCatalogObj(); - if (!(this._catDict instanceof Dict)) + constructor(pdfManager, xref) { + this.pdfManager = pdfManager; + this.xref = xref; + this._catDict = xref.getCatalogObj(); + if (!(this._catDict instanceof Dict)) { throw new FormatError("Catalog object is not a dictionary."); + } this.toplevelPagesDict; this._actualNumPages = null; this.fontCache = new RefSetCache(); @@ -40039,6 +48206,7 @@ class Catalog { this.globalImageCache = new GlobalImageCache(); this.pageKidsCountCache = new RefSetCache(); this.pageIndexCache = new RefSetCache(); + this.pageDictCache = new RefSetCache(); this.nonBlendModesSet = new RefSet(); this.systemFontCache = new Map(); } @@ -40046,494 +48214,693 @@ class Catalog { return this._catDict.clone(); } get version() { - const e = this._catDict.get("Version"); - if (e instanceof Name) { - if (bt.test(e.name)) return shadow(this, "version", e.name); - warn(`Invalid PDF catalog version: ${e.name}`); + const version = this._catDict.get("Version"); + if (version instanceof Name) { + if (PDF_VERSION_REGEXP.test(version.name)) { + return shadow(this, "version", version.name); + } + warn(`Invalid PDF catalog version: ${version.name}`); } return shadow(this, "version", null); } get lang() { - const e = this._catDict.get("Lang"); + const lang = this._catDict.get("Lang"); return shadow( this, "lang", - e && "string" == typeof e ? stringToPDFString(e) : null, + lang && typeof lang === "string" ? stringToPDFString(lang) : null, ); } get needsRendering() { - const e = this._catDict.get("NeedsRendering"); - return shadow(this, "needsRendering", "boolean" == typeof e && e); + const needsRendering = this._catDict.get("NeedsRendering"); + return shadow( + this, + "needsRendering", + typeof needsRendering === "boolean" ? needsRendering : false, + ); } get collection() { - let e = null; + let collection = null; try { - const t = this._catDict.get("Collection"); - t instanceof Dict && t.size > 0 && (e = t); - } catch (e) { - if (e instanceof MissingDataException) throw e; + const obj = this._catDict.get("Collection"); + if (obj instanceof Dict && obj.size > 0) { + collection = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } info("Cannot fetch Collection entry; assuming no collection is present."); } - return shadow(this, "collection", e); + return shadow(this, "collection", collection); } get acroForm() { - let e = null; + let acroForm = null; try { - const t = this._catDict.get("AcroForm"); - t instanceof Dict && t.size > 0 && (e = t); - } catch (e) { - if (e instanceof MissingDataException) throw e; + const obj = this._catDict.get("AcroForm"); + if (obj instanceof Dict && obj.size > 0) { + acroForm = obj; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } info("Cannot fetch AcroForm entry; assuming no forms are present."); } - return shadow(this, "acroForm", e); + return shadow(this, "acroForm", acroForm); } get acroFormRef() { - const e = this._catDict.getRaw("AcroForm"); - return shadow(this, "acroFormRef", e instanceof Ref ? e : null); + const value = this._catDict.getRaw("AcroForm"); + return shadow(this, "acroFormRef", value instanceof Ref ? value : null); } get metadata() { - const e = this._catDict.getRaw("Metadata"); - if (!(e instanceof Ref)) return shadow(this, "metadata", null); - let t = null; + const streamRef = this._catDict.getRaw("Metadata"); + if (!(streamRef instanceof Ref)) { + return shadow(this, "metadata", null); + } + let metadata = null; try { - const i = this.xref.fetch(e, !this.xref.encrypt?.encryptMetadata); - if (i instanceof BaseStream && i.dict instanceof Dict) { - const e = i.dict.get("Type"), - a = i.dict.get("Subtype"); - if (isName(e, "Metadata") && isName(a, "XML")) { - const e = stringToUTF8String(i.getString()); - e && (t = new MetadataParser(e).serializable); + const stream = this.xref.fetch( + streamRef, + !this.xref.encrypt?.encryptMetadata, + ); + if (stream instanceof BaseStream && stream.dict instanceof Dict) { + const type = stream.dict.get("Type"); + const subtype = stream.dict.get("Subtype"); + if (isName(type, "Metadata") && isName(subtype, "XML")) { + const data = stringToUTF8String(stream.getString()); + if (data) { + metadata = new MetadataParser(data).serializable; + } } } - } catch (e) { - if (e instanceof MissingDataException) throw e; - info(`Skipping invalid Metadata: "${e}".`); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info(`Skipping invalid Metadata: "${ex}".`); } - return shadow(this, "metadata", t); + return shadow(this, "metadata", metadata); } get markInfo() { - let e = null; + let markInfo = null; try { - e = this._readMarkInfo(); - } catch (e) { - if (e instanceof MissingDataException) throw e; + markInfo = this._readMarkInfo(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn("Unable to read mark info."); } - return shadow(this, "markInfo", e); + return shadow(this, "markInfo", markInfo); } _readMarkInfo() { - const e = this._catDict.get("MarkInfo"); - if (!(e instanceof Dict)) return null; - const t = { Marked: !1, UserProperties: !1, Suspects: !1 }; - for (const i in t) { - const a = e.get(i); - "boolean" == typeof a && (t[i] = a); + const obj = this._catDict.get("MarkInfo"); + if (!(obj instanceof Dict)) { + return null; } - return t; + const markInfo = { + Marked: false, + UserProperties: false, + Suspects: false, + }; + for (const key in markInfo) { + const value = obj.get(key); + if (typeof value === "boolean") { + markInfo[key] = value; + } + } + return markInfo; } get structTreeRoot() { - let e = null; + let structTree = null; try { - e = this._readStructTreeRoot(); - } catch (e) { - if (e instanceof MissingDataException) throw e; + structTree = this._readStructTreeRoot(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn("Unable read to structTreeRoot info."); } - return shadow(this, "structTreeRoot", e); + return shadow(this, "structTreeRoot", structTree); } _readStructTreeRoot() { - const e = this._catDict.getRaw("StructTreeRoot"), - t = this.xref.fetchIfRef(e); - if (!(t instanceof Dict)) return null; - const i = new StructTreeRoot(t, e); - i.init(); - return i; + const rawObj = this._catDict.getRaw("StructTreeRoot"); + const obj = this.xref.fetchIfRef(rawObj); + if (!(obj instanceof Dict)) { + return null; + } + const root = new StructTreeRoot(obj, rawObj); + root.init(); + return root; } get toplevelPagesDict() { - const e = this._catDict.get("Pages"); - if (!(e instanceof Dict)) + const pagesObj = this._catDict.get("Pages"); + if (!(pagesObj instanceof Dict)) { throw new FormatError("Invalid top-level pages dictionary."); - return shadow(this, "toplevelPagesDict", e); + } + return shadow(this, "toplevelPagesDict", pagesObj); } get documentOutline() { - let e = null; + let obj = null; try { - e = this._readDocumentOutline(); - } catch (e) { - if (e instanceof MissingDataException) throw e; + obj = this._readDocumentOutline(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn("Unable to read document outline."); } - return shadow(this, "documentOutline", e); + return shadow(this, "documentOutline", obj); } _readDocumentOutline() { - let e = this._catDict.get("Outlines"); - if (!(e instanceof Dict)) return null; - e = e.getRaw("First"); - if (!(e instanceof Ref)) return null; - const t = { items: [] }, - i = [{ obj: e, parent: t }], - a = new RefSet(); - a.put(e); - const s = this.xref, - r = new Uint8ClampedArray(3); - for (; i.length > 0; ) { - const t = i.shift(), - n = s.fetchIfRef(t.obj); - if (null === n) continue; - n.has("Title") || warn("Invalid outline item encountered."); - const g = { url: null, dest: null, action: null }; + let obj = this._catDict.get("Outlines"); + if (!(obj instanceof Dict)) { + return null; + } + obj = obj.getRaw("First"); + if (!(obj instanceof Ref)) { + return null; + } + const root = { + items: [], + }; + const queue = [ + { + obj, + parent: root, + }, + ]; + const processed = new 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")) { + warn("Invalid outline item encountered."); + } + const data = { + url: null, + dest: null, + action: null, + }; Catalog.parseDestDictionary({ - destDict: n, - resultObj: g, + destDict: outlineDict, + resultObj: data, docBaseUrl: this.baseUrl, docAttachments: this.attachments, }); - const o = n.get("Title"), - c = n.get("F") || 0, - C = n.getArray("C"), - h = n.get("Count"); - let l = r; - !isNumberArray(C, 3) || - (0 === C[0] && 0 === C[1] && 0 === C[2]) || - (l = ColorSpace.singletons.rgb.getRgb(C, 0)); - const Q = { - action: g.action, - attachment: g.attachment, - dest: g.dest, - url: g.url, - unsafeUrl: g.unsafeUrl, - newWindow: g.newWindow, - setOCGState: g.setOCGState, - title: "string" == typeof o ? stringToPDFString(o) : "", - color: l, - count: Number.isInteger(h) ? h : void 0, - bold: !!(2 & c), - italic: !!(1 & c), + 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 ( + isNumberArray(color, 3) && + (color[0] !== 0 || color[1] !== 0 || color[2] !== 0) + ) { + rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); + } + const outlineItem = { + action: data.action, + attachment: data.attachment, + dest: data.dest, + url: data.url, + unsafeUrl: data.unsafeUrl, + newWindow: data.newWindow, + setOCGState: data.setOCGState, + title: typeof title === "string" ? stringToPDFString(title) : "", + color: rgbColor, + count: Number.isInteger(count) ? count : undefined, + bold: !!(flags & 2), + italic: !!(flags & 1), items: [], }; - t.parent.items.push(Q); - e = n.getRaw("First"); - if (e instanceof Ref && !a.has(e)) { - i.push({ obj: e, parent: Q }); - a.put(e); + i.parent.items.push(outlineItem); + obj = outlineDict.getRaw("First"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: outlineItem, + }); + processed.put(obj); } - e = n.getRaw("Next"); - if (e instanceof Ref && !a.has(e)) { - i.push({ obj: e, parent: t.parent }); - a.put(e); + obj = outlineDict.getRaw("Next"); + if (obj instanceof Ref && !processed.has(obj)) { + queue.push({ + obj, + parent: i.parent, + }); + processed.put(obj); } } - return t.items.length > 0 ? t.items : null; + return root.items.length > 0 ? root.items : null; } get permissions() { - let e = null; + let permissions = null; try { - e = this._readPermissions(); - } catch (e) { - if (e instanceof MissingDataException) throw e; + permissions = this._readPermissions(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn("Unable to read permissions."); } - return shadow(this, "permissions", e); + return shadow(this, "permissions", permissions); } _readPermissions() { - const e = this.xref.trailer.get("Encrypt"); - if (!(e instanceof Dict)) return null; - let t = e.get("P"); - if ("number" != typeof t) return null; - t += 2 ** 32; - const i = []; - for (const e in m) { - const a = m[e]; - t & a && i.push(a); + const encrypt = this.xref.trailer.get("Encrypt"); + if (!(encrypt instanceof Dict)) { + return null; } - return i; + let flags = encrypt.get("P"); + if (typeof flags !== "number") { + return null; + } + flags += 2 ** 32; + const permissions = []; + for (const key in PermissionFlag) { + const value = PermissionFlag[key]; + if (flags & value) { + permissions.push(value); + } + } + return permissions; } get optionalContentConfig() { - let e = null; + let config = null; try { - const t = this._catDict.get("OCProperties"); - if (!t) return shadow(this, "optionalContentConfig", null); - const i = t.get("D"); - if (!i) return shadow(this, "optionalContentConfig", null); - const a = t.get("OCGs"); - if (!Array.isArray(a)) return shadow(this, "optionalContentConfig", null); - const s = [], - r = new RefSet(); - for (const e of a) - if (e instanceof Ref && !r.has(e)) { - r.put(e); - s.push(this.#Y(e)); - } - e = this.#v(i, r); - e.groups = s; - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`Unable to read optional content config: ${e}`); - } - return shadow(this, "optionalContentConfig", e); - } - #Y(e) { - const t = this.xref.fetch(e), - i = { - id: e.toString(), - name: null, - intent: null, - usage: { print: null, view: null }, - }, - a = t.get("Name"); - "string" == typeof a && (i.name = stringToPDFString(a)); - let s = t.getArray("Intent"); - Array.isArray(s) || (s = [s]); - s.every((e) => e instanceof Name) && (i.intent = s.map((e) => e.name)); - const r = t.get("Usage"); - if (!(r instanceof Dict)) return i; - const n = i.usage, - g = r.get("Print"); - if (g instanceof Dict) { - const e = g.get("PrintState"); - if (e instanceof Name) - switch (e.name) { - case "ON": - case "OFF": - n.print = { printState: e.name }; - } - } - const o = r.get("View"); - if (o instanceof Dict) { - const e = o.get("ViewState"); - if (e instanceof Name) - switch (e.name) { - case "ON": - case "OFF": - n.view = { viewState: e.name }; - } - } - return i; - } - #v(e, t) { - function parseOnOff(e) { - const i = []; - if (Array.isArray(e)) - for (const a of e) a instanceof Ref && t.has(a) && i.push(a.toString()); - return i; - } - function parseOrder(e, i = 0) { - if (!Array.isArray(e)) return null; - const s = []; - for (const r of e) { - if (r instanceof Ref && t.has(r)) { - a.put(r); - s.push(r.toString()); + const properties = this._catDict.get("OCProperties"); + if (!properties) { + return shadow(this, "optionalContentConfig", null); + } + const defaultConfig = properties.get("D"); + if (!defaultConfig) { + return shadow(this, "optionalContentConfig", null); + } + const groupsData = properties.get("OCGs"); + if (!Array.isArray(groupsData)) { + return shadow(this, "optionalContentConfig", null); + } + const groupRefCache = new RefSetCache(); + for (const groupRef of groupsData) { + if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { continue; } - const e = parseNestedOrder(r, i); - e && s.push(e); + groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); } - if (i > 0) return s; - const r = []; - for (const e of t) a.has(e) || r.push(e.toString()); - r.length && s.push({ name: null, order: r }); - return s; + config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Unable to read optional content config: ${ex}`); } - function parseNestedOrder(e, t) { - if (++t > s) { + return shadow(this, "optionalContentConfig", config); + } + #readOptionalContentGroup(groupRef) { + const group = this.xref.fetch(groupRef); + const obj = { + id: groupRef.toString(), + name: null, + intent: null, + usage: { + print: null, + view: null, + }, + rbGroups: [], + }; + const name = group.get("Name"); + if (typeof name === "string") { + obj.name = stringToPDFString(name); + } + let intent = group.getArray("Intent"); + if (!Array.isArray(intent)) { + intent = [intent]; + } + if (intent.every((i) => i instanceof Name)) { + obj.intent = intent.map((i) => i.name); + } + const usage = group.get("Usage"); + if (!(usage instanceof Dict)) { + return obj; + } + const usageObj = obj.usage; + const print = usage.get("Print"); + if (print instanceof Dict) { + const printState = print.get("PrintState"); + if (printState instanceof Name) { + switch (printState.name) { + case "ON": + case "OFF": + usageObj.print = { + printState: printState.name, + }; + } + } + } + const view = usage.get("View"); + if (view instanceof Dict) { + const viewState = view.get("ViewState"); + if (viewState instanceof Name) { + switch (viewState.name) { + case "ON": + case "OFF": + usageObj.view = { + viewState: viewState.name, + }; + } + } + } + return obj; + } + #readOptionalContentConfig(config, groupRefCache) { + function parseOnOff(refs) { + const onParsed = []; + if (Array.isArray(refs)) { + for (const value of refs) { + if (!(value instanceof Ref)) { + continue; + } + if (groupRefCache.has(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 (value instanceof Ref && groupRefCache.has(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 groupRefCache.items()) { + 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) { warn("parseNestedOrder - reached MAX_NESTED_LEVELS."); return null; } - const a = i.fetchIfRef(e); - if (!Array.isArray(a)) return null; - const r = i.fetchIfRef(a[0]); - if ("string" != typeof r) return null; - const n = parseOrder(a.slice(1), t); - return n && n.length ? { name: stringToPDFString(r), order: n } : 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: stringToPDFString(nestedName), + order: nestedOrder, + }; } - const i = this.xref, - a = new RefSet(), - s = 10; + function parseRBGroups(rbGroups) { + if (!Array.isArray(rbGroups)) { + return; + } + for (const value of rbGroups) { + const rbGroup = xref.fetchIfRef(value); + if (!Array.isArray(rbGroup) || !rbGroup.length) { + continue; + } + const parsedRbGroup = new Set(); + for (const ref of rbGroup) { + if ( + ref instanceof Ref && + groupRefCache.has(ref) && + !parsedRbGroup.has(ref.toString()) + ) { + parsedRbGroup.add(ref.toString()); + groupRefCache.get(ref).rbGroups.push(parsedRbGroup); + } + } + } + } + const xref = this.xref, + parsedOrderRefs = new RefSet(), + MAX_NESTED_LEVELS = 10; + parseRBGroups(config.get("RBGroups")); return { name: - "string" == typeof e.get("Name") - ? stringToPDFString(e.get("Name")) + typeof config.get("Name") === "string" + ? stringToPDFString(config.get("Name")) : null, creator: - "string" == typeof e.get("Creator") - ? stringToPDFString(e.get("Creator")) + typeof config.get("Creator") === "string" + ? stringToPDFString(config.get("Creator")) : null, baseState: - e.get("BaseState") instanceof Name ? e.get("BaseState").name : null, - on: parseOnOff(e.get("ON")), - off: parseOnOff(e.get("OFF")), - order: parseOrder(e.get("Order")), - groups: null, + config.get("BaseState") instanceof Name + ? config.get("BaseState").name + : null, + on: parseOnOff(config.get("ON")), + off: parseOnOff(config.get("OFF")), + order: parseOrder(config.get("Order")), + groups: [...groupRefCache], }; } - setActualNumPages(e = null) { - this._actualNumPages = e; + setActualNumPages(num = null) { + this._actualNumPages = num; } get hasActualNumPages() { - return null !== this._actualNumPages; + return this._actualNumPages !== null; } get _pagesCount() { - const e = this.toplevelPagesDict.get("Count"); - if (!Number.isInteger(e)) + const obj = this.toplevelPagesDict.get("Count"); + if (!Number.isInteger(obj)) { throw new FormatError( "Page count in top-level pages dictionary is not an integer.", ); - return shadow(this, "_pagesCount", e); + } + return shadow(this, "_pagesCount", obj); } get numPages() { return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; } get destinations() { - const e = this._readDests(), - t = Object.create(null); - if (e instanceof NameTree) - for (const [i, a] of e.getAll()) { - const e = fetchDest(a); - e && (t[stringToPDFString(i)] = e); + const obj = this._readDests(), + dests = Object.create(null); + if (obj instanceof NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDest(value); + if (dest) { + dests[stringToPDFString(key)] = dest; + } } - else - e instanceof Dict && - e.forEach(function (e, i) { - const a = fetchDest(i); - a && (t[e] = a); - }); - return shadow(this, "destinations", t); + } else if (obj instanceof Dict) { + obj.forEach(function (key, value) { + const dest = fetchDest(value); + if (dest) { + dests[key] = dest; + } + }); + } + return shadow(this, "destinations", dests); } - getDestination(e) { - const t = this._readDests(); - if (t instanceof NameTree) { - const i = fetchDest(t.get(e)); - if (i) return i; - const a = this.destinations[e]; - if (a) { - warn(`Found "${e}" at an incorrect position in the NameTree.`); - return a; + getDestination(id) { + const obj = this._readDests(); + if (obj instanceof NameTree) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } + const allDest = this.destinations[id]; + if (allDest) { + warn(`Found "${id}" at an incorrect position in the NameTree.`); + return allDest; + } + } else if (obj instanceof Dict) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; } - } else if (t instanceof Dict) { - const i = fetchDest(t.get(e)); - if (i) return i; } return null; } _readDests() { - const e = this._catDict.get("Names"); - return e?.has("Dests") - ? new NameTree(e.getRaw("Dests"), this.xref) - : this._catDict.has("Dests") - ? this._catDict.get("Dests") - : void 0; + const obj = this._catDict.get("Names"); + if (obj?.has("Dests")) { + return new NameTree(obj.getRaw("Dests"), this.xref); + } else if (this._catDict.has("Dests")) { + return this._catDict.get("Dests"); + } + return undefined; } get pageLabels() { - let e = null; + let obj = null; try { - e = this._readPageLabels(); - } catch (e) { - if (e instanceof MissingDataException) throw e; + obj = this._readPageLabels(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } warn("Unable to read page labels."); } - return shadow(this, "pageLabels", e); + return shadow(this, "pageLabels", obj); } _readPageLabels() { - const e = this._catDict.getRaw("PageLabels"); - if (!e) return null; - const t = new Array(this.numPages); - let i = null, - a = ""; - const s = new NumberTree(e, this.xref).getAll(); - let r = "", - n = 1; - for (let e = 0, g = this.numPages; e < g; e++) { - const g = s.get(e); - if (void 0 !== g) { - if (!(g instanceof Dict)) + const obj = this._catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + 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; + for (let i = 0, ii = this.numPages; i < ii; i++) { + const labelDict = nums.get(i); + if (labelDict !== undefined) { + if (!(labelDict instanceof Dict)) { throw new FormatError("PageLabel is not a dictionary."); - if (g.has("Type") && !isName(g.get("Type"), "PageLabel")) + } + if ( + labelDict.has("Type") && + !isName(labelDict.get("Type"), "PageLabel") + ) { throw new FormatError("Invalid type in PageLabel dictionary."); - if (g.has("S")) { - const e = g.get("S"); - if (!(e instanceof Name)) + } + if (labelDict.has("S")) { + const s = labelDict.get("S"); + if (!(s instanceof Name)) { throw new FormatError("Invalid style in PageLabel dictionary."); - i = e.name; - } else i = null; - if (g.has("P")) { - const e = g.get("P"); - if ("string" != typeof e) + } + style = s.name; + } else { + style = null; + } + if (labelDict.has("P")) { + const p = labelDict.get("P"); + if (typeof p !== "string") { throw new FormatError("Invalid prefix in PageLabel dictionary."); - a = stringToPDFString(e); - } else a = ""; - if (g.has("St")) { - const e = g.get("St"); - if (!(Number.isInteger(e) && e >= 1)) + } + prefix = stringToPDFString(p); + } else { + prefix = ""; + } + if (labelDict.has("St")) { + const st = labelDict.get("St"); + if (!(Number.isInteger(st) && st >= 1)) { throw new FormatError("Invalid start in PageLabel dictionary."); - n = e; - } else n = 1; + } + currentIndex = st; + } else { + currentIndex = 1; + } } - switch (i) { + switch (style) { case "D": - r = n; + currentLabel = currentIndex; break; case "R": case "r": - r = toRomanNumerals(n, "r" === i); + currentLabel = toRomanNumerals(currentIndex, style === "r"); break; case "A": case "a": - const e = 26, - t = "a" === i ? 97 : 65, - a = n - 1; - r = String.fromCharCode(t + (a % e)).repeat(Math.floor(a / e) + 1); + 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), + ); + currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); break; default: - if (i) + if (style) { throw new FormatError( - `Invalid style "${i}" in PageLabel dictionary.`, + `Invalid style "${style}" in PageLabel dictionary.`, ); - r = ""; + } + currentLabel = ""; } - t[e] = a + r; - n++; + pageLabels[i] = prefix + currentLabel; + currentIndex++; } - return t; + return pageLabels; } get pageLayout() { - const e = this._catDict.get("PageLayout"); - let t = ""; - if (e instanceof Name) - switch (e.name) { + const obj = this._catDict.get("PageLayout"); + let pageLayout = ""; + if (obj instanceof Name) { + switch (obj.name) { case "SinglePage": case "OneColumn": case "TwoColumnLeft": case "TwoColumnRight": case "TwoPageLeft": case "TwoPageRight": - t = e.name; + pageLayout = obj.name; } - return shadow(this, "pageLayout", t); + } + return shadow(this, "pageLayout", pageLayout); } get pageMode() { - const e = this._catDict.get("PageMode"); - let t = "UseNone"; - if (e instanceof Name) - switch (e.name) { + const obj = this._catDict.get("PageMode"); + let pageMode = "UseNone"; + if (obj instanceof Name) { + switch (obj.name) { case "UseNone": case "UseOutlines": case "UseThumbs": case "FullScreen": case "UseOC": case "UseAttachments": - t = e.name; + pageMode = obj.name; } - return shadow(this, "pageMode", t); + } + return shadow(this, "pageMode", pageMode); } get viewerPreferences() { - const e = this._catDict.get("ViewerPreferences"); - if (!(e instanceof Dict)) return shadow(this, "viewerPreferences", null); - let t = null; - for (const i of e.getKeys()) { - const a = e.get(i); - let s; - switch (i) { + const obj = this._catDict.get("ViewerPreferences"); + if (!(obj instanceof Dict)) { + return shadow(this, "viewerPreferences", null); + } + let prefs = null; + for (const key of obj.getKeys()) { + const value = obj.get(key); + let prefValue; + switch (key) { case "HideToolbar": case "HideMenubar": case "HideWindowUI": @@ -40541,313 +48908,422 @@ class Catalog { case "CenterWindow": case "DisplayDocTitle": case "PickTrayByPDFSize": - "boolean" == typeof a && (s = a); + if (typeof value === "boolean") { + prefValue = value; + } break; case "NonFullScreenPageMode": - if (a instanceof Name) - switch (a.name) { + if (value instanceof Name) { + switch (value.name) { case "UseNone": case "UseOutlines": case "UseThumbs": case "UseOC": - s = a.name; + prefValue = value.name; break; default: - s = "UseNone"; + prefValue = "UseNone"; } + } break; case "Direction": - if (a instanceof Name) - switch (a.name) { + if (value instanceof Name) { + switch (value.name) { case "L2R": case "R2L": - s = a.name; + prefValue = value.name; break; default: - s = "L2R"; + prefValue = "L2R"; } + } break; case "ViewArea": case "ViewClip": case "PrintArea": case "PrintClip": - if (a instanceof Name) - switch (a.name) { + if (value instanceof Name) { + switch (value.name) { case "MediaBox": case "CropBox": case "BleedBox": case "TrimBox": case "ArtBox": - s = a.name; + prefValue = value.name; break; default: - s = "CropBox"; + prefValue = "CropBox"; } + } break; case "PrintScaling": - if (a instanceof Name) - switch (a.name) { + if (value instanceof Name) { + switch (value.name) { case "None": case "AppDefault": - s = a.name; + prefValue = value.name; break; default: - s = "AppDefault"; + prefValue = "AppDefault"; } + } break; case "Duplex": - if (a instanceof Name) - switch (a.name) { + if (value instanceof Name) { + switch (value.name) { case "Simplex": case "DuplexFlipShortEdge": case "DuplexFlipLongEdge": - s = a.name; + prefValue = value.name; break; default: - s = "None"; + prefValue = "None"; } + } break; case "PrintPageRange": - if (Array.isArray(a) && a.length % 2 == 0) { - a.every( - (e, t, i) => - Number.isInteger(e) && - e > 0 && - (0 === t || e >= i[t - 1]) && - e <= this.numPages, - ) && (s = a); + if (Array.isArray(value) && value.length % 2 === 0) { + const isValid = value.every( + (page, i, arr) => + Number.isInteger(page) && + page > 0 && + (i === 0 || page >= arr[i - 1]) && + page <= this.numPages, + ); + if (isValid) { + prefValue = value; + } } break; case "NumCopies": - Number.isInteger(a) && a > 0 && (s = a); + if (Number.isInteger(value) && value > 0) { + prefValue = value; + } break; default: - warn(`Ignoring non-standard key in ViewerPreferences: ${i}.`); + warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); continue; } - if (void 0 !== s) { - t || (t = Object.create(null)); - t[i] = s; - } else warn(`Bad value, for key "${i}", in ViewerPreferences: ${a}.`); + if (prefValue === undefined) { + warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); + continue; + } + if (!prefs) { + prefs = Object.create(null); + } + prefs[key] = prefValue; } - return shadow(this, "viewerPreferences", t); + return shadow(this, "viewerPreferences", prefs); } get openAction() { - const e = this._catDict.get("OpenAction"), - t = Object.create(null); - if (e instanceof Dict) { - const i = new Dict(this.xref); - i.set("A", e); - const a = { url: null, dest: null, action: null }; - Catalog.parseDestDictionary({ destDict: i, resultObj: a }); - Array.isArray(a.dest) - ? (t.dest = a.dest) - : a.action && (t.action = a.action); - } else Array.isArray(e) && (t.dest = e); - return shadow(this, "openAction", objectSize(t) > 0 ? t : null); + const obj = this._catDict.get("OpenAction"); + const openAction = Object.create(null); + if (obj instanceof Dict) { + const destDict = new 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 shadow( + this, + "openAction", + objectSize(openAction) > 0 ? openAction : null, + ); } get attachments() { - const e = this._catDict.get("Names"); - let t = null; - if (e instanceof Dict && e.has("EmbeddedFiles")) { - const i = new NameTree(e.getRaw("EmbeddedFiles"), this.xref); - for (const [e, a] of i.getAll()) { - const i = new FileSpec(a, this.xref); - t || (t = Object.create(null)); - t[stringToPDFString(e)] = i.serializable; + const obj = this._catDict.get("Names"); + let attachments = null; + if (obj instanceof Dict && obj.has("EmbeddedFiles")) { + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + const fs = new FileSpec(value, this.xref); + if (!attachments) { + attachments = Object.create(null); + } + attachments[stringToPDFString(key)] = fs.serializable; } } - return shadow(this, "attachments", t); + return shadow(this, "attachments", attachments); } get xfaImages() { - const e = this._catDict.get("Names"); - let t = null; - if (e instanceof Dict && e.has("XFAImages")) { - const i = new NameTree(e.getRaw("XFAImages"), this.xref); - for (const [e, a] of i.getAll()) { - t || (t = new Dict(this.xref)); - t.set(stringToPDFString(e), a); + const obj = this._catDict.get("Names"); + let xfaImages = null; + if (obj instanceof Dict && obj.has("XFAImages")) { + const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (!xfaImages) { + xfaImages = new Dict(this.xref); + } + xfaImages.set(stringToPDFString(key), value); } } - return shadow(this, "xfaImages", t); + return shadow(this, "xfaImages", xfaImages); } _collectJavaScript() { - const e = this._catDict.get("Names"); - let t = null; - function appendIfJavaScriptDict(e, i) { - if (!(i instanceof Dict)) return; - if (!isName(i.get("S"), "JavaScript")) return; - let a = i.get("JS"); - if (a instanceof BaseStream) a = a.getString(); - else if ("string" != typeof a) return; - a = stringToPDFString(a).replaceAll("\0", ""); - a && (t ||= new Map()).set(e, a); - } - if (e instanceof Dict && e.has("JavaScript")) { - const t = new NameTree(e.getRaw("JavaScript"), this.xref); - for (const [e, i] of t.getAll()) - appendIfJavaScriptDict(stringToPDFString(e), i); - } - const i = this._catDict.get("OpenAction"); - i && appendIfJavaScriptDict("OpenAction", i); - return t; - } - get jsActions() { - const e = this._collectJavaScript(); - let t = collectActions(this.xref, this._catDict, dA); - if (e) { - t ||= Object.create(null); - for (const [i, a] of e) i in t ? t[i].push(a) : (t[i] = [a]); - } - return shadow(this, "jsActions", t); - } - async fontFallback(e, t) { - const i = await Promise.all(this.fontCache); - for (const a of i) - if (a.loadedName === e) { - a.fallback(t); + const obj = this._catDict.get("Names"); + let javaScript = null; + function appendIfJavaScriptDict(name, jsDict) { + if (!(jsDict instanceof Dict)) { return; } + if (!isName(jsDict.get("S"), "JavaScript")) { + return; + } + let js = jsDict.get("JS"); + if (js instanceof BaseStream) { + js = js.getString(); + } else if (typeof js !== "string") { + return; + } + js = stringToPDFString(js).replaceAll("\x00", ""); + if (js) { + (javaScript ||= new Map()).set(name, js); + } + } + if (obj instanceof Dict && obj.has("JavaScript")) { + const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); + for (const [key, value] of nameTree.getAll()) { + appendIfJavaScriptDict(stringToPDFString(key), value); + } + } + const openAction = this._catDict.get("OpenAction"); + if (openAction) { + appendIfJavaScriptDict("OpenAction", openAction); + } + return javaScript; } - async cleanup(e = !1) { + get jsActions() { + const javaScript = this._collectJavaScript(); + let actions = collectActions( + this.xref, + this._catDict, + DocumentActionEventType, + ); + if (javaScript) { + actions ||= Object.create(null); + for (const [key, val] of javaScript) { + if (key in actions) { + actions[key].push(val); + } else { + actions[key] = [val]; + } + } + } + return shadow(this, "jsActions", actions); + } + async fontFallback(id, handler) { + const translatedFonts = await Promise.all(this.fontCache); + for (const translatedFont of translatedFonts) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler); + return; + } + } + } + async cleanup(manuallyTriggered = false) { clearGlobalCaches(); - this.globalImageCache.clear(e); + this.globalImageCache.clear(manuallyTriggered); this.pageKidsCountCache.clear(); this.pageIndexCache.clear(); + this.pageDictCache.clear(); this.nonBlendModesSet.clear(); - const t = await Promise.all(this.fontCache); - for (const { dict: e } of t) delete e.cacheKey; + const translatedFonts = await Promise.all(this.fontCache); + for (const { dict } of translatedFonts) { + delete dict.cacheKey; + } this.fontCache.clear(); this.builtInCMapCache.clear(); this.standardFontDataCache.clear(); this.systemFontCache.clear(); } - async getPageDict(e) { - const t = [this.toplevelPagesDict], - i = new RefSet(), - a = this._catDict.getRaw("Pages"); - a instanceof Ref && i.put(a); - const s = this.xref, - r = this.pageKidsCountCache, - n = this.pageIndexCache; - let g = 0; - for (; t.length; ) { - const a = t.pop(); - if (a instanceof Ref) { - const o = r.get(a); - if (o >= 0 && g + o <= e) { - g += o; + async getPageDict(pageIndex) { + const nodesToVisit = [this.toplevelPagesDict]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const xref = this.xref, + pageKidsCountCache = this.pageKidsCountCache, + pageIndexCache = this.pageIndexCache, + pageDictCache = this.pageDictCache; + let currentPageIndex = 0; + while (nodesToVisit.length) { + const currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + const count = pageKidsCountCache.get(currentNode); + if (count >= 0 && currentPageIndex + count <= pageIndex) { + currentPageIndex += count; continue; } - if (i.has(a)) + if (visitedNodes.has(currentNode)) { throw new FormatError("Pages tree contains circular reference."); - i.put(a); - const c = await s.fetchAsync(a); - if (c instanceof Dict) { - let t = c.getRaw("Type"); - t instanceof Ref && (t = await s.fetchAsync(t)); - if (isName(t, "Page") || !c.has("Kids")) { - r.has(a) || r.put(a, 1); - n.has(a) || n.put(a, g); - if (g === e) return [c, a]; - g++; + } + visitedNodes.put(currentNode); + const obj = await (pageDictCache.get(currentNode) || + xref.fetchAsync(currentNode)); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !obj.has("Kids")) { + if (!pageKidsCountCache.has(currentNode)) { + pageKidsCountCache.put(currentNode, 1); + } + if (!pageIndexCache.has(currentNode)) { + pageIndexCache.put(currentNode, currentPageIndex); + } + if (currentPageIndex === pageIndex) { + return [obj, currentNode]; + } + currentPageIndex++; continue; } } - t.push(c); + nodesToVisit.push(obj); continue; } - if (!(a instanceof Dict)) + if (!(currentNode instanceof Dict)) { throw new FormatError( "Page dictionary kid reference points to wrong type of object.", ); - const { objId: o } = a; - let c = a.getRaw("Count"); - c instanceof Ref && (c = await s.fetchAsync(c)); - if (Number.isInteger(c) && c >= 0) { - o && !r.has(o) && r.put(o, c); - if (g + c <= e) { - g += c; + } + const { objId } = currentNode; + let count = currentNode.getRaw("Count"); + if (count instanceof Ref) { + count = await xref.fetchAsync(count); + } + if (Number.isInteger(count) && count >= 0) { + if (objId && !pageKidsCountCache.has(objId)) { + pageKidsCountCache.put(objId, count); + } + if (currentPageIndex + count <= pageIndex) { + currentPageIndex += count; continue; } } - let C = a.getRaw("Kids"); - C instanceof Ref && (C = await s.fetchAsync(C)); - if (!Array.isArray(C)) { - let t = a.getRaw("Type"); - t instanceof Ref && (t = await s.fetchAsync(t)); - if (isName(t, "Page") || !a.has("Kids")) { - if (g === e) return [a, null]; - g++; + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { + kids = await xref.fetchAsync(kids); + } + if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } + if (isName(type, "Page") || !currentNode.has("Kids")) { + if (currentPageIndex === pageIndex) { + return [currentNode, null]; + } + currentPageIndex++; continue; } throw new FormatError("Page dictionary kids object is not an array."); } - for (let e = C.length - 1; e >= 0; e--) t.push(C[e]); - } - throw new Error(`Page index ${e} not found.`); - } - async getAllPageDicts(e = !1) { - const { ignoreErrors: t } = this.pdfManager.evaluatorOptions, - i = [{ currentNode: this.toplevelPagesDict, posInKids: 0 }], - a = new RefSet(), - s = this._catDict.getRaw("Pages"); - s instanceof Ref && a.put(s); - const r = new Map(), - n = this.xref, - g = this.pageIndexCache; - let o = 0; - function addPageDict(e, t) { - t && !g.has(t) && g.put(t, o); - r.set(o++, [e, t]); - } - function addPageError(i) { - if (i instanceof XRefEntryException && !e) throw i; - if (e && t && 0 === o) { - warn(`getAllPageDicts - Skipping invalid first page: "${i}".`); - i = Dict.empty; + for (let last = kids.length - 1; last >= 0; last--) { + const lastKid = kids[last]; + nodesToVisit.push(lastKid); + if ( + currentNode === this.toplevelPagesDict && + lastKid instanceof Ref && + !pageDictCache.has(lastKid) + ) { + pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); + } } - r.set(o++, [i, null]); } - for (; i.length > 0; ) { - const e = i.at(-1), - { currentNode: t, posInKids: s } = e; - let r = t.getRaw("Kids"); - if (r instanceof Ref) + throw new Error(`Page index ${pageIndex} not found.`); + } + async getAllPageDicts(recoveryMode = false) { + const { ignoreErrors } = this.pdfManager.evaluatorOptions; + const queue = [ + { + currentNode: this.toplevelPagesDict, + posInKids: 0, + }, + ]; + const visitedNodes = new RefSet(); + const pagesRef = this._catDict.getRaw("Pages"); + if (pagesRef instanceof Ref) { + visitedNodes.put(pagesRef); + } + const map = new Map(), + xref = this.xref, + pageIndexCache = this.pageIndexCache; + let pageIndex = 0; + function addPageDict(pageDict, pageRef) { + if (pageRef && !pageIndexCache.has(pageRef)) { + pageIndexCache.put(pageRef, pageIndex); + } + map.set(pageIndex++, [pageDict, pageRef]); + } + function addPageError(error) { + if (error instanceof XRefEntryException && !recoveryMode) { + throw error; + } + if (recoveryMode && ignoreErrors && pageIndex === 0) { + warn(`getAllPageDicts - Skipping invalid first page: "${error}".`); + error = Dict.empty; + } + map.set(pageIndex++, [error, null]); + } + while (queue.length > 0) { + const queueItem = queue.at(-1); + const { currentNode, posInKids } = queueItem; + let kids = currentNode.getRaw("Kids"); + if (kids instanceof Ref) { try { - r = await n.fetchAsync(r); - } catch (e) { - addPageError(e); + kids = await xref.fetchAsync(kids); + } catch (ex) { + addPageError(ex); break; } - if (!Array.isArray(r)) { + } + if (!Array.isArray(kids)) { addPageError( new FormatError("Page dictionary kids object is not an array."), ); break; } - if (s >= r.length) { - i.pop(); + if (posInKids >= kids.length) { + queue.pop(); continue; } - const g = r[s]; - let o; - if (g instanceof Ref) { - if (a.has(g)) { + const kidObj = kids[posInKids]; + let obj; + if (kidObj instanceof Ref) { + if (visitedNodes.has(kidObj)) { addPageError( new FormatError("Pages tree contains circular reference."), ); break; } - a.put(g); + visitedNodes.put(kidObj); try { - o = await n.fetchAsync(g); - } catch (e) { - addPageError(e); + obj = await xref.fetchAsync(kidObj); + } catch (ex) { + addPageError(ex); break; } - } else o = g; - if (!(o instanceof Dict)) { + } else { + obj = kidObj; + } + if (!(obj instanceof Dict)) { addPageError( new FormatError( "Page dictionary kid reference points to wrong type of object.", @@ -40855,669 +49331,1017 @@ class Catalog { ); break; } - let c = o.getRaw("Type"); - if (c instanceof Ref) + let type = obj.getRaw("Type"); + if (type instanceof Ref) { try { - c = await n.fetchAsync(c); - } catch (e) { - addPageError(e); + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); break; } - isName(c, "Page") || !o.has("Kids") - ? addPageDict(o, g instanceof Ref ? g : null) - : i.push({ currentNode: o, posInKids: 0 }); - e.posInKids++; + } + if (isName(type, "Page") || !obj.has("Kids")) { + addPageDict(obj, kidObj instanceof Ref ? kidObj : null); + } else { + queue.push({ + currentNode: obj, + posInKids: 0, + }); + } + queueItem.posInKids++; } - return r; + return map; } - getPageIndex(e) { - const t = this.pageIndexCache.get(e); - if (void 0 !== t) return Promise.resolve(t); - const i = this.xref; - let a = 0; - const next = (t) => - (function pagesBeforeRef(t) { - let a, - s = 0; - return i - .fetchAsync(t) - .then(function (i) { - if ( - isRefsEqual(t, e) && - !isDict(i, "Page") && - !(i instanceof Dict && !i.has("Type") && i.has("Contents")) - ) - throw new FormatError( - "The reference does not point to a /Page dictionary.", - ); - if (!i) return null; - if (!(i instanceof Dict)) - throw new FormatError("Node must be a dictionary."); - a = i.getRaw("Parent"); - return i.getAsync("Parent"); - }) - .then(function (e) { - if (!e) return null; - if (!(e instanceof Dict)) - throw new FormatError("Parent must be a dictionary."); - return e.getAsync("Kids"); - }) - .then(function (e) { - if (!e) return null; - const r = []; - let n = !1; - for (const a of e) { - if (!(a instanceof Ref)) - throw new FormatError("Kid must be a reference."); - if (isRefsEqual(a, t)) { - n = !0; - break; - } - r.push( - i.fetchAsync(a).then(function (e) { - if (!(e instanceof Dict)) - throw new FormatError("Kid node must be a dictionary."); - e.has("Count") ? (s += e.get("Count")) : s++; - }), - ); + 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 ( + isRefsEqual(kidRef, pageRef) && + !isDict(node, "Page") && + !(node instanceof Dict && !node.has("Type") && node.has("Contents")) + ) { + throw new FormatError( + "The reference does not point to a /Page dictionary.", + ); + } + if (!node) { + return null; + } + if (!(node instanceof Dict)) { + throw new FormatError("Node must be a dictionary."); + } + parentRef = node.getRaw("Parent"); + return node.getAsync("Parent"); + }) + .then(function (parent) { + if (!parent) { + return null; + } + if (!(parent instanceof Dict)) { + throw new FormatError("Parent must be a dictionary."); + } + return parent.getAsync("Kids"); + }) + .then(function (kids) { + if (!kids) { + return null; + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof Ref)) { + throw new FormatError("Kid must be a reference."); } - if (!n) - throw new FormatError( - "Kid reference not found in parent's kids.", - ); - return Promise.all(r).then(function () { - return [s, a]; - }); + if (isRefsEqual(kid, kidRef)) { + found = true; + break; + } + kidPromises.push( + xref.fetchAsync(kid).then(function (obj) { + if (!(obj instanceof Dict)) { + throw new FormatError("Kid node must be a dictionary."); + } + if (obj.has("Count")) { + total += obj.get("Count"); + } else { + total++; + } + }), + ); + } + if (!found) { + throw new FormatError("Kid reference not found in parent's kids."); + } + return Promise.all(kidPromises).then(function () { + return [total, parentRef]; }); - })(t).then((t) => { - if (!t) { - this.pageIndexCache.put(e, a); - return a; + }); + } + let total = 0; + const next = (ref) => + pagesBeforeRef(ref).then((args) => { + if (!args) { + this.pageIndexCache.put(pageRef, total); + return total; } - const [i, s] = t; - a += i; - return next(s); + const [count, parentRef] = args; + total += count; + return next(parentRef); }); - return next(e); + return next(pageRef); } get baseUrl() { - const e = this._catDict.get("URI"); - if (e instanceof Dict) { - const t = e.get("Base"); - if ("string" == typeof t) { - const e = createValidAbsoluteUrl(t, null, { tryConvertEncoding: !0 }); - if (e) return shadow(this, "baseUrl", e.href); + const uri = this._catDict.get("URI"); + if (uri instanceof Dict) { + const base = uri.get("Base"); + if (typeof base === "string") { + const absoluteUrl = createValidAbsoluteUrl(base, null, { + tryConvertEncoding: true, + }); + if (absoluteUrl) { + return shadow(this, "baseUrl", absoluteUrl.href); + } } } return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); } static parseDestDictionary({ - destDict: e, - resultObj: t, - docBaseUrl: i = null, - docAttachments: a = null, + destDict, + resultObj, + docBaseUrl = null, + docAttachments = null, }) { - if (!(e instanceof Dict)) { + if (!(destDict instanceof Dict)) { warn("parseDestDictionary: `destDict` must be a dictionary."); return; } - let s, - r, - n = e.get("A"); - if (!(n instanceof Dict)) - if (e.has("Dest")) n = e.get("Dest"); - else { - n = e.get("AA"); - n instanceof Dict && - (n.has("D") ? (n = n.get("D")) : n.has("U") && (n = n.get("U"))); + let action = destDict.get("A"), + url, + dest; + if (!(action instanceof Dict)) { + if (destDict.has("Dest")) { + action = destDict.get("Dest"); + } else { + action = destDict.get("AA"); + if (action instanceof Dict) { + if (action.has("D")) { + action = action.get("D"); + } else if (action.has("U")) { + action = action.get("U"); + } + } } - if (n instanceof Dict) { - const e = n.get("S"); - if (!(e instanceof Name)) { + } + if (action instanceof Dict) { + const actionType = action.get("S"); + if (!(actionType instanceof Name)) { warn("parseDestDictionary: Invalid type in Action dictionary."); return; } - const i = e.name; - switch (i) { + const actionName = actionType.name; + switch (actionName) { case "ResetForm": - const e = n.get("Flags"), - g = 0 == (1 & ("number" == typeof e ? e : 0)), - o = [], - c = []; - for (const e of n.get("Fields") || []) - e instanceof Ref - ? c.push(e.toString()) - : "string" == typeof e && o.push(stringToPDFString(e)); - t.resetForm = { fields: o, refs: c, include: g }; + const flags = action.get("Flags"); + const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; + const fields = []; + const refs = []; + for (const obj of action.get("Fields") || []) { + if (obj instanceof Ref) { + refs.push(obj.toString()); + } else if (typeof obj === "string") { + fields.push(stringToPDFString(obj)); + } + } + resultObj.resetForm = { + fields, + refs, + include, + }; break; case "URI": - s = n.get("URI"); - s instanceof Name && (s = "/" + s.name); + url = action.get("URI"); + if (url instanceof Name) { + url = "/" + url.name; + } break; case "GoTo": - r = n.get("D"); + dest = action.get("D"); break; case "Launch": case "GoToR": - const C = n.get("F"); - if (C instanceof Dict) { - const e = new FileSpec(C, null, !0), - { rawFilename: t } = e.serializable; - s = t; - } else "string" == typeof C && (s = C); - const h = fetchRemoteDest(n); - h && "string" == typeof s && (s = s.split("#", 1)[0] + "#" + h); - const l = n.get("NewWindow"); - "boolean" == typeof l && (t.newWindow = l); + const urlDict = action.get("F"); + if (urlDict instanceof Dict) { + const fs = new FileSpec(urlDict, null, true); + const { rawFilename } = fs.serializable; + url = rawFilename; + } else if (typeof urlDict === "string") { + url = urlDict; + } + const remoteDest = fetchRemoteDest(action); + if (remoteDest && typeof url === "string") { + url = url.split("#", 1)[0] + "#" + remoteDest; + } + const newWindow = action.get("NewWindow"); + if (typeof newWindow === "boolean") { + resultObj.newWindow = newWindow; + } break; case "GoToE": - const Q = n.get("T"); - let E; - if (a && Q instanceof Dict) { - const e = Q.get("R"), - t = Q.get("N"); - isName(e, "C") && - "string" == typeof t && - (E = a[stringToPDFString(t)]); + const target = action.get("T"); + let attachment; + if (docAttachments && target instanceof Dict) { + const relationship = target.get("R"); + const name = target.get("N"); + if (isName(relationship, "C") && typeof name === "string") { + attachment = docAttachments[stringToPDFString(name)]; + } + } + if (attachment) { + resultObj.attachment = attachment; + const attachmentDest = fetchRemoteDest(action); + if (attachmentDest) { + resultObj.attachmentDest = attachmentDest; + } + } else { + warn(`parseDestDictionary - unimplemented "GoToE" action.`); } - if (E) { - t.attachment = E; - const e = fetchRemoteDest(n); - e && (t.attachmentDest = e); - } else warn('parseDestDictionary - unimplemented "GoToE" action.'); break; case "Named": - const u = n.get("N"); - u instanceof Name && (t.action = u.name); + const namedAction = action.get("N"); + if (namedAction instanceof Name) { + resultObj.action = namedAction.name; + } break; case "SetOCGState": - const d = n.get("State"), - f = n.get("PreserveRB"); - if (!Array.isArray(d) || 0 === d.length) break; - const p = []; - for (const e of d) - if (e instanceof Name) - switch (e.name) { + const state = action.get("State"); + const preserveRB = action.get("PreserveRB"); + if (!Array.isArray(state) || state.length === 0) { + break; + } + const stateArr = []; + for (const elem of state) { + if (elem instanceof Name) { + switch (elem.name) { case "ON": case "OFF": case "Toggle": - p.push(e.name); + stateArr.push(elem.name); + break; } - else e instanceof Ref && p.push(e.toString()); - if (p.length !== d.length) break; - t.setOCGState = { state: p, preserveRB: "boolean" != typeof f || f }; + } else if (elem instanceof Ref) { + stateArr.push(elem.toString()); + } + } + if (stateArr.length !== state.length) { + break; + } + resultObj.setOCGState = { + state: stateArr, + preserveRB: typeof preserveRB === "boolean" ? preserveRB : true, + }; break; case "JavaScript": - const m = n.get("JS"); - let y; - m instanceof BaseStream - ? (y = m.getString()) - : "string" == typeof m && (y = m); - const w = y && recoverJsURL(stringToPDFString(y)); - if (w) { - s = w.url; - t.newWindow = w.newWindow; + const jsAction = action.get("JS"); + let js; + if (jsAction instanceof BaseStream) { + js = jsAction.getString(); + } else if (typeof jsAction === "string") { + js = jsAction; + } + const jsURL = js && recoverJsURL(stringToPDFString(js)); + if (jsURL) { + url = jsURL.url; + resultObj.newWindow = jsURL.newWindow; break; } default: - if ("JavaScript" === i || "SubmitForm" === i) break; - warn(`parseDestDictionary - unsupported action: "${i}".`); + if (actionName === "JavaScript" || actionName === "SubmitForm") { + break; + } + warn(`parseDestDictionary - unsupported action: "${actionName}".`); + break; } - } else e.has("Dest") && (r = e.get("Dest")); - if ("string" == typeof s) { - const e = createValidAbsoluteUrl(s, i, { - addDefaultProtocol: !0, - tryConvertEncoding: !0, - }); - e && (t.url = e.href); - t.unsafeUrl = s; + } else if (destDict.has("Dest")) { + dest = destDict.get("Dest"); } - if (r) { - r instanceof Name && (r = r.name); - "string" == typeof r - ? (t.dest = stringToPDFString(r)) - : isValidExplicitDest(r) && (t.dest = r); + if (typeof url === "string") { + const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, { + addDefaultProtocol: true, + tryConvertEncoding: true, + }); + if (absoluteUrl) { + resultObj.url = absoluteUrl.href; + } + resultObj.unsafeUrl = url; + } + if (dest) { + if (dest instanceof Name) { + dest = dest.name; + } + if (typeof dest === "string") { + resultObj.dest = stringToPDFString(dest); + } else if (isValidExplicitDest(dest)) { + resultObj.dest = dest; + } + } + } +} // ./src/core/object_loader.js + +function mayHaveChildren(value) { + return ( + value instanceof Ref || + value instanceof Dict || + value instanceof BaseStream || + Array.isArray(value) + ); +} +function addChildren(node, nodesToVisit) { + if (node instanceof Dict) { + node = node.getRawValues(); + } else if (node instanceof BaseStream) { + node = node.dict.getRawValues(); + } else if (!Array.isArray(node)) { + return; + } + for (const rawValue of node) { + if (mayHaveChildren(rawValue)) { + nodesToVisit.push(rawValue); } } } -function addChildren(e, t) { - if (e instanceof Dict) e = e.getRawValues(); - else if (e instanceof BaseStream) e = e.dict.getRawValues(); - else if (!Array.isArray(e)) return; - for (const a of e) - ((i = a) instanceof Ref || - i instanceof Dict || - i instanceof BaseStream || - Array.isArray(i)) && - t.push(a); - var i; -} class ObjectLoader { - constructor(e, t, i) { - this.dict = e; - this.keys = t; - this.xref = i; + constructor(dict, keys, xref) { + this.dict = dict; + this.keys = keys; + this.xref = xref; this.refSet = null; } async load() { - if (this.xref.stream.isDataLoaded) return; - const { keys: e, dict: t } = this; + if (this.xref.stream.isDataLoaded) { + return undefined; + } + const { keys, dict } = this; this.refSet = new RefSet(); - const i = []; - for (const a of e) { - const e = t.getRaw(a); - void 0 !== e && i.push(e); + const nodesToVisit = []; + for (const key of keys) { + const rawValue = dict.getRaw(key); + if (rawValue !== undefined) { + nodesToVisit.push(rawValue); + } } - return this._walk(i); + return this._walk(nodesToVisit); } - async _walk(e) { - const t = [], - i = []; - for (; e.length; ) { - let a = e.pop(); - if (a instanceof Ref) { - if (this.refSet.has(a)) continue; + async _walk(nodesToVisit) { + const nodesToRevisit = []; + const pendingRequests = []; + while (nodesToVisit.length) { + let currentNode = nodesToVisit.pop(); + if (currentNode instanceof Ref) { + if (this.refSet.has(currentNode)) { + continue; + } try { - this.refSet.put(a); - a = this.xref.fetch(a); - } catch (e) { - if (!(e instanceof MissingDataException)) { - warn(`ObjectLoader._walk - requesting all data: "${e}".`); + this.refSet.put(currentNode); + currentNode = this.xref.fetch(currentNode); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + warn(`ObjectLoader._walk - requesting all data: "${ex}".`); this.refSet = null; - const { manager: t } = this.xref.stream; - return t.requestAllChunks(); + const { manager } = this.xref.stream; + return manager.requestAllChunks(); } - t.push(a); - i.push({ begin: e.begin, end: e.end }); + nodesToRevisit.push(currentNode); + pendingRequests.push({ + begin: ex.begin, + end: ex.end, + }); } } - if (a instanceof BaseStream) { - const e = a.getBaseStreams(); - if (e) { - let s = !1; - for (const t of e) - if (!t.isDataLoaded) { - s = !0; - i.push({ begin: t.start, end: t.end }); + if (currentNode instanceof BaseStream) { + const baseStreams = currentNode.getBaseStreams(); + if (baseStreams) { + let foundMissingData = false; + for (const stream of baseStreams) { + if (stream.isDataLoaded) { + continue; } - s && t.push(a); + foundMissingData = true; + pendingRequests.push({ + begin: stream.start, + end: stream.end, + }); + } + if (foundMissingData) { + nodesToRevisit.push(currentNode); + } } } - addChildren(a, e); + addChildren(currentNode, nodesToVisit); } - if (i.length) { - await this.xref.stream.manager.requestRanges(i); - for (const e of t) e instanceof Ref && this.refSet.remove(e); - return this._walk(t); + if (pendingRequests.length) { + await this.xref.stream.manager.requestRanges(pendingRequests); + for (const node of nodesToRevisit) { + if (node instanceof Ref) { + this.refSet.remove(node); + } + } + return this._walk(nodesToRevisit); } this.refSet = null; + return undefined; } -} -const Ws = Symbol(), - js = Symbol(), - Xs = Symbol(), - Zs = Symbol(), - Vs = Symbol(), - zs = Symbol(), - _s = Symbol(), - $s = Symbol(), - Ar = Symbol(), - er = Symbol("content"), - tr = Symbol("data"), - ir = Symbol(), - ar = Symbol("extra"), - sr = Symbol(), - rr = Symbol(), - nr = Symbol(), - gr = Symbol(), - or = Symbol(), - Ir = Symbol(), - cr = Symbol(), - Cr = Symbol(), - hr = Symbol(), - lr = Symbol(), - Qr = Symbol(), - Er = Symbol(), - ur = Symbol(), - dr = Symbol(), - fr = Symbol(), - pr = Symbol(), - mr = Symbol(), - yr = Symbol(), - wr = Symbol(), - Dr = Symbol(), - br = Symbol(), - Fr = Symbol(), - Sr = Symbol(), - kr = Symbol(), - Rr = Symbol(), - Nr = Symbol(), - Gr = Symbol(), - xr = Symbol(), - Ur = Symbol(), - Mr = Symbol(), - Lr = Symbol(), - Hr = Symbol(), - Jr = Symbol("namespaceId"), - Yr = Symbol("nodeName"), - vr = Symbol(), - Kr = Symbol(), - Tr = Symbol(), - qr = Symbol(), - Or = Symbol(), - Pr = Symbol(), - Wr = Symbol(), - jr = Symbol(), - Xr = Symbol("root"), - Zr = Symbol(), - Vr = Symbol(), - zr = Symbol(), - _r = Symbol(), - $r = Symbol(), - An = Symbol(), - en = Symbol(), - tn = Symbol(), - an = Symbol(), - sn = Symbol(), - rn = Symbol(), - nn = Symbol("uid"), - gn = Symbol(), - on = { - config: { - id: 0, - check: (e) => e.startsWith("http://www.xfa.org/schema/xci/"), - }, - connectionSet: { - id: 1, - check: (e) => - e.startsWith("http://www.xfa.org/schema/xfa-connection-set/"), - }, - datasets: { - id: 2, - check: (e) => e.startsWith("http://www.xfa.org/schema/xfa-data/"), - }, - form: { - id: 3, - check: (e) => e.startsWith("http://www.xfa.org/schema/xfa-form/"), - }, - localeSet: { - id: 4, - check: (e) => e.startsWith("http://www.xfa.org/schema/xfa-locale-set/"), - }, - pdf: { id: 5, check: (e) => "http://ns.adobe.com/xdp/pdf/" === e }, - signature: { - id: 6, - check: (e) => "http://www.w3.org/2000/09/xmldsig#" === e, - }, - sourceSet: { - id: 7, - check: (e) => e.startsWith("http://www.xfa.org/schema/xfa-source-set/"), - }, - stylesheet: { - id: 8, - check: (e) => "http://www.w3.org/1999/XSL/Transform" === e, - }, - template: { - id: 9, - check: (e) => e.startsWith("http://www.xfa.org/schema/xfa-template/"), - }, - xdc: { - id: 10, - check: (e) => e.startsWith("http://www.xfa.org/schema/xdc/"), - }, - xdp: { id: 11, check: (e) => "http://ns.adobe.com/xdp/" === e }, - xfdf: { id: 12, check: (e) => "http://ns.adobe.com/xfdf/" === e }, - xhtml: { id: 13, check: (e) => "http://www.w3.org/1999/xhtml" === e }, - xmpmeta: { id: 14, check: (e) => "http://ns.adobe.com/xmpmeta/" === e }, +} // ./src/core/xfa/symbol_utils.js + +const $acceptWhitespace = Symbol(); +const $addHTML = Symbol(); +const $appendChild = Symbol(); +const $childrenToHTML = Symbol(); +const $clean = Symbol(); +const $cleanPage = Symbol(); +const $cleanup = Symbol(); +const $clone = Symbol(); +const $consumed = Symbol(); +const $content = Symbol("content"); +const $data = Symbol("data"); +const $dump = Symbol(); +const $extra = Symbol("extra"); +const $finalize = Symbol(); +const $flushHTML = Symbol(); +const $getAttributeIt = Symbol(); +const $getAttributes = Symbol(); +const $getAvailableSpace = Symbol(); +const $getChildrenByClass = Symbol(); +const $getChildrenByName = Symbol(); +const $getChildrenByNameIt = Symbol(); +const $getDataValue = Symbol(); +const $getExtra = Symbol(); +const $getRealChildrenByNameIt = Symbol(); +const $getChildren = Symbol(); +const $getContainedChildren = Symbol(); +const $getNextPage = Symbol(); +const $getSubformParent = Symbol(); +const $getParent = Symbol(); +const $getTemplateRoot = Symbol(); +const $globalData = Symbol(); +const $hasSettableValue = Symbol(); +const $ids = Symbol(); +const $indexOf = Symbol(); +const $insertAt = Symbol(); +const $isCDATAXml = Symbol(); +const $isBindable = Symbol(); +const $isDataValue = Symbol(); +const $isDescendent = Symbol(); +const $isNsAgnostic = Symbol(); +const $isSplittable = Symbol(); +const $isThereMoreWidth = Symbol(); +const $isTransparent = Symbol(); +const $isUsable = Symbol(); +const $lastAttribute = Symbol(); +const $namespaceId = Symbol("namespaceId"); +const $nodeName = Symbol("nodeName"); +const $nsAttributes = Symbol(); +const $onChild = Symbol(); +const $onChildCheck = Symbol(); +const $onText = Symbol(); +const $pushGlyphs = Symbol(); +const $popPara = Symbol(); +const $pushPara = Symbol(); +const $removeChild = Symbol(); +const $root = Symbol("root"); +const $resolvePrototypes = Symbol(); +const $searchNode = Symbol(); +const $setId = Symbol(); +const $setSetAttributes = Symbol(); +const $setValue = Symbol(); +const $tabIndex = Symbol(); +const $text = Symbol(); +const $toPages = Symbol(); +const $toHTML = Symbol(); +const $toString = Symbol(); +const $toStyle = Symbol(); +const $uid = Symbol("uid"); // ./src/core/xfa/namespaces.js + +const $buildXFAObject = Symbol(); +const NamespaceIds = { + config: { + id: 0, + check: (ns) => ns.startsWith("http://www.xfa.org/schema/xci/"), }, - In = { - pt: (e) => e, - cm: (e) => (e / 2.54) * 72, - mm: (e) => (e / 25.4) * 72, - in: (e) => 72 * e, - px: (e) => e, + connectionSet: { + id: 1, + check: (ns) => + ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/"), }, - cn = /([+-]?\d+\.?\d*)(.*)/; -function stripQuotes(e) { - return e.startsWith("'") || e.startsWith('"') ? e.slice(1, -1) : e; + 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/", + }, +}; // ./src/core/xfa/utils.js + +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 = /([+-]?\d+\.?\d*)(.*)/; +function stripQuotes(str) { + if (str.startsWith("'") || str.startsWith('"')) { + return str.slice(1, -1); + } + return str; } -function getInteger({ data: e, defaultValue: t, validate: i }) { - if (!e) return t; - e = e.trim(); - const a = parseInt(e, 10); - return !isNaN(a) && i(a) ? a : t; +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: e, defaultValue: t, validate: i }) { - if (!e) return t; - e = e.trim(); - const a = parseFloat(e); - return !isNaN(a) && i(a) ? a : t; +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: e, defaultValue: t, validate: i }) { - return e && i((e = e.trim())) ? e : t; +function getKeyword({ data, defaultValue, validate }) { + if (!data) { + return defaultValue; + } + data = data.trim(); + if (validate(data)) { + return data; + } + return defaultValue; } -function getStringOption(e, t) { +function getStringOption(data, options) { return getKeyword({ - data: e, - defaultValue: t[0], - validate: (e) => t.includes(e), + data, + defaultValue: options[0], + validate: (k) => options.includes(k), }); } -function getMeasurement(e, t = "0") { - t ||= "0"; - if (!e) return getMeasurement(t); - const i = e.trim().match(cn); - if (!i) return getMeasurement(t); - const [, a, s] = i, - r = parseFloat(a); - if (isNaN(r)) return getMeasurement(t); - if (0 === r) return 0; - const n = In[s]; - return n ? n(r) : r; +function getMeasurement(str, def = "0") { + 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(e) { - if (!e) return { num: 1, den: 1 }; - const t = e +function getRatio(data) { + if (!data) { + return { + num: 1, + den: 1, + }; + } + const ratio = data .trim() .split(/\s*:\s*/) - .map((e) => parseFloat(e)) - .filter((e) => !isNaN(e)); - 1 === t.length && t.push(1); - if (0 === t.length) return { num: 1, den: 1 }; - const [i, a] = t; - return { num: i, den: a }; + .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(e) { - return e - ? e - .trim() - .split(/\s+/) - .map((e) => ({ excluded: "-" === e[0], viewname: e.substring(1) })) - : []; +function getRelevant(data) { + if (!data) { + return []; + } + return data + .trim() + .split(/\s+/) + .map((e) => ({ + 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 shadow(this, "FAILURE", new HTMLResult(!1, null, null, null)); + return shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); } static get EMPTY() { - return shadow(this, "EMPTY", new HTMLResult(!0, null, null, null)); + return shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); } - constructor(e, t, i, a) { - this.success = e; - this.html = t; - this.bbox = i; - this.breakNode = a; + constructor(success, html, bbox, breakNode) { + this.success = success; + this.html = html; + this.bbox = bbox; + this.breakNode = breakNode; } isBreak() { return !!this.breakNode; } - static breakNode(e) { - return new HTMLResult(!1, null, null, e); + static breakNode(node) { + return new HTMLResult(false, null, null, node); } - static success(e, t = null) { - return new HTMLResult(!0, e, t, null); + static success(html, bbox = null) { + return new HTMLResult(true, html, bbox, null); } -} +} // ./src/core/xfa/fonts.js + class FontFinder { - constructor(e) { + constructor(pdfFonts) { this.fonts = new Map(); this.cache = new Map(); this.warned = new Set(); this.defaultFont = null; - this.add(e); + this.add(pdfFonts); } - add(e, t = null) { - for (const t of e) this.addPdfFont(t); - for (const e of this.fonts.values()) - e.regular || (e.regular = e.italic || e.bold || e.bolditalic); - if (!t || 0 === t.size) return; - const i = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); - for (const e of t) this.fonts.set(e, i); + 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(e) { - const t = e.cssFontInfo, - i = t.fontFamily; - let a = this.fonts.get(i); - if (!a) { - a = Object.create(null); - this.fonts.set(i, a); - this.defaultFont || (this.defaultFont = a); + 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 s = ""; - const r = parseFloat(t.fontWeight); - 0 !== parseFloat(t.italicAngle) - ? (s = r >= 700 ? "bolditalic" : "italic") - : r >= 700 && (s = "bold"); - if (!s) { - (e.name.includes("Bold") || e.psName?.includes("Bold")) && (s = "bold"); - (e.name.includes("Italic") || - e.name.endsWith("It") || - e.psName?.includes("Italic") || - e.psName?.endsWith("It")) && - (s += "italic"); + let property = ""; + const fontWeight = parseFloat(cssFontInfo.fontWeight); + if (parseFloat(cssFontInfo.italicAngle) !== 0) { + property = fontWeight >= 700 ? "bolditalic" : "italic"; + } else if (fontWeight >= 700) { + property = "bold"; } - s || (s = "regular"); - a[s] = e; + if (!property) { + if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { + property = "bold"; + } + if ( + pdfFont.name.includes("Italic") || + pdfFont.name.endsWith("It") || + pdfFont.psName?.includes("Italic") || + pdfFont.psName?.endsWith("It") + ) { + property += "italic"; + } + } + if (!property) { + property = "regular"; + } + font[property] = pdfFont; } getDefault() { return this.defaultFont; } - find(e, t = !0) { - let i = this.fonts.get(e) || this.cache.get(e); - if (i) return i; - const a = /,|-|_| |bolditalic|bold|italic|regular|it/gi; - let s = e.replaceAll(a, ""); - i = this.fonts.get(s); - if (i) { - this.cache.set(e, i); - return i; + find(fontName, mustWarn = true) { + let font = this.fonts.get(fontName) || this.cache.get(fontName); + if (font) { + return font; } - s = s.toLowerCase(); - const r = []; - for (const [e, t] of this.fonts.entries()) - e.replaceAll(a, "").toLowerCase().startsWith(s) && r.push(t); - if (0 === r.length) - for (const [, e] of this.fonts.entries()) - e.regular.name?.replaceAll(a, "").toLowerCase().startsWith(s) && - r.push(e); - if (0 === r.length) { - s = s.replaceAll(/psmt|mt/gi, ""); - for (const [e, t] of this.fonts.entries()) - e.replaceAll(a, "").toLowerCase().startsWith(s) && r.push(t); + const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; + let name = fontName.replaceAll(pattern, ""); + font = this.fonts.get(name); + if (font) { + this.cache.set(fontName, font); + return font; } - if (0 === r.length) - for (const e of this.fonts.values()) - e.regular.name?.replaceAll(a, "").toLowerCase().startsWith(s) && - r.push(e); - if (r.length >= 1) { - 1 !== r.length && - t && - warn(`XFA - Too many choices to guess the correct font: ${e}`); - this.cache.set(e, r[0]); - return r[0]; + name = name.toLowerCase(); + const maybe = []; + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } } - if (t && !this.warned.has(e)) { - this.warned.add(e); - warn(`XFA - Cannot find the font: ${e}`); + if (maybe.length === 0) { + for (const [, pdfFont] of this.fonts.entries()) { + if ( + pdfFont.regular.name + ?.replaceAll(pattern, "") + .toLowerCase() + .startsWith(name) + ) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + name = name.replaceAll(/psmt|mt/gi, ""); + for (const [family, pdfFont] of this.fonts.entries()) { + if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { + maybe.push(pdfFont); + } + } + } + if (maybe.length === 0) { + for (const pdfFont of this.fonts.values()) { + if ( + pdfFont.regular.name + ?.replaceAll(pattern, "") + .toLowerCase() + .startsWith(name) + ) { + maybe.push(pdfFont); + } + } + } + if (maybe.length >= 1) { + if (maybe.length !== 1 && mustWarn) { + 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); + warn(`XFA - Cannot find the font: ${fontName}`); } return null; } } -function selectFont(e, t) { - return "italic" === e.posture - ? "bold" === e.weight - ? t.bolditalic - : t.italic - : "bold" === e.weight - ? t.bold - : t.regular; +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; } +function fonts_getMetrics(xfaFont, real = false) { + let pdfFont = null; + if (xfaFont) { + const name = stripQuotes(xfaFont.typeface); + const typeface = xfaFont[$globalData].fontFinder.find(name); + pdfFont = selectFont(xfaFont, typeface); + } + if (!pdfFont) { + return { + lineHeight: 12, + lineGap: 2, + lineNoGap: 10, + }; + } + const size = xfaFont.size || 10; + const lineHeight = pdfFont.lineHeight + ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) + : 1.2; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + return { + lineHeight: lineHeight * size, + lineGap: lineGap * size, + lineNoGap: Math.max(1, lineHeight - lineGap) * size, + }; +} // ./src/core/xfa/text.js + +const WIDTH_FACTOR = 1.02; class FontInfo { - constructor(e, t, i, a) { - this.lineHeight = i; - this.paraMargin = t || { top: 0, bottom: 0, left: 0, right: 0 }; - if (!e) { - [this.pdfFont, this.xfaFont] = this.defaultFont(a); + 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: e.typeface, - posture: e.posture, - weight: e.weight, - size: e.size, - letterSpacing: e.letterSpacing, + typeface: xfaFont.typeface, + posture: xfaFont.posture, + weight: xfaFont.weight, + size: xfaFont.size, + letterSpacing: xfaFont.letterSpacing, }; - const s = a.find(e.typeface); - if (s) { - this.pdfFont = selectFont(e, s); - this.pdfFont || ([this.pdfFont, this.xfaFont] = this.defaultFont(a)); - } else [this.pdfFont, this.xfaFont] = this.defaultFont(a); - } - defaultFont(e) { - const t = - e.find("Helvetica", !1) || - e.find("Myriad Pro", !1) || - e.find("Arial", !1) || - e.getDefault(); - if (t?.regular) { - const e = t.regular; - return [ - e, - { - typeface: e.cssFontInfo.fontFamily, - posture: "normal", - weight: "normal", - size: 10, - letterSpacing: 0, - }, - ]; + const typeface = fontFinder.find(xfaFont.typeface); + if (!typeface) { + [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); + return; } - return [ - null, - { - typeface: "Courier", + this.pdfFont = 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?.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(e, t, i, a) { - this.fontFinder = a; - this.stack = [new FontInfo(e, t, i, a)]; + constructor( + defaultXfaFont, + defaultParaMargin, + defaultLineHeight, + fontFinder, + ) { + this.fontFinder = fontFinder; + this.stack = [ + new FontInfo( + defaultXfaFont, + defaultParaMargin, + defaultLineHeight, + fontFinder, + ), + ]; } - pushData(e, t, i) { - const a = this.stack.at(-1); - for (const t of ["typeface", "posture", "weight", "size", "letterSpacing"]) - e[t] || (e[t] = a.xfaFont[t]); - for (const e of ["top", "bottom", "left", "right"]) - isNaN(t[e]) && (t[e] = a.paraMargin[e]); - const s = new FontInfo(e, t, i || a.lineHeight, this.fontFinder); - s.pdfFont || (s.pdfFont = a.pdfFont); - this.stack.push(s); + pushData(xfaFont, margin, lineHeight) { + const lastFont = this.stack.at(-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(); @@ -41527,1186 +50351,1523 @@ class FontSelector { } } class TextMeasure { - constructor(e, t, i, a) { + constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { this.glyphs = []; - this.fontSelector = new FontSelector(e, t, i, a); + this.fontSelector = new FontSelector( + defaultXfaFont, + defaultParaMargin, + defaultLineHeight, + fonts, + ); this.extraHeight = 0; } - pushData(e, t, i) { - this.fontSelector.pushData(e, t, i); + pushData(xfaFont, margin, lineHeight) { + this.fontSelector.pushData(xfaFont, margin, lineHeight); } - popFont(e) { + popFont(xfaFont) { return this.fontSelector.popFont(); } addPara() { - const e = this.fontSelector.topFont(); - this.extraHeight += e.paraMargin.top + e.paraMargin.bottom; + const lastFont = this.fontSelector.topFont(); + this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; } - addString(e) { - if (!e) return; - const t = this.fontSelector.topFont(), - i = t.xfaFont.size; - if (t.pdfFont) { - const a = t.xfaFont.letterSpacing, - s = t.pdfFont, - r = s.lineHeight || 1.2, - n = t.lineHeight || Math.max(1.2, r) * i, - g = r - (void 0 === s.lineGap ? 0.2 : s.lineGap), - o = Math.max(1, g) * i, - c = i / 1e3, - C = s.defaultWidth || s.charsToGlyphs(" ")[0].width; - for (const t of e.split(/[\u2029\n]/)) { - const e = s.encodeString(t).join(""), - i = s.charsToGlyphs(e); - for (const e of i) { - const t = e.width || C; - this.glyphs.push([t * c + a, n, o, e.unicode, !1]); + 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 fontLineHeight = pdfFont.lineHeight || 1.2; + const lineHeight = + lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; + const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; + const noGap = fontLineHeight - lineGap; + const firstLineHeight = Math.max(1, noGap) * fontSize; + const scale = fontSize / 1000; + const fallbackWidth = + pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; + for (const line of str.split(/[\u2029\n]/)) { + const encodedLine = pdfFont.encodeString(line).join(""); + const glyphs = pdfFont.charsToGlyphs(encodedLine); + for (const glyph of glyphs) { + const width = glyph.width || fallbackWidth; + this.glyphs.push([ + width * scale + letterSpacing, + lineHeight, + firstLineHeight, + glyph.unicode, + false, + ]); } - this.glyphs.push([0, 0, 0, "\n", !0]); - } - this.glyphs.pop(); - } else { - for (const t of e.split(/[\u2029\n]/)) { - for (const e of t.split("")) this.glyphs.push([i, 1.2 * i, i, e, !1]); - this.glyphs.push([0, 0, 0, "\n", !0]); + this.glyphs.push([0, 0, 0, "\n", true]); } this.glyphs.pop(); + return; } - } - compute(e) { - let t = -1, - i = 0, - a = 0, - s = 0, - r = 0, - n = 0, - g = !1, - o = !0; - for (let c = 0, C = this.glyphs.length; c < C; c++) { - const [C, h, l, Q, E] = this.glyphs[c], - u = " " === Q, - d = o ? l : h; - if (E) { - a = Math.max(a, r); - r = 0; - s += n; - n = d; - t = -1; - i = 0; - o = !1; - } else if (u) - if (r + C > e) { - a = Math.max(a, r); - r = 0; - s += n; - n = d; - t = -1; - i = 0; - g = !0; - o = !1; - } else { - n = Math.max(d, n); - i = r; - r += C; - t = c; - } - else if (r + C > e) { - s += n; - n = d; - if (-1 !== t) { - c = t; - a = Math.max(a, i); - r = 0; - t = -1; - i = 0; - } else { - a = Math.max(a, r); - r = C; - } - g = !0; - o = !1; - } else { - r += C; - n = Math.max(d, n); + for (const line of str.split(/[\u2029\n]/)) { + for (const char of line.split("")) { + this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); } + this.glyphs.push([0, 0, 0, "\n", true]); } - a = Math.max(a, r); - s += n + this.extraHeight; - return { width: 1.02 * a, height: s, isBroken: g }; + this.glyphs.pop(); } + compute(maxWidth) { + let lastSpacePos = -1, + lastSpaceWidth = 0, + width = 0, + height = 0, + currentLineWidth = 0, + currentLineHeight = 0; + let isBroken = false; + let isFirstLine = true; + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = + this.glyphs[i]; + const isSpace = char === " "; + const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; + if (isEOL) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isFirstLine = false; + continue; + } + if (isSpace) { + if (currentLineWidth + glyphWidth > maxWidth) { + width = Math.max(width, currentLineWidth); + currentLineWidth = 0; + height += currentLineHeight; + currentLineHeight = glyphHeight; + lastSpacePos = -1; + lastSpaceWidth = 0; + isBroken = true; + isFirstLine = false; + } 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; + isFirstLine = false; + continue; + } + currentLineWidth += glyphWidth; + currentLineHeight = Math.max(glyphHeight, currentLineHeight); + } + width = Math.max(width, currentLineWidth); + height += currentLineHeight + this.extraHeight; + return { + width: WIDTH_FACTOR * width, + height, + isBroken, + }; + } +} // ./src/core/xfa/som.js + +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 ? root.datasets.data : root)], + [ + "$record", + (root, current) => + (root.datasets ? root.datasets.data : root)[$getChildren]()[0], + ], + ["$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; } -const Cn = /^[^.[]+/, - hn = /^[^\]]+/, - Bn = { dot: 0, dotDot: 1, dotHash: 2, dotBracket: 3, dotParen: 4 }, - ln = new Map([ - ["$data", (e, t) => (e.datasets ? e.datasets.data : e)], - ["$record", (e, t) => (e.datasets ? e.datasets.data : e)[Er]()[0]], - ["$template", (e, t) => e.template], - ["$connectionSet", (e, t) => e.connectionSet], - ["$form", (e, t) => e.form], - ["$layout", (e, t) => e.layout], - ["$host", (e, t) => e.host], - ["$dataWindow", (e, t) => e.dataWindow], - ["$event", (e, t) => e.event], - ["!", (e, t) => e.datasets], - ["$xfa", (e, t) => e], - ["xfa", (e, t) => e], - ["$", (e, t) => t], - ]), - Qn = new WeakMap(); -function parseExpression(e, t, i = !0) { - let a = e.match(Cn); - if (!a) return null; - let [s] = a; - const r = [ +function parseExpression(expr, dotDotAllowed, noExpr = true) { + let match = expr.match(namePattern); + if (!match) { + return null; + } + let [name] = match; + const parsed = [ { - name: s, - cacheName: "." + s, + name, + cacheName: "." + name, index: 0, js: null, formCalc: null, - operator: Bn.dot, + operator: operators.dot, }, ]; - let n = s.length; - for (; n < e.length; ) { - const o = n; - if ("[" === e.charAt(n++)) { - a = e.slice(n).match(hn); - if (!a) { + 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) { warn("XFA - Invalid index in SOM expression"); return null; } - r.at(-1).index = - "*" === (g = (g = a[0]).trim()) ? 1 / 0 : parseInt(g, 10) || 0; - n += a[0].length + 1; + parsed.at(-1).index = parseIndex(match[0]); + pos += match[0].length + 1; continue; } - let c; - switch (e.charAt(n)) { + let operator; + switch (expr.charAt(pos)) { case ".": - if (!t) return null; - n++; - c = Bn.dotDot; + if (!dotDotAllowed) { + return null; + } + pos++; + operator = operators.dotDot; break; case "#": - n++; - c = Bn.dotHash; + pos++; + operator = operators.dotHash; break; case "[": - if (i) { + if (noExpr) { warn( "XFA - SOM expression contains a FormCalc subexpression which is not supported for now.", ); return null; } - c = Bn.dotBracket; + operator = operators.dotBracket; break; case "(": - if (i) { + if (noExpr) { warn( "XFA - SOM expression contains a JavaScript subexpression which is not supported for now.", ); return null; } - c = Bn.dotParen; + operator = operators.dotParen; break; default: - c = Bn.dot; + operator = operators.dot; + break; } - a = e.slice(n).match(Cn); - if (!a) break; - [s] = a; - n += s.length; - r.push({ - name: s, - cacheName: e.slice(o, n), - operator: c, + 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, }); } - var g; - return r; + return parsed; } -function searchNode(e, t, i, a = !0, s = !0) { - const r = parseExpression(i, a); - if (!r) return null; - const n = ln.get(r[0].name); - let g, - o = 0; - if (n) { - g = !0; - e = [n(e, t)]; - o = 1; +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 { - g = null === t; - e = [t || e]; + isQualified = container === null; + root = [container || root]; } - for (let i = r.length; o < i; o++) { - const { name: i, cacheName: a, operator: n, index: c } = r[o], - C = []; - for (const t of e) { - if (!t.isXFAObject) continue; - let e, r; - if (s) { - r = Qn.get(t); - if (!r) { - r = new Map(); - Qn.set(t, r); - } - e = r.get(a); + for (let ii = parsed.length; i < ii; i++) { + const { name, cacheName, operator, index } = parsed[i]; + const nodes = []; + for (const node of root) { + if (!node.isXFAObject) { + continue; } - if (!e) { - switch (n) { - case Bn.dot: - e = t[cr](i, !1); - break; - case Bn.dotDot: - e = t[cr](i, !0); - break; - case Bn.dotHash: - e = t[Ir](i); - e = e.isXFAObjectArray ? e.children : [e]; + let children, cached; + if (useCache) { + cached = somCache.get(node); + if (!cached) { + cached = new Map(); + somCache.set(node, cached); } - s && r.set(a, e); + children = cached.get(cacheName); + } + if (!children) { + switch (operator) { + case operators.dot: + children = node[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = node[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = node[$getChildrenByClass](name); + children = children.isXFAObjectArray + ? children.children + : [children]; + break; + default: + break; + } + if (useCache) { + cached.set(cacheName, children); + } + } + if (children.length > 0) { + nodes.push(children); } - e.length > 0 && C.push(e); } - if (0 !== C.length || g || 0 !== o) - e = isFinite(c) - ? C.filter((e) => c < e.length).map((e) => e[c]) - : C.flat(); - else { - const i = t[pr](); - if (!(t = i)) return null; - o = -1; - e = [t]; - } - } - return 0 === e.length ? null : e; -} -function createDataNode(e, t, i) { - const a = parseExpression(i); - if (!a) return null; - if (a.some((e) => e.operator === Bn.dotDot)) return null; - const s = ln.get(a[0].name); - let r = 0; - if (s) { - e = s(e, t); - r = 1; - } else e = t || e; - for (let t = a.length; r < t; r++) { - const { name: t, operator: i, index: s } = a[r]; - if (!isFinite(s)) { - a[r].index = 0; - return e.createNodes(a.slice(r)); - } - let n; - switch (i) { - case Bn.dot: - n = e[cr](t, !1); - break; - case Bn.dotDot: - n = e[cr](t, !0); - break; - case Bn.dotHash: - n = e[Ir](t); - n = n.isXFAObjectArray ? n.children : [n]; - } - if (0 === n.length) return e.createNodes(a.slice(r)); - if (!(s < n.length)) { - a[r].index = s - n.length; - return e.createNodes(a.slice(r)); - } - { - const t = n[s]; - if (!t.isXFAObject) { - warn("XFA - Cannot create a node."); + if (nodes.length === 0 && !isQualified && i === 0) { + const parent = container[$getParent](); + container = parent; + if (!container) { return null; } - e = t; + i = -1; + root = [container]; + continue; + } + root = isFinite(index) + ? nodes.filter((node) => index < node.length).map((node) => node[index]) + : nodes.flat(); + } + if (root.length === 0) { + return null; + } + return root; +} +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 root.createNodes(parsed.slice(i)); + } + let children; + switch (operator) { + case operators.dot: + children = root[$getChildrenByName](name, false); + break; + case operators.dotDot: + children = root[$getChildrenByName](name, true); + break; + case operators.dotHash: + children = root[$getChildrenByClass](name); + children = children.isXFAObjectArray ? children.children : [children]; + break; + default: + break; + } + if (children.length === 0) { + return root.createNodes(parsed.slice(i)); + } + if (index < children.length) { + const child = children[index]; + if (!child.isXFAObject) { + warn(`XFA - Cannot create a node.`); + return null; + } + root = child; + } else { + parsed[i].index = index - children.length; + return root.createNodes(parsed.slice(i)); } } return null; -} -const En = Symbol(), - un = Symbol(), - dn = Symbol(), - fn = Symbol("_children"), - pn = Symbol(), - mn = Symbol(), - yn = Symbol(), - wn = Symbol(), - Dn = Symbol(), - bn = Symbol(), - Fn = Symbol(), - Sn = Symbol(), - kn = Symbol(), - Rn = Symbol("parent"), - Nn = Symbol(), - Gn = Symbol(), - xn = Symbol(); -let Un = 0; -const Mn = on.datasets.id; +} // ./src/core/xfa/xfa_object.js + +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 = NamespaceIds.datasets.id; class XFAObject { - constructor(e, t, i = !1) { - this[Jr] = e; - this[Yr] = t; - this[Fn] = i; - this[Rn] = null; - this[fn] = []; - this[nn] = `${t}${Un++}`; - this[yr] = null; + 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; } get isXFAObject() { - return !0; + return true; } get isXFAObjectArray() { - return !1; + return false; } - createNodes(e) { - let t = this, - i = null; - for (const { name: a, index: s } of e) { - for (let e = 0, r = isFinite(s) ? s : 0; e <= r; e++) { - const e = t[Jr] === Mn ? -1 : t[Jr]; - i = new XmlObject(e, a); - t[Xs](i); + createNodes(path) { + let root = this, + node = null; + for (const { name, index } of path) { + for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) { + const nsId = + root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId]; + node = new XmlObject(nsId, name); + root[$appendChild](node); } - t = i; + root = node; } - return i; + return node; } - [Kr](e) { - if (!this[Fn] || !this[Tr](e)) return !1; - const t = e[Yr], - i = this[t]; - if (!(i instanceof XFAObjectArray)) { - null !== i && this[jr](i); - this[t] = e; - this[Xs](e); - return !0; + [$onChild](child) { + if (!this[_hasChildren] || !this[$onChildCheck](child)) { + return false; } - if (i.push(e)) { - this[Xs](e); - return !0; + 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 a = ""; - this.id - ? (a = ` (id: ${this.id})`) - : this.name && (a = ` (name: ${this.name} ${this.h.value})`); - warn(`XFA - node "${this[Yr]}"${a} has already enough "${t}"!`); - return !1; + let id = ""; + if (this.id) { + id = ` (id: ${this.id})`; + } else if (this.name) { + id = ` (name: ${this.name} ${this.h.value})`; + } + warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); + return false; } - [Tr](e) { - return this.hasOwnProperty(e[Yr]) && e[Jr] === this[Jr]; + [$onChildCheck](child) { + return ( + this.hasOwnProperty(child[$nodeName]) && + child[$namespaceId] === this[$namespaceId] + ); } - [Gr]() { - return !1; + [$isNsAgnostic]() { + return false; } - [Ws]() { - return !1; + [$acceptWhitespace]() { + return false; } - [Sr]() { - return !1; + [$isCDATAXml]() { + return false; } - [kr]() { - return !1; + [$isBindable]() { + return false; } - [Pr]() { - this.para && this[mr]()[ar].paraStack.pop(); + [$popPara]() { + if (this.para) { + this[$getTemplateRoot]()[$extra].paraStack.pop(); + } } - [Wr]() { - this[mr]()[ar].paraStack.push(this.para); + [$pushPara]() { + this[$getTemplateRoot]()[$extra].paraStack.push(this.para); } - [zr](e) { - this.id && this[Jr] === on.template.id && e.set(this.id, this); + [$setId](ids) { + if (this.id && this[$namespaceId] === NamespaceIds.template.id) { + ids.set(this.id, this); + } } - [mr]() { - return this[yr].template; + [$getTemplateRoot]() { + return this[$globalData].template; } - [xr]() { - return !1; + [$isSplittable]() { + return false; } - [Ur]() { - return !1; + [$isThereMoreWidth]() { + return false; } - [Xs](e) { - e[Rn] = this; - this[fn].push(e); - !e[yr] && this[yr] && (e[yr] = this[yr]); + [$appendChild](child) { + child[_parent] = this; + this[_children].push(child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } } - [jr](e) { - const t = this[fn].indexOf(e); - this[fn].splice(t, 1); + [$removeChild](child) { + const i = this[_children].indexOf(child); + this[_children].splice(i, 1); } - [wr]() { + [$hasSettableValue]() { return this.hasOwnProperty("value"); } - [$r](e) {} - [qr](e) {} - [sr]() {} - [Vs](e) { - delete this[Fn]; - if (this[_s]) { - e.clean(this[_s]); - delete this[_s]; + [$setValue](_) {} + [$onText](_) {} + [$finalize]() {} + [$clean](builder) { + delete this[_hasChildren]; + if (this[$cleanup]) { + builder.clean(this[$cleanup]); + delete this[$cleanup]; } } - [br](e) { - return this[fn].indexOf(e); + [$indexOf](child) { + return this[_children].indexOf(child); } - [Fr](e, t) { - t[Rn] = this; - this[fn].splice(e, 0, t); - !t[yr] && this[yr] && (t[yr] = this[yr]); + [$insertAt](i, child) { + child[_parent] = this; + this[_children].splice(i, 0, child); + if (!child[$globalData] && this[$globalData]) { + child[$globalData] = this[$globalData]; + } } - [Mr]() { + [$isTransparent]() { return !this.name; } - [Hr]() { + [$lastAttribute]() { return ""; } - [en]() { - return 0 === this[fn].length - ? this[er] - : this[fn].map((e) => e[en]()).join(""); + [$text]() { + if (this[_children].length === 0) { + return this[$content]; + } + return this[_children].map((c) => c[$text]()).join(""); } - get [dn]() { - const e = Object.getPrototypeOf(this); - if (!e._attributes) { - const t = (e._attributes = new Set()); - for (const e of Object.getOwnPropertyNames(this)) { + get [_attributeNames]() { + const proto = Object.getPrototypeOf(this); + if (!proto._attributes) { + const attributes = (proto._attributes = new Set()); + for (const name of Object.getOwnPropertyNames(this)) { if ( - null === this[e] || - this[e] instanceof XFAObject || - this[e] instanceof XFAObjectArray - ) + this[name] === null || + this[name] instanceof XFAObject || + this[name] instanceof XFAObjectArray + ) { break; - t.add(e); - } - } - return shadow(this, dn, e._attributes); - } - [Nr](e) { - let t = this; - for (; t; ) { - if (t === e) return !0; - t = t[pr](); - } - return !1; - } - [pr]() { - return this[Rn]; - } - [fr]() { - return this[pr](); - } - [Er](e = null) { - return e ? this[e] : this[fn]; - } - [ir]() { - const e = Object.create(null); - this[er] && (e.$content = this[er]); - for (const t of Object.getOwnPropertyNames(this)) { - const i = this[t]; - null !== i && - (i instanceof XFAObject - ? (e[t] = i[ir]()) - : i instanceof XFAObjectArray - ? i.isEmpty() || (e[t] = i.dump()) - : (e[t] = i)); - } - return e; - } - [rn]() { - return null; - } - [an]() { - return HTMLResult.EMPTY; - } - *[ur]() { - for (const e of this[Er]()) yield e; - } - *[wn](e, t) { - for (const i of this[ur]()) - if (!e || t === e.has(i[Yr])) { - const e = this[or](), - t = i[an](e); - t.success || (this[ar].failingNode = i); - yield t; - } - } - [rr]() { - return null; - } - [js](e, t) { - this[ar].children.push(e); - } - [or]() {} - [Zs]({ filter: e = null, include: t = !0 }) { - if (this[ar].generator) { - const e = this[or](), - t = this[ar].failingNode[an](e); - if (!t.success) return t; - t.html && this[js](t.html, t.bbox); - delete this[ar].failingNode; - } else this[ar].generator = this[wn](e, t); - for (;;) { - const e = this[ar].generator.next(); - if (e.done) break; - const t = e.value; - if (!t.success) return t; - t.html && this[js](t.html, t.bbox); - } - this[ar].generator = null; - return HTMLResult.EMPTY; - } - [_r](e) { - this[Gn] = new Set(Object.keys(e)); - } - [bn](e) { - const t = this[dn], - i = this[Gn]; - return [...e].filter((e) => t.has(e) && !i.has(e)); - } - [Zr](e, t = new Set()) { - for (const i of this[fn]) i[Nn](e, t); - } - [Nn](e, t) { - const i = this[Dn](e, t); - i ? this[En](i, e, t) : this[Zr](e, t); - } - [Dn](e, t) { - const { use: i, usehref: a } = this; - if (!i && !a) return null; - let s = null, - r = null, - n = null, - g = i; - if (a) { - g = a; - a.startsWith("#som(") && a.endsWith(")") - ? (r = a.slice(5, -1)) - : a.startsWith(".#som(") && a.endsWith(")") - ? (r = a.slice(6, -1)) - : a.startsWith("#") - ? (n = a.slice(1)) - : a.startsWith(".#") && (n = a.slice(2)); - } else i.startsWith("#") ? (n = i.slice(1)) : (r = i); - this.use = this.usehref = ""; - if (n) s = e.get(n); - else { - s = searchNode(e.get(Xr), this, r, !0, !1); - s && (s = s[0]); - } - if (!s) { - warn(`XFA - Invalid prototype reference: ${g}.`); - return null; - } - if (s[Yr] !== this[Yr]) { - warn(`XFA - Incompatible prototype: ${s[Yr]} !== ${this[Yr]}.`); - return null; - } - if (t.has(s)) { - warn("XFA - Cycle detected in prototypes use."); - return null; - } - t.add(s); - const o = s[Dn](e, t); - o && s[En](o, e, t); - s[Zr](e, t); - t.delete(s); - return s; - } - [En](e, t, i) { - if (i.has(e)) { - warn("XFA - Cycle detected in prototypes use."); - return; - } - !this[er] && e[er] && (this[er] = e[er]); - new Set(i).add(e); - for (const t of this[bn](e[Gn])) { - this[t] = e[t]; - this[Gn] && this[Gn].add(t); - } - for (const a of Object.getOwnPropertyNames(this)) { - if (this[dn].has(a)) continue; - const s = this[a], - r = e[a]; - if (s instanceof XFAObjectArray) { - for (const e of s[fn]) e[Nn](t, i); - for (let a = s[fn].length, n = r[fn].length; a < n; a++) { - const r = e[fn][a][$s](); - if (!s.push(r)) break; - r[Rn] = this; - this[fn].push(r); - r[Nn](t, i); } - } else if (null === s) { - if (null !== r) { - const e = r[$s](); - e[Rn] = this; - this[a] = e; - this[fn].push(e); - e[Nn](t, i); - } - } else { - s[Zr](t, i); - r && s[En](r, t, i); + attributes.add(name); } } + return shadow(this, _attributeNames, proto._attributes); } - static [pn](e) { - return Array.isArray(e) - ? e.map((e) => XFAObject[pn](e)) - : "object" == typeof e && null !== e - ? Object.assign({}, e) - : e; - } - [$s]() { - const e = Object.create(Object.getPrototypeOf(this)); - for (const t of Object.getOwnPropertySymbols(this)) - try { - e[t] = this[t]; - } catch { - shadow(e, t, this[t]); + [$isDescendent](parent) { + let node = this; + while (node) { + if (node === parent) { + return true; } - e[nn] = `${e[Yr]}${Un++}`; - e[fn] = []; - for (const t of Object.getOwnPropertyNames(this)) { - if (this[dn].has(t)) { - e[t] = XFAObject[pn](this[t]); + 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; } - const i = this[t]; - e[t] = i instanceof XFAObjectArray ? new XFAObjectArray(i[Sn]) : null; - } - for (const t of this[fn]) { - const i = t[Yr], - a = t[$s](); - e[fn].push(a); - a[Rn] = e; - null === e[i] ? (e[i] = a) : e[i][fn].push(a); - } - return e; - } - [Er](e = null) { - return e ? this[fn].filter((t) => t[Yr] === e) : this[fn]; - } - [Ir](e) { - return this[e]; - } - [cr](e, t, i = !0) { - return Array.from(this[Cr](e, t, i)); - } - *[Cr](e, t, i = !0) { - if ("parent" !== e) { - for (const i of this[fn]) { - i[Yr] === e && (yield i); - i.name === e && (yield i); - (t || i[Mr]()) && (yield* i[Cr](e, t, !1)); + if (value instanceof XFAObject) { + dumped[name] = value[$dump](); + } else if (value instanceof XFAObjectArray) { + if (!value.isEmpty()) { + dumped[name] = value.dump(); + } + } else { + dumped[name] = value; } - i && this[dn].has(e) && (yield new XFAAttribute(this, e, this[e])); - } else yield this[Rn]; + } + return dumped; + } + [$toStyle]() { + return null; + } + [$toHTML]() { + return 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 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, -1); + } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { + somExpression = usehref.slice(".#som(".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 = searchNode(ids.get($root), this, somExpression, true, false); + if (proto) { + proto = proto[0]; + } + } + if (!proto) { + warn(`XFA - Invalid prototype reference: ${ref}.`); + return null; + } + if (proto[$nodeName] !== this[$nodeName]) { + warn( + `XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`, + ); + return null; + } + if (ancestors.has(proto)) { + 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)) { + 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 { + 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]; + clone[name] = + value instanceof XFAObjectArray + ? new XFAObjectArray(value[_max]) + : 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]); + } } } class XFAObjectArray { - constructor(e = 1 / 0) { - this[Sn] = e; - this[fn] = []; + constructor(max = Infinity) { + this[_max] = max; + this[_children] = []; } get isXFAObject() { - return !1; + return false; } get isXFAObjectArray() { - return !0; + return true; } - push(e) { - if (this[fn].length <= this[Sn]) { - this[fn].push(e); - return !0; + push(child) { + const len = this[_children].length; + if (len <= this[_max]) { + this[_children].push(child); + return true; } - warn(`XFA - node "${e[Yr]}" accepts no more than ${this[Sn]} children`); - return !1; + warn( + `XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`, + ); + return false; } isEmpty() { - return 0 === this[fn].length; + return this[_children].length === 0; } dump() { - return 1 === this[fn].length - ? this[fn][0][ir]() - : this[fn].map((e) => e[ir]()); + return this[_children].length === 1 + ? this[_children][0][$dump]() + : this[_children].map((x) => x[$dump]()); } - [$s]() { - const e = new XFAObjectArray(this[Sn]); - e[fn] = this[fn].map((e) => e[$s]()); - return e; + [$clone]() { + const clone = new XFAObjectArray(this[_max]); + clone[_children] = this[_children].map((c) => c[$clone]()); + return clone; } get children() { - return this[fn]; + return this[_children]; } clear() { - this[fn].length = 0; + this[_children].length = 0; } } class XFAAttribute { - constructor(e, t, i) { - this[Rn] = e; - this[Yr] = t; - this[er] = i; - this[Ar] = !1; - this[nn] = "attribute" + Un++; + constructor(node, name, value) { + this[_parent] = node; + this[$nodeName] = name; + this[$content] = value; + this[$consumed] = false; + this[$uid] = `attribute${uid++}`; } - [pr]() { - return this[Rn]; + [$getParent]() { + return this[_parent]; } - [Rr]() { - return !0; + [$isDataValue]() { + return true; } - [hr]() { - return this[er].trim(); + [$getDataValue]() { + return this[$content].trim(); } - [$r](e) { - e = e.value || ""; - this[er] = e.toString(); + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); } - [en]() { - return this[er]; + [$text]() { + return this[$content]; } - [Nr](e) { - return this[Rn] === e || this[Rn][Nr](e); + [$isDescendent](parent) { + return this[_parent] === parent || this[_parent][$isDescendent](parent); } } class XmlObject extends XFAObject { - constructor(e, t, i = {}) { - super(e, t); - this[er] = ""; - this[mn] = null; - if ("#text" !== t) { - const e = new Map(); - this[un] = e; - for (const [t, a] of Object.entries(i)) - e.set(t, new XFAAttribute(this, t, a)); - if (i.hasOwnProperty(vr)) { - const e = i[vr].xfa.dataNode; - void 0 !== e && - ("dataGroup" === e - ? (this[mn] = !1) - : "dataValue" === e && (this[mn] = !0)); + 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[Ar] = !1; + this[$consumed] = false; } - [sn](e) { - const t = this[Yr]; - if ("#text" === t) { - e.push(encodeToXmlString(this[er])); + [$toString](buf) { + const tagName = this[$nodeName]; + if (tagName === "#text") { + buf.push(encodeToXmlString(this[$content])); return; } - const i = utf8StringToString(t), - a = this[Jr] === Mn ? "xfa:" : ""; - e.push(`<${a}${i}`); - for (const [t, i] of this[un].entries()) { - const a = utf8StringToString(t); - e.push(` ${a}="${encodeToXmlString(i[er])}"`); + const utf8TagName = utf8StringToString(tagName); + const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; + buf.push(`<${prefix}${utf8TagName}`); + for (const [name, value] of this[_attributes].entries()) { + const utf8Name = utf8StringToString(name); + buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); } - null !== this[mn] && - (this[mn] - ? e.push(' xfa:dataNode="dataValue"') - : e.push(' xfa:dataNode="dataGroup"')); - if (this[er] || 0 !== this[fn].length) { - e.push(">"); - if (this[er]) - "string" == typeof this[er] - ? e.push(encodeToXmlString(this[er])) - : this[er][sn](e); - else for (const t of this[fn]) t[sn](e); - e.push(``); - } else e.push("/>"); - } - [Kr](e) { - if (this[er]) { - const e = new XmlObject(this[Jr], "#text"); - this[Xs](e); - e[er] = this[er]; - this[er] = ""; + if (this[_dataValue] !== null) { + if (this[_dataValue]) { + buf.push(` xfa:dataNode="dataValue"`); + } else { + buf.push(` xfa:dataNode="dataGroup"`); + } } - this[Xs](e); - return !0; + if (!this[$content] && this[_children].length === 0) { + buf.push("/>"); + return; + } + buf.push(">"); + if (this[$content]) { + if (typeof this[$content] === "string") { + buf.push(encodeToXmlString(this[$content])); + } else { + this[$content][$toString](buf); + } + } else { + for (const child of this[_children]) { + child[$toString](buf); + } + } + buf.push(``); } - [qr](e) { - this[er] += e; + [$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; } - [sr]() { - if (this[er] && this[fn].length > 0) { - const e = new XmlObject(this[Jr], "#text"); - this[Xs](e); - e[er] = this[er]; - delete this[er]; + [$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]; } } - [an]() { - return "#text" === this[Yr] - ? HTMLResult.success({ name: "#text", value: this[er] }) - : HTMLResult.EMPTY; + [$toHTML]() { + if (this[$nodeName] === "#text") { + return HTMLResult.success({ + name: "#text", + value: this[$content], + }); + } + return HTMLResult.EMPTY; } - [Er](e = null) { - return e ? this[fn].filter((t) => t[Yr] === e) : this[fn]; + [$getChildren](name = null) { + if (!name) { + return this[_children]; + } + return this[_children].filter((c) => c[$nodeName] === name); } - [gr]() { - return this[un]; + [$getAttributes]() { + return this[_attributes]; } - [Ir](e) { - const t = this[un].get(e); - return void 0 !== t ? t : this[Er](e); + [$getChildrenByClass](name) { + const value = this[_attributes].get(name); + if (value !== undefined) { + return value; + } + return this[$getChildren](name); } - *[Cr](e, t) { - const i = this[un].get(e); - i && (yield i); - for (const i of this[fn]) { - i[Yr] === e && (yield i); - t && (yield* i[Cr](e, t)); + *[$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); + } } } - *[nr](e, t) { - const i = this[un].get(e); - !i || (t && i[Ar]) || (yield i); - for (const i of this[fn]) yield* i[nr](e, t); - } - *[Qr](e, t, i) { - for (const a of this[fn]) { - a[Yr] !== e || (i && a[Ar]) || (yield a); - t && (yield* a[Qr](e, t, i)); + *[$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); } } - [Rr]() { - return null === this[mn] - ? 0 === this[fn].length || this[fn][0][Jr] === on.xhtml.id - : this[mn]; + *[$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, + ); + } + } } - [hr]() { - return null === this[mn] - ? 0 === this[fn].length - ? this[er].trim() - : this[fn][0][Jr] === on.xhtml.id - ? this[fn][0][en]().trim() - : null - : this[er].trim(); + [$isDataValue]() { + if (this[_dataValue] === null) { + return ( + this[_children].length === 0 || + this[_children][0][$namespaceId] === NamespaceIds.xhtml.id + ); + } + return this[_dataValue]; } - [$r](e) { - e = e.value || ""; - this[er] = e.toString(); + [$getDataValue]() { + if (this[_dataValue] === null) { + if (this[_children].length === 0) { + return this[$content].trim(); + } + if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) { + return this[_children][0][$text]().trim(); + } + return null; + } + return this[$content].trim(); } - [ir](e = !1) { - const t = Object.create(null); - e && (t.$ns = this[Jr]); - this[er] && (t.$content = this[er]); - t.$name = this[Yr]; - t.children = []; - for (const i of this[fn]) t.children.push(i[ir](e)); - t.attributes = Object.create(null); - for (const [e, i] of this[un]) t.attributes[e] = i[er]; - return t; + [$setValue](value) { + value = value.value || ""; + this[$content] = value.toString(); + } + [$dump](hasNS = false) { + const dumped = Object.create(null); + if (hasNS) { + dumped.$ns = this[$namespaceId]; + } + if (this[$content]) { + dumped.$content = this[$content]; + } + dumped.$name = this[$nodeName]; + dumped.children = []; + for (const child of this[_children]) { + dumped.children.push(child[$dump](hasNS)); + } + dumped.attributes = Object.create(null); + for (const [name, value] of this[_attributes]) { + dumped.attributes[name] = value[$content]; + } + return dumped; } } class ContentObject extends XFAObject { - constructor(e, t) { - super(e, t); - this[er] = ""; + constructor(nsId, name) { + super(nsId, name); + this[$content] = ""; } - [qr](e) { - this[er] += e; + [$onText](text) { + this[$content] += text; } - [sr]() {} + [$finalize]() {} } class OptionObject extends ContentObject { - constructor(e, t, i) { - super(e, t); - this[kn] = i; + constructor(nsId, name, options) { + super(nsId, name); + this[_options] = options; } - [sr]() { - this[er] = getKeyword({ - data: this[er], - defaultValue: this[kn][0], - validate: (e) => this[kn].includes(e), + [$finalize]() { + this[$content] = getKeyword({ + data: this[$content], + defaultValue: this[_options][0], + validate: (k) => this[_options].includes(k), }); } - [Vs](e) { - super[Vs](e); - delete this[kn]; + [$clean](builder) { + super[$clean](builder); + delete this[_options]; } } class StringObject extends ContentObject { - [sr]() { - this[er] = this[er].trim(); + [$finalize]() { + this[$content] = this[$content].trim(); } } class IntegerObject extends ContentObject { - constructor(e, t, i, a) { - super(e, t); - this[yn] = i; - this[xn] = a; + constructor(nsId, name, defaultValue, validator) { + super(nsId, name); + this[_defaultValue] = defaultValue; + this[_validator] = validator; } - [sr]() { - this[er] = getInteger({ - data: this[er], - defaultValue: this[yn], - validate: this[xn], + [$finalize]() { + this[$content] = getInteger({ + data: this[$content], + defaultValue: this[_defaultValue], + validate: this[_validator], }); } - [Vs](e) { - super[Vs](e); - delete this[yn]; - delete this[xn]; + [$clean](builder) { + super[$clean](builder); + delete this[_defaultValue]; + delete this[_validator]; } } class Option01 extends IntegerObject { - constructor(e, t) { - super(e, t, 0, (e) => 1 === e); + constructor(nsId, name) { + super(nsId, name, 0, (n) => n === 1); } } class Option10 extends IntegerObject { - constructor(e, t) { - super(e, t, 1, (e) => 0 === e); + constructor(nsId, name) { + super(nsId, name, 1, (n) => n === 0); } +} // ./src/core/xfa/html_utils.js + +function measureToString(m) { + if (typeof m === "string") { + return "0px"; + } + return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; } -function measureToString(e) { - return "string" == typeof e - ? "0px" - : Number.isInteger(e) - ? `${e}px` - : `${e.toFixed(2)}px`; -} -const Ln = { - anchorType(e, t) { - const i = e[fr](); - if (i && (!i.layout || "position" === i.layout)) { - "transform" in t || (t.transform = ""); - switch (e.anchorType) { - case "bottomCenter": - t.transform += "translate(-50%, -100%)"; - break; - case "bottomLeft": - t.transform += "translate(0,-100%)"; - break; - case "bottomRight": - t.transform += "translate(-100%,-100%)"; - break; - case "middleCenter": - t.transform += "translate(-50%,-50%)"; - break; - case "middleLeft": - t.transform += "translate(0,-50%)"; - break; - case "middleRight": - t.transform += "translate(-100%,-50%)"; - break; - case "topCenter": - t.transform += "translate(-50%,0)"; - break; - case "topRight": - t.transform += "translate(-100%,0)"; - } +const converters = { + anchorType(node, style) { + const parent = node[$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(e, t) { - const i = e[fr](); - let a = e.w; - const s = e.h; - if (i.layout?.includes("row")) { - const t = i[ar], - s = e.colSpan; - let r; - if (-1 === s) { - r = t.columnWidths.slice(t.currentColumn).reduce((e, t) => e + t, 0); - t.currentColumn = 0; + dimensions(node, style) { + const parent = node[$getSubformParent](); + let width = node.w; + const height = node.h; + if (parent.layout?.includes("row")) { + const extra = parent[$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 { - r = t.columnWidths - .slice(t.currentColumn, t.currentColumn + s) - .reduce((e, t) => e + t, 0); - t.currentColumn = (t.currentColumn + e.colSpan) % t.columnWidths.length; + 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; } - isNaN(r) || (a = e.w = r); } - t.width = "" !== a ? measureToString(a) : "auto"; - t.height = "" !== s ? measureToString(s) : "auto"; + style.width = width !== "" ? measureToString(width) : "auto"; + style.height = height !== "" ? measureToString(height) : "auto"; }, - position(e, t) { - const i = e[fr](); - if (!i?.layout || "position" === i.layout) { - t.position = "absolute"; - t.left = measureToString(e.x); - t.top = measureToString(e.y); + position(node, style) { + const parent = node[$getSubformParent](); + if (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"; } }, - rotate(e, t) { - if (e.rotate) { - "transform" in t || (t.transform = ""); - t.transform += `rotate(-${e.rotate}deg)`; - t.transformOrigin = "top left"; - } - }, - presence(e, t) { - switch (e.presence) { + presence(node, style) { + switch (node.presence) { case "invisible": - t.visibility = "hidden"; + style.visibility = "hidden"; break; case "hidden": case "inactive": - t.display = "none"; + style.display = "none"; + break; } }, - hAlign(e, t) { - if ("para" === e[Yr]) - switch (e.hAlign) { + hAlign(node, style) { + if (node[$nodeName] === "para") { + switch (node.hAlign) { case "justifyAll": - t.textAlign = "justify-all"; + style.textAlign = "justify-all"; break; case "radix": - t.textAlign = "left"; + style.textAlign = "left"; break; default: - t.textAlign = e.hAlign; + style.textAlign = node.hAlign; } - else - switch (e.hAlign) { + } else { + switch (node.hAlign) { case "left": - t.alignSelf = "start"; + style.alignSelf = "start"; break; case "center": - t.alignSelf = "center"; + style.alignSelf = "center"; break; case "right": - t.alignSelf = "end"; + style.alignSelf = "end"; + break; } + } }, - margin(e, t) { - e.margin && (t.margin = e.margin[rn]().margin); + margin(node, style) { + if (node.margin) { + style.margin = node.margin[$toStyle]().margin; + } }, }; -function setMinMaxDimensions(e, t) { - if ("position" === e[fr]().layout) { - e.minW > 0 && (t.minWidth = measureToString(e.minW)); - e.maxW > 0 && (t.maxWidth = measureToString(e.maxW)); - e.minH > 0 && (t.minHeight = measureToString(e.minH)); - e.maxH > 0 && (t.maxHeight = measureToString(e.maxH)); +function setMinMaxDimensions(node, style) { + const parent = node[$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(e, t, i, a, s, r) { - const n = new TextMeasure(t, i, a, s); - "string" == typeof e ? n.addString(e) : e[Or](n); - return n.compute(r); +function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { + const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder); + if (typeof text === "string") { + measure.addString(text); + } else { + text[$pushGlyphs](measure); + } + return measure.compute(width); } -function layoutNode(e, t) { - let i = null, - a = null, - s = !1; - if ((!e.w || !e.h) && e.value) { - let r = 0, - n = 0; - if (e.margin) { - r = e.margin.leftInset + e.margin.rightInset; - n = e.margin.topInset + e.margin.bottomInset; +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 g = null, - o = null; - if (e.para) { - o = Object.create(null); - g = "" === e.para.lineHeight ? null : e.para.lineHeight; - o.top = "" === e.para.spaceAbove ? 0 : e.para.spaceAbove; - o.bottom = "" === e.para.spaceBelow ? 0 : e.para.spaceBelow; - o.left = "" === e.para.marginLeft ? 0 : e.para.marginLeft; - o.right = "" === e.para.marginRight ? 0 : e.para.marginRight; + 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 c = e.font; - if (!c) { - const t = e[mr](); - let i = e[pr](); - for (; i && i !== t; ) { - if (i.font) { - c = i.font; + let font = node.font; + if (!font) { + const root = node[$getTemplateRoot](); + let parent = node[$getParent](); + while (parent && parent !== root) { + if (parent.font) { + font = parent.font; break; } - i = i[pr](); + parent = parent[$getParent](); } } - const C = (e.w || t.width) - r, - h = e[yr].fontFinder; + const maxWidth = (node.w || availableSpace.width) - marginH; + const fontFinder = node[$globalData].fontFinder; if ( - e.value.exData && - e.value.exData[er] && - "text/html" === e.value.exData.contentType + node.value.exData && + node.value.exData[$content] && + node.value.exData.contentType === "text/html" ) { - const t = layoutText(e.value.exData[er], c, o, g, h, C); - a = t.width; - i = t.height; - s = t.isBroken; + const res = layoutText( + node.value.exData[$content], + font, + margin, + lineHeight, + fontFinder, + maxWidth, + ); + width = res.width; + height = res.height; + isBroken = res.isBroken; } else { - const t = e.value[en](); - if (t) { - const e = layoutText(t, c, o, g, h, C); - a = e.width; - i = e.height; - s = e.isBroken; + const text = node.value[$text](); + if (text) { + const res = layoutText( + text, + font, + margin, + lineHeight, + fontFinder, + maxWidth, + ); + width = res.width; + height = res.height; + isBroken = res.isBroken; } } - null === a || e.w || (a += r); - null === i || e.h || (i += n); - } - return { w: a, h: i, isBroken: s }; -} -function computeBbox(e, t, i) { - let a; - if ("" !== e.w && "" !== e.h) a = [e.x, e.y, e.w, e.h]; - else { - if (!i) return null; - let s = e.w; - if ("" === s) { - if (0 === e.maxW) { - const t = e[fr](); - s = "position" === t.layout && "" !== t.w ? 0 : e.minW; - } else s = Math.min(e.maxW, i.width); - t.attributes.style.width = measureToString(s); + if (width !== null && !node.w) { + width += marginH; } - let r = e.h; - if ("" === r) { - if (0 === e.maxH) { - const t = e[fr](); - r = "position" === t.layout && "" !== t.h ? 0 : e.minH; - } else r = Math.min(e.maxH, i.height); - t.attributes.style.height = measureToString(r); + if (height !== null && !node.h) { + height += marginV; } - a = [e.x, e.y, s, r]; } - return a; + return { + w: width, + h: height, + isBroken, + }; } -function fixDimensions(e) { - const t = e[fr](); - if (t.layout?.includes("row")) { - const i = t[ar], - a = e.colSpan; - let s; - s = - -1 === a - ? i.columnWidths.slice(i.currentColumn).reduce((e, t) => e + t, 0) - : i.columnWidths - .slice(i.currentColumn, i.currentColumn + a) - .reduce((e, t) => e + t, 0); - isNaN(s) || (e.w = s); +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[$getSubformParent](); + width = parent.layout === "position" && parent.w !== "" ? 0 : 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[$getSubformParent](); + height = + parent.layout === "position" && parent.h !== "" ? 0 : node.minH; + } else { + height = Math.min(node.maxH, availableSpace.height); + } + html.attributes.style.height = measureToString(height); + } + bbox = [node.x, node.y, width, height]; } - t.layout && "position" !== t.layout && (e.x = e.y = 0); - "table" === e.layout && - "" === e.w && - Array.isArray(e.columnWidths) && - (e.w = e.columnWidths.reduce((e, t) => e + t, 0)); + return bbox; } -function layoutClass(e) { - switch (e.layout) { +function fixDimensions(node) { + const parent = node[$getSubformParent](); + if (parent.layout?.includes("row")) { + const extra = parent[$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": - default: return "xfaPosition"; case "lr-tb": return "xfaLrTb"; @@ -42720,81 +51881,103 @@ function layoutClass(e) { return "xfaTable"; case "tb": return "xfaTb"; + default: + return "xfaPosition"; } } -function toStyle(e, ...t) { - const i = Object.create(null); - for (const a of t) { - const t = e[a]; - if (null !== t) - if (Ln.hasOwnProperty(a)) Ln[a](e, i); - else if (t instanceof XFAObject) { - const e = t[rn](); - e - ? Object.assign(i, e) - : warn(`(DEBUG) - XFA - style for ${a} not implemented yet`); +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 XFAObject) { + const newStyle = value[$toStyle](); + if (newStyle) { + Object.assign(style, newStyle); + } else { + warn(`(DEBUG) - XFA - style for ${name} not implemented yet`); } + } } - return i; + return style; } -function createWrapper(e, t) { - const { attributes: i } = t, - { style: a } = i, - s = { - name: "div", - attributes: { class: ["xfaWrapper"], style: Object.create(null) }, - children: [], - }; - i.class.push("xfaWrapped"); - if (e.border) { - const { widths: i, insets: r } = e.border[ar]; - let n, - g, - o = r[0], - c = r[3]; - const C = r[0] + r[2], - h = r[1] + r[3]; - switch (e.border.hand) { +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[$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": - o -= i[0] / 2; - c -= i[3] / 2; - n = `calc(100% + ${(i[1] + i[3]) / 2 - h}px)`; - g = `calc(100% + ${(i[0] + i[2]) / 2 - C}px)`; + 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": - o -= i[0]; - c -= i[3]; - n = `calc(100% + ${i[1] + i[3] - h}px)`; - g = `calc(100% + ${i[0] + i[2] - C}px)`; + 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": - n = h ? `calc(100% - ${h}px)` : "100%"; - g = C ? `calc(100% - ${C}px)` : "100%"; + width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; + height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; + break; } - const l = ["xfaBorder"]; - isPrintOnly(e.border) && l.push("xfaPrintOnly"); - const Q = { + const classNames = ["xfaBorder"]; + if (isPrintOnly(node.border)) { + classNames.push("xfaPrintOnly"); + } + const border = { name: "div", attributes: { - class: l, - style: { top: `${o}px`, left: `${c}px`, width: n, height: g }, + class: classNames, + style: { + top: `${top}px`, + left: `${left}px`, + width, + height, + }, }, children: [], }; - for (const e of [ + for (const key of [ "border", "borderWidth", "borderColor", "borderRadius", "borderStyle", - ]) - if (void 0 !== a[e]) { - Q.attributes.style[e] = a[e]; - delete a[e]; + ]) { + if (style[key] !== undefined) { + border.attributes.style[key] = style[key]; + delete style[key]; } - s.children.push(Q, t); - } else s.children.push(t); - for (const e of [ + } + wrapper.children.push(border, html); + } else { + wrapper.children.push(html); + } + for (const key of [ "background", "backgroundClip", "top", @@ -42808,599 +51991,781 @@ function createWrapper(e, t) { "transform", "transformOrigin", "visibility", - ]) - if (void 0 !== a[e]) { - s.attributes.style[e] = a[e]; - delete a[e]; - } - s.attributes.style.position = - "absolute" === a.position ? "absolute" : "relative"; - delete a.position; - if (a.alignSelf) { - s.attributes.style.alignSelf = a.alignSelf; - delete a.alignSelf; - } - return s; -} -function fixTextIndent(e) { - const t = getMeasurement(e.textIndent, "0px"); - if (t >= 0) return; - const i = - "padding" + - ("left" === ("right" === e.textAlign ? "right" : "left") - ? "Left" - : "Right"), - a = getMeasurement(e[i], "0px"); - e[i] = a - t + "px"; -} -function setAccess(e, t) { - switch (e.access) { - case "nonInteractive": - t.push("xfaNonInteractive"); - break; - case "readOnly": - t.push("xfaReadOnly"); - break; - case "protected": - t.push("xfaDisabled"); - } -} -function isPrintOnly(e) { - return ( - e.relevant.length > 0 && - !e.relevant[0].excluded && - "print" === e.relevant[0].viewname - ); -} -function getCurrentPara(e) { - const t = e[mr]()[ar].paraStack; - return t.length ? t.at(-1) : null; -} -function setPara(e, t, i) { - if (i.attributes.class?.includes("xfaRich")) { - if (t) { - "" === e.h && (t.height = "auto"); - "" === e.w && (t.width = "auto"); - } - const a = getCurrentPara(e); - if (a) { - const e = i.attributes.style; - e.display = "flex"; - e.flexDirection = "column"; - switch (a.vAlign) { - case "top": - e.justifyContent = "start"; - break; - case "bottom": - e.justifyContent = "end"; - break; - case "middle": - e.justifyContent = "center"; - } - const t = a[rn](); - for (const [i, a] of Object.entries(t)) i in e || (e[i] = a); + ]) { + if (style[key] !== undefined) { + wrapper.attributes.style[key] = style[key]; + delete style[key]; } } + wrapper.attributes.style.position = + style.position === "absolute" ? "absolute" : "relative"; + delete style.position; + if (style.alignSelf) { + wrapper.attributes.style.alignSelf = style.alignSelf; + delete style.alignSelf; + } + return wrapper; } -function setFontFamily(e, t, i, a) { - if (!i) { - delete a.fontFamily; +function fixTextIndent(styles) { + const indent = getMeasurement(styles.textIndent, "0px"); + if (indent >= 0) { return; } - const s = stripQuotes(e.typeface); - a.fontFamily = `"${s}"`; - const r = i.find(s); - if (r) { - const { fontFamily: i } = r.regular.cssFontInfo; - i !== s && (a.fontFamily = `"${i}"`); - const n = getCurrentPara(t); - if (n && "" !== n.lineHeight) return; - if (a.lineHeight) return; - const g = selectFont(e, r); - g && (a.lineHeight = Math.max(1.2, g.lineHeight)); + const align = styles.textAlign === "right" ? "right" : "left"; + const name = "padding" + (align === "left" ? "Left" : "Right"); + const padding = 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 fixURL(e) { - const t = createValidAbsoluteUrl(e, null, { - addDefaultProtocol: !0, - tryConvertEncoding: !0, - }); - return t ? t.href : null; +function isPrintOnly(node) { + return ( + node.relevant.length > 0 && + !node.relevant[0].excluded && + node.relevant[0].viewname === "print" + ); } -function createLine(e, t) { +function getCurrentPara(node) { + const stack = node[$getTemplateRoot]()[$extra].paraStack; + return stack.length ? stack.at(-1) : null; +} +function setPara(node, nodeStyle, value) { + if (value.attributes.class?.includes("xfaRich")) { + if (nodeStyle) { + if (node.h === "") { + nodeStyle.height = "auto"; + } + if (node.w === "") { + nodeStyle.width = "auto"; + } + } + const para = getCurrentPara(node); + if (para) { + const valueStyle = value.attributes.style; + valueStyle.display = "flex"; + valueStyle.flexDirection = "column"; + switch (para.vAlign) { + case "top": + valueStyle.justifyContent = "start"; + break; + case "bottom": + valueStyle.justifyContent = "end"; + break; + case "middle": + valueStyle.justifyContent = "center"; + break; + } + const paraStyle = para[$toStyle](); + for (const [key, val] of Object.entries(paraStyle)) { + if (!(key in valueStyle)) { + valueStyle[key] = val; + } + } + } + } +} +function setFontFamily(xfaFont, node, fontFinder, style) { + if (!fontFinder) { + delete style.fontFamily; + return; + } + const name = stripQuotes(xfaFont.typeface); + style.fontFamily = `"${name}"`; + const typeface = fontFinder.find(name); + if (typeface) { + const { fontFamily } = typeface.regular.cssFontInfo; + if (fontFamily !== name) { + style.fontFamily = `"${fontFamily}"`; + } + const para = getCurrentPara(node); + if (para && para.lineHeight !== "") { + return; + } + if (style.lineHeight) { + return; + } + const pdfFont = selectFont(xfaFont, typeface); + if (pdfFont) { + style.lineHeight = Math.max(1.2, pdfFont.lineHeight); + } + } +} +function fixURL(str) { + const absoluteUrl = createValidAbsoluteUrl(str, null, { + addDefaultProtocol: true, + tryConvertEncoding: true, + }); + return absoluteUrl ? absoluteUrl.href : null; +} // ./src/core/xfa/layout.js + +function createLine(node, children) { return { name: "div", - attributes: { class: ["lr-tb" === e.layout ? "xfaLr" : "xfaRl"] }, - children: t, + attributes: { + class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"], + }, + children, }; } -function flushHTML(e) { - if (!e[ar]) return null; - const t = { - name: "div", - attributes: e[ar].attributes, - children: e[ar].children, - }; - if (e[ar].failingNode) { - const i = e[ar].failingNode[rr](); - i && - (e.layout.endsWith("-tb") - ? t.children.push(createLine(e, [i])) - : t.children.push(i)); +function flushHTML(node) { + if (!node[$extra]) { + return null; } - return 0 === t.children.length ? null : t; + const attributes = node[$extra].attributes; + const html = { + name: "div", + attributes, + children: node[$extra].children, + }; + if (node[$extra].failingNode) { + const htmlFromFailing = node[$extra].failingNode[$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(e, t, i) { - const a = e[ar], - s = a.availableSpace, - [r, n, g, o] = i; - switch (e.layout) { - case "position": - a.width = Math.max(a.width, r + g); - a.height = Math.max(a.height, n + o); - a.children.push(t); +function addHTML(node, html, bbox) { + const extra = node[$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 (!a.line || 1 === a.attempt) { - a.line = createLine(e, []); - a.children.push(a.line); - a.numberInLine = 0; + if (!extra.line || extra.attempt === 1) { + extra.line = createLine(node, []); + extra.children.push(extra.line); + extra.numberInLine = 0; } - a.numberInLine += 1; - a.line.children.push(t); - if (0 === a.attempt) { - a.currentWidth += g; - a.height = Math.max(a.height, a.prevHeight + o); + 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 { - a.currentWidth = g; - a.prevHeight = a.height; - a.height += o; - a.attempt = 0; + extra.currentWidth = w; + extra.prevHeight = extra.height; + extra.height += h; + extra.attempt = 0; } - a.width = Math.max(a.width, a.currentWidth); + extra.width = Math.max(extra.width, extra.currentWidth); break; case "rl-row": case "row": { - a.children.push(t); - a.width += g; - a.height = Math.max(a.height, o); - const e = measureToString(a.height); - for (const t of a.children) t.attributes.style.height = e; + extra.children.push(html); + extra.width += w; + extra.height = Math.max(extra.height, h); + const height = 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 = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.height += h; + extra.children.push(html); break; } - case "table": - case "tb": - a.width = Math.min(s.width, Math.max(a.width, g)); - a.height += o; - a.children.push(t); } } -function getAvailableSpace(e) { - const t = e[ar].availableSpace, - i = e.margin ? e.margin.topInset + e.margin.bottomInset : 0, - a = e.margin ? e.margin.leftInset + e.margin.rightInset : 0; - switch (e.layout) { +function getAvailableSpace(node) { + const availableSpace = node[$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": - return 0 === e[ar].attempt - ? { - width: t.width - a - e[ar].currentWidth, - height: t.height - i - e[ar].prevHeight, - } - : { width: t.width - a, height: t.height - i - e[ar].height }; + if (node[$extra].attempt === 0) { + return { + width: availableSpace.width - marginH - node[$extra].currentWidth, + height: availableSpace.height - marginV - node[$extra].prevHeight, + }; + } + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height, + }; case "rl-row": case "row": + const width = node[$extra].columnWidths + .slice(node[$extra].currentColumn) + .reduce((a, x) => a + x); return { - width: e[ar].columnWidths - .slice(e[ar].currentColumn) - .reduce((e, t) => e + t), - height: t.height - a, + width, + height: availableSpace.height - marginH, }; case "table": case "tb": - return { width: t.width - a, height: t.height - i - e[ar].height }; + return { + width: availableSpace.width - marginH, + height: availableSpace.height - marginV - node[$extra].height, + }; + case "position": default: - return t; + return availableSpace; } } -function checkDimensions(e, t) { - if (null === e[mr]()[ar].firstUnsplittable) return !0; - if (0 === e.w || 0 === e.h) return !0; - const i = e[fr](), - a = i[ar]?.attempt || 0, - [, s, r, n] = (function getTransformedBBox(e) { - let t, - i, - a = "" === e.w ? NaN : e.w, - s = "" === e.h ? NaN : e.h, - [r, n] = [0, 0]; - switch (e.anchorType || "") { - case "bottomCenter": - [r, n] = [a / 2, s]; - break; - case "bottomLeft": - [r, n] = [0, s]; - break; - case "bottomRight": - [r, n] = [a, s]; - break; - case "middleCenter": - [r, n] = [a / 2, s / 2]; - break; - case "middleLeft": - [r, n] = [0, s / 2]; - break; - case "middleRight": - [r, n] = [a, s / 2]; - break; - case "topCenter": - [r, n] = [a / 2, 0]; - break; - case "topRight": - [r, n] = [a, 0]; - } - switch (e.rotate || 0) { - case 0: - [t, i] = [-r, -n]; - break; - case 90: - [t, i] = [-n, r]; - [a, s] = [s, -a]; - break; - case 180: - [t, i] = [r, n]; - [a, s] = [-a, -s]; - break; - case 270: - [t, i] = [n, -r]; - [a, s] = [-s, a]; - } - return [ - e.x + t + Math.min(0, a), - e.y + i + Math.min(0, s), - Math.abs(a), - Math.abs(s), - ]; - })(e); - switch (i.layout) { +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[$getTemplateRoot]()[$extra].firstUnsplittable === null) { + return true; + } + if (node.w === 0 || node.h === 0) { + return true; + } + const ERROR = 2; + const parent = node[$getSubformParent](); + const attempt = parent[$extra]?.attempt || 0; + const [, y, w, h] = getTransformedBBox(node); + switch (parent.layout) { case "lr-tb": case "rl-tb": - return 0 === a - ? e[mr]()[ar].noLayoutFailure - ? "" !== e.w - ? Math.round(r - t.width) <= 2 - : t.width > 2 - : !("" !== e.h && Math.round(n - t.height) > 2) && - ("" !== e.w - ? Math.round(r - t.width) <= 2 || - (0 === i[ar].numberInLine && t.height > 2) - : t.width > 2) - : !!e[mr]()[ar].noLayoutFailure || - (!("" !== e.h && Math.round(n - t.height) > 2) && - ("" === e.w || Math.round(r - t.width) <= 2 || !i[Ur]()) && - t.height > 2); + if (attempt === 0) { + if (!node[$getTemplateRoot]()[$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[$extra].numberInLine === 0) { + return space.height > ERROR; + } + return false; + } + return space.width > ERROR; + } + if (node.w !== "") { + return Math.round(w - space.width) <= ERROR; + } + return space.width > ERROR; + } + if (node[$getTemplateRoot]()[$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 > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; case "table": case "tb": - return ( - !!e[mr]()[ar].noLayoutFailure || - ("" === e.h || e[xr]() - ? ("" === e.w || Math.round(r - t.width) <= 2 || !i[Ur]()) && - t.height > 2 - : Math.round(n - t.height) <= 2) - ); + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h !== "" && !node[$isSplittable]()) { + return Math.round(h - space.height) <= ERROR; + } + if (node.w === "" || Math.round(w - space.width) <= ERROR) { + return space.height > ERROR; + } + if (parent[$isThereMoreWidth]()) { + return false; + } + return space.height > ERROR; case "position": - if (e[mr]()[ar].noLayoutFailure) return !0; - if ("" === e.h || Math.round(n + s - t.height) <= 2) return !0; - return n + s > e[mr]()[ar].currentContentArea.h; + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; + } + if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { + return true; + } + const area = node[$getTemplateRoot]()[$extra].currentContentArea; + return h + y > area.h; case "rl-row": case "row": - return ( - !!e[mr]()[ar].noLayoutFailure || - "" === e.h || - Math.round(n - t.height) <= 2 - ); - default: - return !0; - } -} -const Hn = on.template.id, - Jn = "http://www.w3.org/2000/svg", - Yn = /^H(\d+)$/, - vn = new Set([ - "image/gif", - "image/jpeg", - "image/jpg", - "image/pjpeg", - "image/png", - "image/apng", - "image/x-png", - "image/bmp", - "image/x-ms-bmp", - "image/tiff", - "image/tif", - "application/octet-stream", - ]), - Kn = [ - [[66, 77], "image/bmp"], - [[255, 216, 255], "image/jpeg"], - [[73, 73, 42, 0], "image/tiff"], - [[77, 77, 0, 42], "image/tiff"], - [[71, 73, 70, 56, 57, 97], "image/gif"], - [[137, 80, 78, 71, 13, 10, 26, 10], "image/png"], - ]; -function getBorderDims(e) { - if (!e || !e.border) return { w: 0, h: 0 }; - const t = e.border[lr](); - return t - ? { - w: t.widths[0] + t.widths[2] + t.insets[0] + t.insets[2], - h: t.widths[1] + t.widths[3] + t.insets[1] + t.insets[3], + if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { + return true; } - : { w: 0, h: 0 }; + if (node.h !== "") { + return Math.round(h - space.height) <= ERROR; + } + return true; + default: + return true; + } +} // ./src/core/xfa/template.js + +const TEMPLATE_NS_ID = NamespaceIds.template.id; +const SVG_NS = "http://www.w3.org/2000/svg"; +const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; +const MAX_EMPTY_PAGES = 3; +const DEFAULT_TAB_INDEX = 5000; +const HEADING_PATTERN = /^H(\d+)$/; +const MIMES = new Set([ + "image/gif", + "image/jpeg", + "image/jpg", + "image/pjpeg", + "image/png", + "image/apng", + "image/x-png", + "image/bmp", + "image/x-ms-bmp", + "image/tiff", + "image/tif", + "application/octet-stream", +]); +const IMAGES_HEADERS = [ + [[0x42, 0x4d], "image/bmp"], + [[0xff, 0xd8, 0xff], "image/jpeg"], + [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], + [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], + [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], + [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"], +]; +function getBorderDims(node) { + if (!node || !node.border) { + return { + w: 0, + h: 0, + }; + } + const borderExtra = node.border[$getExtra](); + if (!borderExtra) { + return { + w: 0, + h: 0, + }; + } + return { + w: + borderExtra.widths[0] + + borderExtra.widths[2] + + borderExtra.insets[0] + + borderExtra.insets[2], + h: + borderExtra.widths[1] + + borderExtra.widths[3] + + borderExtra.insets[1] + + borderExtra.insets[3], + }; } -function hasMargin(e) { +function hasMargin(node) { return ( - e.margin && - (e.margin.topInset || - e.margin.rightInset || - e.margin.bottomInset || - e.margin.leftInset) + node.margin && + (node.margin.topInset || + node.margin.rightInset || + node.margin.bottomInset || + node.margin.leftInset) ); } -function _setValue(e, t) { - if (!e.value) { - const t = new Value({}); - e[Xs](t); - e.value = t; +function _setValue(templateNode, value) { + if (!templateNode.value) { + const nodeValue = new Value({}); + templateNode[$appendChild](nodeValue); + templateNode.value = nodeValue; } - e.value[$r](t); + templateNode.value[$setValue](value); } -function* getContainedChildren(e) { - for (const t of e[Er]()) t instanceof SubformSet ? yield* t[ur]() : yield t; +function* getContainedChildren(node) { + for (const child of node[$getChildren]()) { + if (child instanceof SubformSet) { + yield* child[$getContainedChildren](); + continue; + } + yield child; + } } -function isRequired(e) { - return "error" === e.validate?.nullTest; +function isRequired(node) { + return node.validate?.nullTest === "error"; } -function setTabIndex(e) { - for (; e; ) { - if (!e.traversal) { - e[An] = e[pr]()[An]; +function setTabIndex(node) { + while (node) { + if (!node.traversal) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; return; } - if (e[An]) return; - let t = null; - for (const i of e.traversal[Er]()) - if ("next" === i.operation) { - t = i; + if (node[$tabIndex]) { + return; + } + let next = null; + for (const child of node.traversal[$getChildren]()) { + if (child.operation === "next") { + next = child; break; } - if (!t || !t.ref) { - e[An] = e[pr]()[An]; + } + if (!next || !next.ref) { + node[$tabIndex] = node[$getParent]()[$tabIndex]; return; } - const i = e[mr](); - e[An] = ++i[An]; - const a = i[Vr](t.ref, e); - if (!a) return; - e = a[0]; + const root = node[$getTemplateRoot](); + node[$tabIndex] = ++root[$tabIndex]; + const ref = root[$searchNode](next.ref, node); + if (!ref) { + return; + } + node = ref[0]; } } -function applyAssist(e, t) { - const i = e.assist; - if (i) { - const e = i[an](); - e && (t.title = e); - const a = i.role.match(Yn); - if (a) { - const e = "heading", - i = a[1]; - t.role = e; - t["aria-level"] = i; +function applyAssist(obj, attributes) { + const assist = obj.assist; + if (assist) { + const assistTitle = assist[$toHTML](); + if (assistTitle) { + attributes.title = assistTitle; + } + const role = assist.role; + const match = role.match(HEADING_PATTERN); + if (match) { + const ariaRole = "heading"; + const ariaLevel = match[1]; + attributes.role = ariaRole; + attributes["aria-level"] = ariaLevel; } } - if ("table" === e.layout) t.role = "table"; - else if ("row" === e.layout) t.role = "row"; - else { - const i = e[pr](); - "row" === i.layout && - (t.role = "TH" === i.assist?.role ? "columnheader" : "cell"); + if (obj.layout === "table") { + attributes.role = "table"; + } else if (obj.layout === "row") { + attributes.role = "row"; + } else { + const parent = obj[$getParent](); + if (parent.layout === "row") { + attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell"; + } } } -function ariaLabel(e) { - if (!e.assist) return null; - const t = e.assist; - return t.speak && "" !== t.speak[er] - ? t.speak[er] - : t.toolTip - ? t.toolTip[er] - : null; +function ariaLabel(obj) { + if (!obj.assist) { + return null; + } + const assist = obj.assist; + if (assist.speak && assist.speak[$content] !== "") { + return assist.speak[$content]; + } + if (assist.toolTip) { + return assist.toolTip[$content]; + } + return null; } -function valueToHtml(e) { +function valueToHtml(value) { return HTMLResult.success({ name: "div", - attributes: { class: ["xfaRich"], style: Object.create(null) }, + attributes: { + class: ["xfaRich"], + style: Object.create(null), + }, children: [ - { name: "span", attributes: { style: Object.create(null) }, value: e }, + { + name: "span", + attributes: { + style: Object.create(null), + }, + value, + }, ], }); } -function setFirstUnsplittable(e) { - const t = e[mr](); - if (null === t[ar].firstUnsplittable) { - t[ar].firstUnsplittable = e; - t[ar].noLayoutFailure = !0; +function setFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === null) { + root[$extra].firstUnsplittable = node; + root[$extra].noLayoutFailure = true; } } -function unsetFirstUnsplittable(e) { - const t = e[mr](); - t[ar].firstUnsplittable === e && (t[ar].noLayoutFailure = !1); -} -function handleBreak(e) { - if (e[ar]) return !1; - e[ar] = Object.create(null); - if ("auto" === e.targetType) return !1; - const t = e[mr](); - let i = null; - if (e.target) { - i = t[Vr](e.target, e[pr]()); - if (!i) return !1; - i = i[0]; +function unsetFirstUnsplittable(node) { + const root = node[$getTemplateRoot](); + if (root[$extra].firstUnsplittable === node) { + root[$extra].noLayoutFailure = false; } - const { currentPageArea: a, currentContentArea: s } = t[ar]; - if ("pageArea" === e.targetType) { - i instanceof PageArea || (i = null); - if (e.startNew) { - e[ar].target = i || a; - return !0; +} +function handleBreak(node) { + if (node[$extra]) { + return false; + } + node[$extra] = Object.create(null); + if (node.targetType === "auto") { + return false; + } + const root = node[$getTemplateRoot](); + let target = null; + if (node.target) { + target = root[$searchNode](node.target, node[$getParent]()); + if (!target) { + return false; } - if (i && i !== a) { - e[ar].target = i; - return !0; + target = target[0]; + } + const { currentPageArea, currentContentArea } = root[$extra]; + if (node.targetType === "pageArea") { + if (!(target instanceof PageArea)) { + target = null; } - return !1; + if (node.startNew) { + node[$extra].target = target || currentPageArea; + return true; + } else if (target && target !== currentPageArea) { + node[$extra].target = target; + return true; + } + return false; } - i instanceof ContentArea || (i = null); - const r = i && i[pr](); - let n, - g = r; - if (e.startNew) - if (i) { - const e = r.contentArea.children, - t = e.indexOf(s), - a = e.indexOf(i); - -1 !== t && t < a && (g = null); - n = a - 1; - } else n = a.contentArea.children.indexOf(s); - else { - if (!i || i === s) return !1; - n = r.contentArea.children.indexOf(i) - 1; - g = r === a ? null : r; + if (!(target instanceof ContentArea)) { + target = null; } - e[ar].target = g; - e[ar].index = n; - return !0; + const pageArea = target && target[$getParent](); + let index; + let nextPageArea = pageArea; + if (node.startNew) { + if (target) { + const contentAreas = pageArea.contentArea.children; + const indexForCurrent = contentAreas.indexOf(currentContentArea); + const indexForTarget = contentAreas.indexOf(target); + if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { + nextPageArea = null; + } + index = indexForTarget - 1; + } else { + index = currentPageArea.contentArea.children.indexOf(currentContentArea); + } + } else if (target && target !== currentContentArea) { + const contentAreas = pageArea.contentArea.children; + index = contentAreas.indexOf(target) - 1; + nextPageArea = pageArea === currentPageArea ? null : pageArea; + } else { + return false; + } + node[$extra].target = nextPageArea; + node[$extra].index = index; + return true; } -function handleOverflow(e, t, i) { - const a = e[mr](), - s = a[ar].noLayoutFailure, - r = t[fr]; - t[fr] = () => e; - a[ar].noLayoutFailure = !0; - const n = t[an](i); - e[js](n.html, n.bbox); - a[ar].noLayoutFailure = s; - t[fr] = r; +function handleOverflow(node, extraNode, space) { + const root = node[$getTemplateRoot](); + const saved = root[$extra].noLayoutFailure; + const savedMethod = extraNode[$getSubformParent]; + extraNode[$getSubformParent] = () => node; + root[$extra].noLayoutFailure = true; + const res = extraNode[$toHTML](space); + node[$addHTML](res.html, res.bbox); + root[$extra].noLayoutFailure = saved; + extraNode[$getSubformParent] = savedMethod; } class AppearanceFilter extends StringObject { - constructor(e) { - super(Hn, "appearanceFilter"); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "appearanceFilter"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Arc extends XFAObject { - constructor(e) { - super(Hn, "arc", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "arc", true); this.circular = getInteger({ - data: e.circular, + data: attributes.circular, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.hand = getStringOption(e.hand, ["even", "left", "right"]); - this.id = e.id || ""; + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; this.startAngle = getFloat({ - data: e.startAngle, + data: attributes.startAngle, defaultValue: 0, - validate: (e) => !0, + validate: (x) => true, }); this.sweepAngle = getFloat({ - data: e.sweepAngle, + data: attributes.sweepAngle, defaultValue: 360, - validate: (e) => !0, + validate: (x) => true, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.edge = null; this.fill = null; } - [an]() { - const e = this.edge || new Edge({}), - t = e[rn](), - i = Object.create(null); - "visible" === this.fill?.presence - ? Object.assign(i, this.fill[rn]()) - : (i.fill = "transparent"); - i.strokeWidth = measureToString("visible" === e.presence ? e.thickness : 0); - i.stroke = t.color; - let a; - const s = { - xmlns: Jn, - style: { width: "100%", height: "100%", overflow: "visible" }, + [$toHTML]() { + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = 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 (360 === this.sweepAngle) - a = { + if (this.sweepAngle === 360) { + arc = { name: "ellipse", attributes: { - xmlns: Jn, + xmlns: SVG_NS, cx: "50%", cy: "50%", rx: "50%", ry: "50%", - style: i, + style, }, }; - else { - const e = (this.startAngle * Math.PI) / 180, - t = (this.sweepAngle * Math.PI) / 180, - r = this.sweepAngle > 180 ? 1 : 0, - [n, g, o, c] = [ - 50 * (1 + Math.cos(e)), - 50 * (1 - Math.sin(e)), - 50 * (1 + Math.cos(e + t)), - 50 * (1 - Math.sin(e + t)), - ]; - a = { + } else { + const startAngle = (this.startAngle * Math.PI) / 180; + const sweepAngle = (this.sweepAngle * Math.PI) / 180; + const largeArc = this.sweepAngle > 180 ? 1 : 0; + const [x1, y1, x2, y2] = [ + 50 * (1 + Math.cos(startAngle)), + 50 * (1 - Math.sin(startAngle)), + 50 * (1 + Math.cos(startAngle + sweepAngle)), + 50 * (1 - Math.sin(startAngle + sweepAngle)), + ]; + arc = { name: "path", attributes: { - xmlns: Jn, - d: `M ${n} ${g} A 50 50 0 ${r} 0 ${o} ${c}`, + xmlns: SVG_NS, + d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, vectorEffect: "non-scaling-stroke", - style: i, + style, }, }; - Object.assign(s, { viewBox: "0 0 100 100", preserveAspectRatio: "none" }); + Object.assign(attributes, { + viewBox: "0 0 100 100", + preserveAspectRatio: "none", + }); } - const r = { name: "svg", children: [a], attributes: s }; - if (hasMargin(this[pr]()[pr]())) + const svg = { + name: "svg", + children: [arc], + attributes, + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { return HTMLResult.success({ name: "div", attributes: { - style: { display: "inline", width: "100%", height: "100%" }, + style: { + display: "inline", + width: "100%", + height: "100%", + }, }, - children: [r], + children: [svg], }); - r.attributes.style.position = "absolute"; - return HTMLResult.success(r); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); } } class Area extends XFAObject { - constructor(e) { - super(Hn, "area", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "area", true); this.colSpan = getInteger({ - data: e.colSpan, + data: attributes.colSpan, defaultValue: 1, - validate: (e) => e >= 1 || -1 === e, + validate: (n) => n >= 1 || n === -1, }); - this.id = e.id || ""; - this.name = e.name || ""; - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.desc = null; this.extras = null; this.area = new XFAObjectArray(); @@ -43411,32 +52776,45 @@ class Area extends XFAObject { this.subform = new XFAObjectArray(); this.subformSet = new XFAObjectArray(); } - *[ur]() { + *[$getContainedChildren]() { yield* getContainedChildren(this); } - [Mr]() { - return !0; + [$isTransparent]() { + return true; } - [kr]() { - return !0; + [$isBindable]() { + return true; } - [js](e, t) { - const [i, a, s, r] = t; - this[ar].width = Math.max(this[ar].width, i + s); - this[ar].height = Math.max(this[ar].height, a + r); - this[ar].children.push(e); + [$addHTML](html, bbox) { + const [x, y, w, h] = bbox; + this[$extra].width = Math.max(this[$extra].width, x + w); + this[$extra].height = Math.max(this[$extra].height, y + h); + this[$extra].children.push(html); } - [or]() { - return this[ar].availableSpace; + [$getAvailableSpace]() { + return this[$extra].availableSpace; } - [an](e) { - const t = toStyle(this, "position"), - i = { style: t, id: this[nn], class: ["xfaArea"] }; - isPrintOnly(this) && i.class.push("xfaPrintOnly"); - this.name && (i.xfaName = this.name); - const a = []; - this[ar] = { children: a, width: 0, height: 0, availableSpace: e }; - const s = this[Zs]({ + [$toHTML](availableSpace) { + const style = toStyle(this, "position"); + const attributes = { + style, + id: this[$uid], + class: ["xfaArea"], + }; + if (isPrintOnly(this)) { + attributes.class.push("xfaPrintOnly"); + } + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + this[$extra] = { + children, + width: 0, + height: 0, + availableSpace, + }; + const result = this[$childrenToHTML]({ filter: new Set([ "area", "draw", @@ -43445,42 +52823,50 @@ class Area extends XFAObject { "subform", "subformSet", ]), - include: !0, + include: true, }); - if (!s.success) { - if (s.isBreak()) return s; - delete this[ar]; + if (!result.success) { + if (result.isBreak()) { + return result; + } + delete this[$extra]; return HTMLResult.FAILURE; } - t.width = measureToString(this[ar].width); - t.height = measureToString(this[ar].height); - const r = { name: "div", attributes: i, children: a }, - n = [this.x, this.y, this[ar].width, this[ar].height]; - delete this[ar]; - return HTMLResult.success(r, n); + style.width = measureToString(this[$extra].width); + style.height = measureToString(this[$extra].height); + const html = { + name: "div", + attributes, + children, + }; + const bbox = [this.x, this.y, this[$extra].width, this[$extra].height]; + delete this[$extra]; + return HTMLResult.success(html, bbox); } } class Assist extends XFAObject { - constructor(e) { - super(Hn, "assist", !0); - this.id = e.id || ""; - this.role = e.role || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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; } - [an]() { - return this.toolTip?.[er] || null; + [$toHTML]() { + return this.toolTip?.[$content] || null; } } class Barcode extends XFAObject { - constructor(e) { - super(Hn, "barcode", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "barcode", true); this.charEncoding = getKeyword({ - data: e.charEncoding ? e.charEncoding.toLowerCase() : "", + data: attributes.charEncoding + ? attributes.charEncoding.toLowerCase() + : "", defaultValue: "", - validate: (e) => + validate: (k) => [ "utf-8", "big-five", @@ -43493,9 +52879,9 @@ class Barcode extends XFAObject { "shift-jis", "ucs-2", "utf-16", - ].includes(e) || e.match(/iso-8859-\d{2}/), + ].includes(k) || k.match(/iso-8859-\d{2}/), }); - this.checksum = getStringOption(e.checksum, [ + this.checksum = getStringOption(attributes.checksum, [ "none", "1mod10", "1mod10_1mod11", @@ -43503,38 +52889,41 @@ class Barcode extends XFAObject { "auto", ]); this.dataColumnCount = getInteger({ - data: e.dataColumnCount, + data: attributes.dataColumnCount, defaultValue: -1, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); this.dataLength = getInteger({ - data: e.dataLength, + data: attributes.dataLength, defaultValue: -1, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.dataPrep = getStringOption(e.dataPrep, ["none", "flateCompress"]); + this.dataPrep = getStringOption(attributes.dataPrep, [ + "none", + "flateCompress", + ]); this.dataRowCount = getInteger({ - data: e.dataRowCount, + data: attributes.dataRowCount, defaultValue: -1, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.endChar = e.endChar || ""; + this.endChar = attributes.endChar || ""; this.errorCorrectionLevel = getInteger({ - data: e.errorCorrectionLevel, + data: attributes.errorCorrectionLevel, defaultValue: -1, - validate: (e) => e >= 0 && e <= 8, + validate: (x) => x >= 0 && x <= 8, }); - this.id = e.id || ""; - this.moduleHeight = getMeasurement(e.moduleHeight, "5mm"); - this.moduleWidth = getMeasurement(e.moduleWidth, "0.25mm"); + this.id = attributes.id || ""; + this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); + this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); this.printCheckDigit = getInteger({ - data: e.printCheckDigit, + data: attributes.printCheckDigit, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.rowColumnRatio = getRatio(e.rowColumnRatio); - this.startChar = e.startChar || ""; - this.textLocation = getStringOption(e.textLocation, [ + this.rowColumnRatio = getRatio(attributes.rowColumnRatio); + this.startChar = attributes.startChar || ""; + this.textLocation = getStringOption(attributes.textLocation, [ "below", "above", "aboveEmbedded", @@ -43542,458 +52931,507 @@ class Barcode extends XFAObject { "none", ]); this.truncate = getInteger({ - data: e.truncate, + data: attributes.truncate, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.type = getStringOption(e.type ? e.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 = getStringOption(e.upsMode, [ + this.type = 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 = getStringOption(attributes.upsMode, [ "usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.wideNarrowRatio = getRatio(e.wideNarrowRatio); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); this.encrypt = null; this.extras = null; } } class Bind extends XFAObject { - constructor(e) { - super(Hn, "bind", !0); - this.match = getStringOption(e.match, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "bind", true); + this.match = getStringOption(attributes.match, [ "once", "dataRef", "global", "none", ]); - this.ref = e.ref || ""; + this.ref = attributes.ref || ""; this.picture = null; } } class BindItems extends XFAObject { - constructor(e) { - super(Hn, "bindItems"); - this.connection = e.connection || ""; - this.labelRef = e.labelRef || ""; - this.ref = e.ref || ""; - this.valueRef = e.valueRef || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "bindItems"); + this.connection = attributes.connection || ""; + this.labelRef = attributes.labelRef || ""; + this.ref = attributes.ref || ""; + this.valueRef = attributes.valueRef || ""; } } class Bookend extends XFAObject { - constructor(e) { - super(Hn, "bookend"); - this.id = e.id || ""; - this.leader = e.leader || ""; - this.trailer = e.trailer || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 Option01 { - constructor(e) { - super(Hn, "boolean"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "boolean"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [an](e) { - return valueToHtml(1 === this[er] ? "1" : "0"); + [$toHTML](availableSpace) { + return valueToHtml(this[$content] === 1 ? "1" : "0"); } } class Border extends XFAObject { - constructor(e) { - super(Hn, "border", !0); - this.break = getStringOption(e.break, ["close", "open"]); - this.hand = getStringOption(e.hand, ["even", "left", "right"]); - this.id = e.id || ""; - this.presence = getStringOption(e.presence, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "border", true); + this.break = getStringOption(attributes.break, ["close", "open"]); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.corner = new XFAObjectArray(4); this.edge = new XFAObjectArray(4); this.extras = null; this.fill = null; this.margin = null; } - [lr]() { - if (!this[ar]) { - const e = this.edge.children.slice(); - if (e.length < 4) { - const t = e.at(-1) || new Edge({}); - for (let i = e.length; i < 4; i++) e.push(t); + [$getExtra]() { + if (!this[$extra]) { + const edges = this.edge.children.slice(); + if (edges.length < 4) { + const defaultEdge = edges.at(-1) || new Edge({}); + for (let i = edges.length; i < 4; i++) { + edges.push(defaultEdge); + } } - const t = e.map((e) => e.thickness), - i = [0, 0, 0, 0]; + const widths = edges.map((edge) => edge.thickness); + const insets = [0, 0, 0, 0]; if (this.margin) { - i[0] = this.margin.topInset; - i[1] = this.margin.rightInset; - i[2] = this.margin.bottomInset; - i[3] = this.margin.leftInset; + insets[0] = this.margin.topInset; + insets[1] = this.margin.rightInset; + insets[2] = this.margin.bottomInset; + insets[3] = this.margin.leftInset; } - this[ar] = { widths: t, insets: i, edges: e }; + this[$extra] = { + widths, + insets, + edges, + }; } - return this[ar]; + return this[$extra]; } - [rn]() { - const { edges: e } = this[lr](), - t = e.map((e) => { - const t = e[rn](); - t.color ||= "#000000"; - return t; - }), - i = Object.create(null); - this.margin && Object.assign(i, this.margin[rn]()); - "visible" === this.fill?.presence && Object.assign(i, this.fill[rn]()); - if (this.corner.children.some((e) => 0 !== e.radius)) { - const e = this.corner.children.map((e) => e[rn]()); - if (2 === e.length || 3 === e.length) { - const t = e.at(-1); - for (let i = e.length; i < 4; i++) e.push(t); + [$toStyle]() { + const { edges } = this[$getExtra](); + const edgeStyles = edges.map((node) => { + const style = node[$toStyle](); + style.color ||= "#000000"; + return style; + }); + const style = Object.create(null); + if (this.margin) { + Object.assign(style, this.margin[$toStyle]()); + } + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } + if (this.corner.children.some((node) => node.radius !== 0)) { + const cornerStyles = this.corner.children.map((node) => node[$toStyle]()); + if (cornerStyles.length === 2 || cornerStyles.length === 3) { + const last = cornerStyles.at(-1); + for (let i = cornerStyles.length; i < 4; i++) { + cornerStyles.push(last); + } } - i.borderRadius = e.map((e) => e.radius).join(" "); + style.borderRadius = cornerStyles.map((s) => s.radius).join(" "); } switch (this.presence) { case "invisible": case "hidden": - i.borderStyle = ""; + style.borderStyle = ""; break; case "inactive": - i.borderStyle = "none"; + style.borderStyle = "none"; break; default: - i.borderStyle = t.map((e) => e.style).join(" "); + style.borderStyle = edgeStyles.map((s) => s.style).join(" "); + break; } - i.borderWidth = t.map((e) => e.width).join(" "); - i.borderColor = t.map((e) => e.color).join(" "); - return i; + style.borderWidth = edgeStyles.map((s) => s.width).join(" "); + style.borderColor = edgeStyles.map((s) => s.color).join(" "); + return style; } } class Break extends XFAObject { - constructor(e) { - super(Hn, "break", !0); - this.after = getStringOption(e.after, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "break", true); + this.after = getStringOption(attributes.after, [ "auto", "contentArea", "pageArea", "pageEven", "pageOdd", ]); - this.afterTarget = e.afterTarget || ""; - this.before = getStringOption(e.before, [ + this.afterTarget = attributes.afterTarget || ""; + this.before = getStringOption(attributes.before, [ "auto", "contentArea", "pageArea", "pageEven", "pageOdd", ]); - this.beforeTarget = e.beforeTarget || ""; - this.bookendLeader = e.bookendLeader || ""; - this.bookendTrailer = e.bookendTrailer || ""; - this.id = e.id || ""; - this.overflowLeader = e.overflowLeader || ""; - this.overflowTarget = e.overflowTarget || ""; - this.overflowTrailer = e.overflowTrailer || ""; + 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 = getInteger({ - data: e.startNew, + data: attributes.startNew, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } } class BreakAfter extends XFAObject { - constructor(e) { - super(Hn, "breakAfter", !0); - this.id = e.id || ""; - this.leader = e.leader || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakAfter", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; this.startNew = getInteger({ - data: e.startNew, + data: attributes.startNew, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.target = e.target || ""; - this.targetType = getStringOption(e.targetType, [ + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, [ "auto", "contentArea", "pageArea", ]); - this.trailer = e.trailer || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.script = null; } } class BreakBefore extends XFAObject { - constructor(e) { - super(Hn, "breakBefore", !0); - this.id = e.id || ""; - this.leader = e.leader || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "breakBefore", true); + this.id = attributes.id || ""; + this.leader = attributes.leader || ""; this.startNew = getInteger({ - data: e.startNew, + data: attributes.startNew, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.target = e.target || ""; - this.targetType = getStringOption(e.targetType, [ + this.target = attributes.target || ""; + this.targetType = getStringOption(attributes.targetType, [ "auto", "contentArea", "pageArea", ]); - this.trailer = e.trailer || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.trailer = attributes.trailer || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.script = null; } - [an](e) { - this[ar] = {}; + [$toHTML](availableSpace) { + this[$extra] = {}; return HTMLResult.FAILURE; } } class Button extends XFAObject { - constructor(e) { - super(Hn, "button", !0); - this.highlight = getStringOption(e.highlight, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "button", true); + this.highlight = getStringOption(attributes.highlight, [ "inverted", "none", "outline", "push", ]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } - [an](e) { - const t = this[pr]()[pr](), - i = { - name: "button", - attributes: { id: this[nn], class: ["xfaButton"], style: {} }, + [$toHTML](availableSpace) { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const htmlButton = { + name: "button", + attributes: { + id: this[$uid], + class: ["xfaButton"], + style: {}, + }, + children: [], + }; + for (const event of grandpa.event.children) { + if (event.activity !== "click" || !event.script) { + continue; + } + const jsURL = recoverJsURL(event.script[$content]); + if (!jsURL) { + continue; + } + const href = fixURL(jsURL.url); + if (!href) { + continue; + } + htmlButton.children.push({ + name: "a", + attributes: { + id: "link" + this[$uid], + href, + newWindow: jsURL.newWindow, + class: ["xfaLink"], + style: {}, + }, children: [], - }; - for (const e of t.event.children) { - if ("click" !== e.activity || !e.script) continue; - const t = recoverJsURL(e.script[er]); - if (!t) continue; - const a = fixURL(t.url); - a && - i.children.push({ - name: "a", - attributes: { - id: "link" + this[nn], - href: a, - newWindow: t.newWindow, - class: ["xfaLink"], - style: {}, - }, - children: [], - }); + }); } - return HTMLResult.success(i); + return HTMLResult.success(htmlButton); } } class Calculate extends XFAObject { - constructor(e) { - super(Hn, "calculate", !0); - this.id = e.id || ""; - this.override = getStringOption(e.override, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "calculate", true); + this.id = attributes.id || ""; + this.override = getStringOption(attributes.override, [ "disabled", "error", "ignore", "warning", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; this.message = null; this.script = null; } } class Caption extends XFAObject { - constructor(e) { - super(Hn, "caption", !0); - this.id = e.id || ""; - this.placement = getStringOption(e.placement, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "caption", true); + this.id = attributes.id || ""; + this.placement = getStringOption(attributes.placement, [ "left", "bottom", "inline", "right", "top", ]); - this.presence = getStringOption(e.presence, [ + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.reserve = Math.ceil(getMeasurement(e.reserve)); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.reserve = Math.ceil(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; } - [$r](e) { - _setValue(this, e); + [$setValue](value) { + _setValue(this, value); } - [lr](e) { - if (!this[ar]) { - let { width: t, height: i } = e; + [$getExtra](availableSpace) { + if (!this[$extra]) { + let { width, height } = availableSpace; switch (this.placement) { case "left": case "right": case "inline": - t = this.reserve <= 0 ? t : this.reserve; + width = this.reserve <= 0 ? width : this.reserve; break; case "top": case "bottom": - i = this.reserve <= 0 ? i : this.reserve; + height = this.reserve <= 0 ? height : this.reserve; + break; } - this[ar] = layoutNode(this, { width: t, height: i }); + this[$extra] = layoutNode(this, { + width, + height, + }); } - return this[ar]; + return this[$extra]; } - [an](e) { - if (!this.value) return HTMLResult.EMPTY; - this[Wr](); - const t = this.value[an](e).html; - if (!t) { - this[Pr](); + [$toHTML](availableSpace) { + if (!this.value) { return HTMLResult.EMPTY; } - const i = this.reserve; + this[$pushPara](); + const value = this.value[$toHTML](availableSpace).html; + if (!value) { + this[$popPara](); + return HTMLResult.EMPTY; + } + const savedReserve = this.reserve; if (this.reserve <= 0) { - const { w: t, h: i } = this[lr](e); + const { w, h } = this[$getExtra](availableSpace); switch (this.placement) { case "left": case "right": case "inline": - this.reserve = t; + this.reserve = w; break; case "top": case "bottom": - this.reserve = i; + this.reserve = h; + break; } } - const a = []; - "string" == typeof t ? a.push({ name: "#text", value: t }) : a.push(t); - const s = toStyle(this, "font", "margin", "visibility"); + const children = []; + if (typeof value === "string") { + children.push({ + name: "#text", + value, + }); + } else { + children.push(value); + } + const style = toStyle(this, "font", "margin", "visibility"); switch (this.placement) { case "left": case "right": - this.reserve > 0 && (s.width = measureToString(this.reserve)); + if (this.reserve > 0) { + style.width = measureToString(this.reserve); + } break; case "top": case "bottom": - this.reserve > 0 && (s.height = measureToString(this.reserve)); + if (this.reserve > 0) { + style.height = measureToString(this.reserve); + } + break; } - setPara(this, null, t); - this[Pr](); - this.reserve = i; + setPara(this, null, value); + this[$popPara](); + this.reserve = savedReserve; return HTMLResult.success({ name: "div", - attributes: { style: s, class: ["xfaCaption"] }, - children: a, + attributes: { + style, + class: ["xfaCaption"], + }, + children, }); } } class Certificate extends StringObject { - constructor(e) { - super(Hn, "certificate"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "certificates", !0); - this.credentialServerPolicy = getStringOption(e.credentialServerPolicy, [ - "optional", - "required", - ]); - this.id = e.id || ""; - this.url = e.url || ""; - this.urlPolicy = e.urlPolicy || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "certificates", true); + this.credentialServerPolicy = 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; @@ -44003,10 +53441,10 @@ class Certificates extends XFAObject { } } class CheckButton extends XFAObject { - constructor(e) { - super(Hn, "checkButton", !0); - this.id = e.id || ""; - this.mark = getStringOption(e.mark, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "checkButton", true); + this.id = attributes.id || ""; + this.mark = getStringOption(attributes.mark, [ "default", "check", "circle", @@ -44015,251 +53453,279 @@ class CheckButton extends XFAObject { "square", "star", ]); - this.shape = getStringOption(e.shape, ["square", "round"]); - this.size = getMeasurement(e.size, "10pt"); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.shape = getStringOption(attributes.shape, ["square", "round"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.border = null; this.extras = null; this.margin = null; } - [an](e) { - const t = toStyle("margin"), - i = measureToString(this.size); - t.width = t.height = i; - let a, s, r; - const n = this[pr]()[pr](), - g = (n.items.children.length && n.items.children[0][an]().html) || [], - o = { - on: (void 0 !== g[0] ? g[0] : "on").toString(), - off: (void 0 !== g[1] ? g[1] : "off").toString(), - }, - c = (n.value?.[en]() || "off") === o.on || void 0, - C = n[fr](), - h = n[nn]; - let l; - if (C instanceof ExclGroup) { - r = C[nn]; - a = "radio"; - s = "xfaRadio"; - l = C[tr]?.[nn] || C[nn]; + [$toHTML](availableSpace) { + const style = toStyle("margin"); + const size = measureToString(this.size); + style.width = style.height = size; + let type; + let className; + let groupId; + const field = this[$getParent]()[$getParent](); + const items = + (field.items.children.length && + field.items.children[0][$toHTML]().html) || + []; + const exportedValue = { + on: (items[0] !== undefined ? items[0] : "on").toString(), + off: (items[1] !== undefined ? items[1] : "off").toString(), + }; + const value = field.value?.[$text]() || "off"; + const checked = value === exportedValue.on || undefined; + const container = field[$getSubformParent](); + const fieldId = field[$uid]; + let dataId; + if (container instanceof ExclGroup) { + groupId = container[$uid]; + type = "radio"; + className = "xfaRadio"; + dataId = container[$data]?.[$uid] || container[$uid]; } else { - a = "checkbox"; - s = "xfaCheckbox"; - l = n[tr]?.[nn] || n[nn]; + type = "checkbox"; + className = "xfaCheckbox"; + dataId = field[$data]?.[$uid] || field[$uid]; } - const Q = { + const input = { name: "input", attributes: { - class: [s], - style: t, - fieldId: h, - dataId: l, - type: a, - checked: c, - xfaOn: o.on, - xfaOff: o.off, - "aria-label": ariaLabel(n), - "aria-required": !1, + class: [className], + style, + fieldId, + dataId, + type, + checked, + xfaOn: exportedValue.on, + xfaOff: exportedValue.off, + "aria-label": ariaLabel(field), + "aria-required": false, }, }; - r && (Q.attributes.name = r); - if (isRequired(n)) { - Q.attributes["aria-required"] = !0; - Q.attributes.required = !0; + if (groupId) { + input.attributes.name = groupId; + } + if (isRequired(field)) { + input.attributes["aria-required"] = true; + input.attributes.required = true; } return HTMLResult.success({ name: "label", - attributes: { class: ["xfaLabel"] }, - children: [Q], + attributes: { + class: ["xfaLabel"], + }, + children: [input], }); } } class ChoiceList extends XFAObject { - constructor(e) { - super(Hn, "choiceList", !0); - this.commitOn = getStringOption(e.commitOn, ["select", "exit"]); - this.id = e.id || ""; - this.open = getStringOption(e.open, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "choiceList", true); + this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]); + this.id = attributes.id || ""; + this.open = getStringOption(attributes.open, [ "userControl", "always", "multiSelect", "onEntry", ]); this.textEntry = getInteger({ - data: e.textEntry, + data: attributes.textEntry, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.border = null; this.extras = null; this.margin = null; } - [an](e) { - const t = toStyle(this, "border", "margin"), - i = this[pr]()[pr](), - a = { fontSize: `calc(${i.font?.size || 10}px * var(--scale-factor))` }, - s = []; - if (i.items.children.length > 0) { - const e = i.items; - let t = 0, - r = 0; - if (2 === e.children.length) { - t = e.children[0].save; - r = 1 - t; + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "margin"); + const ui = this[$getParent](); + const field = ui[$getParent](); + const fontSize = field.font?.size || 10; + const optionStyle = { + fontSize: `calc(${fontSize}px * var(--scale-factor))`, + }; + 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 n = e.children[t][an]().html, - g = e.children[r][an]().html; - let o = !1; - const c = i.value?.[en]() || ""; - for (let e = 0, t = n.length; e < t; e++) { - const t = { + const displayed = items.children[displayedIndex][$toHTML]().html; + const values = items.children[saveIndex][$toHTML]().html; + let selected = false; + const value = field.value?.[$text]() || ""; + for (let i = 0, ii = displayed.length; i < ii; i++) { + const option = { name: "option", - attributes: { value: g[e] || n[e], style: a }, - value: n[e], + attributes: { + value: values[i] || displayed[i], + style: optionStyle, + }, + value: displayed[i], }; - g[e] === c && (t.attributes.selected = o = !0); - s.push(t); + if (values[i] === value) { + option.attributes.selected = selected = true; + } + children.push(option); } - o || - s.splice(0, 0, { + if (!selected) { + children.splice(0, 0, { name: "option", - attributes: { hidden: !0, selected: !0 }, + attributes: { + hidden: true, + selected: true, + }, value: " ", }); + } } - const r = { + const selectAttributes = { class: ["xfaSelect"], - fieldId: i[nn], - dataId: i[tr]?.[nn] || i[nn], - style: t, - "aria-label": ariaLabel(i), - "aria-required": !1, + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + style, + "aria-label": ariaLabel(field), + "aria-required": false, }; - if (isRequired(i)) { - r["aria-required"] = !0; - r.required = !0; + if (isRequired(field)) { + selectAttributes["aria-required"] = true; + selectAttributes.required = true; + } + if (this.open === "multiSelect") { + selectAttributes.multiple = true; } - "multiSelect" === this.open && (r.multiple = !0); return HTMLResult.success({ name: "label", - attributes: { class: ["xfaLabel"] }, - children: [{ name: "select", children: s, attributes: r }], + attributes: { + class: ["xfaLabel"], + }, + children: [ + { + name: "select", + children, + attributes: selectAttributes, + }, + ], }); } } class Color extends XFAObject { - constructor(e) { - super(Hn, "color", !0); - this.cSpace = getStringOption(e.cSpace, ["SRGB"]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.value = e.value - ? (function getColor(e, t = [0, 0, 0]) { - let [i, a, s] = t; - if (!e) return { r: i, g: a, b: s }; - const r = e - .trim() - .split(/\s*,\s*/) - .map((e) => Math.min(Math.max(0, parseInt(e.trim(), 10)), 255)) - .map((e) => (isNaN(e) ? 0 : e)); - if (r.length < 3) return { r: i, g: a, b: s }; - [i, a, s] = r; - return { r: i, g: a, b: s }; - })(e.value) - : ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "color", true); + this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.value = attributes.value ? getColor(attributes.value) : ""; this.extras = null; } - [wr]() { - return !1; + [$hasSettableValue]() { + return false; } - [rn]() { + [$toStyle]() { return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; } } class Comb extends XFAObject { - constructor(e) { - super(Hn, "comb"); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "comb"); + this.id = attributes.id || ""; this.numberOfCells = getInteger({ - data: e.numberOfCells, + data: attributes.numberOfCells, defaultValue: 0, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Connect extends XFAObject { - constructor(e) { - super(Hn, "connect", !0); - this.connection = e.connection || ""; - this.id = e.id || ""; - this.ref = e.ref || ""; - this.usage = getStringOption(e.usage, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "connect", true); + this.connection = attributes.connection || ""; + this.id = attributes.id || ""; + this.ref = attributes.ref || ""; + this.usage = getStringOption(attributes.usage, [ "exportAndImport", "exportOnly", "importOnly", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.picture = null; } } class ContentArea extends XFAObject { - constructor(e) { - super(Hn, "contentArea", !0); - this.h = getMeasurement(e.h); - this.id = e.id || ""; - this.name = e.name || ""; - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.w = getMeasurement(e.w); - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + constructor(attributes) { + super(TEMPLATE_NS_ID, "contentArea", true); + this.h = getMeasurement(attributes.h); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = getMeasurement(attributes.w); + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.desc = null; this.extras = null; } - [an](e) { - const t = { - left: measureToString(this.x), - top: measureToString(this.y), - width: measureToString(this.w), - height: measureToString(this.h), - }, - i = ["xfaContentarea"]; - isPrintOnly(this) && i.push("xfaPrintOnly"); + [$toHTML](availableSpace) { + const left = measureToString(this.x); + const top = measureToString(this.y); + const style = { + left, + top, + width: measureToString(this.w), + height: measureToString(this.h), + }; + const classNames = ["xfaContentarea"]; + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } return HTMLResult.success({ name: "div", children: [], - attributes: { style: t, class: i, id: this[nn] }, + attributes: { + style, + class: classNames, + id: this[$uid], + }, }); } } class Corner extends XFAObject { - constructor(e) { - super(Hn, "corner", !0); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "corner", true); + this.id = attributes.id || ""; this.inverted = getInteger({ - data: e.inverted, + data: attributes.inverted, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.join = getStringOption(e.join, ["square", "round"]); - this.presence = getStringOption(e.presence, [ + this.join = getStringOption(attributes.join, ["square", "round"]); + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.radius = getMeasurement(e.radius); - this.stroke = getStringOption(e.stroke, [ + this.radius = getMeasurement(attributes.radius); + this.stroke = getStringOption(attributes.stroke, [ "solid", "dashDot", "dashDotDot", @@ -44270,134 +53736,138 @@ class Corner extends XFAObject { "lowered", "raised", ]); - this.thickness = getMeasurement(e.thickness, "0.5pt"); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn]() { - const e = toStyle(this, "visibility"); - e.radius = measureToString("square" === this.join ? 0 : this.radius); - return e; + [$toStyle]() { + const style = toStyle(this, "visibility"); + style.radius = measureToString(this.join === "square" ? 0 : this.radius); + return style; } } class DateElement extends ContentObject { - constructor(e) { - super(Hn, "date"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "date"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = this[er].trim(); - this[er] = e ? new Date(e) : null; + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; } - [an](e) { - return valueToHtml(this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); } } class DateTime extends ContentObject { - constructor(e) { - super(Hn, "dateTime"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTime"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = this[er].trim(); - this[er] = e ? new Date(e) : null; + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; } - [an](e) { - return valueToHtml(this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); } } class DateTimeEdit extends XFAObject { - constructor(e) { - super(Hn, "dateTimeEdit", !0); - this.hScrollPolicy = getStringOption(e.hScrollPolicy, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "dateTimeEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [ "auto", "off", "on", ]); - this.id = e.id || ""; - this.picker = getStringOption(e.picker, ["host", "none"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.picker = 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; } - [an](e) { - const t = toStyle(this, "border", "font", "margin"), - i = this[pr]()[pr](), - a = { - name: "input", - attributes: { - type: "text", - fieldId: i[nn], - dataId: i[tr]?.[nn] || i[nn], - class: ["xfaTextfield"], - style: t, - "aria-label": ariaLabel(i), - "aria-required": !1, - }, - }; - if (isRequired(i)) { - a.attributes["aria-required"] = !0; - a.attributes.required = !0; + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false, + }, + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; } return HTMLResult.success({ name: "label", - attributes: { class: ["xfaLabel"] }, - children: [a], + attributes: { + class: ["xfaLabel"], + }, + children: [html], }); } } class Decimal extends ContentObject { - constructor(e) { - super(Hn, "decimal"); + constructor(attributes) { + super(TEMPLATE_NS_ID, "decimal"); this.fracDigits = getInteger({ - data: e.fracDigits, + data: attributes.fracDigits, defaultValue: 2, - validate: (e) => !0, + validate: (x) => true, }); - this.id = e.id || ""; + this.id = attributes.id || ""; this.leadDigits = getInteger({ - data: e.leadDigits, + data: attributes.leadDigits, defaultValue: -1, - validate: (e) => !0, + validate: (x) => true, }); - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = parseFloat(this[er].trim()); - this[er] = isNaN(e) ? null : e; + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; } - [an](e) { - return valueToHtml(null !== this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml( + this[$content] !== null ? this[$content].toString() : "", + ); } } class DefaultUi extends XFAObject { - constructor(e) { - super(Hn, "defaultUi", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "desc", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "desc", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.boolean = new XFAObjectArray(); this.date = new XFAObjectArray(); this.dateTime = new XFAObjectArray(); @@ -44411,27 +53881,33 @@ class Desc extends XFAObject { } } class DigestMethod extends OptionObject { - constructor(e) { - super(Hn, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "digestMethods", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "digestMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.digestMethod = new XFAObjectArray(); } } class Draw extends XFAObject { - constructor(e) { - super(Hn, "draw", !0); - this.anchorType = getStringOption(e.anchorType, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "draw", true); + this.anchorType = getStringOption(attributes.anchorType, [ "topLeft", "bottomCenter", "bottomLeft", @@ -44443,12 +53919,12 @@ class Draw extends XFAObject { "topRight", ]); this.colSpan = getInteger({ - data: e.colSpan, + data: attributes.colSpan, defaultValue: 1, - validate: (e) => e >= 1 || -1 === e, + validate: (n) => n >= 1 || n === -1, }); - this.h = e.h ? getMeasurement(e.h) : ""; - this.hAlign = getStringOption(e.hAlign, [ + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, [ "left", "center", "justify", @@ -44456,30 +53932,30 @@ class Draw extends XFAObject { "radix", "right", ]); - this.id = e.id || ""; - this.locale = e.locale || ""; - this.maxH = getMeasurement(e.maxH, "0pt"); - this.maxW = getMeasurement(e.maxW, "0pt"); - this.minH = getMeasurement(e.minH, "0pt"); - this.minW = getMeasurement(e.minW, "0pt"); - this.name = e.name || ""; - this.presence = getStringOption(e.presence, [ + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.relevant = getRelevant(e.relevant); + this.relevant = getRelevant(attributes.relevant); this.rotate = getInteger({ - data: e.rotate, + data: attributes.rotate, defaultValue: 0, - validate: (e) => e % 90 == 0, + validate: (x) => x % 90 === 0, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.w = e.w ? getMeasurement(e.w) : ""; - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.assist = null; this.border = null; this.caption = null; @@ -44494,35 +53970,38 @@ class Draw extends XFAObject { this.value = null; this.setProperty = new XFAObjectArray(); } - [$r](e) { - _setValue(this, e); + [$setValue](value) { + _setValue(this, value); } - [an](e) { + [$toHTML](availableSpace) { setTabIndex(this); - if ("hidden" === this.presence || "inactive" === this.presence) + if (this.presence === "hidden" || this.presence === "inactive") { return HTMLResult.EMPTY; + } fixDimensions(this); - this[Wr](); - const t = this.w, - i = this.h, - { w: a, h: s, isBroken: r } = layoutNode(this, e); - if (a && "" === this.w) { - if (r && this[fr]()[Ur]()) { - this[Pr](); + this[$pushPara](); + const savedW = this.w; + const savedH = this.h; + const { w, h, isBroken } = layoutNode(this, availableSpace); + if (w && this.w === "") { + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); return HTMLResult.FAILURE; } - this.w = a; + this.w = w; + } + if (h && this.h === "") { + this.h = h; } - s && "" === this.h && (this.h = s); setFirstUnsplittable(this); - if (!checkDimensions(this, e)) { - this.w = t; - this.h = i; - this[Pr](); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); return HTMLResult.FAILURE; } unsetFirstUnsplittable(this); - const n = toStyle( + const style = toStyle( this, "font", "hAlign", @@ -44534,46 +54013,60 @@ class Draw extends XFAObject { "border", "margin", ); - setMinMaxDimensions(this, n); - if (n.margin) { - n.padding = n.margin; - delete n.margin; + setMinMaxDimensions(this, style); + if (style.margin) { + style.padding = style.margin; + delete style.margin; } - const g = ["xfaDraw"]; - this.font && g.push("xfaFont"); - isPrintOnly(this) && g.push("xfaPrintOnly"); - const o = { style: n, id: this[nn], class: g }; - this.name && (o.xfaName = this.name); - const c = { name: "div", attributes: o, children: [] }; - applyAssist(this, o); - const C = computeBbox(this, c, e), - h = this.value ? this.value[an](e).html : null; - if (null === h) { - this.w = t; - this.h = i; - this[Pr](); - return HTMLResult.success(createWrapper(this, c), C); + const classNames = ["xfaDraw"]; + if (this.font) { + classNames.push("xfaFont"); } - c.children.push(h); - setPara(this, n, h); - this.w = t; - this.h = i; - this[Pr](); - return HTMLResult.success(createWrapper(this, c), C); + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + const attributes = { + style, + id: this[$uid], + class: classNames, + }; + if (this.name) { + attributes.xfaName = this.name; + } + const html = { + name: "div", + attributes, + children: [], + }; + applyAssist(this, attributes); + const bbox = computeBbox(this, html, availableSpace); + const value = this.value ? this.value[$toHTML](availableSpace).html : null; + if (value === null) { + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); + } + html.children.push(value); + setPara(this, style, value); + this.w = savedW; + this.h = savedH; + this[$popPara](); + return HTMLResult.success(createWrapper(this, html), bbox); } } class Edge extends XFAObject { - constructor(e) { - super(Hn, "edge", !0); - this.cap = getStringOption(e.cap, ["square", "butt", "round"]); - this.id = e.id || ""; - this.presence = getStringOption(e.presence, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "edge", true); + this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.stroke = getStringOption(e.stroke, [ + this.stroke = getStringOption(attributes.stroke, [ "solid", "dashDot", "dashDotDot", @@ -44584,130 +54077,140 @@ class Edge extends XFAObject { "lowered", "raised", ]); - this.thickness = getMeasurement(e.thickness, "0.5pt"); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.thickness = getMeasurement(attributes.thickness, "0.5pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn]() { - const e = toStyle(this, "visibility"); - Object.assign(e, { + [$toStyle]() { + const style = toStyle(this, "visibility"); + Object.assign(style, { linecap: this.cap, width: measureToString(this.thickness), - color: this.color ? this.color[rn]() : "#000000", + color: this.color ? this.color[$toStyle]() : "#000000", style: "", }); - if ("visible" !== this.presence) e.style = "none"; - else + if (this.presence !== "visible") { + style.style = "none"; + } else { switch (this.stroke) { case "solid": - e.style = "solid"; + style.style = "solid"; break; case "dashDot": + style.style = "dashed"; + break; case "dashDotDot": + style.style = "dashed"; + break; case "dashed": - e.style = "dashed"; + style.style = "dashed"; break; case "dotted": - e.style = "dotted"; + style.style = "dotted"; break; case "embossed": - e.style = "ridge"; + style.style = "ridge"; break; case "etched": - e.style = "groove"; + style.style = "groove"; break; case "lowered": - e.style = "inset"; + style.style = "inset"; break; case "raised": - e.style = "outset"; + style.style = "outset"; + break; } - return e; + } + return style; } } class Encoding extends OptionObject { - constructor(e) { - super(Hn, "encoding", [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "encoding", [ "adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1", ]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Encodings extends XFAObject { - constructor(e) { - super(Hn, "encodings", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "encodings", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.encoding = new XFAObjectArray(); } } class Encrypt extends XFAObject { - constructor(e) { - super(Hn, "encrypt", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "encryptData", !0); - this.id = e.id || ""; - this.operation = getStringOption(e.operation, ["encrypt", "decrypt"]); - this.target = e.target || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptData", true); + this.id = attributes.id || ""; + this.operation = 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 XFAObject { - constructor(e) { - super(Hn, "encryption", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryption", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.certificate = new XFAObjectArray(); } } class EncryptionMethod extends OptionObject { - constructor(e) { - super(Hn, "encryptionMethod", [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethod", [ "", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC", ]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class EncryptionMethods extends XFAObject { - constructor(e) { - super(Hn, "encryptionMethods", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "encryptionMethods", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.encryptionMethod = new XFAObjectArray(); } } class Event extends XFAObject { - constructor(e) { - super(Hn, "event", !0); - this.activity = getStringOption(e.activity, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "event", true); + this.activity = getStringOption(attributes.activity, [ "click", "change", "docClose", @@ -44736,12 +54239,15 @@ class Event extends XFAObject { "ready", "validationState", ]); - this.id = e.id || ""; - this.listen = getStringOption(e.listen, ["refOnly", "refAndDescendents"]); - this.name = e.name || ""; - this.ref = e.ref || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.listen = 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; @@ -44751,57 +54257,61 @@ class Event extends XFAObject { } } class ExData extends ContentObject { - constructor(e) { - super(Hn, "exData"); - this.contentType = e.contentType || ""; - this.href = e.href || ""; - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "exData"); + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; this.maxLength = getInteger({ - data: e.maxLength, + data: attributes.maxLength, defaultValue: -1, - validate: (e) => e >= -1, + validate: (x) => x >= -1, }); - this.name = e.name || ""; - this.rid = e.rid || ""; - this.transferEncoding = getStringOption(e.transferEncoding, [ + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, [ "none", "base64", "package", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [Sr]() { - return "text/html" === this.contentType; + [$isCDATAXml]() { + return this.contentType === "text/html"; } - [Kr](e) { - if ("text/html" === this.contentType && e[Jr] === on.xhtml.id) { - this[er] = e; - return !0; + [$onChild](child) { + if ( + this.contentType === "text/html" && + child[$namespaceId] === NamespaceIds.xhtml.id + ) { + this[$content] = child; + return true; } - if ("text/xml" === this.contentType) { - this[er] = e; - return !0; + if (this.contentType === "text/xml") { + this[$content] = child; + return true; } - return !1; + return false; } - [an](e) { - return "text/html" === this.contentType && this[er] - ? this[er][an](e) - : HTMLResult.EMPTY; + [$toHTML](availableSpace) { + if (this.contentType !== "text/html" || !this[$content]) { + return HTMLResult.EMPTY; + } + return this[$content][$toHTML](availableSpace); } } class ExObject extends XFAObject { - constructor(e) { - super(Hn, "exObject", !0); - this.archive = e.archive || ""; - this.classId = e.classId || ""; - this.codeBase = e.codeBase || ""; - this.codeType = e.codeType || ""; - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObjectArray(); this.date = new XFAObjectArray(); @@ -44817,16 +54327,16 @@ class ExObject extends XFAObject { } } class ExclGroup extends XFAObject { - constructor(e) { - super(Hn, "exclGroup", !0); - this.access = getStringOption(e.access, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "exclGroup", true); + this.access = getStringOption(attributes.access, [ "open", "nonInteractive", "protected", "readOnly", ]); - this.accessKey = e.accessKey || ""; - this.anchorType = getStringOption(e.anchorType, [ + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, [ "topLeft", "bottomCenter", "bottomLeft", @@ -44838,12 +54348,12 @@ class ExclGroup extends XFAObject { "topRight", ]); this.colSpan = getInteger({ - data: e.colSpan, + data: attributes.colSpan, defaultValue: 1, - validate: (e) => e >= 1 || -1 === e, + validate: (n) => n >= 1 || n === -1, }); - this.h = e.h ? getMeasurement(e.h) : ""; - this.hAlign = getStringOption(e.hAlign, [ + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, [ "left", "center", "justify", @@ -44851,8 +54361,8 @@ class ExclGroup extends XFAObject { "radix", "right", ]); - this.id = e.id || ""; - this.layout = getStringOption(e.layout, [ + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, [ "position", "lr-tb", "rl-row", @@ -44861,23 +54371,23 @@ class ExclGroup extends XFAObject { "table", "tb", ]); - this.maxH = getMeasurement(e.maxH, "0pt"); - this.maxW = getMeasurement(e.maxW, "0pt"); - this.minH = getMeasurement(e.minH, "0pt"); - this.minW = getMeasurement(e.minW, "0pt"); - this.name = e.name || ""; - this.presence = getStringOption(e.presence, [ + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.w = e.w ? getMeasurement(e.w) : ""; - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.assist = null; this.bind = null; this.border = null; @@ -44894,170 +54404,218 @@ class ExclGroup extends XFAObject { this.field = new XFAObjectArray(); this.setProperty = new XFAObjectArray(); } - [kr]() { - return !0; + [$isBindable]() { + return true; } - [wr]() { - return !0; + [$hasSettableValue]() { + return true; } - [$r](e) { - for (const t of this.field.children) { - if (!t.value) { - const e = new Value({}); - t[Xs](e); - t.value = e; + [$setValue](value) { + for (const field of this.field.children) { + if (!field.value) { + const nodeValue = new Value({}); + field[$appendChild](nodeValue); + field.value = nodeValue; } - t.value[$r](e); + field.value[$setValue](value); } } - [Ur]() { + [$isThereMoreWidth]() { return ( (this.layout.endsWith("-tb") && - 0 === this[ar].attempt && - this[ar].numberInLine > 0) || - this[pr]()[Ur]() + this[$extra].attempt === 0 && + this[$extra].numberInLine > 0) || + this[$getParent]()[$isThereMoreWidth]() ); } - [xr]() { - const e = this[fr](); - if (!e[xr]()) return !1; - if (void 0 !== this[ar]._isSplittable) return this[ar]._isSplittable; - if ("position" === this.layout || this.layout.includes("row")) { - this[ar]._isSplittable = !1; - return !1; + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; } - if (e.layout?.endsWith("-tb") && 0 !== e[ar].numberInLine) return !1; - this[ar]._isSplittable = !0; - return !0; + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; + } + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; } - [rr]() { + [$flushHTML]() { return flushHTML(this); } - [js](e, t) { - addHTML(this, e, t); + [$addHTML](html, bbox) { + addHTML(this, html, bbox); } - [or]() { + [$getAvailableSpace]() { return getAvailableSpace(this); } - [an](e) { + [$toHTML](availableSpace) { setTabIndex(this); if ( - "hidden" === this.presence || - "inactive" === this.presence || - 0 === this.h || - 0 === this.w - ) + this.presence === "hidden" || + this.presence === "inactive" || + this.h === 0 || + this.w === 0 + ) { return HTMLResult.EMPTY; + } fixDimensions(this); - const t = [], - i = { id: this[nn], class: [] }; - setAccess(this, i.class); - this[ar] || (this[ar] = Object.create(null)); - Object.assign(this[ar], { - children: t, - attributes: i, + const children = []; + const attributes = { + id: this[$uid], + class: [], + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, + attributes, attempt: 0, line: null, numberInLine: 0, availableSpace: { - width: Math.min(this.w || 1 / 0, e.width), - height: Math.min(this.h || 1 / 0, e.height), + 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 a = this[xr](); - a || setFirstUnsplittable(this); - if (!checkDimensions(this, e)) return HTMLResult.FAILURE; - const s = new Set(["field"]); + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set(["field"]); if (this.layout.includes("row")) { - const e = this[fr]().columnWidths; - if (Array.isArray(e) && e.length > 0) { - this[ar].columnWidths = e; - this[ar].currentColumn = 0; + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; } } - const r = toStyle( - this, - "anchorType", - "dimensions", - "position", - "presence", - "border", - "margin", - "hAlign", - ), - n = ["xfaExclgroup"], - g = layoutClass(this); - g && n.push(g); - isPrintOnly(this) && n.push("xfaPrintOnly"); - i.style = r; - i.class = n; - this.name && (i.xfaName = this.name); - this[Wr](); - const o = "lr-tb" === this.layout || "rl-tb" === this.layout, - c = o ? 2 : 1; - for (; this[ar].attempt < c; this[ar].attempt++) { - o && 1 === this[ar].attempt && (this[ar].numberInLine = 0); - const e = this[Zs]({ filter: s, include: !0 }); - if (e.success) break; - if (e.isBreak()) { - this[Pr](); - return e; + const style = toStyle( + this, + "anchorType", + "dimensions", + "position", + "presence", + "border", + "margin", + "hAlign", + ); + const classNames = ["xfaExclgroup"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true, + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; } if ( - o && - 0 === this[ar].attempt && - 0 === this[ar].numberInLine && - !this[mr]()[ar].noLayoutFailure + isLrTb && + this[$extra].attempt === 0 && + this[$extra].numberInLine === 0 && + !this[$getTemplateRoot]()[$extra].noLayoutFailure ) { - this[ar].attempt = c; + this[$extra].attempt = maxRun; break; } } - this[Pr](); - a || unsetFirstUnsplittable(this); - if (this[ar].attempt === c) { - a || delete this[ar]; + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + if (this[$extra].attempt === maxRun) { + if (!isSplittable) { + delete this[$extra]; + } return HTMLResult.FAILURE; } - let C = 0, - h = 0; + let marginH = 0; + let marginV = 0; if (this.margin) { - C = this.margin.leftInset + this.margin.rightInset; - h = this.margin.topInset + this.margin.bottomInset; + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; } - const l = Math.max(this[ar].width + C, this.w || 0), - Q = Math.max(this[ar].height + h, this.h || 0), - E = [this.x, this.y, l, Q]; - "" === this.w && (r.width = measureToString(l)); - "" === this.h && (r.height = measureToString(Q)); - const u = { name: "div", attributes: i, children: t }; - applyAssist(this, i); - delete this[ar]; - return HTMLResult.success(createWrapper(this, u), E); + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + const html = { + name: "div", + attributes, + children, + }; + applyAssist(this, attributes); + delete this[$extra]; + return HTMLResult.success(createWrapper(this, html), bbox); } } class Execute extends XFAObject { - constructor(e) { - super(Hn, "execute"); - this.connection = e.connection || ""; - this.executeType = getStringOption(e.executeType, ["import", "remerge"]); - this.id = e.id || ""; - this.runAt = getStringOption(e.runAt, ["client", "both", "server"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "execute"); + this.connection = attributes.connection || ""; + this.executeType = getStringOption(attributes.executeType, [ + "import", + "remerge", + ]); + this.id = attributes.id || ""; + this.runAt = getStringOption(attributes.runAt, [ + "client", + "both", + "server", + ]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Extras extends XFAObject { - constructor(e) { - super(Hn, "extras", !0); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObjectArray(); this.date = new XFAObjectArray(); this.dateTime = new XFAObjectArray(); @@ -45072,16 +54630,16 @@ class Extras extends XFAObject { } } class Field extends XFAObject { - constructor(e) { - super(Hn, "field", !0); - this.access = getStringOption(e.access, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "field", true); + this.access = getStringOption(attributes.access, [ "open", "nonInteractive", "protected", "readOnly", ]); - this.accessKey = e.accessKey || ""; - this.anchorType = getStringOption(e.anchorType, [ + this.accessKey = attributes.accessKey || ""; + this.anchorType = getStringOption(attributes.anchorType, [ "topLeft", "bottomCenter", "bottomLeft", @@ -45093,12 +54651,12 @@ class Field extends XFAObject { "topRight", ]); this.colSpan = getInteger({ - data: e.colSpan, + data: attributes.colSpan, defaultValue: 1, - validate: (e) => e >= 1 || -1 === e, + validate: (n) => n >= 1 || n === -1, }); - this.h = e.h ? getMeasurement(e.h) : ""; - this.hAlign = getStringOption(e.hAlign, [ + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, [ "left", "center", "justify", @@ -45106,30 +54664,30 @@ class Field extends XFAObject { "radix", "right", ]); - this.id = e.id || ""; - this.locale = e.locale || ""; - this.maxH = getMeasurement(e.maxH, "0pt"); - this.maxW = getMeasurement(e.maxW, "0pt"); - this.minH = getMeasurement(e.minH, "0pt"); - this.minW = getMeasurement(e.minW, "0pt"); - this.name = e.name || ""; - this.presence = getStringOption(e.presence, [ + this.id = attributes.id || ""; + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.relevant = getRelevant(e.relevant); + this.relevant = getRelevant(attributes.relevant); this.rotate = getInteger({ - data: e.rotate, + data: attributes.rotate, defaultValue: 0, - validate: (e) => e % 90 == 0, + validate: (x) => x % 90 === 0, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.w = e.w ? getMeasurement(e.w) : ""; - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.assist = null; this.bind = null; this.border = null; @@ -45152,135 +54710,128 @@ class Field extends XFAObject { this.event = new XFAObjectArray(); this.setProperty = new XFAObjectArray(); } - [kr]() { - return !0; + [$isBindable]() { + return true; } - [$r](e) { - _setValue(this, e); + [$setValue](value) { + _setValue(this, value); } - [an](e) { + [$toHTML](availableSpace) { setTabIndex(this); if (!this.ui) { this.ui = new Ui({}); - this.ui[yr] = this[yr]; - this[Xs](this.ui); - let e; + this.ui[$globalData] = this[$globalData]; + this[$appendChild](this.ui); + let node; switch (this.items.children.length) { case 0: - e = new TextEdit({}); - this.ui.textEdit = e; + node = new TextEdit({}); + this.ui.textEdit = node; break; case 1: - e = new CheckButton({}); - this.ui.checkButton = e; + node = new CheckButton({}); + this.ui.checkButton = node; break; case 2: - e = new ChoiceList({}); - this.ui.choiceList = e; + node = new ChoiceList({}); + this.ui.choiceList = node; + break; } - this.ui[Xs](e); + this.ui[$appendChild](node); } if ( !this.ui || - "hidden" === this.presence || - "inactive" === this.presence || - 0 === this.h || - 0 === this.w - ) + this.presence === "hidden" || + this.presence === "inactive" || + this.h === 0 || + this.w === 0 + ) { return HTMLResult.EMPTY; - this.caption && delete this.caption[ar]; - this[Wr](); - const t = this.caption ? this.caption[an](e).html : null, - i = this.w, - a = this.h; - let s = 0, - r = 0; - if (this.margin) { - s = this.margin.leftInset + this.margin.rightInset; - r = this.margin.topInset + this.margin.bottomInset; } - let n = null; - if ("" === this.w || "" === this.h) { - let t = null, - i = null, - a = 0, - g = 0; - if (this.ui.checkButton) a = g = this.ui.checkButton.size; - else { - const { w: t, h: i } = layoutNode(this, e); - if (null !== t) { - a = t; - g = i; - } else - g = (function fonts_getMetrics(e, t = !1) { - let i = null; - if (e) { - const t = stripQuotes(e.typeface), - a = e[yr].fontFinder.find(t); - i = selectFont(e, a); - } - if (!i) return { lineHeight: 12, lineGap: 2, lineNoGap: 10 }; - const a = e.size || 10, - s = i.lineHeight ? Math.max(t ? 0 : 1.2, i.lineHeight) : 1.2, - r = void 0 === i.lineGap ? 0.2 : i.lineGap; - return { - lineHeight: s * a, - lineGap: r * a, - lineNoGap: Math.max(1, s - r) * a, - }; - })(this.font, !0).lineNoGap; + if (this.caption) { + delete this.caption[$extra]; + } + this[$pushPara](); + const caption = this.caption + ? this.caption[$toHTML](availableSpace).html + : null; + const savedW = this.w; + const savedH = 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 borderDims = null; + if (this.w === "" || this.h === "") { + let width = null; + let height = null; + let uiW = 0; + let uiH = 0; + if (this.ui.checkButton) { + uiW = uiH = this.ui.checkButton.size; + } else { + const { w, h } = layoutNode(this, availableSpace); + if (w !== null) { + uiW = w; + uiH = h; + } else { + uiH = fonts_getMetrics(this.font, true).lineNoGap; + } } - n = getBorderDims(this.ui[lr]()); - a += n.w; - g += n.h; + borderDims = getBorderDims(this.ui[$getExtra]()); + uiW += borderDims.w; + uiH += borderDims.h; if (this.caption) { - const { w: s, h: r, isBroken: n } = this.caption[lr](e); - if (n && this[fr]()[Ur]()) { - this[Pr](); + const { w, h, isBroken } = this.caption[$getExtra](availableSpace); + if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { + this[$popPara](); return HTMLResult.FAILURE; } - t = s; - i = r; + width = w; + height = h; switch (this.caption.placement) { case "left": case "right": case "inline": - t += a; + width += uiW; break; case "top": case "bottom": - i += g; + height += uiH; + break; } } else { - t = a; - i = g; + width = uiW; + height = uiH; } - if (t && "" === this.w) { - t += s; + if (width && this.w === "") { + width += marginH; this.w = Math.min( - this.maxW <= 0 ? 1 / 0 : this.maxW, - this.minW + 1 < t ? t : this.minW, + this.maxW <= 0 ? Infinity : this.maxW, + this.minW + 1 < width ? width : this.minW, ); } - if (i && "" === this.h) { - i += r; + if (height && this.h === "") { + height += marginV; this.h = Math.min( - this.maxH <= 0 ? 1 / 0 : this.maxH, - this.minH + 1 < i ? i : this.minH, + this.maxH <= 0 ? Infinity : this.maxH, + this.minH + 1 < height ? height : this.minH, ); } } - this[Pr](); + this[$popPara](); fixDimensions(this); setFirstUnsplittable(this); - if (!checkDimensions(this, e)) { - this.w = i; - this.h = a; - this[Pr](); + if (!checkDimensions(this, availableSpace)) { + this.w = savedW; + this.h = savedH; + this[$popPara](); return HTMLResult.FAILURE; } unsetFirstUnsplittable(this); - const g = toStyle( + const style = toStyle( this, "font", "dimensions", @@ -45291,118 +54842,167 @@ class Field extends XFAObject { "margin", "hAlign", ); - setMinMaxDimensions(this, g); - const o = ["xfaField"]; - this.font && o.push("xfaFont"); - isPrintOnly(this) && o.push("xfaPrintOnly"); - const c = { style: g, id: this[nn], class: o }; - if (g.margin) { - g.padding = g.margin; - delete g.margin; + setMinMaxDimensions(this, style); + const classNames = ["xfaField"]; + if (this.font) { + classNames.push("xfaFont"); } - setAccess(this, o); - this.name && (c.xfaName = this.name); - const C = [], - h = { name: "div", attributes: c, children: C }; - applyAssist(this, c); - const l = this.border ? this.border[rn]() : null, - Q = computeBbox(this, h, e), - E = this.ui[an]().html; - if (!E) { - Object.assign(g, l); - return HTMLResult.success(createWrapper(this, h), Q); + if (isPrintOnly(this)) { + classNames.push("xfaPrintOnly"); } - this[An] && - (E.children?.[0] - ? (E.children[0].attributes.tabindex = this[An]) - : (E.attributes.tabindex = this[An])); - E.attributes.style || (E.attributes.style = Object.create(null)); - let u = null; + const attributes = { + style, + id: this[$uid], + class: classNames, + }; + if (style.margin) { + style.padding = style.margin; + delete style.margin; + } + setAccess(this, classNames); + if (this.name) { + attributes.xfaName = this.name; + } + const children = []; + const html = { + name: "div", + attributes, + children, + }; + applyAssist(this, attributes); + const borderStyle = this.border ? this.border[$toStyle]() : null; + const bbox = computeBbox(this, html, availableSpace); + const ui = this.ui[$toHTML]().html; + if (!ui) { + Object.assign(style, borderStyle); + return HTMLResult.success(createWrapper(this, html), bbox); + } + if (this[$tabIndex]) { + if (ui.children?.[0]) { + ui.children[0].attributes.tabindex = this[$tabIndex]; + } else { + ui.attributes.tabindex = this[$tabIndex]; + } + } + if (!ui.attributes.style) { + ui.attributes.style = Object.create(null); + } + let aElement = null; if (this.ui.button) { - 1 === E.children.length && ([u] = E.children.splice(0, 1)); - Object.assign(E.attributes.style, l); - } else Object.assign(g, l); - C.push(E); - if (this.value) - if (this.ui.imageEdit) E.children.push(this.value[an]().html); - else if (!this.ui.button) { - let e = ""; - if (this.value.exData) e = this.value.exData[en](); - else if (this.value.text) e = this.value.text[lr](); - else { - const t = this.value[an]().html; - null !== t && (e = t.children[0].value); - } - this.ui.textEdit && - this.value.text?.maxChars && - (E.children[0].attributes.maxLength = this.value.text.maxChars); - if (e) { - if (this.ui.numericEdit) { - e = parseFloat(e); - e = isNaN(e) ? "" : e.toString(); + if (ui.children.length === 1) { + [aElement] = ui.children.splice(0, 1); + } + 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[$toHTML]().html); + } else if (!this.ui.button) { + let value = ""; + if (this.value.exData) { + value = this.value.exData[$text](); + } else if (this.value.text) { + value = this.value.text[$getExtra](); + } else { + const htmlValue = this.value[$toHTML]().html; + if (htmlValue !== null) { + value = htmlValue.children[0].value; + } + } + if (this.ui.textEdit && this.value.text?.maxChars) { + ui.children[0].attributes.maxLength = this.value.text.maxChars; + } + if (value) { + if (this.ui.numericEdit) { + value = parseFloat(value); + value = isNaN(value) ? "" : value.toString(); + } + if (ui.children[0].name === "textarea") { + ui.children[0].attributes.textContent = value; + } else { + ui.children[0].attributes.value = value; } - "textarea" === E.children[0].name - ? (E.children[0].attributes.textContent = e) - : (E.children[0].attributes.value = e); } } - if (!this.ui.imageEdit && E.children?.[0] && this.h) { - n = n || getBorderDims(this.ui[lr]()); - let t = 0; - if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { - t = this.caption.reserve; - t <= 0 && (t = this.caption[lr](e).h); - const i = this.h - t - r - n.h; - E.children[0].attributes.style.height = measureToString(i); - } else E.children[0].attributes.style.height = "100%"; } - u && E.children.push(u); - if (!t) { - E.attributes.class && E.attributes.class.push("xfaLeft"); - this.w = i; - this.h = a; - return HTMLResult.success(createWrapper(this, h), Q); + if (!this.ui.imageEdit && ui.children?.[0] && this.h) { + borderDims = borderDims || getBorderDims(this.ui[$getExtra]()); + let captionHeight = 0; + if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { + captionHeight = this.caption.reserve; + if (captionHeight <= 0) { + captionHeight = this.caption[$getExtra](availableSpace).h; + } + const inputHeight = this.h - captionHeight - marginV - borderDims.h; + ui.children[0].attributes.style.height = measureToString(inputHeight); + } else { + ui.children[0].attributes.style.height = "100%"; + } + } + if (aElement) { + ui.children.push(aElement); + } + if (!caption) { + if (ui.attributes.class) { + ui.attributes.class.push("xfaLeft"); + } + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); } if (this.ui.button) { - g.padding && delete g.padding; - "div" === t.name && (t.name = "span"); - E.children.push(t); - return HTMLResult.success(h, Q); + if (style.padding) { + delete style.padding; + } + if (caption.name === "div") { + caption.name = "span"; + } + ui.children.push(caption); + return HTMLResult.success(html, bbox); + } else if (this.ui.checkButton) { + caption.attributes.class[0] = "xfaCaptionForCheckButton"; } - this.ui.checkButton && (t.attributes.class[0] = "xfaCaptionForCheckButton"); - E.attributes.class || (E.attributes.class = []); - E.children.splice(0, 0, t); + if (!ui.attributes.class) { + ui.attributes.class = []; + } + ui.children.splice(0, 0, caption); switch (this.caption.placement) { case "left": - case "inline": - E.attributes.class.push("xfaLeft"); + ui.attributes.class.push("xfaLeft"); break; case "right": - E.attributes.class.push("xfaRight"); + ui.attributes.class.push("xfaRight"); break; case "top": - E.attributes.class.push("xfaTop"); + ui.attributes.class.push("xfaTop"); break; case "bottom": - E.attributes.class.push("xfaBottom"); + ui.attributes.class.push("xfaBottom"); + break; + case "inline": + ui.attributes.class.push("xfaLeft"); + break; } - this.w = i; - this.h = a; - return HTMLResult.success(createWrapper(this, h), Q); + this.w = savedW; + this.h = savedH; + return HTMLResult.success(createWrapper(this, html), bbox); } } class Fill extends XFAObject { - constructor(e) { - super(Hn, "fill", !0); - this.id = e.id || ""; - this.presence = getStringOption(e.presence, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "fill", true); + this.id = attributes.id || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; this.linear = null; @@ -45411,53 +55011,62 @@ class Fill extends XFAObject { this.solid = null; this.stipple = null; } - [rn]() { - const e = this[pr](), - t = e[pr]()[pr](), - i = Object.create(null); - let a = "color", - s = a; - if (e instanceof Border) { - a = "background-color"; - s = "background"; - t instanceof Ui && (i.backgroundColor = "white"); + [$toStyle]() { + const parent = this[$getParent](); + const grandpa = parent[$getParent](); + const ggrandpa = grandpa[$getParent](); + const style = Object.create(null); + let propName = "color"; + let altPropName = propName; + if (parent instanceof Border) { + propName = "background-color"; + altPropName = "background"; + if (ggrandpa instanceof Ui) { + style.backgroundColor = "white"; + } } - if (e instanceof Rectangle || e instanceof Arc) { - a = s = "fill"; - i.fill = "white"; + if (parent instanceof Rectangle || parent instanceof Arc) { + propName = altPropName = "fill"; + style.fill = "white"; } - for (const e of Object.getOwnPropertyNames(this)) { - if ("extras" === e || "color" === e) continue; - const t = this[e]; - if (!(t instanceof XFAObject)) continue; - const r = t[rn](this.color); - r && (i[r.startsWith("#") ? a : s] = r); - return i; + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "color") { + continue; + } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + const color = obj[$toStyle](this.color); + if (color) { + style[color.startsWith("#") ? propName : altPropName] = color; + } + return style; } if (this.color?.value) { - const e = this.color[rn](); - i[e.startsWith("#") ? a : s] = e; + const color = this.color[$toStyle](); + style[color.startsWith("#") ? propName : altPropName] = color; } - return i; + return style; } } class Filter extends XFAObject { - constructor(e) { - super(Hn, "filter", !0); - this.addRevocationInfo = getStringOption(e.addRevocationInfo, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "filter", true); + this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, [ "", "required", "optional", "none", ]); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.version = getInteger({ data: this.version, defaultValue: 5, - validate: (e) => e >= 1 && e <= 5, + validate: (x) => x >= 1 && x <= 5, }); this.appearanceFilter = null; this.certificates = null; @@ -45472,290 +55081,342 @@ class Filter extends XFAObject { } } class Float extends ContentObject { - constructor(e) { - super(Hn, "float"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "float"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = parseFloat(this[er].trim()); - this[er] = isNaN(e) ? null : e; + [$finalize]() { + const number = parseFloat(this[$content].trim()); + this[$content] = isNaN(number) ? null : number; } - [an](e) { - return valueToHtml(null !== this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml( + this[$content] !== null ? this[$content].toString() : "", + ); } } class template_Font extends XFAObject { - constructor(e) { - super(Hn, "font", !0); - this.baselineShift = getMeasurement(e.baselineShift); + constructor(attributes) { + super(TEMPLATE_NS_ID, "font", true); + this.baselineShift = getMeasurement(attributes.baselineShift); this.fontHorizontalScale = getFloat({ - data: e.fontHorizontalScale, + data: attributes.fontHorizontalScale, defaultValue: 100, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); this.fontVerticalScale = getFloat({ - data: e.fontVerticalScale, + data: attributes.fontVerticalScale, defaultValue: 100, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.id = e.id || ""; - this.kerningMode = getStringOption(e.kerningMode, ["none", "pair"]); - this.letterSpacing = getMeasurement(e.letterSpacing, "0"); + this.id = attributes.id || ""; + this.kerningMode = getStringOption(attributes.kerningMode, [ + "none", + "pair", + ]); + this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); this.lineThrough = getInteger({ - data: e.lineThrough, + data: attributes.lineThrough, defaultValue: 0, - validate: (e) => 1 === e || 2 === e, + validate: (x) => x === 1 || x === 2, }); - this.lineThroughPeriod = getStringOption(e.lineThroughPeriod, [ + this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, [ "all", "word", ]); this.overline = getInteger({ - data: e.overline, + data: attributes.overline, defaultValue: 0, - validate: (e) => 1 === e || 2 === e, + validate: (x) => x === 1 || x === 2, }); - this.overlinePeriod = getStringOption(e.overlinePeriod, ["all", "word"]); - this.posture = getStringOption(e.posture, ["normal", "italic"]); - this.size = getMeasurement(e.size, "10pt"); - this.typeface = e.typeface || "Courier"; + this.overlinePeriod = getStringOption(attributes.overlinePeriod, [ + "all", + "word", + ]); + this.posture = getStringOption(attributes.posture, ["normal", "italic"]); + this.size = getMeasurement(attributes.size, "10pt"); + this.typeface = attributes.typeface || "Courier"; this.underline = getInteger({ - data: e.underline, + data: attributes.underline, defaultValue: 0, - validate: (e) => 1 === e || 2 === e, + validate: (x) => x === 1 || x === 2, }); - this.underlinePeriod = getStringOption(e.underlinePeriod, ["all", "word"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.weight = getStringOption(e.weight, ["normal", "bold"]); + this.underlinePeriod = getStringOption(attributes.underlinePeriod, [ + "all", + "word", + ]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.weight = getStringOption(attributes.weight, ["normal", "bold"]); this.extras = null; this.fill = null; } - [Vs](e) { - super[Vs](e); - this[yr].usedTypefaces.add(this.typeface); + [$clean](builder) { + super[$clean](builder); + this[$globalData].usedTypefaces.add(this.typeface); } - [rn]() { - const e = toStyle(this, "fill"), - t = e.color; - if (t) - if ("#000000" === t) delete e.color; - else if (!t.startsWith("#")) { - e.background = t; - e.backgroundClip = "text"; - e.color = "transparent"; + [$toStyle]() { + const style = 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"; } - this.baselineShift && - (e.verticalAlign = measureToString(this.baselineShift)); - e.fontKerning = "none" === this.kerningMode ? "none" : "normal"; - e.letterSpacing = measureToString(this.letterSpacing); - if (0 !== this.lineThrough) { - e.textDecoration = "line-through"; - 2 === this.lineThrough && (e.textDecorationStyle = "double"); } - if (0 !== this.overline) { - e.textDecoration = "overline"; - 2 === this.overline && (e.textDecorationStyle = "double"); + if (this.baselineShift) { + style.verticalAlign = measureToString(this.baselineShift); } - e.fontStyle = this.posture; - e.fontSize = measureToString(0.99 * this.size); - setFontFamily(this, this, this[yr].fontFinder, e); - if (0 !== this.underline) { - e.textDecoration = "underline"; - 2 === this.underline && (e.textDecorationStyle = "double"); + style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; + style.letterSpacing = measureToString(this.letterSpacing); + if (this.lineThrough !== 0) { + style.textDecoration = "line-through"; + if (this.lineThrough === 2) { + style.textDecorationStyle = "double"; + } } - e.fontWeight = this.weight; - return e; + if (this.overline !== 0) { + style.textDecoration = "overline"; + if (this.overline === 2) { + style.textDecorationStyle = "double"; + } + } + style.fontStyle = this.posture; + style.fontSize = measureToString(0.99 * this.size); + setFontFamily(this, this, this[$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 XFAObject { - constructor(e) { - super(Hn, "format", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(Hn, "handler"); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "handler"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Hyphenation extends XFAObject { - constructor(e) { - super(Hn, "hyphenation"); + constructor(attributes) { + super(TEMPLATE_NS_ID, "hyphenation"); this.excludeAllCaps = getInteger({ - data: e.excludeAllCaps, + data: attributes.excludeAllCaps, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); this.excludeInitialCap = getInteger({ - data: e.excludeInitialCap, + data: attributes.excludeInitialCap, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); this.hyphenate = getInteger({ - data: e.hyphenate, + data: attributes.hyphenate, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.id = e.id || ""; + this.id = attributes.id || ""; this.pushCharacterCount = getInteger({ - data: e.pushCharacterCount, + data: attributes.pushCharacterCount, defaultValue: 3, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); this.remainCharacterCount = getInteger({ - data: e.remainCharacterCount, + data: attributes.remainCharacterCount, defaultValue: 3, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.wordCharacterCount = getInteger({ - data: e.wordCharacterCount, + data: attributes.wordCharacterCount, defaultValue: 7, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); } } class Image extends StringObject { - constructor(e) { - super(Hn, "image"); - this.aspect = getStringOption(e.aspect, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "image"); + this.aspect = getStringOption(attributes.aspect, [ "fit", "actual", "height", "none", "width", ]); - this.contentType = e.contentType || ""; - this.href = e.href || ""; - this.id = e.id || ""; - this.name = e.name || ""; - this.transferEncoding = getStringOption(e.transferEncoding, [ + this.contentType = attributes.contentType || ""; + this.href = attributes.href || ""; + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.transferEncoding = getStringOption(attributes.transferEncoding, [ "base64", "none", "package", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [an]() { - if (this.contentType && !vn.has(this.contentType.toLowerCase())) + [$toHTML]() { + if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { return HTMLResult.EMPTY; - let e = this[yr].images && this[yr].images.get(this.href); - if (!e && (this.href || !this[er])) return HTMLResult.EMPTY; - e || - "base64" !== this.transferEncoding || - (e = stringToBytes(atob(this[er]))); - if (!e) return HTMLResult.EMPTY; + } + let buffer = + this[$globalData].images && this[$globalData].images.get(this.href); + if (!buffer && (this.href || !this[$content])) { + return HTMLResult.EMPTY; + } + if (!buffer && this.transferEncoding === "base64") { + buffer = fromBase64Util(this[$content]); + } + if (!buffer) { + return HTMLResult.EMPTY; + } if (!this.contentType) { - for (const [t, i] of Kn) - if (e.length > t.length && t.every((t, i) => t === e[i])) { - this.contentType = i; + for (const [header, type] of IMAGES_HEADERS) { + if ( + buffer.length > header.length && + header.every((x, i) => x === buffer[i]) + ) { + this.contentType = type; break; } - if (!this.contentType) return HTMLResult.EMPTY; + } + if (!this.contentType) { + return HTMLResult.EMPTY; + } } - const t = new Blob([e], { type: this.contentType }); - let i; + const blob = new Blob([buffer], { + type: this.contentType, + }); + let style; switch (this.aspect) { case "fit": case "actual": break; case "height": - i = { height: "100%", objectFit: "fill" }; + style = { + height: "100%", + objectFit: "fill", + }; break; case "none": - i = { width: "100%", height: "100%", objectFit: "fill" }; + style = { + width: "100%", + height: "100%", + objectFit: "fill", + }; break; case "width": - i = { width: "100%", objectFit: "fill" }; + style = { + width: "100%", + objectFit: "fill", + }; + break; } - const a = this[pr](); + const parent = this[$getParent](); return HTMLResult.success({ name: "img", attributes: { class: ["xfaImage"], - style: i, - src: URL.createObjectURL(t), - alt: a ? ariaLabel(a[pr]()) : null, + style, + src: URL.createObjectURL(blob), + alt: parent ? ariaLabel(parent[$getParent]()) : null, }, }); } } class ImageEdit extends XFAObject { - constructor(e) { - super(Hn, "imageEdit", !0); - this.data = getStringOption(e.data, ["link", "embed"]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "imageEdit", true); + this.data = 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; } - [an](e) { - return "embed" === this.data - ? HTMLResult.success({ name: "div", children: [], attributes: {} }) - : HTMLResult.EMPTY; + [$toHTML](availableSpace) { + if (this.data === "embed") { + return HTMLResult.success({ + name: "div", + children: [], + attributes: {}, + }); + } + return HTMLResult.EMPTY; } } class Integer extends ContentObject { - constructor(e) { - super(Hn, "integer"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "integer"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = parseInt(this[er].trim(), 10); - this[er] = isNaN(e) ? null : e; + [$finalize]() { + const number = parseInt(this[$content].trim(), 10); + this[$content] = isNaN(number) ? null : number; } - [an](e) { - return valueToHtml(null !== this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml( + this[$content] !== null ? this[$content].toString() : "", + ); } } class Issuers extends XFAObject { - constructor(e) { - super(Hn, "issuers", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "issuers", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.certificate = new XFAObjectArray(); } } class Items extends XFAObject { - constructor(e) { - super(Hn, "items", !0); - this.id = e.id || ""; - this.name = e.name || ""; - this.presence = getStringOption(e.presence, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "items", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.ref = e.ref || ""; + this.ref = attributes.ref || ""; this.save = getInteger({ - data: e.save, + data: attributes.save, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.boolean = new XFAObjectArray(); this.date = new XFAObjectArray(); this.dateTime = new XFAObjectArray(); @@ -45767,162 +55428,187 @@ class Items extends XFAObject { this.text = new XFAObjectArray(); this.time = new XFAObjectArray(); } - [an]() { - const e = []; - for (const t of this[Er]()) e.push(t[en]()); - return HTMLResult.success(e); + [$toHTML]() { + const output = []; + for (const child of this[$getChildren]()) { + output.push(child[$text]()); + } + return HTMLResult.success(output); } } class Keep extends XFAObject { - constructor(e) { - super(Hn, "keep", !0); - this.id = e.id || ""; - const t = ["none", "contentArea", "pageArea"]; - this.intact = getStringOption(e.intact, t); - this.next = getStringOption(e.next, t); - this.previous = getStringOption(e.previous, t); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "keep", true); + this.id = attributes.id || ""; + const options = ["none", "contentArea", "pageArea"]; + this.intact = getStringOption(attributes.intact, options); + this.next = getStringOption(attributes.next, options); + this.previous = getStringOption(attributes.previous, options); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } } class KeyUsage extends XFAObject { - constructor(e) { - super(Hn, "keyUsage"); - const t = ["", "yes", "no"]; - this.crlSign = getStringOption(e.crlSign, t); - this.dataEncipherment = getStringOption(e.dataEncipherment, t); - this.decipherOnly = getStringOption(e.decipherOnly, t); - this.digitalSignature = getStringOption(e.digitalSignature, t); - this.encipherOnly = getStringOption(e.encipherOnly, t); - this.id = e.id || ""; - this.keyAgreement = getStringOption(e.keyAgreement, t); - this.keyCertSign = getStringOption(e.keyCertSign, t); - this.keyEncipherment = getStringOption(e.keyEncipherment, t); - this.nonRepudiation = getStringOption(e.nonRepudiation, t); - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "keyUsage"); + const options = ["", "yes", "no"]; + this.crlSign = getStringOption(attributes.crlSign, options); + this.dataEncipherment = getStringOption( + attributes.dataEncipherment, + options, + ); + this.decipherOnly = getStringOption(attributes.decipherOnly, options); + this.digitalSignature = getStringOption( + attributes.digitalSignature, + options, + ); + this.encipherOnly = getStringOption(attributes.encipherOnly, options); + this.id = attributes.id || ""; + this.keyAgreement = getStringOption(attributes.keyAgreement, options); + this.keyCertSign = getStringOption(attributes.keyCertSign, options); + this.keyEncipherment = getStringOption(attributes.keyEncipherment, options); + this.nonRepudiation = getStringOption(attributes.nonRepudiation, options); + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Line extends XFAObject { - constructor(e) { - super(Hn, "line", !0); - this.hand = getStringOption(e.hand, ["even", "left", "right"]); - this.id = e.id || ""; - this.slope = getStringOption(e.slope, ["\\", "/"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "line", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.slope = getStringOption(attributes.slope, ["\\", "/"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.edge = null; } - [an]() { - const e = this[pr]()[pr](), - t = this.edge || new Edge({}), - i = t[rn](), - a = Object.create(null), - s = "visible" === t.presence ? t.thickness : 0; - a.strokeWidth = measureToString(s); - a.stroke = i.color; - let r, - n, - g, - o, - c = "100%", - C = "100%"; - if (e.w <= s) { - [r, n, g, o] = ["50%", 0, "50%", "100%"]; - c = a.strokeWidth; - } else if (e.h <= s) { - [r, n, g, o] = [0, "50%", "100%", "50%"]; - C = a.strokeWidth; - } else - "\\" === this.slope - ? ([r, n, g, o] = [0, 0, "100%", "100%"]) - : ([r, n, g, o] = [0, "100%", "100%", 0]); - const h = { - name: "svg", - children: [ - { - name: "line", - attributes: { xmlns: Jn, x1: r, y1: n, x2: g, y2: o, style: a }, - }, - ], + [$toHTML]() { + const parent = this[$getParent]()[$getParent](); + const edge = this.edge || new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + const thickness = edge.presence === "visible" ? edge.thickness : 0; + style.strokeWidth = 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: Jn, - width: c, - height: C, - style: { overflow: "visible" }, + xmlns: SVG_NS, + x1, + y1, + x2, + y2, + style, }, }; - if (hasMargin(e)) + const svg = { + name: "svg", + children: [line], + attributes: { + xmlns: SVG_NS, + width, + height, + style: { + overflow: "visible", + }, + }, + }; + if (hasMargin(parent)) { return HTMLResult.success({ name: "div", attributes: { - style: { display: "inline", width: "100%", height: "100%" }, + style: { + display: "inline", + width: "100%", + height: "100%", + }, }, - children: [h], + children: [svg], }); - h.attributes.style.position = "absolute"; - return HTMLResult.success(h); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); } } class Linear extends XFAObject { - constructor(e) { - super(Hn, "linear", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "linear", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, [ "toRight", "toBottom", "toLeft", "toTop", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn](e) { - e = e ? e[rn]() : "#FFFFFF"; - return `linear-gradient(${this.type.replace(/([RBLT])/, " $1").toLowerCase()}, ${e}, ${this.color ? this.color[rn]() : "#000000"})`; + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + return `linear-gradient(${transf}, ${startColor}, ${endColor})`; } } class LockDocument extends ContentObject { - constructor(e) { - super(Hn, "lockDocument"); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "lockDocument"); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - this[er] = getStringOption(this[er], ["auto", "0", "1"]); + [$finalize]() { + this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); } } class Manifest extends XFAObject { - constructor(e) { - super(Hn, "manifest", !0); - this.action = getStringOption(e.action, ["include", "all", "exclude"]); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "manifest", true); + this.action = 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 XFAObjectArray(); } } class Margin extends XFAObject { - constructor(e) { - super(Hn, "margin", !0); - this.bottomInset = getMeasurement(e.bottomInset, "0"); - this.id = e.id || ""; - this.leftInset = getMeasurement(e.leftInset, "0"); - this.rightInset = getMeasurement(e.rightInset, "0"); - this.topInset = getMeasurement(e.topInset, "0"); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "margin", true); + this.bottomInset = getMeasurement(attributes.bottomInset, "0"); + this.id = attributes.id || ""; + this.leftInset = getMeasurement(attributes.leftInset, "0"); + this.rightInset = getMeasurement(attributes.rightInset, "0"); + this.topInset = getMeasurement(attributes.topInset, "0"); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } - [rn]() { + [$toStyle]() { return { margin: measureToString(this.topInset) + @@ -45936,214 +55622,234 @@ class Margin extends XFAObject { } } class Mdp extends XFAObject { - constructor(e) { - super(Hn, "mdp"); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "mdp"); + this.id = attributes.id || ""; this.permissions = getInteger({ - data: e.permissions, + data: attributes.permissions, defaultValue: 2, - validate: (e) => 1 === e || 3 === e, + validate: (x) => x === 1 || x === 3, }); - this.signatureType = getStringOption(e.signatureType, ["filler", "author"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.signatureType = getStringOption(attributes.signatureType, [ + "filler", + "author", + ]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Medium extends XFAObject { - constructor(e) { - super(Hn, "medium"); - this.id = e.id || ""; - this.imagingBBox = (function getBBox(e) { - const t = -1; - if (!e) return { x: t, y: t, width: t, height: t }; - const i = e - .trim() - .split(/\s*,\s*/) - .map((e) => getMeasurement(e, "-1")); - if (i.length < 4 || i[2] < 0 || i[3] < 0) - return { x: t, y: t, width: t, height: t }; - const [a, s, r, n] = i; - return { x: a, y: s, width: r, height: n }; - })(e.imagingBBox); - this.long = getMeasurement(e.long); - this.orientation = getStringOption(e.orientation, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "medium"); + this.id = attributes.id || ""; + this.imagingBBox = getBBox(attributes.imagingBBox); + this.long = getMeasurement(attributes.long); + this.orientation = getStringOption(attributes.orientation, [ "portrait", "landscape", ]); - this.short = getMeasurement(e.short); - this.stock = e.stock || ""; - this.trayIn = getStringOption(e.trayIn, ["auto", "delegate", "pageFront"]); - this.trayOut = getStringOption(e.trayOut, ["auto", "delegate"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.short = getMeasurement(attributes.short); + this.stock = attributes.stock || ""; + this.trayIn = getStringOption(attributes.trayIn, [ + "auto", + "delegate", + "pageFront", + ]); + this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Message extends XFAObject { - constructor(e) { - super(Hn, "message", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "message", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.text = new XFAObjectArray(); } } class NumericEdit extends XFAObject { - constructor(e) { - super(Hn, "numericEdit", !0); - this.hScrollPolicy = getStringOption(e.hScrollPolicy, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "numericEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [ "auto", "off", "on", ]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.border = null; this.comb = null; this.extras = null; this.margin = null; } - [an](e) { - const t = toStyle(this, "border", "font", "margin"), - i = this[pr]()[pr](), - a = { - name: "input", - attributes: { - type: "text", - fieldId: i[nn], - dataId: i[tr]?.[nn] || i[nn], - class: ["xfaTextfield"], - style: t, - "aria-label": ariaLabel(i), - "aria-required": !1, - }, - }; - if (isRequired(i)) { - a.attributes["aria-required"] = !0; - a.attributes.required = !0; + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + const field = this[$getParent]()[$getParent](); + const html = { + name: "input", + attributes: { + type: "text", + fieldId: field[$uid], + dataId: field[$data]?.[$uid] || field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false, + }, + }; + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; } return HTMLResult.success({ name: "label", - attributes: { class: ["xfaLabel"] }, - children: [a], + attributes: { + class: ["xfaLabel"], + }, + children: [html], }); } } class Occur extends XFAObject { - constructor(e) { - super(Hn, "occur", !0); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "occur", true); + this.id = attributes.id || ""; this.initial = - "" !== e.initial - ? getInteger({ data: e.initial, defaultValue: "", validate: (e) => !0 }) + attributes.initial !== "" + ? getInteger({ + data: attributes.initial, + defaultValue: "", + validate: (x) => true, + }) : ""; this.max = - "" !== e.max - ? getInteger({ data: e.max, defaultValue: 1, validate: (e) => !0 }) + attributes.max !== "" + ? getInteger({ + data: attributes.max, + defaultValue: 1, + validate: (x) => true, + }) : ""; this.min = - "" !== e.min - ? getInteger({ data: e.min, defaultValue: 1, validate: (e) => !0 }) + attributes.min !== "" + ? getInteger({ + data: attributes.min, + defaultValue: 1, + validate: (x) => true, + }) : ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } - [Vs]() { - const e = this[pr](), - t = this.min; - "" === this.min && - (this.min = e instanceof PageArea || e instanceof PageSet ? 0 : 1); - "" === this.max && - (this.max = - "" === t - ? e instanceof PageArea || e instanceof PageSet - ? -1 - : 1 - : this.min); - -1 !== this.max && this.max < this.min && (this.max = this.min); - "" === this.initial && - (this.initial = e instanceof Template ? 1 : this.min); + [$clean]() { + const parent = this[$getParent](); + const originalMin = this.min; + if (this.min === "") { + this.min = + parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; + } + if (this.max === "") { + if (originalMin === "") { + this.max = + parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; + } else { + this.max = this.min; + } + } + if (this.max !== -1 && this.max < this.min) { + this.max = this.min; + } + if (this.initial === "") { + this.initial = parent instanceof Template ? 1 : this.min; + } } } class Oid extends StringObject { - constructor(e) { - super(Hn, "oid"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "oids", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "oids", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.oid = new XFAObjectArray(); } } class Overflow extends XFAObject { - constructor(e) { - super(Hn, "overflow"); - this.id = e.id || ""; - this.leader = e.leader || ""; - this.target = e.target || ""; - this.trailer = e.trailer || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 || ""; } - [lr]() { - if (!this[ar]) { - const e = this[pr](), - t = this[mr](), - i = t[Vr](this.target, e), - a = t[Vr](this.leader, e), - s = t[Vr](this.trailer, e); - this[ar] = { - target: i?.[0] || null, - leader: a?.[0] || null, - trailer: s?.[0] || null, - addLeader: !1, - addTrailer: !1, + [$getExtra]() { + if (!this[$extra]) { + const parent = this[$getParent](); + const root = this[$getTemplateRoot](); + const target = root[$searchNode](this.target, parent); + const leader = root[$searchNode](this.leader, parent); + const trailer = root[$searchNode](this.trailer, parent); + this[$extra] = { + target: target?.[0] || null, + leader: leader?.[0] || null, + trailer: trailer?.[0] || null, + addLeader: false, + addTrailer: false, }; } - return this[ar]; + return this[$extra]; } } class PageArea extends XFAObject { - constructor(e) { - super(Hn, "pageArea", !0); - this.blankOrNotBlank = getStringOption(e.blankOrNotBlank, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageArea", true); + this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, [ "any", "blank", "notBlank", ]); - this.id = e.id || ""; + this.id = attributes.id || ""; this.initialNumber = getInteger({ - data: e.initialNumber, + data: attributes.initialNumber, defaultValue: 1, - validate: (e) => !0, + validate: (x) => true, }); - this.name = e.name || ""; + this.name = attributes.name || ""; this.numbered = getInteger({ - data: e.numbered, + data: attributes.numbered, defaultValue: 1, - validate: (e) => !0, + validate: (x) => true, }); - this.oddOrEven = getStringOption(e.oddOrEven, ["any", "even", "odd"]); - this.pagePosition = getStringOption(e.pagePosition, [ + this.oddOrEven = getStringOption(attributes.oddOrEven, [ + "any", + "even", + "odd", + ]); + this.pagePosition = getStringOption(attributes.pagePosition, [ "any", "first", "last", "only", "rest", ]); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.desc = null; this.extras = null; this.medium = null; @@ -46155,142 +55861,189 @@ class PageArea extends XFAObject { this.field = new XFAObjectArray(); this.subform = new XFAObjectArray(); } - [Lr]() { - if (!this[ar]) { - this[ar] = { numberOfUse: 0 }; - return !0; + [$isUsable]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0, + }; + return true; } return ( !this.occur || - -1 === this.occur.max || - this[ar].numberOfUse < this.occur.max + this.occur.max === -1 || + this[$extra].numberOfUse < this.occur.max ); } - [zs]() { - delete this[ar]; + [$cleanPage]() { + delete this[$extra]; } - [dr]() { - this[ar] || (this[ar] = { numberOfUse: 0 }); - const e = this[pr](); - if ("orderedOccurrence" === e.relation && this[Lr]()) { - this[ar].numberOfUse += 1; - return this; + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 0, + }; } - return e[dr](); - } - [or]() { - return this[ar].space || { width: 0, height: 0 }; - } - [an]() { - this[ar] || (this[ar] = { numberOfUse: 1 }); - const e = []; - this[ar].children = e; - const t = Object.create(null); - if (this.medium && this.medium.short && this.medium.long) { - t.width = measureToString(this.medium.short); - t.height = measureToString(this.medium.long); - this[ar].space = { width: this.medium.short, height: this.medium.long }; - if ("landscape" === this.medium.orientation) { - const e = t.width; - t.width = t.height; - t.height = e; - this[ar].space = { width: this.medium.long, height: this.medium.short }; + const parent = this[$getParent](); + if (parent.relation === "orderedOccurrence") { + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + return this; } - } else warn("XFA - No medium specified in pageArea: please file a bug."); - this[Zs]({ + } + return parent[$getNextPage](); + } + [$getAvailableSpace]() { + return ( + this[$extra].space || { + width: 0, + height: 0, + } + ); + } + [$toHTML]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1, + }; + } + const children = []; + this[$extra].children = children; + const style = Object.create(null); + if (this.medium && this.medium.short && this.medium.long) { + style.width = measureToString(this.medium.short); + style.height = measureToString(this.medium.long); + this[$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[$extra].space = { + width: this.medium.long, + height: this.medium.short, + }; + } + } else { + warn("XFA - No medium specified in pageArea: please file a bug."); + } + this[$childrenToHTML]({ filter: new Set(["area", "draw", "field", "subform"]), - include: !0, + include: true, + }); + this[$childrenToHTML]({ + filter: new Set(["contentArea"]), + include: true, }); - this[Zs]({ filter: new Set(["contentArea"]), include: !0 }); return HTMLResult.success({ name: "div", - children: e, + children, attributes: { class: ["xfaPage"], - id: this[nn], - style: t, + id: this[$uid], + style, xfaName: this.name, }, }); } } class PageSet extends XFAObject { - constructor(e) { - super(Hn, "pageSet", !0); - this.duplexImposition = getStringOption(e.duplexImposition, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "pageSet", true); + this.duplexImposition = getStringOption(attributes.duplexImposition, [ "longEdge", "shortEdge", ]); - this.id = e.id || ""; - this.name = e.name || ""; - this.relation = getStringOption(e.relation, [ + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, [ "orderedOccurrence", "duplexPaginated", "simplexPaginated", ]); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; this.occur = null; this.pageArea = new XFAObjectArray(); this.pageSet = new XFAObjectArray(); } - [zs]() { - for (const e of this.pageArea.children) e[zs](); - for (const e of this.pageSet.children) e[zs](); + [$cleanPage]() { + for (const page of this.pageArea.children) { + page[$cleanPage](); + } + for (const page of this.pageSet.children) { + page[$cleanPage](); + } } - [Lr]() { + [$isUsable]() { return ( !this.occur || - -1 === this.occur.max || - this[ar].numberOfUse < this.occur.max + this.occur.max === -1 || + this[$extra].numberOfUse < this.occur.max ); } - [dr]() { - this[ar] || - (this[ar] = { numberOfUse: 1, pageIndex: -1, pageSetIndex: -1 }); - if ("orderedOccurrence" === this.relation) { - if (this[ar].pageIndex + 1 < this.pageArea.children.length) { - this[ar].pageIndex += 1; - return this.pageArea.children[this[ar].pageIndex][dr](); - } - if (this[ar].pageSetIndex + 1 < this.pageSet.children.length) { - this[ar].pageSetIndex += 1; - return this.pageSet.children[this[ar].pageSetIndex][dr](); - } - if (this[Lr]()) { - this[ar].numberOfUse += 1; - this[ar].pageIndex = -1; - this[ar].pageSetIndex = -1; - return this[dr](); - } - const e = this[pr](); - if (e instanceof PageSet) return e[dr](); - this[zs](); - return this[dr](); + [$getNextPage]() { + if (!this[$extra]) { + this[$extra] = { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1, + }; } - const e = this[mr]()[ar].pageNumber, - t = e % 2 == 0 ? "even" : "odd", - i = 0 === e ? "first" : "rest"; - let a = this.pageArea.children.find( - (e) => e.oddOrEven === t && e.pagePosition === i, + if (this.relation === "orderedOccurrence") { + if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { + this[$extra].pageIndex += 1; + const pageArea = this.pageArea.children[this[$extra].pageIndex]; + return pageArea[$getNextPage](); + } + if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) { + this[$extra].pageSetIndex += 1; + return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage](); + } + if (this[$isUsable]()) { + this[$extra].numberOfUse += 1; + this[$extra].pageIndex = -1; + this[$extra].pageSetIndex = -1; + return this[$getNextPage](); + } + const parent = this[$getParent](); + if (parent instanceof PageSet) { + return parent[$getNextPage](); + } + this[$cleanPage](); + return this[$getNextPage](); + } + const pageNumber = this[$getTemplateRoot]()[$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 (a) return a; - a = this.pageArea.children.find( - (e) => "any" === e.oddOrEven && e.pagePosition === i, + if (page) { + return page; + } + page = this.pageArea.children.find( + (p) => p.oddOrEven === "any" && p.pagePosition === position, ); - if (a) return a; - a = this.pageArea.children.find( - (e) => "any" === e.oddOrEven && "any" === e.pagePosition, + if (page) { + return page; + } + page = this.pageArea.children.find( + (p) => p.oddOrEven === "any" && p.pagePosition === "any", ); - return a || this.pageArea.children[0]; + if (page) { + return page; + } + return this.pageArea.children[0]; } } class Para extends XFAObject { - constructor(e) { - super(Hn, "para", !0); - this.hAlign = getStringOption(e.hAlign, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "para", true); + this.hAlign = getStringOption(attributes.hAlign, [ "left", "center", "justify", @@ -46298,81 +56051,109 @@ class Para extends XFAObject { "radix", "right", ]); - this.id = e.id || ""; - this.lineHeight = e.lineHeight ? getMeasurement(e.lineHeight, "0pt") : ""; - this.marginLeft = e.marginLeft ? getMeasurement(e.marginLeft, "0pt") : ""; - this.marginRight = e.marginRight - ? getMeasurement(e.marginRight, "0pt") + this.id = attributes.id || ""; + this.lineHeight = attributes.lineHeight + ? getMeasurement(attributes.lineHeight, "0pt") + : ""; + this.marginLeft = attributes.marginLeft + ? getMeasurement(attributes.marginLeft, "0pt") + : ""; + this.marginRight = attributes.marginRight + ? getMeasurement(attributes.marginRight, "0pt") : ""; this.orphans = getInteger({ - data: e.orphans, + data: attributes.orphans, defaultValue: 0, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.preserve = e.preserve || ""; - this.radixOffset = e.radixOffset - ? getMeasurement(e.radixOffset, "0pt") + this.preserve = attributes.preserve || ""; + this.radixOffset = attributes.radixOffset + ? getMeasurement(attributes.radixOffset, "0pt") : ""; - this.spaceAbove = e.spaceAbove ? getMeasurement(e.spaceAbove, "0pt") : ""; - this.spaceBelow = e.spaceBelow ? getMeasurement(e.spaceBelow, "0pt") : ""; - this.tabDefault = e.tabDefault ? getMeasurement(this.tabDefault) : ""; - this.tabStops = (e.tabStops || "") + this.spaceAbove = attributes.spaceAbove + ? getMeasurement(attributes.spaceAbove, "0pt") + : ""; + this.spaceBelow = attributes.spaceBelow + ? getMeasurement(attributes.spaceBelow, "0pt") + : ""; + this.tabDefault = attributes.tabDefault + ? getMeasurement(this.tabDefault) + : ""; + this.tabStops = (attributes.tabStops || "") .trim() .split(/\s+/) - .map((e, t) => (t % 2 == 1 ? getMeasurement(e) : e)); - this.textIndent = e.textIndent ? getMeasurement(e.textIndent, "0pt") : ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.vAlign = getStringOption(e.vAlign, ["top", "bottom", "middle"]); + .map((x, i) => (i % 2 === 1 ? getMeasurement(x) : x)); + this.textIndent = attributes.textIndent + ? getMeasurement(attributes.textIndent, "0pt") + : ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vAlign = getStringOption(attributes.vAlign, [ + "top", + "bottom", + "middle", + ]); this.widows = getInteger({ - data: e.widows, + data: attributes.widows, defaultValue: 0, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); this.hyphenation = null; } - [rn]() { - const e = toStyle(this, "hAlign"); - "" !== this.marginLeft && - (e.paddingLeft = measureToString(this.marginLeft)); - "" !== this.marginRight && - (e.paddingight = measureToString(this.marginRight)); - "" !== this.spaceAbove && (e.paddingTop = measureToString(this.spaceAbove)); - "" !== this.spaceBelow && - (e.paddingBottom = measureToString(this.spaceBelow)); - if ("" !== this.textIndent) { - e.textIndent = measureToString(this.textIndent); - fixTextIndent(e); + [$toStyle]() { + const style = toStyle(this, "hAlign"); + if (this.marginLeft !== "") { + style.paddingLeft = measureToString(this.marginLeft); } - this.lineHeight > 0 && (e.lineHeight = measureToString(this.lineHeight)); - "" !== this.tabDefault && (e.tabSize = measureToString(this.tabDefault)); - this.tabStops.length; - this.hyphenatation && Object.assign(e, this.hyphenatation[rn]()); - return e; + if (this.marginRight !== "") { + style.paddingight = measureToString(this.marginRight); + } + if (this.spaceAbove !== "") { + style.paddingTop = measureToString(this.spaceAbove); + } + if (this.spaceBelow !== "") { + style.paddingBottom = measureToString(this.spaceBelow); + } + if (this.textIndent !== "") { + style.textIndent = measureToString(this.textIndent); + fixTextIndent(style); + } + if (this.lineHeight > 0) { + style.lineHeight = measureToString(this.lineHeight); + } + if (this.tabDefault !== "") { + style.tabSize = measureToString(this.tabDefault); + } + if (this.tabStops.length > 0) { + } + if (this.hyphenatation) { + Object.assign(style, this.hyphenatation[$toStyle]()); + } + return style; } } class PasswordEdit extends XFAObject { - constructor(e) { - super(Hn, "passwordEdit", !0); - this.hScrollPolicy = getStringOption(e.hScrollPolicy, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "passwordEdit", true); + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [ "auto", "off", "on", ]); - this.id = e.id || ""; - this.passwordChar = e.passwordChar || "*"; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 template_Pattern extends XFAObject { - constructor(e) { - super(Hn, "pattern", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "pattern", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, [ "crossHatch", "crossDiagonal", "diagonalLeft", @@ -46380,44 +56161,45 @@ class template_Pattern extends XFAObject { "horizontal", "vertical", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn](e) { - e = e ? e[rn]() : "#FFFFFF"; - const t = this.color ? this.color[rn]() : "#000000", - i = "repeating-linear-gradient", - a = `${e},${e} 5px,${t} 5px,${t} 10px`; + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$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 `${i}(to top,${a}) ${i}(to right,${a})`; + return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; case "crossDiagonal": - return `${i}(45deg,${a}) ${i}(-45deg,${a})`; + return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; case "diagonalLeft": - return `${i}(45deg,${a})`; + return `${cmd}(45deg,${colors})`; case "diagonalRight": - return `${i}(-45deg,${a})`; + return `${cmd}(-45deg,${colors})`; case "horizontal": - return `${i}(to top,${a})`; + return `${cmd}(to top,${colors})`; case "vertical": - return `${i}(to right,${a})`; + return `${cmd}(to right,${colors})`; } return ""; } } class Picture extends StringObject { - constructor(e) { - super(Hn, "picture"); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "picture"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Proto extends XFAObject { - constructor(e) { - super(Hn, "proto", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "proto", true); this.appearanceFilter = new XFAObjectArray(); this.arc = new XFAObjectArray(); this.area = new XFAObjectArray(); @@ -46531,147 +56313,173 @@ class Proto extends XFAObject { } } class Radial extends XFAObject { - constructor(e) { - super(Hn, "radial", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["toEdge", "toCenter"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "radial", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn](e) { - e = e ? e[rn]() : "#FFFFFF"; - const t = this.color ? this.color[rn]() : "#000000"; - return `radial-gradient(circle at center, ${"toEdge" === this.type ? `${e},${t}` : `${t},${e}`})`; + [$toStyle](startColor) { + startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; + const endColor = this.color ? this.color[$toStyle]() : "#000000"; + const colors = + this.type === "toEdge" + ? `${startColor},${endColor}` + : `${endColor},${startColor}`; + return `radial-gradient(circle at center, ${colors})`; } } class Reason extends StringObject { - constructor(e) { - super(Hn, "reason"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "reasons", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "reasons", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.reason = new XFAObjectArray(); } } class Rectangle extends XFAObject { - constructor(e) { - super(Hn, "rectangle", !0); - this.hand = getStringOption(e.hand, ["even", "left", "right"]); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "rectangle", true); + this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.corner = new XFAObjectArray(4); this.edge = new XFAObjectArray(4); this.fill = null; } - [an]() { - const e = this.edge.children.length ? this.edge.children[0] : new Edge({}), - t = e[rn](), - i = Object.create(null); - "visible" === this.fill?.presence - ? Object.assign(i, this.fill[rn]()) - : (i.fill = "transparent"); - i.strokeWidth = measureToString("visible" === e.presence ? e.thickness : 0); - i.stroke = t.color; - const a = ( - this.corner.children.length ? this.corner.children[0] : new Corner({}) - )[rn](), - s = { - name: "svg", - children: [ - { - name: "rect", - attributes: { - xmlns: Jn, - width: "100%", - height: "100%", - x: 0, - y: 0, - rx: a.radius, - ry: a.radius, - style: i, - }, - }, - ], - attributes: { - xmlns: Jn, - style: { overflow: "visible" }, - width: "100%", - height: "100%", + [$toHTML]() { + const edge = this.edge.children.length + ? this.edge.children[0] + : new Edge({}); + const edgeStyle = edge[$toStyle](); + const style = Object.create(null); + if (this.fill?.presence === "visible") { + Object.assign(style, this.fill[$toStyle]()); + } else { + style.fill = "transparent"; + } + style.strokeWidth = 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[$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", }, - }; - if (hasMargin(this[pr]()[pr]())) + width: "100%", + height: "100%", + }, + }; + const parent = this[$getParent]()[$getParent](); + if (hasMargin(parent)) { return HTMLResult.success({ name: "div", attributes: { - style: { display: "inline", width: "100%", height: "100%" }, + style: { + display: "inline", + width: "100%", + height: "100%", + }, }, - children: [s], + children: [svg], }); - s.attributes.style.position = "absolute"; - return HTMLResult.success(s); + } + svg.attributes.style.position = "absolute"; + return HTMLResult.success(svg); } } class RefElement extends StringObject { - constructor(e) { - super(Hn, "ref"); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "ref"); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Script extends StringObject { - constructor(e) { - super(Hn, "script"); - this.binding = e.binding || ""; - this.contentType = e.contentType || ""; - this.id = e.id || ""; - this.name = e.name || ""; - this.runAt = getStringOption(e.runAt, ["client", "both", "server"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 = getStringOption(attributes.runAt, [ + "client", + "both", + "server", + ]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class SetProperty extends XFAObject { - constructor(e) { - super(Hn, "setProperty"); - this.connection = e.connection || ""; - this.ref = e.ref || ""; - this.target = e.target || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "setProperty"); + this.connection = attributes.connection || ""; + this.ref = attributes.ref || ""; + this.target = attributes.target || ""; } } class SignData extends XFAObject { - constructor(e) { - super(Hn, "signData", !0); - this.id = e.id || ""; - this.operation = getStringOption(e.operation, ["sign", "clear", "verify"]); - this.ref = e.ref || ""; - this.target = e.target || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "signData", true); + this.id = attributes.id || ""; + this.operation = 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 XFAObject { - constructor(e) { - super(Hn, "signature", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["PDF1.3", "PDF1.6"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "signature", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.border = null; this.extras = null; this.filter = null; @@ -46680,85 +56488,85 @@ class Signature extends XFAObject { } } class Signing extends XFAObject { - constructor(e) { - super(Hn, "signing", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "signing", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.certificate = new XFAObjectArray(); } } class Solid extends XFAObject { - constructor(e) { - super(Hn, "solid", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "solid", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; } - [rn](e) { - return e ? e[rn]() : "#FFFFFF"; + [$toStyle](startColor) { + return startColor ? startColor[$toStyle]() : "#FFFFFF"; } } class Speak extends StringObject { - constructor(e) { - super(Hn, "speak"); + constructor(attributes) { + super(TEMPLATE_NS_ID, "speak"); this.disable = getInteger({ - data: e.disable, + data: attributes.disable, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.id = e.id || ""; - this.priority = getStringOption(e.priority, [ + this.id = attributes.id || ""; + this.priority = getStringOption(attributes.priority, [ "custom", "caption", "name", "toolTip", ]); - this.rid = e.rid || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class Stipple extends XFAObject { - constructor(e) { - super(Hn, "stipple", !0); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "stipple", true); + this.id = attributes.id || ""; this.rate = getInteger({ - data: e.rate, + data: attributes.rate, defaultValue: 50, - validate: (e) => e >= 0 && e <= 100, + validate: (x) => x >= 0 && x <= 100, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.color = null; this.extras = null; } - [rn](e) { - const t = this.rate / 100; + [$toStyle](bgColor) { + const alpha = this.rate / 100; return Util.makeHexColor( - Math.round(e.value.r * (1 - t) + this.value.r * t), - Math.round(e.value.g * (1 - t) + this.value.g * t), - Math.round(e.value.b * (1 - t) + this.value.b * t), + 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 XFAObject { - constructor(e) { - super(Hn, "subform", !0); - this.access = getStringOption(e.access, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "subform", true); + this.access = getStringOption(attributes.access, [ "open", "nonInteractive", "protected", "readOnly", ]); this.allowMacro = getInteger({ - data: e.allowMacro, + data: attributes.allowMacro, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.anchorType = getStringOption(e.anchorType, [ + this.anchorType = getStringOption(attributes.anchorType, [ "topLeft", "bottomCenter", "bottomLeft", @@ -46770,16 +56578,16 @@ class Subform extends XFAObject { "topRight", ]); this.colSpan = getInteger({ - data: e.colSpan, + data: attributes.colSpan, defaultValue: 1, - validate: (e) => e >= 1 || -1 === e, + validate: (n) => n >= 1 || n === -1, }); - this.columnWidths = (e.columnWidths || "") + this.columnWidths = (attributes.columnWidths || "") .trim() .split(/\s+/) - .map((e) => ("-1" === e ? -1 : getMeasurement(e))); - this.h = e.h ? getMeasurement(e.h) : ""; - this.hAlign = getStringOption(e.hAlign, [ + .map((x) => (x === "-1" ? -1 : getMeasurement(x))); + this.h = attributes.h ? getMeasurement(attributes.h) : ""; + this.hAlign = getStringOption(attributes.hAlign, [ "left", "center", "justify", @@ -46787,8 +56595,8 @@ class Subform extends XFAObject { "radix", "right", ]); - this.id = e.id || ""; - this.layout = getStringOption(e.layout, [ + this.id = attributes.id || ""; + this.layout = getStringOption(attributes.layout, [ "position", "lr-tb", "rl-row", @@ -46797,30 +56605,33 @@ class Subform extends XFAObject { "table", "tb", ]); - this.locale = e.locale || ""; - this.maxH = getMeasurement(e.maxH, "0pt"); - this.maxW = getMeasurement(e.maxW, "0pt"); - this.mergeMode = getStringOption(e.mergeMode, [ + this.locale = attributes.locale || ""; + this.maxH = getMeasurement(attributes.maxH, "0pt"); + this.maxW = getMeasurement(attributes.maxW, "0pt"); + this.mergeMode = getStringOption(attributes.mergeMode, [ "consumeData", "matchTemplate", ]); - this.minH = getMeasurement(e.minH, "0pt"); - this.minW = getMeasurement(e.minW, "0pt"); - this.name = e.name || ""; - this.presence = getStringOption(e.presence, [ + this.minH = getMeasurement(attributes.minH, "0pt"); + this.minW = getMeasurement(attributes.minW, "0pt"); + this.name = attributes.name || ""; + this.presence = getStringOption(attributes.presence, [ "visible", "hidden", "inactive", "invisible", ]); - this.relevant = getRelevant(e.relevant); - this.restoreState = getStringOption(e.restoreState, ["manual", "auto"]); - this.scope = getStringOption(e.scope, ["name", "none"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.w = e.w ? getMeasurement(e.w) : ""; - this.x = getMeasurement(e.x, "0pt"); - this.y = getMeasurement(e.y, "0pt"); + this.relevant = getRelevant(attributes.relevant); + this.restoreState = getStringOption(attributes.restoreState, [ + "manual", + "auto", + ]); + this.scope = getStringOption(attributes.scope, ["name", "none"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.w = attributes.w ? getMeasurement(attributes.w) : ""; + this.x = getMeasurement(attributes.x, "0pt"); + this.y = getMeasurement(attributes.y, "0pt"); this.assist = null; this.bind = null; this.bookend = null; @@ -46852,123 +56663,149 @@ class Subform extends XFAObject { this.subform = new XFAObjectArray(); this.subformSet = new XFAObjectArray(); } - [fr]() { - const e = this[pr](); - return e instanceof SubformSet ? e[fr]() : e; + [$getSubformParent]() { + const parent = this[$getParent](); + if (parent instanceof SubformSet) { + return parent[$getSubformParent](); + } + return parent; } - [kr]() { - return !0; + [$isBindable]() { + return true; } - [Ur]() { + [$isThereMoreWidth]() { return ( (this.layout.endsWith("-tb") && - 0 === this[ar].attempt && - this[ar].numberInLine > 0) || - this[pr]()[Ur]() + this[$extra].attempt === 0 && + this[$extra].numberInLine > 0) || + this[$getParent]()[$isThereMoreWidth]() ); } - *[ur]() { + *[$getContainedChildren]() { yield* getContainedChildren(this); } - [rr]() { + [$flushHTML]() { return flushHTML(this); } - [js](e, t) { - addHTML(this, e, t); + [$addHTML](html, bbox) { + addHTML(this, html, bbox); } - [or]() { + [$getAvailableSpace]() { return getAvailableSpace(this); } - [xr]() { - const e = this[fr](); - if (!e[xr]()) return !1; - if (void 0 !== this[ar]._isSplittable) return this[ar]._isSplittable; - if ("position" === this.layout || this.layout.includes("row")) { - this[ar]._isSplittable = !1; - return !1; + [$isSplittable]() { + const parent = this[$getSubformParent](); + if (!parent[$isSplittable]()) { + return false; } - if (this.keep && "none" !== this.keep.intact) { - this[ar]._isSplittable = !1; - return !1; + if (this[$extra]._isSplittable !== undefined) { + return this[$extra]._isSplittable; } - if (e.layout?.endsWith("-tb") && 0 !== e[ar].numberInLine) return !1; - this[ar]._isSplittable = !0; - return !0; + if (this.layout === "position" || this.layout.includes("row")) { + this[$extra]._isSplittable = false; + return false; + } + if (this.keep && this.keep.intact !== "none") { + this[$extra]._isSplittable = false; + return false; + } + if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { + return false; + } + this[$extra]._isSplittable = true; + return true; } - [an](e) { + [$toHTML](availableSpace) { setTabIndex(this); if (this.break) { - if ("auto" !== this.break.after || "" !== this.break.afterTarget) { - const e = new BreakAfter({ + 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(), }); - e[yr] = this[yr]; - this[Xs](e); - this.breakAfter.push(e); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakAfter.push(node); } - if ("auto" !== this.break.before || "" !== this.break.beforeTarget) { - const e = new BreakBefore({ + 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(), }); - e[yr] = this[yr]; - this[Xs](e); - this.breakBefore.push(e); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.breakBefore.push(node); } - if ("" !== this.break.overflowTarget) { - const e = new Overflow({ + if (this.break.overflowTarget !== "") { + const node = new Overflow({ target: this.break.overflowTarget, leader: this.break.overflowLeader, trailer: this.break.overflowTrailer, }); - e[yr] = this[yr]; - this[Xs](e); - this.overflow.push(e); + node[$globalData] = this[$globalData]; + this[$appendChild](node); + this.overflow.push(node); } - this[jr](this.break); + this[$removeChild](this.break); this.break = null; } - if ("hidden" === this.presence || "inactive" === this.presence) + if (this.presence === "hidden" || this.presence === "inactive") { return HTMLResult.EMPTY; - (this.breakBefore.children.length > 1 || - this.breakAfter.children.length > 1) && + } + if ( + this.breakBefore.children.length > 1 || + this.breakAfter.children.length > 1 + ) { warn( "XFA - Several breakBefore or breakAfter in subforms: please file a bug.", ); - if (this.breakBefore.children.length >= 1) { - const e = this.breakBefore.children[0]; - if (handleBreak(e)) return HTMLResult.breakNode(e); } - if (this[ar]?.afterBreakAfter) return HTMLResult.EMPTY; + if (this.breakBefore.children.length >= 1) { + const breakBefore = this.breakBefore.children[0]; + if (handleBreak(breakBefore)) { + return HTMLResult.breakNode(breakBefore); + } + } + if (this[$extra]?.afterBreakAfter) { + return HTMLResult.EMPTY; + } fixDimensions(this); - const t = [], - i = { id: this[nn], class: [] }; - setAccess(this, i.class); - this[ar] || (this[ar] = Object.create(null)); - Object.assign(this[ar], { - children: t, + const children = []; + const attributes = { + id: this[$uid], + class: [], + }; + setAccess(this, attributes.class); + if (!this[$extra]) { + this[$extra] = Object.create(null); + } + Object.assign(this[$extra], { + children, line: null, - attributes: i, + attributes, attempt: 0, numberInLine: 0, availableSpace: { - width: Math.min(this.w || 1 / 0, e.width), - height: Math.min(this.h || 1 / 0, e.height), + 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 a = this[mr](), - s = a[ar].noLayoutFailure, - r = this[xr](); - r || setFirstUnsplittable(this); - if (!checkDimensions(this, e)) return HTMLResult.FAILURE; - const n = new Set([ + const root = this[$getTemplateRoot](); + const savedNoLayoutFailure = root[$extra].noLayoutFailure; + const isSplittable = this[$isSplittable](); + if (!isSplittable) { + setFirstUnsplittable(this); + } + if (!checkDimensions(this, availableSpace)) { + return HTMLResult.FAILURE; + } + const filter = new Set([ "area", "draw", "exclGroup", @@ -46977,111 +56814,140 @@ class Subform extends XFAObject { "subformSet", ]); if (this.layout.includes("row")) { - const e = this[fr]().columnWidths; - if (Array.isArray(e) && e.length > 0) { - this[ar].columnWidths = e; - this[ar].currentColumn = 0; + const columnWidths = this[$getSubformParent]().columnWidths; + if (Array.isArray(columnWidths) && columnWidths.length > 0) { + this[$extra].columnWidths = columnWidths; + this[$extra].currentColumn = 0; } } - const g = toStyle( - this, - "anchorType", - "dimensions", - "position", - "presence", - "border", - "margin", - "hAlign", - ), - o = ["xfaSubform"], - c = layoutClass(this); - c && o.push(c); - i.style = g; - i.class = o; - this.name && (i.xfaName = this.name); + const style = toStyle( + this, + "anchorType", + "dimensions", + "position", + "presence", + "border", + "margin", + "hAlign", + ); + const classNames = ["xfaSubform"]; + const cl = layoutClass(this); + if (cl) { + classNames.push(cl); + } + attributes.style = style; + attributes.class = classNames; + if (this.name) { + attributes.xfaName = this.name; + } if (this.overflow) { - const t = this.overflow[lr](); - if (t.addLeader) { - t.addLeader = !1; - handleOverflow(this, t.leader, e); + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addLeader) { + overflowExtra.addLeader = false; + handleOverflow(this, overflowExtra.leader, availableSpace); } } - this[Wr](); - const C = "lr-tb" === this.layout || "rl-tb" === this.layout, - h = C ? 2 : 1; - for (; this[ar].attempt < h; this[ar].attempt++) { - C && 1 === this[ar].attempt && (this[ar].numberInLine = 0); - const e = this[Zs]({ filter: n, include: !0 }); - if (e.success) break; - if (e.isBreak()) { - this[Pr](); - return e; + this[$pushPara](); + const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; + const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; + for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { + if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { + this[$extra].numberInLine = 0; + } + const result = this[$childrenToHTML]({ + filter, + include: true, + }); + if (result.success) { + break; + } + if (result.isBreak()) { + this[$popPara](); + return result; } if ( - C && - 0 === this[ar].attempt && - 0 === this[ar].numberInLine && - !a[ar].noLayoutFailure + isLrTb && + this[$extra].attempt === 0 && + this[$extra].numberInLine === 0 && + !root[$extra].noLayoutFailure ) { - this[ar].attempt = h; + this[$extra].attempt = maxRun; break; } } - this[Pr](); - r || unsetFirstUnsplittable(this); - a[ar].noLayoutFailure = s; - if (this[ar].attempt === h) { - this.overflow && (this[mr]()[ar].overflowNode = this.overflow); - r || delete this[ar]; + this[$popPara](); + if (!isSplittable) { + unsetFirstUnsplittable(this); + } + root[$extra].noLayoutFailure = savedNoLayoutFailure; + if (this[$extra].attempt === maxRun) { + if (this.overflow) { + this[$getTemplateRoot]()[$extra].overflowNode = this.overflow; + } + if (!isSplittable) { + delete this[$extra]; + } return HTMLResult.FAILURE; } if (this.overflow) { - const t = this.overflow[lr](); - if (t.addTrailer) { - t.addTrailer = !1; - handleOverflow(this, t.trailer, e); + const overflowExtra = this.overflow[$getExtra](); + if (overflowExtra.addTrailer) { + overflowExtra.addTrailer = false; + handleOverflow(this, overflowExtra.trailer, availableSpace); } } - let l = 0, - Q = 0; + let marginH = 0; + let marginV = 0; if (this.margin) { - l = this.margin.leftInset + this.margin.rightInset; - Q = this.margin.topInset + this.margin.bottomInset; + marginH = this.margin.leftInset + this.margin.rightInset; + marginV = this.margin.topInset + this.margin.bottomInset; } - const E = Math.max(this[ar].width + l, this.w || 0), - u = Math.max(this[ar].height + Q, this.h || 0), - d = [this.x, this.y, E, u]; - "" === this.w && (g.width = measureToString(E)); - "" === this.h && (g.height = measureToString(u)); - if (("0px" === g.width || "0px" === g.height) && 0 === t.length) + const width = Math.max(this[$extra].width + marginH, this.w || 0); + const height = Math.max(this[$extra].height + marginV, this.h || 0); + const bbox = [this.x, this.y, width, height]; + if (this.w === "") { + style.width = measureToString(width); + } + if (this.h === "") { + style.height = measureToString(height); + } + if ( + (style.width === "0px" || style.height === "0px") && + children.length === 0 + ) { return HTMLResult.EMPTY; - const f = { name: "div", attributes: i, children: t }; - applyAssist(this, i); - const p = HTMLResult.success(createWrapper(this, f), d); + } + const html = { + name: "div", + attributes, + children, + }; + applyAssist(this, attributes); + const result = HTMLResult.success(createWrapper(this, html), bbox); if (this.breakAfter.children.length >= 1) { - const e = this.breakAfter.children[0]; - if (handleBreak(e)) { - this[ar].afterBreakAfter = p; - return HTMLResult.breakNode(e); + const breakAfter = this.breakAfter.children[0]; + if (handleBreak(breakAfter)) { + this[$extra].afterBreakAfter = result; + return HTMLResult.breakNode(breakAfter); } } - delete this[ar]; - return p; + delete this[$extra]; + return result; } } class SubformSet extends XFAObject { - constructor(e) { - super(Hn, "subformSet", !0); - this.id = e.id || ""; - this.name = e.name || ""; - this.relation = getStringOption(e.relation, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "subformSet", true); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.relation = getStringOption(attributes.relation, [ "ordered", "choice", "unordered", ]); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.bookend = null; this.break = null; this.desc = null; @@ -47093,55 +56959,58 @@ class SubformSet extends XFAObject { this.subform = new XFAObjectArray(); this.subformSet = new XFAObjectArray(); } - *[ur]() { + *[$getContainedChildren]() { yield* getContainedChildren(this); } - [fr]() { - let e = this[pr](); - for (; !(e instanceof Subform); ) e = e[pr](); - return e; + [$getSubformParent]() { + let parent = this[$getParent](); + while (!(parent instanceof Subform)) { + parent = parent[$getParent](); + } + return parent; } - [kr]() { - return !0; + [$isBindable]() { + return true; } } class SubjectDN extends ContentObject { - constructor(e) { - super(Hn, "subjectDN"); - this.delimiter = e.delimiter || ","; - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 || ""; } - [sr]() { - this[er] = new Map( - this[er].split(this.delimiter).map((e) => { - (e = e.split("=", 2))[0] = e[0].trim(); - return e; + [$finalize]() { + this[$content] = new Map( + this[$content].split(this.delimiter).map((kv) => { + kv = kv.split("=", 2); + kv[0] = kv[0].trim(); + return kv; }), ); } } class SubjectDNs extends XFAObject { - constructor(e) { - super(Hn, "subjectDNs", !0); - this.id = e.id || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "subjectDNs", true); + this.id = attributes.id || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.subjectDN = new XFAObjectArray(); } } class Submit extends XFAObject { - constructor(e) { - super(Hn, "submit", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "submit", true); this.embedPDF = getInteger({ - data: e.embedPDF, + data: attributes.embedPDF, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.format = getStringOption(e.format, [ + this.format = getStringOption(attributes.format, [ "xdp", "formdata", "pdf", @@ -47149,12 +57018,14 @@ class Submit extends XFAObject { "xfd", "xml", ]); - this.id = e.id || ""; - this.target = e.target || ""; + this.id = attributes.id || ""; + this.target = attributes.target || ""; this.textEncoding = getKeyword({ - data: e.textEncoding ? e.textEncoding.toLowerCase() : "", + data: attributes.textEncoding + ? attributes.textEncoding.toLowerCase() + : "", defaultValue: "", - validate: (e) => + validate: (k) => [ "utf-8", "big-five", @@ -47167,302 +57038,371 @@ class Submit extends XFAObject { "shift-jis", "ucs-2", "utf-16", - ].includes(e) || e.match(/iso-8859-\d{2}/), + ].includes(k) || k.match(/iso-8859-\d{2}/), }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.xdpContent = e.xdpContent || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.xdpContent = attributes.xdpContent || ""; this.encrypt = null; this.encryptData = new XFAObjectArray(); this.signData = new XFAObjectArray(); } } class Template extends XFAObject { - constructor(e) { - super(Hn, "template", !0); - this.baseProfile = getStringOption(e.baseProfile, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "template", true); + this.baseProfile = getStringOption(attributes.baseProfile, [ "full", "interactiveForms", ]); this.extras = null; this.subform = new XFAObjectArray(); } - [sr]() { - 0 === this.subform.children.length && + [$finalize]() { + if (this.subform.children.length === 0) { warn("XFA - No subforms in template node."); - this.subform.children.length >= 2 && + } + if (this.subform.children.length >= 2) { warn("XFA - Several subforms in template node: please file a bug."); - this[An] = 5e3; + } + this[$tabIndex] = DEFAULT_TAB_INDEX; } - [xr]() { - return !0; + [$isSplittable]() { + return true; } - [Vr](e, t) { - return e.startsWith("#") - ? [this[Dr].get(e.slice(1))] - : searchNode(this, t, e, !0, !0); + [$searchNode](expr, container) { + if (expr.startsWith("#")) { + return [this[$ids].get(expr.slice(1))]; + } + return searchNode(this, container, expr, true, true); } - *[tn]() { - if (!this.subform.children.length) - return HTMLResult.success({ name: "div", children: [] }); - this[ar] = { + *[$toPages]() { + if (!this.subform.children.length) { + return HTMLResult.success({ + name: "div", + children: [], + }); + } + this[$extra] = { overflowNode: null, firstUnsplittable: null, currentContentArea: null, currentPageArea: null, - noLayoutFailure: !1, + noLayoutFailure: false, pageNumber: 1, pagePosition: "first", oddOrEven: "odd", blankOrNotBlank: "nonBlank", paraStack: [], }; - const e = this.subform.children[0]; - e.pageSet[zs](); - const t = e.pageSet.pageArea.children, - i = { name: "div", children: [] }; - let a = null, - s = null, - r = null; - if (e.breakBefore.children.length >= 1) { - s = e.breakBefore.children[0]; - r = s.target; + const root = this.subform.children[0]; + root.pageSet[$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 ( - e.subform.children.length >= 1 && - e.subform.children[0].breakBefore.children.length >= 1 + root.subform.children.length >= 1 && + root.subform.children[0].breakBefore.children.length >= 1 ) { - s = e.subform.children[0].breakBefore.children[0]; - r = s.target; - } else if (e.break?.beforeTarget) { - s = e.break; - r = s.beforeTarget; + breakBefore = root.subform.children[0].breakBefore.children[0]; + breakBeforeTarget = breakBefore.target; + } else if (root.break?.beforeTarget) { + breakBefore = root.break; + breakBeforeTarget = breakBefore.beforeTarget; } else if ( - e.subform.children.length >= 1 && - e.subform.children[0].break?.beforeTarget + root.subform.children.length >= 1 && + root.subform.children[0].break?.beforeTarget ) { - s = e.subform.children[0].break; - r = s.beforeTarget; + breakBefore = root.subform.children[0].break; + breakBeforeTarget = breakBefore.beforeTarget; } - if (s) { - const e = this[Vr](r, s[pr]()); - if (e instanceof PageArea) { - a = e; - s[ar] = {}; + if (breakBefore) { + const target = this[$searchNode]( + breakBeforeTarget, + breakBefore[$getParent](), + ); + if (target instanceof PageArea) { + pageArea = target; + breakBefore[$extra] = {}; } } - a || (a = t[0]); - a[ar] = { numberOfUse: 1 }; - const n = a[pr](); - n[ar] = { + if (!pageArea) { + pageArea = pageAreas[0]; + } + pageArea[$extra] = { numberOfUse: 1, - pageIndex: n.pageArea.children.indexOf(a), + }; + const pageAreaParent = pageArea[$getParent](); + pageAreaParent[$extra] = { + numberOfUse: 1, + pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), pageSetIndex: 0, }; - let g, - o = null, - c = null, - C = !0, - h = 0, - l = 0; - for (;;) { - if (C) h = 0; - else { - i.children.pop(); - if (3 == ++h) { + 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) { warn("XFA - Something goes wrong: please file a bug."); - return i; + return mainHtml; } + } else { + hasSomethingCounter = 0; } - g = null; - this[ar].currentPageArea = a; - const t = a[an]().html; - i.children.push(t); - if (o) { - this[ar].noLayoutFailure = !0; - t.children.push(o[an](a[ar].space).html); - o = null; + targetPageArea = null; + this[$extra].currentPageArea = pageArea; + const page = pageArea[$toHTML]().html; + mainHtml.children.push(page); + if (leader) { + this[$extra].noLayoutFailure = true; + page.children.push(leader[$toHTML](pageArea[$extra].space).html); + leader = null; } - if (c) { - this[ar].noLayoutFailure = !0; - t.children.push(c[an](a[ar].space).html); - c = null; + if (trailer) { + this[$extra].noLayoutFailure = true; + page.children.push(trailer[$toHTML](pageArea[$extra].space).html); + trailer = null; } - const s = a.contentArea.children, - r = t.children.filter((e) => - e.attributes.class.includes("xfaContentarea"), - ); - C = !1; - this[ar].firstUnsplittable = null; - this[ar].noLayoutFailure = !1; - const flush = (t) => { - const i = e[rr](); - if (i) { - C ||= i.children?.length > 0; - r[t].children.push(i); + const contentAreas = pageArea.contentArea.children; + const htmlContentAreas = page.children.filter((node) => + node.attributes.class.includes("xfaContentarea"), + ); + hasSomething = false; + this[$extra].firstUnsplittable = null; + this[$extra].noLayoutFailure = false; + const flush = (index) => { + const html = root[$flushHTML](); + if (html) { + hasSomething ||= html.children?.length > 0; + htmlContentAreas[index].children.push(html); } }; - for (let t = l, a = s.length; t < a; t++) { - const a = (this[ar].currentContentArea = s[t]), - n = { width: a.w, height: a.h }; - l = 0; - if (o) { - r[t].children.push(o[an](n).html); - o = null; + for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { + const contentArea = (this[$extra].currentContentArea = contentAreas[i]); + const space = { + width: contentArea.w, + height: contentArea.h, + }; + startIndex = 0; + if (leader) { + htmlContentAreas[i].children.push(leader[$toHTML](space).html); + leader = null; } - if (c) { - r[t].children.push(c[an](n).html); - c = null; + if (trailer) { + htmlContentAreas[i].children.push(trailer[$toHTML](space).html); + trailer = null; } - const h = e[an](n); - if (h.success) { - if (h.html) { - C ||= h.html.children?.length > 0; - r[t].children.push(h.html); - } else !C && i.children.length > 1 && i.children.pop(); - return i; - } - if (h.isBreak()) { - const e = h.breakNode; - flush(t); - if ("auto" === e.targetType) continue; - if (e.leader) { - o = this[Vr](e.leader, e[pr]()); - o = o ? o[0] : null; + const html = root[$toHTML](space); + if (html.success) { + if (html.html) { + hasSomething ||= html.html.children?.length > 0; + htmlContentAreas[i].children.push(html.html); + } else if (!hasSomething && mainHtml.children.length > 1) { + mainHtml.children.pop(); } - if (e.trailer) { - c = this[Vr](e.trailer, e[pr]()); - c = c ? c[0] : null; + return mainHtml; + } + if (html.isBreak()) { + const node = html.breakNode; + flush(i); + if (node.targetType === "auto") { + continue; } - if ("pageArea" === e.targetType) { - g = e[ar].target; - t = 1 / 0; - } else if (e[ar].target) { - g = e[ar].target; - l = e[ar].index + 1; - t = 1 / 0; - } else t = e[ar].index; - } else if (this[ar].overflowNode) { - const e = this[ar].overflowNode; - this[ar].overflowNode = null; - const i = e[lr](), - a = i.target; - i.addLeader = null !== i.leader; - i.addTrailer = null !== i.trailer; - flush(t); - const r = t; - t = 1 / 0; - if (a instanceof PageArea) g = a; - else if (a instanceof ContentArea) { - const e = s.indexOf(a); - if (-1 !== e) e > r ? (t = e - 1) : (l = e); - else { - g = a[pr](); - l = g.contentArea.children.indexOf(a); + if (node.leader) { + leader = this[$searchNode](node.leader, node[$getParent]()); + leader = leader ? leader[0] : null; + } + if (node.trailer) { + trailer = this[$searchNode](node.trailer, node[$getParent]()); + trailer = trailer ? trailer[0] : null; + } + if (node.targetType === "pageArea") { + targetPageArea = node[$extra].target; + i = Infinity; + } else if (!node[$extra].target) { + i = node[$extra].index; + } else { + targetPageArea = node[$extra].target; + startIndex = node[$extra].index + 1; + i = Infinity; + } + continue; + } + if (this[$extra].overflowNode) { + const node = this[$extra].overflowNode; + this[$extra].overflowNode = null; + const overflowExtra = node[$getExtra](); + const target = overflowExtra.target; + overflowExtra.addLeader = overflowExtra.leader !== null; + overflowExtra.addTrailer = overflowExtra.trailer !== null; + flush(i); + const currentIndex = i; + i = Infinity; + if (target instanceof PageArea) { + targetPageArea = target; + } else if (target instanceof ContentArea) { + const index = contentAreas.indexOf(target); + if (index !== -1) { + if (index > currentIndex) { + i = index - 1; + } else { + startIndex = index; + } + } else { + targetPageArea = target[$getParent](); + startIndex = targetPageArea.contentArea.children.indexOf(target); } } - } else flush(t); + continue; + } + flush(i); } - this[ar].pageNumber += 1; - g && (g[Lr]() ? (g[ar].numberOfUse += 1) : (g = null)); - a = g || a[dr](); + this[$extra].pageNumber += 1; + if (targetPageArea) { + if (targetPageArea[$isUsable]()) { + targetPageArea[$extra].numberOfUse += 1; + } else { + targetPageArea = null; + } + } + pageArea = targetPageArea || pageArea[$getNextPage](); yield null; } } } class Text extends ContentObject { - constructor(e) { - super(Hn, "text"); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "text"); + this.id = attributes.id || ""; this.maxChars = getInteger({ - data: e.maxChars, + data: attributes.maxChars, defaultValue: 0, - validate: (e) => e >= 0, + validate: (x) => x >= 0, }); - this.name = e.name || ""; - this.rid = e.rid || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.name = attributes.name || ""; + this.rid = attributes.rid || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [Ws]() { - return !0; + [$acceptWhitespace]() { + return true; } - [Kr](e) { - if (e[Jr] === on.xhtml.id) { - this[er] = e; - return !0; + [$onChild](child) { + if (child[$namespaceId] === NamespaceIds.xhtml.id) { + this[$content] = child; + return true; } - warn(`XFA - Invalid content in Text: ${e[Yr]}.`); - return !1; + warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); + return false; } - [qr](e) { - this[er] instanceof XFAObject || super[qr](e); + [$onText](str) { + if (this[$content] instanceof XFAObject) { + return; + } + super[$onText](str); } - [sr]() { - "string" == typeof this[er] && - (this[er] = this[er].replaceAll("\r\n", "\n")); + [$finalize]() { + if (typeof this[$content] === "string") { + this[$content] = this[$content].replaceAll("\r\n", "\n"); + } } - [lr]() { - return "string" == typeof this[er] - ? this[er] - .split(/[\u2029\u2028\n]/) - .reduce((e, t) => { - t && e.push(t); - return e; - }, []) - .join("\n") - : this[er][en](); + [$getExtra]() { + if (typeof this[$content] === "string") { + return this[$content] + .split(/[\u2029\u2028\n]/) + .reduce((acc, line) => { + if (line) { + acc.push(line); + } + return acc; + }, []) + .join("\n"); + } + return this[$content][$text](); } - [an](e) { - if ("string" == typeof this[er]) { - const e = valueToHtml(this[er]).html; - if (this[er].includes("\u2029")) { - e.name = "div"; - e.children = []; - this[er] + [$toHTML](availableSpace) { + if (typeof this[$content] === "string") { + const html = valueToHtml(this[$content]).html; + if (this[$content].includes("\u2029")) { + html.name = "div"; + html.children = []; + this[$content] .split("\u2029") - .map((e) => - e.split(/[\u2028\n]/).reduce((e, t) => { - e.push({ name: "span", value: t }, { name: "br" }); - return e; + .map((para) => + para.split(/[\u2028\n]/).reduce((acc, line) => { + acc.push( + { + name: "span", + value: line, + }, + { + name: "br", + }, + ); + return acc; }, []), ) - .forEach((t) => { - e.children.push({ name: "p", children: t }); + .forEach((lines) => { + html.children.push({ + name: "p", + children: lines, + }); }); - } else if (/[\u2028\n]/.test(this[er])) { - e.name = "div"; - e.children = []; - this[er].split(/[\u2028\n]/).forEach((t) => { - e.children.push({ name: "span", value: t }, { name: "br" }); + } else if (/[\u2028\n]/.test(this[$content])) { + html.name = "div"; + html.children = []; + this[$content].split(/[\u2028\n]/).forEach((line) => { + html.children.push( + { + name: "span", + value: line, + }, + { + name: "br", + }, + ); }); } - return HTMLResult.success(e); + return HTMLResult.success(html); } - return this[er][an](e); + return this[$content][$toHTML](availableSpace); } } class TextEdit extends XFAObject { - constructor(e) { - super(Hn, "textEdit", !0); + constructor(attributes) { + super(TEMPLATE_NS_ID, "textEdit", true); this.allowRichText = getInteger({ - data: e.allowRichText, + data: attributes.allowRichText, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.hScrollPolicy = getStringOption(e.hScrollPolicy, [ + this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [ "auto", "off", "on", ]); - this.id = e.id || ""; + this.id = attributes.id || ""; this.multiLine = getInteger({ - data: e.multiLine, + data: attributes.multiLine, defaultValue: "", - validate: (e) => 0 === e || 1 === e, + validate: (x) => x === 0 || x === 1, }); - this.use = e.use || ""; - this.usehref = e.usehref || ""; - this.vScrollPolicy = getStringOption(e.vScrollPolicy, [ + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; + this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, [ "auto", "off", "on", @@ -47472,97 +57412,102 @@ class TextEdit extends XFAObject { this.extras = null; this.margin = null; } - [an](e) { - const t = toStyle(this, "border", "font", "margin"); - let i; - const a = this[pr]()[pr](); - "" === this.multiLine && (this.multiLine = a instanceof Draw ? 1 : 0); - i = - 1 === this.multiLine - ? { - name: "textarea", - attributes: { - dataId: a[tr]?.[nn] || a[nn], - fieldId: a[nn], - class: ["xfaTextfield"], - style: t, - "aria-label": ariaLabel(a), - "aria-required": !1, - }, - } - : { - name: "input", - attributes: { - type: "text", - dataId: a[tr]?.[nn] || a[nn], - fieldId: a[nn], - class: ["xfaTextfield"], - style: t, - "aria-label": ariaLabel(a), - "aria-required": !1, - }, - }; - if (isRequired(a)) { - i.attributes["aria-required"] = !0; - i.attributes.required = !0; + [$toHTML](availableSpace) { + const style = toStyle(this, "border", "font", "margin"); + let html; + const field = this[$getParent]()[$getParent](); + if (this.multiLine === "") { + this.multiLine = field instanceof Draw ? 1 : 0; + } + if (this.multiLine === 1) { + html = { + name: "textarea", + attributes: { + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false, + }, + }; + } else { + html = { + name: "input", + attributes: { + type: "text", + dataId: field[$data]?.[$uid] || field[$uid], + fieldId: field[$uid], + class: ["xfaTextfield"], + style, + "aria-label": ariaLabel(field), + "aria-required": false, + }, + }; + } + if (isRequired(field)) { + html.attributes["aria-required"] = true; + html.attributes.required = true; } return HTMLResult.success({ name: "label", - attributes: { class: ["xfaLabel"] }, - children: [i], + attributes: { + class: ["xfaLabel"], + }, + children: [html], }); } } class Time extends StringObject { - constructor(e) { - super(Hn, "time"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "time"); + this.id = attributes.id || ""; + this.name = attributes.name || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } - [sr]() { - const e = this[er].trim(); - this[er] = e ? new Date(e) : null; + [$finalize]() { + const date = this[$content].trim(); + this[$content] = date ? new Date(date) : null; } - [an](e) { - return valueToHtml(this[er] ? this[er].toString() : ""); + [$toHTML](availableSpace) { + return valueToHtml(this[$content] ? this[$content].toString() : ""); } } class TimeStamp extends XFAObject { - constructor(e) { - super(Hn, "timeStamp"); - this.id = e.id || ""; - this.server = e.server || ""; - this.type = getStringOption(e.type, ["optional", "required"]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "timeStamp"); + this.id = attributes.id || ""; + this.server = attributes.server || ""; + this.type = getStringOption(attributes.type, ["optional", "required"]); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; } } class ToolTip extends StringObject { - constructor(e) { - super(Hn, "toolTip"); - this.id = e.id || ""; - this.rid = e.rid || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(Hn, "traversal", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObjectArray(); } } class Traverse extends XFAObject { - constructor(e) { - super(Hn, "traverse", !0); - this.id = e.id || ""; - this.operation = getStringOption(e.operation, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "traverse", true); + this.id = attributes.id || ""; + this.operation = getStringOption(attributes.operation, [ "next", "back", "down", @@ -47571,25 +57516,25 @@ class Traverse extends XFAObject { "right", "up", ]); - this.ref = e.ref || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.ref = attributes.ref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; this.script = null; } get name() { return this.operation; } - [Mr]() { - return !1; + [$isTransparent]() { + return false; } } class Ui extends XFAObject { - constructor(e) { - super(Hn, "ui", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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; @@ -47604,46 +57549,52 @@ class Ui extends XFAObject { this.signature = null; this.textEdit = null; } - [lr]() { - if (void 0 === this[ar]) { - for (const e of Object.getOwnPropertyNames(this)) { - if ("extras" === e || "picture" === e) continue; - const t = this[e]; - if (t instanceof XFAObject) { - this[ar] = t; - return t; + [$getExtra]() { + if (this[$extra] === undefined) { + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "extras" || name === "picture") { + continue; } + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + this[$extra] = obj; + return obj; } - this[ar] = null; + this[$extra] = null; } - return this[ar]; + return this[$extra]; } - [an](e) { - const t = this[lr](); - return t ? t[an](e) : HTMLResult.EMPTY; + [$toHTML](availableSpace) { + const obj = this[$getExtra](); + if (obj) { + return obj[$toHTML](availableSpace); + } + return HTMLResult.EMPTY; } } class Validate extends XFAObject { - constructor(e) { - super(Hn, "validate", !0); - this.formatTest = getStringOption(e.formatTest, [ + constructor(attributes) { + super(TEMPLATE_NS_ID, "validate", true); + this.formatTest = getStringOption(attributes.formatTest, [ "warning", "disabled", "error", ]); - this.id = e.id || ""; - this.nullTest = getStringOption(e.nullTest, [ + this.id = attributes.id || ""; + this.nullTest = getStringOption(attributes.nullTest, [ "disabled", "error", "warning", ]); - this.scriptTest = getStringOption(e.scriptTest, [ + this.scriptTest = getStringOption(attributes.scriptTest, [ "error", "disabled", "warning", ]); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.extras = null; this.message = null; this.picture = null; @@ -47651,17 +57602,17 @@ class Validate extends XFAObject { } } class Value extends XFAObject { - constructor(e) { - super(Hn, "value", !0); - this.id = e.id || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "value", true); + this.id = attributes.id || ""; this.override = getInteger({ - data: e.override, + data: attributes.override, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); - this.relevant = getRelevant(e.relevant); - this.use = e.use || ""; - this.usehref = e.usehref || ""; + this.relevant = getRelevant(attributes.relevant); + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.arc = null; this.boolean = null; this.date = null; @@ -47676,55 +57627,68 @@ class Value extends XFAObject { this.text = null; this.time = null; } - [$r](e) { - const t = this[pr](); - if (t instanceof Field && t.ui?.imageEdit) { - if (!this.image) { - this.image = new Image({}); - this[Xs](this.image); + [$setValue](value) { + const parent = this[$getParent](); + if (parent instanceof Field) { + if (parent.ui?.imageEdit) { + if (!this.image) { + this.image = new Image({}); + this[$appendChild](this.image); + } + this.image[$content] = value[$content]; + return; } - this.image[er] = e[er]; + } + const valueName = value[$nodeName]; + if (this[valueName] !== null) { + this[valueName][$content] = value[$content]; return; } - const i = e[Yr]; - if (null === this[i]) { - for (const e of Object.getOwnPropertyNames(this)) { - const t = this[e]; - if (t instanceof XFAObject) { - this[e] = null; - this[jr](t); - } + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (obj instanceof XFAObject) { + this[name] = null; + this[$removeChild](obj); } - this[e[Yr]] = e; - this[Xs](e); - } else this[i][er] = e[er]; + } + this[value[$nodeName]] = value; + this[$appendChild](value); } - [en]() { - if (this.exData) - return "string" == typeof this.exData[er] - ? this.exData[er].trim() - : this.exData[er][en]().trim(); - for (const e of Object.getOwnPropertyNames(this)) { - if ("image" === e) continue; - const t = this[e]; - if (t instanceof XFAObject) return (t[er] || "").toString().trim(); + [$text]() { + if (this.exData) { + if (typeof this.exData[$content] === "string") { + return this.exData[$content].trim(); + } + return this.exData[$content][$text]().trim(); + } + for (const name of Object.getOwnPropertyNames(this)) { + if (name === "image") { + continue; + } + const obj = this[name]; + if (obj instanceof XFAObject) { + return (obj[$content] || "").toString().trim(); + } } return null; } - [an](e) { - for (const t of Object.getOwnPropertyNames(this)) { - const i = this[t]; - if (i instanceof XFAObject) return i[an](e); + [$toHTML](availableSpace) { + for (const name of Object.getOwnPropertyNames(this)) { + const obj = this[name]; + if (!(obj instanceof XFAObject)) { + continue; + } + return obj[$toHTML](availableSpace); } return HTMLResult.EMPTY; } } class Variables extends XFAObject { - constructor(e) { - super(Hn, "variables", !0); - this.id = e.id || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + constructor(attributes) { + super(TEMPLATE_NS_ID, "variables", true); + this.id = attributes.id || ""; + this.use = attributes.use || ""; + this.usehref = attributes.usehref || ""; this.boolean = new XFAObjectArray(); this.date = new XFAObjectArray(); this.dateTime = new XFAObjectArray(); @@ -47738,371 +57702,374 @@ class Variables extends XFAObject { this.text = new XFAObjectArray(); this.time = new XFAObjectArray(); } - [Mr]() { - return !0; + [$isTransparent]() { + return true; } } class TemplateNamespace { - static [gn](e, t) { - if (TemplateNamespace.hasOwnProperty(e)) { - const i = TemplateNamespace[e](t); - i[_r](t); - return i; + static [$buildXFAObject](name, attributes) { + if (TemplateNamespace.hasOwnProperty(name)) { + const node = TemplateNamespace[name](attributes); + node[$setSetAttributes](attributes); + return node; } + return undefined; } - static appearanceFilter(e) { - return new AppearanceFilter(e); + static appearanceFilter(attrs) { + return new AppearanceFilter(attrs); } - static arc(e) { - return new Arc(e); + static arc(attrs) { + return new Arc(attrs); } - static area(e) { - return new Area(e); + static area(attrs) { + return new Area(attrs); } - static assist(e) { - return new Assist(e); + static assist(attrs) { + return new Assist(attrs); } - static barcode(e) { - return new Barcode(e); + static barcode(attrs) { + return new Barcode(attrs); } - static bind(e) { - return new Bind(e); + static bind(attrs) { + return new Bind(attrs); } - static bindItems(e) { - return new BindItems(e); + static bindItems(attrs) { + return new BindItems(attrs); } - static bookend(e) { - return new Bookend(e); + static bookend(attrs) { + return new Bookend(attrs); } - static boolean(e) { - return new BooleanElement(e); + static boolean(attrs) { + return new BooleanElement(attrs); } - static border(e) { - return new Border(e); + static border(attrs) { + return new Border(attrs); } - static break(e) { - return new Break(e); + static break(attrs) { + return new Break(attrs); } - static breakAfter(e) { - return new BreakAfter(e); + static breakAfter(attrs) { + return new BreakAfter(attrs); } - static breakBefore(e) { - return new BreakBefore(e); + static breakBefore(attrs) { + return new BreakBefore(attrs); } - static button(e) { - return new Button(e); + static button(attrs) { + return new Button(attrs); } - static calculate(e) { - return new Calculate(e); + static calculate(attrs) { + return new Calculate(attrs); } - static caption(e) { - return new Caption(e); + static caption(attrs) { + return new Caption(attrs); } - static certificate(e) { - return new Certificate(e); + static certificate(attrs) { + return new Certificate(attrs); } - static certificates(e) { - return new Certificates(e); + static certificates(attrs) { + return new Certificates(attrs); } - static checkButton(e) { - return new CheckButton(e); + static checkButton(attrs) { + return new CheckButton(attrs); } - static choiceList(e) { - return new ChoiceList(e); + static choiceList(attrs) { + return new ChoiceList(attrs); } - static color(e) { - return new Color(e); + static color(attrs) { + return new Color(attrs); } - static comb(e) { - return new Comb(e); + static comb(attrs) { + return new Comb(attrs); } - static connect(e) { - return new Connect(e); + static connect(attrs) { + return new Connect(attrs); } - static contentArea(e) { - return new ContentArea(e); + static contentArea(attrs) { + return new ContentArea(attrs); } - static corner(e) { - return new Corner(e); + static corner(attrs) { + return new Corner(attrs); } - static date(e) { - return new DateElement(e); + static date(attrs) { + return new DateElement(attrs); } - static dateTime(e) { - return new DateTime(e); + static dateTime(attrs) { + return new DateTime(attrs); } - static dateTimeEdit(e) { - return new DateTimeEdit(e); + static dateTimeEdit(attrs) { + return new DateTimeEdit(attrs); } - static decimal(e) { - return new Decimal(e); + static decimal(attrs) { + return new Decimal(attrs); } - static defaultUi(e) { - return new DefaultUi(e); + static defaultUi(attrs) { + return new DefaultUi(attrs); } - static desc(e) { - return new Desc(e); + static desc(attrs) { + return new Desc(attrs); } - static digestMethod(e) { - return new DigestMethod(e); + static digestMethod(attrs) { + return new DigestMethod(attrs); } - static digestMethods(e) { - return new DigestMethods(e); + static digestMethods(attrs) { + return new DigestMethods(attrs); } - static draw(e) { - return new Draw(e); + static draw(attrs) { + return new Draw(attrs); } - static edge(e) { - return new Edge(e); + static edge(attrs) { + return new Edge(attrs); } - static encoding(e) { - return new Encoding(e); + static encoding(attrs) { + return new Encoding(attrs); } - static encodings(e) { - return new Encodings(e); + static encodings(attrs) { + return new Encodings(attrs); } - static encrypt(e) { - return new Encrypt(e); + static encrypt(attrs) { + return new Encrypt(attrs); } - static encryptData(e) { - return new EncryptData(e); + static encryptData(attrs) { + return new EncryptData(attrs); } - static encryption(e) { - return new Encryption(e); + static encryption(attrs) { + return new Encryption(attrs); } - static encryptionMethod(e) { - return new EncryptionMethod(e); + static encryptionMethod(attrs) { + return new EncryptionMethod(attrs); } - static encryptionMethods(e) { - return new EncryptionMethods(e); + static encryptionMethods(attrs) { + return new EncryptionMethods(attrs); } - static event(e) { - return new Event(e); + static event(attrs) { + return new Event(attrs); } - static exData(e) { - return new ExData(e); + static exData(attrs) { + return new ExData(attrs); } - static exObject(e) { - return new ExObject(e); + static exObject(attrs) { + return new ExObject(attrs); } - static exclGroup(e) { - return new ExclGroup(e); + static exclGroup(attrs) { + return new ExclGroup(attrs); } - static execute(e) { - return new Execute(e); + static execute(attrs) { + return new Execute(attrs); } - static extras(e) { - return new Extras(e); + static extras(attrs) { + return new Extras(attrs); } - static field(e) { - return new Field(e); + static field(attrs) { + return new Field(attrs); } - static fill(e) { - return new Fill(e); + static fill(attrs) { + return new Fill(attrs); } - static filter(e) { - return new Filter(e); + static filter(attrs) { + return new Filter(attrs); } - static float(e) { - return new Float(e); + static float(attrs) { + return new Float(attrs); } - static font(e) { - return new template_Font(e); + static font(attrs) { + return new template_Font(attrs); } - static format(e) { - return new Format(e); + static format(attrs) { + return new Format(attrs); } - static handler(e) { - return new Handler(e); + static handler(attrs) { + return new Handler(attrs); } - static hyphenation(e) { - return new Hyphenation(e); + static hyphenation(attrs) { + return new Hyphenation(attrs); } - static image(e) { - return new Image(e); + static image(attrs) { + return new Image(attrs); } - static imageEdit(e) { - return new ImageEdit(e); + static imageEdit(attrs) { + return new ImageEdit(attrs); } - static integer(e) { - return new Integer(e); + static integer(attrs) { + return new Integer(attrs); } - static issuers(e) { - return new Issuers(e); + static issuers(attrs) { + return new Issuers(attrs); } - static items(e) { - return new Items(e); + static items(attrs) { + return new Items(attrs); } - static keep(e) { - return new Keep(e); + static keep(attrs) { + return new Keep(attrs); } - static keyUsage(e) { - return new KeyUsage(e); + static keyUsage(attrs) { + return new KeyUsage(attrs); } - static line(e) { - return new Line(e); + static line(attrs) { + return new Line(attrs); } - static linear(e) { - return new Linear(e); + static linear(attrs) { + return new Linear(attrs); } - static lockDocument(e) { - return new LockDocument(e); + static lockDocument(attrs) { + return new LockDocument(attrs); } - static manifest(e) { - return new Manifest(e); + static manifest(attrs) { + return new Manifest(attrs); } - static margin(e) { - return new Margin(e); + static margin(attrs) { + return new Margin(attrs); } - static mdp(e) { - return new Mdp(e); + static mdp(attrs) { + return new Mdp(attrs); } - static medium(e) { - return new Medium(e); + static medium(attrs) { + return new Medium(attrs); } - static message(e) { - return new Message(e); + static message(attrs) { + return new Message(attrs); } - static numericEdit(e) { - return new NumericEdit(e); + static numericEdit(attrs) { + return new NumericEdit(attrs); } - static occur(e) { - return new Occur(e); + static occur(attrs) { + return new Occur(attrs); } - static oid(e) { - return new Oid(e); + static oid(attrs) { + return new Oid(attrs); } - static oids(e) { - return new Oids(e); + static oids(attrs) { + return new Oids(attrs); } - static overflow(e) { - return new Overflow(e); + static overflow(attrs) { + return new Overflow(attrs); } - static pageArea(e) { - return new PageArea(e); + static pageArea(attrs) { + return new PageArea(attrs); } - static pageSet(e) { - return new PageSet(e); + static pageSet(attrs) { + return new PageSet(attrs); } - static para(e) { - return new Para(e); + static para(attrs) { + return new Para(attrs); } - static passwordEdit(e) { - return new PasswordEdit(e); + static passwordEdit(attrs) { + return new PasswordEdit(attrs); } - static pattern(e) { - return new template_Pattern(e); + static pattern(attrs) { + return new template_Pattern(attrs); } - static picture(e) { - return new Picture(e); + static picture(attrs) { + return new Picture(attrs); } - static proto(e) { - return new Proto(e); + static proto(attrs) { + return new Proto(attrs); } - static radial(e) { - return new Radial(e); + static radial(attrs) { + return new Radial(attrs); } - static reason(e) { - return new Reason(e); + static reason(attrs) { + return new Reason(attrs); } - static reasons(e) { - return new Reasons(e); + static reasons(attrs) { + return new Reasons(attrs); } - static rectangle(e) { - return new Rectangle(e); + static rectangle(attrs) { + return new Rectangle(attrs); } - static ref(e) { - return new RefElement(e); + static ref(attrs) { + return new RefElement(attrs); } - static script(e) { - return new Script(e); + static script(attrs) { + return new Script(attrs); } - static setProperty(e) { - return new SetProperty(e); + static setProperty(attrs) { + return new SetProperty(attrs); } - static signData(e) { - return new SignData(e); + static signData(attrs) { + return new SignData(attrs); } - static signature(e) { - return new Signature(e); + static signature(attrs) { + return new Signature(attrs); } - static signing(e) { - return new Signing(e); + static signing(attrs) { + return new Signing(attrs); } - static solid(e) { - return new Solid(e); + static solid(attrs) { + return new Solid(attrs); } - static speak(e) { - return new Speak(e); + static speak(attrs) { + return new Speak(attrs); } - static stipple(e) { - return new Stipple(e); + static stipple(attrs) { + return new Stipple(attrs); } - static subform(e) { - return new Subform(e); + static subform(attrs) { + return new Subform(attrs); } - static subformSet(e) { - return new SubformSet(e); + static subformSet(attrs) { + return new SubformSet(attrs); } - static subjectDN(e) { - return new SubjectDN(e); + static subjectDN(attrs) { + return new SubjectDN(attrs); } - static subjectDNs(e) { - return new SubjectDNs(e); + static subjectDNs(attrs) { + return new SubjectDNs(attrs); } - static submit(e) { - return new Submit(e); + static submit(attrs) { + return new Submit(attrs); } - static template(e) { - return new Template(e); + static template(attrs) { + return new Template(attrs); } - static text(e) { - return new Text(e); + static text(attrs) { + return new Text(attrs); } - static textEdit(e) { - return new TextEdit(e); + static textEdit(attrs) { + return new TextEdit(attrs); } - static time(e) { - return new Time(e); + static time(attrs) { + return new Time(attrs); } - static timeStamp(e) { - return new TimeStamp(e); + static timeStamp(attrs) { + return new TimeStamp(attrs); } - static toolTip(e) { - return new ToolTip(e); + static toolTip(attrs) { + return new ToolTip(attrs); } - static traversal(e) { - return new Traversal(e); + static traversal(attrs) { + return new Traversal(attrs); } - static traverse(e) { - return new Traverse(e); + static traverse(attrs) { + return new Traverse(attrs); } - static ui(e) { - return new Ui(e); + static ui(attrs) { + return new Ui(attrs); } - static validate(e) { - return new Validate(e); + static validate(attrs) { + return new Validate(attrs); } - static value(e) { - return new Value(e); + static value(attrs) { + return new Value(attrs); } - static variables(e) { - return new Variables(e); + static variables(attrs) { + return new Variables(attrs); } -} -const Tn = on.datasets.id; -function createText(e) { - const t = new Text({}); - t[er] = e; - return t; +} // ./src/core/xfa/bind.js + +const bind_NS_DATASETS = NamespaceIds.datasets.id; +function createText(content) { + const node = new Text({}); + node[$content] = content; + return node; } class Binder { - constructor(e) { - this.root = e; - this.datasets = e.datasets; - this.data = e.datasets?.data || new XmlObject(on.datasets.id, "data"); - this.emptyMerge = 0 === this.data[Er]().length; - this.root.form = this.form = e.template[$s](); + constructor(root) { + this.root = root; + this.datasets = root.datasets; + this.data = + root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data"); + this.emptyMerge = this.data[$getChildren]().length === 0; + this.root.form = this.form = root.template[$clone](); } _isConsumeData() { return !this.emptyMerge && this._mergeMode; @@ -48117,362 +58084,478 @@ class Binder { getData() { return this.data; } - _bindValue(e, t, i) { - e[tr] = t; - if (e[wr]()) - if (t[Rr]()) { - const i = t[hr](); - e[$r](createText(i)); + _bindValue(formNode, data, picture) { + formNode[$data] = data; + if (formNode[$hasSettableValue]()) { + if (data[$isDataValue]()) { + const value = data[$getDataValue](); + formNode[$setValue](createText(value)); } else if ( - e instanceof Field && - "multiSelect" === e.ui?.choiceList?.open + formNode instanceof Field && + formNode.ui?.choiceList?.open === "multiSelect" ) { - const i = t[Er]() - .map((e) => e[er].trim()) + const value = data[$getChildren]() + .map((child) => child[$content].trim()) .join("\n"); - e[$r](createText(i)); - } else - this._isConsumeData() && warn("XFA - Nodes haven't the same type."); - else - !t[Rr]() || this._isMatchTemplate() - ? this._bindElement(e, t) - : warn("XFA - Nodes haven't the same type."); - } - _findDataByNameToConsume(e, t, i, a) { - if (!e) return null; - let s, r; - for (let a = 0; a < 3; a++) { - s = i[Qr](e, !1, !0); - for (;;) { - r = s.next().value; - if (!r) break; - if (t === r[Rr]()) return r; + formNode[$setValue](createText(value)); + } else if (this._isConsumeData()) { + warn(`XFA - Nodes haven't the same type.`); } - if (i[Jr] === on.datasets.id && "data" === i[Yr]) break; - i = i[pr](); + } else if (!data[$isDataValue]() || this._isMatchTemplate()) { + this._bindElement(formNode, data); + } else { + warn(`XFA - Nodes haven't the same type.`); } - if (!a) return null; - s = this.data[Qr](e, !0, !1); - r = s.next().value; - if (r) return r; - s = this.data[nr](e, !0); - r = s.next().value; - return r?.[Rr]() ? r : null; } - _setProperties(e, t) { - if (e.hasOwnProperty("setProperty")) - for (const { ref: i, target: a, connection: s } of e.setProperty - .children) { - if (s) continue; - if (!i) continue; - const r = searchNode(this.root, t, i, !1, !1); - if (!r) { - warn(`XFA - Invalid reference: ${i}.`); - continue; + _findDataByNameToConsume(name, isValue, dataNode, global) { + if (!name) { + return null; + } + let generator, match; + for (let i = 0; i < 3; i++) { + generator = dataNode[$getRealChildrenByNameIt](name, false, true); + while (true) { + match = generator.next().value; + if (!match) { + break; } - const [n] = r; - if (!n[Nr](this.data)) { - warn("XFA - Invalid node: must be a data node."); - continue; + if (isValue === match[$isDataValue]()) { + return match; } - const g = searchNode(this.root, e, a, !1, !1); - if (!g) { - warn(`XFA - Invalid target: ${a}.`); - continue; - } - const [o] = g; - if (!o[Nr](e)) { - warn("XFA - Invalid target: must be a property or subproperty."); - continue; - } - const c = o[pr](); - if (o instanceof SetProperty || c instanceof SetProperty) { - warn( - "XFA - Invalid target: cannot be a setProperty or one of its properties.", - ); - continue; - } - if (o instanceof BindItems || c instanceof BindItems) { - warn( - "XFA - Invalid target: cannot be a bindItems or one of its properties.", - ); - continue; - } - const C = n[en](), - h = o[Yr]; - if (o instanceof XFAAttribute) { - const e = Object.create(null); - e[h] = C; - const t = Reflect.construct(Object.getPrototypeOf(c).constructor, [ - e, - ]); - c[h] = t[h]; - } else if (o.hasOwnProperty(er)) { - o[tr] = n; - o[er] = C; - o[sr](); - } else warn("XFA - Invalid node to use in setProperty"); } + if ( + dataNode[$namespaceId] === NamespaceIds.datasets.id && + dataNode[$nodeName] === "data" + ) { + break; + } + dataNode = dataNode[$getParent](); + } + if (!global) { + return null; + } + generator = this.data[$getRealChildrenByNameIt](name, true, false); + match = generator.next().value; + if (match) { + return match; + } + generator = this.data[$getAttributeIt](name, true); + match = generator.next().value; + if (match?.[$isDataValue]()) { + return match; + } + return null; } - _bindItems(e, t) { - if ( - !e.hasOwnProperty("items") || - !e.hasOwnProperty("bindItems") || - e.bindItems.isEmpty() - ) + _setProperties(formNode, dataNode) { + if (!formNode.hasOwnProperty("setProperty")) { return; - for (const t of e.items.children) e[jr](t); - e.items.clear(); - const i = new Items({}), - a = new Items({}); - e[Xs](i); - e.items.push(i); - e[Xs](a); - e.items.push(a); - for (const { ref: s, labelRef: r, valueRef: n, connection: g } of e - .bindItems.children) { - if (g) continue; - if (!s) continue; - const e = searchNode(this.root, t, s, !1, !1); - if (e) - for (const t of e) { - if (!t[Nr](this.datasets)) { - warn(`XFA - Invalid ref (${s}): must be a datasets child.`); - continue; - } - const e = searchNode(this.root, t, r, !0, !1); - if (!e) { - warn(`XFA - Invalid label: ${r}.`); - continue; - } - const [g] = e; - if (!g[Nr](this.datasets)) { - warn("XFA - Invalid label: must be a datasets child."); - continue; - } - const o = searchNode(this.root, t, n, !0, !1); - if (!o) { - warn(`XFA - Invalid value: ${n}.`); - continue; - } - const [c] = o; - if (!c[Nr](this.datasets)) { - warn("XFA - Invalid value: must be a datasets child."); - continue; - } - const C = createText(g[en]()), - h = createText(c[en]()); - i[Xs](C); - i.text.push(C); - a[Xs](h); - a.text.push(h); + } + for (const { ref, target, connection } of formNode.setProperty.children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + const [node] = nodes; + if (!node[$isDescendent](this.data)) { + warn(`XFA - Invalid node: must be a data node.`); + continue; + } + const targetNodes = searchNode(this.root, formNode, target, false, false); + if (!targetNodes) { + warn(`XFA - Invalid target: ${target}.`); + continue; + } + const [targetNode] = targetNodes; + if (!targetNode[$isDescendent](formNode)) { + warn(`XFA - Invalid target: must be a property or subproperty.`); + continue; + } + const targetParent = targetNode[$getParent](); + if ( + targetNode instanceof SetProperty || + targetParent instanceof SetProperty + ) { + warn( + `XFA - Invalid target: cannot be a setProperty or one of its properties.`, + ); + continue; + } + if ( + targetNode instanceof BindItems || + targetParent instanceof BindItems + ) { + warn( + `XFA - Invalid target: cannot be a bindItems or one of its properties.`, + ); + continue; + } + const content = node[$text](); + const name = targetNode[$nodeName]; + if (targetNode instanceof 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($content)) { + warn(`XFA - Invalid node to use in setProperty`); + continue; + } + targetNode[$data] = node; + targetNode[$content] = content; + targetNode[$finalize](); + } + } + _bindItems(formNode, dataNode) { + if ( + !formNode.hasOwnProperty("items") || + !formNode.hasOwnProperty("bindItems") || + formNode.bindItems.isEmpty() + ) { + return; + } + for (const item of formNode.items.children) { + formNode[$removeChild](item); + } + formNode.items.clear(); + const labels = new Items({}); + const values = new Items({}); + formNode[$appendChild](labels); + formNode.items.push(labels); + formNode[$appendChild](values); + formNode.items.push(values); + for (const { ref, labelRef, valueRef, connection } of formNode.bindItems + .children) { + if (connection) { + continue; + } + if (!ref) { + continue; + } + const nodes = searchNode(this.root, dataNode, ref, false, false); + if (!nodes) { + warn(`XFA - Invalid reference: ${ref}.`); + continue; + } + for (const node of nodes) { + if (!node[$isDescendent](this.datasets)) { + warn(`XFA - Invalid ref (${ref}): must be a datasets child.`); + continue; } - else warn(`XFA - Invalid reference: ${s}.`); - } - } - _bindOccurrences(e, t, i) { - let a; - if (t.length > 1) { - a = e[$s](); - a[jr](a.occur); - a.occur = null; - } - this._bindValue(e, t[0], i); - this._setProperties(e, t[0]); - this._bindItems(e, t[0]); - if (1 === t.length) return; - const s = e[pr](), - r = e[Yr], - n = s[br](e); - for (let e = 1, g = t.length; e < g; e++) { - const g = t[e], - o = a[$s](); - s[r].push(o); - s[Fr](n + e, o); - this._bindValue(o, g, i); - this._setProperties(o, g); - this._bindItems(o, g); - } - } - _createOccurrences(e) { - if (!this.emptyMerge) return; - const { occur: t } = e; - if (!t || t.initial <= 1) return; - const i = e[pr](), - a = e[Yr]; - if (!(i[a] instanceof XFAObjectArray)) return; - let s; - s = e.name - ? i[a].children.filter((t) => t.name === e.name).length - : i[a].children.length; - const r = i[br](e) + 1, - n = t.initial - s; - if (n) { - const t = e[$s](); - t[jr](t.occur); - t.occur = null; - i[a].push(t); - i[Fr](r, t); - for (let e = 1; e < n; e++) { - const s = t[$s](); - i[a].push(s); - i[Fr](r + e, s); + const labelNodes = searchNode(this.root, node, labelRef, true, false); + if (!labelNodes) { + warn(`XFA - Invalid label: ${labelRef}.`); + continue; + } + const [labelNode] = labelNodes; + if (!labelNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid label: must be a datasets child.`); + continue; + } + const valueNodes = searchNode(this.root, node, valueRef, true, false); + if (!valueNodes) { + warn(`XFA - Invalid value: ${valueRef}.`); + continue; + } + const [valueNode] = valueNodes; + if (!valueNode[$isDescendent](this.datasets)) { + warn(`XFA - Invalid value: must be a datasets child.`); + continue; + } + const label = createText(labelNode[$text]()); + const value = createText(valueNode[$text]()); + labels[$appendChild](label); + labels.text.push(label); + values[$appendChild](value); + values.text.push(value); } } } - _getOccurInfo(e) { - const { name: t, occur: i } = e; - if (!i || !t) return [1, 1]; - const a = -1 === i.max ? 1 / 0 : i.max; - return [i.min, a]; + _bindOccurrences(formNode, matches, picture) { + let baseClone; + if (matches.length > 1) { + baseClone = formNode[$clone](); + baseClone[$removeChild](baseClone.occur); + baseClone.occur = null; + } + this._bindValue(formNode, matches[0], picture); + this._setProperties(formNode, matches[0]); + this._bindItems(formNode, matches[0]); + if (matches.length === 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + const pos = parent[$indexOf](formNode); + for (let i = 1, ii = matches.length; i < ii; i++) { + const match = matches[i]; + const clone = baseClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + this._bindValue(clone, match, picture); + this._setProperties(clone, match); + this._bindItems(clone, match); + } } - _setAndBind(e, t) { - this._setProperties(e, t); - this._bindItems(e, t); - this._bindElement(e, t); + _createOccurrences(formNode) { + if (!this.emptyMerge) { + return; + } + const { occur } = formNode; + if (!occur || occur.initial <= 1) { + return; + } + const parent = formNode[$getParent](); + const name = formNode[$nodeName]; + if (!(parent[name] instanceof XFAObjectArray)) { + return; + } + let currentNumber; + if (formNode.name) { + currentNumber = parent[name].children.filter( + (e) => e.name === formNode.name, + ).length; + } else { + currentNumber = parent[name].children.length; + } + const pos = parent[$indexOf](formNode) + 1; + const ii = occur.initial - currentNumber; + if (ii) { + const nodeClone = formNode[$clone](); + nodeClone[$removeChild](nodeClone.occur); + nodeClone.occur = null; + parent[name].push(nodeClone); + parent[$insertAt](pos, nodeClone); + for (let i = 1; i < ii; i++) { + const clone = nodeClone[$clone](); + parent[name].push(clone); + parent[$insertAt](pos + i, clone); + } + } } - _bindElement(e, t) { - const i = []; - this._createOccurrences(e); - for (const a of e[Er]()) { - if (a[tr]) continue; - if (void 0 === this._mergeMode && "subform" === a[Yr]) { - this._mergeMode = "consumeData" === a.mergeMode; - const e = t[Er](); - if (e.length > 0) this._bindOccurrences(a, [e[0]], null); - else if (this.emptyMerge) { - const e = t[Jr] === Tn ? -1 : t[Jr], - i = (a[tr] = new XmlObject(e, a.name || "root")); - t[Xs](i); - this._bindElement(a, i); + _getOccurInfo(formNode) { + const { name, occur } = formNode; + if (!occur || !name) { + return [1, 1]; + } + const max = occur.max === -1 ? Infinity : occur.max; + return [occur.min, max]; + } + _setAndBind(formNode, dataNode) { + this._setProperties(formNode, dataNode); + this._bindItems(formNode, dataNode); + this._bindElement(formNode, dataNode); + } + _bindElement(formNode, dataNode) { + const uselessNodes = []; + this._createOccurrences(formNode); + for (const child of formNode[$getChildren]()) { + if (child[$data]) { + continue; + } + if (this._mergeMode === undefined && child[$nodeName] === "subform") { + this._mergeMode = child.mergeMode === "consumeData"; + const dataChildren = dataNode[$getChildren](); + if (dataChildren.length > 0) { + this._bindOccurrences(child, [dataChildren[0]], null); + } else if (this.emptyMerge) { + const nsId = + dataNode[$namespaceId] === bind_NS_DATASETS + ? -1 + : dataNode[$namespaceId]; + const dataChild = (child[$data] = new XmlObject( + nsId, + child.name || "root", + )); + dataNode[$appendChild](dataChild); + this._bindElement(child, dataChild); } continue; } - if (!a[kr]()) continue; - let e = !1, - s = null, - r = null, - n = null; - if (a.bind) { - switch (a.bind.match) { + if (!child[$isBindable]()) { + continue; + } + let global = false; + let picture = null; + let ref = null; + let match = null; + if (child.bind) { + switch (child.bind.match) { case "none": - this._setAndBind(a, t); + this._setAndBind(child, dataNode); continue; case "global": - e = !0; + global = true; break; case "dataRef": - if (!a.bind.ref) { - warn(`XFA - ref is empty in node ${a[Yr]}.`); - this._setAndBind(a, t); + if (!child.bind.ref) { + warn(`XFA - ref is empty in node ${child[$nodeName]}.`); + this._setAndBind(child, dataNode); continue; } - r = a.bind.ref; + ref = child.bind.ref; + break; + default: + break; + } + if (child.bind.picture) { + picture = child.bind.picture[$content]; } - a.bind.picture && (s = a.bind.picture[er]); } - const [g, o] = this._getOccurInfo(a); - if (r) { - n = searchNode(this.root, t, r, !0, !1); - if (null === n) { - n = createDataNode(this.data, t, r); - if (!n) continue; - this._isConsumeData() && (n[Ar] = !0); - this._setAndBind(a, n); + const [min, max] = this._getOccurInfo(child); + if (ref) { + match = searchNode(this.root, dataNode, ref, true, false); + if (match === null) { + match = createDataNode(this.data, dataNode, ref); + if (!match) { + continue; + } + if (this._isConsumeData()) { + match[$consumed] = true; + } + this._setAndBind(child, match); continue; + } else { + if (this._isConsumeData()) { + match = match.filter((node) => !node[$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[$consumed] = true; + }); + } } - this._isConsumeData() && (n = n.filter((e) => !e[Ar])); - n.length > o ? (n = n.slice(0, o)) : 0 === n.length && (n = null); - n && - this._isConsumeData() && - n.forEach((e) => { - e[Ar] = !0; - }); } else { - if (!a.name) { - this._setAndBind(a, t); + if (!child.name) { + this._setAndBind(child, dataNode); continue; } if (this._isConsumeData()) { - const i = []; - for (; i.length < o; ) { - const s = this._findDataByNameToConsume(a.name, a[wr](), t, e); - if (!s) break; - s[Ar] = !0; - i.push(s); + const matches = []; + while (matches.length < max) { + const found = this._findDataByNameToConsume( + child.name, + child[$hasSettableValue](), + dataNode, + global, + ); + if (!found) { + break; + } + found[$consumed] = true; + matches.push(found); } - n = i.length > 0 ? i : null; + match = matches.length > 0 ? matches : null; } else { - n = t[Qr](a.name, !1, this.emptyMerge).next().value; - if (!n) { - if (0 === g) { - i.push(a); + match = dataNode[$getRealChildrenByNameIt]( + child.name, + false, + this.emptyMerge, + ).next().value; + if (!match) { + if (min === 0) { + uselessNodes.push(child); continue; } - const e = t[Jr] === Tn ? -1 : t[Jr]; - n = a[tr] = new XmlObject(e, a.name); - this.emptyMerge && (n[Ar] = !0); - t[Xs](n); - this._setAndBind(a, n); + const nsId = + dataNode[$namespaceId] === bind_NS_DATASETS + ? -1 + : dataNode[$namespaceId]; + match = child[$data] = new XmlObject(nsId, child.name); + if (this.emptyMerge) { + match[$consumed] = true; + } + dataNode[$appendChild](match); + this._setAndBind(child, match); continue; } - this.emptyMerge && (n[Ar] = !0); - n = [n]; + if (this.emptyMerge) { + match[$consumed] = true; + } + match = [match]; } } - n - ? this._bindOccurrences(a, n, s) - : g > 0 - ? this._setAndBind(a, t) - : i.push(a); + if (match) { + this._bindOccurrences(child, match, picture); + } else if (min > 0) { + this._setAndBind(child, dataNode); + } else { + uselessNodes.push(child); + } } - i.forEach((e) => e[pr]()[jr](e)); + uselessNodes.forEach((node) => node[$getParent]()[$removeChild](node)); } -} +} // ./src/core/xfa/data.js + class DataHandler { - constructor(e, t) { - this.data = t; - this.dataset = e.datasets || null; + constructor(root, data) { + this.data = data; + this.dataset = root.datasets || null; } - serialize(e) { - const t = [[-1, this.data[Er]()]]; - for (; t.length > 0; ) { - const i = t.at(-1), - [a, s] = i; - if (a + 1 === s.length) { - t.pop(); + serialize(storage) { + const stack = [[-1, this.data[$getChildren]()]]; + while (stack.length > 0) { + const last = stack.at(-1); + const [i, children] = last; + if (i + 1 === children.length) { + stack.pop(); continue; } - const r = s[++i[0]], - n = e.get(r[nn]); - if (n) r[$r](n); - else { - const t = r[gr](); - for (const i of t.values()) { - const t = e.get(i[nn]); - if (t) { - i[$r](t); + const child = children[++last[0]]; + const storageEntry = storage.get(child[$uid]); + if (storageEntry) { + child[$setValue](storageEntry); + } else { + const attributes = child[$getAttributes](); + for (const value of attributes.values()) { + const entry = storage.get(value[$uid]); + if (entry) { + value[$setValue](entry); break; } } } - const g = r[Er](); - g.length > 0 && t.push([-1, g]); + const nodes = child[$getChildren](); + if (nodes.length > 0) { + stack.push([-1, nodes]); + } } - const i = [ - '', + const buf = [ + ``, ]; - if (this.dataset) - for (const e of this.dataset[Er]()) "data" !== e[Yr] && e[sn](i); - this.data[sn](i); - i.push(""); - return i.join(""); + if (this.dataset) { + for (const child of this.dataset[$getChildren]()) { + if (child[$nodeName] !== "data") { + child[$toString](buf); + } + } + } + this.data[$toString](buf); + buf.push(""); + return buf.join(""); } -} -const qn = on.config.id; +} // ./src/core/xfa/config.js + +const CONFIG_NS_ID = NamespaceIds.config.id; class Acrobat extends XFAObject { - constructor(e) { - super(qn, "acrobat", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat", true); this.acrobat7 = null; this.autoSave = null; this.common = null; @@ -48482,67 +58565,67 @@ class Acrobat extends XFAObject { } } class Acrobat7 extends XFAObject { - constructor(e) { - super(qn, "acrobat7", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "acrobat7", true); this.dynamicRender = null; } } class ADBE_JSConsole extends OptionObject { - constructor(e) { - super(qn, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); } } class ADBE_JSDebugger extends OptionObject { - constructor(e) { - super(qn, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); + constructor(attributes) { + super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); } } class AddSilentPrint extends Option01 { - constructor(e) { - super(qn, "addSilentPrint"); + constructor(attributes) { + super(CONFIG_NS_ID, "addSilentPrint"); } } class AddViewerPreferences extends Option01 { - constructor(e) { - super(qn, "addViewerPreferences"); + constructor(attributes) { + super(CONFIG_NS_ID, "addViewerPreferences"); } } class AdjustData extends Option10 { - constructor(e) { - super(qn, "adjustData"); + constructor(attributes) { + super(CONFIG_NS_ID, "adjustData"); } } class AdobeExtensionLevel extends IntegerObject { - constructor(e) { - super(qn, "adobeExtensionLevel", 0, (e) => e >= 1 && e <= 8); + constructor(attributes) { + super(CONFIG_NS_ID, "adobeExtensionLevel", 0, (n) => n >= 1 && n <= 8); } } class Agent extends XFAObject { - constructor(e) { - super(qn, "agent", !0); - this.name = e.name ? e.name.trim() : ""; + constructor(attributes) { + super(CONFIG_NS_ID, "agent", true); + this.name = attributes.name ? attributes.name.trim() : ""; this.common = new XFAObjectArray(); } } class AlwaysEmbed extends ContentObject { - constructor(e) { - super(qn, "alwaysEmbed"); + constructor(attributes) { + super(CONFIG_NS_ID, "alwaysEmbed"); } } class Amd extends StringObject { - constructor(e) { - super(qn, "amd"); + constructor(attributes) { + super(CONFIG_NS_ID, "amd"); } } class config_Area extends XFAObject { - constructor(e) { - super(qn, "area"); + constructor(attributes) { + super(CONFIG_NS_ID, "area"); this.level = getInteger({ - data: e.level, + data: attributes.level, defaultValue: 0, - validate: (e) => e >= 1 && e <= 3, + validate: (n) => n >= 1 && n <= 3, }); - this.name = getStringOption(e.name, [ + this.name = getStringOption(attributes.name, [ "", "barcode", "coreinit", @@ -48559,24 +58642,24 @@ class config_Area extends XFAObject { } } class Attributes extends OptionObject { - constructor(e) { - super(qn, "attributes", ["preserve", "delegate", "ignore"]); + constructor(attributes) { + super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); } } class AutoSave extends OptionObject { - constructor(e) { - super(qn, "autoSave", ["disabled", "enabled"]); + constructor(attributes) { + super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); } } class Base extends StringObject { - constructor(e) { - super(qn, "base"); + constructor(attributes) { + super(CONFIG_NS_ID, "base"); } } class BatchOutput extends XFAObject { - constructor(e) { - super(qn, "batchOutput"); - this.format = getStringOption(e.format, [ + constructor(attributes) { + super(CONFIG_NS_ID, "batchOutput"); + this.format = getStringOption(attributes.format, [ "none", "concat", "zip", @@ -48585,33 +58668,33 @@ class BatchOutput extends XFAObject { } } class BehaviorOverride extends ContentObject { - constructor(e) { - super(qn, "behaviorOverride"); + constructor(attributes) { + super(CONFIG_NS_ID, "behaviorOverride"); } - [sr]() { - this[er] = new Map( - this[er] + [$finalize]() { + this[$content] = new Map( + this[$content] .trim() .split(/\s+/) - .filter((e) => e.includes(":")) - .map((e) => e.split(":", 2)), + .filter((x) => x.includes(":")) + .map((x) => x.split(":", 2)), ); } } class Cache extends XFAObject { - constructor(e) { - super(qn, "cache", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "cache", true); this.templateCache = null; } } class Change extends Option01 { - constructor(e) { - super(qn, "change"); + constructor(attributes) { + super(CONFIG_NS_ID, "change"); } } class Common extends XFAObject { - constructor(e) { - super(qn, "common", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "common", true); this.data = null; this.locale = null; this.localeSet = null; @@ -48624,24 +58707,24 @@ class Common extends XFAObject { } } class Compress extends XFAObject { - constructor(e) { - super(qn, "compress"); - this.scope = getStringOption(e.scope, ["imageOnly", "document"]); + constructor(attributes) { + super(CONFIG_NS_ID, "compress"); + this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); } } class CompressLogicalStructure extends Option01 { - constructor(e) { - super(qn, "compressLogicalStructure"); + constructor(attributes) { + super(CONFIG_NS_ID, "compressLogicalStructure"); } } class CompressObjectStream extends Option10 { - constructor(e) { - super(qn, "compressObjectStream"); + constructor(attributes) { + super(CONFIG_NS_ID, "compressObjectStream"); } } class Compression extends XFAObject { - constructor(e) { - super(qn, "compression", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "compression", true); this.compressLogicalStructure = null; this.compressObjectStream = null; this.level = null; @@ -48649,8 +58732,8 @@ class Compression extends XFAObject { } } class Config extends XFAObject { - constructor(e) { - super(qn, "config", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "config", true); this.acrobat = null; this.present = null; this.trace = null; @@ -48658,33 +58741,33 @@ class Config extends XFAObject { } } class Conformance extends OptionObject { - constructor(e) { - super(qn, "conformance", ["A", "B"]); + constructor(attributes) { + super(CONFIG_NS_ID, "conformance", ["A", "B"]); } } class ContentCopy extends Option01 { - constructor(e) { - super(qn, "contentCopy"); + constructor(attributes) { + super(CONFIG_NS_ID, "contentCopy"); } } class Copies extends IntegerObject { - constructor(e) { - super(qn, "copies", 1, (e) => e >= 1); + constructor(attributes) { + super(CONFIG_NS_ID, "copies", 1, (n) => n >= 1); } } class Creator extends StringObject { - constructor(e) { - super(qn, "creator"); + constructor(attributes) { + super(CONFIG_NS_ID, "creator"); } } class CurrentPage extends IntegerObject { - constructor(e) { - super(qn, "currentPage", 0, (e) => e >= 0); + constructor(attributes) { + super(CONFIG_NS_ID, "currentPage", 0, (n) => n >= 0); } } class Data extends XFAObject { - constructor(e) { - super(qn, "data", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "data", true); this.adjustData = null; this.attributes = null; this.incrementalLoad = null; @@ -48700,15 +58783,15 @@ class Data extends XFAObject { } } class Debug extends XFAObject { - constructor(e) { - super(qn, "debug", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "debug", true); this.uri = null; } } class DefaultTypeface extends ContentObject { - constructor(e) { - super(qn, "defaultTypeface"); - this.writingScript = getStringOption(e.writingScript, [ + constructor(attributes) { + super(CONFIG_NS_ID, "defaultTypeface"); + this.writingScript = getStringOption(attributes.writingScript, [ "*", "Arabic", "Cyrillic", @@ -48726,26 +58809,32 @@ class DefaultTypeface extends ContentObject { } } class Destination extends OptionObject { - constructor(e) { - super(qn, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); + constructor(attributes) { + super(CONFIG_NS_ID, "destination", [ + "pdf", + "pcl", + "ps", + "webClient", + "zpl", + ]); } } class DocumentAssembly extends Option01 { - constructor(e) { - super(qn, "documentAssembly"); + constructor(attributes) { + super(CONFIG_NS_ID, "documentAssembly"); } } class Driver extends XFAObject { - constructor(e) { - super(qn, "driver", !0); - this.name = e.name ? e.name.trim() : ""; + constructor(attributes) { + super(CONFIG_NS_ID, "driver", true); + this.name = attributes.name ? attributes.name.trim() : ""; this.fontInfo = null; this.xdc = null; } } class DuplexOption extends OptionObject { - constructor(e) { - super(qn, "duplexOption", [ + constructor(attributes) { + super(CONFIG_NS_ID, "duplexOption", [ "simplex", "duplexFlipLongEdge", "duplexFlipShortEdge", @@ -48753,86 +58842,91 @@ class DuplexOption extends OptionObject { } } class DynamicRender extends OptionObject { - constructor(e) { - super(qn, "dynamicRender", ["forbidden", "required"]); + constructor(attributes) { + super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); } } class Embed extends Option01 { - constructor(e) { - super(qn, "embed"); + constructor(attributes) { + super(CONFIG_NS_ID, "embed"); } } class config_Encrypt extends Option01 { - constructor(e) { - super(qn, "encrypt"); + constructor(attributes) { + super(CONFIG_NS_ID, "encrypt"); } } class config_Encryption extends XFAObject { - constructor(e) { - super(qn, "encryption", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "encryption", true); this.encrypt = null; this.encryptionLevel = null; this.permissions = null; } } class EncryptionLevel extends OptionObject { - constructor(e) { - super(qn, "encryptionLevel", ["40bit", "128bit"]); + constructor(attributes) { + super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); } } class Enforce extends StringObject { - constructor(e) { - super(qn, "enforce"); + constructor(attributes) { + super(CONFIG_NS_ID, "enforce"); } } class Equate extends XFAObject { - constructor(e) { - super(qn, "equate"); + constructor(attributes) { + super(CONFIG_NS_ID, "equate"); this.force = getInteger({ - data: e.force, + data: attributes.force, defaultValue: 1, - validate: (e) => 0 === e, + validate: (n) => n === 0, }); - this.from = e.from || ""; - this.to = e.to || ""; + this.from = attributes.from || ""; + this.to = attributes.to || ""; } } class EquateRange extends XFAObject { - constructor(e) { - super(qn, "equateRange"); - this.from = e.from || ""; - this.to = e.to || ""; - this._unicodeRange = e.unicodeRange || ""; + constructor(attributes) { + super(CONFIG_NS_ID, "equateRange"); + this.from = attributes.from || ""; + this.to = attributes.to || ""; + this._unicodeRange = attributes.unicodeRange || ""; } get unicodeRange() { - const e = [], - t = /U\+([0-9a-fA-F]+)/, - i = this._unicodeRange; - for (let a of i + const ranges = []; + const unicodeRegex = /U\+([0-9a-fA-F]+)/; + const unicodeRange = this._unicodeRange; + for (let range of unicodeRange .split(",") - .map((e) => e.trim()) - .filter((e) => !!e)) { - a = a.split("-", 2).map((e) => { - const i = e.match(t); - return i ? parseInt(i[1], 16) : 0; + .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); }); - 1 === a.length && a.push(a[0]); - e.push(a); + if (range.length === 1) { + range.push(range[0]); + } + ranges.push(range); } - return shadow(this, "unicodeRange", e); + return shadow(this, "unicodeRange", ranges); } } class Exclude extends ContentObject { - constructor(e) { - super(qn, "exclude"); + constructor(attributes) { + super(CONFIG_NS_ID, "exclude"); } - [sr]() { - this[er] = this[er] + [$finalize]() { + this[$content] = this[$content] .trim() .split(/\s+/) .filter( - (e) => - e && + (x) => + x && [ "calculate", "close", @@ -48841,23 +58935,23 @@ class Exclude extends ContentObject { "initialize", "ready", "validate", - ].includes(e), + ].includes(x), ); } } class ExcludeNS extends StringObject { - constructor(e) { - super(qn, "excludeNS"); + constructor(attributes) { + super(CONFIG_NS_ID, "excludeNS"); } } class FlipLabel extends OptionObject { - constructor(e) { - super(qn, "flipLabel", ["usePrinterSetting", "on", "off"]); + constructor(attributes) { + super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); } } class config_FontInfo extends XFAObject { - constructor(e) { - super(qn, "fontInfo", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "fontInfo", true); this.embed = null; this.map = null; this.subsetBelow = null; @@ -48867,49 +58961,54 @@ class config_FontInfo extends XFAObject { } } class FormFieldFilling extends Option01 { - constructor(e) { - super(qn, "formFieldFilling"); + constructor(attributes) { + super(CONFIG_NS_ID, "formFieldFilling"); } } class GroupParent extends StringObject { - constructor(e) { - super(qn, "groupParent"); + constructor(attributes) { + super(CONFIG_NS_ID, "groupParent"); } } class IfEmpty extends OptionObject { - constructor(e) { - super(qn, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); + constructor(attributes) { + super(CONFIG_NS_ID, "ifEmpty", [ + "dataValue", + "dataGroup", + "ignore", + "remove", + ]); } } class IncludeXDPContent extends StringObject { - constructor(e) { - super(qn, "includeXDPContent"); + constructor(attributes) { + super(CONFIG_NS_ID, "includeXDPContent"); } } class IncrementalLoad extends OptionObject { - constructor(e) { - super(qn, "incrementalLoad", ["none", "forwardOnly"]); + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); } } class IncrementalMerge extends Option01 { - constructor(e) { - super(qn, "incrementalMerge"); + constructor(attributes) { + super(CONFIG_NS_ID, "incrementalMerge"); } } class Interactive extends Option01 { - constructor(e) { - super(qn, "interactive"); + constructor(attributes) { + super(CONFIG_NS_ID, "interactive"); } } class Jog extends OptionObject { - constructor(e) { - super(qn, "jog", ["usePrinterSetting", "none", "pageSet"]); + constructor(attributes) { + super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); } } class LabelPrinter extends XFAObject { - constructor(e) { - super(qn, "labelPrinter", !0); - this.name = getStringOption(e.name, ["zpl", "dpl", "ipl", "tcpl"]); + constructor(attributes) { + super(CONFIG_NS_ID, "labelPrinter", true); + this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); this.batchOutput = null; this.flipLabel = null; this.fontInfo = null; @@ -48917,33 +59016,33 @@ class LabelPrinter extends XFAObject { } } class Layout extends OptionObject { - constructor(e) { - super(qn, "layout", ["paginate", "panel"]); + constructor(attributes) { + super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); } } class Level extends IntegerObject { - constructor(e) { - super(qn, "level", 0, (e) => e > 0); + constructor(attributes) { + super(CONFIG_NS_ID, "level", 0, (n) => n > 0); } } class Linearized extends Option01 { - constructor(e) { - super(qn, "linearized"); + constructor(attributes) { + super(CONFIG_NS_ID, "linearized"); } } class Locale extends StringObject { - constructor(e) { - super(qn, "locale"); + constructor(attributes) { + super(CONFIG_NS_ID, "locale"); } } class LocaleSet extends StringObject { - constructor(e) { - super(qn, "localeSet"); + constructor(attributes) { + super(CONFIG_NS_ID, "localeSet"); } } class Log extends XFAObject { - constructor(e) { - super(qn, "log", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "log", true); this.mode = null; this.threshold = null; this.to = null; @@ -48951,142 +59050,150 @@ class Log extends XFAObject { } } class MapElement extends XFAObject { - constructor(e) { - super(qn, "map", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "map", true); this.equate = new XFAObjectArray(); this.equateRange = new XFAObjectArray(); } } class MediumInfo extends XFAObject { - constructor(e) { - super(qn, "mediumInfo", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "mediumInfo", true); this.map = null; } } class config_Message extends XFAObject { - constructor(e) { - super(qn, "message", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "message", true); this.msgId = null; this.severity = null; } } class Messaging extends XFAObject { - constructor(e) { - super(qn, "messaging", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "messaging", true); this.message = new XFAObjectArray(); } } class Mode extends OptionObject { - constructor(e) { - super(qn, "mode", ["append", "overwrite"]); + constructor(attributes) { + super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); } } class ModifyAnnots extends Option01 { - constructor(e) { - super(qn, "modifyAnnots"); + constructor(attributes) { + super(CONFIG_NS_ID, "modifyAnnots"); } } class MsgId extends IntegerObject { - constructor(e) { - super(qn, "msgId", 1, (e) => e >= 1); + constructor(attributes) { + super(CONFIG_NS_ID, "msgId", 1, (n) => n >= 1); } } class NameAttr extends StringObject { - constructor(e) { - super(qn, "nameAttr"); + constructor(attributes) { + super(CONFIG_NS_ID, "nameAttr"); } } class NeverEmbed extends ContentObject { - constructor(e) { - super(qn, "neverEmbed"); + constructor(attributes) { + super(CONFIG_NS_ID, "neverEmbed"); } } class NumberOfCopies extends IntegerObject { - constructor(e) { - super(qn, "numberOfCopies", null, (e) => e >= 2 && e <= 5); + constructor(attributes) { + super(CONFIG_NS_ID, "numberOfCopies", null, (n) => n >= 2 && n <= 5); } } class OpenAction extends XFAObject { - constructor(e) { - super(qn, "openAction", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "openAction", true); this.destination = null; } } class Output extends XFAObject { - constructor(e) { - super(qn, "output", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "output", true); this.to = null; this.type = null; this.uri = null; } } class OutputBin extends StringObject { - constructor(e) { - super(qn, "outputBin"); + constructor(attributes) { + super(CONFIG_NS_ID, "outputBin"); } } class OutputXSL extends XFAObject { - constructor(e) { - super(qn, "outputXSL", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "outputXSL", true); this.uri = null; } } class Overprint extends OptionObject { - constructor(e) { - super(qn, "overprint", ["none", "both", "draw", "field"]); + constructor(attributes) { + super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); } } class Packets extends StringObject { - constructor(e) { - super(qn, "packets"); + constructor(attributes) { + super(CONFIG_NS_ID, "packets"); } - [sr]() { - "*" !== this[er] && - (this[er] = this[er] - .trim() - .split(/\s+/) - .filter((e) => - ["config", "datasets", "template", "xfdf", "xslt"].includes(e), - )); + [$finalize]() { + if (this[$content] === "*") { + return; + } + this[$content] = this[$content] + .trim() + .split(/\s+/) + .filter((x) => + ["config", "datasets", "template", "xfdf", "xslt"].includes(x), + ); } } class PageOffset extends XFAObject { - constructor(e) { - super(qn, "pageOffset"); + constructor(attributes) { + super(CONFIG_NS_ID, "pageOffset"); this.x = getInteger({ - data: e.x, + data: attributes.x, defaultValue: "useXDCSetting", - validate: (e) => !0, + validate: (n) => true, }); this.y = getInteger({ - data: e.y, + data: attributes.y, defaultValue: "useXDCSetting", - validate: (e) => !0, + validate: (n) => true, }); } } class PageRange extends StringObject { - constructor(e) { - super(qn, "pageRange"); + constructor(attributes) { + super(CONFIG_NS_ID, "pageRange"); } - [sr]() { - const e = this[er] - .trim() - .split(/\s+/) - .map((e) => parseInt(e, 10)), - t = []; - for (let i = 0, a = e.length; i < a; i += 2) t.push(e.slice(i, i + 2)); - this[er] = t; + [$finalize]() { + const numbers = this[$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[$content] = ranges; } } class Pagination extends OptionObject { - constructor(e) { - super(qn, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); + constructor(attributes) { + super(CONFIG_NS_ID, "pagination", [ + "simplex", + "duplexShortEdge", + "duplexLongEdge", + ]); } } class PaginationOverride extends OptionObject { - constructor(e) { - super(qn, "paginationOverride", [ + constructor(attributes) { + super(CONFIG_NS_ID, "paginationOverride", [ "none", "forceDuplex", "forceDuplexLongEdge", @@ -49096,14 +59203,14 @@ class PaginationOverride extends OptionObject { } } class Part extends IntegerObject { - constructor(e) { - super(qn, "part", 1, (e) => !1); + constructor(attributes) { + super(CONFIG_NS_ID, "part", 1, (n) => false); } } class Pcl extends XFAObject { - constructor(e) { - super(qn, "pcl", !0); - this.name = e.name || ""; + constructor(attributes) { + super(CONFIG_NS_ID, "pcl", true); + this.name = attributes.name || ""; this.batchOutput = null; this.fontInfo = null; this.jog = null; @@ -49115,9 +59222,9 @@ class Pcl extends XFAObject { } } class Pdf extends XFAObject { - constructor(e) { - super(qn, "pdf", !0); - this.name = e.name || ""; + constructor(attributes) { + super(CONFIG_NS_ID, "pdf", true); + this.name = attributes.name || ""; this.adobeExtensionLevel = null; this.batchOutput = null; this.compression = null; @@ -49140,8 +59247,8 @@ class Pdf extends XFAObject { } } class Pdfa extends XFAObject { - constructor(e) { - super(qn, "pdfa", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "pdfa", true); this.amd = null; this.conformance = null; this.includeXDPContent = null; @@ -49149,8 +59256,8 @@ class Pdfa extends XFAObject { } } class Permissions extends XFAObject { - constructor(e) { - super(qn, "permissions", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "permissions", true); this.accessibleContent = null; this.change = null; this.contentCopy = null; @@ -49163,23 +59270,23 @@ class Permissions extends XFAObject { } } class PickTrayByPDFSize extends Option01 { - constructor(e) { - super(qn, "pickTrayByPDFSize"); + constructor(attributes) { + super(CONFIG_NS_ID, "pickTrayByPDFSize"); } } class config_Picture extends StringObject { - constructor(e) { - super(qn, "picture"); + constructor(attributes) { + super(CONFIG_NS_ID, "picture"); } } class PlaintextMetadata extends Option01 { - constructor(e) { - super(qn, "plaintextMetadata"); + constructor(attributes) { + super(CONFIG_NS_ID, "plaintextMetadata"); } } class Presence extends OptionObject { - constructor(e) { - super(qn, "presence", [ + constructor(attributes) { + super(CONFIG_NS_ID, "presence", [ "preserve", "dissolve", "dissolveStructure", @@ -49189,8 +59296,8 @@ class Presence extends OptionObject { } } class Present extends XFAObject { - constructor(e) { - super(qn, "present", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "present", true); this.behaviorOverride = null; this.cache = null; this.common = null; @@ -49216,34 +59323,34 @@ class Present extends XFAObject { } } class Print extends Option01 { - constructor(e) { - super(qn, "print"); + constructor(attributes) { + super(CONFIG_NS_ID, "print"); } } class PrintHighQuality extends Option01 { - constructor(e) { - super(qn, "printHighQuality"); + constructor(attributes) { + super(CONFIG_NS_ID, "printHighQuality"); } } class PrintScaling extends OptionObject { - constructor(e) { - super(qn, "printScaling", ["appdefault", "noScaling"]); + constructor(attributes) { + super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); } } class PrinterName extends StringObject { - constructor(e) { - super(qn, "printerName"); + constructor(attributes) { + super(CONFIG_NS_ID, "printerName"); } } class Producer extends StringObject { - constructor(e) { - super(qn, "producer"); + constructor(attributes) { + super(CONFIG_NS_ID, "producer"); } } class Ps extends XFAObject { - constructor(e) { - super(qn, "ps", !0); - this.name = e.name || ""; + constructor(attributes) { + super(CONFIG_NS_ID, "ps", true); + this.name = attributes.name || ""; this.batchOutput = null; this.fontInfo = null; this.jog = null; @@ -49254,76 +59361,83 @@ class Ps extends XFAObject { } } class Range extends ContentObject { - constructor(e) { - super(qn, "range"); + constructor(attributes) { + super(CONFIG_NS_ID, "range"); } - [sr]() { - this[er] = this[er] + [$finalize]() { + this[$content] = this[$content] .trim() .split(/\s*,\s*/, 2) - .map((e) => e.split("-").map((e) => parseInt(e.trim(), 10))) - .filter((e) => e.every((e) => !isNaN(e))) - .map((e) => { - 1 === e.length && e.push(e[0]); - return e; + .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 ContentObject { - constructor(e) { - super(qn, "record"); + constructor(attributes) { + super(CONFIG_NS_ID, "record"); } - [sr]() { - this[er] = this[er].trim(); - const e = parseInt(this[er], 10); - !isNaN(e) && e >= 0 && (this[er] = e); + [$finalize]() { + this[$content] = this[$content].trim(); + const n = parseInt(this[$content], 10); + if (!isNaN(n) && n >= 0) { + this[$content] = n; + } } } class Relevant extends ContentObject { - constructor(e) { - super(qn, "relevant"); + constructor(attributes) { + super(CONFIG_NS_ID, "relevant"); } - [sr]() { - this[er] = this[er].trim().split(/\s+/); + [$finalize]() { + this[$content] = this[$content].trim().split(/\s+/); } } class Rename extends ContentObject { - constructor(e) { - super(qn, "rename"); + constructor(attributes) { + super(CONFIG_NS_ID, "rename"); } - [sr]() { - this[er] = this[er].trim(); - (this[er].toLowerCase().startsWith("xml") || - new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[er])) && + [$finalize]() { + this[$content] = this[$content].trim(); + if ( + this[$content].toLowerCase().startsWith("xml") || + new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content]) + ) { warn("XFA - Rename: invalid XFA name"); + } } } class RenderPolicy extends OptionObject { - constructor(e) { - super(qn, "renderPolicy", ["server", "client"]); + constructor(attributes) { + super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); } } class RunScripts extends OptionObject { - constructor(e) { - super(qn, "runScripts", ["both", "client", "none", "server"]); + constructor(attributes) { + super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); } } class config_Script extends XFAObject { - constructor(e) { - super(qn, "script", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "script", true); this.currentPage = null; this.exclude = null; this.runScripts = null; } } class ScriptModel extends OptionObject { - constructor(e) { - super(qn, "scriptModel", ["XFA", "none"]); + constructor(attributes) { + super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); } } class Severity extends OptionObject { - constructor(e) { - super(qn, "severity", [ + constructor(attributes) { + super(CONFIG_NS_ID, "severity", [ "ignore", "error", "information", @@ -49333,56 +59447,66 @@ class Severity extends OptionObject { } } class SilentPrint extends XFAObject { - constructor(e) { - super(qn, "silentPrint", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "silentPrint", true); this.addSilentPrint = null; this.printerName = null; } } class Staple extends XFAObject { - constructor(e) { - super(qn, "staple"); - this.mode = getStringOption(e.mode, ["usePrinterSetting", "on", "off"]); + constructor(attributes) { + super(CONFIG_NS_ID, "staple"); + this.mode = getStringOption(attributes.mode, [ + "usePrinterSetting", + "on", + "off", + ]); } } class StartNode extends StringObject { - constructor(e) { - super(qn, "startNode"); + constructor(attributes) { + super(CONFIG_NS_ID, "startNode"); } } class StartPage extends IntegerObject { - constructor(e) { - super(qn, "startPage", 0, (e) => !0); + constructor(attributes) { + super(CONFIG_NS_ID, "startPage", 0, (n) => true); } } class SubmitFormat extends OptionObject { - constructor(e) { - super(qn, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); + constructor(attributes) { + super(CONFIG_NS_ID, "submitFormat", [ + "html", + "delegate", + "fdf", + "xml", + "pdf", + ]); } } class SubmitUrl extends StringObject { - constructor(e) { - super(qn, "submitUrl"); + constructor(attributes) { + super(CONFIG_NS_ID, "submitUrl"); } } class SubsetBelow extends IntegerObject { - constructor(e) { - super(qn, "subsetBelow", 100, (e) => e >= 0 && e <= 100); + constructor(attributes) { + super(CONFIG_NS_ID, "subsetBelow", 100, (n) => n >= 0 && n <= 100); } } class SuppressBanner extends Option01 { - constructor(e) { - super(qn, "suppressBanner"); + constructor(attributes) { + super(CONFIG_NS_ID, "suppressBanner"); } } class Tagged extends Option01 { - constructor(e) { - super(qn, "tagged"); + constructor(attributes) { + super(CONFIG_NS_ID, "tagged"); } } class config_Template extends XFAObject { - constructor(e) { - super(qn, "template", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "template", true); this.base = null; this.relevant = null; this.startPage = null; @@ -49391,34 +59515,46 @@ class config_Template extends XFAObject { } } class Threshold extends OptionObject { - constructor(e) { - super(qn, "threshold", ["trace", "error", "information", "warning"]); + constructor(attributes) { + super(CONFIG_NS_ID, "threshold", [ + "trace", + "error", + "information", + "warning", + ]); } } class To extends OptionObject { - constructor(e) { - super(qn, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); + constructor(attributes) { + super(CONFIG_NS_ID, "to", [ + "null", + "memory", + "stderr", + "stdout", + "system", + "uri", + ]); } } class TemplateCache extends XFAObject { - constructor(e) { - super(qn, "templateCache"); + constructor(attributes) { + super(CONFIG_NS_ID, "templateCache"); this.maxEntries = getInteger({ - data: e.maxEntries, + data: attributes.maxEntries, defaultValue: 5, - validate: (e) => e >= 0, + validate: (n) => n >= 0, }); } } class Trace extends XFAObject { - constructor(e) { - super(qn, "trace", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "trace", true); this.area = new XFAObjectArray(); } } class Transform extends XFAObject { - constructor(e) { - super(qn, "transform", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "transform", true); this.groupParent = null; this.ifEmpty = null; this.nameAttr = null; @@ -49429,8 +59565,8 @@ class Transform extends XFAObject { } } class Type extends OptionObject { - constructor(e) { - super(qn, "type", [ + constructor(attributes) { + super(CONFIG_NS_ID, "type", [ "none", "ascii85", "asciiHex", @@ -49445,29 +59581,34 @@ class Type extends OptionObject { } } class Uri extends StringObject { - constructor(e) { - super(qn, "uri"); + constructor(attributes) { + super(CONFIG_NS_ID, "uri"); } } class config_Validate extends OptionObject { - constructor(e) { - super(qn, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); + constructor(attributes) { + super(CONFIG_NS_ID, "validate", [ + "preSubmit", + "prePrint", + "preExecute", + "preSave", + ]); } } class ValidateApprovalSignatures extends ContentObject { - constructor(e) { - super(qn, "validateApprovalSignatures"); + constructor(attributes) { + super(CONFIG_NS_ID, "validateApprovalSignatures"); } - [sr]() { - this[er] = this[er] + [$finalize]() { + this[$content] = this[$content] .trim() .split(/\s+/) - .filter((e) => ["docReady", "postSign"].includes(e)); + .filter((x) => ["docReady", "postSign"].includes(x)); } } class ValidationMessaging extends OptionObject { - constructor(e) { - super(qn, "validationMessaging", [ + constructor(attributes) { + super(CONFIG_NS_ID, "validationMessaging", [ "allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", @@ -49476,25 +59617,31 @@ class ValidationMessaging extends OptionObject { } } class Version extends OptionObject { - constructor(e) { - super(qn, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); + constructor(attributes) { + super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); } } class VersionControl extends XFAObject { - constructor(e) { - super(qn, "VersionControl"); - this.outputBelow = getStringOption(e.outputBelow, [ + constructor(attributes) { + super(CONFIG_NS_ID, "VersionControl"); + this.outputBelow = getStringOption(attributes.outputBelow, [ "warn", "error", "update", ]); - this.sourceAbove = getStringOption(e.sourceAbove, ["warn", "error"]); - this.sourceBelow = getStringOption(e.sourceBelow, ["update", "maintain"]); + this.sourceAbove = getStringOption(attributes.sourceAbove, [ + "warn", + "error", + ]); + this.sourceBelow = getStringOption(attributes.sourceBelow, [ + "update", + "maintain", + ]); } } class ViewerPreferences extends XFAObject { - constructor(e) { - super(qn, "viewerPreferences", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "viewerPreferences", true); this.ADBE_JSConsole = null; this.ADBE_JSDebugger = null; this.addViewerPreferences = null; @@ -49507,16 +59654,16 @@ class ViewerPreferences extends XFAObject { } } class WebClient extends XFAObject { - constructor(e) { - super(qn, "webClient", !0); - this.name = e.name ? e.name.trim() : ""; + constructor(attributes) { + super(CONFIG_NS_ID, "webClient", true); + this.name = attributes.name ? attributes.name.trim() : ""; this.fontInfo = null; this.xdc = null; } } class Whitespace extends OptionObject { - constructor(e) { - super(qn, "whitespace", [ + constructor(attributes) { + super(CONFIG_NS_ID, "whitespace", [ "preserve", "ltrim", "normalize", @@ -49526,45 +59673,48 @@ class Whitespace extends OptionObject { } } class Window extends ContentObject { - constructor(e) { - super(qn, "window"); + constructor(attributes) { + super(CONFIG_NS_ID, "window"); } - [sr]() { - const e = this[er] + [$finalize]() { + const pair = this[$content] .trim() .split(/\s*,\s*/, 2) - .map((e) => parseInt(e, 10)); - if (e.some((e) => isNaN(e))) this[er] = [0, 0]; - else { - 1 === e.length && e.push(e[0]); - this[er] = e; + .map((x) => parseInt(x, 10)); + if (pair.some((x) => isNaN(x))) { + this[$content] = [0, 0]; + return; } + if (pair.length === 1) { + pair.push(pair[0]); + } + this[$content] = pair; } } class Xdc extends XFAObject { - constructor(e) { - super(qn, "xdc", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "xdc", true); this.uri = new XFAObjectArray(); this.xsl = new XFAObjectArray(); } } class Xdp extends XFAObject { - constructor(e) { - super(qn, "xdp", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "xdp", true); this.packets = null; } } class Xsl extends XFAObject { - constructor(e) { - super(qn, "xsl", !0); + constructor(attributes) { + super(CONFIG_NS_ID, "xsl", true); this.debug = null; this.uri = null; } } class Zpl extends XFAObject { - constructor(e) { - super(qn, "zpl", !0); - this.name = e.name ? e.name.trim() : ""; + constructor(attributes) { + super(CONFIG_NS_ID, "zpl", true); + this.name = attributes.name ? attributes.name.trim() : ""; this.batchOutput = null; this.flipLabel = null; this.fontInfo = null; @@ -49572,515 +59722,519 @@ class Zpl extends XFAObject { } } class ConfigNamespace { - static [gn](e, t) { - if (ConfigNamespace.hasOwnProperty(e)) return ConfigNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (ConfigNamespace.hasOwnProperty(name)) { + return ConfigNamespace[name](attributes); + } + return undefined; } - static acrobat(e) { - return new Acrobat(e); + static acrobat(attrs) { + return new Acrobat(attrs); } - static acrobat7(e) { - return new Acrobat7(e); + static acrobat7(attrs) { + return new Acrobat7(attrs); } - static ADBE_JSConsole(e) { - return new ADBE_JSConsole(e); + static ADBE_JSConsole(attrs) { + return new ADBE_JSConsole(attrs); } - static ADBE_JSDebugger(e) { - return new ADBE_JSDebugger(e); + static ADBE_JSDebugger(attrs) { + return new ADBE_JSDebugger(attrs); } - static addSilentPrint(e) { - return new AddSilentPrint(e); + static addSilentPrint(attrs) { + return new AddSilentPrint(attrs); } - static addViewerPreferences(e) { - return new AddViewerPreferences(e); + static addViewerPreferences(attrs) { + return new AddViewerPreferences(attrs); } - static adjustData(e) { - return new AdjustData(e); + static adjustData(attrs) { + return new AdjustData(attrs); } - static adobeExtensionLevel(e) { - return new AdobeExtensionLevel(e); + static adobeExtensionLevel(attrs) { + return new AdobeExtensionLevel(attrs); } - static agent(e) { - return new Agent(e); + static agent(attrs) { + return new Agent(attrs); } - static alwaysEmbed(e) { - return new AlwaysEmbed(e); + static alwaysEmbed(attrs) { + return new AlwaysEmbed(attrs); } - static amd(e) { - return new Amd(e); + static amd(attrs) { + return new Amd(attrs); } - static area(e) { - return new config_Area(e); + static area(attrs) { + return new config_Area(attrs); } - static attributes(e) { - return new Attributes(e); + static attributes(attrs) { + return new Attributes(attrs); } - static autoSave(e) { - return new AutoSave(e); + static autoSave(attrs) { + return new AutoSave(attrs); } - static base(e) { - return new Base(e); + static base(attrs) { + return new Base(attrs); } - static batchOutput(e) { - return new BatchOutput(e); + static batchOutput(attrs) { + return new BatchOutput(attrs); } - static behaviorOverride(e) { - return new BehaviorOverride(e); + static behaviorOverride(attrs) { + return new BehaviorOverride(attrs); } - static cache(e) { - return new Cache(e); + static cache(attrs) { + return new Cache(attrs); } - static change(e) { - return new Change(e); + static change(attrs) { + return new Change(attrs); } - static common(e) { - return new Common(e); + static common(attrs) { + return new Common(attrs); } - static compress(e) { - return new Compress(e); + static compress(attrs) { + return new Compress(attrs); } - static compressLogicalStructure(e) { - return new CompressLogicalStructure(e); + static compressLogicalStructure(attrs) { + return new CompressLogicalStructure(attrs); } - static compressObjectStream(e) { - return new CompressObjectStream(e); + static compressObjectStream(attrs) { + return new CompressObjectStream(attrs); } - static compression(e) { - return new Compression(e); + static compression(attrs) { + return new Compression(attrs); } - static config(e) { - return new Config(e); + static config(attrs) { + return new Config(attrs); } - static conformance(e) { - return new Conformance(e); + static conformance(attrs) { + return new Conformance(attrs); } - static contentCopy(e) { - return new ContentCopy(e); + static contentCopy(attrs) { + return new ContentCopy(attrs); } - static copies(e) { - return new Copies(e); + static copies(attrs) { + return new Copies(attrs); } - static creator(e) { - return new Creator(e); + static creator(attrs) { + return new Creator(attrs); } - static currentPage(e) { - return new CurrentPage(e); + static currentPage(attrs) { + return new CurrentPage(attrs); } - static data(e) { - return new Data(e); + static data(attrs) { + return new Data(attrs); } - static debug(e) { - return new Debug(e); + static debug(attrs) { + return new Debug(attrs); } - static defaultTypeface(e) { - return new DefaultTypeface(e); + static defaultTypeface(attrs) { + return new DefaultTypeface(attrs); } - static destination(e) { - return new Destination(e); + static destination(attrs) { + return new Destination(attrs); } - static documentAssembly(e) { - return new DocumentAssembly(e); + static documentAssembly(attrs) { + return new DocumentAssembly(attrs); } - static driver(e) { - return new Driver(e); + static driver(attrs) { + return new Driver(attrs); } - static duplexOption(e) { - return new DuplexOption(e); + static duplexOption(attrs) { + return new DuplexOption(attrs); } - static dynamicRender(e) { - return new DynamicRender(e); + static dynamicRender(attrs) { + return new DynamicRender(attrs); } - static embed(e) { - return new Embed(e); + static embed(attrs) { + return new Embed(attrs); } - static encrypt(e) { - return new config_Encrypt(e); + static encrypt(attrs) { + return new config_Encrypt(attrs); } - static encryption(e) { - return new config_Encryption(e); + static encryption(attrs) { + return new config_Encryption(attrs); } - static encryptionLevel(e) { - return new EncryptionLevel(e); + static encryptionLevel(attrs) { + return new EncryptionLevel(attrs); } - static enforce(e) { - return new Enforce(e); + static enforce(attrs) { + return new Enforce(attrs); } - static equate(e) { - return new Equate(e); + static equate(attrs) { + return new Equate(attrs); } - static equateRange(e) { - return new EquateRange(e); + static equateRange(attrs) { + return new EquateRange(attrs); } - static exclude(e) { - return new Exclude(e); + static exclude(attrs) { + return new Exclude(attrs); } - static excludeNS(e) { - return new ExcludeNS(e); + static excludeNS(attrs) { + return new ExcludeNS(attrs); } - static flipLabel(e) { - return new FlipLabel(e); + static flipLabel(attrs) { + return new FlipLabel(attrs); } - static fontInfo(e) { - return new config_FontInfo(e); + static fontInfo(attrs) { + return new config_FontInfo(attrs); } - static formFieldFilling(e) { - return new FormFieldFilling(e); + static formFieldFilling(attrs) { + return new FormFieldFilling(attrs); } - static groupParent(e) { - return new GroupParent(e); + static groupParent(attrs) { + return new GroupParent(attrs); } - static ifEmpty(e) { - return new IfEmpty(e); + static ifEmpty(attrs) { + return new IfEmpty(attrs); } - static includeXDPContent(e) { - return new IncludeXDPContent(e); + static includeXDPContent(attrs) { + return new IncludeXDPContent(attrs); } - static incrementalLoad(e) { - return new IncrementalLoad(e); + static incrementalLoad(attrs) { + return new IncrementalLoad(attrs); } - static incrementalMerge(e) { - return new IncrementalMerge(e); + static incrementalMerge(attrs) { + return new IncrementalMerge(attrs); } - static interactive(e) { - return new Interactive(e); + static interactive(attrs) { + return new Interactive(attrs); } - static jog(e) { - return new Jog(e); + static jog(attrs) { + return new Jog(attrs); } - static labelPrinter(e) { - return new LabelPrinter(e); + static labelPrinter(attrs) { + return new LabelPrinter(attrs); } - static layout(e) { - return new Layout(e); + static layout(attrs) { + return new Layout(attrs); } - static level(e) { - return new Level(e); + static level(attrs) { + return new Level(attrs); } - static linearized(e) { - return new Linearized(e); + static linearized(attrs) { + return new Linearized(attrs); } - static locale(e) { - return new Locale(e); + static locale(attrs) { + return new Locale(attrs); } - static localeSet(e) { - return new LocaleSet(e); + static localeSet(attrs) { + return new LocaleSet(attrs); } - static log(e) { - return new Log(e); + static log(attrs) { + return new Log(attrs); } - static map(e) { - return new MapElement(e); + static map(attrs) { + return new MapElement(attrs); } - static mediumInfo(e) { - return new MediumInfo(e); + static mediumInfo(attrs) { + return new MediumInfo(attrs); } - static message(e) { - return new config_Message(e); + static message(attrs) { + return new config_Message(attrs); } - static messaging(e) { - return new Messaging(e); + static messaging(attrs) { + return new Messaging(attrs); } - static mode(e) { - return new Mode(e); + static mode(attrs) { + return new Mode(attrs); } - static modifyAnnots(e) { - return new ModifyAnnots(e); + static modifyAnnots(attrs) { + return new ModifyAnnots(attrs); } - static msgId(e) { - return new MsgId(e); + static msgId(attrs) { + return new MsgId(attrs); } - static nameAttr(e) { - return new NameAttr(e); + static nameAttr(attrs) { + return new NameAttr(attrs); } - static neverEmbed(e) { - return new NeverEmbed(e); + static neverEmbed(attrs) { + return new NeverEmbed(attrs); } - static numberOfCopies(e) { - return new NumberOfCopies(e); + static numberOfCopies(attrs) { + return new NumberOfCopies(attrs); } - static openAction(e) { - return new OpenAction(e); + static openAction(attrs) { + return new OpenAction(attrs); } - static output(e) { - return new Output(e); + static output(attrs) { + return new Output(attrs); } - static outputBin(e) { - return new OutputBin(e); + static outputBin(attrs) { + return new OutputBin(attrs); } - static outputXSL(e) { - return new OutputXSL(e); + static outputXSL(attrs) { + return new OutputXSL(attrs); } - static overprint(e) { - return new Overprint(e); + static overprint(attrs) { + return new Overprint(attrs); } - static packets(e) { - return new Packets(e); + static packets(attrs) { + return new Packets(attrs); } - static pageOffset(e) { - return new PageOffset(e); + static pageOffset(attrs) { + return new PageOffset(attrs); } - static pageRange(e) { - return new PageRange(e); + static pageRange(attrs) { + return new PageRange(attrs); } - static pagination(e) { - return new Pagination(e); + static pagination(attrs) { + return new Pagination(attrs); } - static paginationOverride(e) { - return new PaginationOverride(e); + static paginationOverride(attrs) { + return new PaginationOverride(attrs); } - static part(e) { - return new Part(e); + static part(attrs) { + return new Part(attrs); } - static pcl(e) { - return new Pcl(e); + static pcl(attrs) { + return new Pcl(attrs); } - static pdf(e) { - return new Pdf(e); + static pdf(attrs) { + return new Pdf(attrs); } - static pdfa(e) { - return new Pdfa(e); + static pdfa(attrs) { + return new Pdfa(attrs); } - static permissions(e) { - return new Permissions(e); + static permissions(attrs) { + return new Permissions(attrs); } - static pickTrayByPDFSize(e) { - return new PickTrayByPDFSize(e); + static pickTrayByPDFSize(attrs) { + return new PickTrayByPDFSize(attrs); } - static picture(e) { - return new config_Picture(e); + static picture(attrs) { + return new config_Picture(attrs); } - static plaintextMetadata(e) { - return new PlaintextMetadata(e); + static plaintextMetadata(attrs) { + return new PlaintextMetadata(attrs); } - static presence(e) { - return new Presence(e); + static presence(attrs) { + return new Presence(attrs); } - static present(e) { - return new Present(e); + static present(attrs) { + return new Present(attrs); } - static print(e) { - return new Print(e); + static print(attrs) { + return new Print(attrs); } - static printHighQuality(e) { - return new PrintHighQuality(e); + static printHighQuality(attrs) { + return new PrintHighQuality(attrs); } - static printScaling(e) { - return new PrintScaling(e); + static printScaling(attrs) { + return new PrintScaling(attrs); } - static printerName(e) { - return new PrinterName(e); + static printerName(attrs) { + return new PrinterName(attrs); } - static producer(e) { - return new Producer(e); + static producer(attrs) { + return new Producer(attrs); } - static ps(e) { - return new Ps(e); + static ps(attrs) { + return new Ps(attrs); } - static range(e) { - return new Range(e); + static range(attrs) { + return new Range(attrs); } - static record(e) { - return new Record(e); + static record(attrs) { + return new Record(attrs); } - static relevant(e) { - return new Relevant(e); + static relevant(attrs) { + return new Relevant(attrs); } - static rename(e) { - return new Rename(e); + static rename(attrs) { + return new Rename(attrs); } - static renderPolicy(e) { - return new RenderPolicy(e); + static renderPolicy(attrs) { + return new RenderPolicy(attrs); } - static runScripts(e) { - return new RunScripts(e); + static runScripts(attrs) { + return new RunScripts(attrs); } - static script(e) { - return new config_Script(e); + static script(attrs) { + return new config_Script(attrs); } - static scriptModel(e) { - return new ScriptModel(e); + static scriptModel(attrs) { + return new ScriptModel(attrs); } - static severity(e) { - return new Severity(e); + static severity(attrs) { + return new Severity(attrs); } - static silentPrint(e) { - return new SilentPrint(e); + static silentPrint(attrs) { + return new SilentPrint(attrs); } - static staple(e) { - return new Staple(e); + static staple(attrs) { + return new Staple(attrs); } - static startNode(e) { - return new StartNode(e); + static startNode(attrs) { + return new StartNode(attrs); } - static startPage(e) { - return new StartPage(e); + static startPage(attrs) { + return new StartPage(attrs); } - static submitFormat(e) { - return new SubmitFormat(e); + static submitFormat(attrs) { + return new SubmitFormat(attrs); } - static submitUrl(e) { - return new SubmitUrl(e); + static submitUrl(attrs) { + return new SubmitUrl(attrs); } - static subsetBelow(e) { - return new SubsetBelow(e); + static subsetBelow(attrs) { + return new SubsetBelow(attrs); } - static suppressBanner(e) { - return new SuppressBanner(e); + static suppressBanner(attrs) { + return new SuppressBanner(attrs); } - static tagged(e) { - return new Tagged(e); + static tagged(attrs) { + return new Tagged(attrs); } - static template(e) { - return new config_Template(e); + static template(attrs) { + return new config_Template(attrs); } - static templateCache(e) { - return new TemplateCache(e); + static templateCache(attrs) { + return new TemplateCache(attrs); } - static threshold(e) { - return new Threshold(e); + static threshold(attrs) { + return new Threshold(attrs); } - static to(e) { - return new To(e); + static to(attrs) { + return new To(attrs); } - static trace(e) { - return new Trace(e); + static trace(attrs) { + return new Trace(attrs); } - static transform(e) { - return new Transform(e); + static transform(attrs) { + return new Transform(attrs); } - static type(e) { - return new Type(e); + static type(attrs) { + return new Type(attrs); } - static uri(e) { - return new Uri(e); + static uri(attrs) { + return new Uri(attrs); } - static validate(e) { - return new config_Validate(e); + static validate(attrs) { + return new config_Validate(attrs); } - static validateApprovalSignatures(e) { - return new ValidateApprovalSignatures(e); + static validateApprovalSignatures(attrs) { + return new ValidateApprovalSignatures(attrs); } - static validationMessaging(e) { - return new ValidationMessaging(e); + static validationMessaging(attrs) { + return new ValidationMessaging(attrs); } - static version(e) { - return new Version(e); + static version(attrs) { + return new Version(attrs); } - static versionControl(e) { - return new VersionControl(e); + static versionControl(attrs) { + return new VersionControl(attrs); } - static viewerPreferences(e) { - return new ViewerPreferences(e); + static viewerPreferences(attrs) { + return new ViewerPreferences(attrs); } - static webClient(e) { - return new WebClient(e); + static webClient(attrs) { + return new WebClient(attrs); } - static whitespace(e) { - return new Whitespace(e); + static whitespace(attrs) { + return new Whitespace(attrs); } - static window(e) { - return new Window(e); + static window(attrs) { + return new Window(attrs); } - static xdc(e) { - return new Xdc(e); + static xdc(attrs) { + return new Xdc(attrs); } - static xdp(e) { - return new Xdp(e); + static xdp(attrs) { + return new Xdp(attrs); } - static xsl(e) { - return new Xsl(e); + static xsl(attrs) { + return new Xsl(attrs); } - static zpl(e) { - return new Zpl(e); + static zpl(attrs) { + return new Zpl(attrs); } -} -const On = on.connectionSet.id; +} // ./src/core/xfa/connection_set.js + +const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; class ConnectionSet extends XFAObject { - constructor(e) { - super(On, "connectionSet", !0); + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "connectionSet", true); this.wsdlConnection = new XFAObjectArray(); this.xmlConnection = new XFAObjectArray(); this.xsdConnection = new XFAObjectArray(); } } class EffectiveInputPolicy extends XFAObject { - constructor(e) { - super(On, "effectiveInputPolicy"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(On, "effectiveOutputPolicy"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(On, "operation"); - this.id = e.id || ""; - this.input = e.input || ""; - this.name = e.name || ""; - this.output = e.output || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(On, "rootElement"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(On, "soapAction"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(On, "soapAddress"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 connection_set_Uri extends StringObject { - constructor(e) { - super(On, "uri"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 StringObject { - constructor(e) { - super(On, "wsdlAddress"); - this.id = e.id || ""; - this.name = e.name || ""; - this.use = e.use || ""; - this.usehref = e.usehref || ""; + 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 XFAObject { - constructor(e) { - super(On, "wsdlConnection", !0); - this.dataDescription = e.dataDescription || ""; - this.name = e.name || ""; + 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; @@ -50090,102 +60244,113 @@ class WsdlConnection extends XFAObject { } } class XmlConnection extends XFAObject { - constructor(e) { - super(On, "xmlConnection", !0); - this.dataDescription = e.dataDescription || ""; - this.name = e.name || ""; + constructor(attributes) { + super(CONNECTION_SET_NS_ID, "xmlConnection", true); + this.dataDescription = attributes.dataDescription || ""; + this.name = attributes.name || ""; this.uri = null; } } class XsdConnection extends XFAObject { - constructor(e) { - super(On, "xsdConnection", !0); - this.dataDescription = e.dataDescription || ""; - this.name = e.name || ""; + 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 [gn](e, t) { - if (ConnectionSetNamespace.hasOwnProperty(e)) - return ConnectionSetNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (ConnectionSetNamespace.hasOwnProperty(name)) { + return ConnectionSetNamespace[name](attributes); + } + return undefined; } - static connectionSet(e) { - return new ConnectionSet(e); + static connectionSet(attrs) { + return new ConnectionSet(attrs); } - static effectiveInputPolicy(e) { - return new EffectiveInputPolicy(e); + static effectiveInputPolicy(attrs) { + return new EffectiveInputPolicy(attrs); } - static effectiveOutputPolicy(e) { - return new EffectiveOutputPolicy(e); + static effectiveOutputPolicy(attrs) { + return new EffectiveOutputPolicy(attrs); } - static operation(e) { - return new Operation(e); + static operation(attrs) { + return new Operation(attrs); } - static rootElement(e) { - return new RootElement(e); + static rootElement(attrs) { + return new RootElement(attrs); } - static soapAction(e) { - return new SoapAction(e); + static soapAction(attrs) { + return new SoapAction(attrs); } - static soapAddress(e) { - return new SoapAddress(e); + static soapAddress(attrs) { + return new SoapAddress(attrs); } - static uri(e) { - return new connection_set_Uri(e); + static uri(attrs) { + return new connection_set_Uri(attrs); } - static wsdlAddress(e) { - return new WsdlAddress(e); + static wsdlAddress(attrs) { + return new WsdlAddress(attrs); } - static wsdlConnection(e) { - return new WsdlConnection(e); + static wsdlConnection(attrs) { + return new WsdlConnection(attrs); } - static xmlConnection(e) { - return new XmlConnection(e); + static xmlConnection(attrs) { + return new XmlConnection(attrs); } - static xsdConnection(e) { - return new XsdConnection(e); + static xsdConnection(attrs) { + return new XsdConnection(attrs); } -} -const Pn = on.datasets.id; +} // ./src/core/xfa/datasets.js + +const DATASETS_NS_ID = NamespaceIds.datasets.id; class datasets_Data extends XmlObject { - constructor(e) { - super(Pn, "data", e); + constructor(attributes) { + super(DATASETS_NS_ID, "data", attributes); } - [Gr]() { - return !0; + [$isNsAgnostic]() { + return true; } } class Datasets extends XFAObject { - constructor(e) { - super(Pn, "datasets", !0); + constructor(attributes) { + super(DATASETS_NS_ID, "datasets", true); this.data = null; this.Signature = null; } - [Kr](e) { - const t = e[Yr]; - (("data" === t && e[Jr] === Pn) || - ("Signature" === t && e[Jr] === on.signature.id)) && - (this[t] = e); - this[Xs](e); + [$onChild](child) { + const name = child[$nodeName]; + if ( + (name === "data" && child[$namespaceId] === DATASETS_NS_ID) || + (name === "Signature" && + child[$namespaceId] === NamespaceIds.signature.id) + ) { + this[name] = child; + } + this[$appendChild](child); } } class DatasetsNamespace { - static [gn](e, t) { - if (DatasetsNamespace.hasOwnProperty(e)) return DatasetsNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (DatasetsNamespace.hasOwnProperty(name)) { + return DatasetsNamespace[name](attributes); + } + return undefined; } - static datasets(e) { - return new Datasets(e); + static datasets(attributes) { + return new Datasets(attributes); } - static data(e) { - return new datasets_Data(e); + static data(attributes) { + return new datasets_Data(attributes); } -} -const Wn = on.localeSet.id; +} // ./src/core/xfa/locale_set.js + +const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; class CalendarSymbols extends XFAObject { - constructor(e) { - super(Wn, "calendarSymbols", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "calendarSymbols", true); this.name = "gregorian"; this.dayNames = new XFAObjectArray(2); this.eraNames = null; @@ -50194,65 +60359,74 @@ class CalendarSymbols extends XFAObject { } } class CurrencySymbol extends StringObject { - constructor(e) { - super(Wn, "currencySymbol"); - this.name = getStringOption(e.name, ["symbol", "isoname", "decimal"]); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbol"); + this.name = getStringOption(attributes.name, [ + "symbol", + "isoname", + "decimal", + ]); } } class CurrencySymbols extends XFAObject { - constructor(e) { - super(Wn, "currencySymbols", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "currencySymbols", true); this.currencySymbol = new XFAObjectArray(3); } } class DatePattern extends StringObject { - constructor(e) { - super(Wn, "datePattern"); - this.name = getStringOption(e.name, ["full", "long", "med", "short"]); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePattern"); + this.name = getStringOption(attributes.name, [ + "full", + "long", + "med", + "short", + ]); } } class DatePatterns extends XFAObject { - constructor(e) { - super(Wn, "datePatterns", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "datePatterns", true); this.datePattern = new XFAObjectArray(4); } } class DateTimeSymbols extends ContentObject { - constructor(e) { - super(Wn, "dateTimeSymbols"); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dateTimeSymbols"); } } class Day extends StringObject { - constructor(e) { - super(Wn, "day"); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "day"); } } class DayNames extends XFAObject { - constructor(e) { - super(Wn, "dayNames", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "dayNames", true); this.abbr = getInteger({ - data: e.abbr, + data: attributes.abbr, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); this.day = new XFAObjectArray(7); } } class Era extends StringObject { - constructor(e) { - super(Wn, "era"); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "era"); } } class EraNames extends XFAObject { - constructor(e) { - super(Wn, "eraNames", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "eraNames", true); this.era = new XFAObjectArray(2); } } class locale_set_Locale extends XFAObject { - constructor(e) { - super(Wn, "locale", !0); - this.desc = e.desc || ""; + constructor(attributes) { + super(LOCALE_SET_NS_ID, "locale", true); + this.desc = attributes.desc || ""; this.name = "isoname"; this.calendarSymbols = null; this.currencySymbols = null; @@ -50265,54 +60439,59 @@ class locale_set_Locale extends XFAObject { } } class locale_set_LocaleSet extends XFAObject { - constructor(e) { - super(Wn, "localeSet", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "localeSet", true); this.locale = new XFAObjectArray(); } } class Meridiem extends StringObject { - constructor(e) { - super(Wn, "meridiem"); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiem"); } } class MeridiemNames extends XFAObject { - constructor(e) { - super(Wn, "meridiemNames", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "meridiemNames", true); this.meridiem = new XFAObjectArray(2); } } class Month extends StringObject { - constructor(e) { - super(Wn, "month"); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "month"); } } class MonthNames extends XFAObject { - constructor(e) { - super(Wn, "monthNames", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "monthNames", true); this.abbr = getInteger({ - data: e.abbr, + data: attributes.abbr, defaultValue: 0, - validate: (e) => 1 === e, + validate: (x) => x === 1, }); this.month = new XFAObjectArray(12); } } class NumberPattern extends StringObject { - constructor(e) { - super(Wn, "numberPattern"); - this.name = getStringOption(e.name, ["full", "long", "med", "short"]); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPattern"); + this.name = getStringOption(attributes.name, [ + "full", + "long", + "med", + "short", + ]); } } class NumberPatterns extends XFAObject { - constructor(e) { - super(Wn, "numberPatterns", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberPatterns", true); this.numberPattern = new XFAObjectArray(4); } } class NumberSymbol extends StringObject { - constructor(e) { - super(Wn, "numberSymbol"); - this.name = getStringOption(e.name, [ + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbol"); + this.name = getStringOption(attributes.name, [ "decimal", "grouping", "percent", @@ -50322,146 +60501,163 @@ class NumberSymbol extends StringObject { } } class NumberSymbols extends XFAObject { - constructor(e) { - super(Wn, "numberSymbols", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "numberSymbols", true); this.numberSymbol = new XFAObjectArray(5); } } class TimePattern extends StringObject { - constructor(e) { - super(Wn, "timePattern"); - this.name = getStringOption(e.name, ["full", "long", "med", "short"]); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePattern"); + this.name = getStringOption(attributes.name, [ + "full", + "long", + "med", + "short", + ]); } } class TimePatterns extends XFAObject { - constructor(e) { - super(Wn, "timePatterns", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "timePatterns", true); this.timePattern = new XFAObjectArray(4); } } class TypeFace extends XFAObject { - constructor(e) { - super(Wn, "typeFace", !0); - this.name = "" | e.name; + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFace", true); + this.name = attributes.name | ""; } } class TypeFaces extends XFAObject { - constructor(e) { - super(Wn, "typeFaces", !0); + constructor(attributes) { + super(LOCALE_SET_NS_ID, "typeFaces", true); this.typeFace = new XFAObjectArray(); } } class LocaleSetNamespace { - static [gn](e, t) { - if (LocaleSetNamespace.hasOwnProperty(e)) return LocaleSetNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (LocaleSetNamespace.hasOwnProperty(name)) { + return LocaleSetNamespace[name](attributes); + } + return undefined; } - static calendarSymbols(e) { - return new CalendarSymbols(e); + static calendarSymbols(attrs) { + return new CalendarSymbols(attrs); } - static currencySymbol(e) { - return new CurrencySymbol(e); + static currencySymbol(attrs) { + return new CurrencySymbol(attrs); } - static currencySymbols(e) { - return new CurrencySymbols(e); + static currencySymbols(attrs) { + return new CurrencySymbols(attrs); } - static datePattern(e) { - return new DatePattern(e); + static datePattern(attrs) { + return new DatePattern(attrs); } - static datePatterns(e) { - return new DatePatterns(e); + static datePatterns(attrs) { + return new DatePatterns(attrs); } - static dateTimeSymbols(e) { - return new DateTimeSymbols(e); + static dateTimeSymbols(attrs) { + return new DateTimeSymbols(attrs); } - static day(e) { - return new Day(e); + static day(attrs) { + return new Day(attrs); } - static dayNames(e) { - return new DayNames(e); + static dayNames(attrs) { + return new DayNames(attrs); } - static era(e) { - return new Era(e); + static era(attrs) { + return new Era(attrs); } - static eraNames(e) { - return new EraNames(e); + static eraNames(attrs) { + return new EraNames(attrs); } - static locale(e) { - return new locale_set_Locale(e); + static locale(attrs) { + return new locale_set_Locale(attrs); } - static localeSet(e) { - return new locale_set_LocaleSet(e); + static localeSet(attrs) { + return new locale_set_LocaleSet(attrs); } - static meridiem(e) { - return new Meridiem(e); + static meridiem(attrs) { + return new Meridiem(attrs); } - static meridiemNames(e) { - return new MeridiemNames(e); + static meridiemNames(attrs) { + return new MeridiemNames(attrs); } - static month(e) { - return new Month(e); + static month(attrs) { + return new Month(attrs); } - static monthNames(e) { - return new MonthNames(e); + static monthNames(attrs) { + return new MonthNames(attrs); } - static numberPattern(e) { - return new NumberPattern(e); + static numberPattern(attrs) { + return new NumberPattern(attrs); } - static numberPatterns(e) { - return new NumberPatterns(e); + static numberPatterns(attrs) { + return new NumberPatterns(attrs); } - static numberSymbol(e) { - return new NumberSymbol(e); + static numberSymbol(attrs) { + return new NumberSymbol(attrs); } - static numberSymbols(e) { - return new NumberSymbols(e); + static numberSymbols(attrs) { + return new NumberSymbols(attrs); } - static timePattern(e) { - return new TimePattern(e); + static timePattern(attrs) { + return new TimePattern(attrs); } - static timePatterns(e) { - return new TimePatterns(e); + static timePatterns(attrs) { + return new TimePatterns(attrs); } - static typeFace(e) { - return new TypeFace(e); + static typeFace(attrs) { + return new TypeFace(attrs); } - static typeFaces(e) { - return new TypeFaces(e); + static typeFaces(attrs) { + return new TypeFaces(attrs); } -} -const jn = on.signature.id; +} // ./src/core/xfa/signature.js + +const SIGNATURE_NS_ID = NamespaceIds.signature.id; class signature_Signature extends XFAObject { - constructor(e) { - super(jn, "signature", !0); + constructor(attributes) { + super(SIGNATURE_NS_ID, "signature", true); } } class SignatureNamespace { - static [gn](e, t) { - if (SignatureNamespace.hasOwnProperty(e)) return SignatureNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (SignatureNamespace.hasOwnProperty(name)) { + return SignatureNamespace[name](attributes); + } + return undefined; } - static signature(e) { - return new signature_Signature(e); + static signature(attributes) { + return new signature_Signature(attributes); } -} -const Xn = on.stylesheet.id; +} // ./src/core/xfa/stylesheet.js + +const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; class Stylesheet extends XFAObject { - constructor(e) { - super(Xn, "stylesheet", !0); + constructor(attributes) { + super(STYLESHEET_NS_ID, "stylesheet", true); } } class StylesheetNamespace { - static [gn](e, t) { - if (StylesheetNamespace.hasOwnProperty(e)) return StylesheetNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (StylesheetNamespace.hasOwnProperty(name)) { + return StylesheetNamespace[name](attributes); + } + return undefined; } - static stylesheet(e) { - return new Stylesheet(e); + static stylesheet(attributes) { + return new Stylesheet(attributes); } -} -const Zn = on.xdp.id; +} // ./src/core/xfa/xdp.js + +const XDP_NS_ID = NamespaceIds.xdp.id; class xdp_Xdp extends XFAObject { - constructor(e) { - super(Zn, "xdp", !0); - this.uuid = e.uuid || ""; - this.timeStamp = e.timeStamp || ""; + 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; @@ -50469,414 +60665,510 @@ class xdp_Xdp extends XFAObject { this.stylesheet = new XFAObjectArray(); this.template = null; } - [Tr](e) { - const t = on[e[Yr]]; - return t && e[Jr] === t.id; + [$onChildCheck](child) { + const ns = NamespaceIds[child[$nodeName]]; + return ns && child[$namespaceId] === ns.id; } } class XdpNamespace { - static [gn](e, t) { - if (XdpNamespace.hasOwnProperty(e)) return XdpNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (XdpNamespace.hasOwnProperty(name)) { + return XdpNamespace[name](attributes); + } + return undefined; } - static xdp(e) { - return new xdp_Xdp(e); + static xdp(attributes) { + return new xdp_Xdp(attributes); } -} -const Vn = on.xhtml.id, - zn = Symbol(), - _n = 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", +} // ./src/core/xfa/xhtml.js + +const XHTML_NS_ID = NamespaceIds.xhtml.id; +const $richText = Symbol(); +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", - "xfa-spacerun", - "xfa-tab-stops", - ]), - $n = new Map([ - ["page-break-after", "breakAfter"], - ["page-break-before", "breakBefore"], - ["page-break-inside", "breakInside"], - ["kerning-mode", (e) => ("none" === e ? "none" : "normal")], - [ - "xfa-font-horizontal-scale", - (e) => `scaleX(${Math.max(0, Math.min(parseInt(e) / 100)).toFixed(2)})`, - ], - [ - "xfa-font-vertical-scale", - (e) => `scaleY(${Math.max(0, Math.min(parseInt(e) / 100)).toFixed(2)})`, - ], - ["xfa-spacerun", ""], - ["xfa-tab-stops", ""], - [ - "font-size", - (e, t) => measureToString(0.99 * (e = t.fontSize = getMeasurement(e))), - ], - ["letter-spacing", (e) => measureToString(getMeasurement(e))], - ["line-height", (e) => measureToString(getMeasurement(e))], - ["margin", (e) => measureToString(getMeasurement(e))], - ["margin-bottom", (e) => measureToString(getMeasurement(e))], - ["margin-left", (e) => measureToString(getMeasurement(e))], - ["margin-right", (e) => measureToString(getMeasurement(e))], - ["margin-top", (e) => measureToString(getMeasurement(e))], - ["text-indent", (e) => measureToString(getMeasurement(e))], - ["font-family", (e) => e], - ["vertical-align", (e) => measureToString(getMeasurement(e))], - ]), - Ag = /\s+/g, - eg = /[\r\n]+/g, - tg = /\r\n?/g; -function mapStyle(e, t, i) { - const a = Object.create(null); - if (!e) return a; - const s = Object.create(null); - for (const [t, i] of e.split(";").map((e) => e.split(":", 2))) { - const e = $n.get(t); - if ("" === e) continue; - let r = i; - e && (r = "string" == typeof e ? e : e(i, s)); - t.endsWith("scale") - ? (a.transform = a.transform ? `${a[t]} ${r}` : r) - : (a[t.replaceAll(/-([a-zA-Z])/g, (e, t) => t.toUpperCase())] = r); + (value) => + `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`, + ], + ["xfa-spacerun", ""], + ["xfa-tab-stops", ""], + [ + "font-size", + (value, original) => { + value = original.fontSize = getMeasurement(value); + return measureToString(0.99 * value); + }, + ], + ["letter-spacing", (value) => measureToString(getMeasurement(value))], + ["line-height", (value) => measureToString(getMeasurement(value))], + ["margin", (value) => measureToString(getMeasurement(value))], + ["margin-bottom", (value) => measureToString(getMeasurement(value))], + ["margin-left", (value) => measureToString(getMeasurement(value))], + ["margin-right", (value) => measureToString(getMeasurement(value))], + ["margin-top", (value) => measureToString(getMeasurement(value))], + ["text-indent", (value) => measureToString(getMeasurement(value))], + ["font-family", (value) => value], + ["vertical-align", (value) => measureToString(getMeasurement(value))], +]); +const spacesRegExp = /\s+/g; +const crlfRegExp = /[\r\n]+/g; +const crlfForRichTextRegExp = /\r\n?/g; +function mapStyle(styleStr, node, richText) { + const style = Object.create(null); + if (!styleStr) { + return style; } - a.fontFamily && + const original = Object.create(null); + for (const [key, value] of styleStr.split(";").map((s) => s.split(":", 2))) { + const mapping = StyleMapping.get(key); + if (mapping === "") { + continue; + } + let newValue = value; + if (mapping) { + newValue = + typeof mapping === "string" ? mapping : mapping(value, original); + } + if (key.endsWith("scale")) { + style.transform = style.transform + ? `${style[key]} ${newValue}` + : newValue; + } else { + style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = + newValue; + } + } + if (style.fontFamily) { setFontFamily( { - typeface: a.fontFamily, - weight: a.fontWeight || "normal", - posture: a.fontStyle || "normal", - size: s.fontSize || 0, + typeface: style.fontFamily, + weight: style.fontWeight || "normal", + posture: style.fontStyle || "normal", + size: original.fontSize || 0, }, - t, - t[yr].fontFinder, - a, - ); - if (i && a.verticalAlign && "0px" !== a.verticalAlign && a.fontSize) { - const e = 0.583, - t = 0.333, - i = getMeasurement(a.fontSize); - a.fontSize = measureToString(i * e); - a.verticalAlign = measureToString( - Math.sign(getMeasurement(a.verticalAlign)) * i * t, + node, + node[$globalData].fontFinder, + style, ); } - i && a.fontSize && (a.fontSize = `calc(${a.fontSize} * var(--scale-factor))`); - fixTextIndent(a); - return a; + if ( + richText && + style.verticalAlign && + style.verticalAlign !== "0px" && + style.fontSize + ) { + const SUB_SUPER_SCRIPT_FACTOR = 0.583; + const VERTICAL_FACTOR = 0.333; + const fontSize = getMeasurement(style.fontSize); + style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR); + style.verticalAlign = measureToString( + Math.sign(getMeasurement(style.verticalAlign)) * + fontSize * + VERTICAL_FACTOR, + ); + } + if (richText && style.fontSize) { + style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; + } + fixTextIndent(style); + return style; } -const ig = new Set(["body", "html"]); +function checkStyle(node) { + if (!node.style) { + return ""; + } + 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[$globalData].usedTypefaces.add(value); + } + return VALID_STYLES.has(key); + }) + .map((kv) => kv.join(":")) + .join(";"); +} +const NoWhites = new Set(["body", "html"]); class XhtmlObject extends XmlObject { - constructor(e, t) { - super(Vn, t); - this[zn] = !1; - this.style = e.style || ""; + constructor(attributes, name) { + super(XHTML_NS_ID, name); + this[$richText] = false; + this.style = attributes.style || ""; } - [Vs](e) { - super[Vs](e); - this.style = (function checkStyle(e) { - return e.style - ? e.style - .trim() - .split(/\s*;\s*/) - .filter((e) => !!e) - .map((e) => e.split(/\s*:\s*/, 2)) - .filter(([t, i]) => { - "font-family" === t && e[yr].usedTypefaces.add(i); - return _n.has(t); - }) - .map((e) => e.join(":")) - .join(";") - : ""; - })(this); + [$clean](builder) { + super[$clean](builder); + this.style = checkStyle(this); } - [Ws]() { - return !ig.has(this[Yr]); + [$acceptWhitespace]() { + return !NoWhites.has(this[$nodeName]); } - [qr](e, t = !1) { - if (t) this[zn] = !0; - else { - e = e.replaceAll(eg, ""); - this.style.includes("xfa-spacerun:yes") || (e = e.replaceAll(Ag, " ")); + [$onText](str, richText = false) { + if (!richText) { + str = str.replaceAll(crlfRegExp, ""); + if (!this.style.includes("xfa-spacerun:yes")) { + str = str.replaceAll(spacesRegExp, " "); + } + } else { + this[$richText] = true; + } + if (str) { + this[$content] += str; } - e && (this[er] += e); } - [Or](e, t = !0) { - const i = Object.create(null), - a = { top: NaN, bottom: NaN, left: NaN, right: NaN }; - let s = null; - for (const [e, t] of this.style.split(";").map((e) => e.split(":", 2))) - switch (e) { + [$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": - i.typeface = stripQuotes(t); + xfaFont.typeface = stripQuotes(value); break; case "font-size": - i.size = getMeasurement(t); + xfaFont.size = getMeasurement(value); break; case "font-weight": - i.weight = t; + xfaFont.weight = value; break; case "font-style": - i.posture = t; + xfaFont.posture = value; break; case "letter-spacing": - i.letterSpacing = getMeasurement(t); + xfaFont.letterSpacing = getMeasurement(value); break; case "margin": - const e = t.split(/ \t/).map((e) => getMeasurement(e)); - switch (e.length) { + const values = value.split(/ \t/).map((x) => getMeasurement(x)); + switch (values.length) { case 1: - a.top = a.bottom = a.left = a.right = e[0]; + margin.top = + margin.bottom = + margin.left = + margin.right = + values[0]; break; case 2: - a.top = a.bottom = e[0]; - a.left = a.right = e[1]; + margin.top = margin.bottom = values[0]; + margin.left = margin.right = values[1]; break; case 3: - a.top = e[0]; - a.bottom = e[2]; - a.left = a.right = e[1]; + margin.top = values[0]; + margin.bottom = values[2]; + margin.left = margin.right = values[1]; break; case 4: - a.top = e[0]; - a.left = e[1]; - a.bottom = e[2]; - a.right = e[3]; + margin.top = values[0]; + margin.left = values[1]; + margin.bottom = values[2]; + margin.right = values[3]; + break; } break; case "margin-top": - a.top = getMeasurement(t); + margin.top = getMeasurement(value); break; case "margin-bottom": - a.bottom = getMeasurement(t); + margin.bottom = getMeasurement(value); break; case "margin-left": - a.left = getMeasurement(t); + margin.left = getMeasurement(value); break; case "margin-right": - a.right = getMeasurement(t); + margin.right = getMeasurement(value); break; case "line-height": - s = getMeasurement(t); + lineHeight = getMeasurement(value); + break; } - e.pushData(i, a, s); - if (this[er]) e.addString(this[er]); - else - for (const t of this[Er]()) - "#text" !== t[Yr] ? t[Or](e) : e.addString(t[er]); - t && e.popFont(); + } + measure.pushData(xfaFont, margin, lineHeight); + if (this[$content]) { + measure.addString(this[$content]); + } else { + for (const child of this[$getChildren]()) { + if (child[$nodeName] === "#text") { + measure.addString(child[$content]); + continue; + } + child[$pushGlyphs](measure); + } + } + if (mustPop) { + measure.popFont(); + } } - [an](e) { - const t = []; - this[ar] = { children: t }; - this[Zs]({}); - if (0 === t.length && !this[er]) return HTMLResult.EMPTY; - let i; - i = this[zn] - ? this[er] - ? this[er].replaceAll(tg, "\n") - : void 0 - : this[er] || void 0; + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children, + }; + this[$childrenToHTML]({}); + if (children.length === 0 && !this[$content]) { + return HTMLResult.EMPTY; + } + let value; + if (this[$richText]) { + value = this[$content] + ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") + : undefined; + } else { + value = this[$content] || undefined; + } return HTMLResult.success({ - name: this[Yr], + name: this[$nodeName], attributes: { href: this.href, - style: mapStyle(this.style, this, this[zn]), + style: mapStyle(this.style, this, this[$richText]), }, - children: t, - value: i, + children, + value, }); } } class A extends XhtmlObject { - constructor(e) { - super(e, "a"); - this.href = fixURL(e.href) || ""; + constructor(attributes) { + super(attributes, "a"); + this.href = fixURL(attributes.href) || ""; } } class B extends XhtmlObject { - constructor(e) { - super(e, "b"); + constructor(attributes) { + super(attributes, "b"); } - [Or](e) { - e.pushFont({ weight: "bold" }); - super[Or](e); - e.popFont(); + [$pushGlyphs](measure) { + measure.pushFont({ + weight: "bold", + }); + super[$pushGlyphs](measure); + measure.popFont(); } } class Body extends XhtmlObject { - constructor(e) { - super(e, "body"); + constructor(attributes) { + super(attributes, "body"); } - [an](e) { - const t = super[an](e), - { html: i } = t; - if (!i) return HTMLResult.EMPTY; - i.name = "div"; - i.attributes.class = ["xfaRich"]; - return t; + [$toHTML](availableSpace) { + const res = super[$toHTML](availableSpace); + const { html } = res; + if (!html) { + return HTMLResult.EMPTY; + } + html.name = "div"; + html.attributes.class = ["xfaRich"]; + return res; } } class Br extends XhtmlObject { - constructor(e) { - super(e, "br"); + constructor(attributes) { + super(attributes, "br"); } - [en]() { + [$text]() { return "\n"; } - [Or](e) { - e.addString("\n"); + [$pushGlyphs](measure) { + measure.addString("\n"); } - [an](e) { - return HTMLResult.success({ name: "br" }); + [$toHTML](availableSpace) { + return HTMLResult.success({ + name: "br", + }); } } class Html extends XhtmlObject { - constructor(e) { - super(e, "html"); + constructor(attributes) { + super(attributes, "html"); } - [an](e) { - const t = []; - this[ar] = { children: t }; - this[Zs]({}); - if (0 === t.length) + [$toHTML](availableSpace) { + const children = []; + this[$extra] = { + children, + }; + this[$childrenToHTML]({}); + if (children.length === 0) { return HTMLResult.success({ name: "div", - attributes: { class: ["xfaRich"], style: {} }, - value: this[er] || "", + attributes: { + class: ["xfaRich"], + style: {}, + }, + value: this[$content] || "", }); - if (1 === t.length) { - const e = t[0]; - if (e.attributes?.class.includes("xfaRich")) return HTMLResult.success(e); + } + if (children.length === 1) { + const child = children[0]; + if (child.attributes?.class.includes("xfaRich")) { + return HTMLResult.success(child); + } } return HTMLResult.success({ name: "div", - attributes: { class: ["xfaRich"], style: {} }, - children: t, + attributes: { + class: ["xfaRich"], + style: {}, + }, + children, }); } } class I extends XhtmlObject { - constructor(e) { - super(e, "i"); + constructor(attributes) { + super(attributes, "i"); } - [Or](e) { - e.pushFont({ posture: "italic" }); - super[Or](e); - e.popFont(); + [$pushGlyphs](measure) { + measure.pushFont({ + posture: "italic", + }); + super[$pushGlyphs](measure); + measure.popFont(); } } class Li extends XhtmlObject { - constructor(e) { - super(e, "li"); + constructor(attributes) { + super(attributes, "li"); } } class Ol extends XhtmlObject { - constructor(e) { - super(e, "ol"); + constructor(attributes) { + super(attributes, "ol"); } } class P extends XhtmlObject { - constructor(e) { - super(e, "p"); + constructor(attributes) { + super(attributes, "p"); } - [Or](e) { - super[Or](e, !1); - e.addString("\n"); - e.addPara(); - e.popFont(); + [$pushGlyphs](measure) { + super[$pushGlyphs](measure, false); + measure.addString("\n"); + measure.addPara(); + measure.popFont(); } - [en]() { - return this[pr]()[Er]().at(-1) === this ? super[en]() : super[en]() + "\n"; + [$text]() { + const siblings = this[$getParent]()[$getChildren](); + if (siblings.at(-1) === this) { + return super[$text](); + } + return super[$text]() + "\n"; } } class Span extends XhtmlObject { - constructor(e) { - super(e, "span"); + constructor(attributes) { + super(attributes, "span"); } } class Sub extends XhtmlObject { - constructor(e) { - super(e, "sub"); + constructor(attributes) { + super(attributes, "sub"); } } class Sup extends XhtmlObject { - constructor(e) { - super(e, "sup"); + constructor(attributes) { + super(attributes, "sup"); } } class Ul extends XhtmlObject { - constructor(e) { - super(e, "ul"); + constructor(attributes) { + super(attributes, "ul"); } } class XhtmlNamespace { - static [gn](e, t) { - if (XhtmlNamespace.hasOwnProperty(e)) return XhtmlNamespace[e](t); + static [$buildXFAObject](name, attributes) { + if (XhtmlNamespace.hasOwnProperty(name)) { + return XhtmlNamespace[name](attributes); + } + return undefined; } - static a(e) { - return new A(e); + static a(attributes) { + return new A(attributes); } - static b(e) { - return new B(e); + static b(attributes) { + return new B(attributes); } - static body(e) { - return new Body(e); + static body(attributes) { + return new Body(attributes); } - static br(e) { - return new Br(e); + static br(attributes) { + return new Br(attributes); } - static html(e) { - return new Html(e); + static html(attributes) { + return new Html(attributes); } - static i(e) { - return new I(e); + static i(attributes) { + return new I(attributes); } - static li(e) { - return new Li(e); + static li(attributes) { + return new Li(attributes); } - static ol(e) { - return new Ol(e); + static ol(attributes) { + return new Ol(attributes); } - static p(e) { - return new P(e); + static p(attributes) { + return new P(attributes); } - static span(e) { - return new Span(e); + static span(attributes) { + return new Span(attributes); } - static sub(e) { - return new Sub(e); + static sub(attributes) { + return new Sub(attributes); } - static sup(e) { - return new Sup(e); + static sup(attributes) { + return new Sup(attributes); } - static ul(e) { - return new Ul(e); + static ul(attributes) { + return new Ul(attributes); } -} -const ag = { +} // ./src/core/xfa/setup.js + +const NamespaceSetUp = { config: ConfigNamespace, connection: ConnectionSetNamespace, datasets: DatasetsNamespace, @@ -50886,31 +61178,33 @@ const ag = { template: TemplateNamespace, xdp: XdpNamespace, xhtml: XhtmlNamespace, -}; +}; // ./src/core/xfa/unknown.js + class UnknownNamespace { - constructor(e) { - this.namespaceId = e; + constructor(nsId) { + this.namespaceId = nsId; } - [gn](e, t) { - return new XmlObject(this.namespaceId, e, t); + [$buildXFAObject](name, attributes) { + return new XmlObject(this.namespaceId, name, attributes); } -} +} // ./src/core/xfa/builder.js + class Root extends XFAObject { - constructor(e) { + constructor(ids) { super(-1, "root", Object.create(null)); this.element = null; - this[Dr] = e; + this[$ids] = ids; } - [Kr](e) { - this.element = e; - return !0; + [$onChild](child) { + this.element = child; + return true; } - [sr]() { - super[sr](); + [$finalize]() { + super[$finalize](); if (this.element.template instanceof Template) { - this[Dr].set(Xr, this.element); - this.element.template[Zr](this[Dr]); - this.element.template[Dr] = this[Dr]; + this[$ids].set($root, this.element); + this.element.template[$resolvePrototypes](this[$ids]); + this.element.template[$ids] = this[$ids]; } } } @@ -50918,199 +61212,266 @@ class Empty extends XFAObject { constructor() { super(-1, "", Object.create(null)); } - [Kr](e) { - return !1; + [$onChild](_) { + return false; } } class Builder { - constructor(e = null) { + constructor(rootNameSpace = null) { this._namespaceStack = []; this._nsAgnosticLevel = 0; this._namespacePrefixes = new Map(); this._namespaces = new Map(); - this._nextNsId = Math.max(...Object.values(on).map(({ id: e }) => e)); - this._currentNamespace = e || new UnknownNamespace(++this._nextNsId); + this._nextNsId = Math.max( + ...Object.values(NamespaceIds).map(({ id }) => id), + ); + this._currentNamespace = + rootNameSpace || new UnknownNamespace(++this._nextNsId); } - buildRoot(e) { - return new Root(e); + buildRoot(ids) { + return new Root(ids); } - build({ nsPrefix: e, name: t, attributes: i, namespace: a, prefixes: s }) { - const r = null !== a; - if (r) { + build({ nsPrefix, name, attributes, namespace, prefixes }) { + const hasNamespaceDef = namespace !== null; + if (hasNamespaceDef) { this._namespaceStack.push(this._currentNamespace); - this._currentNamespace = this._searchNamespace(a); + this._currentNamespace = this._searchNamespace(namespace); } - s && this._addNamespacePrefix(s); - if (i.hasOwnProperty(vr)) { - const e = ag.datasets, - t = i[vr]; - let a = null; - for (const [i, s] of Object.entries(t)) { - if (this._getNamespaceToUse(i) === e) { - a = { xfa: s }; + if (prefixes) { + this._addNamespacePrefix(prefixes); + } + if (attributes.hasOwnProperty($nsAttributes)) { + const dataTemplate = NamespaceSetUp.datasets; + const nsAttrs = attributes[$nsAttributes]; + let xfaAttrs = null; + for (const [ns, attrs] of Object.entries(nsAttrs)) { + const nsToUse = this._getNamespaceToUse(ns); + if (nsToUse === dataTemplate) { + xfaAttrs = { + xfa: attrs, + }; break; } } - a ? (i[vr] = a) : delete i[vr]; + if (xfaAttrs) { + attributes[$nsAttributes] = xfaAttrs; + } else { + delete attributes[$nsAttributes]; + } } - const n = this._getNamespaceToUse(e), - g = n?.[gn](t, i) || new Empty(); - g[Gr]() && this._nsAgnosticLevel++; - (r || s || g[Gr]()) && - (g[_s] = { hasNamespace: r, prefixes: s, nsAgnostic: g[Gr]() }); - return g; + const namespaceToUse = this._getNamespaceToUse(nsPrefix); + const node = + namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty(); + if (node[$isNsAgnostic]()) { + this._nsAgnosticLevel++; + } + if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) { + node[$cleanup] = { + hasNamespace: hasNamespaceDef, + prefixes, + nsAgnostic: node[$isNsAgnostic](), + }; + } + return node; } isNsAgnostic() { return this._nsAgnosticLevel > 0; } - _searchNamespace(e) { - let t = this._namespaces.get(e); - if (t) return t; - for (const [i, { check: a }] of Object.entries(on)) - if (a(e)) { - t = ag[i]; - if (t) { - this._namespaces.set(e, t); - return t; + _searchNamespace(nsName) { + let ns = this._namespaces.get(nsName); + if (ns) { + return ns; + } + for (const [name, { check }] of Object.entries(NamespaceIds)) { + if (check(nsName)) { + ns = NamespaceSetUp[name]; + if (ns) { + this._namespaces.set(nsName, ns); + return ns; } break; } - t = new UnknownNamespace(++this._nextNsId); - this._namespaces.set(e, t); - return t; + } + ns = new UnknownNamespace(++this._nextNsId); + this._namespaces.set(nsName, ns); + return ns; } - _addNamespacePrefix(e) { - for (const { prefix: t, value: i } of e) { - const e = this._searchNamespace(i); - let a = this._namespacePrefixes.get(t); - if (!a) { - a = []; - this._namespacePrefixes.set(t, a); + _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); } - a.push(e); + prefixStack.push(namespace); } } - _getNamespaceToUse(e) { - if (!e) return this._currentNamespace; - const t = this._namespacePrefixes.get(e); - if (t?.length > 0) return t.at(-1); - warn(`Unknown namespace prefix: ${e}.`); + _getNamespaceToUse(prefix) { + if (!prefix) { + return this._currentNamespace; + } + const prefixStack = this._namespacePrefixes.get(prefix); + if (prefixStack?.length > 0) { + return prefixStack.at(-1); + } + warn(`Unknown namespace prefix: ${prefix}.`); return null; } - clean(e) { - const { hasNamespace: t, prefixes: i, nsAgnostic: a } = e; - t && (this._currentNamespace = this._namespaceStack.pop()); - i && - i.forEach(({ prefix: e }) => { - this._namespacePrefixes.get(e).pop(); + clean(data) { + const { hasNamespace, prefixes, nsAgnostic } = data; + if (hasNamespace) { + this._currentNamespace = this._namespaceStack.pop(); + } + if (prefixes) { + prefixes.forEach(({ prefix }) => { + this._namespacePrefixes.get(prefix).pop(); }); - a && this._nsAgnosticLevel--; + } + if (nsAgnostic) { + this._nsAgnosticLevel--; + } } -} +} // ./src/core/xfa/parser.js + class XFAParser extends XMLParserBase { - constructor(e = null, t = !1) { + constructor(rootNameSpace = null, richText = false) { super(); - this._builder = new Builder(e); + this._builder = new Builder(rootNameSpace); this._stack = []; - this._globalData = { usedTypefaces: new Set() }; + this._globalData = { + usedTypefaces: new Set(), + }; this._ids = new Map(); this._current = this._builder.buildRoot(this._ids); - this._errorCode = Rs; + this._errorCode = XMLParserErrorCode.NoError; this._whiteRegex = /^\s+$/; this._nbsps = /\xa0+/g; - this._richText = t; + this._richText = richText; } - parse(e) { - this.parseXml(e); - if (this._errorCode === Rs) { - this._current[sr](); - return this._current.element; + parse(data) { + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; } + this._current[$finalize](); + return this._current.element; } - onText(e) { - e = e.replace(this._nbsps, (e) => e.slice(1) + " "); - this._richText || this._current[Ws]() - ? this._current[qr](e, this._richText) - : this._whiteRegex.test(e) || this._current[qr](e.trim()); + onText(text) { + text = text.replace(this._nbsps, (match) => match.slice(1) + " "); + if (this._richText || this._current[$acceptWhitespace]()) { + this._current[$onText](text, this._richText); + return; + } + if (this._whiteRegex.test(text)) { + return; + } + this._current[$onText](text.trim()); } - onCdata(e) { - this._current[qr](e); + onCdata(text) { + this._current[$onText](text); } - _mkAttributes(e, t) { - let i = null, - a = null; - const s = Object.create({}); - for (const { name: r, value: n } of e) - if ("xmlns" === r) - i ? warn(`XFA - multiple namespace definition in <${t}>`) : (i = n); - else if (r.startsWith("xmlns:")) { - const e = r.substring(6); - a || (a = []); - a.push({ prefix: e, value: n }); + _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 { + 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 e = r.indexOf(":"); - if (-1 === e) s[r] = n; - else { - let t = s[vr]; - t || (t = s[vr] = Object.create(null)); - const [i, a] = [r.slice(0, e), r.slice(e + 1)]; - (t[i] ||= Object.create(null))[a] = n; + const i = name.indexOf(":"); + if (i === -1) { + attributeObj[name] = value; + } else { + let nsAttrs = attributeObj[$nsAttributes]; + if (!nsAttrs) { + nsAttrs = attributeObj[$nsAttributes] = Object.create(null); + } + const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; + const attrs = (nsAttrs[ns] ||= Object.create(null)); + attrs[attrName] = value; } } - return [i, a, s]; - } - _getNameAndPrefix(e, t) { - const i = e.indexOf(":"); - return -1 === i - ? [e, null] - : [e.substring(i + 1), t ? "" : e.substring(0, i)]; - } - onBeginElement(e, t, i) { - const [a, s, r] = this._mkAttributes(t, e), - [n, g] = this._getNameAndPrefix(e, this._builder.isNsAgnostic()), - o = this._builder.build({ - nsPrefix: g, - name: n, - attributes: r, - namespace: a, - prefixes: s, - }); - o[yr] = this._globalData; - if (i) { - o[sr](); - this._current[Kr](o) && o[zr](this._ids); - o[Vs](this._builder); - } else { - this._stack.push(this._current); - this._current = o; } + return [namespace, prefixes, attributeObj]; } - onEndElement(e) { - const t = this._current; - if (t[Sr]() && "string" == typeof t[er]) { - const e = new XFAParser(); - e._globalData = this._globalData; - const i = e.parse(t[er]); - t[er] = null; - t[Kr](i); + _getNameAndPrefix(name, nsAgnostic) { + const i = name.indexOf(":"); + if (i === -1) { + return [name, null]; } - t[sr](); + 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[$globalData] = this._globalData; + if (isEmpty) { + node[$finalize](); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); + return; + } + this._stack.push(this._current); + this._current = node; + } + onEndElement(name) { + const node = this._current; + if (node[$isCDATAXml]() && typeof node[$content] === "string") { + const parser = new XFAParser(); + parser._globalData = this._globalData; + const root = parser.parse(node[$content]); + node[$content] = null; + node[$onChild](root); + } + node[$finalize](); this._current = this._stack.pop(); - this._current[Kr](t) && t[zr](this._ids); - t[Vs](this._builder); + if (this._current[$onChild](node)) { + node[$setId](this._ids); + } + node[$clean](this._builder); } - onError(e) { - this._errorCode = e; + onError(code) { + this._errorCode = code; } -} +} // ./src/core/xfa/factory.js + class XFAFactory { - constructor(e) { + constructor(data) { try { - this.root = new XFAParser().parse(XFAFactory._createDocument(e)); - const t = new Binder(this.root); - this.form = t.bind(); - this.dataHandler = new DataHandler(this.root, t.getData()); - this.form[yr].template = this.form; + this.root = new XFAParser().parse(XFAFactory._createDocument(data)); + const binder = new Binder(this.root); + this.form = binder.bind(); + this.dataHandler = new DataHandler(this.root, binder.getData()); + this.form[$globalData].template = this.form; } catch (e) { warn(`XFA - an error occurred during parsing and binding: ${e}`); } @@ -51119,14 +61480,18 @@ class XFAFactory { return this.root && this.form; } _createPagesHelper() { - const e = this.form[tn](); - return new Promise((t, i) => { + const iterator = this.form[$toPages](); + return new Promise((resolve, reject) => { const nextIteration = () => { try { - const i = e.next(); - i.done ? t(i.value) : setTimeout(nextIteration, 0); + const value = iterator.next(); + if (value.done) { + resolve(value.value); + } else { + setTimeout(nextIteration, 0); + } } catch (e) { - i(e); + reject(e); } }; setTimeout(nextIteration, 0); @@ -51135,404 +61500,595 @@ class XFAFactory { async _createPages() { try { this.pages = await this._createPagesHelper(); - this.dims = this.pages.children.map((e) => { - const { width: t, height: i } = e.attributes.style; - return [0, 0, parseInt(t), parseInt(i)]; + this.dims = this.pages.children.map((c) => { + const { width, height } = c.attributes.style; + return [0, 0, parseInt(width), parseInt(height)]; }); } catch (e) { warn(`XFA - an error occurred during layout: ${e}`); } } - getBoundingBox(e) { - return this.dims[e]; + getBoundingBox(pageIndex) { + return this.dims[pageIndex]; } async getNumPages() { - this.pages || (await this._createPages()); + if (!this.pages) { + await this._createPages(); + } return this.dims.length; } - setImages(e) { - this.form[yr].images = e; + setImages(images) { + this.form[$globalData].images = images; } - setFonts(e) { - this.form[yr].fontFinder = new FontFinder(e); - const t = []; - for (let e of this.form[yr].usedTypefaces) { - e = stripQuotes(e); - this.form[yr].fontFinder.find(e) || t.push(e); + setFonts(fonts) { + this.form[$globalData].fontFinder = new FontFinder(fonts); + const missingFonts = []; + for (let typeface of this.form[$globalData].usedTypefaces) { + typeface = stripQuotes(typeface); + const font = this.form[$globalData].fontFinder.find(typeface); + if (!font) { + missingFonts.push(typeface); + } } - return t.length > 0 ? t : null; + if (missingFonts.length > 0) { + return missingFonts; + } + return null; } - appendFonts(e, t) { - this.form[yr].fontFinder.add(e, t); + appendFonts(fonts, reallyMissingFonts) { + this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); } async getPages() { - this.pages || (await this._createPages()); - const e = this.pages; + if (!this.pages) { + await this._createPages(); + } + const pages = this.pages; this.pages = null; - return e; + return pages; } - serializeData(e) { - return this.dataHandler.serialize(e); + serializeData(storage) { + return this.dataHandler.serialize(storage); } - static _createDocument(e) { - return e["/xdp:xdp"] ? Object.values(e).join("") : e["xdp:xdp"]; + static _createDocument(data) { + if (!data["/xdp:xdp"]) { + return data["xdp:xdp"]; + } + return Object.values(data).join(""); } - static getRichTextAsHtml(e) { - if (!e || "string" != typeof e) return null; + static getRichTextAsHtml(rc) { + if (!rc || typeof rc !== "string") { + return null; + } try { - let t = new XFAParser(XhtmlNamespace, !0).parse(e); - if (!["body", "xhtml"].includes(t[Yr])) { - const e = XhtmlNamespace.body({}); - e[Xs](t); - t = e; + let root = new XFAParser(XhtmlNamespace, true).parse(rc); + if (!["body", "xhtml"].includes(root[$nodeName])) { + const newRoot = XhtmlNamespace.body({}); + newRoot[$appendChild](root); + root = newRoot; } - const i = t[an](); - if (!i.success) return null; - const { html: a } = i, - { attributes: s } = a; - if (s) { - s.class && (s.class = s.class.filter((e) => !e.startsWith("xfa"))); - s.dir = "auto"; + const result = root[$toHTML](); + if (!result.success) { + return null; } - return { html: a, str: t[en]() }; + const { html } = result; + const { attributes } = html; + if (attributes) { + if (attributes.class) { + attributes.class = attributes.class.filter( + (attr) => !attr.startsWith("xfa"), + ); + } + attributes.dir = "auto"; + } + return { + html, + str: root[$text](), + }; } catch (e) { warn(`XFA - an error occurred during parsing of rich text: ${e}`); } return null; } -} +} // ./src/core/annotation.js + class AnnotationFactory { - static createGlobals(e) { + static createGlobals(pdfManager) { return Promise.all([ - e.ensureCatalog("acroForm"), - e.ensureDoc("xfaDatasets"), - e.ensureCatalog("structTreeRoot"), - e.ensureCatalog("baseUrl"), - e.ensureCatalog("attachments"), + pdfManager.ensureCatalog("acroForm"), + pdfManager.ensureDoc("xfaDatasets"), + pdfManager.ensureCatalog("structTreeRoot"), + pdfManager.ensureCatalog("baseUrl"), + pdfManager.ensureCatalog("attachments"), ]).then( - ([t, i, a, s, r]) => ({ - pdfManager: e, - acroForm: t instanceof Dict ? t : Dict.empty, - xfaDatasets: i, - structTreeRoot: a, - baseUrl: s, - attachments: r, - }), - (e) => { - warn(`createGlobals: "${e}".`); + ([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => { + return { + pdfManager, + acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, + xfaDatasets, + structTreeRoot, + baseUrl, + attachments, + }; + }, + (reason) => { + warn(`createGlobals: "${reason}".`); return null; }, ); } - static async create(e, t, i, a, s, r) { - const n = s ? await this._getPageIndex(e, t, i.pdfManager) : null; - return i.pdfManager.ensure(this, "_create", [e, t, i, a, s, n, r]); + static async create( + xref, + ref, + annotationGlobals, + idFactory, + collectFields, + orphanFields, + pageRef, + ) { + const pageIndex = collectFields + ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) + : null; + return annotationGlobals.pdfManager.ensure(this, "_create", [ + xref, + ref, + annotationGlobals, + idFactory, + collectFields, + orphanFields, + pageIndex, + pageRef, + ]); } - static _create(e, t, i, a, s = !1, r = null, n = null) { - const g = e.fetchIfRef(t); - if (!(g instanceof Dict)) return; - const { acroForm: o, pdfManager: c } = i, - C = t instanceof Ref ? t.toString() : `annot_${a.createObjId()}`; - let h = g.get("Subtype"); - h = h instanceof Name ? h.name : null; - const l = { - xref: e, - ref: t, - dict: g, - subtype: h, - id: C, - annotationGlobals: i, - collectFields: s, - needAppearances: !s && !0 === o.get("NeedAppearances"), - pageIndex: r, - evaluatorOptions: c.evaluatorOptions, - pageRef: n, + static _create( + xref, + ref, + annotationGlobals, + idFactory, + collectFields = false, + orphanFields = null, + pageIndex = null, + pageRef = null, + ) { + const dict = xref.fetchIfRef(ref); + if (!(dict instanceof Dict)) { + return undefined; + } + const { acroForm, pdfManager } = annotationGlobals; + const id = + ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; + let subtype = dict.get("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + const parameters = { + xref, + ref, + dict, + subtype, + id, + annotationGlobals, + collectFields, + orphanFields, + needAppearances: + !collectFields && acroForm.get("NeedAppearances") === true, + pageIndex, + evaluatorOptions: pdfManager.evaluatorOptions, + pageRef, }; - switch (h) { + switch (subtype) { case "Link": - return new LinkAnnotation(l); + return new LinkAnnotation(parameters); case "Text": - return new TextAnnotation(l); + return new TextAnnotation(parameters); case "Widget": - let e = getInheritableProperty({ dict: g, key: "FT" }); - e = e instanceof Name ? e.name : null; - switch (e) { + let fieldType = getInheritableProperty({ + dict, + key: "FT", + }); + fieldType = fieldType instanceof Name ? fieldType.name : null; + switch (fieldType) { case "Tx": - return new TextWidgetAnnotation(l); + return new TextWidgetAnnotation(parameters); case "Btn": - return new ButtonWidgetAnnotation(l); + return new ButtonWidgetAnnotation(parameters); case "Ch": - return new ChoiceWidgetAnnotation(l); + return new ChoiceWidgetAnnotation(parameters); case "Sig": - return new SignatureWidgetAnnotation(l); + return new SignatureWidgetAnnotation(parameters); } warn( - `Unimplemented widget field type "${e}", falling back to base field type.`, + `Unimplemented widget field type "${fieldType}", ` + + "falling back to base field type.", ); - return new WidgetAnnotation(l); + return new WidgetAnnotation(parameters); case "Popup": - return new PopupAnnotation(l); + return new PopupAnnotation(parameters); case "FreeText": - return new FreeTextAnnotation(l); + return new FreeTextAnnotation(parameters); case "Line": - return new LineAnnotation(l); + return new LineAnnotation(parameters); case "Square": - return new SquareAnnotation(l); + return new SquareAnnotation(parameters); case "Circle": - return new CircleAnnotation(l); + return new CircleAnnotation(parameters); case "PolyLine": - return new PolylineAnnotation(l); + return new PolylineAnnotation(parameters); case "Polygon": - return new PolygonAnnotation(l); + return new PolygonAnnotation(parameters); case "Caret": - return new CaretAnnotation(l); + return new CaretAnnotation(parameters); case "Ink": - return new InkAnnotation(l); + return new InkAnnotation(parameters); case "Highlight": - return new HighlightAnnotation(l); + return new HighlightAnnotation(parameters); case "Underline": - return new UnderlineAnnotation(l); + return new UnderlineAnnotation(parameters); case "Squiggly": - return new SquigglyAnnotation(l); + return new SquigglyAnnotation(parameters); case "StrikeOut": - return new StrikeOutAnnotation(l); + return new StrikeOutAnnotation(parameters); case "Stamp": - return new StampAnnotation(l); + return new StampAnnotation(parameters); case "FileAttachment": - return new FileAttachmentAnnotation(l); + return new FileAttachmentAnnotation(parameters); default: - s || - warn( - h - ? `Unimplemented annotation type "${h}", falling back to base annotation.` - : "Annotation is missing the required /Subtype.", - ); - return new Annotation(l); + if (!collectFields) { + if (!subtype) { + warn("Annotation is missing the required /Subtype."); + } else { + warn( + `Unimplemented annotation type "${subtype}", ` + + "falling back to base annotation.", + ); + } + } + return new Annotation(parameters); } } - static async _getPageIndex(e, t, i) { + static async _getPageIndex(xref, ref, pdfManager) { try { - const a = await e.fetchIfRefAsync(t); - if (!(a instanceof Dict)) return -1; - const s = a.getRaw("P"); - if (s instanceof Ref) - try { - return await i.ensureCatalog("getPageIndex", [s]); - } catch (e) { - info(`_getPageIndex -- not a valid page reference: "${e}".`); - } - if (a.has("Kids")) return -1; - const r = await i.ensureDoc("numPages"); - for (let e = 0; e < r; e++) { - const a = await i.getPage(e), - s = await i.ensure(a, "annotations"); - for (const i of s) if (i instanceof Ref && isRefsEqual(i, t)) return e; + const annotDict = await xref.fetchIfRefAsync(ref); + if (!(annotDict instanceof Dict)) { + return -1; } - } catch (e) { - warn(`_getPageIndex: "${e}".`); + const pageRef = annotDict.getRaw("P"); + if (pageRef instanceof Ref) { + try { + const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [ + pageRef, + ]); + return pageIndex; + } catch (ex) { + info(`_getPageIndex -- not a valid page reference: "${ex}".`); + } + } + if (annotDict.has("Kids")) { + return -1; + } + const numPages = await pdfManager.ensureDoc("numPages"); + for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { + const page = await pdfManager.getPage(pageIndex); + const annotations = await pdfManager.ensure(page, "annotations"); + for (const annotRef of annotations) { + if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) { + return pageIndex; + } + } + } + } catch (ex) { + warn(`_getPageIndex: "${ex}".`); } return -1; } - static generateImages(e, t, i) { - if (!i) { + static generateImages(annotations, xref, isOffscreenCanvasSupported) { + if (!isOffscreenCanvasSupported) { warn( "generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images.", ); return null; } - let a; - for (const { bitmapId: i, bitmap: s } of e) - if (s) { - a ||= new Map(); - a.set(i, StampAnnotation.createImage(s, t)); + let imagePromises; + for (const { bitmapId, bitmap } of annotations) { + if (!bitmap) { + continue; } - return a; + imagePromises ||= new Map(); + imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); + } + return imagePromises; } - static async saveNewAnnotations(e, t, i, a) { - const s = e.xref; - let r; - const n = [], - g = [], - { isOffscreenCanvasSupported: o } = e.options; - for (const c of i) - if (!c.deleted) - switch (c.annotationType) { - case u: - if (!r) { - const e = new Dict(s); - e.set("BaseFont", Name.get("Helvetica")); - e.set("Type", Name.get("Font")); - e.set("Subtype", Name.get("Type1")); - e.set("Encoding", Name.get("WinAnsiEncoding")); - const t = []; - r = s.getNewTemporaryRef(); - await writeObject(r, e, t, s); - n.push({ ref: r, data: t.join("") }); - } - g.push( - FreeTextAnnotation.createNewAnnotation(s, c, n, { - evaluator: e, - task: t, - baseFontRef: r, - }), + static async saveNewAnnotations(evaluator, task, annotations, imagePromises) { + const xref = evaluator.xref; + let baseFontRef; + const dependencies = []; + const promises = []; + const { isOffscreenCanvasSupported } = evaluator.options; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + if (!baseFontRef) { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + const buffer = []; + baseFontRef = xref.getNewTemporaryRef(); + await writeObject(baseFontRef, baseFont, buffer, xref); + dependencies.push({ + ref: baseFontRef, + data: buffer.join(""), + }); + } + promises.push( + FreeTextAnnotation.createNewAnnotation( + xref, + annotation, + dependencies, + { + evaluator, + task, + baseFontRef, + }, + ), + ); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push( + HighlightAnnotation.createNewAnnotation( + xref, + annotation, + dependencies, + ), ); - break; - case d: - c.quadPoints - ? g.push(HighlightAnnotation.createNewAnnotation(s, c, n)) - : g.push(InkAnnotation.createNewAnnotation(s, c, n)); - break; - case p: - g.push(InkAnnotation.createNewAnnotation(s, c, n)); - break; - case f: - if (!o) break; - const i = await a.get(c.bitmapId); - if (i.imageStream) { - const { imageStream: e, smaskStream: t } = i, - a = []; - if (t) { - const i = s.getNewTemporaryRef(); - await writeObject(i, t, a, s); - n.push({ ref: i, data: a.join("") }); - e.dict.set("SMask", i); - a.length = 0; - } - const r = (i.imageRef = s.getNewTemporaryRef()); - await writeObject(r, e, a, s); - n.push({ ref: r, data: a.join("") }); - i.imageStream = i.smaskStream = null; + } else { + promises.push( + InkAnnotation.createNewAnnotation(xref, annotation, dependencies), + ); + } + break; + case AnnotationEditorType.INK: + promises.push( + InkAnnotation.createNewAnnotation(xref, annotation, dependencies), + ); + break; + case AnnotationEditorType.STAMP: + const image = isOffscreenCanvasSupported + ? await imagePromises?.get(annotation.bitmapId) + : null; + if (image?.imageStream) { + const { imageStream, smaskStream } = image; + const buffer = []; + if (smaskStream) { + const smaskRef = xref.getNewTemporaryRef(); + await writeObject(smaskRef, smaskStream, buffer, xref); + dependencies.push({ + ref: smaskRef, + data: buffer.join(""), + }); + imageStream.dict.set("SMask", smaskRef); + buffer.length = 0; } - g.push(StampAnnotation.createNewAnnotation(s, c, n, { image: i })); - } - return { annotations: await Promise.all(g), dependencies: n }; + const imageRef = (image.imageRef = xref.getNewTemporaryRef()); + await writeObject(imageRef, imageStream, buffer, xref); + dependencies.push({ + ref: imageRef, + data: buffer.join(""), + }); + image.imageStream = image.smaskStream = null; + } + promises.push( + StampAnnotation.createNewAnnotation( + xref, + annotation, + dependencies, + { + image, + }, + ), + ); + break; + } + } + return { + annotations: await Promise.all(promises), + dependencies, + }; } - static async printNewAnnotations(e, t, i, a, s) { - if (!a) return null; - const { options: r, xref: n } = t, - g = []; - for (const o of a) - if (!o.deleted) - switch (o.annotationType) { - case u: - g.push( - FreeTextAnnotation.createNewPrintAnnotation(e, n, o, { - evaluator: t, - task: i, - evaluatorOptions: r, - }), + static async printNewAnnotations( + annotationGlobals, + evaluator, + task, + annotations, + imagePromises, + ) { + if (!annotations) { + return null; + } + const { options, xref } = evaluator; + const promises = []; + for (const annotation of annotations) { + if (annotation.deleted) { + continue; + } + switch (annotation.annotationType) { + case AnnotationEditorType.FREETEXT: + promises.push( + FreeTextAnnotation.createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + { + evaluator, + task, + evaluatorOptions: options, + }, + ), + ); + break; + case AnnotationEditorType.HIGHLIGHT: + if (annotation.quadPoints) { + promises.push( + HighlightAnnotation.createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + { + evaluatorOptions: options, + }, + ), ); - break; - case d: - o.quadPoints - ? g.push( - HighlightAnnotation.createNewPrintAnnotation(e, n, o, { - evaluatorOptions: r, - }), - ) - : g.push( - InkAnnotation.createNewPrintAnnotation(e, n, o, { - evaluatorOptions: r, - }), - ); - break; - case p: - g.push( - InkAnnotation.createNewPrintAnnotation(e, n, o, { - evaluatorOptions: r, - }), + } else { + promises.push( + InkAnnotation.createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + { + evaluatorOptions: options, + }, + ), ); - break; - case f: - if (!r.isOffscreenCanvasSupported) break; - const a = await s.get(o.bitmapId); - if (a.imageStream) { - const { imageStream: e, smaskStream: t } = a; - t && e.dict.set("SMask", t); - a.imageRef = new JpegStream(e, e.length); - a.imageStream = a.smaskStream = null; + } + break; + case AnnotationEditorType.INK: + promises.push( + InkAnnotation.createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + { + evaluatorOptions: options, + }, + ), + ); + break; + case AnnotationEditorType.STAMP: + const image = options.isOffscreenCanvasSupported + ? await imagePromises?.get(annotation.bitmapId) + : null; + if (image?.imageStream) { + const { imageStream, smaskStream } = image; + if (smaskStream) { + imageStream.dict.set("SMask", smaskStream); } - g.push( - StampAnnotation.createNewPrintAnnotation(e, n, o, { - image: a, - evaluatorOptions: r, - }), - ); - } - return Promise.all(g); + image.imageRef = new JpegStream(imageStream, imageStream.length); + image.imageStream = image.smaskStream = null; + } + promises.push( + StampAnnotation.createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + { + image, + evaluatorOptions: options, + }, + ), + ); + break; + } + } + return Promise.all(promises); } } -function getRgbColor(e, t = new Uint8ClampedArray(3)) { - if (!Array.isArray(e)) return t; - const i = t || new Uint8ClampedArray(3); - switch (e.length) { +function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) { + if (!Array.isArray(color)) { + return defaultColor; + } + const rgbColor = defaultColor || new Uint8ClampedArray(3); + switch (color.length) { case 0: return null; case 1: - ColorSpace.singletons.gray.getRgbItem(e, 0, i, 0); - return i; + ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; case 3: - ColorSpace.singletons.rgb.getRgbItem(e, 0, i, 0); - return i; + ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; case 4: - ColorSpace.singletons.cmyk.getRgbItem(e, 0, i, 0); - return i; + ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + return rgbColor; default: - return t; + return defaultColor; } } -function getPdfColorArray(e) { - return Array.from(e, (e) => e / 255); +function getPdfColorArray(color) { + return Array.from(color, (c) => c / 255); } -function getQuadPoints(e, t) { - const i = e.getArray("QuadPoints"); - if (!isNumberArray(i, null) || 0 === i.length || i.length % 8 > 0) +function getQuadPoints(dict, rect) { + const quadPoints = dict.getArray("QuadPoints"); + if ( + !isNumberArray(quadPoints, null) || + quadPoints.length === 0 || + quadPoints.length % 8 > 0 + ) { return null; - const a = new Float32Array(i.length); - for (let e = 0, s = i.length; e < s; e += 8) { - const [s, r, n, g, o, c, C, h] = i.slice(e, e + 8), - l = Math.min(s, n, o, C), - Q = Math.max(s, n, o, C), - E = Math.min(r, g, c, h), - u = Math.max(r, g, c, h); - if (null !== t && (l < t[0] || Q > t[2] || E < t[1] || u > t[3])) - return null; - a.set([l, u, Q, u, l, E, Q, E], e); } - return a; + const newQuadPoints = new Float32Array(quadPoints.length); + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); + const minX = Math.min(x1, x2, x3, x4); + const maxX = Math.max(x1, x2, x3, x4); + const minY = Math.min(y1, y2, y3, y4); + const maxY = Math.max(y1, y2, y3, y4); + if ( + rect !== null && + (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3]) + ) { + return null; + } + newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); + } + return newQuadPoints; } -function getTransformMatrix(e, t, i) { - const [a, s, r, n] = Util.getAxialAlignedBoundingBox(t, i); - if (a === r || s === n) return [1, 0, 0, 1, e[0], e[1]]; - const g = (e[2] - e[0]) / (r - a), - o = (e[3] - e[1]) / (n - s); - return [g, 0, 0, o, e[0] - a * g, e[1] - s * o]; +function getTransformMatrix(rect, bbox, matrix) { + const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox( + bbox, + matrix, + ); + if (minX === maxX || minY === maxY) { + return [1, 0, 0, 1, rect[0], rect[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, + ]; } class Annotation { - constructor(e) { - const { dict: t, xref: i, annotationGlobals: a } = e; - this.setTitle(t.get("T")); - this.setContents(t.get("Contents")); - this.setModificationDate(t.get("M")); - this.setFlags(t.get("F")); - this.setRectangle(t.getArray("Rect")); - this.setColor(t.getArray("C")); - this.setBorderStyle(t); - this.setAppearance(t); - this.setOptionalContent(t); - const s = t.get("MK"); - this.setBorderAndBackgroundColors(s); - this.setRotation(s, t); - this.ref = e.ref instanceof Ref ? e.ref : null; - this._streams = []; - this.appearance && this._streams.push(this.appearance); - const r = !!(this.flags & AA), - n = !!(this.flags & eA); - if (a.structTreeRoot) { - let i = t.get("StructParent"); - i = Number.isInteger(i) && i >= 0 ? i : -1; - a.structTreeRoot.addAnnotationIdToPage(e.pageRef, i); + constructor(params) { + const { dict, xref, annotationGlobals, ref, orphanFields } = params; + const parentRef = orphanFields?.get(ref); + if (parentRef) { + dict.set("Parent", parentRef); } + this.setTitle(dict.get("T")); + 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.setOptionalContent(dict); + const MK = dict.get("MK"); + this.setBorderAndBackgroundColors(MK); + this.setRotation(MK, dict); + this.ref = params.ref instanceof Ref ? params.ref : null; + this._streams = []; + if (this.appearance) { + this._streams.push(this.appearance); + } + const isLocked = !!(this.flags & AnnotationFlag.LOCKED); + const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); this.data = { annotationFlags: this.flags, borderStyle: this.borderStyle, @@ -51542,104 +62098,182 @@ class Annotation { rotation: this.rotation, contentsObj: this._contents, hasAppearance: !!this.appearance, - id: e.id, + id: params.id, modificationDate: this.modificationDate, rect: this.rectangle, - subtype: e.subtype, - hasOwnCanvas: !1, - noRotate: !!(this.flags & _), - noHTML: r && n, + subtype: params.subtype, + hasOwnCanvas: false, + noRotate: !!(this.flags & AnnotationFlag.NOROTATE), + noHTML: isLocked && isContentLocked, + isEditable: false, + structParent: -1, }; - if (e.collectFields) { - const a = t.get("Kids"); - if (Array.isArray(a)) { - const e = []; - for (const t of a) t instanceof Ref && e.push(t.toString()); - 0 !== e.length && (this.data.kidIds = e); + if (annotationGlobals.structTreeRoot) { + let structParent = dict.get("StructParent"); + this.data.structParent = structParent = + Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; + annotationGlobals.structTreeRoot.addAnnotationIdToPage( + params.pageRef, + structParent, + ); + } + if (params.collectFields) { + const kids = dict.get("Kids"); + if (Array.isArray(kids)) { + const kidIds = []; + for (const kid of kids) { + if (kid instanceof Ref) { + kidIds.push(kid.toString()); + } + } + if (kidIds.length !== 0) { + this.data.kidIds = kidIds; + } } - this.data.actions = collectActions(i, t, uA); - this.data.fieldName = this._constructFieldName(t); - this.data.pageIndex = e.pageIndex; + this.data.actions = collectActions(xref, dict, AnnotationActionEventType); + this.data.fieldName = this._constructFieldName(dict); + this.data.pageIndex = params.pageIndex; + } + const it = dict.get("IT"); + if (it instanceof Name) { + this.data.it = it.name; } this._isOffscreenCanvasSupported = - e.evaluatorOptions.isOffscreenCanvasSupported; + params.evaluatorOptions.isOffscreenCanvasSupported; this._fallbackFontDict = null; - this._needAppearances = !1; + this._needAppearances = false; } - _hasFlag(e, t) { - return !!(e & t); + _hasFlag(flags, flag) { + return !!(flags & flag); } - _isViewable(e) { - return !this._hasFlag(e, Z) && !this._hasFlag(e, $); + _buildFlags(noView, noPrint) { + let { flags } = this; + if (noView === undefined) { + if (noPrint === undefined) { + return undefined; + } + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return (flags & ~AnnotationFlag.HIDDEN) | AnnotationFlag.PRINT; + } + if (noView) { + flags |= AnnotationFlag.PRINT; + if (noPrint) { + return (flags & ~AnnotationFlag.NOVIEW) | AnnotationFlag.HIDDEN; + } + return (flags & ~AnnotationFlag.HIDDEN) | AnnotationFlag.NOVIEW; + } + flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags | AnnotationFlag.PRINT; } - _isPrintable(e) { - return this._hasFlag(e, z) && !this._hasFlag(e, V) && !this._hasFlag(e, Z); + _isViewable(flags) { + return ( + !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && + !this._hasFlag(flags, AnnotationFlag.NOVIEW) + ); } - mustBeViewed(e, t) { - const i = e?.get(this.data.id)?.noView; - return void 0 !== i ? !i : this.viewable && !this._hasFlag(this.flags, V); + _isPrintable(flags) { + return ( + this._hasFlag(flags, AnnotationFlag.PRINT) && + !this._hasFlag(flags, AnnotationFlag.HIDDEN) && + !this._hasFlag(flags, AnnotationFlag.INVISIBLE) + ); } - mustBePrinted(e) { - const t = e?.get(this.data.id)?.noPrint; - return void 0 !== t ? !t : this.printable; + mustBeViewed(annotationStorage, _renderForms) { + const noView = annotationStorage?.get(this.data.id)?.noView; + if (noView !== undefined) { + return !noView; + } + return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); + } + mustBePrinted(annotationStorage) { + const noPrint = annotationStorage?.get(this.data.id)?.noPrint; + if (noPrint !== undefined) { + return !noPrint; + } + return this.printable; + } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); } get viewable() { - return ( - null !== this.data.quadPoints && - (0 === this.flags || this._isViewable(this.flags)) - ); + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return true; + } + return this._isViewable(this.flags); } get printable() { - return ( - null !== this.data.quadPoints && - 0 !== this.flags && - this._isPrintable(this.flags) - ); + if (this.data.quadPoints === null) { + return false; + } + if (this.flags === 0) { + return false; + } + return this._isPrintable(this.flags); } - _parseStringHelper(e) { - const t = "string" == typeof e ? stringToPDFString(e) : ""; - return { str: t, dir: t && "rtl" === bidi(t).dir ? "rtl" : "ltr" }; + _parseStringHelper(data) { + const str = typeof data === "string" ? stringToPDFString(data) : ""; + const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; + return { + str, + dir, + }; } - setDefaultAppearance(e) { - const { dict: t, annotationGlobals: i } = e, - a = - getInheritableProperty({ dict: t, key: "DA" }) || i.acroForm.get("DA"); - this._defaultAppearance = "string" == typeof a ? a : ""; + setDefaultAppearance(params) { + const { dict, annotationGlobals } = params; + const defaultAppearance = + getInheritableProperty({ + dict, + key: "DA", + }) || annotationGlobals.acroForm.get("DA"); + this._defaultAppearance = + typeof defaultAppearance === "string" ? defaultAppearance : ""; this.data.defaultAppearanceData = parseDefaultAppearance( this._defaultAppearance, ); } - setTitle(e) { - this._title = this._parseStringHelper(e); + setTitle(title) { + this._title = this._parseStringHelper(title); } - setContents(e) { - this._contents = this._parseStringHelper(e); + setContents(contents) { + this._contents = this._parseStringHelper(contents); } - setModificationDate(e) { - this.modificationDate = "string" == typeof e ? e : null; + setModificationDate(modificationDate) { + this.modificationDate = + typeof modificationDate === "string" ? modificationDate : null; } - setFlags(e) { - this.flags = Number.isInteger(e) && e > 0 ? e : 0; - this.flags & Z && - "Annotation" !== this.constructor.name && - (this.flags ^= Z); + setFlags(flags) { + this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; + if ( + this.flags & AnnotationFlag.INVISIBLE && + this.constructor.name !== "Annotation" + ) { + this.flags ^= AnnotationFlag.INVISIBLE; + } } - hasFlag(e) { - return this._hasFlag(this.flags, e); + hasFlag(flag) { + return this._hasFlag(this.flags, flag); } - setRectangle(e) { - this.rectangle = lookupNormalRect(e, [0, 0, 0, 0]); + setRectangle(rectangle) { + this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); } - setColor(e) { - this.color = getRgbColor(e); + setColor(color) { + this.color = getRgbColor(color); } - setLineEndings(e) { + setLineEndings(lineEndings) { this.lineEndings = ["None", "None"]; - if (Array.isArray(e) && 2 === e.length) - for (let t = 0; t < 2; t++) { - const i = e[t]; - if (i instanceof Name) - switch (i.name) { + if (Array.isArray(lineEndings) && lineEndings.length === 2) { + for (let i = 0; i < 2; i++) { + const obj = lineEndings[i]; + if (obj instanceof Name) { + switch (obj.name) { case "None": continue; case "Square": @@ -51651,965 +62285,1477 @@ class Annotation { case "ROpenArrow": case "RClosedArrow": case "Slash": - this.lineEndings[t] = i.name; + this.lineEndings[i] = obj.name; continue; } - warn(`Ignoring invalid lineEnding: ${i}`); + } + warn(`Ignoring invalid lineEnding: ${obj}`); } - } - setRotation(e, t) { - this.rotation = 0; - let i = e instanceof Dict ? e.get("R") || 0 : t.get("Rotate") || 0; - if (Number.isInteger(i) && 0 !== i) { - i %= 360; - i < 0 && (i += 360); - i % 90 == 0 && (this.rotation = i); } } - setBorderAndBackgroundColors(e) { - if (e instanceof Dict) { - this.borderColor = getRgbColor(e.getArray("BC"), null); - this.backgroundColor = getRgbColor(e.getArray("BG"), null); - } else this.borderColor = this.backgroundColor = null; + setRotation(mk, dict) { + this.rotation = 0; + let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0; + if (Number.isInteger(angle) && angle !== 0) { + angle %= 360; + if (angle < 0) { + angle += 360; + } + if (angle % 90 === 0) { + this.rotation = angle; + } + } } - setBorderStyle(e) { + setBorderAndBackgroundColors(mk) { + if (mk instanceof Dict) { + this.borderColor = getRgbColor(mk.getArray("BC"), null); + this.backgroundColor = getRgbColor(mk.getArray("BG"), null); + } else { + this.borderColor = this.backgroundColor = null; + } + } + setBorderStyle(borderStyle) { this.borderStyle = new AnnotationBorderStyle(); - if (e instanceof Dict) - if (e.has("BS")) { - const t = e.get("BS"); - if (t instanceof Dict) { - const e = t.get("Type"); - if (!e || isName(e, "Border")) { - this.borderStyle.setWidth(t.get("W"), this.rectangle); - this.borderStyle.setStyle(t.get("S")); - this.borderStyle.setDashArray(t.getArray("D")); - } - } - } else if (e.has("Border")) { - const t = e.getArray("Border"); - if (Array.isArray(t) && t.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(t[0]); - this.borderStyle.setVerticalCornerRadius(t[1]); - this.borderStyle.setWidth(t[2], this.rectangle); - 4 === t.length && this.borderStyle.setDashArray(t[3], !0); - } - } else this.borderStyle.setWidth(0); - } - setAppearance(e) { - this.appearance = null; - const t = e.get("AP"); - if (!(t instanceof Dict)) return; - const i = t.get("N"); - if (i instanceof BaseStream) { - this.appearance = i; + if (!(borderStyle instanceof Dict)) { return; } - if (!(i instanceof Dict)) return; - const a = e.get("AS"); - if (!(a instanceof Name && i.has(a.name))) return; - const s = i.get(a.name); - s instanceof BaseStream && (this.appearance = s); + if (borderStyle.has("BS")) { + const dict = borderStyle.get("BS"); + if (dict instanceof Dict) { + const dictType = dict.get("Type"); + if (!dictType || 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 (Array.isArray(array) && array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2], this.rectangle); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3], true); + } + } + } else { + this.borderStyle.setWidth(0); + } } - setOptionalContent(e) { + setAppearance(dict) { + this.appearance = null; + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearanceState = appearanceStates.get("N"); + if (normalAppearanceState instanceof BaseStream) { + this.appearance = normalAppearanceState; + return; + } + if (!(normalAppearanceState instanceof Dict)) { + return; + } + const as = dict.get("AS"); + if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { + return; + } + const appearance = normalAppearanceState.get(as.name); + if (appearance instanceof BaseStream) { + this.appearance = appearance; + } + } + setOptionalContent(dict) { this.oc = null; - const t = e.get("OC"); - t instanceof Name - ? warn("setOptionalContent: Support for /Name-entry is not implemented.") - : t instanceof Dict && (this.oc = t); + const oc = dict.get("OC"); + if (oc instanceof Name) { + warn("setOptionalContent: Support for /Name-entry is not implemented."); + } else if (oc instanceof Dict) { + this.oc = oc; + } } - loadResources(e, t) { - return t.dict.getAsync("Resources").then((t) => { - if (!t) return; - return new ObjectLoader(t, e, t.xref).load().then(function () { - return t; + loadResources(keys, appearance) { + return appearance.dict.getAsync("Resources").then((resources) => { + if (!resources) { + return undefined; + } + const objectLoader = new ObjectLoader(resources, keys, resources.xref); + return objectLoader.load().then(function () { + return resources; }); }); } - async getOperatorList(e, t, a, s, r) { - const { hasOwnCanvas: n, id: g, rect: c } = this.data; - let C = this.appearance; - const h = !!(n && a & o); - if (h && (c[0] === c[2] || c[1] === c[3])) { - this.data.hasOwnCanvas = !1; + async getOperatorList(evaluator, task, intent, annotationStorage) { + const { hasOwnCanvas, id, rect } = this.data; + let appearance = this.appearance; + const isUsingOwnCanvas = !!( + hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY + ); + if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) { + this.data.hasOwnCanvas = false; return { opList: new OperatorList(), - separateForm: !1, - separateCanvas: !1, + separateForm: false, + separateCanvas: false, }; } - if (!C) { - if (!h) + if (!appearance) { + if (!isUsingOwnCanvas) { return { opList: new OperatorList(), - separateForm: !1, - separateCanvas: !1, + separateForm: false, + separateCanvas: false, }; - C = new StringStream(""); - C.dict = new Dict(); + } + appearance = new StringStream(""); + appearance.dict = new Dict(); } - const l = C.dict, - Q = await this.loadResources( - ["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], - C, - ), - E = lookupRect(l.getArray("BBox"), [0, 0, 1, 1]), - u = lookupMatrix(l.getArray("Matrix"), i), - d = getTransformMatrix(c, E, u), - f = new OperatorList(); - let p; - this.oc && (p = await e.parseMarkedContentProps(this.oc, null)); - void 0 !== p && f.addOp(Je, ["OC", p]); - f.addOp(We, [g, c, d, u, h]); - await e.getOperatorList({ - stream: C, - task: t, - resources: Q, - operatorList: f, + const appearanceDict = appearance.dict; + const resources = await this.loadResources( + ["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], + appearance, + ); + const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]); + const matrix = lookupMatrix( + appearanceDict.getArray("Matrix"), + IDENTITY_MATRIX, + ); + const transform = getTransformMatrix(rect, bbox, matrix); + const opList = new OperatorList(); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [ + id, + rect, + transform, + matrix, + isUsingOwnCanvas, + ]); + await evaluator.getOperatorList({ + stream: appearance, + task, + resources, + operatorList: opList, fallbackFontDict: this._fallbackFontDict, }); - f.addOp(je, []); - void 0 !== p && f.addOp(Ye, []); + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } this.reset(); - return { opList: f, separateForm: !1, separateCanvas: h }; + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas, + }; } - async save(e, t, i) { + async save(evaluator, task, annotationStorage) { return null; } get hasTextContent() { - return !1; + return false; } - async extractTextContent(e, t, i) { - if (!this.appearance) return; - const a = await this.loadResources( - ["ExtGState", "Font", "Properties", "XObject"], - this.appearance, - ), - s = [], - r = []; - let n = null; - const g = { + async extractTextContent(evaluator, task, viewBox) { + if (!this.appearance) { + return; + } + const resources = await this.loadResources( + ["ExtGState", "Font", "Properties", "XObject"], + this.appearance, + ); + const text = []; + const buffer = []; + let firstPosition = null; + const sink = { desiredSize: Math.Infinity, - ready: !0, - enqueue(e, t) { - for (const t of e.items) - if (void 0 !== t.str) { - n ||= t.transform.slice(-2); - r.push(t.str); - if (t.hasEOL) { - s.push(r.join("").trimEnd()); - r.length = 0; - } + ready: true, + enqueue(chunk, size) { + for (const item of chunk.items) { + if (item.str === undefined) { + continue; } + firstPosition ||= item.transform.slice(-2); + buffer.push(item.str); + if (item.hasEOL) { + text.push(buffer.join("").trimEnd()); + buffer.length = 0; + } + } }, }; - await e.getTextContent({ + await evaluator.getTextContent({ stream: this.appearance, - task: t, - resources: a, - includeMarkedContent: !0, - keepWhiteSpace: !0, - sink: g, - viewBox: i, + task, + resources, + includeMarkedContent: true, + keepWhiteSpace: true, + sink, + viewBox, }); this.reset(); - r.length && s.push(r.join("").trimEnd()); - if (s.length > 1 || s[0]) { - const e = this.appearance.dict, - t = lookupRect(e.getArray("BBox"), null), - i = lookupMatrix(e.getArray("Matrix"), null); - this.data.textPosition = this._transformPoint(n, t, i); - this.data.textContent = s; + if (buffer.length) { + text.push(buffer.join("").trimEnd()); + } + if (text.length > 1 || text[0]) { + const appearanceDict = this.appearance.dict; + const bbox = lookupRect(appearanceDict.getArray("BBox"), null); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); + this.data.textPosition = this._transformPoint( + firstPosition, + bbox, + matrix, + ); + this.data.textContent = text; } } - _transformPoint(e, t, i) { - const { rect: a } = this.data; - t ||= [0, 0, 1, 1]; - i ||= [1, 0, 0, 1, 0, 0]; - const s = getTransformMatrix(a, t, i); - s[4] -= a[0]; - s[5] -= a[1]; - e = Util.applyTransform(e, s); - return Util.applyTransform(e, i); + _transformPoint(coords, bbox, matrix) { + const { rect } = this.data; + bbox ||= [0, 0, 1, 1]; + matrix ||= [1, 0, 0, 1, 0, 0]; + const transform = getTransformMatrix(rect, bbox, matrix); + transform[4] -= rect[0]; + transform[5] -= rect[1]; + coords = Util.applyTransform(coords, transform); + return Util.applyTransform(coords, matrix); } getFieldObject() { - return this.data.kidIds - ? { - id: this.data.id, - actions: this.data.actions, - name: this.data.fieldName, - strokeColor: this.data.borderColor, - fillColor: this.data.backgroundColor, - type: "", - kidIds: this.data.kidIds, - page: this.data.pageIndex, - rotation: this.rotation, - } - : null; + if (this.data.kidIds) { + return { + id: this.data.id, + actions: this.data.actions, + name: this.data.fieldName, + strokeColor: this.data.borderColor, + fillColor: this.data.backgroundColor, + type: "", + kidIds: this.data.kidIds, + page: this.data.pageIndex, + rotation: this.rotation, + }; + } + return null; } reset() { - for (const e of this._streams) e.reset(); + for (const stream of this._streams) { + stream.reset(); + } } - _constructFieldName(e) { - if (!e.has("T") && !e.has("Parent")) { + _constructFieldName(dict) { + if (!dict.has("T") && !dict.has("Parent")) { warn("Unknown field name, falling back to empty field name."); return ""; } - if (!e.has("Parent")) return stringToPDFString(e.get("T")); - const t = []; - e.has("T") && t.unshift(stringToPDFString(e.get("T"))); - let i = e; - const a = new RefSet(); - e.objId && a.put(e.objId); - for (; i.has("Parent"); ) { - i = i.get("Parent"); - if (!(i instanceof Dict) || (i.objId && a.has(i.objId))) break; - i.objId && a.put(i.objId); - i.has("T") && t.unshift(stringToPDFString(i.get("T"))); + if (!dict.has("Parent")) { + return stringToPDFString(dict.get("T")); } - return t.join("."); + const fieldName = []; + if (dict.has("T")) { + fieldName.unshift(stringToPDFString(dict.get("T"))); + } + let loopDict = dict; + const visited = new RefSet(); + if (dict.objId) { + visited.put(dict.objId); + } + while (loopDict.has("Parent")) { + loopDict = loopDict.get("Parent"); + if ( + !(loopDict instanceof Dict) || + (loopDict.objId && visited.has(loopDict.objId)) + ) { + break; + } + if (loopDict.objId) { + visited.put(loopDict.objId); + } + if (loopDict.has("T")) { + fieldName.unshift(stringToPDFString(loopDict.get("T"))); + } + } + return fieldName.join("."); } } class AnnotationBorderStyle { constructor() { this.width = 1; - this.style = hA; + this.rawWidth = 1; + this.style = AnnotationBorderStyleType.SOLID; this.dashArray = [3]; this.horizontalCornerRadius = 0; this.verticalCornerRadius = 0; } - setWidth(e, t = [0, 0, 0, 0]) { - if (e instanceof Name) this.width = 0; - else if ("number" == typeof e) { - if (e > 0) { - const i = (t[2] - t[0]) / 2, - a = (t[3] - t[1]) / 2; - if (i > 0 && a > 0 && (e > i || e > a)) { - warn(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`); - e = 1; + setWidth(width, rect = [0, 0, 0, 0]) { + if (width instanceof Name) { + this.width = 0; + return; + } + if (typeof width === "number") { + if (width > 0) { + this.rawWidth = width; + const maxWidth = (rect[2] - rect[0]) / 2; + const maxHeight = (rect[3] - rect[1]) / 2; + if ( + maxWidth > 0 && + maxHeight > 0 && + (width > maxWidth || width > maxHeight) + ) { + warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); + width = 1; } } - this.width = e; + this.width = width; } } - setStyle(e) { - if (e instanceof Name) - switch (e.name) { - case "S": - this.style = hA; - break; - case "D": - this.style = BA; - break; - case "B": - this.style = lA; - break; - case "I": - this.style = QA; - break; - case "U": - this.style = EA; - } + setStyle(style) { + if (!(style instanceof Name)) { + return; + } + switch (style.name) { + case "S": + this.style = AnnotationBorderStyleType.SOLID; + break; + case "D": + this.style = AnnotationBorderStyleType.DASHED; + break; + case "B": + this.style = AnnotationBorderStyleType.BEVELED; + break; + case "I": + this.style = AnnotationBorderStyleType.INSET; + break; + case "U": + this.style = AnnotationBorderStyleType.UNDERLINE; + break; + default: + break; + } } - setDashArray(e, t = !1) { - if (Array.isArray(e)) { - let i = !0, - a = !0; - for (const t of e) { - if (!(+t >= 0)) { - i = !1; + setDashArray(dashArray, forceStyle = false) { + if (Array.isArray(dashArray)) { + let isValid = true; + let allZeros = true; + for (const element of dashArray) { + const validNumber = +element >= 0; + if (!validNumber) { + isValid = false; break; + } else if (element > 0) { + allZeros = false; } - t > 0 && (a = !1); } - if (0 === e.length || (i && !a)) { - this.dashArray = e; - t && this.setStyle(Name.get("D")); - } else this.width = 0; - } else e && (this.width = 0); + if (dashArray.length === 0 || (isValid && !allZeros)) { + this.dashArray = dashArray; + if (forceStyle) { + this.setStyle(Name.get("D")); + } + } else { + this.width = 0; + } + } else if (dashArray) { + this.width = 0; + } } - setHorizontalCornerRadius(e) { - Number.isInteger(e) && (this.horizontalCornerRadius = e); + setHorizontalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.horizontalCornerRadius = radius; + } } - setVerticalCornerRadius(e) { - Number.isInteger(e) && (this.verticalCornerRadius = e); + setVerticalCornerRadius(radius) { + if (Number.isInteger(radius)) { + this.verticalCornerRadius = radius; + } } } class MarkupAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t } = e; - if (t.has("IRT")) { - const e = t.getRaw("IRT"); - this.data.inReplyTo = e instanceof Ref ? e.toString() : null; - const i = t.get("RT"); - this.data.replyType = i instanceof Name ? i.name : X; + constructor(params) { + super(params); + const { dict } = params; + if (dict.has("IRT")) { + const rawIRT = dict.getRaw("IRT"); + this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null; + const rt = dict.get("RT"); + this.data.replyType = + rt instanceof Name ? rt.name : AnnotationReplyType.REPLY; } - let i = null; - if (this.data.replyType === j) { - const e = t.get("IRT"); - this.setTitle(e.get("T")); + let popupRef = null; + if (this.data.replyType === AnnotationReplyType.GROUP) { + const parent = dict.get("IRT"); + this.setTitle(parent.get("T")); this.data.titleObj = this._title; - this.setContents(e.get("Contents")); + this.setContents(parent.get("Contents")); this.data.contentsObj = this._contents; - if (e.has("CreationDate")) { - this.setCreationDate(e.get("CreationDate")); + if (!parent.has("CreationDate")) { + this.data.creationDate = null; + } else { + this.setCreationDate(parent.get("CreationDate")); this.data.creationDate = this.creationDate; - } else this.data.creationDate = null; - if (e.has("M")) { - this.setModificationDate(e.get("M")); + } + if (!parent.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parent.get("M")); this.data.modificationDate = this.modificationDate; - } else this.data.modificationDate = null; - i = e.getRaw("Popup"); - if (e.has("C")) { - this.setColor(e.getArray("C")); + } + popupRef = parent.getRaw("Popup"); + if (!parent.has("C")) { + this.data.color = null; + } else { + this.setColor(parent.getArray("C")); this.data.color = this.color; - } else this.data.color = null; + } } else { this.data.titleObj = this._title; - this.setCreationDate(t.get("CreationDate")); + this.setCreationDate(dict.get("CreationDate")); this.data.creationDate = this.creationDate; - i = t.getRaw("Popup"); - t.has("C") || (this.data.color = null); + popupRef = dict.getRaw("Popup"); + if (!dict.has("C")) { + this.data.color = null; + } + } + this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null; + if (dict.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC")); } - this.data.popupRef = i instanceof Ref ? i.toString() : null; - t.has("RC") && - (this.data.richText = XFAFactory.getRichTextAsHtml(t.get("RC"))); } - setCreationDate(e) { - this.creationDate = "string" == typeof e ? e : null; + setCreationDate(creationDate) { + this.creationDate = typeof creationDate === "string" ? creationDate : null; } _setDefaultAppearance({ - xref: e, - extra: t, - strokeColor: i, - fillColor: a, - blendMode: s, - strokeAlpha: r, - fillAlpha: n, - pointsCallback: g, + xref, + extra, + strokeColor, + fillColor, + blendMode, + strokeAlpha, + fillAlpha, + pointsCallback, }) { - let o = Number.MAX_VALUE, - c = Number.MAX_VALUE, - C = Number.MIN_VALUE, - h = Number.MIN_VALUE; - const l = ["q"]; - t && l.push(t); - i && l.push(`${i[0]} ${i[1]} ${i[2]} RG`); - a && l.push(`${a[0]} ${a[1]} ${a[2]} rg`); - let Q = this.data.quadPoints; - Q || - (Q = Float32Array.from([ - this.rectangle[0], - this.rectangle[3], - this.rectangle[2], - this.rectangle[3], - this.rectangle[0], - this.rectangle[1], - this.rectangle[2], - this.rectangle[1], - ])); - for (let e = 0, t = Q.length; e < t; e += 8) { - const [t, i, a, s] = g(l, Q.subarray(e, e + 8)); - o = Math.min(o, t); - C = Math.max(C, i); - c = Math.min(c, a); - h = Math.max(h, s); + let minX = Number.MAX_VALUE; + let minY = Number.MAX_VALUE; + let maxX = Number.MIN_VALUE; + let maxY = Number.MIN_VALUE; + const buffer = ["q"]; + if (extra) { + buffer.push(extra); } - l.push("Q"); - const E = new Dict(e), - u = new Dict(e); - u.set("Subtype", Name.get("Form")); - const d = new StringStream(l.join(" ")); - d.dict = u; - E.set("Fm0", d); - const f = new Dict(e); - s && f.set("BM", Name.get(s)); - "number" == typeof r && f.set("CA", r); - "number" == typeof n && f.set("ca", n); - const p = new Dict(e); - p.set("GS0", f); - const m = new Dict(e); - m.set("ExtGState", p); - m.set("XObject", E); - const y = new Dict(e); - y.set("Resources", m); - const w = (this.data.rect = [o, c, C, h]); - y.set("BBox", w); + if (strokeColor) { + buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); + } + if (fillColor) { + buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); + } + let pointsArray = this.data.quadPoints; + if (!pointsArray) { + pointsArray = Float32Array.from([ + this.rectangle[0], + this.rectangle[3], + this.rectangle[2], + this.rectangle[3], + this.rectangle[0], + this.rectangle[1], + this.rectangle[2], + this.rectangle[1], + ]); + } + for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { + const [mX, MX, mY, MY] = pointsCallback( + buffer, + pointsArray.subarray(i, i + 8), + ); + minX = Math.min(minX, mX); + maxX = Math.max(maxX, MX); + minY = Math.min(minY, mY); + maxY = Math.max(maxY, MY); + } + buffer.push("Q"); + const formDict = new Dict(xref); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("Subtype", Name.get("Form")); + const appearanceStream = new StringStream(buffer.join(" ")); + appearanceStream.dict = appearanceStreamDict; + formDict.set("Fm0", appearanceStream); + const gsDict = new Dict(xref); + if (blendMode) { + gsDict.set("BM", Name.get(blendMode)); + } + if (typeof strokeAlpha === "number") { + gsDict.set("CA", strokeAlpha); + } + if (typeof fillAlpha === "number") { + gsDict.set("ca", fillAlpha); + } + const stateDict = new Dict(xref); + stateDict.set("GS0", gsDict); + const resources = new Dict(xref); + resources.set("ExtGState", stateDict); + resources.set("XObject", formDict); + const appearanceDict = new Dict(xref); + appearanceDict.set("Resources", resources); + const bbox = (this.data.rect = [minX, minY, maxX, maxY]); + appearanceDict.set("BBox", bbox); this.appearance = new StringStream("/GS0 gs /Fm0 Do"); - this.appearance.dict = y; - this._streams.push(this.appearance, d); + this.appearance.dict = appearanceDict; + this._streams.push(this.appearance, appearanceStream); } - static async createNewAnnotation(e, t, i, a) { - const s = (t.ref ||= e.getNewTemporaryRef()), - r = await this.createNewAppearanceStream(t, e, a), - n = []; - let g; - if (r) { - const a = e.getNewTemporaryRef(); - g = this.createNewDict(t, e, { apRef: a }); - await writeObject(a, r, n, e); - i.push({ ref: a, data: n.join("") }); - } else g = this.createNewDict(t, e, {}); - Number.isInteger(t.parentTreeId) && g.set("StructParent", t.parentTreeId); - n.length = 0; - await writeObject(s, g, n, e); - return { ref: s, data: n.join("") }; - } - static async createNewPrintAnnotation(e, t, i, a) { - const s = await this.createNewAppearanceStream(i, t, a), - r = this.createNewDict(i, t, { ap: s }), - n = new this.prototype.constructor({ - dict: r, - xref: t, - annotationGlobals: e, - evaluatorOptions: a.evaluatorOptions, + static async createNewAnnotation(xref, annotation, dependencies, params) { + if (!annotation.ref) { + annotation.ref = xref.getNewTemporaryRef(); + } + const annotationRef = annotation.ref; + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const buffer = []; + let annotationDict; + if (ap) { + const apRef = xref.getNewTemporaryRef(); + annotationDict = this.createNewDict(annotation, xref, { + apRef, }); - i.ref && (n.ref = n.refToReplace = i.ref); - return n; + await writeObject(apRef, ap, buffer, xref); + dependencies.push({ + ref: apRef, + data: buffer.join(""), + }); + } else { + annotationDict = this.createNewDict(annotation, xref, {}); + } + if (Number.isInteger(annotation.parentTreeId)) { + annotationDict.set("StructParent", annotation.parentTreeId); + } + buffer.length = 0; + await writeObject(annotationRef, annotationDict, buffer, xref); + return { + ref: annotationRef, + data: buffer.join(""), + }; + } + static async createNewPrintAnnotation( + annotationGlobals, + xref, + annotation, + params, + ) { + const ap = await this.createNewAppearanceStream(annotation, xref, params); + const annotationDict = this.createNewDict( + annotation, + xref, + ap + ? { + ap, + } + : {}, + ); + const newAnnotation = new this.prototype.constructor({ + dict: annotationDict, + xref, + annotationGlobals, + evaluatorOptions: params.evaluatorOptions, + }); + if (annotation.ref) { + newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; + } + return newAnnotation; } } class WidgetAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t, xref: i, annotationGlobals: a } = e, - s = this.data; - this._needAppearances = e.needAppearances; - s.annotationType = W; - void 0 === s.fieldName && (s.fieldName = this._constructFieldName(t)); - void 0 === s.actions && (s.actions = collectActions(i, t, uA)); - let r = getInheritableProperty({ dict: t, key: "V", getArray: !0 }); - s.fieldValue = this._decodeFormValue(r); - const n = getInheritableProperty({ dict: t, key: "DV", getArray: !0 }); - s.defaultFieldValue = this._decodeFormValue(n); - if (void 0 === r && a.xfaDatasets) { - const e = this._title.str; - if (e) { - this._hasValueFromXFA = !0; - s.fieldValue = r = a.xfaDatasets.getValue(e); + constructor(params) { + super(params); + const { dict, xref, annotationGlobals } = params; + const data = this.data; + this._needAppearances = params.needAppearances; + data.annotationType = AnnotationType.WIDGET; + if (data.fieldName === undefined) { + data.fieldName = this._constructFieldName(dict); + } + if (data.actions === undefined) { + data.actions = collectActions(xref, dict, AnnotationActionEventType); + } + let fieldValue = getInheritableProperty({ + dict, + key: "V", + getArray: true, + }); + data.fieldValue = this._decodeFormValue(fieldValue); + const defaultFieldValue = getInheritableProperty({ + dict, + key: "DV", + getArray: true, + }); + data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); + if (fieldValue === undefined && annotationGlobals.xfaDatasets) { + const path = this._title.str; + if (path) { + this._hasValueFromXFA = true; + data.fieldValue = fieldValue = + annotationGlobals.xfaDatasets.getValue(path); } } - void 0 === r && - null !== s.defaultFieldValue && - (s.fieldValue = s.defaultFieldValue); - s.alternativeText = stringToPDFString(t.get("TU") || ""); - this.setDefaultAppearance(e); - s.hasAppearance ||= - this._needAppearances && void 0 !== s.fieldValue && null !== s.fieldValue; - const g = getInheritableProperty({ dict: t, key: "FT" }); - s.fieldType = g instanceof Name ? g.name : null; - const o = getInheritableProperty({ dict: t, key: "DR" }), - c = a.acroForm.get("DR"), - C = this.appearance?.dict.get("Resources"); + if (fieldValue === undefined && data.defaultFieldValue !== null) { + data.fieldValue = data.defaultFieldValue; + } + data.alternativeText = stringToPDFString(dict.get("TU") || ""); + this.setDefaultAppearance(params); + data.hasAppearance ||= + this._needAppearances && + data.fieldValue !== undefined && + data.fieldValue !== null; + const fieldType = getInheritableProperty({ + dict, + key: "FT", + }); + data.fieldType = fieldType instanceof Name ? fieldType.name : null; + const localResources = getInheritableProperty({ + dict, + key: "DR", + }); + const acroFormResources = annotationGlobals.acroForm.get("DR"); + const appearanceResources = this.appearance?.dict.get("Resources"); this._fieldResources = { - localResources: o, - acroFormResources: c, - appearanceResources: C, + localResources, + acroFormResources, + appearanceResources, mergedResources: Dict.merge({ - xref: i, - dictArray: [o, C, c], - mergeSubDicts: !0, + xref, + dictArray: [localResources, appearanceResources, acroFormResources], + mergeSubDicts: true, }), }; - s.fieldFlags = getInheritableProperty({ dict: t, key: "Ff" }); - (!Number.isInteger(s.fieldFlags) || s.fieldFlags < 0) && (s.fieldFlags = 0); - s.readOnly = this.hasFieldFlag(tA); - s.required = this.hasFieldFlag(iA); - s.hidden = - this._hasFlag(s.annotationFlags, V) || - this._hasFlag(s.annotationFlags, $); + data.fieldFlags = getInheritableProperty({ + dict, + key: "Ff", + }); + if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); + data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); + data.hidden = + this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || + this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); } - _decodeFormValue(e) { - return Array.isArray(e) - ? e.filter((e) => "string" == typeof e).map((e) => stringToPDFString(e)) - : e instanceof Name - ? stringToPDFString(e.name) - : "string" == typeof e - ? stringToPDFString(e) - : null; + _decodeFormValue(formValue) { + if (Array.isArray(formValue)) { + return formValue + .filter((item) => typeof item === "string") + .map((item) => stringToPDFString(item)); + } else if (formValue instanceof Name) { + return stringToPDFString(formValue.name); + } else if (typeof formValue === "string") { + return stringToPDFString(formValue); + } + return null; } - hasFieldFlag(e) { - return !!(this.data.fieldFlags & e); + hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); } - _isViewable(e) { - return !0; + _isViewable(flags) { + return true; } - mustBeViewed(e, t) { - return t - ? this.viewable - : super.mustBeViewed(e, t) && !this._hasFlag(this.flags, $); - } - getRotationMatrix(e) { - let t = e?.get(this.data.id)?.rotation; - void 0 === t && (t = this.rotation); - if (0 === t) return i; - return getRotationMatrix( - t, - this.data.rect[2] - this.data.rect[0], - this.data.rect[3] - this.data.rect[1], + mustBeViewed(annotationStorage, renderForms) { + if (renderForms) { + return this.viewable; + } + return ( + super.mustBeViewed(annotationStorage, renderForms) && + !this._hasFlag(this.flags, AnnotationFlag.NOVIEW) ); } - getBorderAndBackgroundAppearances(e) { - let t = e?.get(this.data.id)?.rotation; - void 0 === t && (t = this.rotation); - if (!this.backgroundColor && !this.borderColor) return ""; - const i = this.data.rect[2] - this.data.rect[0], - a = this.data.rect[3] - this.data.rect[1], - s = 0 === t || 180 === t ? `0 0 ${i} ${a} re` : `0 0 ${a} ${i} re`; - let r = ""; - this.backgroundColor && - (r = `${getPdfColor(this.backgroundColor, !0)} ${s} f `); - if (this.borderColor) { - r += `${this.borderStyle.width || 1} w ${getPdfColor(this.borderColor, !1)} ${s} S `; + getRotationMatrix(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; } - return r; + if (rotation === 0) { + return IDENTITY_MATRIX; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + return getRotationMatrix(rotation, width, height); } - async getOperatorList(e, t, i, a, s) { + getBorderAndBackgroundAppearances(annotationStorage) { + let rotation = annotationStorage?.get(this.data.id)?.rotation; + if (rotation === undefined) { + rotation = this.rotation; + } + if (!this.backgroundColor && !this.borderColor) { + return ""; + } + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const rect = + rotation === 0 || rotation === 180 + ? `0 0 ${width} ${height} re` + : `0 0 ${height} ${width} re`; + let str = ""; + if (this.backgroundColor) { + str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; + } + if (this.borderColor) { + const borderWidth = this.borderStyle.width || 1; + str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `; + } + return str; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { if ( - a && + intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas - ) + ) { return { opList: new OperatorList(), - separateForm: !0, - separateCanvas: !1, + separateForm: true, + separateCanvas: false, }; - if (!this._hasText) return super.getOperatorList(e, t, i, a, s); - const r = await this._getAppearance(e, t, i, s); - if (this.appearance && null === r) - return super.getOperatorList(e, t, i, a, s); - const n = new OperatorList(); - if (!this._defaultAppearance || null === r) - return { opList: n, separateForm: !1, separateCanvas: !1 }; - const g = !!(this.data.hasOwnCanvas && i & o), - c = [ - 0, - 0, - this.data.rect[2] - this.data.rect[0], - this.data.rect[3] - this.data.rect[1], - ], - C = getTransformMatrix(this.data.rect, c, [1, 0, 0, 1, 0, 0]); - let h; - this.oc && (h = await e.parseMarkedContentProps(this.oc, null)); - void 0 !== h && n.addOp(Je, ["OC", h]); - n.addOp(We, [ + } + if (!this._hasText) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const content = await this._getAppearance( + evaluator, + task, + intent, + annotationStorage, + ); + if (this.appearance && content === null) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + const opList = new OperatorList(); + if (!this._defaultAppearance || content === null) { + return { + opList, + separateForm: false, + separateCanvas: false, + }; + } + const isUsingOwnCanvas = !!( + this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY + ); + 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); + let optionalContent; + if (this.oc) { + optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); + } + if (optionalContent !== undefined) { + opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + opList.addOp(OPS.beginAnnotation, [ this.data.id, this.data.rect, - C, - this.getRotationMatrix(s), - g, + transform, + this.getRotationMatrix(annotationStorage), + isUsingOwnCanvas, ]); - const l = new StringStream(r); - await e.getOperatorList({ - stream: l, - task: t, + const stream = new StringStream(content); + await evaluator.getOperatorList({ + stream, + task, resources: this._fieldResources.mergedResources, - operatorList: n, + operatorList: opList, }); - n.addOp(je, []); - void 0 !== h && n.addOp(Ye, []); - return { opList: n, separateForm: !1, separateCanvas: g }; + opList.addOp(OPS.endAnnotation, []); + if (optionalContent !== undefined) { + opList.addOp(OPS.endMarkedContent, []); + } + return { + opList, + separateForm: false, + separateCanvas: isUsingOwnCanvas, + }; } - _getMKDict(e) { - const t = new Dict(null); - e && t.set("R", e); - this.borderColor && t.set("BC", getPdfColorArray(this.borderColor)); - this.backgroundColor && t.set("BG", getPdfColorArray(this.backgroundColor)); - return t.size > 0 ? t : null; + _getMKDict(rotation) { + const mk = new Dict(null); + if (rotation) { + mk.set("R", rotation); + } + if (this.borderColor) { + mk.set("BC", getPdfColorArray(this.borderColor)); + } + if (this.backgroundColor) { + mk.set("BG", getPdfColorArray(this.backgroundColor)); + } + return mk.size > 0 ? mk : null; } - amendSavedDict(e, t) {} - async save(e, t, a) { - const s = a?.get(this.data.id); - let r = s?.value, - n = s?.rotation; - if (r === this.data.fieldValue || void 0 === r) { - if (!this._hasValueFromXFA && void 0 === n) return null; - r ||= this.data.fieldValue; + amendSavedDict(annotationStorage, dict) {} + async save(evaluator, task, annotationStorage) { + const storageEntry = annotationStorage?.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let value = storageEntry?.value, + rotation = storageEntry?.rotation; + if (value === this.data.fieldValue || value === undefined) { + if ( + !this._hasValueFromXFA && + rotation === undefined && + flags === undefined + ) { + return null; + } + value ||= this.data.fieldValue; } if ( - void 0 === n && + rotation === undefined && !this._hasValueFromXFA && - Array.isArray(r) && + Array.isArray(value) && Array.isArray(this.data.fieldValue) && - r.length === this.data.fieldValue.length && - r.every((e, t) => e === this.data.fieldValue[t]) - ) + isArrayEqual(value, this.data.fieldValue) && + flags === undefined + ) { return null; - void 0 === n && (n = this.rotation); - let g = null; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let appearance = null; if (!this._needAppearances) { - g = await this._getAppearance(e, t, C, a); - if (null === g) return null; + appearance = await this._getAppearance( + evaluator, + task, + RenderingIntentFlag.SAVE, + annotationStorage, + ); + if (appearance === null && flags === undefined) { + return null; + } + } else { } - let o = !1; - if (g?.needAppearances) { - o = !0; - g = null; + let needAppearances = false; + if (appearance?.needAppearances) { + needAppearances = true; + appearance = null; } - const { xref: c } = e, - h = c.fetchIfRef(this.ref); - if (!(h instanceof Dict)) return null; - const l = new Dict(c); - for (const e of h.getKeys()) "AP" !== e && l.set(e, h.getRaw(e)); - const Q = { path: this.data.fieldName, value: r }, - encoder = (e) => (isAscii(e) ? e : stringToUTF16String(e, !0)); - l.set("V", Array.isArray(r) ? r.map(encoder) : encoder(r)); - this.amendSavedDict(a, l); - const E = this._getMKDict(n); - E && l.set("MK", E); - const u = [], - d = [{ ref: this.ref, data: "", xfa: Q, needAppearances: o }]; - if (null !== g) { - const e = c.getNewTemporaryRef(), - t = new Dict(c); - l.set("AP", t); - t.set("N", e); - const s = this._getSaveFieldResources(c), - r = new StringStream(g), - n = (r.dict = new Dict(c)); - n.set("Subtype", Name.get("Form")); - n.set("Resources", s); - n.set("BBox", [ + const { xref } = evaluator; + const originalDict = xref.fetchIfRef(this.ref); + if (!(originalDict instanceof Dict)) { + return null; + } + const dict = new Dict(xref); + for (const key of originalDict.getKeys()) { + if (key !== "AP") { + dict.set(key, originalDict.getRaw(key)); + } + } + if (flags !== undefined) { + dict.set("F", flags); + if (appearance === null && !needAppearances) { + const ap = originalDict.getRaw("AP"); + if (ap) { + dict.set("AP", ap); + } + } + } + const xfa = { + path: this.data.fieldName, + value, + }; + dict.set( + "V", + Array.isArray(value) + ? value.map(stringToAsciiOrUTF16BE) + : stringToAsciiOrUTF16BE(value), + ); + this.amendSavedDict(annotationStorage, dict); + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + const buffer = []; + const changes = [ + { + ref: this.ref, + data: "", + xfa, + needAppearances, + }, + ]; + if (appearance !== null) { + const newRef = xref.getNewTemporaryRef(); + const AP = new Dict(xref); + dict.set("AP", AP); + AP.set("N", newRef); + const resources = this._getSaveFieldResources(xref); + const appearanceStream = new StringStream(appearance); + const appearanceDict = (appearanceStream.dict = new Dict(xref)); + appearanceDict.set("Subtype", Name.get("Form")); + appearanceDict.set("Resources", resources); + appearanceDict.set("BBox", [ 0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1], ]); - const o = this.getRotationMatrix(a); - o !== i && n.set("Matrix", o); - await writeObject(e, r, u, c); - d.push({ ref: e, data: u.join(""), xfa: null, needAppearances: !1 }); - u.length = 0; + const rotationMatrix = this.getRotationMatrix(annotationStorage); + if (rotationMatrix !== IDENTITY_MATRIX) { + appearanceDict.set("Matrix", rotationMatrix); + } + await writeObject(newRef, appearanceStream, buffer, xref); + changes.push({ + ref: newRef, + data: buffer.join(""), + xfa: null, + needAppearances: false, + }); + buffer.length = 0; } - l.set("M", `D:${getModificationDate()}`); - await writeObject(this.ref, l, u, c); - d[0].data = u.join(""); - return d; + dict.set("M", `D:${getModificationDate()}`); + await writeObject(this.ref, dict, buffer, xref); + changes[0].data = buffer.join(""); + return changes; } - async _getAppearance(e, t, i, a) { - if (this.hasFieldFlag(sA)) return null; - const s = a?.get(this.data.id); - let r, g; - if (s) { - r = s.formattedValue || s.value; - g = s.rotation; + async _getAppearance(evaluator, task, intent, annotationStorage) { + const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); + if (isPassword) { + return null; + } + const storageEntry = annotationStorage?.get(this.data.id); + let value, rotation; + if (storageEntry) { + value = storageEntry.formattedValue || storageEntry.value; + rotation = storageEntry.rotation; } if ( - void 0 === g && - void 0 === r && - !this._needAppearances && - (!this._hasValueFromXFA || this.appearance) - ) - return null; - const o = this.getBorderAndBackgroundAppearances(a); - if (void 0 === r) { - r = this.data.fieldValue; - if (!r) return `/Tx BMC q ${o}Q EMC`; + rotation === undefined && + value === undefined && + !this._needAppearances + ) { + if (!this._hasValueFromXFA || this.appearance) { + return null; + } } - Array.isArray(r) && 1 === r.length && (r = r[0]); - assert("string" == typeof r, "Expected `value` to be a string."); - r = r.trim(); + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + if (value === undefined) { + value = this.data.fieldValue; + if (!value) { + return `/Tx BMC q ${colors}Q EMC`; + } + } + if (Array.isArray(value) && value.length === 1) { + value = value[0]; + } + assert(typeof value === "string", "Expected `value` to be a string."); + value = value.trimEnd(); if (this.data.combo) { - const e = this.data.options.find(({ exportValue: e }) => r === e); - r = e?.displayValue || r; + const option = this.data.options.find( + ({ exportValue }) => value === exportValue, + ); + value = option?.displayValue || value; } - if ("" === r) return `/Tx BMC q ${o}Q EMC`; - void 0 === g && (g = this.rotation); - let c, - h = -1; + if (value === "") { + return `/Tx BMC q ${colors}Q EMC`; + } + if (rotation === undefined) { + rotation = this.rotation; + } + let lineCount = -1; + let lines; if (this.data.multiLine) { - c = r.split(/\r\n?|\n/).map((e) => e.normalize("NFC")); - h = c.length; - } else c = [r.replace(/\r\n?|\n/, "").normalize("NFC")]; - let l = this.data.rect[3] - this.data.rect[1], - Q = this.data.rect[2] - this.data.rect[0]; - (90 !== g && 270 !== g) || ([Q, l] = [l, Q]); - this._defaultAppearance || - (this.data.defaultAppearanceData = parseDefaultAppearance( - (this._defaultAppearance = "/Helvetica 0 Tf 0 g"), - )); - let E, - u, - d, - f = await WidgetAnnotation._getFontData( - e, - t, - this.data.defaultAppearanceData, - this._fieldResources.mergedResources, - ); - const p = []; - let m = !1; - for (const e of c) { - const t = f.encodeString(e); - t.length > 1 && (m = !0); - p.push(t.join("")); + lines = value.split(/\r\n?|\n/).map((line) => line.normalize("NFC")); + lineCount = lines.length; + } else { + lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; } - if (m && i & C) return { needAppearances: !0 }; - if (m && this._isOffscreenCanvasSupported) { - const i = this.data.comb ? "monospace" : "sans-serif", - a = new FakeUnicodeFont(e.xref, i), - s = a.createFontResources(c.join("")), - n = s.getRaw("Font"); - if (this._fieldResources.mergedResources.has("Font")) { - const e = this._fieldResources.mergedResources.get("Font"); - for (const t of n.getKeys()) e.set(t, n.getRaw(t)); - } else this._fieldResources.mergedResources.set("Font", n); - const g = a.fontName.name; - f = await WidgetAnnotation._getFontData( - e, - t, - { fontName: g, fontSize: 0 }, - s, + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance( + (this._defaultAppearance = "/Helvetica 0 Tf 0 g"), ); - for (let e = 0, t = p.length; e < t; e++) - p[e] = stringToUTF16String(c[e]); - const o = Object.assign( + } + let font = await WidgetAnnotation._getFontData( + evaluator, + task, + this.data.defaultAppearanceData, + this._fieldResources.mergedResources, + ); + let defaultAppearance, fontSize, lineHeight; + const encodedLines = []; + let encodingError = false; + for (const line of lines) { + const encodedString = font.encodeString(line); + if (encodedString.length > 1) { + encodingError = true; + } + encodedLines.push(encodedString.join("")); + } + if (encodingError && intent & RenderingIntentFlag.SAVE) { + return { + needAppearances: true, + }; + } + if (encodingError && this._isOffscreenCanvasSupported) { + const fontFamily = this.data.comb ? "monospace" : "sans-serif"; + const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily); + const resources = fakeUnicodeFont.createFontResources(lines.join("")); + const newFont = resources.getRaw("Font"); + if (this._fieldResources.mergedResources.has("Font")) { + const oldFont = this._fieldResources.mergedResources.get("Font"); + for (const key of newFont.getKeys()) { + oldFont.set(key, newFont.getRaw(key)); + } + } else { + this._fieldResources.mergedResources.set("Font", newFont); + } + const fontName = fakeUnicodeFont.fontName.name; + font = await WidgetAnnotation._getFontData( + evaluator, + task, + { + fontName, + fontSize: 0, + }, + resources, + ); + for (let i = 0, ii = encodedLines.length; i < ii; i++) { + encodedLines[i] = stringToUTF16String(lines[i]); + } + const savedDefaultAppearance = Object.assign( Object.create(null), this.data.defaultAppearanceData, ); this.data.defaultAppearanceData.fontSize = 0; - this.data.defaultAppearanceData.fontName = g; - [E, u, d] = this._computeFontSize(l - 2, Q - 4, r, f, h); - this.data.defaultAppearanceData = o; + this.data.defaultAppearanceData.fontName = fontName; + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize( + totalHeight - 2 * defaultPadding, + totalWidth - 2 * defaultHPadding, + value, + font, + lineCount, + ); + this.data.defaultAppearanceData = savedDefaultAppearance; } else { - this._isOffscreenCanvasSupported || + if (!this._isOffscreenCanvasSupported) { warn( "_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.", ); - [E, u, d] = this._computeFontSize(l - 2, Q - 4, r, f, h); - } - let y = f.descent; - y = isNaN(y) ? n * d : Math.max(n * d, Math.abs(y) * u); - const w = Math.min(Math.floor((l - u) / 2), 1), - D = this.data.textAlignment; - if (this.data.multiLine) - return this._getMultilineAppearance(E, p, f, u, Q, l, D, 2, w, y, d, a); - if (this.data.comb) - return this._getCombAppearance(E, f, p[0], u, Q, l, 2, w, y, d, a); - const b = w + y; - if (0 === D || D > 2) - return ( - `/Tx BMC q ${o}BT ` + - E + - ` 1 0 0 1 ${numberToString(2)} ${numberToString(b)} Tm (${escapeString(p[0])}) Tj ET Q EMC` + } + [defaultAppearance, fontSize, lineHeight] = this._computeFontSize( + totalHeight - 2 * defaultPadding, + totalWidth - 2 * defaultHPadding, + value, + font, + lineCount, ); + } + let descent = font.descent; + if (isNaN(descent)) { + descent = BASELINE_FACTOR * lineHeight; + } else { + descent = Math.max( + BASELINE_FACTOR * lineHeight, + Math.abs(descent) * fontSize, + ); + } + const defaultVPadding = Math.min( + Math.floor((totalHeight - fontSize) / 2), + defaultPadding, + ); + const alignment = this.data.textAlignment; + if (this.data.multiLine) { + return this._getMultilineAppearance( + defaultAppearance, + encodedLines, + font, + fontSize, + totalWidth, + totalHeight, + alignment, + defaultHPadding, + defaultVPadding, + descent, + lineHeight, + annotationStorage, + ); + } + if (this.data.comb) { + return this._getCombAppearance( + defaultAppearance, + font, + encodedLines[0], + fontSize, + totalWidth, + totalHeight, + defaultHPadding, + defaultVPadding, + descent, + lineHeight, + annotationStorage, + ); + } + const bottomPadding = defaultVPadding + descent; + if (alignment === 0 || alignment > 2) { + return ( + `/Tx BMC q ${colors}BT ` + + defaultAppearance + + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + + " ET Q EMC" + ); + } + const prevInfo = { + shift: 0, + }; + const renderedText = this._renderText( + encodedLines[0], + font, + fontSize, + totalWidth, + alignment, + prevInfo, + defaultHPadding, + bottomPadding, + ); return ( - `/Tx BMC q ${o}BT ` + - E + - ` 1 0 0 1 0 0 Tm ${this._renderText(p[0], f, u, Q, D, { shift: 0 }, 2, b)} ET Q EMC` + `/Tx BMC q ${colors}BT ` + + defaultAppearance + + ` 1 0 0 1 0 0 Tm ${renderedText}` + + " ET Q EMC" ); } - static async _getFontData(e, t, i, a) { - const s = new OperatorList(), - r = { - font: null, - clone() { - return this; - }, + static async _getFontData(evaluator, task, appearanceData, resources) { + const operatorList = new OperatorList(); + const initialState = { + font: null, + clone() { + return this; }, - { fontName: n, fontSize: g } = i; - await e.handleSetFont(a, [n && Name.get(n), g], null, s, t, r, null); - return r.font; + }; + const { fontName, fontSize } = appearanceData; + await evaluator.handleSetFont( + resources, + [fontName && Name.get(fontName), fontSize], + null, + operatorList, + task, + initialState, + null, + ); + return initialState.font; } - _getTextWidth(e, t) { - return t.charsToGlyphs(e).reduce((e, t) => e + t.width, 0) / 1e3; + _getTextWidth(text, font) { + return ( + font + .charsToGlyphs(text) + .reduce((width, glyph) => width + glyph.width, 0) / 1000 + ); } - _computeFontSize(e, t, i, a, r) { - let { fontSize: n } = this.data.defaultAppearanceData, - g = (n || 12) * s, - o = Math.round(e / g); - if (!n) { - const roundWithTwoDigits = (e) => Math.floor(100 * e) / 100; - if (-1 === r) { - const r = this._getTextWidth(i, a); - n = roundWithTwoDigits(Math.min(e / s, r > t ? t / r : 1 / 0)); - o = 1; + _computeFontSize(height, width, text, font, lineCount) { + let { fontSize } = this.data.defaultAppearanceData; + let lineHeight = (fontSize || 12) * LINE_FACTOR, + numberOfLines = Math.round(height / lineHeight); + if (!fontSize) { + const roundWithTwoDigits = (x) => Math.floor(x * 100) / 100; + if (lineCount === -1) { + const textWidth = this._getTextWidth(text, font); + fontSize = roundWithTwoDigits( + Math.min(height / LINE_FACTOR, width / textWidth), + ); + numberOfLines = 1; } else { - const c = i.split(/\r\n?|\n/), - C = []; - for (const e of c) { - const t = a.encodeString(e).join(""), - i = a.charsToGlyphs(t), - s = a.getCharPositions(t); - C.push({ line: t, glyphs: i, positions: s }); + const lines = text.split(/\r\n?|\n/); + const cachedLines = []; + for (const line of lines) { + const encoded = font.encodeString(line).join(""); + const glyphs = font.charsToGlyphs(encoded); + const positions = font.getCharPositions(encoded); + cachedLines.push({ + line: encoded, + glyphs, + positions, + }); } - const isTooBig = (i) => { - let s = 0; - for (const r of C) { - s += this._splitLine(null, a, i, t, r).length * i; - if (s > e) return !0; + const isTooBig = (fsize) => { + let totalHeight = 0; + for (const cache of cachedLines) { + const chunks = this._splitLine(null, font, fsize, width, cache); + totalHeight += chunks.length * fsize; + if (totalHeight > height) { + return true; + } } - return !1; + return false; }; - o = Math.max(o, r); - for (;;) { - g = e / o; - n = roundWithTwoDigits(g / s); - if (!isTooBig(n)) break; - o++; + numberOfLines = Math.max(numberOfLines, lineCount); + while (true) { + lineHeight = height / numberOfLines; + fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR); + if (isTooBig(fontSize)) { + numberOfLines++; + continue; + } + break; } } - const { fontName: c, fontColor: C } = this.data.defaultAppearanceData; - this._defaultAppearance = (function createDefaultAppearance({ - fontSize: e, - fontName: t, - fontColor: i, - }) { - return `/${escapePDFName(t)} ${e} Tf ${getPdfColor(i, !0)}`; - })({ fontSize: n, fontName: c, fontColor: C }); + const { fontName, fontColor } = this.data.defaultAppearanceData; + this._defaultAppearance = createDefaultAppearance({ + fontSize, + fontName, + fontColor, + }); } - return [this._defaultAppearance, n, e / o]; + return [this._defaultAppearance, fontSize, height / numberOfLines]; } - _renderText(e, t, i, a, s, r, n, g) { - let o; - if (1 === s) { - o = (a - this._getTextWidth(e, t) * i) / 2; - } else if (2 === s) { - o = a - this._getTextWidth(e, t) * i - n; - } else o = n; - const c = numberToString(o - r.shift); - r.shift = o; - return `${c} ${(g = numberToString(g))} Td (${escapeString(e)}) Tj`; + _renderText( + text, + font, + fontSize, + totalWidth, + alignment, + prevInfo, + hPadding, + vPadding, + ) { + let shift; + if (alignment === 1) { + const width = this._getTextWidth(text, font) * fontSize; + shift = (totalWidth - width) / 2; + } else if (alignment === 2) { + const width = this._getTextWidth(text, font) * fontSize; + shift = totalWidth - width - hPadding; + } else { + shift = hPadding; + } + const shiftStr = numberToString(shift - prevInfo.shift); + prevInfo.shift = shift; + vPadding = numberToString(vPadding); + return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; } - _getSaveFieldResources(e) { - const { - localResources: t, - appearanceResources: i, - acroFormResources: a, - } = this._fieldResources, - s = this.data.defaultAppearanceData?.fontName; - if (!s) return t || Dict.empty; - for (const e of [t, i]) - if (e instanceof Dict) { - const t = e.get("Font"); - if (t instanceof Dict && t.has(s)) return e; - } - if (a instanceof Dict) { - const i = a.get("Font"); - if (i instanceof Dict && i.has(s)) { - const a = new Dict(e); - a.set(s, i.getRaw(s)); - const r = new Dict(e); - r.set("Font", a); - return Dict.merge({ xref: e, dictArray: [r, t], mergeSubDicts: !0 }); + _getSaveFieldResources(xref) { + const { localResources, appearanceResources, acroFormResources } = + this._fieldResources; + const fontName = this.data.defaultAppearanceData?.fontName; + if (!fontName) { + return localResources || Dict.empty; + } + for (const resources of [localResources, appearanceResources]) { + if (resources instanceof Dict) { + const localFont = resources.get("Font"); + if (localFont instanceof Dict && localFont.has(fontName)) { + return resources; + } } } - return t || Dict.empty; + if (acroFormResources instanceof Dict) { + const acroFormFont = acroFormResources.get("Font"); + if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) { + const subFontDict = new Dict(xref); + subFontDict.set(fontName, acroFormFont.getRaw(fontName)); + const subResourcesDict = new Dict(xref); + subResourcesDict.set("Font", subFontDict); + return Dict.merge({ + xref, + dictArray: [subResourcesDict, localResources], + mergeSubDicts: true, + }); + } + } + return localResources || Dict.empty; } getFieldObject() { return null; } } class TextWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); - const { dict: t } = e; - if (t.has("PMD")) { - this.flags |= V; - this.data.hidden = !0; + constructor(params) { + super(params); + const { dict } = params; + if (dict.has("PMD")) { + this.flags |= AnnotationFlag.HIDDEN; + this.data.hidden = true; warn("Barcodes are not supported"); } this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; - this._hasText = !0; - "string" != typeof this.data.fieldValue && (this.data.fieldValue = ""); - let i = getInheritableProperty({ dict: t, key: "Q" }); - (!Number.isInteger(i) || i < 0 || i > 2) && (i = null); - this.data.textAlignment = i; - let a = getInheritableProperty({ dict: t, key: "MaxLen" }); - (!Number.isInteger(a) || a < 0) && (a = 0); - this.data.maxLen = a; - this.data.multiLine = this.hasFieldFlag(aA); + this._hasText = true; + if (typeof this.data.fieldValue !== "string") { + this.data.fieldValue = ""; + } + let alignment = getInheritableProperty({ + dict, + key: "Q", + }); + if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { + alignment = null; + } + this.data.textAlignment = alignment; + let maximumLength = getInheritableProperty({ + dict, + key: "MaxLen", + }); + if (!Number.isInteger(maximumLength) || maximumLength < 0) { + maximumLength = 0; + } + this.data.maxLen = maximumLength; + this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); this.data.comb = - this.hasFieldFlag(CA) && - !this.hasFieldFlag(aA) && - !this.hasFieldFlag(sA) && - !this.hasFieldFlag(oA) && - 0 !== this.data.maxLen; - this.data.doNotScroll = this.hasFieldFlag(cA); + this.hasFieldFlag(AnnotationFieldFlag.COMB) && + !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && + !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && + !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && + this.data.maxLen !== 0; + this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); } get hasTextContent() { return !!this.appearance && !this._needAppearances; } - _getCombAppearance(e, t, i, a, s, r, n, g, o, c, C) { - const h = s / this.data.maxLen, - l = this.getBorderAndBackgroundAppearances(C), - Q = [], - E = t.getCharPositions(i); - for (const [e, t] of E) Q.push(`(${escapeString(i.substring(e, t))}) Tj`); - const u = Q.join(` ${numberToString(h)} 0 Td `); + _getCombAppearance( + defaultAppearance, + font, + text, + fontSize, + width, + height, + hPadding, + vPadding, + descent, + lineHeight, + annotationStorage, + ) { + const combWidth = width / this.data.maxLen; + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const buf = []; + const positions = font.getCharPositions(text); + for (const [start, end] of positions) { + buf.push(`(${escapeString(text.substring(start, end))}) Tj`); + } + const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); return ( - `/Tx BMC q ${l}BT ` + - e + - ` 1 0 0 1 ${numberToString(n)} ${numberToString(g + o)} Tm ${u} ET Q EMC` + `/Tx BMC q ${colors}BT ` + + defaultAppearance + + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + + " ET Q EMC" ); } - _getMultilineAppearance(e, t, i, a, s, r, n, g, o, c, C, h) { - const l = [], - Q = s - 2 * g, - E = { shift: 0 }; - for (let e = 0, r = t.length; e < r; e++) { - const r = t[e], - h = this._splitLine(r, i, a, Q); - for (let t = 0, r = h.length; t < r; t++) { - const r = h[t], - Q = 0 === e && 0 === t ? -o - (C - c) : -C; - l.push(this._renderText(r, i, a, s, n, E, g, Q)); + _getMultilineAppearance( + defaultAppearance, + lines, + font, + fontSize, + width, + height, + alignment, + hPadding, + vPadding, + descent, + lineHeight, + annotationStorage, + ) { + const buf = []; + const totalWidth = width - 2 * hPadding; + const prevInfo = { + shift: 0, + }; + for (let i = 0, ii = lines.length; i < ii; i++) { + const line = lines[i]; + const chunks = this._splitLine(line, font, fontSize, totalWidth); + for (let j = 0, jj = chunks.length; j < jj; j++) { + const chunk = chunks[j]; + const vShift = + i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; + buf.push( + this._renderText( + chunk, + font, + fontSize, + width, + alignment, + prevInfo, + hPadding, + vShift, + ), + ); } } - const u = this.getBorderAndBackgroundAppearances(h), - d = l.join("\n"); + const colors = this.getBorderAndBackgroundAppearances(annotationStorage); + const renderedText = buf.join("\n"); return ( - `/Tx BMC q ${u}BT ` + - e + - ` 1 0 0 1 0 ${numberToString(r)} Tm ${d} ET Q EMC` + `/Tx BMC q ${colors}BT ` + + defaultAppearance + + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + + " ET Q EMC" ); } - _splitLine(e, t, i, a, s = {}) { - e = s.line || e; - const r = s.glyphs || t.charsToGlyphs(e); - if (r.length <= 1) return [e]; - const n = s.positions || t.getCharPositions(e), - g = i / 1e3, - o = []; - let c = -1, - C = -1, - h = -1, - l = 0, - Q = 0; - for (let t = 0, i = r.length; t < i; t++) { - const [i, s] = n[t], - E = r[t], - u = E.width * g; - if (" " === E.unicode) - if (Q + u > a) { - o.push(e.substring(l, i)); - l = i; - Q = u; - c = -1; - h = -1; - } else { - Q += u; - c = i; - C = s; - h = t; - } - else if (Q + u > a) - if (-1 !== c) { - o.push(e.substring(l, C)); - l = C; - t = h + 1; - c = -1; - Q = 0; - } else { - o.push(e.substring(l, i)); - l = i; - Q = u; - } - else Q += u; + _splitLine(line, font, fontSize, width, cache = {}) { + line = cache.line || line; + const glyphs = cache.glyphs || font.charsToGlyphs(line); + if (glyphs.length <= 1) { + return [line]; + } + const positions = cache.positions || font.getCharPositions(line); + const scale = fontSize / 1000; + const chunks = []; + let lastSpacePosInStringStart = -1, + lastSpacePosInStringEnd = -1, + lastSpacePos = -1, + startChunk = 0, + currentWidth = 0; + 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; + } + } else { + currentWidth += glyphWidth; + } + } + if (startChunk < line.length) { + chunks.push(line.substring(startChunk, line.length)); + } + return chunks; + } + async extractTextContent(evaluator, task, viewBox) { + await super.extractTextContent(evaluator, task, viewBox); + const text = this.data.textContent; + if (!text) { + return; + } + const allText = text.join("\n"); + if (allText === this.data.fieldValue) { + return; + } + const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => + p1 ? `\\${p1}` : "\\s+", + ); + if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { + this.data.textContent = this.data.fieldValue.split("\n"); } - l < e.length && o.push(e.substring(l, e.length)); - return o; } getFieldObject() { return { @@ -52617,7 +63763,7 @@ class TextWidgetAnnotation extends WidgetAnnotation { value: this.data.fieldValue, defaultValue: this.data.defaultFieldValue || "", multiline: this.data.multiLine, - password: this.hasFieldFlag(sA), + password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD), charLimit: this.data.maxLen, comb: this.data.comb, editable: !this.data.readOnly, @@ -52634,243 +63780,394 @@ class TextWidgetAnnotation extends WidgetAnnotation { } } class ButtonWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); + constructor(params) { + super(params); this.checkedAppearance = null; this.uncheckedAppearance = null; - this.data.checkBox = !this.hasFieldFlag(rA) && !this.hasFieldFlag(nA); - this.data.radioButton = this.hasFieldFlag(rA) && !this.hasFieldFlag(nA); - this.data.pushButton = this.hasFieldFlag(nA); - this.data.isTooltipOnly = !1; - if (this.data.checkBox) this._processCheckBox(e); - else if (this.data.radioButton) this._processRadioButton(e); - else if (this.data.pushButton) { - this.data.hasOwnCanvas = !0; - this.data.noHTML = !1; - this._processPushButton(e); - } else warn("Invalid field flags for button widget annotation"); - } - async getOperatorList(e, t, a, s, r) { - if (this.data.pushButton) return super.getOperatorList(e, t, a, !1, r); - let n = null, - g = null; - if (r) { - const e = r.get(this.data.id); - n = e ? e.value : null; - g = e ? e.rotation : null; + this.data.checkBox = + !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && + !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.radioButton = + this.hasFieldFlag(AnnotationFieldFlag.RADIO) && + !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.isTooltipOnly = false; + if (this.data.checkBox) { + this._processCheckBox(params); + } else if (this.data.radioButton) { + this._processRadioButton(params); + } else if (this.data.pushButton) { + this.data.hasOwnCanvas = true; + this.data.noHTML = false; + this._processPushButton(params); + } else { + warn("Invalid field flags for button widget annotation"); } - if (null === n && this.appearance) - return super.getOperatorList(e, t, a, s, r); - null == n && - (n = this.data.checkBox + } + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (this.data.pushButton) { + return super.getOperatorList( + evaluator, + task, + intent, + false, + annotationStorage, + ); + } + let value = null; + let rotation = null; + if (annotationStorage) { + const storageEntry = annotationStorage.get(this.data.id); + value = storageEntry ? storageEntry.value : null; + rotation = storageEntry ? storageEntry.rotation : null; + } + if (value === null && this.appearance) { + return super.getOperatorList(evaluator, task, intent, annotationStorage); + } + if (value === null || value === undefined) { + value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue - : this.data.fieldValue === this.data.buttonValue); - const o = n ? this.checkedAppearance : this.uncheckedAppearance; - if (o) { - const n = this.appearance, - c = lookupMatrix(o.dict.getArray("Matrix"), i); - g && o.dict.set("Matrix", this.getRotationMatrix(r)); - this.appearance = o; - const C = super.getOperatorList(e, t, a, s, r); - this.appearance = n; - o.dict.set("Matrix", c); - return C; + : this.data.fieldValue === this.data.buttonValue; } - return { opList: new OperatorList(), separateForm: !1, separateCanvas: !1 }; - } - async save(e, t, i) { - return this.data.checkBox - ? this._saveCheckbox(e, t, i) - : this.data.radioButton - ? this._saveRadioButton(e, t, i) - : null; - } - async _saveCheckbox(e, t, i) { - if (!i) return null; - const a = i.get(this.data.id); - let s = a?.rotation, - r = a?.value; - if (void 0 === s) { - if (void 0 === r) return null; - if ((this.data.fieldValue === this.data.exportValue) === r) return null; + const appearance = value + ? this.checkedAppearance + : this.uncheckedAppearance; + if (appearance) { + const savedAppearance = this.appearance; + const savedMatrix = lookupMatrix( + appearance.dict.getArray("Matrix"), + IDENTITY_MATRIX, + ); + if (rotation) { + appearance.dict.set( + "Matrix", + this.getRotationMatrix(annotationStorage), + ); + } + this.appearance = appearance; + const operatorList = super.getOperatorList( + evaluator, + task, + intent, + annotationStorage, + ); + this.appearance = savedAppearance; + appearance.dict.set("Matrix", savedMatrix); + return operatorList; } - const n = e.xref.fetchIfRef(this.ref); - if (!(n instanceof Dict)) return null; - void 0 === s && (s = this.rotation); - void 0 === r && (r = this.data.fieldValue === this.data.exportValue); - const g = { - path: this.data.fieldName, - value: r ? this.data.exportValue : "", + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false, + }; + } + async save(evaluator, task, annotationStorage) { + if (this.data.checkBox) { + return this._saveCheckbox(evaluator, task, annotationStorage); + } + if (this.data.radioButton) { + return this._saveRadioButton(evaluator, task, annotationStorage); + } + return null; + } + async _saveCheckbox(evaluator, task, annotationStorage) { + if (!annotationStorage) { + return null; + } + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return null; + } + const defaultValue = this.data.fieldValue === this.data.exportValue; + if (defaultValue === value) { + return null; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return null; + } + dict = dict.clone(); + if (rotation === undefined) { + rotation = this.rotation; + } + if (value === undefined) { + value = this.data.fieldValue === this.data.exportValue; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.exportValue : "", + }; + const name = Name.get(value ? this.data.exportValue : "Off"); + dict.set("V", name); + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + const buffer = []; + await writeObject(this.ref, dict, buffer, evaluator.xref); + return [ + { + ref: this.ref, + data: buffer.join(""), + xfa, }, - o = Name.get(r ? this.data.exportValue : "Off"); - n.set("V", o); - n.set("AS", o); - n.set("M", `D:${getModificationDate()}`); - const c = this._getMKDict(s); - c && n.set("MK", c); - const C = []; - await writeObject(this.ref, n, C, e.xref); - return [{ ref: this.ref, data: C.join(""), xfa: g }]; + ]; } - async _saveRadioButton(e, t, i) { - if (!i) return null; - const a = i.get(this.data.id); - let s = a?.rotation, - r = a?.value; - if (void 0 === s) { - if (void 0 === r) return null; - if ((this.data.fieldValue === this.data.buttonValue) === r) return null; + async _saveRadioButton(evaluator, task, annotationStorage) { + if (!annotationStorage) { + return null; } - const n = e.xref.fetchIfRef(this.ref); - if (!(n instanceof Dict)) return null; - void 0 === r && (r = this.data.fieldValue === this.data.buttonValue); - void 0 === s && (s = this.rotation); - const g = { - path: this.data.fieldName, - value: r ? this.data.buttonValue : "", - }, - o = Name.get(r ? this.data.buttonValue : "Off"), - c = []; - let C = null; - if (r) + const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); + let rotation = storageEntry?.rotation, + value = storageEntry?.value; + if (rotation === undefined && flags === undefined) { + if (value === undefined) { + return null; + } + const defaultValue = this.data.fieldValue === this.data.buttonValue; + if (defaultValue === value) { + return null; + } + } + let dict = evaluator.xref.fetchIfRef(this.ref); + if (!(dict instanceof Dict)) { + return null; + } + dict = dict.clone(); + if (value === undefined) { + value = this.data.fieldValue === this.data.buttonValue; + } + if (rotation === undefined) { + rotation = this.rotation; + } + const xfa = { + path: this.data.fieldName, + value: value ? this.data.buttonValue : "", + }; + const name = Name.get(value ? this.data.buttonValue : "Off"); + const buffer = []; + let parentData = null; + if (value) { if (this.parent instanceof Ref) { - const t = e.xref.fetch(this.parent); - t.set("V", o); - await writeObject(this.parent, t, c, e.xref); - C = c.join(""); - c.length = 0; - } else this.parent instanceof Dict && this.parent.set("V", o); - n.set("AS", o); - n.set("M", `D:${getModificationDate()}`); - const h = this._getMKDict(s); - h && n.set("MK", h); - await writeObject(this.ref, n, c, e.xref); - const l = [{ ref: this.ref, data: c.join(""), xfa: g }]; - C && l.push({ ref: this.parent, data: C, xfa: null }); - return l; + const parent = evaluator.xref.fetch(this.parent); + parent.set("V", name); + await writeObject(this.parent, parent, buffer, evaluator.xref); + parentData = buffer.join(""); + buffer.length = 0; + } else if (this.parent instanceof Dict) { + this.parent.set("V", name); + } + } + if (!this.parent) { + dict.set("V", name); + } + dict.set("AS", name); + dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } + const maybeMK = this._getMKDict(rotation); + if (maybeMK) { + dict.set("MK", maybeMK); + } + await writeObject(this.ref, dict, buffer, evaluator.xref); + const newRefs = [ + { + ref: this.ref, + data: buffer.join(""), + xfa, + }, + ]; + if (parentData) { + newRefs.push({ + ref: this.parent, + data: parentData, + xfa: null, + }); + } + return newRefs; } - _getDefaultCheckedAppearance(e, t) { - const i = this.data.rect[2] - this.data.rect[0], - a = this.data.rect[3] - this.data.rect[1], - s = [0, 0, i, a], - r = 0.8 * Math.min(i, a); - let n, g; - if ("check" === t) { - n = { width: 0.755 * r, height: 0.705 * r }; - g = "3"; - } else if ("disc" === t) { - n = { width: 0.791 * r, height: 0.705 * r }; - g = "l"; - } else unreachable(`_getDefaultCheckedAppearance - unsupported type: ${t}`); - const o = `q BT /PdfJsZaDb ${r} Tf 0 g ${numberToString((i - n.width) / 2)} ${numberToString((a - n.height) / 2)} Td (${g}) Tj ET Q`, - c = new Dict(e.xref); - c.set("FormType", 1); - c.set("Subtype", Name.get("Form")); - c.set("Type", Name.get("XObject")); - c.set("BBox", s); - c.set("Matrix", [1, 0, 0, 1, 0, 0]); - c.set("Length", o.length); - const C = new Dict(e.xref), - h = new Dict(e.xref); - h.set("PdfJsZaDb", this.fallbackFontDict); - C.set("Font", h); - c.set("Resources", C); - this.checkedAppearance = new StringStream(o); - this.checkedAppearance.dict = c; + _getDefaultCheckedAppearance(params, type) { + const width = this.data.rect[2] - this.data.rect[0]; + const height = this.data.rect[3] - this.data.rect[1]; + const bbox = [0, 0, width, height]; + const FONT_RATIO = 0.8; + const fontSize = Math.min(width, height) * FONT_RATIO; + let metrics, char; + if (type === "check") { + metrics = { + width: 0.755 * fontSize, + height: 0.705 * fontSize, + }; + char = "\x33"; + } else if (type === "disc") { + metrics = { + width: 0.791 * fontSize, + height: 0.705 * fontSize, + }; + char = "\x6C"; + } else { + unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`); + } + const xShift = numberToString((width - metrics.width) / 2); + const yShift = numberToString((height - metrics.height) / 2); + const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; + const appearanceStreamDict = new Dict(params.xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", bbox); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(params.xref); + const font = new Dict(params.xref); + font.set("PdfJsZaDb", this.fallbackFontDict); + resources.set("Font", font); + appearanceStreamDict.set("Resources", resources); + this.checkedAppearance = new StringStream(appearance); + this.checkedAppearance.dict = appearanceStreamDict; this._streams.push(this.checkedAppearance); } - _processCheckBox(e) { - const t = e.dict.get("AP"); - if (!(t instanceof Dict)) return; - const i = t.get("N"); - if (!(i instanceof Dict)) return; - const a = this._decodeFormValue(e.dict.get("AS")); - "string" == typeof a && (this.data.fieldValue = a); - const s = - null !== this.data.fieldValue && "Off" !== this.data.fieldValue - ? this.data.fieldValue - : "Yes", - r = i.getKeys(); - if (0 === r.length) r.push("Off", s); - else if (1 === r.length) "Off" === r[0] ? r.push(s) : r.unshift("Off"); - else if (r.includes(s)) { - r.length = 0; - r.push("Off", s); + _processCheckBox(params) { + const customAppearance = params.dict.get("AP"); + if (!(customAppearance instanceof Dict)) { + return; + } + const normalAppearance = customAppearance.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + const asValue = this._decodeFormValue(params.dict.get("AS")); + if (typeof asValue === "string") { + this.data.fieldValue = asValue; + } + const yes = + this.data.fieldValue !== null && this.data.fieldValue !== "Off" + ? this.data.fieldValue + : "Yes"; + const exportValues = normalAppearance.getKeys(); + if (exportValues.length === 0) { + exportValues.push("Off", yes); + } else if (exportValues.length === 1) { + if (exportValues[0] === "Off") { + exportValues.push(yes); + } else { + exportValues.unshift("Off"); + } + } else if (exportValues.includes(yes)) { + exportValues.length = 0; + exportValues.push("Off", yes); } else { - const e = r.find((e) => "Off" !== e); - r.length = 0; - r.push("Off", e); + const otherYes = exportValues.find((v) => v !== "Off"); + exportValues.length = 0; + exportValues.push("Off", otherYes); + } + if (!exportValues.includes(this.data.fieldValue)) { + this.data.fieldValue = "Off"; + } + this.data.exportValue = exportValues[1]; + const checkedAppearance = normalAppearance.get(this.data.exportValue); + this.checkedAppearance = + checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = + uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "check"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); } - r.includes(this.data.fieldValue) || (this.data.fieldValue = "Off"); - this.data.exportValue = r[1]; - const n = i.get(this.data.exportValue); - this.checkedAppearance = n instanceof BaseStream ? n : null; - const g = i.get("Off"); - this.uncheckedAppearance = g instanceof BaseStream ? g : null; - this.checkedAppearance - ? this._streams.push(this.checkedAppearance) - : this._getDefaultCheckedAppearance(e, "check"); - this.uncheckedAppearance && this._streams.push(this.uncheckedAppearance); this._fallbackFontDict = this.fallbackFontDict; - null === this.data.defaultFieldValue && - (this.data.defaultFieldValue = "Off"); - } - _processRadioButton(e) { - this.data.buttonValue = null; - const t = e.dict.get("Parent"); - if (t instanceof Dict) { - this.parent = e.dict.getRaw("Parent"); - const i = t.get("V"); - i instanceof Name && (this.data.fieldValue = this._decodeFormValue(i)); + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; } - const i = e.dict.get("AP"); - if (!(i instanceof Dict)) return; - const a = i.get("N"); - if (!(a instanceof Dict)) return; - for (const e of a.getKeys()) - if ("Off" !== e) { - this.data.buttonValue = this._decodeFormValue(e); + } + _processRadioButton(params) { + this.data.buttonValue = null; + const fieldParent = params.dict.get("Parent"); + if (fieldParent instanceof Dict) { + this.parent = params.dict.getRaw("Parent"); + const fieldParentValue = fieldParent.get("V"); + if (fieldParentValue instanceof Name) { + this.data.fieldValue = this._decodeFormValue(fieldParentValue); + } + } + const appearanceStates = params.dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof Dict)) { + return; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + this.data.buttonValue = this._decodeFormValue(key); break; } - const s = a.get(this.data.buttonValue); - this.checkedAppearance = s instanceof BaseStream ? s : null; - const r = a.get("Off"); - this.uncheckedAppearance = r instanceof BaseStream ? r : null; - this.checkedAppearance - ? this._streams.push(this.checkedAppearance) - : this._getDefaultCheckedAppearance(e, "disc"); - this.uncheckedAppearance && this._streams.push(this.uncheckedAppearance); + } + const checkedAppearance = normalAppearance.get(this.data.buttonValue); + this.checkedAppearance = + checkedAppearance instanceof BaseStream ? checkedAppearance : null; + const uncheckedAppearance = normalAppearance.get("Off"); + this.uncheckedAppearance = + uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; + if (this.checkedAppearance) { + this._streams.push(this.checkedAppearance); + } else { + this._getDefaultCheckedAppearance(params, "disc"); + } + if (this.uncheckedAppearance) { + this._streams.push(this.uncheckedAppearance); + } this._fallbackFontDict = this.fallbackFontDict; - null === this.data.defaultFieldValue && - (this.data.defaultFieldValue = "Off"); + if (this.data.defaultFieldValue === null) { + this.data.defaultFieldValue = "Off"; + } } - _processPushButton(e) { - const { dict: t, annotationGlobals: i } = e; - if (t.has("A") || t.has("AA") || this.data.alternativeText) { - this.data.isTooltipOnly = !t.has("A") && !t.has("AA"); - Catalog.parseDestDictionary({ - destDict: t, - resultObj: this.data, - docBaseUrl: i.baseUrl, - docAttachments: i.attachments, - }); - } else warn("Push buttons without action dictionaries are not supported"); + _processPushButton(params) { + const { dict, annotationGlobals } = params; + if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) { + warn("Push buttons without action dictionaries are not supported"); + return; + } + this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA"); + Catalog.parseDestDictionary({ + destDict: dict, + resultObj: this.data, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments, + }); } getFieldObject() { - let e, - t = "button"; + let type = "button"; + let exportValues; if (this.data.checkBox) { - t = "checkbox"; - e = this.data.exportValue; + type = "checkbox"; + exportValues = this.data.exportValue; } else if (this.data.radioButton) { - t = "radiobutton"; - e = this.data.buttonValue; + type = "radiobutton"; + exportValues = this.data.buttonValue; } return { id: this.data.id, value: this.data.fieldValue || "Off", defaultValue: this.data.defaultFieldValue, - exportValues: e, + exportValues, editable: !this.data.readOnly, name: this.data.fieldName, rect: this.data.rect, @@ -52880,57 +64177,69 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { strokeColor: this.data.borderColor, fillColor: this.data.backgroundColor, rotation: this.rotation, - type: t, + type, }; } get fallbackFontDict() { - const e = new Dict(); - e.set("BaseFont", Name.get("ZapfDingbats")); - e.set("Type", Name.get("FallbackType")); - e.set("Subtype", Name.get("FallbackType")); - e.set("Encoding", Name.get("ZapfDingbatsEncoding")); - return shadow(this, "fallbackFontDict", e); + const dict = new Dict(); + dict.set("BaseFont", Name.get("ZapfDingbats")); + dict.set("Type", Name.get("FallbackType")); + dict.set("Subtype", Name.get("FallbackType")); + dict.set("Encoding", Name.get("ZapfDingbatsEncoding")); + return shadow(this, "fallbackFontDict", dict); } } class ChoiceWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.indices = t.getArray("I"); + constructor(params) { + super(params); + const { dict, xref } = params; + this.indices = dict.getArray("I"); this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; this.data.options = []; - const a = getInheritableProperty({ dict: t, key: "Opt" }); - if (Array.isArray(a)) - for (let e = 0, t = a.length; e < t; e++) { - const t = i.fetchIfRef(a[e]), - s = Array.isArray(t); - this.data.options[e] = { - exportValue: this._decodeFormValue(s ? i.fetchIfRef(t[0]) : t), - displayValue: this._decodeFormValue(s ? i.fetchIfRef(t[1]) : t), + const options = getInheritableProperty({ + dict, + key: "Opt", + }); + if (Array.isArray(options)) { + 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, + ), }; } - if (this.hasIndices) { + } + if (!this.hasIndices) { + if (typeof this.data.fieldValue === "string") { + this.data.fieldValue = [this.data.fieldValue]; + } else if (!this.data.fieldValue) { + this.data.fieldValue = []; + } + } else { this.data.fieldValue = []; - const e = this.data.options.length; - for (const t of this.indices) - Number.isInteger(t) && - t >= 0 && - t < e && - this.data.fieldValue.push(this.data.options[t].exportValue); - } else - "string" == typeof this.data.fieldValue - ? (this.data.fieldValue = [this.data.fieldValue]) - : this.data.fieldValue || (this.data.fieldValue = []); - this.data.combo = this.hasFieldFlag(gA); - this.data.multiSelect = this.hasFieldFlag(IA); - this._hasText = !0; + const ii = this.data.options.length; + for (const i of this.indices) { + if (Number.isInteger(i) && i >= 0 && i < ii) { + this.data.fieldValue.push(this.data.options[i].exportValue); + } + } + } + this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); + this._hasText = true; } getFieldObject() { - const e = this.data.combo ? "combobox" : "listbox", - t = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; + 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: t, + value, defaultValue: this.data.defaultFieldValue, editable: !this.data.readOnly, name: this.data.fieldName, @@ -52944,98 +64253,149 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation { strokeColor: this.data.borderColor, fillColor: this.data.backgroundColor, rotation: this.rotation, - type: e, + type, }; } - amendSavedDict(e, t) { - if (!this.hasIndices) return; - let i = e?.get(this.data.id)?.value; - Array.isArray(i) || (i = [i]); - const a = [], - { options: s } = this.data; - for (let e = 0, t = 0, r = s.length; e < r; e++) - if (s[e].exportValue === i[t]) { - a.push(e); - t += 1; + amendSavedDict(annotationStorage, dict) { + if (!this.hasIndices) { + return; + } + let values = annotationStorage?.get(this.data.id)?.value; + if (!Array.isArray(values)) { + values = [values]; + } + const indices = []; + const { options } = this.data; + for (let i = 0, j = 0, ii = options.length; i < ii; i++) { + if (options[i].exportValue === values[j]) { + indices.push(i); + j += 1; } - t.set("I", a); + } + dict.set("I", indices); } - async _getAppearance(e, t, i, a) { - if (this.data.combo) return super._getAppearance(e, t, i, a); - let r, n; - const g = a?.get(this.data.id); - if (g) { - n = g.rotation; - r = g.value; + async _getAppearance(evaluator, task, intent, annotationStorage) { + if (this.data.combo) { + return super._getAppearance(evaluator, task, intent, annotationStorage); } - if (void 0 === n && void 0 === r && !this._needAppearances) return null; - void 0 === r ? (r = this.data.fieldValue) : Array.isArray(r) || (r = [r]); - let o = this.data.rect[3] - this.data.rect[1], - c = this.data.rect[2] - this.data.rect[0]; - (90 !== n && 270 !== n) || ([c, o] = [o, c]); - const C = this.data.options.length, - h = []; - for (let e = 0; e < C; e++) { - const { exportValue: t } = this.data.options[e]; - r.includes(t) && h.push(e); + let exportedValue, rotation; + const storageEntry = annotationStorage?.get(this.data.id); + if (storageEntry) { + rotation = storageEntry.rotation; + exportedValue = storageEntry.value; } - this._defaultAppearance || - (this.data.defaultAppearanceData = parseDefaultAppearance( + if ( + rotation === undefined && + exportedValue === undefined && + !this._needAppearances + ) { + return null; + } + if (exportedValue === undefined) { + exportedValue = this.data.fieldValue; + } else if (!Array.isArray(exportedValue)) { + exportedValue = [exportedValue]; + } + const defaultPadding = 1; + const defaultHPadding = 2; + let totalHeight = this.data.rect[3] - this.data.rect[1]; + let totalWidth = this.data.rect[2] - this.data.rect[0]; + if (rotation === 90 || rotation === 270) { + [totalWidth, totalHeight] = [totalHeight, totalWidth]; + } + const lineCount = this.data.options.length; + const valueIndices = []; + for (let i = 0; i < lineCount; i++) { + const { exportValue } = this.data.options[i]; + if (exportedValue.includes(exportValue)) { + valueIndices.push(i); + } + } + if (!this._defaultAppearance) { + this.data.defaultAppearanceData = parseDefaultAppearance( (this._defaultAppearance = "/Helvetica 0 Tf 0 g"), - )); - const l = await WidgetAnnotation._getFontData( - e, - t, + ); + } + const font = await WidgetAnnotation._getFontData( + evaluator, + task, this.data.defaultAppearanceData, this._fieldResources.mergedResources, ); - let Q, - { fontSize: E } = this.data.defaultAppearanceData; - if (E) Q = this._defaultAppearance; - else { - const e = (o - 1) / C; - let t, - i = -1; - for (const { displayValue: e } of this.data.options) { - const a = this._getTextWidth(e, l); - if (a > i) { - i = a; - t = e; + let defaultAppearance; + let { fontSize } = this.data.defaultAppearanceData; + if (!fontSize) { + const lineHeight = (totalHeight - defaultPadding) / lineCount; + let lineWidth = -1; + let value; + for (const { displayValue } of this.data.options) { + const width = this._getTextWidth(displayValue, font); + if (width > lineWidth) { + lineWidth = width; + value = displayValue; } } - [Q, E] = this._computeFontSize(e, c - 4, t, l, -1); + [defaultAppearance, fontSize] = this._computeFontSize( + lineHeight, + totalWidth - 2 * defaultHPadding, + value, + font, + -1, + ); + } else { + defaultAppearance = this._defaultAppearance; } - const u = E * s, - d = (u - E) / 2, - f = Math.floor(o / u); - let p = 0; - if (h.length > 0) { - const e = Math.min(...h), - t = Math.max(...h); - p = Math.max(0, t - f + 1); - p > e && (p = e); + const lineHeight = fontSize * LINE_FACTOR; + const vPadding = (lineHeight - fontSize) / 2; + const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); + let firstIndex = 0; + if (valueIndices.length > 0) { + const minIndex = Math.min(...valueIndices); + const maxIndex = Math.max(...valueIndices); + firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1); + if (firstIndex > minIndex) { + firstIndex = minIndex; + } } - const m = Math.min(p + f + 1, C), - y = ["/Tx BMC q", `1 1 ${c} ${o} re W n`]; - if (h.length) { - y.push("0.600006 0.756866 0.854904 rg"); - for (const e of h) - p <= e && e < m && y.push(`1 ${o - (e - p + 1) * u} ${c} ${u} re f`); + const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); + const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; + if (valueIndices.length) { + buf.push("0.600006 0.756866 0.854904 rg"); + for (const index of valueIndices) { + if (firstIndex <= index && index < end) { + buf.push( + `1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`, + ); + } + } } - y.push("BT", Q, `1 0 0 1 0 ${o} Tm`); - const w = { shift: 0 }; - for (let e = p; e < m; e++) { - const { displayValue: t } = this.data.options[e], - i = e === p ? d : 0; - y.push(this._renderText(t, l, E, c, 0, w, 2, -u + i)); + buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); + const prevInfo = { + shift: 0, + }; + for (let i = firstIndex; i < end; i++) { + const { displayValue } = this.data.options[i]; + const vpadding = i === firstIndex ? vPadding : 0; + buf.push( + this._renderText( + displayValue, + font, + fontSize, + totalWidth, + 0, + prevInfo, + defaultHPadding, + -lineHeight + vpadding, + ), + ); } - y.push("ET Q EMC"); - return y.join("\n"); + buf.push("ET Q EMC"); + return buf.join("\n"); } } class SignatureWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); + constructor(params) { + super(params); this.data.fieldValue = null; this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = !this.data.hasOwnCanvas; @@ -53050,22 +64410,24 @@ class SignatureWidgetAnnotation extends WidgetAnnotation { } } class TextAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.noRotate = !0; + constructor(params) { + const DEFAULT_ICON_SIZE = 22; + super(params); + this.data.noRotate = true; this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; - const { dict: t } = e; - this.data.annotationType = S; - if (this.data.hasAppearance) this.data.name = "NoIcon"; - else { - this.data.rect[1] = this.data.rect[3] - 22; - this.data.rect[2] = this.data.rect[0] + 22; - this.data.name = t.has("Name") ? t.get("Name").name : "Note"; + this.data.noHTML = false; + const { dict } = params; + this.data.annotationType = AnnotationType.TEXT; + 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 (t.has("State")) { - this.data.state = t.get("State") || null; - this.data.stateModel = t.get("StateModel") || null; + 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; @@ -53073,937 +64435,1117 @@ class TextAnnotation extends MarkupAnnotation { } } class LinkAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t, annotationGlobals: i } = e; - this.data.annotationType = k; - this.data.noHTML = !1; - const a = getQuadPoints(t, this.rectangle); - a && (this.data.quadPoints = a); + constructor(params) { + super(params); + const { dict, annotationGlobals } = params; + this.data.annotationType = AnnotationType.LINK; + this.data.noHTML = false; + const quadPoints = getQuadPoints(dict, this.rectangle); + if (quadPoints) { + this.data.quadPoints = quadPoints; + } this.data.borderColor ||= this.data.color; Catalog.parseDestDictionary({ - destDict: t, + destDict: dict, resultObj: this.data, - docBaseUrl: i.baseUrl, - docAttachments: i.attachments, + docBaseUrl: annotationGlobals.baseUrl, + docAttachments: annotationGlobals.attachments, }); } } class PopupAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t } = e; - this.data.annotationType = q; - this.data.noHTML = !1; - (this.data.rect[0] !== this.data.rect[2] && - this.data.rect[1] !== this.data.rect[3]) || - (this.data.rect = null); - let i = t.get("Parent"); - if (!i) { + constructor(params) { + super(params); + const { dict } = params; + this.data.annotationType = AnnotationType.POPUP; + this.data.noHTML = false; + if ( + this.data.rect[0] === this.data.rect[2] || + this.data.rect[1] === this.data.rect[3] + ) { + this.data.rect = null; + } + let parentItem = dict.get("Parent"); + if (!parentItem) { warn("Popup annotation has a missing or invalid parent annotation."); return; } - this.data.parentRect = lookupNormalRect(i.getArray("Rect"), null); - isName(i.get("RT"), j) && (i = i.get("IRT")); - if (i.has("M")) { - this.setModificationDate(i.get("M")); - this.data.modificationDate = this.modificationDate; - } else this.data.modificationDate = null; - if (i.has("C")) { - this.setColor(i.getArray("C")); - this.data.color = this.color; - } else this.data.color = null; - if (!this.viewable) { - const e = i.get("F"); - this._isViewable(e) && this.setFlags(e); + this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); + const rt = parentItem.get("RT"); + if (isName(rt, AnnotationReplyType.GROUP)) { + parentItem = parentItem.get("IRT"); } - this.setTitle(i.get("T")); + if (!parentItem.has("M")) { + this.data.modificationDate = null; + } else { + this.setModificationDate(parentItem.get("M")); + this.data.modificationDate = this.modificationDate; + } + if (!parentItem.has("C")) { + this.data.color = null; + } else { + this.setColor(parentItem.getArray("C")); + this.data.color = this.color; + } + if (!this.viewable) { + const parentFlags = parentItem.get("F"); + if (this._isViewable(parentFlags)) { + this.setFlags(parentFlags); + } + } + this.setTitle(parentItem.get("T")); this.data.titleObj = this._title; - this.setContents(i.get("Contents")); + this.setContents(parentItem.get("Contents")); this.data.contentsObj = this._contents; - i.has("RC") && - (this.data.richText = XFAFactory.getRichTextAsHtml(i.get("RC"))); - this.data.open = !!t.get("Open"); + if (parentItem.has("RC")) { + this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); + } + this.data.open = !!dict.get("Open"); } } class FreeTextAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.hasOwnCanvas = !this.data.noHTML; - this.data.noHTML = !1; - const { evaluatorOptions: t, xref: i } = e; - this.data.annotationType = R; - this.setDefaultAppearance(e); + constructor(params) { + super(params); + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + const { evaluatorOptions, xref } = params; + this.data.annotationType = AnnotationType.FREETEXT; + this.setDefaultAppearance(params); this._hasAppearance = !!this.appearance; if (this._hasAppearance) { - const { fontColor: e, fontSize: a } = (function parseAppearanceStream( - e, - t, - i, - ) { - return new AppearanceStreamEvaluator(e, t, i).parse(); - })(this.appearance, t, i); - this.data.defaultAppearanceData.fontColor = e; - this.data.defaultAppearanceData.fontSize = a || 10; + const { fontColor, fontSize } = parseAppearanceStream( + this.appearance, + evaluatorOptions, + xref, + ); + this.data.defaultAppearanceData.fontColor = fontColor; + this.data.defaultAppearanceData.fontSize = fontSize || 10; } else { this.data.defaultAppearanceData.fontSize ||= 10; - const { fontColor: t, fontSize: a } = this.data.defaultAppearanceData; + const { fontColor, fontSize } = this.data.defaultAppearanceData; if (this._contents.str) { this.data.textContent = this._contents.str .split(/\r\n?|\n/) - .map((e) => e.trimEnd()); - const { - coords: e, - bbox: t, - matrix: i, - } = FakeUnicodeFont.getFirstPositionInfo( + .map((line) => line.trimEnd()); + const { coords, bbox, matrix } = FakeUnicodeFont.getFirstPositionInfo( this.rectangle, this.rotation, - a, + fontSize, ); - this.data.textPosition = this._transformPoint(e, t, i); + this.data.textPosition = this._transformPoint(coords, bbox, matrix); } if (this._isOffscreenCanvasSupported) { - const s = e.dict.get("CA"), - r = new FakeUnicodeFont(i, "sans-serif"); - this.appearance = r.createAppearance( + const strokeAlpha = params.dict.get("CA"); + const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); + this.appearance = fakeUnicodeFont.createAppearance( this._contents.str, this.rectangle, this.rotation, - a, - t, - s, + fontSize, + fontColor, + strokeAlpha, ); this._streams.push(this.appearance); - } else + } else { warn( "FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.", ); + } } } get hasTextContent() { return this._hasAppearance; } - static createNewDict(e, t, { apRef: i, ap: a }) { - const { - color: s, - fontSize: r, - rect: n, - rotation: g, - user: o, - value: c, - } = e, - C = new Dict(t); - C.set("Type", Name.get("Annot")); - C.set("Subtype", Name.get("FreeText")); - C.set("CreationDate", `D:${getModificationDate()}`); - C.set("Rect", n); - const h = `/Helv ${r} Tf ${getPdfColor(s, !0)}`; - C.set("DA", h); - C.set("Contents", isAscii(c) ? c : stringToUTF16String(c, !0)); - C.set("F", 4); - C.set("Border", [0, 0, 0]); - C.set("Rotate", g); - o && C.set("T", isAscii(o) ? o : stringToUTF16String(o, !0)); - if (i || a) { - const e = new Dict(t); - C.set("AP", e); - i ? e.set("N", i) : e.set("N", a); + static createNewDict(annotation, xref, { apRef, ap }) { + const { color, fontSize, oldAnnotation, rect, rotation, user, value } = + annotation; + const freetext = oldAnnotation || new Dict(xref); + freetext.set("Type", Name.get("Annot")); + freetext.set("Subtype", Name.get("FreeText")); + if (oldAnnotation) { + freetext.set("M", `D:${getModificationDate()}`); + freetext.delete("RC"); + } else { + freetext.set("CreationDate", `D:${getModificationDate()}`); } - return C; + freetext.set("Rect", rect); + const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; + freetext.set("DA", da); + freetext.set("Contents", stringToAsciiOrUTF16BE(value)); + freetext.set("F", 4); + freetext.set("Border", [0, 0, 0]); + freetext.set("Rotate", rotation); + if (user) { + freetext.set("T", stringToAsciiOrUTF16BE(user)); + } + if (apRef || ap) { + const n = new Dict(xref); + freetext.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return freetext; } - static async createNewAppearanceStream(e, t, i) { - const { baseFontRef: a, evaluator: r, task: n } = i, - { color: g, fontSize: o, rect: c, rotation: C, value: h } = e, - l = new Dict(t), - Q = new Dict(t); - if (a) Q.set("Helv", a); - else { - const e = new Dict(t); - e.set("BaseFont", Name.get("Helvetica")); - e.set("Type", Name.get("Font")); - e.set("Subtype", Name.get("Type1")); - e.set("Encoding", Name.get("WinAnsiEncoding")); - Q.set("Helv", e); + static async createNewAppearanceStream(annotation, xref, params) { + const { baseFontRef, evaluator, task } = params; + const { color, fontSize, rect, rotation, value } = annotation; + const resources = new Dict(xref); + const font = new Dict(xref); + if (baseFontRef) { + font.set("Helv", baseFontRef); + } else { + const baseFont = new Dict(xref); + baseFont.set("BaseFont", Name.get("Helvetica")); + baseFont.set("Type", Name.get("Font")); + baseFont.set("Subtype", Name.get("Type1")); + baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + font.set("Helv", baseFont); } - l.set("Font", Q); - const E = await WidgetAnnotation._getFontData( - r, - n, - { fontName: "Helv", fontSize: o }, - l, - ), - [u, d, f, p] = c; - let m = f - u, - y = p - d; - C % 180 != 0 && ([m, y] = [y, m]); - const w = h.split("\n"), - D = o / 1e3; - let b = -1 / 0; - const F = []; - for (let e of w) { - const t = E.encodeString(e); - if (t.length > 1) return null; - e = t.join(""); - F.push(e); - let i = 0; - const a = E.charsToGlyphs(e); - for (const e of a) i += e.width * D; - b = Math.max(b, i); + resources.set("Font", font); + const helv = await WidgetAnnotation._getFontData( + evaluator, + task, + { + fontName: "Helv", + fontSize, + }, + resources, + ); + const [x1, y1, x2, y2] = rect; + let w = x2 - x1; + let h = y2 - y1; + if (rotation % 180 !== 0) { + [w, h] = [h, w]; } - let S = 1; - b > m && (S = m / b); - let k = 1; - const R = s * o, - N = 1 * o, - G = R * w.length; - G > y && (k = y / G); - const x = o * Math.min(S, k); - let U, M, L; - switch (C) { + const lines = value.split("\n"); + const scale = fontSize / 1000; + let totalWidth = -Infinity; + const encodedLines = []; + for (let line of lines) { + const encoded = helv.encodeString(line); + if (encoded.length > 1) { + return null; + } + line = encoded.join(""); + encodedLines.push(line); + let lineWidth = 0; + const glyphs = helv.charsToGlyphs(line); + for (const glyph of glyphs) { + lineWidth += glyph.width * scale; + } + totalWidth = Math.max(totalWidth, lineWidth); + } + let hscale = 1; + if (totalWidth > w) { + hscale = w / totalWidth; + } + let vscale = 1; + const lineHeight = LINE_FACTOR * fontSize; + const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; + const totalHeight = lineHeight * lines.length; + if (totalHeight > h) { + vscale = h / totalHeight; + } + const fscale = Math.min(hscale, vscale); + const newFontSize = fontSize * fscale; + let firstPoint, clipBox, matrix; + switch (rotation) { case 0: - L = [1, 0, 0, 1]; - M = [c[0], c[1], m, y]; - U = [c[0], c[3] - N]; + matrix = [1, 0, 0, 1]; + clipBox = [rect[0], rect[1], w, h]; + firstPoint = [rect[0], rect[3] - lineAscent]; break; case 90: - L = [0, 1, -1, 0]; - M = [c[1], -c[2], m, y]; - U = [c[1], -c[0] - N]; + matrix = [0, 1, -1, 0]; + clipBox = [rect[1], -rect[2], w, h]; + firstPoint = [rect[1], -rect[0] - lineAscent]; break; case 180: - L = [-1, 0, 0, -1]; - M = [-c[2], -c[3], m, y]; - U = [-c[2], -c[1] - N]; + matrix = [-1, 0, 0, -1]; + clipBox = [-rect[2], -rect[3], w, h]; + firstPoint = [-rect[2], -rect[1] - lineAscent]; break; case 270: - L = [0, -1, 1, 0]; - M = [-c[3], c[0], m, y]; - U = [-c[3], c[2] - N]; + matrix = [0, -1, 1, 0]; + clipBox = [-rect[3], rect[0], w, h]; + firstPoint = [-rect[3], rect[2] - lineAscent]; + break; } - const H = [ + const buffer = [ "q", - `${L.join(" ")} 0 0 cm`, - `${M.join(" ")} re W n`, - "BT", - `${getPdfColor(g, !0)}`, - `0 Tc /Helv ${numberToString(x)} Tf`, + `${matrix.join(" ")} 0 0 cm`, + `${clipBox.join(" ")} re W n`, + `BT`, + `${getPdfColor(color, true)}`, + `0 Tc /Helv ${numberToString(newFontSize)} Tf`, ]; - H.push(`${U.join(" ")} Td (${escapeString(F[0])}) Tj`); - const J = numberToString(R); - for (let e = 1, t = F.length; e < t; e++) { - const t = F[e]; - H.push(`0 -${J} Td (${escapeString(t)}) Tj`); + buffer.push( + `${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`, + ); + const vShift = numberToString(lineHeight); + for (let i = 1, ii = encodedLines.length; i < ii; i++) { + const line = encodedLines[i]; + buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); } - H.push("ET", "Q"); - const Y = H.join("\n"), - v = new Dict(t); - v.set("FormType", 1); - v.set("Subtype", Name.get("Form")); - v.set("Type", Name.get("XObject")); - v.set("BBox", c); - v.set("Resources", l); - v.set("Matrix", [1, 0, 0, 1, -c[0], -c[1]]); - const K = new StringStream(Y); - K.dict = v; - return K; + buffer.push("ET", "Q"); + const appearance = buffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Resources", resources); + appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } } class LineAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = N; + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.LINE; this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; - const a = lookupRect(t.getArray("L"), [0, 0, 0, 0]); - this.data.lineCoordinates = Util.normalizeRect(a); - this.setLineEndings(t.getArray("LE")); + this.data.noHTML = false; + const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); + this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); + this.setLineEndings(dict.getArray("LE")); this.data.lineEndings = this.lineEndings; if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - s = t.get("CA"), - r = getRgbColor(t.getArray("IC"), null), - n = r ? getPdfColorArray(r) : null, - g = n ? s : null, - o = this.borderStyle.width || 1, - c = 2 * o, - C = [ - this.data.lineCoordinates[0] - c, - this.data.lineCoordinates[1] - c, - this.data.lineCoordinates[2] + c, - this.data.lineCoordinates[3] + c, - ]; - Util.intersect(this.rectangle, C) || (this.rectangle = C); + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + 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 (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } this._setDefaultAppearance({ - xref: i, - extra: `${o} w`, - strokeColor: e, - fillColor: n, - strokeAlpha: s, - fillAlpha: g, - pointsCallback: (e, t) => { - e.push(`${a[0]} ${a[1]} m`, `${a[2]} ${a[3]} l`, "S"); - return [t[0] - o, t[2] + o, t[7] - o, t[3] + o]; + 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] - borderWidth, + points[2] + borderWidth, + points[7] - borderWidth, + points[3] + borderWidth, + ]; }, }); } } } class SquareAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = G; + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.SQUARE; this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; + this.data.noHTML = false; if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"), - s = getRgbColor(t.getArray("IC"), null), - r = s ? getPdfColorArray(s) : null, - n = r ? a : null; - if (0 === this.borderStyle.width && !r) return; + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } this._setDefaultAppearance({ - xref: i, + xref, extra: `${this.borderStyle.width} w`, - strokeColor: e, - fillColor: r, - strokeAlpha: a, - fillAlpha: n, - pointsCallback: (e, t) => { - const i = t[4] + this.borderStyle.width / 2, - a = t[5] + this.borderStyle.width / 2, - s = t[6] - t[4] - this.borderStyle.width, - n = t[3] - t[7] - this.borderStyle.width; - e.push(`${i} ${a} ${s} ${n} re`); - r ? e.push("B") : e.push("S"); - return [t[0], t[2], t[7], t[3]]; + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x = points[4] + this.borderStyle.width / 2; + const y = points[5] + this.borderStyle.width / 2; + const width = points[6] - points[4] - this.borderStyle.width; + const height = points[3] - points[7] - this.borderStyle.width; + buffer.push(`${x} ${y} ${width} ${height} re`); + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; }, }); } } } class CircleAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = x; + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.CIRCLE; if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"), - s = getRgbColor(t.getArray("IC"), null), - r = s ? getPdfColorArray(s) : null, - n = r ? a : null; - if (0 === this.borderStyle.width && !r) return; - const g = (4 / 3) * Math.tan(Math.PI / 8); + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const interiorColor = getRgbColor(dict.getArray("IC"), null); + const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillAlpha = fillColor ? strokeAlpha : null; + if (this.borderStyle.width === 0 && !fillColor) { + return; + } + const controlPointsDistance = (4 / 3) * Math.tan(Math.PI / (2 * 4)); this._setDefaultAppearance({ - xref: i, + xref, extra: `${this.borderStyle.width} w`, - strokeColor: e, - fillColor: r, - strokeAlpha: a, - fillAlpha: n, - pointsCallback: (e, t) => { - const i = t[0] + this.borderStyle.width / 2, - a = t[1] - this.borderStyle.width / 2, - s = t[6] - this.borderStyle.width / 2, - n = t[7] + this.borderStyle.width / 2, - o = i + (s - i) / 2, - c = a + (n - a) / 2, - C = ((s - i) / 2) * g, - h = ((n - a) / 2) * g; - e.push( - `${o} ${n} m`, - `${o + C} ${n} ${s} ${c + h} ${s} ${c} c`, - `${s} ${c - h} ${o + C} ${a} ${o} ${a} c`, - `${o - C} ${a} ${i} ${c - h} ${i} ${c} c`, - `${i} ${c + h} ${o - C} ${n} ${o} ${n} c`, + strokeColor, + fillColor, + strokeAlpha, + fillAlpha, + pointsCallback: (buffer, points) => { + const x0 = points[0] + this.borderStyle.width / 2; + const y0 = points[1] - this.borderStyle.width / 2; + const x1 = points[6] - this.borderStyle.width / 2; + const y1 = points[7] + 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", ); - r ? e.push("B") : e.push("S"); - return [t[0], t[2], t[7], t[3]]; + if (fillColor) { + buffer.push("B"); + } else { + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; }, }); } } } class PolylineAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = M; + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.POLYLINE; this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; + this.data.noHTML = false; this.data.vertices = null; if (!(this instanceof PolygonAnnotation)) { - this.setLineEndings(t.getArray("LE")); + this.setLineEndings(dict.getArray("LE")); this.data.lineEndings = this.lineEndings; } - const a = t.getArray("Vertices"); - if (!isNumberArray(a, null)) return; - const s = (this.data.vertices = Float32Array.from(a)); + const rawVertices = dict.getArray("Vertices"); + if (!isNumberArray(rawVertices, null)) { + return; + } + const vertices = (this.data.vertices = Float32Array.from(rawVertices)); if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"), - r = this.borderStyle.width || 1, - n = 2 * r, - g = [1 / 0, 1 / 0, -1 / 0, -1 / 0]; - for (let e = 0, t = s.length; e < t; e += 2) { - g[0] = Math.min(g[0], s[e] - n); - g[1] = Math.min(g[1], s[e + 1] - n); - g[2] = Math.max(g[2], s[e] + n); - g[3] = Math.max(g[3], s[e + 1] + n); + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust); + } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; } - Util.intersect(this.rectangle, g) || (this.rectangle = g); this._setDefaultAppearance({ - xref: i, - extra: `${r} w`, - strokeColor: e, - strokeAlpha: a, - pointsCallback: (e, t) => { - for (let t = 0, i = s.length; t < i; t += 2) - e.push(`${s[t]} ${s[t + 1]} ${0 === t ? "m" : "l"}`); - e.push("S"); - return [t[0], t[2], t[7], t[3]]; + xref, + extra: `${borderWidth} w`, + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + buffer.push( + `${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`, + ); + } + buffer.push("S"); + return [points[0], points[2], points[7], points[3]]; }, }); } } } class PolygonAnnotation extends PolylineAnnotation { - constructor(e) { - super(e); - this.data.annotationType = U; + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.POLYGON; } } class CaretAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.annotationType = K; + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.CARET; } } class InkAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); + constructor(params) { + super(params); this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; - const { dict: t, xref: i } = e; - this.data.annotationType = T; + this.data.noHTML = false; + const { dict, xref } = params; + this.data.annotationType = AnnotationType.INK; this.data.inkLists = []; - const a = t.getArray("InkList"); - if (Array.isArray(a)) { - for (let e = 0, t = a.length; e < t; ++e) { - if (!Array.isArray(a[e])) continue; - const t = new Float32Array(a[e].length); - this.data.inkLists.push(t); - for (let s = 0, r = a[e].length; s < r; s += 2) { - const r = i.fetchIfRef(a[e][s]), - n = i.fetchIfRef(a[e][s + 1]); - if ("number" == typeof r && "number" == typeof n) { - t[s] = r; - t[s + 1] = n; - } + this.data.isEditable = !this.data.noHTML && this.data.it === "InkHighlight"; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const rawInkLists = dict.getArray("InkList"); + if (!Array.isArray(rawInkLists)) { + return; + } + for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { + if (!Array.isArray(rawInkLists[i])) { + continue; + } + const inkList = new Float32Array(rawInkLists[i].length); + this.data.inkLists.push(inkList); + for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { + const x = xref.fetchIfRef(rawInkLists[i][j]), + y = xref.fetchIfRef(rawInkLists[i][j + 1]); + if (typeof x === "number" && typeof y === "number") { + inkList[j] = x; + inkList[j + 1] = y; } } - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"), - s = this.borderStyle.width || 1, - r = 2 * s, - n = [1 / 0, 1 / 0, -1 / 0, -1 / 0]; - for (const e of this.data.inkLists) - for (let t = 0, i = e.length; t < i; t += 2) { - n[0] = Math.min(n[0], e[t] - r); - n[1] = Math.min(n[1], e[t + 1] - r); - n[2] = Math.max(n[2], e[t] + r); - n[3] = Math.max(n[3], e[t + 1] + r); - } - Util.intersect(this.rectangle, n) || (this.rectangle = n); - this._setDefaultAppearance({ - xref: i, - extra: `${s} w`, - strokeColor: e, - strokeAlpha: a, - pointsCallback: (e, t) => { - for (const t of this.data.inkLists) { - for (let i = 0, a = t.length; i < a; i += 2) - e.push(`${t[i]} ${t[i + 1]} ${0 === i ? "m" : "l"}`); - e.push("S"); - } - return [t[0], t[2], t[7], t[3]]; - }, - }); + } + if (!this.appearance) { + const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); + const borderWidth = this.borderStyle.width || 1, + borderAdjust = 2 * borderWidth; + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust); + bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust); + bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust); + bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust); + } } + if (!Util.intersect(this.rectangle, bbox)) { + this.rectangle = bbox; + } + this._setDefaultAppearance({ + 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 += 2) { + buffer.push( + `${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`, + ); + } + buffer.push("S"); + } + return [points[0], points[2], points[7], points[3]]; + }, + }); } } - static createNewDict(e, t, { apRef: i, ap: a }) { - const { - color: s, - opacity: r, - paths: n, - outlines: g, - rect: o, - rotation: c, - thickness: C, - } = e, - h = new Dict(t); - h.set("Type", Name.get("Annot")); - h.set("Subtype", Name.get("Ink")); - h.set("CreationDate", `D:${getModificationDate()}`); - h.set("Rect", o); - h.set("InkList", g?.points || n.map((e) => e.points)); - h.set("F", 4); - h.set("Rotate", c); - g && h.set("IT", Name.get("InkHighlight")); - const l = new Dict(t); - h.set("BS", l); - l.set("W", C); - h.set( + static createNewDict(annotation, xref, { apRef, ap }) { + const { color, opacity, paths, outlines, rect, rotation, thickness } = + annotation; + const ink = new Dict(xref); + ink.set("Type", Name.get("Annot")); + ink.set("Subtype", Name.get("Ink")); + ink.set("CreationDate", `D:${getModificationDate()}`); + ink.set("Rect", rect); + ink.set("InkList", outlines?.points || paths.map((p) => p.points)); + ink.set("F", 4); + ink.set("Rotate", rotation); + if (outlines) { + ink.set("IT", Name.get("InkHighlight")); + } + const bs = new Dict(xref); + ink.set("BS", bs); + bs.set("W", thickness); + ink.set( "C", - Array.from(s, (e) => e / 255), + Array.from(color, (c) => c / 255), ); - h.set("CA", r); - const Q = new Dict(t); - h.set("AP", Q); - i ? Q.set("N", i) : Q.set("N", a); - return h; + ink.set("CA", opacity); + const n = new Dict(xref); + ink.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + return ink; } - static async createNewAppearanceStream(e, t, i) { - if (e.outlines) return this.createNewAppearanceStreamForHighlight(e, t, i); - const { color: a, rect: s, paths: r, thickness: n, opacity: g } = e, - o = [`${n} w 1 J 1 j`, `${getPdfColor(a, !1)}`]; - 1 !== g && o.push("/R0 gs"); - const c = []; - for (const { bezier: e } of r) { - c.length = 0; - c.push(`${numberToString(e[0])} ${numberToString(e[1])} m`); - if (2 === e.length) - c.push(`${numberToString(e[0])} ${numberToString(e[1])} l S`); - else { - for (let t = 2, i = e.length; t < i; t += 6) { - const i = e - .slice(t, t + 6) + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.outlines) { + return this.createNewAppearanceStreamForHighlight( + annotation, + xref, + params, + ); + } + const { color, rect, paths, thickness, opacity } = annotation; + const appearanceBuffer = [ + `${thickness} w 1 J 1 j`, + `${getPdfColor(color, false)}`, + ]; + if (opacity !== 1) { + appearanceBuffer.push("/R0 gs"); + } + const buffer = []; + for (const { bezier } of paths) { + buffer.length = 0; + buffer.push( + `${numberToString(bezier[0])} ${numberToString(bezier[1])} m`, + ); + if (bezier.length === 2) { + buffer.push( + `${numberToString(bezier[0])} ${numberToString(bezier[1])} l S`, + ); + } else { + for (let i = 2, ii = bezier.length; i < ii; i += 6) { + const curve = bezier + .slice(i, i + 6) .map(numberToString) .join(" "); - c.push(`${i} c`); + buffer.push(`${curve} c`); } - c.push("S"); + buffer.push("S"); } - o.push(c.join("\n")); + appearanceBuffer.push(buffer.join("\n")); } - const C = o.join("\n"), - h = new Dict(t); - h.set("FormType", 1); - h.set("Subtype", Name.get("Form")); - h.set("Type", Name.get("XObject")); - h.set("BBox", s); - h.set("Length", C.length); - if (1 !== g) { - const e = new Dict(t), - i = new Dict(t), - a = new Dict(t); - a.set("CA", g); - a.set("Type", Name.get("ExtGState")); - i.set("R0", a); - e.set("ExtGState", i); - h.set("Resources", e); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + if (opacity !== 1) { + const resources = new Dict(xref); + const extGState = new Dict(xref); + const r0 = new Dict(xref); + r0.set("CA", opacity); + r0.set("Type", Name.get("ExtGState")); + extGState.set("R0", r0); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); } - const l = new StringStream(C); - l.dict = h; - return l; + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } - static async createNewAppearanceStreamForHighlight(e, t, i) { + static async createNewAppearanceStreamForHighlight(annotation, xref, params) { const { - color: a, - rect: s, - outlines: { outline: r }, - opacity: n, - } = e, - g = [`${getPdfColor(a, !0)}`, "/R0 gs"]; - g.push(`${numberToString(r[4])} ${numberToString(r[5])} m`); - for (let e = 6, t = r.length; e < t; e += 6) - if (isNaN(r[e]) || null === r[e]) - g.push(`${numberToString(r[e + 4])} ${numberToString(r[e + 5])} l`); - else { - const t = r - .slice(e, e + 6) + color, + rect, + outlines: { outline }, + opacity, + } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + appearanceBuffer.push( + `${numberToString(outline[4])} ${numberToString(outline[5])} m`, + ); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i]) || outline[i] === null) { + appearanceBuffer.push( + `${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`, + ); + } else { + const curve = outline + .slice(i, i + 6) .map(numberToString) .join(" "); - g.push(`${t} c`); + appearanceBuffer.push(`${curve} c`); } - g.push("h f"); - const o = g.join("\n"), - c = new Dict(t); - c.set("FormType", 1); - c.set("Subtype", Name.get("Form")); - c.set("Type", Name.get("XObject")); - c.set("BBox", s); - c.set("Length", o.length); - const C = new Dict(t), - h = new Dict(t); - C.set("ExtGState", h); - c.set("Resources", C); - const l = new Dict(t); - h.set("R0", l); - l.set("BM", Name.get("Multiply")); - if (1 !== n) { - l.set("ca", n); - l.set("Type", Name.get("ExtGState")); } - const Q = new StringStream(o); - Q.dict = c; - return Q; + appearanceBuffer.push("h f"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } } class HighlightAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = L; - if ((this.data.quadPoints = getQuadPoints(t, null))) { - const e = this.appearance?.dict.get("Resources"); - if (!this.appearance || !e?.has("ExtGState")) { - this.appearance && + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.HIGHLIGHT; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; + const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null)); + if (quadPoints) { + const resources = this.appearance?.dict.get("Resources"); + if (!this.appearance || !resources?.has("ExtGState")) { + if (this.appearance) { warn("HighlightAnnotation - ignoring built-in appearance stream."); - const e = this.color ? getPdfColorArray(this.color) : [1, 1, 0], - a = t.get("CA"); + } + const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; + const fillAlpha = dict.get("CA"); this._setDefaultAppearance({ - xref: i, - fillColor: e, + xref, + fillColor, blendMode: "Multiply", - fillAlpha: a, - pointsCallback: (e, t) => { - e.push( - `${t[0]} ${t[1]} m`, - `${t[2]} ${t[3]} l`, - `${t[6]} ${t[7]} l`, - `${t[4]} ${t[5]} l`, + fillAlpha, + pointsCallback: (buffer, points) => { + buffer.push( + `${points[0]} ${points[1]} m`, + `${points[2]} ${points[3]} l`, + `${points[6]} ${points[7]} l`, + `${points[4]} ${points[5]} l`, "f", ); - return [t[0], t[2], t[7], t[3]]; + return [points[0], points[2], points[7], points[3]]; }, }); } - } else this.data.popupRef = null; + } else { + this.data.popupRef = null; + } } - static createNewDict(e, t, { apRef: i, ap: a }) { - const { - color: s, - opacity: r, - rect: n, - rotation: g, - user: o, - quadPoints: c, - } = e, - C = new Dict(t); - C.set("Type", Name.get("Annot")); - C.set("Subtype", Name.get("Highlight")); - C.set("CreationDate", `D:${getModificationDate()}`); - C.set("Rect", n); - C.set("F", 4); - C.set("Border", [0, 0, 0]); - C.set("Rotate", g); - C.set("QuadPoints", c); - C.set( - "C", - Array.from(s, (e) => e / 255), + static createNewDict(annotation, xref, { apRef, ap }) { + const { color, oldAnnotation, opacity, rect, rotation, user, quadPoints } = + annotation; + const highlight = oldAnnotation || new Dict(xref); + highlight.set("Type", Name.get("Annot")); + highlight.set("Subtype", Name.get("Highlight")); + highlight.set( + oldAnnotation ? "M" : "CreationDate", + `D:${getModificationDate()}`, ); - C.set("CA", r); - o && C.set("T", isAscii(o) ? o : stringToUTF16String(o, !0)); - if (i || a) { - const e = new Dict(t); - C.set("AP", e); - e.set("N", i || a); + highlight.set("CreationDate", `D:${getModificationDate()}`); + highlight.set("Rect", rect); + highlight.set("F", 4); + highlight.set("Border", [0, 0, 0]); + highlight.set("Rotate", rotation); + highlight.set("QuadPoints", quadPoints); + highlight.set( + "C", + Array.from(color, (c) => c / 255), + ); + highlight.set("CA", opacity); + if (user) { + highlight.set("T", stringToAsciiOrUTF16BE(user)); } - return C; + if (apRef || ap) { + const n = new Dict(xref); + highlight.set("AP", n); + n.set("N", apRef || ap); + } + return highlight; } - static async createNewAppearanceStream(e, t, i) { - const { color: a, rect: s, outlines: r, opacity: n } = e, - g = [`${getPdfColor(a, !0)}`, "/R0 gs"], - o = []; - for (const e of r) { - o.length = 0; - o.push(`${numberToString(e[0])} ${numberToString(e[1])} m`); - for (let t = 2, i = e.length; t < i; t += 2) - o.push(`${numberToString(e[t])} ${numberToString(e[t + 1])} l`); - o.push("h"); - g.push(o.join("\n")); + static async createNewAppearanceStream(annotation, xref, params) { + const { color, rect, outlines, opacity } = annotation; + const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; + const buffer = []; + for (const outline of outlines) { + buffer.length = 0; + buffer.push( + `${numberToString(outline[0])} ${numberToString(outline[1])} m`, + ); + for (let i = 2, ii = outline.length; i < ii; i += 2) { + buffer.push( + `${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`, + ); + } + buffer.push("h"); + appearanceBuffer.push(buffer.join("\n")); } - g.push("f*"); - const c = g.join("\n"), - C = new Dict(t); - C.set("FormType", 1); - C.set("Subtype", Name.get("Form")); - C.set("Type", Name.get("XObject")); - C.set("BBox", s); - C.set("Length", c.length); - const h = new Dict(t), - l = new Dict(t); - h.set("ExtGState", l); - C.set("Resources", h); - const Q = new Dict(t); - l.set("R0", Q); - Q.set("BM", Name.get("Multiply")); - if (1 !== n) { - Q.set("ca", n); - Q.set("Type", Name.get("ExtGState")); + appearanceBuffer.push("f*"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + const resources = new Dict(xref); + const extGState = new Dict(xref); + resources.set("ExtGState", extGState); + appearanceStreamDict.set("Resources", resources); + const r0 = new Dict(xref); + extGState.set("R0", r0); + r0.set("BM", Name.get("Multiply")); + if (opacity !== 1) { + r0.set("ca", opacity); + r0.set("Type", Name.get("ExtGState")); } - const E = new StringStream(c); - E.dict = C; - return E; + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } } class UnderlineAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = H; - if ((this.data.quadPoints = getQuadPoints(t, null))) { + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.UNDERLINE; + const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null)); + if (quadPoints) { if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"); + const strokeColor = this.color + ? getPdfColorArray(this.color) + : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ - xref: i, + xref, extra: "[] 0 d 0.571 w", - strokeColor: e, - strokeAlpha: a, - pointsCallback: (e, t) => { - e.push(`${t[4]} ${t[5] + 1.3} m`, `${t[6]} ${t[7] + 1.3} l`, "S"); - return [t[0], t[2], t[7], t[3]]; + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push( + `${points[4]} ${points[5] + 1.3} m`, + `${points[6]} ${points[7] + 1.3} l`, + "S", + ); + return [points[0], points[2], points[7], points[3]]; }, }); } - } else this.data.popupRef = null; + } else { + this.data.popupRef = null; + } } } class SquigglyAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = J; - if ((this.data.quadPoints = getQuadPoints(t, null))) { + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.SQUIGGLY; + const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null)); + if (quadPoints) { if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"); + const strokeColor = this.color + ? getPdfColorArray(this.color) + : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ - xref: i, + xref, extra: "[] 0 d 1 w", - strokeColor: e, - strokeAlpha: a, - pointsCallback: (e, t) => { - const i = (t[1] - t[5]) / 6; - let a = i, - s = t[4]; - const r = t[5], - n = t[6]; - e.push(`${s} ${r + a} m`); + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + const dy = (points[1] - points[5]) / 6; + let shift = dy; + let x = points[4]; + const y = points[5]; + const xEnd = points[6]; + buffer.push(`${x} ${y + shift} m`); do { - s += 2; - a = 0 === a ? i : 0; - e.push(`${s} ${r + a} l`); - } while (s < n); - e.push("S"); - return [t[4], n, r - 2 * i, r + 2 * i]; + x += 2; + shift = shift === 0 ? dy : 0; + buffer.push(`${x} ${y + shift} l`); + } while (x < xEnd); + buffer.push("S"); + return [points[4], xEnd, y - 2 * dy, y + 2 * dy]; }, }); } - } else this.data.popupRef = null; + } else { + this.data.popupRef = null; + } } } class StrikeOutAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e; - this.data.annotationType = Y; - if ((this.data.quadPoints = getQuadPoints(t, null))) { + constructor(params) { + super(params); + const { dict, xref } = params; + this.data.annotationType = AnnotationType.STRIKEOUT; + const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null)); + if (quadPoints) { if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - a = t.get("CA"); + const strokeColor = this.color + ? getPdfColorArray(this.color) + : [0, 0, 0]; + const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ - xref: i, + xref, extra: "[] 0 d 1 w", - strokeColor: e, - strokeAlpha: a, - pointsCallback: (e, t) => { - e.push( - (t[0] + t[4]) / 2 + " " + (t[1] + t[5]) / 2 + " m", - (t[2] + t[6]) / 2 + " " + (t[3] + t[7]) / 2 + " l", + strokeColor, + strokeAlpha, + pointsCallback: (buffer, points) => { + buffer.push( + `${(points[0] + points[4]) / 2} ` + + `${(points[1] + points[5]) / 2} m`, + `${(points[2] + points[6]) / 2} ` + + `${(points[3] + points[7]) / 2} l`, "S", ); - return [t[0], t[2], t[7], t[3]]; + return [points[0], points[2], points[7], points[3]]; }, }); } - } else this.data.popupRef = null; + } else { + this.data.popupRef = null; + } } } class StampAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.annotationType = v; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; + #savedHasOwnCanvas; + constructor(params) { + super(params); + this.data.annotationType = AnnotationType.STAMP; + this.#savedHasOwnCanvas = this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; } - static async createImage(e, t) { - const { width: i, height: a } = e, - s = new OffscreenCanvas(i, a), - r = s.getContext("2d", { alpha: !0 }); - r.drawImage(e, 0, 0); - const n = r.getImageData(0, 0, i, a).data, - g = new Uint32Array(n.buffer), - o = g.some( - FeatureTest.isLittleEndian - ? (e) => e >>> 24 != 255 - : (e) => 255 != (255 & e), - ); - if (o) { - r.fillStyle = "white"; - r.fillRect(0, 0, i, a); - r.drawImage(e, 0, 0); + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + if (isEditing) { + if (!this.data.isEditable) { + return false; + } + this.#savedHasOwnCanvas = this.data.hasOwnCanvas; + this.data.hasOwnCanvas = true; + return true; } - const c = s - .convertToBlob({ type: "image/jpeg", quality: 1 }) - .then((e) => e.arrayBuffer()), - C = Name.get("XObject"), - h = Name.get("Image"), - l = new Dict(t); - l.set("Type", C); - l.set("Subtype", h); - l.set("BitsPerComponent", 8); - l.set("ColorSpace", Name.get("DeviceRGB")); - l.set("Filter", Name.get("DCTDecode")); - l.set("BBox", [0, 0, i, a]); - l.set("Width", i); - l.set("Height", a); - let Q = null; - if (o) { - const e = new Uint8Array(g.length); - if (FeatureTest.isLittleEndian) - for (let t = 0, i = g.length; t < i; t++) e[t] = g[t] >>> 24; - else for (let t = 0, i = g.length; t < i; t++) e[t] = 255 & g[t]; - const s = new Dict(t); - s.set("Type", C); - s.set("Subtype", h); - s.set("BitsPerComponent", 8); - s.set("ColorSpace", Name.get("DeviceGray")); - s.set("Width", i); - s.set("Height", a); - Q = new Stream(e, 0, 0, s); + this.data.hasOwnCanvas = this.#savedHasOwnCanvas; + return !modifiedIds?.has(this.data.id); + } + static async createImage(bitmap, xref) { + const { width, height } = bitmap; + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: true, + }); + ctx.drawImage(bitmap, 0, 0); + const data = ctx.getImageData(0, 0, width, height).data; + const buf32 = new Uint32Array(data.buffer); + const hasAlpha = buf32.some( + FeatureTest.isLittleEndian + ? (x) => x >>> 24 !== 0xff + : (x) => (x & 0xff) !== 0xff, + ); + if (hasAlpha) { + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, width, height); + ctx.drawImage(bitmap, 0, 0); } + const jpegBufferPromise = canvas + .convertToBlob({ + type: "image/jpeg", + quality: 1, + }) + .then((blob) => blob.arrayBuffer()); + const xobjectName = Name.get("XObject"); + const imageName = Name.get("Image"); + const image = new Dict(xref); + image.set("Type", xobjectName); + image.set("Subtype", imageName); + image.set("BitsPerComponent", 8); + image.set("ColorSpace", Name.get("DeviceRGB")); + image.set("Filter", Name.get("DCTDecode")); + image.set("BBox", [0, 0, width, height]); + image.set("Width", width); + image.set("Height", height); + let smaskStream = null; + if (hasAlpha) { + const alphaBuffer = new Uint8Array(buf32.length); + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] >>> 24; + } + } else { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] & 0xff; + } + } + const smask = new Dict(xref); + smask.set("Type", xobjectName); + smask.set("Subtype", imageName); + smask.set("BitsPerComponent", 8); + smask.set("ColorSpace", Name.get("DeviceGray")); + smask.set("Width", width); + smask.set("Height", height); + smaskStream = new Stream(alphaBuffer, 0, 0, smask); + } + const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); return { - imageStream: new Stream(await c, 0, 0, l), - smaskStream: Q, - width: i, - height: a, + imageStream, + smaskStream, + width, + height, }; } - static createNewDict(e, t, { apRef: i, ap: a }) { - const { rect: s, rotation: r, user: n } = e, - g = new Dict(t); - g.set("Type", Name.get("Annot")); - g.set("Subtype", Name.get("Stamp")); - g.set("CreationDate", `D:${getModificationDate()}`); - g.set("Rect", s); - g.set("F", 4); - g.set("Border", [0, 0, 0]); - g.set("Rotate", r); - n && g.set("T", isAscii(n) ? n : stringToUTF16String(n, !0)); - if (i || a) { - const e = new Dict(t); - g.set("AP", e); - i ? e.set("N", i) : e.set("N", a); + static createNewDict(annotation, xref, { apRef, ap }) { + const { oldAnnotation, rect, rotation, user } = annotation; + const stamp = oldAnnotation || new Dict(xref); + stamp.set("Type", Name.get("Annot")); + stamp.set("Subtype", Name.get("Stamp")); + stamp.set( + oldAnnotation ? "M" : "CreationDate", + `D:${getModificationDate()}`, + ); + stamp.set("CreationDate", `D:${getModificationDate()}`); + stamp.set("Rect", rect); + stamp.set("F", 4); + stamp.set("Border", [0, 0, 0]); + stamp.set("Rotate", rotation); + if (user) { + stamp.set("T", stringToAsciiOrUTF16BE(user)); } - return g; + if (apRef || ap) { + const n = new Dict(xref); + stamp.set("AP", n); + if (apRef) { + n.set("N", apRef); + } else { + n.set("N", ap); + } + } + return stamp; } - static async createNewAppearanceStream(e, t, i) { - const { rotation: a } = e, - { imageRef: s, width: r, height: n } = i.image, - g = new Dict(t), - o = new Dict(t); - g.set("XObject", o); - o.set("Im0", s); - const c = `q ${r} 0 0 ${n} 0 0 cm /Im0 Do Q`, - C = new Dict(t); - C.set("FormType", 1); - C.set("Subtype", Name.get("Form")); - C.set("Type", Name.get("XObject")); - C.set("BBox", [0, 0, r, n]); - C.set("Resources", g); - if (a) { - const e = getRotationMatrix(a, r, n); - C.set("Matrix", e); + static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.oldAnnotation) { + return null; } - const h = new StringStream(c); - h.dict = C; - return h; + const { rotation } = annotation; + const { imageRef, width, height } = params.image; + const resources = new Dict(xref); + const xobject = new Dict(xref); + resources.set("XObject", xobject); + xobject.set("Im0", imageRef); + const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.set("Subtype", Name.get("Form")); + appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.set("BBox", [0, 0, width, height]); + appearanceStreamDict.set("Resources", resources); + if (rotation) { + const matrix = getRotationMatrix(rotation, width, height); + appearanceStreamDict.set("Matrix", matrix); + } + const ap = new StringStream(appearance); + ap.dict = appearanceStreamDict; + return ap; } } class FileAttachmentAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: i } = e, - a = new FileSpec(t.get("FS"), i); - this.data.annotationType = O; + constructor(params) { + super(params); + const { dict, xref } = params; + const file = new FileSpec(dict.get("FS"), xref); + this.data.annotationType = AnnotationType.FILEATTACHMENT; this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !1; - this.data.file = a.serializable; - const s = t.get("Name"); - this.data.name = s instanceof Name ? stringToPDFString(s.name) : "PushPin"; - const r = t.get("ca"); - this.data.fillAlpha = "number" == typeof r && r >= 0 && r <= 1 ? r : null; + this.data.noHTML = false; + this.data.file = file.serializable; + const name = dict.get("Name"); + this.data.name = + name instanceof Name ? stringToPDFString(name.name) : "PushPin"; + const fillAlpha = dict.get("ca"); + this.data.fillAlpha = + typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 + ? fillAlpha + : null; } -} -function decodeString(e) { +} // ./src/core/dataset_reader.js + +function decodeString(str) { try { - return stringToUTF8String(e); - } catch (t) { - warn(`UTF-8 decoding failed: "${t}".`); - return e; + return stringToUTF8String(str); + } catch (ex) { + warn(`UTF-8 decoding failed: "${ex}".`); + return str; } } class DatasetXMLParser extends SimpleXMLParser { - constructor(e) { - super(e); + constructor(options) { + super(options); this.node = null; } - onEndElement(e) { - const t = super.onEndElement(e); - if (t && "xfa:datasets" === e) { - this.node = t; + onEndElement(name) { + const node = super.onEndElement(name); + if (node && name === "xfa:datasets") { + this.node = node; throw new Error("Aborting DatasetXMLParser."); } } } class DatasetReader { - constructor(e) { - if (e.datasets) - this.node = new SimpleXMLParser({ hasAttributes: !0 }).parseFromString( - e.datasets, - ).documentElement; - else { - const t = new DatasetXMLParser({ hasAttributes: !0 }); + constructor(data) { + if (data.datasets) { + this.node = new SimpleXMLParser({ + hasAttributes: true, + }).parseFromString(data.datasets).documentElement; + } else { + const parser = new DatasetXMLParser({ + hasAttributes: true, + }); try { - t.parseFromString(e["xdp:xdp"]); + parser.parseFromString(data["xdp:xdp"]); } catch {} - this.node = t.node; + this.node = parser.node; } } - getValue(e) { - if (!this.node || !e) return ""; - const t = this.node.searchNode(parseXFAPath(e), 0); - if (!t) return ""; - const i = t.firstChild; - return "value" === i?.nodeName - ? t.children.map((e) => decodeString(e.textContent)) - : decodeString(t.textContent); + getValue(path) { + if (!this.node || !path) { + return ""; + } + const node = this.node.searchNode(parseXFAPath(path), 0); + if (!node) { + return ""; + } + const first = node.firstChild; + if (first?.nodeName === "value") { + return node.children.map((child) => decodeString(child.textContent)); + } + return decodeString(node.textContent); } -} +} // ./src/core/xref.js + class XRef { - #K = null; - constructor(e, t) { - this.stream = e; - this.pdfManager = t; + #firstXRefStmPos = null; + constructor(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; this.entries = []; this._xrefStms = new Set(); this._cacheMap = new Map(); @@ -54012,25 +65554,26 @@ class XRef { this._newTemporaryRefNum = null; this._persistentRefsCache = null; } - getNewPersistentRef(e) { - null === this._newPersistentRefNum && - (this._newPersistentRefNum = this.entries.length || 1); - const t = this._newPersistentRefNum++; - this._cacheMap.set(t, e); - return Ref.get(t, 0); + getNewPersistentRef(obj) { + if (this._newPersistentRefNum === null) { + this._newPersistentRefNum = this.entries.length || 1; + } + const num = this._newPersistentRefNum++; + this._cacheMap.set(num, obj); + return Ref.get(num, 0); } getNewTemporaryRef() { - if (null === this._newTemporaryRefNum) { + if (this._newTemporaryRefNum === null) { this._newTemporaryRefNum = this.entries.length || 1; if (this._newPersistentRefNum) { this._persistentRefsCache = new Map(); for ( - let e = this._newTemporaryRefNum; - e < this._newPersistentRefNum; - e++ + let i = this._newTemporaryRefNum; + i < this._newPersistentRefNum; + i++ ) { - this._persistentRefsCache.set(e, this._cacheMap.get(e)); - this._cacheMap.delete(e); + this._persistentRefsCache.set(i, this._cacheMap.get(i)); + this._cacheMap.delete(i); } } } @@ -54038,636 +65581,849 @@ class XRef { } resetNewTemporaryRef() { this._newTemporaryRefNum = null; - if (this._persistentRefsCache) - for (const [e, t] of this._persistentRefsCache) this._cacheMap.set(e, t); + if (this._persistentRefsCache) { + for (const [num, obj] of this._persistentRefsCache) { + this._cacheMap.set(num, obj); + } + } this._persistentRefsCache = null; } - setStartXRef(e) { - this.startXRefQueue = [e]; + setStartXRef(startXRef) { + this.startXRefQueue = [startXRef]; } - parse(e = !1) { - let t, i, a; - if (e) { + parse(recoveryMode = false) { + let trailerDict; + if (!recoveryMode) { + trailerDict = this.readXRef(); + } else { warn("Indexing all PDF objects"); - t = this.indexObjects(); - } else t = this.readXRef(); - t.assignXref(this); - this.trailer = t; + trailerDict = this.indexObjects(); + } + trailerDict.assignXref(this); + this.trailer = trailerDict; + let encrypt; try { - i = t.get("Encrypt"); - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`XRef.parse - Invalid "Encrypt" reference: "${e}".`); + encrypt = trailerDict.get("Encrypt"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); } - if (i instanceof Dict) { - const e = t.get("ID"), - a = e?.length ? e[0] : ""; - i.suppressEncryption = !0; - this.encrypt = new CipherTransformFactory(i, a, this.pdfManager.password); + if (encrypt instanceof Dict) { + const ids = trailerDict.get("ID"); + const fileId = ids?.length ? ids[0] : ""; + encrypt.suppressEncryption = true; + this.encrypt = new CipherTransformFactory( + encrypt, + fileId, + this.pdfManager.password, + ); } + let root; try { - a = t.get("Root"); - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`XRef.parse - Invalid "Root" reference: "${e}".`); + root = trailerDict.get("Root"); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); } - if (a instanceof Dict) + if (root instanceof Dict) { try { - if (a.get("Pages") instanceof Dict) { - this.root = a; + const pages = root.get("Pages"); + if (pages instanceof Dict) { + this.root = root; return; } - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`XRef.parse - Invalid "Pages" reference: "${e}".`); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); } - if (!e) throw new XRefParseException(); + } + if (!recoveryMode) { + throw new XRefParseException(); + } throw new InvalidPDFException("Invalid Root reference."); } - processXRefTable(e) { - "tableState" in this || - (this.tableState = { + processXRefTable(parser) { + if (!("tableState" in this)) { + this.tableState = { entryNum: 0, - streamPos: e.lexer.stream.pos, - parserBuf1: e.buf1, - parserBuf2: e.buf2, - }); - if (!isCmd(this.readXRefTable(e), "trailer")) + streamPos: parser.lexer.stream.pos, + parserBuf1: parser.buf1, + parserBuf2: parser.buf2, + }; + } + const obj = this.readXRefTable(parser); + if (!isCmd(obj, "trailer")) { throw new FormatError( "Invalid XRef table: could not find trailer dictionary", ); - let t = e.getObj(); - t instanceof Dict || !t.dict || (t = t.dict); - if (!(t instanceof Dict)) + } + let dict = parser.getObj(); + if (!(dict instanceof Dict) && dict.dict) { + dict = dict.dict; + } + if (!(dict instanceof Dict)) { throw new FormatError( "Invalid XRef table: could not parse trailer dictionary", ); + } delete this.tableState; - return t; + return dict; } - readXRefTable(e) { - const t = e.lexer.stream, - i = this.tableState; - t.pos = i.streamPos; - e.buf1 = i.parserBuf1; - e.buf2 = i.parserBuf2; - let a; - for (;;) { - if (!("firstEntryNum" in i) || !("entryCount" in i)) { - if (isCmd((a = e.getObj()), "trailer")) break; - i.firstEntryNum = a; - i.entryCount = e.getObj(); + 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 (isCmd((obj = parser.getObj()), "trailer")) { + break; + } + tableState.firstEntryNum = obj; + tableState.entryCount = parser.getObj(); } - let s = i.firstEntryNum; - const r = i.entryCount; - if (!Number.isInteger(s) || !Number.isInteger(r)) + let first = tableState.firstEntryNum; + const count = tableState.entryCount; + if (!Number.isInteger(first) || !Number.isInteger(count)) { throw new FormatError( "Invalid XRef table: wrong types in subsection header", ); - for (let a = i.entryNum; a < r; a++) { - i.streamPos = t.pos; - i.entryNum = a; - i.parserBuf1 = e.buf1; - i.parserBuf2 = e.buf2; - const n = {}; - n.offset = e.getObj(); - n.gen = e.getObj(); - const g = e.getObj(); - if (g instanceof Cmd) - switch (g.cmd) { + } + 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 Cmd) { + switch (type.cmd) { case "f": - n.free = !0; + entry.free = true; break; case "n": - n.uncompressed = !0; + entry.uncompressed = true; + break; } + } if ( - !Number.isInteger(n.offset) || - !Number.isInteger(n.gen) || - (!n.free && !n.uncompressed) - ) - throw new FormatError(`Invalid entry in XRef subsection: ${s}, ${r}`); - 0 === a && n.free && 1 === s && (s = 0); - this.entries[a + s] || (this.entries[a + s] = n); + !Number.isInteger(entry.offset) || + !Number.isInteger(entry.gen) || + !(entry.free || entry.uncompressed) + ) { + throw new 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; + } } - i.entryNum = 0; - i.streamPos = t.pos; - i.parserBuf1 = e.buf1; - i.parserBuf2 = e.buf2; - delete i.firstEntryNum; - delete i.entryCount; + tableState.entryNum = 0; + tableState.streamPos = stream.pos; + tableState.parserBuf1 = parser.buf1; + tableState.parserBuf2 = parser.buf2; + delete tableState.firstEntryNum; + delete tableState.entryCount; } - if (this.entries[0] && !this.entries[0].free) + if (this.entries[0] && !this.entries[0].free) { throw new FormatError("Invalid XRef table: unexpected first object"); - return a; + } + return obj; } - processXRefStream(e) { + processXRefStream(stream) { if (!("streamState" in this)) { - const t = e.dict, - i = t.get("W"); - let a = t.get("Index"); - a || (a = [0, t.get("Size")]); + const streamParameters = stream.dict; + const byteWidths = streamParameters.get("W"); + let range = streamParameters.get("Index"); + if (!range) { + range = [0, streamParameters.get("Size")]; + } this.streamState = { - entryRanges: a, - byteWidths: i, + entryRanges: range, + byteWidths, entryNum: 0, - streamPos: e.pos, + streamPos: stream.pos, }; } - this.readXRefStream(e); + this.readXRefStream(stream); delete this.streamState; - return e.dict; + return stream.dict; } - readXRefStream(e) { - const t = this.streamState; - e.pos = t.streamPos; - const [i, a, s] = t.byteWidths, - r = t.entryRanges; - for (; r.length > 0; ) { - const [n, g] = r; - if (!Number.isInteger(n) || !Number.isInteger(g)) - throw new FormatError(`Invalid XRef range fields: ${n}, ${g}`); - if (!Number.isInteger(i) || !Number.isInteger(a) || !Number.isInteger(s)) - throw new FormatError(`Invalid XRef entry fields length: ${n}, ${g}`); - for (let r = t.entryNum; r < g; ++r) { - t.entryNum = r; - t.streamPos = e.pos; - let g = 0, - o = 0, - c = 0; - for (let t = 0; t < i; ++t) { - const t = e.getByte(); - if (-1 === t) + readXRefStream(stream) { + const streamState = this.streamState; + stream.pos = streamState.streamPos; + const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = + streamState.byteWidths; + const entryRanges = streamState.entryRanges; + while (entryRanges.length > 0) { + const [first, n] = entryRanges; + if (!Number.isInteger(first) || !Number.isInteger(n)) { + throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`); + } + if ( + !Number.isInteger(typeFieldWidth) || + !Number.isInteger(offsetFieldWidth) || + !Number.isInteger(generationFieldWidth) + ) { + throw new FormatError( + `Invalid XRef entry fields length: ${first}, ${n}`, + ); + } + for (let i = streamState.entryNum; i < n; ++i) { + streamState.entryNum = i; + streamState.streamPos = stream.pos; + let type = 0, + offset = 0, + generation = 0; + for (let j = 0; j < typeFieldWidth; ++j) { + const typeByte = stream.getByte(); + if (typeByte === -1) { throw new FormatError("Invalid XRef byteWidths 'type'."); - g = (g << 8) | t; + } + type = (type << 8) | typeByte; } - 0 === i && (g = 1); - for (let t = 0; t < a; ++t) { - const t = e.getByte(); - if (-1 === t) + if (typeFieldWidth === 0) { + type = 1; + } + for (let j = 0; j < offsetFieldWidth; ++j) { + const offsetByte = stream.getByte(); + if (offsetByte === -1) { throw new FormatError("Invalid XRef byteWidths 'offset'."); - o = (o << 8) | t; + } + offset = (offset << 8) | offsetByte; } - for (let t = 0; t < s; ++t) { - const t = e.getByte(); - if (-1 === t) + for (let j = 0; j < generationFieldWidth; ++j) { + const generationByte = stream.getByte(); + if (generationByte === -1) { throw new FormatError("Invalid XRef byteWidths 'generation'."); - c = (c << 8) | t; + } + generation = (generation << 8) | generationByte; } - const C = {}; - C.offset = o; - C.gen = c; - switch (g) { + const entry = {}; + entry.offset = offset; + entry.gen = generation; + switch (type) { case 0: - C.free = !0; + entry.free = true; break; case 1: - C.uncompressed = !0; + entry.uncompressed = true; break; case 2: break; default: - throw new FormatError(`Invalid XRef entry type: ${g}`); + throw new FormatError(`Invalid XRef entry type: ${type}`); + } + if (!this.entries[first + i]) { + this.entries[first + i] = entry; } - this.entries[n + r] || (this.entries[n + r] = C); } - t.entryNum = 0; - t.streamPos = e.pos; - r.splice(0, 2); + streamState.entryNum = 0; + streamState.streamPos = stream.pos; + entryRanges.splice(0, 2); } } indexObjects() { - function readToken(e, t) { - let i = "", - a = e[t]; - for (; 10 !== a && 13 !== a && 60 !== a && !(++t >= e.length); ) { - i += String.fromCharCode(a); - a = e[t]; + const TAB = 0x9, + LF = 0xa, + CR = 0xd, + SPACE = 0x20; + const PERCENT = 0x25, + LT = 0x3c; + function readToken(data, offset) { + let token = "", + ch = data[offset]; + while (ch !== LF && ch !== CR && ch !== LT) { + if (++offset >= data.length) { + break; + } + token += String.fromCharCode(ch); + ch = data[offset]; } - return i; + return token; } - function skipUntil(e, t, i) { - const a = i.length, - s = e.length; - let r = 0; - for (; t < s; ) { - let s = 0; - for (; s < a && e[t + s] === i[s]; ) ++s; - if (s >= a) break; - t++; - r++; + function skipUntil(data, offset, what) { + const length = what.length, + dataLength = data.length; + let skipped = 0; + while (offset < dataLength) { + let i = 0; + while (i < length && data[offset + i] === what[i]) { + ++i; + } + if (i >= length) { + break; + } + offset++; + skipped++; } - return r; + return skipped; } - const e = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g, - t = /\b(startxref|\d+\s+\d+\s+obj)\b/g, - i = /^(\d+)\s+(\d+)\s+obj\b/, - a = new Uint8Array([116, 114, 97, 105, 108, 101, 114]), - s = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]), - r = new Uint8Array([47, 88, 82, 101, 102]); + const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g; + const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; + const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; + 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 xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); this.entries.length = 0; this._cacheMap.clear(); - const n = this.stream; - n.pos = 0; - const g = n.getBytes(), - o = bytesToString(g), - c = g.length; - let C = n.start; - const h = [], - l = []; - for (; C < c; ) { - let Q = g[C]; - if (9 === Q || 10 === Q || 13 === Q || 32 === Q) { - ++C; + const stream = this.stream; + stream.pos = 0; + const buffer = stream.getBytes(), + bufferStr = bytesToString(buffer), + length = buffer.length; + let position = stream.start; + const trailers = [], + xrefStms = []; + while (position < length) { + let ch = buffer[position]; + if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { + ++position; continue; } - if (37 === Q) { + if (ch === PERCENT) { do { - ++C; - if (C >= c) break; - Q = g[C]; - } while (10 !== Q && 13 !== Q); + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); continue; } - const E = readToken(g, C); - let u; - if (E.startsWith("xref") && (4 === E.length || /\s/.test(E[4]))) { - C += skipUntil(g, C, a); - h.push(C); - C += skipUntil(g, C, s); - } else if ((u = i.exec(E))) { - const t = 0 | u[1], - i = 0 | u[2], - a = C + E.length; - let s, - h = !1; - if (this.entries[t]) { - if (this.entries[t].gen === i) - try { - new Parser({ lexer: new Lexer(n.makeSubStream(a)) }).getObj(); - h = !0; - } catch (e) { - e instanceof ParserEOFException - ? warn(`indexObjects -- checking object (${E}): "${e}".`) - : (h = !0); - } - } else h = !0; - h && - (this.entries[t] = { offset: C - n.start, gen: i, uncompressed: !0 }); - e.lastIndex = a; - const Q = e.exec(o); - if (Q) { - s = e.lastIndex + 1 - C; - if ("endobj" !== Q[1]) { - warn( - `indexObjects: Found "${Q[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`, - ); - s -= Q[1].length + 1; - } - } else s = c - C; - const d = g.subarray(C, C + s), - f = skipUntil(d, 0, r); - if (f < s && d[f + 5] < 64) { - l.push(C - n.start); - this._xrefStms.add(C - n.start); - } - C += s; - } else if ( - E.startsWith("trailer") && - (7 === E.length || /\s/.test(E[7])) + const token = readToken(buffer, position); + let m; + if ( + token.startsWith("xref") && + (token.length === 4 || /\s/.test(token[4])) ) { - h.push(C); - const e = C + E.length; - let i; - t.lastIndex = e; - const a = t.exec(o); - if (a) { - i = t.lastIndex + 1 - C; - if ("startxref" !== a[1]) { - warn( - `indexObjects: Found "${a[1]}" after "trailer", caused by missing "startxref" -- trying to recover.`, - ); - i -= a[1].length + 1; + 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; + const startPos = position + token.length; + let contentLength, + updateEntries = false; + if (!this.entries[num]) { + updateEntries = true; + } else if (this.entries[num].gen === gen) { + try { + const parser = new Parser({ + lexer: new Lexer(stream.makeSubStream(startPos)), + }); + parser.getObj(); + updateEntries = true; + } catch (ex) { + if (ex instanceof ParserEOFException) { + warn(`indexObjects -- checking object (${token}): "${ex}".`); + } else { + updateEntries = true; + } } - } else i = c - C; - C += i; - } else C += E.length + 1; + } + if (updateEntries) { + this.entries[num] = { + offset: position - stream.start, + gen, + uncompressed: true, + }; + } + gEndobjRegExp.lastIndex = startPos; + const match = gEndobjRegExp.exec(bufferStr); + if (match) { + const endPos = gEndobjRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "endobj") { + warn( + `indexObjects: Found "${match[1]}" inside of another "obj", ` + + 'caused by missing "endobj" -- trying to recover.', + ); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + const content = buffer.subarray(position, position + contentLength); + const xrefTagOffset = skipUntil(content, 0, xrefBytes); + if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { + xrefStms.push(position - stream.start); + this._xrefStms.add(position - stream.start); + } + position += contentLength; + } else if ( + token.startsWith("trailer") && + (token.length === 7 || /\s/.test(token[7])) + ) { + trailers.push(position); + const startPos = position + token.length; + let contentLength; + gStartxrefRegExp.lastIndex = startPos; + const match = gStartxrefRegExp.exec(bufferStr); + if (match) { + const endPos = gStartxrefRegExp.lastIndex + 1; + contentLength = endPos - position; + if (match[1] !== "startxref") { + warn( + `indexObjects: Found "${match[1]}" after "trailer", ` + + 'caused by missing "startxref" -- trying to recover.', + ); + contentLength -= match[1].length + 1; + } + } else { + contentLength = length - position; + } + position += contentLength; + } else { + position += token.length + 1; + } } - for (const e of l) { - this.startXRefQueue.push(e); - this.readXRef(!0); + for (const xrefStm of xrefStms) { + this.startXRefQueue.push(xrefStm); + this.readXRef(true); } - const Q = []; - let E, - u, - d = !1; - for (const e of h) { - n.pos = e; - const t = new Parser({ - lexer: new Lexer(n), + const trailerDicts = []; + let isEncrypted = false; + for (const trailer of trailers) { + stream.pos = trailer; + const parser = new Parser({ + lexer: new Lexer(stream), xref: this, - allowStreams: !0, - recoveryMode: !0, + allowStreams: true, + recoveryMode: true, }); - if (!isCmd(t.getObj(), "trailer")) continue; - const i = t.getObj(); - if (i instanceof Dict) { - Q.push(i); - i.has("Encrypt") && (d = !0); - } - } - for (const e of [...Q, "genFallback", ...Q]) { - if ("genFallback" === e) { - if (!u) break; - this._generationFallback = !0; + const obj = parser.getObj(); + if (!isCmd(obj, "trailer")) { continue; } - let t = !1; + const dict = parser.getObj(); + if (!(dict instanceof Dict)) { + continue; + } + trailerDicts.push(dict); + if (dict.has("Encrypt")) { + isEncrypted = true; + } + } + let trailerDict, trailerError; + for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) { + if (dict === "genFallback") { + if (!trailerError) { + break; + } + this._generationFallback = true; + continue; + } + let validPagesDict = false; try { - const i = e.get("Root"); - if (!(i instanceof Dict)) continue; - const a = i.get("Pages"); - if (!(a instanceof Dict)) continue; - const s = a.get("Count"); - Number.isInteger(s) && (t = !0); - } catch (e) { - u = e; + const rootDict = dict.get("Root"); + if (!(rootDict instanceof Dict)) { + continue; + } + const pagesDict = rootDict.get("Pages"); + if (!(pagesDict instanceof Dict)) { + continue; + } + const pagesCount = pagesDict.get("Count"); + if (Number.isInteger(pagesCount)) { + validPagesDict = true; + } + } catch (ex) { + trailerError = ex; continue; } - if (t && (!d || e.has("Encrypt")) && e.has("ID")) return e; - E = e; + if ( + validPagesDict && + (!isEncrypted || dict.has("Encrypt")) && + dict.has("ID") + ) { + return dict; + } + trailerDict = dict; + } + if (trailerDict) { + return trailerDict; + } + if (this.topDict) { + return this.topDict; } - if (E) return E; - if (this.topDict) return this.topDict; throw new InvalidPDFException("Invalid PDF structure."); } - readXRef(e = !1) { - const t = this.stream, - i = new Set(); - for (; this.startXRefQueue.length; ) { + readXRef(recoveryMode = false) { + const stream = this.stream; + const startXRefParsedCache = new Set(); + while (this.startXRefQueue.length) { try { - const e = this.startXRefQueue[0]; - if (i.has(e)) { + const startXRef = this.startXRefQueue[0]; + if (startXRefParsedCache.has(startXRef)) { warn("readXRef - skipping XRef table since it was already parsed."); this.startXRefQueue.shift(); continue; } - i.add(e); - t.pos = e + t.start; - const a = new Parser({ - lexer: new Lexer(t), + startXRefParsedCache.add(startXRef); + stream.pos = startXRef + stream.start; + const parser = new Parser({ + lexer: new Lexer(stream), xref: this, - allowStreams: !0, + allowStreams: true, }); - let s, - r = a.getObj(); - if (isCmd(r, "xref")) { - s = this.processXRefTable(a); - this.topDict || (this.topDict = s); - r = s.get("XRefStm"); - if (Number.isInteger(r) && !this._xrefStms.has(r)) { - this._xrefStms.add(r); - this.startXRefQueue.push(r); - this.#K ??= r; + let obj = parser.getObj(); + let dict; + if (isCmd(obj, "xref")) { + dict = this.processXRefTable(parser); + if (!this.topDict) { + this.topDict = dict; + } + obj = dict.get("XRefStm"); + if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { + this._xrefStms.add(obj); + this.startXRefQueue.push(obj); + this.#firstXRefStmPos ??= obj; + } + } else if (Number.isInteger(obj)) { + if ( + !Number.isInteger(parser.getObj()) || + !isCmd(parser.getObj(), "obj") || + !((obj = parser.getObj()) instanceof BaseStream) + ) { + throw new FormatError("Invalid XRef stream"); + } + dict = this.processXRefStream(obj); + if (!this.topDict) { + this.topDict = dict; + } + if (!dict) { + throw new FormatError("Failed to read XRef stream"); } } else { - if (!Number.isInteger(r)) - throw new FormatError("Invalid XRef stream header"); - if ( - !( - Number.isInteger(a.getObj()) && - isCmd(a.getObj(), "obj") && - (r = a.getObj()) instanceof BaseStream - ) - ) - throw new FormatError("Invalid XRef stream"); - s = this.processXRefStream(r); - this.topDict || (this.topDict = s); - if (!s) throw new FormatError("Failed to read XRef stream"); + throw new FormatError("Invalid XRef stream header"); + } + obj = dict.get("Prev"); + if (Number.isInteger(obj)) { + this.startXRefQueue.push(obj); + } else if (obj instanceof Ref) { + this.startXRefQueue.push(obj.num); } - r = s.get("Prev"); - Number.isInteger(r) - ? this.startXRefQueue.push(r) - : r instanceof Ref && this.startXRefQueue.push(r.num); } catch (e) { - if (e instanceof MissingDataException) throw e; + if (e instanceof MissingDataException) { + throw e; + } info("(while reading XRef): " + e); } this.startXRefQueue.shift(); } - if (this.topDict) return this.topDict; - if (!e) throw new XRefParseException(); + if (this.topDict) { + return this.topDict; + } + if (recoveryMode) { + return undefined; + } + throw new XRefParseException(); } get lastXRefStreamPos() { return ( - this.#K ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null) + this.#firstXRefStmPos ?? + (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null) ); } - getEntry(e) { - const t = this.entries[e]; - return t && !t.free && t.offset ? t : null; + getEntry(i) { + const xrefEntry = this.entries[i]; + if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { + return xrefEntry; + } + return null; } - fetchIfRef(e, t = !1) { - return e instanceof Ref ? this.fetch(e, t) : e; + fetchIfRef(obj, suppressEncryption = false) { + if (obj instanceof Ref) { + return this.fetch(obj, suppressEncryption); + } + return obj; } - fetch(e, t = !1) { - if (!(e instanceof Ref)) throw new Error("ref object is not a reference"); - const i = e.num, - a = this._cacheMap.get(i); - if (void 0 !== a) { - a instanceof Dict && !a.objId && (a.objId = e.toString()); - return a; + fetch(ref, suppressEncryption = false) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); } - let s = this.getEntry(i); - if (null === s) { - this._cacheMap.set(i, s); - return s; + const num = ref.num; + const cacheEntry = this._cacheMap.get(num); + if (cacheEntry !== undefined) { + if (cacheEntry instanceof Dict && !cacheEntry.objId) { + cacheEntry.objId = ref.toString(); + } + return cacheEntry; } - if (this._pendingRefs.has(e)) { - this._pendingRefs.remove(e); - warn(`Ignoring circular reference: ${e}.`); - return ft; + let xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + this._cacheMap.set(num, xrefEntry); + return xrefEntry; } - this._pendingRefs.put(e); + if (this._pendingRefs.has(ref)) { + this._pendingRefs.remove(ref); + warn(`Ignoring circular reference: ${ref}.`); + return CIRCULAR_REF; + } + this._pendingRefs.put(ref); try { - s = s.uncompressed - ? this.fetchUncompressed(e, s, t) - : this.fetchCompressed(e, s, t); - this._pendingRefs.remove(e); - } catch (t) { - this._pendingRefs.remove(e); - throw t; + xrefEntry = xrefEntry.uncompressed + ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) + : this.fetchCompressed(ref, xrefEntry, suppressEncryption); + this._pendingRefs.remove(ref); + } catch (ex) { + this._pendingRefs.remove(ref); + throw ex; } - s instanceof Dict - ? (s.objId = e.toString()) - : s instanceof BaseStream && (s.dict.objId = e.toString()); - return s; + if (xrefEntry instanceof Dict) { + xrefEntry.objId = ref.toString(); + } else if (xrefEntry instanceof BaseStream) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; } - fetchUncompressed(e, t, i = !1) { - const a = e.gen; - let s = e.num; - if (t.gen !== a) { - const r = `Inconsistent generation in XRef: ${e}`; - if (this._generationFallback && t.gen < a) { - warn(r); - return this.fetchUncompressed(Ref.get(s, t.gen), t, i); + fetchUncompressed(ref, xrefEntry, suppressEncryption = false) { + const gen = ref.gen; + let num = ref.num; + if (xrefEntry.gen !== gen) { + const msg = `Inconsistent generation in XRef: ${ref}`; + if (this._generationFallback && xrefEntry.gen < gen) { + warn(msg); + return this.fetchUncompressed( + Ref.get(num, xrefEntry.gen), + xrefEntry, + suppressEncryption, + ); } - throw new XRefEntryException(r); + throw new XRefEntryException(msg); } - const r = this.stream.makeSubStream(t.offset + this.stream.start), - n = new Parser({ lexer: new Lexer(r), xref: this, allowStreams: !0 }), - g = n.getObj(), - o = n.getObj(), - c = n.getObj(); - if (g !== s || o !== a || !(c instanceof Cmd)) - throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`); - if ("obj" !== c.cmd) { - if (c.cmd.startsWith("obj")) { - s = parseInt(c.cmd.substring(3), 10); - if (!Number.isNaN(s)) return s; + const stream = this.stream.makeSubStream( + xrefEntry.offset + this.stream.start, + ); + const parser = new Parser({ + lexer: new 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 Cmd)) { + throw new 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; + } } - throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`); + throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); } - (t = - this.encrypt && !i - ? n.getObj(this.encrypt.createCipherTransform(s, a)) - : n.getObj()) instanceof BaseStream || this._cacheMap.set(s, t); - return t; + xrefEntry = + this.encrypt && !suppressEncryption + ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) + : parser.getObj(); + if (!(xrefEntry instanceof BaseStream)) { + this._cacheMap.set(num, xrefEntry); + } + return xrefEntry; } - fetchCompressed(e, t, i = !1) { - const a = t.offset, - s = this.fetch(Ref.get(a, 0)); - if (!(s instanceof BaseStream)) throw new FormatError("bad ObjStm stream"); - const r = s.dict.get("First"), - n = s.dict.get("N"); - if (!Number.isInteger(r) || !Number.isInteger(n)) + fetchCompressed(ref, xrefEntry, suppressEncryption = false) { + const tableOffset = xrefEntry.offset; + const stream = this.fetch(Ref.get(tableOffset, 0)); + if (!(stream instanceof BaseStream)) { + throw new FormatError("bad ObjStm stream"); + } + const first = stream.dict.get("First"); + const n = stream.dict.get("N"); + if (!Number.isInteger(first) || !Number.isInteger(n)) { throw new FormatError("invalid first and n parameters for ObjStm stream"); - let g = new Parser({ lexer: new Lexer(s), xref: this, allowStreams: !0 }); - const o = new Array(n), - c = new Array(n); - for (let e = 0; e < n; ++e) { - const t = g.getObj(); - if (!Number.isInteger(t)) - throw new FormatError( - `invalid object number in the ObjStm stream: ${t}`, - ); - const i = g.getObj(); - if (!Number.isInteger(i)) - throw new FormatError( - `invalid object offset in the ObjStm stream: ${i}`, - ); - o[e] = t; - c[e] = i; } - const C = (s.start || 0) + r, - h = new Array(n); - for (let e = 0; e < n; ++e) { - const t = e < n - 1 ? c[e + 1] - c[e] : void 0; - if (t < 0) throw new FormatError("Invalid offset in the ObjStm stream."); - g = new Parser({ - lexer: new Lexer(s.makeSubStream(C + c[e], t, s.dict)), + let parser = new Parser({ + lexer: new 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 FormatError( + `invalid object number in the ObjStm stream: ${num}`, + ); + } + const offset = parser.getObj(); + if (!Number.isInteger(offset)) { + throw new FormatError( + `invalid object offset in the ObjStm stream: ${offset}`, + ); + } + nums[i] = num; + offsets[i] = offset; + } + const start = (stream.start || 0) + first; + const entries = new Array(n); + for (let i = 0; i < n; ++i) { + const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; + if (length < 0) { + throw new FormatError("Invalid offset in the ObjStm stream."); + } + parser = new Parser({ + lexer: new Lexer( + stream.makeSubStream(start + offsets[i], length, stream.dict), + ), xref: this, - allowStreams: !0, + allowStreams: true, }); - const i = g.getObj(); - h[e] = i; - if (i instanceof BaseStream) continue; - const r = o[e], - l = this.entries[r]; - l && l.offset === a && l.gen === e && this._cacheMap.set(r, i); + const obj = parser.getObj(); + entries[i] = obj; + if (obj instanceof BaseStream) { + continue; + } + const num = nums[i], + entry = this.entries[num]; + if (entry && entry.offset === tableOffset && entry.gen === i) { + this._cacheMap.set(num, obj); + } } - if (void 0 === (t = h[t.gen])) - throw new XRefEntryException(`Bad (compressed) XRef entry: ${e}`); - return t; + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); + } + return xrefEntry; } - async fetchIfRefAsync(e, t) { - return e instanceof Ref ? this.fetchAsync(e, t) : e; + async fetchIfRefAsync(obj, suppressEncryption) { + if (obj instanceof Ref) { + return this.fetchAsync(obj, suppressEncryption); + } + return obj; } - async fetchAsync(e, t) { + async fetchAsync(ref, suppressEncryption) { try { - return this.fetch(e, t); - } catch (i) { - if (!(i instanceof MissingDataException)) throw i; - await this.pdfManager.requestRange(i.begin, i.end); - return this.fetchAsync(e, t); + return this.fetch(ref, suppressEncryption); + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.pdfManager.requestRange(ex.begin, ex.end); + return this.fetchAsync(ref, suppressEncryption); } } getCatalogObj() { return this.root; } -} -const sg = [0, 0, 612, 792]; +} // ./src/core/document.js + +const DEFAULT_USER_UNIT = 1.0; +const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; class Page { constructor({ - pdfManager: e, - xref: t, - pageIndex: i, - pageDict: a, - ref: s, - globalIdFactory: r, - fontCache: n, - builtInCMapCache: g, - standardFontDataCache: o, - globalImageCache: c, - systemFontCache: C, - nonBlendModesSet: h, - xfaFactory: l, + pdfManager, + xref, + pageIndex, + pageDict, + ref, + globalIdFactory, + fontCache, + builtInCMapCache, + standardFontDataCache, + globalImageCache, + systemFontCache, + nonBlendModesSet, + xfaFactory, }) { - this.pdfManager = e; - this.pageIndex = i; - this.pageDict = a; - this.xref = t; - this.ref = s; - this.fontCache = n; - this.builtInCMapCache = g; - this.standardFontDataCache = o; - this.globalImageCache = c; - this.systemFontCache = C; - this.nonBlendModesSet = h; - this.evaluatorOptions = e.evaluatorOptions; + this.pdfManager = pdfManager; + this.pageIndex = pageIndex; + this.pageDict = pageDict; + this.xref = xref; + this.ref = ref; + this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; + this.standardFontDataCache = standardFontDataCache; + this.globalImageCache = globalImageCache; + this.systemFontCache = systemFontCache; + this.nonBlendModesSet = nonBlendModesSet; + this.evaluatorOptions = pdfManager.evaluatorOptions; this.resourcesPromise = null; - this.xfaFactory = l; - const Q = { obj: 0 }; - this._localIdFactory = class extends r { + this.xfaFactory = xfaFactory; + const idCounters = { + obj: 0, + }; + this._localIdFactory = class extends globalIdFactory { static createObjId() { - return `p${i}_${++Q.obj}`; + return `p${pageIndex}_${++idCounters.obj}`; } static getPageObjId() { - return `p${s.toString()}`; + return `p${ref.toString()}`; } }; } - _getInheritableProperty(e, t = !1) { - const i = getInheritableProperty({ + _getInheritableProperty(key, getArray = false) { + const value = getInheritableProperty({ dict: this.pageDict, - key: e, - getArray: t, - stopWhenFound: !1, + key, + getArray, + stopWhenFound: false, + }); + if (!Array.isArray(value)) { + return value; + } + if (value.length === 1 || !(value[0] instanceof Dict)) { + return value[0]; + } + return Dict.merge({ + xref: this.xref, + dictArray: value, }); - return Array.isArray(i) - ? 1 !== i.length && i[0] instanceof Dict - ? Dict.merge({ xref: this.xref, dictArray: i }) - : i[0] - : i; } get content() { return this.pageDict.getArray("Contents"); } get resources() { - const e = this._getInheritableProperty("Resources"); - return shadow(this, "resources", e instanceof Dict ? e : Dict.empty); + const resources = this._getInheritableProperty("Resources"); + return shadow( + this, + "resources", + resources instanceof Dict ? resources : Dict.empty, + ); } - _getBoundingBox(e) { - if (this.xfaData) return this.xfaData.bbox; - const t = lookupNormalRect(this._getInheritableProperty(e, !0), null); - if (t) { - if (t[2] - t[0] > 0 && t[3] - t[1] > 0) return t; - warn(`Empty, or invalid, /${e} entry.`); + _getBoundingBox(name) { + if (this.xfaData) { + return this.xfaData.bbox; + } + const box = lookupNormalRect( + this._getInheritableProperty(name, true), + null, + ); + if (box) { + if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return box; + } + warn(`Empty, or invalid, /${name} entry.`); } return null; } get mediaBox() { - return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || sg); + return shadow( + this, + "mediaBox", + this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX, + ); } get cropBox() { return shadow( @@ -54677,106 +66433,111 @@ class Page { ); } get userUnit() { - let e = this.pageDict.get("UserUnit"); - ("number" != typeof e || e <= 0) && (e = 1); - return shadow(this, "userUnit", e); + let obj = this.pageDict.get("UserUnit"); + if (typeof obj !== "number" || obj <= 0) { + obj = DEFAULT_USER_UNIT; + } + return shadow(this, "userUnit", obj); } get view() { - const { cropBox: e, mediaBox: t } = this; - if (e !== t && !isArrayEqual(e, t)) { - const i = Util.intersect(e, t); - if (i && i[2] - i[0] > 0 && i[3] - i[1] > 0) - return shadow(this, "view", i); + const { cropBox, mediaBox } = this; + if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) { + const box = Util.intersect(cropBox, mediaBox); + if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { + return shadow(this, "view", box); + } warn("Empty /CropBox and /MediaBox intersection."); } - return shadow(this, "view", t); + return shadow(this, "view", mediaBox); } get rotate() { - let e = this._getInheritableProperty("Rotate") || 0; - e % 90 != 0 - ? (e = 0) - : e >= 360 - ? (e %= 360) - : e < 0 && (e = ((e % 360) + 360) % 360); - return shadow(this, "rotate", e); + let rotate = this._getInheritableProperty("Rotate") || 0; + if (rotate % 90 !== 0) { + rotate = 0; + } else if (rotate >= 360) { + rotate %= 360; + } else if (rotate < 0) { + rotate = ((rotate % 360) + 360) % 360; + } + return shadow(this, "rotate", rotate); } - _onSubStreamError(e, t) { - if (!this.evaluatorOptions.ignoreErrors) throw e; - warn(`getContentStream - ignoring sub-stream (${t}): "${e}".`); + _onSubStreamError(reason, objId) { + if (this.evaluatorOptions.ignoreErrors) { + warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); + return; + } + throw reason; } getContentStream() { - return this.pdfManager - .ensure(this, "content") - .then((e) => - e instanceof BaseStream - ? e - : Array.isArray(e) - ? new StreamsSequenceStream(e, this._onSubStreamError.bind(this)) - : new NullStream(), - ); + return this.pdfManager.ensure(this, "content").then((content) => { + if (content instanceof BaseStream) { + return content; + } + if (Array.isArray(content)) { + return new StreamsSequenceStream( + content, + this._onSubStreamError.bind(this), + ); + } + return new NullStream(); + }); } get xfaData() { return shadow( this, "xfaData", this.xfaFactory - ? { bbox: this.xfaFactory.getBoundingBox(this.pageIndex) } + ? { + bbox: this.xfaFactory.getBoundingBox(this.pageIndex), + } : null, ); } - #T(e, t, i) { - for (const a of e) - if (a.id) { - const e = Ref.fromString(a.id); - if (!e) { - warn(`A non-linked annotation cannot be modified: ${a.id}`); + async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + const promises = []; + for (const annotation of annotations) { + if (annotation.id) { + const ref = Ref.fromString(annotation.id); + if (!ref) { + warn(`A non-linked annotation cannot be modified: ${annotation.id}`); continue; } - if (a.deleted) { - t.put(e, e); + if (annotation.deleted) { + deletedAnnotations.put(ref, ref); + if (annotation.popupRef) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef, popupRef); + } + } continue; } - i?.put(e); - a.ref = e; - delete a.id; + existingAnnotations?.put(ref); + annotation.ref = ref; + promises.push( + this.xref.fetchAsync(ref).then( + (obj) => { + if (obj instanceof Dict) { + annotation.oldAnnotation = obj.clone(); + } + }, + () => { + warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); + }, + ), + ); + delete annotation.id; } + } + await Promise.all(promises); } - async saveNewAnnotations(e, t, i, a) { - if (this.xfaFactory) throw new Error("XFA: Cannot save new annotations."); - const s = new PartialEvaluator({ - xref: this.xref, - handler: e, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions, - }), - r = new RefSetCache(), - n = new RefSet(); - this.#T(i, r, n); - const g = this.pageDict, - o = this.annotations.filter((e) => !(e instanceof Ref && r.has(e))), - c = await AnnotationFactory.saveNewAnnotations(s, t, i, a); - for (const { ref: e } of c.annotations) - e instanceof Ref && !n.has(e) && o.push(e); - const C = g.get("Annots"); - g.set("Annots", o); - const h = []; - await writeObject(this.ref, g, h, this.xref); - C && g.set("Annots", C); - const l = c.dependencies; - l.push({ ref: this.ref, data: h.join("") }, ...c.annotations); - for (const e of r) l.push({ ref: e, data: null }); - return l; - } - save(e, t, i) { - const a = new PartialEvaluator({ + async saveNewAnnotations(handler, task, annotations, imagePromises) { + if (this.xfaFactory) { + throw new Error("XFA: Cannot save new annotations."); + } + const partialEvaluator = new PartialEvaluator({ xref: this.xref, - handler: e, + handler, pageIndex: this.pageIndex, idFactory: this._localIdFactory, fontCache: this.fontCache, @@ -54786,166 +66547,312 @@ class Page { systemFontCache: this.systemFontCache, options: this.evaluatorOptions, }); - return this._parsedAnnotations.then(function (e) { - const s = []; - for (const r of e) - r.mustBePrinted(i) && - s.push( - r.save(a, t, i).catch(function (e) { + const deletedAnnotations = new RefSetCache(); + const existingAnnotations = new RefSet(); + await this.#replaceIdByRef( + annotations, + deletedAnnotations, + existingAnnotations, + ); + const pageDict = this.pageDict; + const annotationsArray = this.annotations.filter( + (a) => !(a instanceof Ref && deletedAnnotations.has(a)), + ); + const newData = await AnnotationFactory.saveNewAnnotations( + partialEvaluator, + task, + annotations, + imagePromises, + ); + for (const { ref } of newData.annotations) { + if (ref instanceof Ref && !existingAnnotations.has(ref)) { + annotationsArray.push(ref); + } + } + const savedDict = pageDict.get("Annots"); + pageDict.set("Annots", annotationsArray); + const buffer = []; + await writeObject(this.ref, pageDict, buffer, this.xref); + if (savedDict) { + pageDict.set("Annots", savedDict); + } + const objects = newData.dependencies; + objects.push( + { + ref: this.ref, + data: buffer.join(""), + }, + ...newData.annotations, + ); + for (const deletedRef of deletedAnnotations) { + objects.push({ + ref: deletedRef, + data: null, + }); + } + return objects; + } + save(handler, task, annotationStorage) { + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions, + }); + return this._parsedAnnotations.then(function (annotations) { + const newRefsPromises = []; + for (const annotation of annotations) { + newRefsPromises.push( + annotation + .save(partialEvaluator, task, annotationStorage) + .catch(function (reason) { warn( - `save - ignoring annotation data during "${t.name}" task: "${e}".`, + "save - ignoring annotation data during " + + `"${task.name}" task: "${reason}".`, ); return null; }), - ); - return Promise.all(s).then(function (e) { - return e.filter((e) => !!e); + ); + } + return Promise.all(newRefsPromises).then(function (newRefs) { + return newRefs.filter((newRef) => !!newRef); }); }); } - loadResources(e) { + loadResources(keys) { this.resourcesPromise ||= this.pdfManager.ensure(this, "resources"); - return this.resourcesPromise.then(() => - new ObjectLoader(this.resources, e, this.xref).load(), - ); + return this.resourcesPromise.then(() => { + const objectLoader = new ObjectLoader(this.resources, keys, this.xref); + return objectLoader.load(); + }); } getOperatorList({ - handler: e, - sink: t, - task: i, - intent: a, - cacheKey: s, - annotationStorage: r = null, + handler, + sink, + task, + intent, + cacheKey, + annotationStorage = null, + modifiedIds = null, }) { - const n = this.getContentStream(), - C = this.loadResources([ - "ColorSpace", - "ExtGState", - "Font", - "Pattern", - "Properties", - "Shading", - "XObject", - ]), - Q = new PartialEvaluator({ - xref: this.xref, - handler: e, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions, - }), - u = this.xfaFactory ? null : getNewAnnotationsMap(r), - d = u?.get(this.pageIndex); - let f = Promise.resolve(null), - p = null; - if (d) { - const e = this.pdfManager.ensureDoc("annotationGlobals"); - let t; - const a = new Set(); - for (const { bitmapId: e, bitmap: t } of d) - !e || t || a.has(e) || a.add(e); - const { isOffscreenCanvasSupported: s } = this.evaluatorOptions; - if (a.size > 0) { - const e = d.slice(); - for (const [t, i] of r) - t.startsWith(E) && i.bitmap && a.has(i.bitmapId) && e.push(i); - t = AnnotationFactory.generateImages(e, this.xref, s); - } else t = AnnotationFactory.generateImages(d, this.xref, s); - p = new RefSet(); - this.#T(d, p, null); - f = e.then((e) => - e ? AnnotationFactory.printNewAnnotations(e, Q, i, d, t) : null, - ); - } - const m = Promise.all([n, C]).then(([r]) => { - const n = new OperatorList(a, t); - e.send("StartRenderPage", { - transparency: Q.hasBlendModes(this.resources, this.nonBlendModesSet), - pageIndex: this.pageIndex, - cacheKey: s, - }); - return Q.getOperatorList({ - stream: r, - task: i, - resources: this.resources, - operatorList: n, - }).then(function () { - return n; - }); + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources([ + "ColorSpace", + "ExtGState", + "Font", + "Pattern", + "Properties", + "Shading", + "XObject", + ]); + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: this.pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions, }); - return Promise.all([m, this._parsedAnnotations, f]).then(function ([ - e, - t, - s, - ]) { - if (s) { - t = t.filter((e) => !(e.ref && p.has(e.ref))); - for (let e = 0, i = s.length; e < i; e++) { - const a = s[e]; - if (a.refToReplace) { - const r = t.findIndex( - (e) => e.ref && isRefsEqual(e.ref, a.refToReplace), + const newAnnotsByPage = !this.xfaFactory + ? getNewAnnotationsMap(annotationStorage) + : null; + const newAnnots = newAnnotsByPage?.get(this.pageIndex); + let newAnnotationsPromise = Promise.resolve(null); + let deletedAnnotations = null; + if (newAnnots) { + const annotationGlobalsPromise = + this.pdfManager.ensureDoc("annotationGlobals"); + let imagePromises; + const missingBitmaps = new Set(); + for (const { bitmapId, bitmap } of newAnnots) { + if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { + missingBitmaps.add(bitmapId); + } + } + const { isOffscreenCanvasSupported } = this.evaluatorOptions; + if (missingBitmaps.size > 0) { + const annotationWithBitmaps = newAnnots.slice(); + for (const [key, annotation] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; + } + if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { + annotationWithBitmaps.push(annotation); + } + } + imagePromises = AnnotationFactory.generateImages( + annotationWithBitmaps, + this.xref, + isOffscreenCanvasSupported, + ); + } else { + imagePromises = AnnotationFactory.generateImages( + newAnnots, + this.xref, + isOffscreenCanvasSupported, + ); + } + deletedAnnotations = new RefSet(); + newAnnotationsPromise = Promise.all([ + annotationGlobalsPromise, + this.#replaceIdByRef(newAnnots, deletedAnnotations, null), + ]).then(([annotationGlobals]) => { + if (!annotationGlobals) { + return null; + } + return AnnotationFactory.printNewAnnotations( + annotationGlobals, + partialEvaluator, + task, + newAnnots, + imagePromises, + ); + }); + } + const pageListPromise = Promise.all([ + contentStreamPromise, + resourcesPromise, + ]).then(([contentStream]) => { + const opList = new OperatorList(intent, sink); + handler.send("StartRenderPage", { + transparency: partialEvaluator.hasBlendModes( + this.resources, + this.nonBlendModesSet, + ), + pageIndex: this.pageIndex, + cacheKey, + }); + return partialEvaluator + .getOperatorList({ + stream: contentStream, + task, + resources: this.resources, + operatorList: opList, + }) + .then(function () { + return opList; + }); + }); + return Promise.all([ + pageListPromise, + this._parsedAnnotations, + newAnnotationsPromise, + ]).then(function ([pageOpList, annotations, newAnnotations]) { + if (newAnnotations) { + annotations = annotations.filter( + (a) => !(a.ref && deletedAnnotations.has(a.ref)), + ); + for (let i = 0, ii = newAnnotations.length; i < ii; i++) { + const newAnnotation = newAnnotations[i]; + if (newAnnotation.refToReplace) { + const j = annotations.findIndex( + (a) => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace), ); - if (r >= 0) { - t.splice(r, 1, a); - s.splice(e--, 1); - i--; + if (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; } } } - t = t.concat(s); + annotations = annotations.concat(newAnnotations); } - if (0 === t.length || a & l) { - e.flush(!0); - return { length: e.totalLength }; + if ( + annotations.length === 0 || + intent & RenderingIntentFlag.ANNOTATIONS_DISABLE + ) { + pageOpList.flush(true); + return { + length: pageOpList.totalLength, + }; } - const n = !!(a & h), - C = !!(a & g), - E = !!(a & o), - u = !!(a & c), - d = []; - for (const e of t) - (C || (E && e.mustBeViewed(r, n)) || (u && e.mustBePrinted(r))) && - d.push( - e.getOperatorList(Q, i, a, n, r).catch(function (e) { - warn( - `getOperatorList - ignoring annotation data during "${i.name}" task: "${e}".`, - ); - return { opList: null, separateForm: !1, separateCanvas: !1 }; - }), + const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), + isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), + intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + const opListPromises = []; + for (const annotation of annotations) { + if ( + intentAny || + (intentDisplay && + annotation.mustBeViewed(annotationStorage, renderForms) && + annotation.mustBeViewedWhenEditing(isEditing, modifiedIds)) || + (intentPrint && annotation.mustBePrinted(annotationStorage)) + ) { + opListPromises.push( + annotation + .getOperatorList( + partialEvaluator, + task, + intent, + annotationStorage, + ) + .catch(function (reason) { + warn( + "getOperatorList - ignoring annotation data during " + + `"${task.name}" task: "${reason}".`, + ); + return { + opList: null, + separateForm: false, + separateCanvas: false, + }; + }), ); - return Promise.all(d).then(function (t) { - let i = !1, - a = !1; - for (const { opList: s, separateForm: r, separateCanvas: n } of t) { - e.addOpList(s); - i ||= r; - a ||= n; } - e.flush(!0, { form: i, canvas: a }); - return { length: e.totalLength }; + } + return Promise.all(opListPromises).then(function (opLists) { + let form = false, + canvas = false; + for (const { opList, separateForm, separateCanvas } of opLists) { + pageOpList.addOpList(opList); + form ||= separateForm; + canvas ||= separateCanvas; + } + pageOpList.flush(true, { + form, + canvas, + }); + return { + length: pageOpList.totalLength, + }; }); }); } async extractTextContent({ - handler: e, - task: t, - includeMarkedContent: i, - disableNormalization: a, - sink: s, + handler, + task, + includeMarkedContent, + disableNormalization, + sink, }) { - const r = this.getContentStream(), - n = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]), - g = this.pdfManager.ensureCatalog("lang"), - [o, , c] = await Promise.all([r, n, g]); - return new PartialEvaluator({ + const contentStreamPromise = this.getContentStream(); + const resourcesPromise = this.loadResources([ + "ExtGState", + "Font", + "Properties", + "XObject", + ]); + const langPromise = this.pdfManager.ensureCatalog("lang"); + const [contentStream, , lang] = await Promise.all([ + contentStreamPromise, + resourcesPromise, + langPromise, + ]); + const partialEvaluator = new PartialEvaluator({ xref: this.xref, - handler: e, + handler, pageIndex: this.pageIndex, idFactory: this._localIdFactory, fontCache: this.fontCache, @@ -54954,45 +66861,55 @@ class Page { globalImageCache: this.globalImageCache, systemFontCache: this.systemFontCache, options: this.evaluatorOptions, - }).getTextContent({ - stream: o, - task: t, + }); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, resources: this.resources, - includeMarkedContent: i, - disableNormalization: a, - sink: s, + includeMarkedContent, + disableNormalization, + sink, viewBox: this.view, - lang: c, + lang, }); } async getStructTree() { - const e = await this.pdfManager.ensureCatalog("structTreeRoot"); - if (!e) return null; + const structTreeRoot = + await this.pdfManager.ensureCatalog("structTreeRoot"); + if (!structTreeRoot) { + return null; + } await this._parsedAnnotations; - return (await this.pdfManager.ensure(this, "_parseStructTree", [e])) - .serializable; + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [ + structTreeRoot, + ]); + return this.pdfManager.ensure(structTree, "serializable"); } - _parseStructTree(e) { - const t = new StructTreePage(e, this.pageDict); - t.parse(this.ref); - return t; + _parseStructTree(structTreeRoot) { + const tree = new StructTreePage(structTreeRoot, this.pageDict); + tree.parse(this.ref); + return tree; } - async getAnnotationsData(e, t, i) { - const a = await this._parsedAnnotations; - if (0 === a.length) return a; - const s = [], - r = []; - let n; - const C = !!(i & g), - h = !!(i & o), - l = !!(i & c); - for (const i of a) { - const a = C || (h && i.viewable); - (a || (l && i.printable)) && s.push(i.data); - if (i.hasTextContent && a) { - n ||= new PartialEvaluator({ + async getAnnotationsData(handler, task, intent) { + const annotations = await this._parsedAnnotations; + if (annotations.length === 0) { + return annotations; + } + const annotationsData = [], + textContentPromises = []; + let partialEvaluator; + const intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + for (const annotation of annotations) { + const isVisible = intentAny || (intentDisplay && annotation.viewable); + if (isVisible || (intentPrint && annotation.printable)) { + annotationsData.push(annotation.data); + } + if (annotation.hasTextContent && isVisible) { + partialEvaluator ||= new PartialEvaluator({ xref: this.xref, - handler: e, + handler, pageIndex: this.pageIndex, idFactory: this._localIdFactory, fontCache: this.fontCache, @@ -55002,122 +66919,162 @@ class Page { systemFontCache: this.systemFontCache, options: this.evaluatorOptions, }); - r.push( - i - .extractTextContent(n, t, [-1 / 0, -1 / 0, 1 / 0, 1 / 0]) - .catch(function (e) { + textContentPromises.push( + annotation + .extractTextContent(partialEvaluator, task, [ + -Infinity, + -Infinity, + Infinity, + Infinity, + ]) + .catch(function (reason) { warn( - `getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`, + `getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`, ); }), ); } } - await Promise.all(r); - return s; + await Promise.all(textContentPromises); + return annotationsData; } get annotations() { - const e = this._getInheritableProperty("Annots"); - return shadow(this, "annotations", Array.isArray(e) ? e : []); + const annots = this._getInheritableProperty("Annots"); + return shadow(this, "annotations", Array.isArray(annots) ? annots : []); } get _parsedAnnotations() { - return shadow( - this, - "_parsedAnnotations", - this.pdfManager.ensure(this, "annotations").then(async (e) => { - if (0 === e.length) return e; - const t = await this.pdfManager.ensureDoc("annotationGlobals"); - if (!t) return []; - const i = []; - for (const a of e) - i.push( + const promise = this.pdfManager + .ensure(this, "annotations") + .then(async (annots) => { + if (annots.length === 0) { + return annots; + } + const [annotationGlobals, fieldObjects] = await Promise.all([ + this.pdfManager.ensureDoc("annotationGlobals"), + this.pdfManager.ensureDoc("fieldObjects"), + ]); + if (!annotationGlobals) { + return []; + } + const orphanFields = fieldObjects?.orphanFields; + const annotationPromises = []; + for (const annotationRef of annots) { + annotationPromises.push( AnnotationFactory.create( this.xref, - a, - t, + annotationRef, + annotationGlobals, this._localIdFactory, - !1, + false, + orphanFields, this.ref, - ).catch(function (e) { - warn(`_parsedAnnotations: "${e}".`); + ).catch(function (reason) { + warn(`_parsedAnnotations: "${reason}".`); return null; }), ); - const a = []; - let s, r; - for (const e of await Promise.all(i)) - e && - (e instanceof WidgetAnnotation - ? (r ||= []).push(e) - : e instanceof PopupAnnotation - ? (s ||= []).push(e) - : a.push(e)); - r && a.push(...r); - s && a.push(...s); - return a; - }), - ); + } + const sortedAnnotations = []; + let popupAnnotations, widgetAnnotations; + for (const annotation of await Promise.all(annotationPromises)) { + if (!annotation) { + continue; + } + if (annotation instanceof WidgetAnnotation) { + (widgetAnnotations ||= []).push(annotation); + continue; + } + if (annotation instanceof PopupAnnotation) { + (popupAnnotations ||= []).push(annotation); + continue; + } + sortedAnnotations.push(annotation); + } + if (widgetAnnotations) { + sortedAnnotations.push(...widgetAnnotations); + } + if (popupAnnotations) { + sortedAnnotations.push(...popupAnnotations); + } + return sortedAnnotations; + }); + return shadow(this, "_parsedAnnotations", promise); } get jsActions() { - return shadow( - this, - "jsActions", - collectActions(this.xref, this.pageDict, fA), + const actions = collectActions( + this.xref, + this.pageDict, + PageActionEventType, ); + return shadow(this, "jsActions", actions); } } -const rg = new Uint8Array([37, 80, 68, 70, 45]), - ng = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]), - gg = new Uint8Array([101, 110, 100, 111, 98, 106]); -function find(e, t, i = 1024, a = !1) { - const s = t.length, - r = e.peekBytes(i), - n = r.length - s; - if (n <= 0) return !1; - if (a) { - const i = s - 1; - let a = r.length - 1; - for (; a >= i; ) { - let n = 0; - for (; n < s && r[a - n] === t[i - n]; ) n++; - if (n >= s) { - e.pos += a - i; - return !0; +const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); +const STARTXREF_SIGNATURE = new Uint8Array([ + 0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66, +]); +const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); +function find(stream, signature, limit = 1024, backwards = false) { + const signatureLength = signature.length; + const scanBytes = stream.peekBytes(limit); + const scanLength = scanBytes.length - signatureLength; + if (scanLength <= 0) { + return false; + } + if (backwards) { + const signatureEnd = signatureLength - 1; + let pos = scanBytes.length - 1; + while (pos >= signatureEnd) { + let j = 0; + while ( + j < signatureLength && + scanBytes[pos - j] === signature[signatureEnd - j] + ) { + j++; } - a--; + if (j >= signatureLength) { + stream.pos += pos - signatureEnd; + return true; + } + pos--; } } else { - let i = 0; - for (; i <= n; ) { - let a = 0; - for (; a < s && r[i + a] === t[a]; ) a++; - if (a >= s) { - e.pos += i; - return !0; + let pos = 0; + while (pos <= scanLength) { + let j = 0; + while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + j++; } - i++; + if (j >= signatureLength) { + stream.pos += pos; + return true; + } + pos++; } } - return !1; + return false; } class PDFDocument { - constructor(e, t) { - if (t.length <= 0) + constructor(pdfManager, stream) { + if (stream.length <= 0) { throw new InvalidPDFException( "The PDF file is empty, i.e. its size is zero bytes.", ); - this.pdfManager = e; - this.stream = t; - this.xref = new XRef(t, e); + } + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new XRef(stream, pdfManager); this._pagePromises = new Map(); this._version = null; - const i = { font: 0 }; + const idCounters = { + font: 0, + }; this._globalIdFactory = class { static getDocId() { - return `g_${e.docId}`; + return `g_${pdfManager.docId}`; } static createFontId() { - return "f" + ++i.font; + return `f${++idCounters.font}`; } static createObjId() { unreachable("Abstract method `createObjId` called."); @@ -55127,320 +67084,447 @@ class PDFDocument { } }; } - parse(e) { - this.xref.parse(e); + parse(recoveryMode) { + this.xref.parse(recoveryMode); this.catalog = new Catalog(this.pdfManager, this.xref); } get linearization() { - let e = null; + let linearization = null; try { - e = Linearization.create(this.stream); - } catch (e) { - if (e instanceof MissingDataException) throw e; - info(e); + linearization = Linearization.create(this.stream); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info(err); } - return shadow(this, "linearization", e); + return shadow(this, "linearization", linearization); } get startXRef() { - const e = this.stream; - let t = 0; + const stream = this.stream; + let startXRef = 0; if (this.linearization) { - e.reset(); - if (find(e, gg)) { - e.skip(6); - let i = e.peekByte(); - for (; isWhiteSpace(i); ) { - e.pos++; - i = e.peekByte(); + stream.reset(); + if (find(stream, ENDOBJ_SIGNATURE)) { + stream.skip(6); + let ch = stream.peekByte(); + while (isWhiteSpace(ch)) { + stream.pos++; + ch = stream.peekByte(); } - t = e.pos - e.start; + startXRef = stream.pos - stream.start; } } else { - const i = 1024, - a = ng.length; - let s = !1, - r = e.end; - for (; !s && r > 0; ) { - r -= i - a; - r < 0 && (r = 0); - e.pos = r; - s = find(e, ng, i, !0); - } - if (s) { - e.skip(9); - let i; - do { - i = e.getByte(); - } while (isWhiteSpace(i)); - let a = ""; - for (; i >= 32 && i <= 57; ) { - a += String.fromCharCode(i); - i = e.getByte(); + const step = 1024; + const startXRefLength = STARTXREF_SIGNATURE.length; + let found = false, + pos = stream.end; + while (!found && pos > 0) { + pos -= step - startXRefLength; + if (pos < 0) { + pos = 0; + } + stream.pos = pos; + found = find(stream, STARTXREF_SIGNATURE, step, true); + } + if (found) { + stream.skip(9); + let ch; + do { + ch = stream.getByte(); + } while (isWhiteSpace(ch)); + let str = ""; + while (ch >= 0x20 && ch <= 0x39) { + str += String.fromCharCode(ch); + ch = stream.getByte(); + } + startXRef = parseInt(str, 10); + if (isNaN(startXRef)) { + startXRef = 0; } - t = parseInt(a, 10); - isNaN(t) && (t = 0); } } - return shadow(this, "startXRef", t); + return shadow(this, "startXRef", startXRef); } checkHeader() { - const e = this.stream; - e.reset(); - if (!find(e, rg)) return; - e.moveStart(); - e.skip(rg.length); - let t, - i = ""; - for (; (t = e.getByte()) > 32 && i.length < 7; ) - i += String.fromCharCode(t); - bt.test(i) ? (this._version = i) : warn(`Invalid PDF header version: ${i}`); + const stream = this.stream; + stream.reset(); + if (!find(stream, PDF_HEADER_SIGNATURE)) { + return; + } + stream.moveStart(); + stream.skip(PDF_HEADER_SIGNATURE.length); + let version = "", + ch; + while ((ch = stream.getByte()) > 0x20 && version.length < 7) { + version += String.fromCharCode(ch); + } + if (PDF_VERSION_REGEXP.test(version)) { + this._version = version; + } else { + warn(`Invalid PDF header version: ${version}`); + } } parseStartXRef() { this.xref.setStartXRef(this.startXRef); } get numPages() { - let e = 0; - e = this.catalog.hasActualNumPages - ? this.catalog.numPages - : this.xfaFactory - ? this.xfaFactory.getNumPages() - : this.linearization - ? this.linearization.numPages - : this.catalog.numPages; - return shadow(this, "numPages", e); + let num = 0; + if (this.catalog.hasActualNumPages) { + num = this.catalog.numPages; + } else if (this.xfaFactory) { + num = this.xfaFactory.getNumPages(); + } else if (this.linearization) { + num = this.linearization.numPages; + } else { + num = this.catalog.numPages; + } + return shadow(this, "numPages", num); } - _hasOnlyDocumentSignatures(e, t = 0) { - return ( - !!Array.isArray(e) && - e.every((e) => { - if (!((e = this.xref.fetchIfRef(e)) instanceof Dict)) return !1; - if (e.has("Kids")) { - if (++t > 10) { - warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); - return !1; - } - return this._hasOnlyDocumentSignatures(e.get("Kids"), t); + _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 Dict)) { + return false; + } + if (field.has("Kids")) { + if (++recursionDepth > RECURSION_LIMIT) { + warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); + return false; } - const i = isName(e.get("FT"), "Sig"), - a = e.get("Rect"), - s = Array.isArray(a) && a.every((e) => 0 === e); - return i && s; - }) - ); + return this._hasOnlyDocumentSignatures( + field.get("Kids"), + recursionDepth, + ); + } + const isSignature = isName(field.get("FT"), "Sig"); + const rectangle = field.get("Rect"); + const isInvisible = + Array.isArray(rectangle) && rectangle.every((value) => value === 0); + return isSignature && isInvisible; + }); } get _xfaStreams() { - const e = this.catalog.acroForm; - if (!e) return null; - const t = e.get("XFA"), - i = { - "xdp:xdp": "", - template: "", - datasets: "", - config: "", - connectionSet: "", - localeSet: "", - stylesheet: "", - "/xdp:xdp": "", - }; - if (t instanceof BaseStream && !t.isEmpty) { - i["xdp:xdp"] = t; - return i; + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return null; } - if (!Array.isArray(t) || 0 === t.length) return null; - for (let e = 0, a = t.length; e < a; e += 2) { - let s; - s = 0 === e ? "xdp:xdp" : e === a - 2 ? "/xdp:xdp" : t[e]; - if (!i.hasOwnProperty(s)) continue; - const r = this.xref.fetchIfRef(t[e + 1]); - r instanceof BaseStream && !r.isEmpty && (i[s] = r); + const xfa = acroForm.get("XFA"); + const entries = { + "xdp:xdp": "", + template: "", + datasets: "", + config: "", + connectionSet: "", + localeSet: "", + stylesheet: "", + "/xdp:xdp": "", + }; + if (xfa instanceof BaseStream && !xfa.isEmpty) { + entries["xdp:xdp"] = xfa; + return entries; } - return i; + 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 (!(data instanceof BaseStream) || data.isEmpty) { + continue; + } + entries[name] = data; + } + return entries; } get xfaDatasets() { - const e = this._xfaStreams; - if (!e) return shadow(this, "xfaDatasets", null); - for (const t of ["datasets", "xdp:xdp"]) { - const i = e[t]; - if (i) - try { - const e = stringToUTF8String(i.getString()); - return shadow(this, "xfaDatasets", new DatasetReader({ [t]: e })); - } catch { - warn("XFA - Invalid utf-8 string."); - break; - } + const streams = this._xfaStreams; + if (!streams) { + return shadow(this, "xfaDatasets", null); + } + for (const key of ["datasets", "xdp:xdp"]) { + const stream = streams[key]; + if (!stream) { + continue; + } + try { + const str = stringToUTF8String(stream.getString()); + const data = { + [key]: str, + }; + return shadow(this, "xfaDatasets", new DatasetReader(data)); + } catch { + warn("XFA - Invalid utf-8 string."); + break; + } } return shadow(this, "xfaDatasets", null); } get xfaData() { - const e = this._xfaStreams; - if (!e) return null; - const t = Object.create(null); - for (const [i, a] of Object.entries(e)) - if (a) - try { - t[i] = stringToUTF8String(a.getString()); - } catch { - warn("XFA - Invalid utf-8 string."); - return null; - } - return t; + const streams = this._xfaStreams; + if (!streams) { + return null; + } + const data = Object.create(null); + for (const [key, stream] of Object.entries(streams)) { + if (!stream) { + continue; + } + try { + data[key] = stringToUTF8String(stream.getString()); + } catch { + warn("XFA - Invalid utf-8 string."); + return null; + } + } + return data; } get xfaFactory() { - let e; - this.pdfManager.enableXfa && + let data; + if ( + this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && - !this.formInfo.hasAcroForm && - (e = this.xfaData); - return shadow(this, "xfaFactory", e ? new XFAFactory(e) : null); + !this.formInfo.hasAcroForm + ) { + data = this.xfaData; + } + return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); } get isPureXfa() { - return !!this.xfaFactory && this.xfaFactory.isValid(); + return this.xfaFactory ? this.xfaFactory.isValid() : false; } get htmlForXfa() { return this.xfaFactory ? this.xfaFactory.getPages() : null; } async loadXfaImages() { - const e = await this.pdfManager.ensureCatalog("xfaImages"); - if (!e) return; - const t = e.getKeys(), - i = new ObjectLoader(e, t, this.xref); - await i.load(); - const a = new Map(); - for (const i of t) { - const t = e.get(i); - t instanceof BaseStream && a.set(i, t.getBytes()); + const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImagesDict) { + return; } - this.xfaFactory.setImages(a); + const keys = xfaImagesDict.getKeys(); + const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); + await objectLoader.load(); + const xfaImages = new Map(); + for (const key of keys) { + const stream = xfaImagesDict.get(key); + if (stream instanceof BaseStream) { + xfaImages.set(key, stream.getBytes()); + } + } + this.xfaFactory.setImages(xfaImages); } - async loadXfaFonts(e, t) { - const i = await this.pdfManager.ensureCatalog("acroForm"); - if (!i) return; - const a = await i.getAsync("DR"); - if (!(a instanceof Dict)) return; - const s = new ObjectLoader(a, ["Font"], this.xref); - await s.load(); - const r = a.get("Font"); - if (!(r instanceof Dict)) return; - const n = Object.assign( + async loadXfaFonts(handler, task) { + const acroForm = await this.pdfManager.ensureCatalog("acroForm"); + if (!acroForm) { + return; + } + const resources = await acroForm.getAsync("DR"); + if (!(resources instanceof Dict)) { + return; + } + const objectLoader = new ObjectLoader(resources, ["Font"], this.xref); + await objectLoader.load(); + const fontRes = resources.get("Font"); + if (!(fontRes instanceof Dict)) { + return; + } + const options = Object.assign( Object.create(null), this.pdfManager.evaluatorOptions, ); - n.useSystemFonts = !1; - const g = new PartialEvaluator({ - xref: this.xref, - handler: e, - pageIndex: -1, - idFactory: this._globalIdFactory, - fontCache: this.catalog.fontCache, - builtInCMapCache: this.catalog.builtInCMapCache, - standardFontDataCache: this.catalog.standardFontDataCache, - options: n, - }), - o = new OperatorList(), - c = [], - C = { - get font() { - return c.at(-1); - }, - set font(e) { - c.push(e); - }, - clone() { - return this; - }, - }, - h = new Map(); - r.forEach((e, t) => { - h.set(e, t); + options.useSystemFonts = false; + const partialEvaluator = new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex: -1, + idFactory: this._globalIdFactory, + fontCache: this.catalog.fontCache, + builtInCMapCache: this.catalog.builtInCMapCache, + standardFontDataCache: this.catalog.standardFontDataCache, + options, }); - const l = []; - for (const [e, i] of h) { - const s = i.get("FontDescriptor"); - if (!(s instanceof Dict)) continue; - let r = s.get("FontFamily"); - r = r.replaceAll(/[ ]+(\d)/g, "$1"); - const n = { - fontFamily: r, - fontWeight: s.get("FontWeight"), - italicAngle: -s.get("ItalicAngle"), + const operatorList = new OperatorList(); + const pdfFonts = []; + const initialState = { + get font() { + return pdfFonts.at(-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 Dict)) { + continue; + } + let fontFamily = descriptor.get("FontFamily"); + fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); + const fontWeight = descriptor.get("FontWeight"); + const italicAngle = -descriptor.get("ItalicAngle"); + const cssFontInfo = { + fontFamily, + fontWeight, + italicAngle, }; - validateCSSFont(n) && - l.push( - g - .handleSetFont(a, [Name.get(e), 1], null, o, t, C, null, n) - .catch(function (e) { - warn(`loadXfaFonts: "${e}".`); + if (!validateCSSFont(cssFontInfo)) { + continue; + } + promises.push( + partialEvaluator + .handleSetFont( + resources, + [Name.get(fontName), 1], + null, + operatorList, + task, + initialState, + null, + cssFontInfo, + ) + .catch(function (reason) { + 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 (!getXfaFontName(`${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 dict = getXfaFontDict(name); + promises.push( + partialEvaluator + .handleSetFont( + resources, + [Name.get(name), 1], + null, + operatorList, + task, + initialState, + dict, + { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle, + }, + ) + .catch(function (reason) { + warn(`loadXfaFonts: "${reason}".`); return null; }), ); + } } - await Promise.all(l); - const Q = this.xfaFactory.setFonts(c); - if (!Q) return; - n.ignoreErrors = !0; - l.length = 0; - c.length = 0; - const E = new Set(); - for (const e of Q) getXfaFontName(`${e}-Regular`) || E.add(e); - E.size && Q.push("PdfJS-Fallback"); - for (const e of Q) - if (!E.has(e)) - for (const i 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 s = `${e}-${i.name}`, - r = getXfaFontDict(s); - l.push( - g - .handleSetFont(a, [Name.get(s), 1], null, o, t, C, r, { - fontFamily: e, - fontWeight: i.fontWeight, - italicAngle: i.italicAngle, - }) - .catch(function (e) { - warn(`loadXfaFonts: "${e}".`); - return null; - }), - ); - } - await Promise.all(l); - this.xfaFactory.appendFonts(c, E); + await Promise.all(promises); + this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); } - async serializeXfaData(e) { - return this.xfaFactory ? this.xfaFactory.serializeData(e) : null; + async serializeXfaData(annotationStorage) { + return this.xfaFactory + ? this.xfaFactory.serializeData(annotationStorage) + : null; } get version() { return this.catalog.version || this._version; } get formInfo() { - const e = { hasFields: !1, hasAcroForm: !1, hasXfa: !1, hasSignatures: !1 }, - t = this.catalog.acroForm; - if (!t) return shadow(this, "formInfo", e); - try { - const i = t.get("Fields"), - a = Array.isArray(i) && i.length > 0; - e.hasFields = a; - const s = t.get("XFA"); - e.hasXfa = - (Array.isArray(s) && s.length > 0) || - (s instanceof BaseStream && !s.isEmpty); - const r = !!(1 & t.get("SigFlags")), - n = r && this._hasOnlyDocumentSignatures(i); - e.hasAcroForm = a && !n; - e.hasSignatures = r; - } catch (e) { - if (e instanceof MissingDataException) throw e; - warn(`Cannot fetch form information: "${e}".`); + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false, + }; + const acroForm = this.catalog.acroForm; + if (!acroForm) { + return shadow(this, "formInfo", formInfo); } - return shadow(this, "formInfo", e); + try { + 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) || + (xfa instanceof BaseStream && !xfa.isEmpty); + const sigFlags = acroForm.get("SigFlags"); + const hasSignatures = !!(sigFlags & 0x1); + const hasOnlyDocumentSignatures = + hasSignatures && this._hasOnlyDocumentSignatures(fields); + formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; + formInfo.hasSignatures = hasSignatures; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Cannot fetch form information: "${ex}".`); + } + return shadow(this, "formInfo", formInfo); } get documentInfo() { - const e = { + const docInfo = { PDFFormatVersion: this.version, Language: this.catalog.lang, EncryptFilterName: this.xref.encrypt @@ -55452,17 +67536,21 @@ class PDFDocument { IsCollectionPresent: !!this.catalog.collection, IsSignaturesPresent: this.formInfo.hasSignatures, }; - let t; + let infoDict; try { - t = this.xref.trailer.get("Info"); - } catch (e) { - if (e instanceof MissingDataException) throw e; + infoDict = this.xref.trailer.get("Info"); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } info("The document information dictionary is invalid."); } - if (!(t instanceof Dict)) return shadow(this, "documentInfo", e); - for (const i of t.getKeys()) { - const a = t.get(i); - switch (i) { + if (!(infoDict instanceof Dict)) { + return shadow(this, "documentInfo", docInfo); + } + for (const key of infoDict.getKeys()) { + const value = infoDict.get(key); + switch (key) { case "Title": case "Author": case "Subject": @@ -55471,295 +67559,396 @@ class PDFDocument { case "Producer": case "CreationDate": case "ModDate": - if ("string" == typeof a) { - e[i] = stringToPDFString(a); + if (typeof value === "string") { + docInfo[key] = stringToPDFString(value); continue; } break; case "Trapped": - if (a instanceof Name) { - e[i] = a; + if (value instanceof Name) { + docInfo[key] = value; continue; } break; default: - let t; - switch (typeof a) { + let customValue; + switch (typeof value) { case "string": - t = stringToPDFString(a); + customValue = stringToPDFString(value); break; case "number": case "boolean": - t = a; + customValue = value; break; default: - a instanceof Name && (t = a); + if (value instanceof Name) { + customValue = value; + } + break; } - if (void 0 === t) { - warn(`Bad value, for custom key "${i}", in Info: ${a}.`); + if (customValue === undefined) { + warn(`Bad value, for custom key "${key}", in Info: ${value}.`); continue; } - e.Custom || (e.Custom = Object.create(null)); - e.Custom[i] = t; + if (!docInfo.Custom) { + docInfo.Custom = Object.create(null); + } + docInfo.Custom[key] = customValue; continue; } - warn(`Bad value, for key "${i}", in Info: ${a}.`); + warn(`Bad value, for key "${key}", in Info: ${value}.`); } - return shadow(this, "documentInfo", e); + return shadow(this, "documentInfo", docInfo); } get fingerprints() { - function validate(e) { + const FINGERPRINT_FIRST_BYTES = 1024; + const EMPTY_FINGERPRINT = "\x00".repeat(16); + function validate(data) { return ( - "string" == typeof e && - e.length > 0 && - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" !== e + typeof data === "string" && + data.length === 16 && + data !== EMPTY_FINGERPRINT ); } - function hexString(e) { - const t = []; - for (const i of e) { - const e = i.toString(16); - t.push(e.padStart(2, "0")); + const id = this.xref.trailer.get("ID"); + let hashOriginal, hashModified; + if (Array.isArray(id) && validate(id[0])) { + hashOriginal = stringToBytes(id[0]); + if (id[1] !== id[0] && validate(id[1])) { + hashModified = stringToBytes(id[1]); } - return t.join(""); + } else { + hashOriginal = calculateMD5( + this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), + 0, + FINGERPRINT_FIRST_BYTES, + ); } - const e = this.xref.trailer.get("ID"); - let t, i; - if (Array.isArray(e) && validate(e[0])) { - t = stringToBytes(e[0]); - e[1] !== e[0] && validate(e[1]) && (i = stringToBytes(e[1])); - } else t = Hs(this.stream.getByteRange(0, 1024), 0, 1024); return shadow(this, "fingerprints", [ - hexString(t), - i ? hexString(i) : null, + toHexUtil(hashOriginal), + hashModified ? toHexUtil(hashModified) : null, ]); } - async _getLinearizationPage(e) { - const { catalog: t, linearization: i, xref: a } = this, - s = Ref.get(i.objectNumberFirst, 0); + async _getLinearizationPage(pageIndex) { + const { catalog, linearization, xref } = this; + const ref = Ref.get(linearization.objectNumberFirst, 0); try { - const e = await a.fetchAsync(s); - if (e instanceof Dict) { - let i = e.getRaw("Type"); - i instanceof Ref && (i = await a.fetchAsync(i)); + const obj = await xref.fetchAsync(ref); + if (obj instanceof Dict) { + let type = obj.getRaw("Type"); + if (type instanceof Ref) { + type = await xref.fetchAsync(type); + } if ( - isName(i, "Page") || - (!e.has("Type") && !e.has("Kids") && e.has("Contents")) + isName(type, "Page") || + (!obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) ) { - t.pageKidsCountCache.has(s) || t.pageKidsCountCache.put(s, 1); - t.pageIndexCache.has(s) || t.pageIndexCache.put(s, 0); - return [e, s]; + if (!catalog.pageKidsCountCache.has(ref)) { + catalog.pageKidsCountCache.put(ref, 1); + } + if (!catalog.pageIndexCache.has(ref)) { + catalog.pageIndexCache.put(ref, 0); + } + return [obj, ref]; } } throw new FormatError( "The Linearization dictionary doesn't point to a valid Page dictionary.", ); - } catch (i) { - warn(`_getLinearizationPage: "${i.message}".`); - return t.getPageDict(e); + } catch (reason) { + warn(`_getLinearizationPage: "${reason.message}".`); + return catalog.getPageDict(pageIndex); } } - getPage(e) { - const t = this._pagePromises.get(e); - if (t) return t; - const { catalog: i, linearization: a, xfaFactory: s } = this; - let r; - r = s - ? Promise.resolve([Dict.empty, null]) - : a?.pageFirst === e - ? this._getLinearizationPage(e) - : i.getPageDict(e); - r = r.then( - ([t, a]) => - new Page({ - pdfManager: this.pdfManager, - xref: this.xref, - pageIndex: e, - pageDict: t, - ref: a, - globalIdFactory: this._globalIdFactory, - fontCache: i.fontCache, - builtInCMapCache: i.builtInCMapCache, - standardFontDataCache: i.standardFontDataCache, - globalImageCache: i.globalImageCache, - systemFontCache: i.systemFontCache, - nonBlendModesSet: i.nonBlendModesSet, - xfaFactory: s, - }), - ); - this._pagePromises.set(e, r); - return r; + getPage(pageIndex) { + const cachedPromise = this._pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; + } + const { catalog, linearization, xfaFactory } = this; + let promise; + if (xfaFactory) { + promise = Promise.resolve([Dict.empty, null]); + } else if (linearization?.pageFirst === pageIndex) { + promise = this._getLinearizationPage(pageIndex); + } else { + promise = catalog.getPageDict(pageIndex); + } + promise = promise.then(([pageDict, ref]) => { + return new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory, + }); + }); + this._pagePromises.set(pageIndex, promise); + return promise; } - async checkFirstPage(e = !1) { - if (!e) - try { - await this.getPage(0); - } catch (e) { - if (e instanceof XRefEntryException) { - this._pagePromises.delete(0); - await this.cleanup(); - throw new XRefParseException(); - } + async checkFirstPage(recoveryMode = false) { + if (recoveryMode) { + return; + } + try { + await this.getPage(0); + } catch (reason) { + if (reason instanceof XRefEntryException) { + this._pagePromises.delete(0); + await this.cleanup(); + throw new XRefParseException(); } + } } - async checkLastPage(e = !1) { - const { catalog: t, pdfManager: i } = this; - t.setActualNumPages(); - let a; + async checkLastPage(recoveryMode = false) { + const { catalog, pdfManager } = this; + catalog.setActualNumPages(); + let numPages; try { await Promise.all([ - i.ensureDoc("xfaFactory"), - i.ensureDoc("linearization"), - i.ensureCatalog("numPages"), + pdfManager.ensureDoc("xfaFactory"), + pdfManager.ensureDoc("linearization"), + pdfManager.ensureCatalog("numPages"), ]); - if (this.xfaFactory) return; - a = this.linearization ? this.linearization.numPages : t.numPages; - if (!Number.isInteger(a)) + if (this.xfaFactory) { + return; + } else if (this.linearization) { + numPages = this.linearization.numPages; + } else { + numPages = catalog.numPages; + } + if (!Number.isInteger(numPages)) { throw new FormatError("Page count is not an integer."); - if (a <= 1) return; - await this.getPage(a - 1); - } catch (s) { - this._pagePromises.delete(a - 1); - await this.cleanup(); - if (s instanceof XRefEntryException && !e) throw new XRefParseException(); - warn(`checkLastPage - invalid /Pages tree /Count: ${a}.`); - let r; - try { - r = await t.getAllPageDicts(e); - } catch (i) { - if (i instanceof XRefEntryException && !e) - throw new XRefParseException(); - t.setActualNumPages(1); + } else if (numPages <= 1) { return; } - for (const [e, [a, s]] of r) { - let r; - if (a instanceof Error) { - r = Promise.reject(a); - r.catch(() => {}); - } else - r = Promise.resolve( + await this.getPage(numPages - 1); + } catch (reason) { + this._pagePromises.delete(numPages - 1); + await this.cleanup(); + if (reason instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); + let pagesTree; + try { + pagesTree = await catalog.getAllPageDicts(recoveryMode); + } catch (reasonAll) { + if (reasonAll instanceof XRefEntryException && !recoveryMode) { + throw new XRefParseException(); + } + catalog.setActualNumPages(1); + return; + } + for (const [pageIndex, [pageDict, ref]] of pagesTree) { + let promise; + if (pageDict instanceof Error) { + promise = Promise.reject(pageDict); + promise.catch(() => {}); + } else { + promise = Promise.resolve( new Page({ - pdfManager: i, + pdfManager, xref: this.xref, - pageIndex: e, - pageDict: a, - ref: s, + pageIndex, + pageDict, + ref, globalIdFactory: this._globalIdFactory, - fontCache: t.fontCache, - builtInCMapCache: t.builtInCMapCache, - standardFontDataCache: t.standardFontDataCache, - globalImageCache: t.globalImageCache, - systemFontCache: t.systemFontCache, - nonBlendModesSet: t.nonBlendModesSet, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, xfaFactory: null, }), ); - this._pagePromises.set(e, r); + } + this._pagePromises.set(pageIndex, promise); } - t.setActualNumPages(r.size); + catalog.setActualNumPages(pagesTree.size); } } - fontFallback(e, t) { - return this.catalog.fontFallback(e, t); + fontFallback(id, handler) { + return this.catalog.fontFallback(id, handler); } - async cleanup(e = !1) { - return this.catalog ? this.catalog.cleanup(e) : clearGlobalCaches(); + async cleanup(manuallyTriggered = false) { + return this.catalog + ? this.catalog.cleanup(manuallyTriggered) + : clearGlobalCaches(); } - async #q(e, t, i, a, s) { - const { xref: r } = this; - if (!(t instanceof Ref) || s.has(t)) return; - s.put(t); - const n = await r.fetchAsync(t); - if (!(n instanceof Dict)) return; - if (n.has("T")) { - const t = stringToPDFString(await n.getAsync("T")); - e = "" === e ? t : `${e}.${t}`; + async #collectFieldObjects( + name, + parentRef, + fieldRef, + promises, + annotationGlobals, + visitedRefs, + orphanFields, + ) { + const { xref } = this; + if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) { + return; + } + visitedRefs.put(fieldRef); + const field = await xref.fetchAsync(fieldRef); + if (!(field instanceof Dict)) { + return; + } + if (field.has("T")) { + const partName = stringToPDFString(await field.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; } else { - let t = n; - for (;;) { - t = t.getRaw("Parent"); - if (t instanceof Ref) { - if (s.has(t)) break; - t = await r.fetchAsync(t); + let obj = field; + while (true) { + obj = obj.getRaw("Parent") || parentRef; + if (obj instanceof Ref) { + if (visitedRefs.has(obj)) { + break; + } + obj = await xref.fetchAsync(obj); } - if (!(t instanceof Dict)) break; - if (t.has("T")) { - const i = stringToPDFString(await t.getAsync("T")); - e = "" === e ? i : `${e}.${i}`; + if (!(obj instanceof Dict)) { + break; + } + if (obj.has("T")) { + const partName = stringToPDFString(await obj.getAsync("T")); + name = name === "" ? partName : `${name}.${partName}`; break; } } } - i.has(e) || i.set(e, []); - i.get(e).push( - AnnotationFactory.create(r, t, a, null, !0, null) - .then((e) => e?.getFieldObject()) - .catch(function (e) { - warn(`#collectFieldObjects: "${e}".`); + if ( + parentRef && + !field.has("Parent") && + isName(field.get("Subtype"), "Widget") + ) { + orphanFields.put(fieldRef, parentRef); + } + if (!promises.has(name)) { + promises.set(name, []); + } + promises.get(name).push( + AnnotationFactory.create( + xref, + fieldRef, + annotationGlobals, + null, + true, + orphanFields, + null, + ) + .then((annotation) => annotation?.getFieldObject()) + .catch(function (reason) { + warn(`#collectFieldObjects: "${reason}".`); return null; }), ); - if (!n.has("Kids")) return; - const g = await n.getAsync("Kids"); - if (Array.isArray(g)) for (const t of g) await this.#q(e, t, i, a, s); + if (!field.has("Kids")) { + return; + } + const kids = await field.getAsync("Kids"); + if (Array.isArray(kids)) { + for (const kid of kids) { + await this.#collectFieldObjects( + name, + fieldRef, + kid, + promises, + annotationGlobals, + visitedRefs, + orphanFields, + ); + } + } } get fieldObjects() { - if (!this.formInfo.hasFields) - return shadow(this, "fieldObjects", Promise.resolve(null)); - return shadow( - this, - "fieldObjects", - Promise.all([ - this.pdfManager.ensureDoc("annotationGlobals"), - this.pdfManager.ensureCatalog("acroForm"), - ]).then(async ([e, t]) => { - if (!e) return null; - const i = new RefSet(), - a = Object.create(null), - s = new Map(); - for (const a of await t.getAsync("Fields")) - await this.#q("", a, s, e, i); - const r = []; - for (const [e, t] of s) - r.push( - Promise.all(t).then((t) => { - (t = t.filter((e) => !!e)).length > 0 && (a[e] = t); + const promise = this.pdfManager + .ensureDoc("formInfo") + .then(async (formInfo) => { + if (!formInfo.hasFields) { + return null; + } + const [annotationGlobals, acroForm] = await Promise.all([ + this.pdfManager.ensureDoc("annotationGlobals"), + this.pdfManager.ensureCatalog("acroForm"), + ]); + if (!annotationGlobals) { + return null; + } + const visitedRefs = new RefSet(); + const allFields = Object.create(null); + const fieldPromises = new Map(); + const orphanFields = new RefSetCache(); + for (const fieldRef of await acroForm.getAsync("Fields")) { + await this.#collectFieldObjects( + "", + null, + fieldRef, + fieldPromises, + annotationGlobals, + visitedRefs, + orphanFields, + ); + } + const allPromises = []; + for (const [name, promises] of fieldPromises) { + allPromises.push( + Promise.all(promises).then((fields) => { + fields = fields.filter((field) => !!field); + if (fields.length > 0) { + allFields[name] = fields; + } }), ); - await Promise.all(r); - return a; - }), - ); + } + await Promise.all(allPromises); + return { + allFields, + orphanFields, + }; + }); + return shadow(this, "fieldObjects", promise); } get hasJSActions() { - return shadow( - this, - "hasJSActions", - this.pdfManager.ensureDoc("_parseHasJSActions"), - ); + const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); + return shadow(this, "hasJSActions", promise); } async _parseHasJSActions() { - const [e, t] = await Promise.all([ + const [catalogJsActions, fieldObjects] = await Promise.all([ this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects"), ]); - return ( - !!e || - (!!t && Object.values(t).some((e) => e.some((e) => null !== e.actions))) - ); + if (catalogJsActions) { + return true; + } + if (fieldObjects) { + return Object.values(fieldObjects.allFields).some((fieldObject) => + fieldObject.some((object) => object.actions !== null), + ); + } + return false; } get calculationOrderIds() { - const e = this.catalog.acroForm; - if (!e?.has("CO")) return shadow(this, "calculationOrderIds", null); - const t = e.get("CO"); - if (!Array.isArray(t) || 0 === t.length) + const calculationOrder = this.catalog.acroForm?.get("CO"); + if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { return shadow(this, "calculationOrderIds", null); - const i = []; - for (const e of t) e instanceof Ref && i.push(e.toString()); - return 0 === i.length - ? shadow(this, "calculationOrderIds", null) - : shadow(this, "calculationOrderIds", i); + } + const ids = []; + for (const id of calculationOrder) { + if (id instanceof Ref) { + ids.push(id.toString()); + } + } + return shadow(this, "calculationOrderIds", ids.length ? ids : null); } get annotationGlobals() { return shadow( @@ -55768,25 +67957,27 @@ class PDFDocument { AnnotationFactory.createGlobals(this.pdfManager), ); } +} // ./src/core/pdf_manager.js + +function parseDocBaseUrl(url) { + if (url) { + const absoluteUrl = createValidAbsoluteUrl(url); + if (absoluteUrl) { + return absoluteUrl.href; + } + warn(`Invalid absolute docBaseUrl: "${url}".`); + } + return null; } class BasePdfManager { - constructor(e) { - this.constructor === BasePdfManager && - unreachable("Cannot initialize BasePdfManager."); - this._docBaseUrl = (function parseDocBaseUrl(e) { - if (e) { - const t = createValidAbsoluteUrl(e); - if (t) return t.href; - warn(`Invalid absolute docBaseUrl: "${e}".`); - } - return null; - })(e.docBaseUrl); - this._docId = e.docId; - this._password = e.password; - this.enableXfa = e.enableXfa; - e.evaluatorOptions.isOffscreenCanvasSupported &&= + constructor(args) { + this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl); + this._docId = args.docId; + this._password = args.password; + this.enableXfa = args.enableXfa; + args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; - this.evaluatorOptions = Object.freeze(e.evaluatorOptions); + this.evaluatorOptions = Object.freeze(args.evaluatorOptions); } get docId() { return this._docId; @@ -55800,495 +67991,562 @@ class BasePdfManager { get catalog() { return this.pdfDocument.catalog; } - ensureDoc(e, t) { - return this.ensure(this.pdfDocument, e, t); + ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); } - ensureXRef(e, t) { - return this.ensure(this.pdfDocument.xref, e, t); + ensureXRef(prop, args) { + return this.ensure(this.pdfDocument.xref, prop, args); } - ensureCatalog(e, t) { - return this.ensure(this.pdfDocument.catalog, e, t); + ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); } - getPage(e) { - return this.pdfDocument.getPage(e); + getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); } - fontFallback(e, t) { - return this.pdfDocument.fontFallback(e, t); + fontFallback(id, handler) { + return this.pdfDocument.fontFallback(id, handler); } - loadXfaFonts(e, t) { - return this.pdfDocument.loadXfaFonts(e, t); + loadXfaFonts(handler, task) { + return this.pdfDocument.loadXfaFonts(handler, task); } loadXfaImages() { return this.pdfDocument.loadXfaImages(); } - serializeXfaData(e) { - return this.pdfDocument.serializeXfaData(e); + serializeXfaData(annotationStorage) { + return this.pdfDocument.serializeXfaData(annotationStorage); } - cleanup(e = !1) { - return this.pdfDocument.cleanup(e); + cleanup(manuallyTriggered = false) { + return this.pdfDocument.cleanup(manuallyTriggered); } - async ensure(e, t, i) { + async ensure(obj, prop, args) { unreachable("Abstract method `ensure` called"); } - requestRange(e, t) { + requestRange(begin, end) { unreachable("Abstract method `requestRange` called"); } - requestLoadedStream(e = !1) { + requestLoadedStream(noFetch = false) { unreachable("Abstract method `requestLoadedStream` called"); } - sendProgressiveData(e) { + sendProgressiveData(chunk) { unreachable("Abstract method `sendProgressiveData` called"); } - updatePassword(e) { - this._password = e; + updatePassword(password) { + this._password = password; } - terminate(e) { + terminate(reason) { unreachable("Abstract method `terminate` called"); } } class LocalPdfManager extends BasePdfManager { - constructor(e) { - super(e); - const t = new Stream(e.source); - this.pdfDocument = new PDFDocument(this, t); - this._loadedStreamPromise = Promise.resolve(t); + constructor(args) { + super(args); + const stream = new Stream(args.source); + this.pdfDocument = new PDFDocument(this, stream); + this._loadedStreamPromise = Promise.resolve(stream); } - async ensure(e, t, i) { - const a = e[t]; - return "function" == typeof a ? a.apply(e, i) : a; + async ensure(obj, prop, args) { + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; } - requestRange(e, t) { + requestRange(begin, end) { return Promise.resolve(); } - requestLoadedStream(e = !1) { + requestLoadedStream(noFetch = false) { return this._loadedStreamPromise; } - terminate(e) {} + terminate(reason) {} } class NetworkPdfManager extends BasePdfManager { - constructor(e) { - super(e); - this.streamManager = new ChunkedStreamManager(e.source, { - msgHandler: e.handler, - length: e.length, - disableAutoFetch: e.disableAutoFetch, - rangeChunkSize: e.rangeChunkSize, + constructor(args) { + super(args); + this.streamManager = new ChunkedStreamManager(args.source, { + msgHandler: args.handler, + length: args.length, + disableAutoFetch: args.disableAutoFetch, + rangeChunkSize: args.rangeChunkSize, }); this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); } - async ensure(e, t, i) { + async ensure(obj, prop, args) { try { - const a = e[t]; - return "function" == typeof a ? a.apply(e, i) : a; - } catch (a) { - if (!(a instanceof MissingDataException)) throw a; - await this.requestRange(a.begin, a.end); - return this.ensure(e, t, i); + const value = obj[prop]; + if (typeof value === "function") { + return value.apply(obj, args); + } + return value; + } catch (ex) { + if (!(ex instanceof MissingDataException)) { + throw ex; + } + await this.requestRange(ex.begin, ex.end); + return this.ensure(obj, prop, args); } } - requestRange(e, t) { - return this.streamManager.requestRange(e, t); + requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); } - requestLoadedStream(e = !1) { - return this.streamManager.requestAllChunks(e); + requestLoadedStream(noFetch = false) { + return this.streamManager.requestAllChunks(noFetch); } - sendProgressiveData(e) { - this.streamManager.onReceiveData({ chunk: e }); + sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ + chunk, + }); } - terminate(e) { - this.streamManager.abort(e); + terminate(reason) { + this.streamManager.abort(reason); } -} -const og = 1, - Ig = 2, - cg = 1, - Cg = 2, - hg = 3, - Bg = 4, - lg = 5, - Qg = 6, - Eg = 7, - ug = 8; -function wrapReason(e) { - e instanceof Error || - ("object" == typeof e && null !== e) || +} // ./src/shared/message_handler.js + +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, +}; +function wrapReason(reason) { + if ( + !( + reason instanceof Error || + (typeof reason === "object" && reason !== null) + ) + ) { unreachable( 'wrapReason: Expected "reason" to be a (possibly cloned) Error.', ); - switch (e.name) { + } + switch (reason.name) { case "AbortException": - return new AbortException(e.message); + return new AbortException(reason.message); case "MissingPDFException": - return new MissingPDFException(e.message); + return new MissingPDFException(reason.message); case "PasswordException": - return new PasswordException(e.message, e.code); + return new PasswordException(reason.message, reason.code); case "UnexpectedResponseException": - return new UnexpectedResponseException(e.message, e.status); + return new UnexpectedResponseException(reason.message, reason.status); case "UnknownErrorException": - return new UnknownErrorException(e.message, e.details); + return new UnknownErrorException(reason.message, reason.details); default: - return new UnknownErrorException(e.message, e.toString()); + return new UnknownErrorException(reason.message, reason.toString()); } } class MessageHandler { - constructor(e, t, i) { - this.sourceName = e; - this.targetName = t; - this.comObj = i; + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; this.callbackId = 1; this.streamId = 1; this.streamSinks = Object.create(null); this.streamControllers = Object.create(null); this.callbackCapabilities = Object.create(null); this.actionHandler = Object.create(null); - this._onComObjOnMessage = (e) => { - const t = e.data; - if (t.targetName !== this.sourceName) return; - if (t.stream) { - this.#O(t); - return; - } - if (t.callback) { - const e = t.callbackId, - i = this.callbackCapabilities[e]; - if (!i) throw new Error(`Cannot resolve callback ${e}`); - delete this.callbackCapabilities[e]; - if (t.callback === og) i.resolve(t.data); - else { - if (t.callback !== Ig) throw new Error("Unexpected callback case"); - i.reject(wrapReason(t.reason)); - } - return; - } - const a = this.actionHandler[t.action]; - if (!a) throw new Error(`Unknown action from worker: ${t.action}`); - if (t.callbackId) { - const e = this.sourceName, - s = t.sourceName; - new Promise(function (e) { - e(a(t.data)); - }).then( - function (a) { - i.postMessage({ - sourceName: e, - targetName: s, - callback: og, - callbackId: t.callbackId, - data: a, - }); - }, - function (a) { - i.postMessage({ - sourceName: e, - targetName: s, - callback: Ig, - callbackId: t.callbackId, - reason: wrapReason(a), - }); - }, - ); - } else t.streamId ? this.#P(t) : a(t.data); - }; - i.addEventListener("message", this._onComObjOnMessage); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal, + }); } - on(e, t) { - const i = this.actionHandler; - if (i[e]) throw new Error(`There is already an actionName called "${e}"`); - i[e] = t; + #onMessage({ data }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + 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"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + new Promise(function (resolve) { + resolve(action(data.data)); + }).then( + function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result, + }); + }, + function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason), + }); + }, + ); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); } - send(e, t, i) { + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { this.comObj.postMessage( { sourceName: this.sourceName, targetName: this.targetName, - action: e, - data: t, + action: actionName, + data, }, - i, + transfers, ); } - sendWithPromise(e, t, i) { - const a = this.callbackId++, - s = Promise.withResolvers(); - this.callbackCapabilities[a] = s; + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; try { this.comObj.postMessage( { sourceName: this.sourceName, targetName: this.targetName, - action: e, - callbackId: a, - data: t, + action: actionName, + callbackId, + data, }, - i, + transfers, ); - } catch (e) { - s.reject(e); + } catch (ex) { + capability.reject(ex); } - return s.promise; + return capability.promise; } - sendWithStream(e, t, i, a) { - const s = this.streamId++, - r = this.sourceName, - n = this.targetName, - g = this.comObj; + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; return new ReadableStream( { - start: (i) => { - const o = Promise.withResolvers(); - this.streamControllers[s] = { - controller: i, - startCall: o, + start: (controller) => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, pullCall: null, cancelCall: null, - isClosed: !1, + isClosed: false, }; - g.postMessage( + comObj.postMessage( { - sourceName: r, - targetName: n, - action: e, - streamId: s, - data: t, - desiredSize: i.desiredSize, + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize, }, - a, + transfers, ); - return o.promise; + return startCapability.promise; }, - pull: (e) => { - const t = Promise.withResolvers(); - this.streamControllers[s].pullCall = t; - g.postMessage({ - sourceName: r, - targetName: n, - stream: Qg, - streamId: s, - desiredSize: e.desiredSize, + pull: (controller) => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize, }); - return t.promise; + return pullCapability.promise; }, - cancel: (e) => { - assert(e instanceof Error, "cancel must have a valid reason"); - const t = Promise.withResolvers(); - this.streamControllers[s].cancelCall = t; - this.streamControllers[s].isClosed = !0; - g.postMessage({ - sourceName: r, - targetName: n, - stream: cg, - streamId: s, - reason: wrapReason(e), + cancel: (reason) => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason), }); - return t.promise; + return cancelCapability.promise; }, }, - i, + queueingStrategy, ); } - #P(e) { - const t = e.streamId, - i = this.sourceName, - a = e.sourceName, - s = this.comObj, - r = this, - n = this.actionHandler[e.action], - g = { - enqueue(e, r = 1, n) { - if (this.isCancelled) return; - const g = this.desiredSize; - this.desiredSize -= r; - if (g > 0 && this.desiredSize <= 0) { - this.sinkCapability = Promise.withResolvers(); - this.ready = this.sinkCapability.promise; - } - s.postMessage( - { sourceName: i, targetName: a, stream: Bg, streamId: t, chunk: e }, - n, - ); - }, - close() { - if (!this.isCancelled) { - this.isCancelled = !0; - s.postMessage({ - sourceName: i, - targetName: a, - stream: hg, - streamId: t, - }); - delete r.streamSinks[t]; - } - }, - error(e) { - assert(e instanceof Error, "error must have a valid reason"); - if (!this.isCancelled) { - this.isCancelled = !0; - s.postMessage({ - sourceName: i, - targetName: a, - stream: lg, - streamId: t, - reason: wrapReason(e), - }); - } - }, - sinkCapability: Promise.withResolvers(), - onPull: null, - onCancel: null, - isCancelled: !1, - desiredSize: e.desiredSize, - ready: null, - }; - g.sinkCapability.resolve(); - g.ready = g.sinkCapability.promise; - this.streamSinks[t] = g; - new Promise(function (t) { - t(n(e.data, g)); + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage( + { + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk, + }, + transfers, + ); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId, + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason), + }); + }, + sinkCapability: Promise.withResolvers(), + 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 () { - s.postMessage({ - sourceName: i, - targetName: a, - stream: ug, - streamId: t, - success: !0, + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true, }); }, - function (e) { - s.postMessage({ - sourceName: i, - targetName: a, - stream: ug, - streamId: t, - reason: wrapReason(e), + function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason), }); }, ); } - #O(e) { - const t = e.streamId, - i = this.sourceName, - a = e.sourceName, - s = this.comObj, - r = this.streamControllers[t], - n = this.streamSinks[t]; - switch (e.stream) { - case ug: - e.success - ? r.startCall.resolve() - : r.startCall.reject(wrapReason(e.reason)); + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } break; - case Eg: - e.success - ? r.pullCall.resolve() - : r.pullCall.reject(wrapReason(e.reason)); + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } break; - case Qg: - if (!n) { - s.postMessage({ - sourceName: i, - targetName: a, - stream: Eg, - streamId: t, - success: !0, + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true, }); break; } - n.desiredSize <= 0 && e.desiredSize > 0 && n.sinkCapability.resolve(); - n.desiredSize = e.desiredSize; - new Promise(function (e) { - e(n.onPull?.()); + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + new Promise(function (resolve) { + resolve(streamSink.onPull?.()); }).then( function () { - s.postMessage({ - sourceName: i, - targetName: a, - stream: Eg, - streamId: t, - success: !0, + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true, }); }, - function (e) { - s.postMessage({ - sourceName: i, - targetName: a, - stream: Eg, - streamId: t, - reason: wrapReason(e), + function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason), }); }, ); break; - case Bg: - assert(r, "enqueue should have stream controller"); - if (r.isClosed) break; - r.controller.enqueue(e.chunk); + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); break; - case hg: - assert(r, "close should have stream controller"); - if (r.isClosed) break; - r.isClosed = !0; - r.controller.close(); - this.#W(r, t); + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); break; - case lg: - assert(r, "error should have stream controller"); - r.controller.error(wrapReason(e.reason)); - this.#W(r, t); + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); break; - case Cg: - e.success - ? r.cancelCall.resolve() - : r.cancelCall.reject(wrapReason(e.reason)); - this.#W(r, t); + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); break; - case cg: - if (!n) break; - new Promise(function (t) { - t(n.onCancel?.(wrapReason(e.reason))); + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + new Promise(function (resolve) { + resolve(streamSink.onCancel?.(wrapReason(data.reason))); }).then( function () { - s.postMessage({ - sourceName: i, - targetName: a, - stream: Cg, - streamId: t, - success: !0, + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true, }); }, - function (e) { - s.postMessage({ - sourceName: i, - targetName: a, - stream: Cg, - streamId: t, - reason: wrapReason(e), + function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason), }); }, ); - n.sinkCapability.reject(wrapReason(e.reason)); - n.isCancelled = !0; - delete this.streamSinks[t]; + streamSink.sinkCapability.reject(wrapReason(data.reason)); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; break; default: throw new Error("Unexpected stream case"); } } - async #W(e, t) { + async #deleteStreamController(streamController, streamId) { await Promise.allSettled([ - e.startCall?.promise, - e.pullCall?.promise, - e.cancelCall?.promise, + streamController.startCall?.promise, + streamController.pullCall?.promise, + streamController.cancelCall?.promise, ]); - delete this.streamControllers[t]; + delete this.streamControllers[streamId]; } destroy() { - this.comObj.removeEventListener("message", this._onComObjOnMessage); + this.#messageAC?.abort(); + this.#messageAC = null; } -} +} // ./src/core/worker_stream.js + class PDFWorkerStream { - constructor(e) { - this._msgHandler = e; + constructor(msgHandler) { + this._msgHandler = msgHandler; this._contentLength = null; this._fullRequestReader = null; this._rangeRequestReaders = []; @@ -56301,31 +68559,33 @@ class PDFWorkerStream { this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); return this._fullRequestReader; } - getRangeReader(e, t) { - const i = new PDFWorkerStreamRangeReader(e, t, this._msgHandler); - this._rangeRequestReaders.push(i); - return i; + getRangeReader(begin, end) { + const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); + this._rangeRequestReaders.push(reader); + return reader; } - cancelAllRequests(e) { - this._fullRequestReader?.cancel(e); - for (const t of this._rangeRequestReaders.slice(0)) t.cancel(e); + cancelAllRequests(reason) { + this._fullRequestReader?.cancel(reason); + for (const reader of this._rangeRequestReaders.slice(0)) { + reader.cancel(reason); + } } } class PDFWorkerStreamReader { - constructor(e) { - this._msgHandler = e; + constructor(msgHandler) { + this._msgHandler = msgHandler; this.onProgress = null; this._contentLength = null; - this._isRangeSupported = !1; - this._isStreamingSupported = !1; - const t = this._msgHandler.sendWithStream("GetReader"); - this._reader = t.getReader(); + this._isRangeSupported = false; + this._isStreamingSupported = false; + const readableStream = this._msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); this._headersReady = this._msgHandler .sendWithPromise("ReaderHeadersReady") - .then((e) => { - this._isStreamingSupported = e.isStreamingSupported; - this._isRangeSupported = e.isRangeSupported; - this._contentLength = e.contentLength; + .then((data) => { + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._contentLength = data.contentLength; }); } get headersReady() { @@ -56341,38 +68601,57 @@ class PDFWorkerStreamReader { return this._isRangeSupported; } async read() { - const { value: e, done: t } = await this._reader.read(); - return t ? { value: void 0, done: !0 } : { value: e.buffer, done: !1 }; + const { value, done } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true, + }; + } + return { + value: value.buffer, + done: false, + }; } - cancel(e) { - this._reader.cancel(e); + cancel(reason) { + this._reader.cancel(reason); } } class PDFWorkerStreamRangeReader { - constructor(e, t, i) { - this._msgHandler = i; + constructor(begin, end, msgHandler) { + this._msgHandler = msgHandler; this.onProgress = null; - const a = this._msgHandler.sendWithStream("GetRangeReader", { - begin: e, - end: t, + const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { + begin, + end, }); - this._reader = a.getReader(); + this._reader = readableStream.getReader(); } get isStreamingSupported() { - return !1; + return false; } async read() { - const { value: e, done: t } = await this._reader.read(); - return t ? { value: void 0, done: !0 } : { value: e.buffer, done: !1 }; + const { value, done } = await this._reader.read(); + if (done) { + return { + value: undefined, + done: true, + }; + } + return { + value: value.buffer, + done: false, + }; } - cancel(e) { - this._reader.cancel(e); + cancel(reason) { + this._reader.cancel(reason); } -} +} // ./src/core/worker.js + class WorkerTask { - constructor(e) { - this.name = e; - this.terminated = !1; + constructor(name) { + this.name = name; + this.terminated = false; this._capability = Promise.withResolvers(); } get finished() { @@ -56382,609 +68661,702 @@ class WorkerTask { this._capability.resolve(); } terminate() { - this.terminated = !0; + this.terminated = true; } ensureNotTerminated() { - if (this.terminated) throw new Error("Worker task was terminated"); + if (this.terminated) { + throw new Error("Worker task was terminated"); + } } } class WorkerMessageHandler { - static setup(e, t) { - let i = !1; - e.on("test", function (t) { - if (!i) { - i = !0; - e.send("test", t instanceof Uint8Array); + static setup(handler, port) { + let testMessageProcessed = false; + handler.on("test", function (data) { + if (testMessageProcessed) { + return; } + testMessageProcessed = true; + handler.send("test", data instanceof Uint8Array); }); - e.on("configure", function (e) { - !(function setVerbosityLevel(e) { - Number.isInteger(e) && (st = e); - })(e.verbosity); + handler.on("configure", function (data) { + setVerbosityLevel(data.verbosity); }); - e.on("GetDocRequest", function (e) { - return WorkerMessageHandler.createDocumentHandler(e, t); + handler.on("GetDocRequest", function (data) { + return WorkerMessageHandler.createDocumentHandler(data, port); }); } - static createDocumentHandler(e, t) { - let i, - a = !1, - s = null; - const r = new Set(), - n = getVerbosityLevel(), - { docId: g, apiVersion: o } = e, - c = "4.4.168"; - if (o !== c) + static createDocumentHandler(docParams, port) { + let pdfManager; + let terminated = false; + let cancelXHRs = null; + const WorkerTasks = new Set(); + const verbosity = getVerbosityLevel(); + const { docId, apiVersion } = docParams; + const workerVersion = "4.8.69"; + if (apiVersion !== workerVersion) { throw new Error( - `The API version "${o}" does not match the Worker version "${c}".`, + `The API version "${apiVersion}" does not match ` + + `the Worker version "${workerVersion}".`, ); - const C = []; - for (const e in []) C.push(e); - if (C.length) + } + const enumerableProperties = []; + for (const property in []) { + enumerableProperties.push(property); + } + if (enumerableProperties.length) { throw new Error( "The `Array.prototype` contains unexpected enumerable properties: " + - C.join(", ") + + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s.", ); - const h = g + "_worker"; - let l = new MessageHandler(h, g, t); + } + const workerHandlerName = docId + "_worker"; + let handler = new MessageHandler(workerHandlerName, docId, port); function ensureNotTerminated() { - if (a) throw new Error("Worker was terminated"); + if (terminated) { + throw new Error("Worker was terminated"); + } } - function startWorkerTask(e) { - r.add(e); + function startWorkerTask(task) { + WorkerTasks.add(task); } - function finishWorkerTask(e) { - e.finish(); - r.delete(e); + function finishWorkerTask(task) { + task.finish(); + WorkerTasks.delete(task); } - async function loadDocument(e) { - await i.ensureDoc("checkHeader"); - await i.ensureDoc("parseStartXRef"); - await i.ensureDoc("parse", [e]); - await i.ensureDoc("checkFirstPage", [e]); - await i.ensureDoc("checkLastPage", [e]); - const t = await i.ensureDoc("isPureXfa"); - if (t) { - const e = new WorkerTask("loadXfaFonts"); - startWorkerTask(e); + async function loadDocument(recoveryMode) { + await pdfManager.ensureDoc("checkHeader"); + await pdfManager.ensureDoc("parseStartXRef"); + await pdfManager.ensureDoc("parse", [recoveryMode]); + await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); + await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); + const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); + if (isPureXfa) { + const task = new WorkerTask("loadXfaFonts"); + startWorkerTask(task); await Promise.all([ - i - .loadXfaFonts(l, e) - .catch((e) => {}) - .then(() => finishWorkerTask(e)), - i.loadXfaImages(), + pdfManager + .loadXfaFonts(handler, task) + .catch((reason) => {}) + .then(() => finishWorkerTask(task)), + pdfManager.loadXfaImages(), ]); } - const [a, s] = await Promise.all([ - i.ensureDoc("numPages"), - i.ensureDoc("fingerprints"), + const [numPages, fingerprints] = await Promise.all([ + pdfManager.ensureDoc("numPages"), + pdfManager.ensureDoc("fingerprints"), ]); + const htmlForXfa = isPureXfa + ? await pdfManager.ensureDoc("htmlForXfa") + : null; return { - numPages: a, - fingerprints: s, - htmlForXfa: t ? await i.ensureDoc("htmlForXfa") : null, + numPages, + fingerprints, + htmlForXfa, }; } function getPdfManager({ - data: e, - password: t, - disableAutoFetch: i, - rangeChunkSize: a, - length: r, - docBaseUrl: n, - enableXfa: o, - evaluatorOptions: c, + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions, }) { - const C = { - source: null, - disableAutoFetch: i, - docBaseUrl: n, - docId: g, - enableXfa: o, - evaluatorOptions: c, - handler: l, - length: r, - password: t, - rangeChunkSize: a, - }, - h = Promise.withResolvers(); - let Q; - if (e) { + const pdfManagerArgs = { + source: null, + disableAutoFetch, + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + length, + password, + rangeChunkSize, + }; + const pdfManagerCapability = Promise.withResolvers(); + let newPdfManager; + if (data) { try { - C.source = e; - Q = new LocalPdfManager(C); - h.resolve(Q); - } catch (e) { - h.reject(e); + pdfManagerArgs.source = data; + newPdfManager = new LocalPdfManager(pdfManagerArgs); + pdfManagerCapability.resolve(newPdfManager); + } catch (ex) { + pdfManagerCapability.reject(ex); } - return h.promise; + return pdfManagerCapability.promise; } - let E, - u = []; + let pdfStream, + cachedChunks = [], + loaded = 0; try { - E = new PDFWorkerStream(l); - } catch (e) { - h.reject(e); - return h.promise; + pdfStream = new PDFWorkerStream(handler); + } catch (ex) { + pdfManagerCapability.reject(ex); + return pdfManagerCapability.promise; } - const d = E.getFullReader(); - d.headersReady + const fullRequest = pdfStream.getFullReader(); + fullRequest.headersReady .then(function () { - if (d.isRangeSupported) { - C.source = E; - C.length = d.contentLength; - C.disableAutoFetch ||= d.isStreamingSupported; - Q = new NetworkPdfManager(C); - for (const e of u) Q.sendProgressiveData(e); - u = []; - h.resolve(Q); - s = null; + if (!fullRequest.isRangeSupported) { + return; } + pdfManagerArgs.source = pdfStream; + pdfManagerArgs.length = fullRequest.contentLength; + pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; + newPdfManager = new NetworkPdfManager(pdfManagerArgs); + for (const chunk of cachedChunks) { + newPdfManager.sendProgressiveData(chunk); + } + cachedChunks = []; + pdfManagerCapability.resolve(newPdfManager); + cancelXHRs = null; }) - .catch(function (e) { - h.reject(e); - s = null; + .catch(function (reason) { + pdfManagerCapability.reject(reason); + cancelXHRs = null; }); - let f = 0; - new Promise(function (e, t) { - const readChunk = function ({ value: e, done: i }) { + new Promise(function (resolve, reject) { + const readChunk = function ({ value, done }) { try { ensureNotTerminated(); - if (i) { - Q || - (function () { - const e = arrayBuffersToBytes(u); - r && - e.length !== r && - warn("reported HTTP length is different from actual"); - try { - C.source = e; - Q = new LocalPdfManager(C); - h.resolve(Q); - } catch (e) { - h.reject(e); - } - u = []; - })(); - s = null; + if (done) { + if (!newPdfManager) { + const pdfFile = arrayBuffersToBytes(cachedChunks); + cachedChunks = []; + if (length && pdfFile.length !== length) { + warn("reported HTTP length is different from actual"); + } + pdfManagerArgs.source = pdfFile; + newPdfManager = new LocalPdfManager(pdfManagerArgs); + pdfManagerCapability.resolve(newPdfManager); + } + cancelXHRs = null; return; } - f += e.byteLength; - d.isStreamingSupported || - l.send("DocProgress", { - loaded: f, - total: Math.max(f, d.contentLength || 0), + loaded += value.byteLength; + if (!fullRequest.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: Math.max(loaded, fullRequest.contentLength || 0), }); - Q ? Q.sendProgressiveData(e) : u.push(e); - d.read().then(readChunk, t); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } + fullRequest.read().then(readChunk, reject); } catch (e) { - t(e); + reject(e); } }; - d.read().then(readChunk, t); + fullRequest.read().then(readChunk, reject); }).catch(function (e) { - h.reject(e); - s = null; + pdfManagerCapability.reject(e); + cancelXHRs = null; }); - s = function (e) { - E.cancelAllRequests(e); + cancelXHRs = function (reason) { + pdfStream.cancelAllRequests(reason); }; - return h.promise; + return pdfManagerCapability.promise; } - l.on("GetPage", function (e) { - return i.getPage(e.pageIndex).then(function (e) { + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send("GetDoc", { + pdfInfo: doc, + }); + } + function onFailure(ex) { + ensureNotTerminated(); + if (ex instanceof PasswordException) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + handler + .sendWithPromise("PasswordRequest", ex) + .then(function ({ password }) { + finishWorkerTask(task); + pdfManager.updatePassword(password); + pdfManagerReady(); + }) + .catch(function () { + finishWorkerTask(task); + handler.send("DocException", ex); + }); + } else if ( + ex instanceof InvalidPDFException || + ex instanceof MissingPDFException || + ex instanceof UnexpectedResponseException || + ex instanceof UnknownErrorException + ) { + handler.send("DocException", ex); + } else { + handler.send( + "DocException", + new UnknownErrorException(ex.message, ex.toString()), + ); + } + } + function pdfManagerReady() { + ensureNotTerminated(); + loadDocument(false).then(onSuccess, function (reason) { + ensureNotTerminated(); + if (!(reason instanceof XRefParseException)) { + onFailure(reason); + return; + } + pdfManager.requestLoadedStream().then(function () { + ensureNotTerminated(); + loadDocument(true).then(onSuccess, onFailure); + }); + }); + } + ensureNotTerminated(); + getPdfManager(data) + .then(function (newPdfManager) { + if (terminated) { + newPdfManager.terminate( + new AbortException("Worker was terminated."), + ); + throw new Error("Worker was terminated"); + } + pdfManager = newPdfManager; + pdfManager.requestLoadedStream(true).then((stream) => { + handler.send("DataLoaded", { + length: stream.bytes.byteLength, + }); + }); + }) + .then(pdfManagerReady, onFailure); + } + handler.on("GetPage", function (data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { return Promise.all([ - i.ensure(e, "rotate"), - i.ensure(e, "ref"), - i.ensure(e, "userUnit"), - i.ensure(e, "view"), - ]).then(function ([e, t, i, a]) { + pdfManager.ensure(page, "rotate"), + pdfManager.ensure(page, "ref"), + pdfManager.ensure(page, "userUnit"), + pdfManager.ensure(page, "view"), + ]).then(function ([rotate, ref, userUnit, view]) { return { - rotate: e, - ref: t, - refStr: t?.toString() ?? null, - userUnit: i, - view: a, + rotate, + ref, + refStr: ref?.toString() ?? null, + userUnit, + view, }; }); }); }); - l.on("GetPageIndex", function (e) { - const t = Ref.get(e.num, e.gen); - return i.ensureCatalog("getPageIndex", [t]); + handler.on("GetPageIndex", function (data) { + const pageRef = Ref.get(data.num, data.gen); + return pdfManager.ensureCatalog("getPageIndex", [pageRef]); }); - l.on("GetDestinations", function (e) { - return i.ensureCatalog("destinations"); + handler.on("GetDestinations", function (data) { + return pdfManager.ensureCatalog("destinations"); }); - l.on("GetDestination", function (e) { - return i.ensureCatalog("getDestination", [e.id]); + handler.on("GetDestination", function (data) { + return pdfManager.ensureCatalog("getDestination", [data.id]); }); - l.on("GetPageLabels", function (e) { - return i.ensureCatalog("pageLabels"); + handler.on("GetPageLabels", function (data) { + return pdfManager.ensureCatalog("pageLabels"); }); - l.on("GetPageLayout", function (e) { - return i.ensureCatalog("pageLayout"); + handler.on("GetPageLayout", function (data) { + return pdfManager.ensureCatalog("pageLayout"); }); - l.on("GetPageMode", function (e) { - return i.ensureCatalog("pageMode"); + handler.on("GetPageMode", function (data) { + return pdfManager.ensureCatalog("pageMode"); }); - l.on("GetViewerPreferences", function (e) { - return i.ensureCatalog("viewerPreferences"); + handler.on("GetViewerPreferences", function (data) { + return pdfManager.ensureCatalog("viewerPreferences"); }); - l.on("GetOpenAction", function (e) { - return i.ensureCatalog("openAction"); + handler.on("GetOpenAction", function (data) { + return pdfManager.ensureCatalog("openAction"); }); - l.on("GetAttachments", function (e) { - return i.ensureCatalog("attachments"); + handler.on("GetAttachments", function (data) { + return pdfManager.ensureCatalog("attachments"); }); - l.on("GetDocJSActions", function (e) { - return i.ensureCatalog("jsActions"); + handler.on("GetDocJSActions", function (data) { + return pdfManager.ensureCatalog("jsActions"); }); - l.on("GetPageJSActions", function ({ pageIndex: e }) { - return i.getPage(e).then(function (e) { - return i.ensure(e, "jsActions"); + handler.on("GetPageJSActions", function ({ pageIndex }) { + return pdfManager.getPage(pageIndex).then(function (page) { + return pdfManager.ensure(page, "jsActions"); }); }); - l.on("GetOutline", function (e) { - return i.ensureCatalog("documentOutline"); + handler.on("GetOutline", function (data) { + return pdfManager.ensureCatalog("documentOutline"); }); - l.on("GetOptionalContentConfig", function (e) { - return i.ensureCatalog("optionalContentConfig"); + handler.on("GetOptionalContentConfig", function (data) { + return pdfManager.ensureCatalog("optionalContentConfig"); }); - l.on("GetPermissions", function (e) { - return i.ensureCatalog("permissions"); + handler.on("GetPermissions", function (data) { + return pdfManager.ensureCatalog("permissions"); }); - l.on("GetMetadata", function (e) { + handler.on("GetMetadata", function (data) { return Promise.all([ - i.ensureDoc("documentInfo"), - i.ensureCatalog("metadata"), + pdfManager.ensureDoc("documentInfo"), + pdfManager.ensureCatalog("metadata"), ]); }); - l.on("GetMarkInfo", function (e) { - return i.ensureCatalog("markInfo"); + handler.on("GetMarkInfo", function (data) { + return pdfManager.ensureCatalog("markInfo"); }); - l.on("GetData", function (e) { - return i.requestLoadedStream().then(function (e) { - return e.bytes; + handler.on("GetData", function (data) { + return pdfManager.requestLoadedStream().then(function (stream) { + return stream.bytes; }); }); - l.on("GetAnnotations", function ({ pageIndex: e, intent: t }) { - return i.getPage(e).then(function (i) { - const a = new WorkerTask(`GetAnnotations: page ${e}`); - startWorkerTask(a); - return i.getAnnotationsData(l, a, t).then( - (e) => { - finishWorkerTask(a); - return e; + handler.on("GetAnnotations", function ({ pageIndex, intent }) { + return pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); + startWorkerTask(task); + return page.getAnnotationsData(handler, task, intent).then( + (data) => { + finishWorkerTask(task); + return data; }, - (e) => { - finishWorkerTask(a); - throw e; + (reason) => { + finishWorkerTask(task); + throw reason; }, ); }); }); - l.on("GetFieldObjects", function (e) { - return i.ensureDoc("fieldObjects"); + handler.on("GetFieldObjects", function (data) { + return pdfManager + .ensureDoc("fieldObjects") + .then((fieldObjects) => fieldObjects?.allFields || null); }); - l.on("HasJSActions", function (e) { - return i.ensureDoc("hasJSActions"); + handler.on("HasJSActions", function (data) { + return pdfManager.ensureDoc("hasJSActions"); }); - l.on("GetCalculationOrderIds", function (e) { - return i.ensureDoc("calculationOrderIds"); + handler.on("GetCalculationOrderIds", function (data) { + return pdfManager.ensureDoc("calculationOrderIds"); }); - l.on( + handler.on( "SaveDocument", - async function ({ - isPureXfa: e, - numPages: t, - annotationStorage: a, - filename: s, - }) { - const r = [ - i.requestLoadedStream(), - i.ensureCatalog("acroForm"), - i.ensureCatalog("acroFormRef"), - i.ensureDoc("startXRef"), - i.ensureDoc("xref"), - i.ensureDoc("linearization"), - i.ensureCatalog("structTreeRoot"), - ], - n = [], - g = e ? null : getNewAnnotationsMap(a), - [o, c, C, h, Q, E, u] = await Promise.all(r), - d = Q.trailer.getRaw("Root") || null; - let f; - if (g) { - u - ? (await u.canUpdateStructTree({ - pdfManager: i, - xref: Q, - newAnnotationsByPage: g, - })) && (f = u) - : (await StructTreeRoot.canCreateStructureTree({ - catalogRef: d, - pdfManager: i, - newAnnotationsByPage: g, - })) && (f = null); - const e = AnnotationFactory.generateImages( - a.values(), - Q, - i.evaluatorOptions.isOffscreenCanvasSupported, - ), - t = void 0 === f ? n : []; - for (const [a, s] of g) - t.push( - i.getPage(a).then((t) => { - const i = new WorkerTask(`Save (editor): page ${a}`); - return t.saveNewAnnotations(l, i, s, e).finally(function () { - finishWorkerTask(i); - }); - }), - ); - null === f - ? n.push( - Promise.all(t).then(async (e) => { - await StructTreeRoot.createStructureTree({ - newAnnotationsByPage: g, - xref: Q, - catalogRef: d, - pdfManager: i, - newRefs: e, - }); - return e; - }), - ) - : f && - n.push( - Promise.all(t).then(async (e) => { - await f.updateStructureTree({ - newAnnotationsByPage: g, - pdfManager: i, - newRefs: e, - }); - return e; - }), - ); - } - if (e) n.push(i.serializeXfaData(a)); - else - for (let e = 0; e < t; e++) - n.push( - i.getPage(e).then(function (t) { - const i = new WorkerTask(`Save: page ${e}`); - return t.save(l, i, a).finally(function () { - finishWorkerTask(i); - }); - }), - ); - const p = await Promise.all(n); - let m = [], - y = null; - if (e) { - y = p[0]; - if (!y) return o.bytes; - } else { - m = p.flat(2); - if (0 === m.length) return o.bytes; - } - const w = C && c instanceof Dict && m.some((e) => e.needAppearances), - D = (c instanceof Dict && c.get("XFA")) || null; - let b = null, - F = !1; - if (Array.isArray(D)) { - for (let e = 0, t = D.length; e < t; e += 2) - if ("datasets" === D[e]) { - b = D[e + 1]; - F = !0; + async function ({ isPureXfa, numPages, annotationStorage, filename }) { + const globalPromises = [ + pdfManager.requestLoadedStream(), + pdfManager.ensureCatalog("acroForm"), + pdfManager.ensureCatalog("acroFormRef"), + pdfManager.ensureDoc("startXRef"), + pdfManager.ensureDoc("xref"), + pdfManager.ensureDoc("linearization"), + pdfManager.ensureCatalog("structTreeRoot"), + ]; + const promises = []; + const newAnnotationsByPage = !isPureXfa + ? getNewAnnotationsMap(annotationStorage) + : null; + const [ + stream, + acroForm, + acroFormRef, + startXRef, + xref, + linearization, + _structTreeRoot, + ] = await Promise.all(globalPromises); + const catalogRef = xref.trailer.getRaw("Root") || null; + let structTreeRoot; + if (newAnnotationsByPage) { + if (!_structTreeRoot) { + if ( + await StructTreeRoot.canCreateStructureTree({ + catalogRef, + pdfManager, + newAnnotationsByPage, + }) + ) { + structTreeRoot = null; } - null === b && (b = Q.getNewTemporaryRef()); - } else D && warn("Unsupported XFA type."); - let S = Object.create(null); - if (Q.trailer) { - const e = Object.create(null), - t = Q.trailer.get("Info") || null; - t instanceof Dict && - t.forEach((t, i) => { - "string" == typeof i && (e[t] = stringToPDFString(i)); + } else if ( + await _structTreeRoot.canUpdateStructTree({ + pdfManager, + xref, + newAnnotationsByPage, + }) + ) { + structTreeRoot = _structTreeRoot; + } + const imagePromises = AnnotationFactory.generateImages( + annotationStorage.values(), + xref, + pdfManager.evaluatorOptions.isOffscreenCanvasSupported, + ); + const newAnnotationPromises = + structTreeRoot === undefined ? promises : []; + for (const [pageIndex, annotations] of newAnnotationsByPage) { + newAnnotationPromises.push( + pdfManager.getPage(pageIndex).then((page) => { + const task = new WorkerTask(`Save (editor): page ${pageIndex}`); + return page + .saveNewAnnotations(handler, task, annotations, imagePromises) + .finally(function () { + finishWorkerTask(task); + }); + }), + ); + } + if (structTreeRoot === null) { + promises.push( + Promise.all(newAnnotationPromises).then(async (newRefs) => { + await StructTreeRoot.createStructureTree({ + newAnnotationsByPage, + xref, + catalogRef, + pdfManager, + newRefs, + }); + return newRefs; + }), + ); + } else if (structTreeRoot) { + promises.push( + Promise.all(newAnnotationPromises).then(async (newRefs) => { + await structTreeRoot.updateStructureTree({ + newAnnotationsByPage, + pdfManager, + newRefs, + }); + return newRefs; + }), + ); + } + } + 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); + }); + }), + ); + } + } + const refs = await Promise.all(promises); + let newRefs = []; + let xfaData = null; + if (isPureXfa) { + xfaData = refs[0]; + if (!xfaData) { + return stream.bytes; + } + } else { + newRefs = refs.flat(2); + if (newRefs.length === 0) { + return stream.bytes; + } + } + const needAppearances = + acroFormRef && + acroForm instanceof Dict && + newRefs.some((ref) => ref.needAppearances); + const xfa = (acroForm instanceof Dict && acroForm.get("XFA")) || null; + let xfaDatasetsRef = null; + let hasXfaDatasetsEntry = false; + if (Array.isArray(xfa)) { + for (let i = 0, ii = xfa.length; i < ii; i += 2) { + if (xfa[i] === "datasets") { + xfaDatasetsRef = xfa[i + 1]; + hasXfaDatasetsEntry = true; + } + } + if (xfaDatasetsRef === null) { + xfaDatasetsRef = xref.getNewTemporaryRef(); + } + } else if (xfa) { + warn("Unsupported XFA type."); + } + let newXrefInfo = Object.create(null); + if (xref.trailer) { + const infoObj = Object.create(null); + const xrefInfo = xref.trailer.get("Info") || null; + if (xrefInfo instanceof Dict) { + xrefInfo.forEach((key, value) => { + if (typeof value === "string") { + infoObj[key] = stringToPDFString(value); + } }); - S = { - rootRef: d, - encryptRef: Q.trailer.getRaw("Encrypt") || null, - newRef: Q.getNewTemporaryRef(), - infoRef: Q.trailer.getRaw("Info") || null, - info: e, - fileIds: Q.trailer.get("ID") || null, - startXRef: E ? h : (Q.lastXRefStreamPos ?? h), - filename: s, + } + newXrefInfo = { + rootRef: catalogRef, + encryptRef: xref.trailer.getRaw("Encrypt") || null, + newRef: xref.getNewTemporaryRef(), + infoRef: xref.trailer.getRaw("Info") || null, + info: infoObj, + fileIds: xref.trailer.get("ID") || null, + startXRef: linearization + ? startXRef + : (xref.lastXRefStreamPos ?? startXRef), + filename, }; } return incrementalUpdate({ - originalData: o.bytes, - xrefInfo: S, - newRefs: m, - xref: Q, - hasXfa: !!D, - xfaDatasetsRef: b, - hasXfaDatasetsEntry: F, - needAppearances: w, - acroFormRef: C, - acroForm: c, - xfaData: y, - useXrefStream: isDict(Q.topDict, "XRef"), + originalData: stream.bytes, + xrefInfo: newXrefInfo, + newRefs, + xref, + hasXfa: !!xfa, + xfaDatasetsRef, + hasXfaDatasetsEntry, + needAppearances, + acroFormRef, + acroForm, + xfaData, + useXrefStream: isDict(xref.topDict, "XRef"), }).finally(() => { - Q.resetNewTemporaryRef(); + xref.resetNewTemporaryRef(); }); }, ); - l.on("GetOperatorList", function (e, t) { - const a = e.pageIndex; - i.getPage(a).then(function (i) { - const s = new WorkerTask(`GetOperatorList: page ${a}`); - startWorkerTask(s); - const r = n >= pA.INFOS ? Date.now() : 0; - i.getOperatorList({ - handler: l, - sink: t, - task: s, - intent: e.intent, - cacheKey: e.cacheKey, - annotationStorage: e.annotationStorage, - }).then( - function (e) { - finishWorkerTask(s); - r && - info( - `page=${a + 1} - getOperatorList: time=${Date.now() - r}ms, len=${e.length}`, - ); - t.close(); - }, - function (e) { - finishWorkerTask(s); - s.terminated || t.error(e); - }, - ); - }); - }); - l.on("GetTextContent", function (e, t) { - const { - pageIndex: a, - includeMarkedContent: s, - disableNormalization: r, - } = e; - i.getPage(a).then(function (e) { - const i = new WorkerTask("GetTextContent: page " + a); - startWorkerTask(i); - const g = n >= pA.INFOS ? Date.now() : 0; - e.extractTextContent({ - handler: l, - task: i, - sink: t, - includeMarkedContent: s, - disableNormalization: r, - }).then( - function () { - finishWorkerTask(i); - g && - info( - `page=${a + 1} - getTextContent: time=` + - (Date.now() - g) + - "ms", - ); - t.close(); - }, - function (e) { - finishWorkerTask(i); - i.terminated || t.error(e); - }, - ); - }); - }); - l.on("GetStructTree", function (e) { - return i.getPage(e.pageIndex).then(function (e) { - return i.ensure(e, "getStructTree"); - }); - }); - l.on("FontFallback", function (e) { - return i.fontFallback(e.id, l); - }); - l.on("Cleanup", function (e) { - return i.cleanup(!0); - }); - l.on("Terminate", function (e) { - a = !0; - const t = []; - if (i) { - i.terminate(new AbortException("Worker was terminated.")); - const e = i.cleanup(); - t.push(e); - i = null; - } else clearGlobalCaches(); - s && s(new AbortException("Worker was terminated.")); - for (const e of r) { - t.push(e.finished); - e.terminate(); - } - return Promise.all(t).then(function () { - l.destroy(); - l = null; - }); - }); - l.on("Ready", function (t) { - !(function setupDoc(e) { - function onSuccess(e) { - ensureNotTerminated(); - l.send("GetDoc", { pdfInfo: e }); - } - function onFailure(e) { - ensureNotTerminated(); - if (e instanceof PasswordException) { - const t = new WorkerTask(`PasswordException: response ${e.code}`); - startWorkerTask(t); - l.sendWithPromise("PasswordRequest", e) - .then(function ({ password: e }) { - finishWorkerTask(t); - i.updatePassword(e); - pdfManagerReady(); - }) - .catch(function () { - finishWorkerTask(t); - l.send("DocException", e); - }); - } else - e instanceof InvalidPDFException || - e instanceof MissingPDFException || - e instanceof UnexpectedResponseException || - e instanceof UnknownErrorException - ? l.send("DocException", e) - : l.send( - "DocException", - new UnknownErrorException(e.message, e.toString()), - ); - } - function pdfManagerReady() { - ensureNotTerminated(); - loadDocument(!1).then(onSuccess, function (e) { - ensureNotTerminated(); - e instanceof XRefParseException - ? i.requestLoadedStream().then(function () { - ensureNotTerminated(); - loadDocument(!0).then(onSuccess, onFailure); - }) - : onFailure(e); - }); - } - ensureNotTerminated(); - getPdfManager(e) - .then(function (e) { - if (a) { - e.terminate(new AbortException("Worker was terminated.")); - throw new Error("Worker was terminated"); - } - i = e; - i.requestLoadedStream(!0).then((e) => { - l.send("DataLoaded", { length: e.bytes.byteLength }); - }); + handler.on("GetOperatorList", function (data, sink) { + const pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page + .getOperatorList({ + handler, + sink, + task, + intent: data.intent, + cacheKey: data.cacheKey, + annotationStorage: data.annotationStorage, + modifiedIds: data.modifiedIds, }) - .then(pdfManagerReady, onFailure); - })(e); - e = null; + .then( + function (operatorListInfo) { + finishWorkerTask(task); + if (start) { + info( + `page=${pageIndex + 1} - getOperatorList: time=` + + `${Date.now() - start}ms, len=${operatorListInfo.length}`, + ); + } + sink.close(); + }, + function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }, + ); + }); }); - return h; + handler.on("GetTextContent", function (data, sink) { + const { pageIndex, includeMarkedContent, disableNormalization } = data; + pdfManager.getPage(pageIndex).then(function (page) { + const task = new WorkerTask("GetTextContent: page " + pageIndex); + startWorkerTask(task); + const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; + page + .extractTextContent({ + handler, + task, + sink, + includeMarkedContent, + disableNormalization, + }) + .then( + function () { + finishWorkerTask(task); + if (start) { + info( + `page=${pageIndex + 1} - getTextContent: time=` + + `${Date.now() - start}ms`, + ); + } + sink.close(); + }, + function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + sink.error(reason); + }, + ); + }); + }); + handler.on("GetStructTree", function (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); + }); + handler.on("Cleanup", function (data) { + return pdfManager.cleanup(true); + }); + handler.on("Terminate", function (data) { + terminated = true; + const waitOn = []; + if (pdfManager) { + pdfManager.terminate(new AbortException("Worker was terminated.")); + const cleanupPromise = pdfManager.cleanup(); + waitOn.push(cleanupPromise); + pdfManager = null; + } else { + clearGlobalCaches(); + } + cancelXHRs?.(new AbortException("Worker was terminated.")); + for (const task of WorkerTasks) { + waitOn.push(task.finished); + task.terminate(); + } + return Promise.all(waitOn).then(function () { + handler.destroy(); + handler = null; + }); + }); + handler.on("Ready", function (data) { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; } - static initializeFromPort(e) { - const t = new MessageHandler("worker", "main", e); - WorkerMessageHandler.setup(t, e); - t.send("ready", null); + static initializeFromPort(port) { + const handler = new MessageHandler("worker", "main", port); + WorkerMessageHandler.setup(handler, port); + handler.send("ready", null); } } -"undefined" == typeof window && - !t && - "undefined" != typeof self && - (function isMessagePort(e) { - return "function" == typeof e.postMessage && "onmessage" in e; - })(self) && +function isMessagePort(maybePort) { + return ( + typeof maybePort.postMessage === "function" && "onmessage" in maybePort + ); +} +if ( + typeof window === "undefined" && + !isNodeJS && + typeof self !== "undefined" && + isMessagePort(self) +) { WorkerMessageHandler.initializeFromPort(self); -var dg = __webpack_exports__.WorkerMessageHandler; -export { dg as WorkerMessageHandler }; +} // ./src/pdf.worker.js + +const pdfjsVersion = "4.8.69"; +const pdfjsBuild = "3634dab10"; + +var __webpack_exports__WorkerMessageHandler = + __webpack_exports__.WorkerMessageHandler; +export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; + +//# sourceMappingURL=pdf.worker.mjs.map diff --git a/web-app/src/index.css b/web-app/src/index.css index 887b6c9ff..4674ea048 100644 --- a/web-app/src/index.css +++ b/web-app/src/index.css @@ -6,8 +6,8 @@ body { } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } /* Chrome, Safari, Edge, Opera */ diff --git a/web-app/src/store.ts b/web-app/src/store.ts index 33e983c52..296f93828 100644 --- a/web-app/src/store.ts +++ b/web-app/src/store.ts @@ -30,7 +30,7 @@ import licenseReducer from "./screens/Console/License/licenseSlice"; import destinationSlice from "./screens/Console/EventDestinations/destinationsSlice"; import { objectBrowserWSMiddleware } from "./websockets/objectBrowserWSMiddleware"; -let objectsWS: WebSocket; +var objectsWS: WebSocket; const rootReducer = combineReducers({ system: systemReducer, diff --git a/web-app/yarn.lock b/web-app/yarn.lock index 2a85b351a..c23345bab 100644 --- a/web-app/yarn.lock +++ b/web-app/yarn.lock @@ -42,7 +42,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.8.3": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -53,7 +53,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": version: 7.26.2 resolution: "@babel/compat-data@npm:7.26.2" checksum: 10c0/c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 @@ -110,6 +110,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" + dependencies: + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5, @babel/helper-annotate-as-pure@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" @@ -129,7 +142,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: @@ -217,15 +230,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.9": - version: 7.24.7 - resolution: "@babel/helper-environment-visitor@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10c0/36ece78882b5960e2d26abf13cf15ff5689bf7c325b10a2895a74a499e712de0d305f8d78bb382dd3c05cfba7e47ec98fe28aab5674243e0625cd38438dd0b2d - languageName: node - linkType: hard - "@babel/helper-member-expression-to-functions@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" @@ -275,7 +279,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.25.9": +"@babel/helper-plugin-utils@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" dependencies: @@ -374,6 +385,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" + dependencies: + "@babel/types": "npm:^7.26.9" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" @@ -433,21 +455,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.18.9" - "@babel/helper-plugin-utils": "npm:^7.20.2" - "@babel/helper-remap-async-to-generator": "npm:^7.18.9" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/0f4bc01805704ae4840536acc9888c50a32250e9188d025063bd17fe77ed171a12361c3dc83ce99664dcd73aec612accb8da95b0d8b825c854931b2860c0bfb5 - languageName: node - linkType: hard - -"@babel/plugin-proposal-class-properties@npm:^7.16.0, @babel/plugin-proposal-class-properties@npm:^7.18.6": +"@babel/plugin-proposal-class-properties@npm:^7.16.0": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" dependencies: @@ -496,21 +504,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" - dependencies: - "@babel/compat-data": "npm:^7.20.5" - "@babel/helper-compilation-targets": "npm:^7.20.7" - "@babel/helper-plugin-utils": "npm:^7.20.2" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.20.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/b9818749bb49d8095df64c45db682448d04743d96722984cbfd375733b2585c26d807f84b4fdb28474f2d614be6a6ffe3d96ffb121840e9e5345b2ccc0438bd8 - languageName: node - linkType: hard - "@babel/plugin-proposal-optional-chaining@npm:^7.16.0": version: 7.21.0 resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" @@ -524,7 +517,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.16.0, @babel/plugin-proposal-private-methods@npm:^7.18.6": +"@babel/plugin-proposal-private-methods@npm:^7.16.0": version: 7.18.6 resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" dependencies: @@ -813,6 +806,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.25.4": + version: 7.26.8 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f6fefce963fe2e6268dde1958975d7adbce65fba94ca6f4bc554c90da03104ad1dd2e66d03bc0462da46868498428646e30b03a218ef0e5a84bfc87a7e375cec + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" @@ -861,7 +867,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.9": +"@babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" dependencies: @@ -873,7 +879,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.26.0": +"@babel/plugin-transform-class-static-block@npm:^7.24.7, @babel/plugin-transform-class-static-block@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" dependencies: @@ -1170,7 +1176,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" dependencies: @@ -1218,7 +1224,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.25.9": +"@babel/plugin-transform-parameters@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-parameters@npm:7.25.9" dependencies: @@ -1229,7 +1235,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.9": +"@babel/plugin-transform-private-methods@npm:^7.25.4, @babel/plugin-transform-private-methods@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" dependencies: @@ -1675,6 +1681,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.4.5, @babel/traverse@npm:^7.7.2": version: 7.25.9 resolution: "@babel/traverse@npm:7.25.9" @@ -1690,7 +1707,22 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/traverse@npm:^7.26.8": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.26.0 resolution: "@babel/types@npm:7.26.0" dependencies: @@ -1700,6 +1732,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2387,25 +2429,6 @@ __metadata: languageName: node linkType: hard -"@mapbox/node-pre-gyp@npm:^1.0.0": - version: 1.0.11 - resolution: "@mapbox/node-pre-gyp@npm:1.0.11" - dependencies: - detect-libc: "npm:^2.0.0" - https-proxy-agent: "npm:^5.0.0" - make-dir: "npm:^3.1.0" - node-fetch: "npm:^2.6.7" - nopt: "npm:^5.0.0" - npmlog: "npm:^5.0.1" - rimraf: "npm:^3.0.2" - semver: "npm:^7.3.5" - tar: "npm:^6.1.11" - bin: - node-pre-gyp: bin/node-pre-gyp - checksum: 10c0/2b24b93c31beca1c91336fa3b3769fda98e202fb7f9771f0f4062588d36dcc30fcf8118c36aa747fa7f7610d8cf601872bdaaf62ce7822bb08b545d1bbe086cc - languageName: node - linkType: hard - "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -2425,6 +2448,16 @@ __metadata: languageName: node linkType: hard +"@nodelib/fs.scandir@npm:4.0.1": + version: 4.0.1 + resolution: "@nodelib/fs.scandir@npm:4.0.1" + dependencies: + "@nodelib/fs.stat": "npm:4.0.0" + run-parallel: "npm:^1.2.0" + checksum: 10c0/b5d73e3c705ea3fa88795448d330bf02c214a225475793ccb5e7da88a7067e5eb03197691112f0b3f60367d9d5239293a1dd23bd0192435c98b6efae6461e5b5 + languageName: node + linkType: hard + "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" @@ -2432,7 +2465,24 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:1.2.8, @nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.stat@npm:4.0.0": + version: 4.0.0 + resolution: "@nodelib/fs.stat@npm:4.0.0" + checksum: 10c0/f44ff60c76a83484d929d231510c8d9f8a9162674bf63b03149ed25ab944010b4603770d845ac671ddba1c9615f3201e46fc22b782d8d4b28ad4d62f5fd19125 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:3.0.1": + version: 3.0.1 + resolution: "@nodelib/fs.walk@npm:3.0.1" + dependencies: + "@nodelib/fs.scandir": "npm:4.0.1" + fastq: "npm:^1.15.0" + checksum: 10c0/1c14b9bd4d9429fca2c4dd89a07fb7d85421d32bca2c5edf2654afe9600c8137c7785dc055da7ddc8b2a1f194f0987b101706edff408976c6a8808fa0eeb691c + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -2471,14 +2521,14 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.45.2": - version: 1.49.0 - resolution: "@playwright/test@npm:1.49.0" +"@playwright/test@npm:^1.50.1": + version: 1.50.1 + resolution: "@playwright/test@npm:1.50.1" dependencies: - playwright: "npm:1.49.0" + playwright: "npm:1.50.1" bin: playwright: cli.js - checksum: 10c0/2890d52ee45bd83b5501f17a77c77f12ba934d257fda4b288405c6d91f94b83c4fcbdff3c0be89c2aaeea3d13576b72ec9a70be667ff844b342044afd72a246e + checksum: 10c0/77c1a7cfaca7b3b88804256bb4c0e15c54b8df02690298086ef4a4fc8c2a42b99b69ba1b83906d00cc7ddb322ce8b2f19f0238f189913607c679779a4d132da1 languageName: node linkType: hard @@ -2626,10 +2676,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.18.0": - version: 1.18.0 - resolution: "@remix-run/router@npm:1.18.0" - checksum: 10c0/3ec7e441a0e54932a3d3bf932432094420f2c117715d80a5454bc7e55d13b91250749942aab032cd07aee191f1c1de33fede8682025bfd3a453dd207c016e140 +"@remix-run/router@npm:1.22.0": + version: 1.22.0 + resolution: "@remix-run/router@npm:1.22.0" + checksum: 10c0/6fbfbdddb485af6bc24635272436fc9884b40d2517581b5cc66ab866279d238ccb11b6f8f67ad99d43ff21c0ea8bc088c96d510a42dcc0cc05a716760fe5a633 languageName: node linkType: hard @@ -3500,7 +3550,7 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.12": +"@types/jest@npm:^29.5.14": version: 29.5.14 resolution: "@types/jest@npm:29.5.14" dependencies: @@ -3524,13 +3574,20 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.72, @types/lodash@npm:^4.17.7": +"@types/lodash@npm:^4.14.72": version: 4.17.13 resolution: "@types/lodash@npm:4.17.13" checksum: 10c0/c3d0b7efe7933ac0369b99f2f7bff9240d960680fdb74b41ed4bd1b3ca60cca1e31fe4046d9abbde778f941a41bc2a75eb629abf8659fa6c27b66efbbb0802a9 languageName: node linkType: hard +"@types/lodash@npm:^4.17.15": + version: 4.17.15 + resolution: "@types/lodash@npm:4.17.15" + checksum: 10c0/2eb2dc6d231f5fb4603d176c08c8d7af688f574d09af47466a179cd7812d9f64144ba74bb32ca014570ffdc544eedc51b7a5657212bad083b6eecbd72223f9bb + languageName: node + linkType: hard + "@types/luxon@npm:^3.4.2": version: 3.4.2 resolution: "@types/luxon@npm:3.4.2" @@ -3595,21 +3652,21 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:20.14.11": - version: 20.14.11 - resolution: "@types/node@npm:20.14.11" +"@types/node@npm:20.14.5": + version: 20.14.5 + resolution: "@types/node@npm:20.14.5" dependencies: undici-types: "npm:~5.26.4" - checksum: 10c0/5306becc0ff41d81b1e31524bd376e958d0741d1ce892dffd586b9ae0cb6553c62b0d62abd16da8bea6b9a2c17572d360450535d7c073794b0cef9cb4e39691e + checksum: 10c0/06a8c304b5f7f190d4497807dc67ad09ee7b14ea2996bfdc823553c624698d8cab1ef9d16f8b764f20cb9eb11caa0e832787741e9ef70e1c89d620797ab28436 languageName: node linkType: hard -"@types/node@npm:^20.14.5": - version: 20.17.6 - resolution: "@types/node@npm:20.17.6" +"@types/node@npm:20.17.19": + version: 20.17.19 + resolution: "@types/node@npm:20.17.19" dependencies: undici-types: "npm:~6.19.2" - checksum: 10c0/5918c7ff8368bbe6d06d5e739c8ae41a9db41628f28760c60cda797be7d233406f07c4d0e6fdd960a0a342ec4173c2217eb6624e06bece21c1f1dd1b92805c15 + checksum: 10c0/930e554eadeb0c2848f9225007ef66ea9c7fe987c80e2f2c1a9f316b297036d4054bbc5459b67051cf32cd360a022344c2998dcb1ec7579109f631b6d5f21bf8 languageName: node linkType: hard @@ -3678,16 +3735,16 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:18.3.0": - version: 18.3.0 - resolution: "@types/react-dom@npm:18.3.0" - dependencies: - "@types/react": "npm:*" - checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b +"@types/react-dom@npm:18.3.5": + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/b163d35a6b32a79f5782574a7aeb12a31a647e248792bf437e6d596e2676961c394c5e3c6e91d1ce44ae90441dbaf93158efb4f051c0d61e2612f1cb04ce4faa languageName: node linkType: hard -"@types/react-redux@npm:^7.1.33": +"@types/react-redux@npm:^7.1.34": version: 7.1.34 resolution: "@types/react-redux@npm:7.1.34" dependencies: @@ -3699,13 +3756,13 @@ __metadata: languageName: node linkType: hard -"@types/react-virtualized@npm:^9.21.30": - version: 9.22.0 - resolution: "@types/react-virtualized@npm:9.22.0" +"@types/react-virtualized@npm:^9.22.2": + version: 9.22.2 + resolution: "@types/react-virtualized@npm:9.22.2" dependencies: "@types/prop-types": "npm:*" "@types/react": "npm:*" - checksum: 10c0/dede58499c90fbc2042e58a3c7192a92b8bc61fed0589a95911d2a0726f202fa0bd87c9fc68e861ce0a6a034a7460a195b291ff49465a3b620e9f630bfdc9246 + checksum: 10c0/e46ae29ef3187d15c1a6693694e2612da0b6a7f259b12f86b58d150df02e5ca8bb4776cbe6059af5e0e6e48584e5fa10465e951662a3f74e47663a742f4d4d5d languageName: node linkType: hard @@ -3738,13 +3795,13 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:18.3.3": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" +"@types/react@npm:18.3.18": + version: 18.3.18 + resolution: "@types/react@npm:18.3.18" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114 + checksum: 10c0/8fb2b00672072135d0858dc9db07873ea107cc238b6228aaa2a9afd1ef7a64a7074078250db38afbeb19064be8ea6af5eac32d404efdd5f45e093cc4829d87f8 languageName: node linkType: hard @@ -3876,10 +3933,10 @@ __metadata: languageName: node linkType: hard -"@types/webpack-env@npm:^1.18.5": - version: 1.18.5 - resolution: "@types/webpack-env@npm:1.18.5" - checksum: 10c0/b9e4876e8c7cae419896249f9ed795db283c008fe1d38efa679cbbf05194fc2eea2a5bfb4ff4393d109e3a9895416dadf5f3ddd5c22931b678062230f860454e +"@types/webpack-env@npm:^1.18.8": + version: 1.18.8 + resolution: "@types/webpack-env@npm:1.18.8" + checksum: 10c0/527a5d1eb75c5243e4f3665d956c7c340f899955dd25d16c9fd9750406f32e95a3a17d207640295038e8235c0c2a2daf084f420e088e58b965d82fc74f6012d7 languageName: node linkType: hard @@ -4319,13 +4376,6 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:1": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 - languageName: node - linkType: hard - "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -4605,13 +4655,6 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 - languageName: node - linkType: hard - "archy@npm:^1.0.0": version: 1.0.0 resolution: "archy@npm:1.0.0" @@ -4619,16 +4662,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10c0/375f753c10329153c8d66dc95e8f8b6c7cc2aa66e05cb0960bd69092b10dae22900cacc7d653ad11d26b3ecbdbfe1e8bfb6ccf0265ba8077a7d979970f16b99c - languageName: node - linkType: hard - "arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" @@ -5206,6 +5239,13 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -5240,6 +5280,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + "block-stream2@npm:^2.1.0": version: 2.1.0 resolution: "block-stream2@npm:2.1.0" @@ -5395,6 +5446,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "builtin-modules@npm:^3.1.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" @@ -5525,15 +5586,14 @@ __metadata: languageName: node linkType: hard -"canvas@npm:^2.11.2": - version: 2.11.2 - resolution: "canvas@npm:2.11.2" +"canvas@npm:^3.0.0-rc2": + version: 3.1.0 + resolution: "canvas@npm:3.1.0" dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.0" - nan: "npm:^2.17.0" + node-addon-api: "npm:^7.0.0" node-gyp: "npm:latest" - simple-get: "npm:^3.0.3" - checksum: 10c0/943368798ad1b66b18633aa34b6181e1038dac5433fc9727cd07be35f0a633f572b60d9edb95f5ff90b6a9128e86d5312035f91a2934101c73185b15d906230a + prebuild-install: "npm:^7.1.1" + checksum: 10c0/28da5184c1d7e97049ba6a24f10690b9ed4b303bbd25517d95c892fa3a6331417791657a3a7467068e40af0dda2dcc9120d062f7426a3d796131e69a30e3cbf1 languageName: node linkType: hard @@ -5709,6 +5769,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -5882,15 +5949,6 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 - languageName: node - linkType: hard - "colord@npm:^2.9.1": version: 2.9.3 resolution: "colord@npm:2.9.3" @@ -6029,13 +6087,6 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 - languageName: node - linkType: hard - "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -6720,12 +6771,12 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^4.2.0": - version: 4.2.1 - resolution: "decompress-response@npm:4.2.1" +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" dependencies: - mimic-response: "npm:^2.0.0" - checksum: 10c0/5e4821be332e80e3639acee2441c41d245fc07ac3ee85a6f28893c10c079d66d9bf09e8d84bffeae5656a4625e09e9b93fb4a5705adbe6b07202eea64fae1c8d + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e languageName: node linkType: hard @@ -6766,6 +6817,13 @@ __metadata: languageName: node linkType: hard +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -6873,13 +6931,6 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 - languageName: node - linkType: hard - "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -6977,6 +7028,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:0.0.1109433": + version: 0.0.1109433 + resolution: "devtools-protocol@npm:0.0.1109433" + checksum: 10c0/a47cf6acce09ad3f30882d817ef5df0e0da94f78102c6261ebea434d71502b9d3dc8f96b3246f775da3b64bc03ca19495893d27927d19aeea846db08e88055d9 + languageName: node + linkType: hard + "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -7339,7 +7397,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -7358,6 +7416,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.18.0": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/4cffd9b125225184e2abed9fdf0ed3dbd2224c873b165d0838fd066cde32e0918626cba2f1f4bf6860762f13a7e2364fd89a82b99566be2873d813573ac71846 + languageName: node + linkType: hard + "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -7917,6 +7985,15 @@ __metadata: languageName: node linkType: hard +"esotope-hammerhead@npm:0.6.9": + version: 0.6.9 + resolution: "esotope-hammerhead@npm:0.6.9" + dependencies: + "@types/estree": "npm:0.0.46" + checksum: 10c0/ede732050763000a340223ff2c4a764361512ed0d484a71f331ed71177fd378e7269c5c4a158f2676d2a524c433f70d019479d95ab4d4a5bfe5a0d34b278bd72 + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -8090,6 +8167,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + "expect@npm:^27.5.1": version: 27.5.1 resolution: "expect@npm:27.5.1" @@ -8202,6 +8286,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -8241,6 +8338,15 @@ __metadata: languageName: node linkType: hard +"fastq@npm:^1.15.0": + version: 1.19.0 + resolution: "fastq@npm:1.19.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/d6a001638f1574a696660fcbba5300d017760432372c801632c325ca7c16819604841c92fd3ccadcdacec0966ca336363a5ff57bc5f0be335d8ea7ac6087b98f + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.17.1 resolution: "fastq@npm:1.17.1" @@ -8550,6 +8656,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-extra@npm:^10.0.0": version: 10.1.0 resolution: "fs-extra@npm:10.1.0" @@ -8676,23 +8789,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10c0/75230ccaf216471e31025c7d5fcea1629596ca20792de50c596eb18ffb14d8404f927cd55535aab2eeecd18d1e11bd6f23ec3c2e9878d2dda1dc74bccc34b913 - languageName: node - linkType: hard - "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -8805,6 +8901,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -9070,13 +9173,6 @@ __metadata: languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c - languageName: node - linkType: hard - "hasha@npm:^5.0.0": version: 5.2.2 resolution: "hasha@npm:5.2.2" @@ -9574,6 +9670,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.1.1, ignore@npm:^5.1.8, ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -9654,7 +9757,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -9668,7 +9771,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.5": +"ini@npm:^1.3.5, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a @@ -11016,12 +11119,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.4.0": - version: 2.4.0 - resolution: "jiti@npm:2.4.0" +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" bin: jiti: lib/jiti-cli.mjs - checksum: 10c0/f97365a83169e0544b0a6e7f415f1ee69ca9c0bdd55e336035490b4b7a6ff99b63b9df89c70babfc49e924247dfbdc730f9eb0c5ed4771d3db989ac70e49bf18 + checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 languageName: node linkType: hard @@ -11255,9 +11358,9 @@ __metadata: languageName: node linkType: hard -"kbar@npm:^0.1.0-beta.45": - version: 0.1.0-beta.45 - resolution: "kbar@npm:0.1.0-beta.45" +"kbar@npm:^0.1.0-beta.46": + version: 0.1.0-beta.46 + resolution: "kbar@npm:0.1.0-beta.46" dependencies: "@radix-ui/react-portal": "npm:^1.0.1" fast-equals: "npm:^2.0.3" @@ -11265,9 +11368,9 @@ __metadata: react-virtual: "npm:^2.8.2" tiny-invariant: "npm:^1.2.0" peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/5d40e9d45df3ca3364e774f30c59a9f429edae40c6853dc0392ae3a1497725f20af1d95f8abb9b6d1f1e6608eb5cda49b7818e10e0cd853b5b3512ad7b6046bc + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/a217eb1a77cf6ee7c455b32a178c8308019be1fd15f5f6f3cd7cb66f9c35a8a163ffe855e1475a37baed88827b5992f6d13b929505dc3606deffe0277de8e77a languageName: node linkType: hard @@ -11308,22 +11411,22 @@ __metadata: languageName: node linkType: hard -"knip@npm:^5.27.2": - version: 5.37.1 - resolution: "knip@npm:5.37.1" +"knip@npm:^5.44.4": + version: 5.44.4 + resolution: "knip@npm:5.44.4" dependencies: - "@nodelib/fs.walk": "npm:1.2.8" + "@nodelib/fs.walk": "npm:3.0.1" "@snyk/github-codeowners": "npm:1.1.0" easy-table: "npm:1.2.0" - enhanced-resolve: "npm:^5.17.1" - fast-glob: "npm:^3.3.2" - jiti: "npm:^2.4.0" + enhanced-resolve: "npm:^5.18.0" + fast-glob: "npm:^3.3.3" + jiti: "npm:^2.4.2" js-yaml: "npm:^4.1.0" minimist: "npm:^1.2.8" picocolors: "npm:^1.1.0" picomatch: "npm:^4.0.1" pretty-ms: "npm:^9.0.0" - smol-toml: "npm:^1.3.0" + smol-toml: "npm:^1.3.1" strip-json-comments: "npm:5.0.1" summary: "npm:2.1.0" zod: "npm:^3.22.4" @@ -11334,7 +11437,7 @@ __metadata: bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: 10c0/6539854918c3773bf5cd4c0cb9fc4dcfb3e2dac604029bd5ed476f7acbceee0a437ff80c51d993eac2fcbf68af52658bc4d7a4d3b96b2b50be4244385e1cd2c9 + checksum: 10c0/36f2405e21c06b852847cf9c716d53e13adf28383ba8cd89e64751f1210335948367124d168237a82bd17683f41932d3972046dbda8e70fea533f60db8bef950 languageName: node linkType: hard @@ -11446,7 +11549,7 @@ __metadata: languageName: node linkType: hard -"local-storage-fallback@npm:^4.1.2": +"local-storage-fallback@npm:^4.1.3": version: 4.1.3 resolution: "local-storage-fallback@npm:4.1.3" dependencies: @@ -11578,6 +11681,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:11.0.2": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10c0/c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f + languageName: node + linkType: hard + "lru-cache@npm:2.6.3": version: 2.6.3 resolution: "lru-cache@npm:2.6.3" @@ -11601,7 +11711,7 @@ __metadata: languageName: node linkType: hard -"luxon@npm:^3.4.4": +"luxon@npm:^3.4.4, luxon@npm:^3.5.0": version: 3.5.0 resolution: "luxon@npm:3.5.0" checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494 @@ -12256,10 +12366,10 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^2.0.0": - version: 2.1.0 - resolution: "mimic-response@npm:2.1.0" - checksum: 10c0/717475c840f20deca87a16cb2f7561f9115f5de225ea2377739e09890c81aec72f43c81fd4984650c4044e66be5a846fa7a517ac7908f01009e1e624e19864d5 +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 languageName: node linkType: hard @@ -12316,16 +12426,16 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": +"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard -"minio@npm:^8.0.1": - version: 8.0.2 - resolution: "minio@npm:8.0.2" +"minio@npm:^8.0.4": + version: 8.0.4 + resolution: "minio@npm:8.0.4" dependencies: async: "npm:^3.2.4" block-stream2: "npm:^2.1.0" @@ -12341,7 +12451,7 @@ __metadata: through2: "npm:^4.0.2" web-encoding: "npm:^1.1.5" xml2js: "npm:^0.5.0 || ^0.6.2" - checksum: 10c0/afba8ba80a60bef447e993a7b7e9e04142d29b1a844501d32cd7f7fcced1ee778ba0b4e297598392923009c4bb8e2369de82dedf3c553c03a684f099009a377d + checksum: 10c0/4635ab5280dee54ac92041822fa611571bd9e0b4a19a7f4b47f0b187b07a696cc70f4c4825003b040e174816c527688edb922b829dbe7d8e44530733e19096db languageName: node linkType: hard @@ -12429,6 +12539,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + "mkdirp@npm:^0.5.1, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" @@ -12523,15 +12640,6 @@ __metadata: languageName: node linkType: hard -"nan@npm:^2.17.0": - version: 2.22.0 - resolution: "nan@npm:2.22.0" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/d5d31aefdb218deba308d44867c5f432b4d3aabeb57c70a2b236d62652e9fee7044e5d5afd380d9fef022fe7ebb2f2d6c85ca3cbcac5031aaca3592c844526bb - languageName: node - linkType: hard - "nanoid@npm:^3.1.12, nanoid@npm:^3.1.31, nanoid@npm:^3.3.7": version: 3.3.8 resolution: "nanoid@npm:3.3.8" @@ -12541,6 +12649,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "napi-build-utils@npm:2.0.0" + checksum: 10c0/5833aaeb5cc5c173da47a102efa4680a95842c13e0d9cc70428bd3ee8d96bb2172f8860d2811799b5daa5cbeda779933601492a2028a6a5351c6d0fcf6de83db + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -12586,17 +12701,21 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" +"node-abi@npm:^3.3.0": + version: 3.74.0 + resolution: "node-abi@npm:3.74.0" dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + semver: "npm:^7.3.5" + checksum: 10c0/a6c83c448d5e8b591f749a0157c9ec02f653021cdf3415c1a44fcb5fc8afc124acad186bc1ec76cb4db2485cc2dcdda187aacd382c54b6e3093ffc0389603643 + languageName: node + linkType: hard + +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 languageName: node linkType: hard @@ -12650,17 +12769,6 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^5.0.0": - version: 5.0.0 - resolution: "nopt@npm:5.0.0" - dependencies: - abbrev: "npm:1" - bin: - nopt: bin/nopt.js - checksum: 10c0/fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 - languageName: node - linkType: hard - "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -12702,18 +12810,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: "npm:^2.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^3.0.0" - set-blocking: "npm:^2.0.0" - checksum: 10c0/489ba519031013001135c463406f55491a17fc7da295c18a04937fe3a4d523fd65e88dd418a28b967ab743d913fdeba1e29838ce0ad8c75557057c481f7d49fa - languageName: node - linkType: hard - "nth-check@npm:^2.0.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" @@ -13264,7 +13360,7 @@ __metadata: languageName: node linkType: hard -"path2d@npm:^0.2.0": +"path2d@npm:^0.2.1": version: 0.2.2 resolution: "path2d@npm:0.2.2" checksum: 10c0/1bb76c7f275d07f1bc7ca12171d828e91bf8a12596f0765a52e9d4d47fe1a428455dc1dd4c9002924a9bc554f6ac25e09a6c22eaecf32e5e33fba2985b5168f8 @@ -13285,18 +13381,18 @@ __metadata: languageName: node linkType: hard -"pdfjs-dist@npm:4.4.168": - version: 4.4.168 - resolution: "pdfjs-dist@npm:4.4.168" +"pdfjs-dist@npm:4.8.69": + version: 4.8.69 + resolution: "pdfjs-dist@npm:4.8.69" dependencies: - canvas: "npm:^2.11.2" - path2d: "npm:^0.2.0" + canvas: "npm:^3.0.0-rc2" + path2d: "npm:^0.2.1" dependenciesMeta: canvas: optional: true path2d: optional: true - checksum: 10c0/61bad19fe0aae8261631d425bd96368cf0b8803c3a4446615456dddd867ef3e5ba15c11a1caabb8033bce9538e3ad8262c24a56fa68b150c6ee0eb9e26a9f3a7 + checksum: 10c0/dc297f2a36aa36834a2892cb78c3cafc7ac01753a2e7c4316a1f6e8c1d337a52a3bfbf7fdff7aaba615893b53f2d06a0efc2176525592b4d7b51021279c101be languageName: node linkType: hard @@ -13399,27 +13495,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.49.0": - version: 1.49.0 - resolution: "playwright-core@npm:1.49.0" +"playwright-core@npm:1.50.1": + version: 1.50.1 + resolution: "playwright-core@npm:1.50.1" bin: playwright-core: cli.js - checksum: 10c0/22c1a72fabdcc87bd1cd4d40a032d2c5b94cf94ba7484dc182048c3fa1c8ec26180b559d8cac4ca9870e8fd6bdf5ef9d9f54e7a31fd60d67d098fcffc5e4253b + checksum: 10c0/c158764257d870897c31807a830ddcc3f5aaf4376719e05aeada3489a01f751650b2dc43e027201a40405a1b075084e89f58cd3730a985a229efe9d8cecfe360 languageName: node linkType: hard -"playwright@npm:1.49.0": - version: 1.49.0 - resolution: "playwright@npm:1.49.0" +"playwright@npm:1.50.1": + version: 1.50.1 + resolution: "playwright@npm:1.50.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.49.0" + playwright-core: "npm:1.50.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/e94d662747cd147d0573570fec90dadc013c1097595714036fc8934a075c5a82ab04a49111b03b1f762ea86429bdb7c94460901896901e20970b30ce817cc93f + checksum: 10c0/b292ee6e0d122748a3d024b85ace86a0d9c848fc4121685d90ffc5d43d6bcf13ed7dc7488b1055f69040599c420052306ccba6fabfe2f69a15fc109c55171207 languageName: node linkType: hard @@ -14278,6 +14374,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.3 + resolution: "prebuild-install@npm:7.1.3" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^2.0.0" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/25919a42b52734606a4036ab492d37cfe8b601273d8dfb1fa3c84e141a0a475e7bad3ab848c741d2f810cef892fcf6059b8c7fe5b29f98d30e0c29ad009bedff + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -14292,12 +14410,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" +"prettier@npm:3.5.1": + version: 3.5.1 + resolution: "prettier@npm:3.5.1" bin: prettier: bin/prettier.cjs - checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 + checksum: 10c0/9f6f810eae455d6e4213845151a484a2338f2e0d6a8b84ee8e13a83af8a2421ef6c1e31e61e4b135671fb57b9541f6624648880cc2061ac803e243ac898c0123 languageName: node linkType: hard @@ -14580,6 +14698,20 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + "react-app-polyfill@npm:^3.0.0": version: 3.0.0 resolution: "react-app-polyfill@npm:3.0.0" @@ -14701,7 +14833,7 @@ __metadata: languageName: node linkType: hard -"react-dropzone@npm:^14.2.3": +"react-dropzone@npm:^14.3.5": version: 14.3.5 resolution: "react-dropzone@npm:14.3.5" dependencies: @@ -14775,16 +14907,16 @@ __metadata: languageName: node linkType: hard -"react-pdf@npm:^9.1.0": - version: 9.1.1 - resolution: "react-pdf@npm:9.1.1" +"react-pdf@npm:^9.2.1": + version: 9.2.1 + resolution: "react-pdf@npm:9.2.1" dependencies: clsx: "npm:^2.0.0" dequal: "npm:^2.0.3" make-cancellable-promise: "npm:^1.3.1" make-event-props: "npm:^1.6.0" merge-refs: "npm:^1.3.0" - pdfjs-dist: "npm:4.4.168" + pdfjs-dist: "npm:4.8.69" tiny-invariant: "npm:^1.0.0" warning: "npm:^4.0.0" peerDependencies: @@ -14794,7 +14926,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/441faf64ef4809920b2fc1a9dfbbae976f74193f54015764beafd82981c79fa6bbaee9bf774633f6ea63f9b701523df7bbf48acae6e0fb100ccc2e1cc33fbdaa + checksum: 10c0/69b5456b3941ea08f03319a94b155db782232dee4b3e03513c4a4c10cc3d81d129fc3284136990b51d5dcf766192abc64d71e1d258ca7e0eb4e6592343fea6a4 languageName: node linkType: hard @@ -14837,27 +14969,27 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:6.25.1": - version: 6.25.1 - resolution: "react-router-dom@npm:6.25.1" +"react-router-dom@npm:6.29.0": + version: 6.29.0 + resolution: "react-router-dom@npm:6.29.0" dependencies: - "@remix-run/router": "npm:1.18.0" - react-router: "npm:6.25.1" + "@remix-run/router": "npm:1.22.0" + react-router: "npm:6.29.0" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10c0/15e2b5bf89a26db9a108d19a4e0e2054180bfb1f5f62662dd93ad697ee1bdc91a8041efd762d552c95e65fc06ca0cb0c1e88acdeeaf03aba37f7a29e470c7cc4 + checksum: 10c0/f89f922006b6ff896ba81d82088812e42ae56790ccb838e7041eebe0f7d36ac2a4eca56512a422da4249cca23f389f998e84cf8ff868d4a83defd72951b8fbf9 languageName: node linkType: hard -"react-router@npm:6.25.1": - version: 6.25.1 - resolution: "react-router@npm:6.25.1" +"react-router@npm:6.29.0": + version: 6.29.0 + resolution: "react-router@npm:6.29.0" dependencies: - "@remix-run/router": "npm:1.18.0" + "@remix-run/router": "npm:1.22.0" peerDependencies: react: ">=16.8" - checksum: 10c0/a7e824c1f6d9641beabc23111865ddd2525b3794403e07b297fc2bdd4cddec93e166aacdb9d2602768864d70f3bf490f59eeab8474a04ae1f13a832f305eeec3 + checksum: 10c0/0ad27b34e2ccb6db68ef124cd4492ba86b5422ea3e2af01c9de95e372eb3a36fb4727b40488ebc90e5e0cea41bc655c53569a754713554a465ca9423aa233df8 languageName: node linkType: hard @@ -14928,17 +15060,17 @@ __metadata: languageName: node linkType: hard -"react-smooth@npm:^4.0.0": - version: 4.0.1 - resolution: "react-smooth@npm:4.0.1" +"react-smooth@npm:^4.0.4": + version: 4.0.4 + resolution: "react-smooth@npm:4.0.4" dependencies: fast-equals: "npm:^5.0.1" prop-types: "npm:^15.8.1" react-transition-group: "npm:^4.4.5" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/5c19a2c147798c3de1329d442b1a371139c01113cc108c38c201b63502c329f943ede505c44089d26a6563eaa72a67b845d538d956f34a389b37fd3961308834 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/d94cb27f808721ec040d320ca1927919199495fd212e54eb9dc8ee3f73ff1d808a34be9f4b09fe49b01f411ac2387fdf0e4bee297f18faf56f94bfbef5fd204c languageName: node linkType: hard @@ -14985,26 +15117,43 @@ __metadata: languageName: node linkType: hard -"react-window-infinite-loader@npm:^1.0.9": - version: 1.0.9 - resolution: "react-window-infinite-loader@npm:1.0.9" +"react-virtualized@npm:^9.22.6": + version: 9.22.6 + resolution: "react-virtualized@npm:9.22.6" + dependencies: + "@babel/runtime": "npm:^7.7.2" + clsx: "npm:^1.0.4" + dom-helpers: "npm:^5.1.3" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.7.2" + react-lifecycles-compat: "npm:^3.0.4" peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - checksum: 10c0/4ffe7e31cde1e9fc353beb5b0a0c9a2a3b20459d13fbda8f0501d8fa4a1e869342dd276f3cb5538527a598eb5d669d8629dccf42d13f114faf0a8ad611de0bf7 + react: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/0c4fbe86e0c121adcdb7a3f322601eee4661afe65e31ef767c6d876016b1e7043fdad7998b4fa0252eaf73ffb6c14effcf0f729d154cd15304a8b15ad42b7b06 languageName: node linkType: hard -"react-window@npm:^1.8.10": - version: 1.8.10 - resolution: "react-window@npm:1.8.10" +"react-window-infinite-loader@npm:^1.0.10": + version: 1.0.10 + resolution: "react-window-infinite-loader@npm:1.0.10" + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/26283f0c4ac347d355948d54fba8629935563560f4d114ee701555a7d6251f80271edbcfa994bcc16f15f56637141c503963662f5cdbe51fad946793d2645a76 + languageName: node + linkType: hard + +"react-window@npm:^1.8.11": + version: 1.8.11 + resolution: "react-window@npm:1.8.11" dependencies: "@babel/runtime": "npm:^7.0.0" memoize-one: "npm:>=3.1.1 <6" peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/eda9afb667d9784513dcc2755b65edf3a1412e7877975322993c1382908aaef0c0b948b7e3b2d705e353306556274d90f7ab19ac40aef2184fa39d4c1e2232ea + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/5ae8da1bc5c47d8f0a428b28a600256e2db511975573e52cb65a9b27ed1a0e5b9f7b3bee5a54fb0da93956d782c24010be434be451072f46ba5a89159d2b3944 languageName: node linkType: hard @@ -15035,7 +15184,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -15079,22 +15228,22 @@ __metadata: languageName: node linkType: hard -"recharts@npm:^2.12.7": - version: 2.13.3 - resolution: "recharts@npm:2.13.3" +"recharts@npm:^2.15.1": + version: 2.15.1 + resolution: "recharts@npm:2.15.1" dependencies: clsx: "npm:^2.0.0" eventemitter3: "npm:^4.0.1" lodash: "npm:^4.17.21" react-is: "npm:^18.3.1" - react-smooth: "npm:^4.0.0" + react-smooth: "npm:^4.0.4" recharts-scale: "npm:^0.4.4" tiny-invariant: "npm:^1.3.1" victory-vendor: "npm:^36.6.8" peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/67c516cd142da0e5968cf9b723c1bc08c2324ff4c41952d623dfce06e8c13751e1ef885b2e39aaeb5e32595566c8d91633328850adee70ad53bc8685adff456d + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/1ec3cea442382fe986500b5cc95ef3d5ee194a1cb244fa0fe288b5474c0aa501f89ed39590e1a5fec6ecdfd7ab92bb1e986699a66688423608b75b2559a865b3 languageName: node linkType: hard @@ -15657,7 +15806,7 @@ __metadata: languageName: node linkType: hard -"run-parallel@npm:^1.1.9": +"run-parallel@npm:^1.1.9, run-parallel@npm:^1.2.0": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" dependencies: @@ -16025,7 +16174,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -16046,14 +16195,14 @@ __metadata: languageName: node linkType: hard -"simple-get@npm:^3.0.3": - version: 3.1.1 - resolution: "simple-get@npm:3.1.1" +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" dependencies: - decompress-response: "npm:^4.2.0" + decompress-response: "npm:^6.0.0" once: "npm:^1.3.1" simple-concat: "npm:^1.0.0" - checksum: 10c0/438c78844ea1b1e7268d13ee0b3a39c7d644183367aec916aed3b676b45d3037a61d9f975c200a49b42eb851f29f03745118af1e13c01e60a7b4044f2fd60be7 + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 languageName: node linkType: hard @@ -16085,7 +16234,7 @@ __metadata: languageName: node linkType: hard -"smol-toml@npm:^1.3.0": +"smol-toml@npm:^1.3.1": version: 1.3.1 resolution: "smol-toml@npm:1.3.1" checksum: 10c0/bac5bf4f2655fd561fe41f9426d70ab68b486631beff97a7f127f5d2f811b5e247d50a06583be03d35a625dcb05b7984b94a61a81c68ea2810ac7a9bf4edc64d @@ -16372,7 +16521,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -16586,6 +16735,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + "strnum@npm:^1.0.5": version: 1.0.5 resolution: "strnum@npm:1.0.5" @@ -16839,6 +16995,31 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.0.0": + version: 2.1.2 + resolution: "tar-fs@npm:2.1.2" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/9c704bd4a53be7565caf34ed001d1428532457fe3546d8fc1233f0f0882c3d2403f8602e8046e0b0adeb31fe95336572a69fb28851a391523126b697537670fc + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -16954,9 +17135,9 @@ __metadata: languageName: node linkType: hard -"testcafe-hammerhead@npm:31.7.2": - version: 31.7.2 - resolution: "testcafe-hammerhead@npm:31.7.2" +"testcafe-hammerhead@npm:31.7.5": + version: 31.7.5 + resolution: "testcafe-hammerhead@npm:31.7.5" dependencies: "@adobe/css-tools": "npm:^4.3.0-rc.1" "@electron/asar": "npm:^3.2.3" @@ -16964,12 +17145,12 @@ __metadata: bowser: "npm:1.6.0" crypto-md5: "npm:^1.0.0" debug: "npm:4.3.1" - esotope-hammerhead: "npm:0.6.8" + esotope-hammerhead: "npm:0.6.9" http-cache-semantics: "npm:^4.1.0" httpntlm: "npm:^1.8.10" iconv-lite: "npm:0.5.1" lodash: "npm:^4.17.21" - lru-cache: "npm:2.6.3" + lru-cache: "npm:11.0.2" match-url-wildcard: "npm:0.0.4" merge-stream: "npm:^1.0.1" mime: "npm:~1.4.1" @@ -16983,7 +17164,7 @@ __metadata: tough-cookie: "npm:4.1.3" tunnel-agent: "npm:0.6.0" ws: "npm:^7.4.6" - checksum: 10c0/9783e4486b78f32c848ed0f3ded522b9e390de310de7e5d0b0d9aec0db334652ab66ec9d73ac0069164ecf09b2839e67b056219dd1503549eeb45be915148d85 + checksum: 10c0/9a2ecedcb7cccbc74833b2baf9c7fd46844427ebd2948fd28bc1a07c7d451166b00d172fbb91bcbe9d94f5072a812ea2afed3648075048aea4baad2078028a1a languageName: node linkType: hard @@ -17076,13 +17257,6 @@ __metadata: languageName: node linkType: hard -"testcafe-safe-storage@npm:^1.1.1": - version: 1.1.6 - resolution: "testcafe-safe-storage@npm:1.1.6" - checksum: 10c0/51cd99d666772b59fe33575f8ca0a0f57fb588144fadcaaf76c5bfbec8249f6e5748b939dca15dcb420748edc75b089e380b29ef5271f5866bb6e30bf61ac871 - languageName: node - linkType: hard - "testcafe-selector-generator@npm:^0.1.0": version: 0.1.0 resolution: "testcafe-selector-generator@npm:0.1.0" @@ -17090,21 +17264,22 @@ __metadata: languageName: node linkType: hard -"testcafe@npm:3.6.2": - version: 3.6.2 - resolution: "testcafe@npm:3.6.2" +"testcafe@npm:3.7.2": + version: 3.7.2 + resolution: "testcafe@npm:3.7.2" dependencies: "@babel/core": "npm:^7.23.2" - "@babel/plugin-proposal-async-generator-functions": "npm:^7.20.7" - "@babel/plugin-proposal-class-properties": "npm:^7.18.6" "@babel/plugin-proposal-decorators": "npm:^7.23.2" - "@babel/plugin-proposal-object-rest-spread": "npm:^7.20.7" - "@babel/plugin-proposal-private-methods": "npm:^7.18.6" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" "@babel/plugin-transform-async-to-generator": "npm:^7.22.5" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-class-static-block": "npm:^7.24.7" "@babel/plugin-transform-exponentiation-operator": "npm:^7.22.5" "@babel/plugin-transform-for-of": "npm:^7.22.15" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.25.4" "@babel/plugin-transform-runtime": "npm:7.23.3" "@babel/preset-env": "npm:^7.23.2" "@babel/preset-flow": "npm:^7.22.15" @@ -17112,7 +17287,7 @@ __metadata: "@babel/runtime": "npm:^7.23.2" "@devexpress/bin-v8-flags-filter": "npm:^1.3.0" "@devexpress/callsite-record": "npm:^4.1.6" - "@types/node": "npm:^20.14.5" + "@types/node": "npm:20.14.5" address: "npm:^2.0.2" async-exit-hook: "npm:^1.1.2" babel-plugin-module-resolver: "npm:5.0.0" @@ -17128,6 +17303,7 @@ __metadata: dedent: "npm:^0.4.0" del: "npm:^3.0.0" device-specs: "npm:^1.0.0" + devtools-protocol: "npm:0.0.1109433" diff: "npm:^4.0.2" elegant-spinner: "npm:^1.0.1" email-validator: "npm:^2.0.4" @@ -17175,14 +17351,13 @@ __metadata: source-map-support: "npm:^0.5.16" strip-bom: "npm:^2.0.0" testcafe-browser-tools: "npm:2.0.26" - testcafe-hammerhead: "npm:31.7.2" + testcafe-hammerhead: "npm:31.7.5" testcafe-legacy-api: "npm:5.1.8" testcafe-reporter-json: "npm:^2.1.0" testcafe-reporter-list: "npm:^2.2.0" testcafe-reporter-minimal: "npm:^2.2.0" testcafe-reporter-spec: "npm:^2.2.0" testcafe-reporter-xunit: "npm:^2.2.1" - testcafe-safe-storage: "npm:^1.1.1" testcafe-selector-generator: "npm:^0.1.0" time-limit-promise: "npm:^1.0.2" tmp: "npm:0.0.28" @@ -17192,7 +17367,7 @@ __metadata: url-to-options: "npm:^2.0.0" bin: testcafe: bin/testcafe-with-v8-flag-filter.js - checksum: 10c0/f979d76283e466a0a78fb32f4abec2573b133f1084d930ea0245847b7111b22ae52fa2f891faac86553eb3ad41fe6e2fcad556130215c1b12f1e92d64b81f03a + checksum: 10c0/dd0128b2419dcd4697011ac66429ebf9762e2fff00b0307772f9e383fa32898245a55a4af658f9a1a0aecc8f18abdcd32c74641823b96ddffcb4cf317f5c6184 languageName: node linkType: hard @@ -17369,13 +17544,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 - languageName: node - linkType: hard - "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -17459,7 +17627,7 @@ __metadata: languageName: node linkType: hard -"tunnel-agent@npm:0.6.0": +"tunnel-agent@npm:0.6.0, tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" dependencies: @@ -17617,12 +17785,12 @@ __metadata: linkType: hard "typescript@npm:^5.5.3": - version: 5.6.3 - resolution: "typescript@npm:5.6.3" + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa languageName: node linkType: hard @@ -17637,12 +17805,12 @@ __metadata: linkType: hard "typescript@patch:typescript@npm%3A^5.5.3#optional!builtin": - version: 5.6.3 - resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=74658d" + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=74658d" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f + checksum: 10c0/3b56d6afa03d9f6172d0b9cdb10e6b1efc9abc1608efd7a3d2f38773d5d8cfb9bbc68dfb72f0a7de5e8db04fc847f4e4baeddcd5ad9c9feda072234f0d788896 languageName: node linkType: hard @@ -18211,54 +18379,54 @@ __metadata: resolution: "web-app@workspace:." dependencies: "@babel/plugin-proposal-private-property-in-object": "npm:^7.21.11" - "@playwright/test": "npm:^1.45.2" + "@playwright/test": "npm:^1.50.1" "@reduxjs/toolkit": "npm:^1.9.7" - "@types/jest": "npm:^29.5.12" - "@types/lodash": "npm:^4.17.7" + "@types/jest": "npm:^29.5.14" + "@types/lodash": "npm:^4.17.15" "@types/luxon": "npm:^3.4.2" - "@types/node": "npm:20.14.11" - "@types/react": "npm:18.3.3" + "@types/node": "npm:20.17.19" + "@types/react": "npm:18.3.18" "@types/react-copy-to-clipboard": "npm:^5.0.7" - "@types/react-dom": "npm:18.3.0" - "@types/react-redux": "npm:^7.1.33" - "@types/react-virtualized": "npm:^9.21.30" + "@types/react-dom": "npm:18.3.5" + "@types/react-redux": "npm:^7.1.34" + "@types/react-virtualized": "npm:^9.22.2" "@types/react-window": "npm:^1.8.8" "@types/react-window-infinite-loader": "npm:^1.0.9" "@types/recharts": "npm:^1.8.29" "@types/superagent": "npm:^4.1.24" - "@types/webpack-env": "npm:^1.18.5" + "@types/webpack-env": "npm:^1.18.8" babel-plugin-istanbul: "npm:^6.1.1" clsx: "npm:^2.1.1" customize-cra: "npm:^1.0.0" http-status-codes: "npm:^2.3.0" - kbar: "npm:^0.1.0-beta.45" - knip: "npm:^5.27.2" - local-storage-fallback: "npm:^4.1.2" + kbar: "npm:^0.1.0-beta.46" + knip: "npm:^5.44.4" + local-storage-fallback: "npm:^4.1.3" lodash: "npm:^4.17.21" - luxon: "npm:^3.4.4" + luxon: "npm:^3.5.0" mds: "https://github.com/minio/mds.git#v1.0.4" - minio: "npm:^8.0.1" + minio: "npm:^8.0.4" nyc: "npm:^15.1.0" - prettier: "npm:3.3.3" + prettier: "npm:3.5.1" react: "npm:^18.3.1" react-app-rewire-hot-loader: "npm:^2.0.1" react-app-rewired: "npm:^2.2.1" react-component-export-image: "npm:^1.0.6" react-copy-to-clipboard: "npm:^5.1.0" react-dom: "npm:^18.3.1" - react-dropzone: "npm:^14.2.3" + react-dropzone: "npm:^14.3.5" react-markdown: "npm:8.0.7" - react-pdf: "npm:^9.1.0" + react-pdf: "npm:^9.2.1" react-redux: "npm:^8.1.3" - react-router-dom: "npm:6.25.1" + react-router-dom: "npm:6.29.0" react-scripts: "npm:5.0.1" - react-virtualized: "npm:^9.22.5" - react-window: "npm:^1.8.10" - react-window-infinite-loader: "npm:^1.0.9" - recharts: "npm:^2.12.7" + react-virtualized: "npm:^9.22.6" + react-window: "npm:^1.8.11" + react-window-infinite-loader: "npm:^1.0.10" + recharts: "npm:^2.15.1" styled-components: "npm:5.3.11" superagent: "npm:^9.0.2" - testcafe: "npm:3.6.2" + testcafe: "npm:3.7.2" tinycolor2: "npm:^1.6.0" typescript: "npm:^5.5.3" languageName: unknown @@ -18291,13 +18459,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - "webidl-conversions@npm:^4.0.2": version: 4.0.2 resolution: "webidl-conversions@npm:4.0.2" @@ -18497,16 +18658,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - "whatwg-url@npm:^7.0.0": version: 7.1.0 resolution: "whatwg-url@npm:7.1.0" @@ -18638,15 +18789,6 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: "npm:^1.0.2 || 2 || 3 || 4" - checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 - languageName: node - linkType: hard - "windows-release@npm:^5.0.1": version: 5.1.1 resolution: "windows-release@npm:5.1.1"